X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Favformat%2Fconsumer_avformat.c;h=580956e2cf39206301d42f089b3747a15b77dd55;hb=78b58b5474240fc011c0bf05c517b76961613ad8;hp=b9b322a871ee4ec87c5777aa17d1b1ef87725494;hpb=1cc6cabaab619303935510853807ebdd374c0652;p=melted diff --git a/src/modules/avformat/consumer_avformat.c b/src/modules/avformat/consumer_avformat.c index b9b322a..580956e 100644 --- a/src/modules/avformat/consumer_avformat.c +++ b/src/modules/avformat/consumer_avformat.c @@ -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 ); @@ -497,6 +497,7 @@ static AVStream *add_video_stream( mlt_consumer this, AVFormatContext *oc, int c 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" ); @@ -1070,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); @@ -1085,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 )