[FFmpeg-devel] Audio decoding in api-example.c broken?
Michael Niedermayer
michaelni
Mon May 24 12:07:22 CEST 2010
On Mon, May 24, 2010 at 10:42:41AM +0300, Martin Storsj? wrote:
> On Mon, 24 May 2010, Michael Niedermayer wrote:
>
> > a AVParser could be used or you could implement some buffer that is refilled
> > after each frame is decoded
>
> An attempt at solving it by refilling the buffer is attached.
>
> // Martin
> api-example.c | 12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
> f62159abacf81c6c15a0a4f310284b9f6d2859e4 0001-Refill-the-input-audio-buffer-after-decoding-each-pa.patch
> From 25f9c3322ebe7381623ddb546d61c67540267835 Mon Sep 17 00:00:00 2001
> From: Martin Storsjo <martin at martin.st>
> Date: Mon, 24 May 2010 10:23:25 +0300
> Subject: [PATCH] Refill the input audio buffer after decoding each packet
>
> This avoids trying to decode incomplete frames.
> ---
> libavcodec/api-example.c | 12 ++++++------
> 1 files changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/libavcodec/api-example.c b/libavcodec/api-example.c
> index fb48b1f..576826d 100644
> --- a/libavcodec/api-example.c
> +++ b/libavcodec/api-example.c
> @@ -155,12 +155,8 @@ static void audio_decode_example(const char *outfilename, const char *filename)
>
> /* decode until eof */
> avpkt.data = inbuf;
> - for(;;) {
> avpkt.size = fread(inbuf, 1, INBUF_SIZE, f);
> - if (avpkt.size == 0)
> - break;
>
> - avpkt.data = inbuf;
> while (avpkt.size > 0) {
> out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
> len = avcodec_decode_audio3(c, (short *)outbuf, &out_size, &avpkt);
> @@ -173,9 +169,13 @@ static void audio_decode_example(const char *outfilename, const char *filename)
> fwrite(outbuf, 1, out_size, outfile);
> }
> avpkt.size -= len;
> - avpkt.data += len;
> + memmove(avpkt.data, avpkt.data + len, avpkt.size);
> + /* Refill the input buffer, to avoid trying to decode
> + * incomplete frames. */
> + len = fread(avpkt.data + avpkt.size, 1, INBUF_SIZE - avpkt.size, f);
> + if (len > 0)
> + avpkt.size += len;
as this is an example people will use for their applications
it should mention parsers and demuxers as alternative solutions
and the refill must be implemented so as to minimize memmove/cpy
moving is only needed once we get close to the end of the buffer ...
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Avoid a single point of failure, be that a person or equipment.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20100524/c03bd63e/attachment.pgp>
More information about the ffmpeg-devel
mailing list