diff --git a/ffmpeg.c b/ffmpeg.c index 3834ff6480ee3e15826ed3c1ef4284025e69c070..888319121e4b0c41108145ce9b51d72e84b56f52 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -1358,12 +1358,29 @@ static int output_packet(AVInputStream *ist, int ist_index, if (ost->encoding_needed) { for(;;) { AVPacket pkt; + int fifo_bytes; av_init_packet(&pkt); pkt.stream_index= ost->index; switch(ost->st->codec->codec_type) { case CODEC_TYPE_AUDIO: - ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL); + fifo_bytes = fifo_size(&ost->fifo, NULL); + ret = 0; + /* encode any samples remaining in fifo */ + if(fifo_bytes > 0 && enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) { + int fs_tmp = enc->frame_size; + enc->frame_size = fifo_bytes / (2 * enc->channels); + if(fifo_read(&ost->fifo, (uint8_t *)samples, fifo_bytes, + &ost->fifo.rptr) == 0) { + ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples); + } + enc->frame_size = fs_tmp; + if(ret <= 0) { + ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL); + } + } else { + ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL); + } audio_size += ret; pkt.flags |= PKT_FLAG_KEY; break; diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index a879419e7c9b70408a24548a486f890a210b9037..95a3dd071f31af8c2d94fc76162f3cc3cfb53581 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -365,6 +365,11 @@ extern int motion_estimation_method; * if this is not set, the codec is guranteed to never be feeded with NULL data */ #define CODEC_CAP_DELAY 0x0020 +/** + * Codec can be fed a final frame with a smaller size. + * This can be used to prevent truncation of the last audio samples. + */ +#define CODEC_CAP_SMALL_LAST_FRAME 0x0040 //the following defines may change, don't expect compatibility if you use them #define MB_TYPE_INTRA4x4 0x0001