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 );
c->rc_max_rate = mlt_properties_get_int( properties, "video_rc_max_rate" );
c->rc_min_rate = mlt_properties_get_int( properties, "video_rc_min_rate" );
c->rc_buffer_size = mlt_properties_get_int( properties, "video_rc_buffer_size" );
+ c->rc_initial_buffer_occupancy = c->rc_buffer_size*3/4;
c->rc_buffer_aggressivity= mlt_properties_get_double( properties, "video_rc_buffer_aggressivity" );
c->rc_initial_cplx= mlt_properties_get_double( properties, "video_rc_initial_cplx" );
c->i_quant_factor = mlt_properties_get_double( properties, "video_i_qfactor" );
}
}
+#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);
// 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 )