CODEC_CAP_SMALL_LAST_FRAME patch by Justin Ruggles jruggle earthlink net
authorJustin Ruggles <jruggle@earthlink.net>
Sat, 24 Jun 2006 09:25:21 +0000 (09:25 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Sat, 24 Jun 2006 09:25:21 +0000 (09:25 +0000)
Originally committed as revision 5512 to svn://svn.ffmpeg.org/ffmpeg/trunk

ffmpeg.c
libavcodec/avcodec.h

index 3834ff6480ee3e15826ed3c1ef4284025e69c070..888319121e4b0c41108145ce9b51d72e84b56f52 100644 (file)
--- 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;
index a879419e7c9b70408a24548a486f890a210b9037..95a3dd071f31af8c2d94fc76162f3cc3cfb53581 100644 (file)
@@ -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