]> git.sesse.net Git - mlt/commitdiff
consumer_avformat.c: save disabled, experimental flushing code
authorddennedy <ddennedy@d19143bc-622f-0410-bfdd-b5b2a6649095>
Sat, 14 Jul 2007 22:34:45 +0000 (22:34 +0000)
committerddennedy <ddennedy@d19143bc-622f-0410-bfdd-b5b2a6649095>
Sat, 14 Jul 2007 22:34:45 +0000 (22:34 +0000)
git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@1007 d19143bc-622f-0410-bfdd-b5b2a6649095

src/modules/avformat/consumer_avformat.c
src/modules/avformat/producer_avformat.c

index 53fd6c187d9bc085b04880caa239c85f806ce4e9..aaac9b85660f2936ce0631ad51484cdd88e239ce 100644 (file)
@@ -1071,6 +1071,70 @@ static void *consumer_thread( void *arg )
                }
        }
 
+#ifdef FLUSH
+       if ( ! real_time_output )
+       {
+               // Flush audio fifo
+               if ( audio_st && audio_st->codec->frame_size > 1 ) for (;;)
+               {
+                       AVCodecContext *c = audio_st->codec;
+                       AVPacket pkt;
+                       av_init_packet( &pkt );
+                       pkt.size = 0;
+
+                       if ( /*( c->capabilities & CODEC_CAP_SMALL_LAST_FRAME ) &&*/
+                               ( channels * audio_input_frame_size < sample_fifo_used( fifo ) ) )
+                       {
+                               sample_fifo_fetch( fifo, buffer, channels * audio_input_frame_size );
+                               pkt.size = avcodec_encode_audio( c, audio_outbuf, audio_outbuf_size, buffer );
+                       }
+                       if ( pkt.size <= 0 )
+                               pkt.size = avcodec_encode_audio( c, audio_outbuf, audio_outbuf_size, NULL );
+                       if ( pkt.size <= 0 )
+                               break;
+
+                       // Write the compressed frame in the media file
+                       if ( c->coded_frame && c->coded_frame->pts != AV_NOPTS_VALUE )
+                               pkt.pts = av_rescale_q( c->coded_frame->pts, c->time_base, audio_st->time_base );
+                       pkt.flags |= PKT_FLAG_KEY;
+                       pkt.stream_index = audio_st->index;
+                       pkt.data = audio_outbuf;
+                       if ( av_interleaved_write_frame( oc, &pkt ) != 0 )
+                       {
+                               fprintf(stderr, "Error while writing flushed audio frame\n");
+                               break;
+                       }
+               }
+
+               // Flush video
+               if ( video_st && !( oc->oformat->flags & AVFMT_RAWPICTURE ) ) for (;;)
+               {
+                       AVCodecContext *c = video_st->codec;
+                       AVPacket pkt;
+                       av_init_packet( &pkt );
+
+                       // Encode the image
+                       pkt.size = avcodec_encode_video( c, video_outbuf, video_outbuf_size, NULL );
+                       if ( pkt.size <= 0 )
+                               break;
+
+                       if ( c->coded_frame && c->coded_frame->pts != AV_NOPTS_VALUE )
+                               pkt.pts= av_rescale_q( c->coded_frame->pts, c->time_base, video_st->time_base );
+                       if( c->coded_frame && c->coded_frame->key_frame )
+                               pkt.flags |= PKT_FLAG_KEY;
+                       pkt.stream_index = video_st->index;
+                       pkt.data = video_outbuf;
+
+                       // write the compressed frame in the media file
+                       if ( av_interleaved_write_frame( oc, &pkt ) != 0 )
+                       {
+                               fprintf(stderr, "Error while writing flushed video frame\n");
+                               break;
+                       }
+               }
+       }
+#endif
+
        // close each codec 
        if (video_st)
                close_video(oc, video_st);
index 69d1d3e32b01d3809d9f07f81ac11e8e8b555211..03b62b67d4f60a8989e1256b322726e7417c9cfd 100644 (file)
@@ -274,7 +274,7 @@ static int producer_open( mlt_producer this, char *file )
                                // This isn't going to be accurate for all formats
                                mlt_position frames = ( mlt_position )( ( ( double )context->duration / ( double )AV_TIME_BASE ) * fps + 0.5 );
                                mlt_properties_set_position( properties, "out", frames - 1 );
-                               mlt_properties_set_position( properties, "length", frames - 0 );
+                               mlt_properties_set_position( properties, "length", frames );
                        }
 
                        // Find default audio and video streams