Mercurial > libavcodec.hg
changeset 11765:c96e649c4e0a libavcodec
api-example: Try to avoid decoding incomplete frames
Use a larger input audio buffer, refill it when it has less than 4 KB data
left.
author | mstorsjo |
---|---|
date | Tue, 25 May 2010 19:13:28 +0000 |
parents | e9c024d542f4 |
children | 01408f7d629c |
files | api-example.c |
diffstat | 1 files changed, 16 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/api-example.c Tue May 25 18:35:01 2010 +0000 +++ b/api-example.c Tue May 25 19:13:28 2010 +0000 @@ -39,6 +39,8 @@ #include "libavutil/mathematics.h" #define INBUF_SIZE 4096 +#define AUDIO_INBUF_SIZE 20480 +#define AUDIO_REFILL_THRESH 4096 /* * Audio encoding example @@ -118,7 +120,7 @@ int out_size, len; FILE *f, *outfile; uint8_t *outbuf; - uint8_t inbuf[INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE]; + uint8_t inbuf[AUDIO_INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE]; AVPacket avpkt; av_init_packet(&avpkt); @@ -155,12 +157,8 @@ /* decode until eof */ avpkt.data = inbuf; - for(;;) { - avpkt.size = fread(inbuf, 1, INBUF_SIZE, f); - if (avpkt.size == 0) - break; + avpkt.size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f); - avpkt.data = inbuf; while (avpkt.size > 0) { out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE; len = avcodec_decode_audio3(c, (short *)outbuf, &out_size, &avpkt); @@ -174,8 +172,19 @@ } avpkt.size -= len; avpkt.data += len; + if (avpkt.size < AUDIO_REFILL_THRESH) { + /* Refill the input buffer, to avoid trying to decode + * incomplete frames. Instead of this, one could also use + * a parser, or use a proper container format through + * libavformat. */ + memmove(inbuf, avpkt.data, avpkt.size); + avpkt.data = inbuf; + len = fread(avpkt.data + avpkt.size, 1, + AUDIO_INBUF_SIZE - avpkt.size, f); + if (len > 0) + avpkt.size += len; + } } - } fclose(outfile); fclose(f);