avformat/configure: revert mistaken change in last commit
[melted] / src / modules / avformat / consumer_avformat.c
index 53fd6c1..580956e 100644 (file)
@@ -192,10 +192,10 @@ mlt_consumer consumer_avformat_init( char *arg )
                mlt_properties_set_int( properties, "video_rc_buffer_size", 0 );
                mlt_properties_set_double( properties, "video_rc_buffer_aggressivity", 1.0 );
                mlt_properties_set_double( properties, "video_rc_initial_cplx", 0 );
-               mlt_properties_set_double( properties, "video_i_qfactor", 1.25 );
+               mlt_properties_set_double( properties, "video_i_qfactor", -0.8 );
                mlt_properties_set_double( properties, "video_b_qfactor", 1.25 );
-               mlt_properties_set_double( properties, "video_i_qoffset", -0.8 );
-               mlt_properties_set_double( properties, "video_b_qoffset", 0 );
+               mlt_properties_set_double( properties, "video_i_qoffset", 0 );
+               mlt_properties_set_double( properties, "video_b_qoffset", 1.25 );
                mlt_properties_set_int( properties, "video_intra_quant_bias", FF_DEFAULT_QUANT_BIAS );
                mlt_properties_set_int( properties, "video_inter_quant_bias", FF_DEFAULT_QUANT_BIAS );
                mlt_properties_set_int( properties, "dct_algo", 0 );
@@ -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);
@@ -1086,7 +1150,7 @@ static void *consumer_thread( void *arg )
 
        // Close the output file
        if (!(fmt->flags & AVFMT_NOFILE))
-               url_fclose(&oc->pb);
+               url_fclose(oc->pb);
 
        // Clean up input and output frames
        if ( output )