On Mon, Mar 17, 2014 at 11:19 AM, Anton Khirnov <[email protected]> wrote: > Store a variable per OutputStream instead of globals for > audio/video/extradata. This makes the code simpler and cleaner and fixes > 2pass with multiple output streams. > --- > avconv.c | 46 +++++++++++++++++++++++----------------------- > avconv.h | 4 ++++ > 2 files changed, 27 insertions(+), 23 deletions(-) > > diff --git a/avconv.c b/avconv.c > index 468ed76..9c597e7 100644 > --- a/avconv.c > +++ b/avconv.c > @@ -84,9 +84,6 @@ const int program_birth_year = 2000; > > static FILE *vstats_file; > > -static int64_t video_size = 0; > -static int64_t audio_size = 0; > -static int64_t extra_size = 0; > static int nb_frames_drop = 0; > > > @@ -370,6 +367,8 @@ static void write_frame(AVFormatContext *s, AVPacket > *pkt, OutputStream *ost) > } > ost->last_mux_dts = pkt->dts; > > + ost->data_size += pkt->size; > + > pkt->stream_index = ost->index; > ret = av_interleaved_write_frame(s, pkt); > if (ret < 0) { > @@ -420,8 +419,6 @@ static void do_audio_out(AVFormatContext *s, OutputStream > *ost, > pkt.duration = av_rescale_q(pkt.duration, enc->time_base, > ost->st->time_base); > > write_frame(s, &pkt, ost); > - > - audio_size += pkt.size; > } > } > > @@ -572,7 +569,6 @@ static void do_video_out(AVFormatContext *s, > > write_frame(s, &pkt, ost); > *frame_size = pkt.size; > - video_size += pkt.size; > > /* if two pass, output log */ > if (ost->logfile && enc->stats_out) { > @@ -623,9 +619,9 @@ static void do_video_stats(OutputStream *ost, int > frame_size) > ti1 = 0.01; > > bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0; > - avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0; > + avg_bitrate = (double)(ost->data_size * 8) / ti1 / 1000.0; > fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s > avg_br= %7.1fkbits/s ", > - (double)video_size / 1024, ti1, bitrate, avg_bitrate); > + (double)ost->data_size / 1024, ti1, bitrate, avg_bitrate); > fprintf(vstats_file, "type= %c\n", > av_get_picture_type_char(enc->coded_frame->pict_type)); > } > } > @@ -857,17 +853,30 @@ static void print_report(int is_last_report, int64_t > timer_start) > fflush(stderr); > > if (is_last_report) { > - int64_t raw = audio_size + video_size + extra_size; > + uint64_t video_size = 0, audio_size = 0, extra_size = 0, other_size > = 0; > + uint64_t data_size = 0; > float percent = -1.0; > > - if (raw) > - percent = 100.0 * (total_size - raw) / raw; > + for (i = 0; i < nb_output_streams; i++) { > + OutputStream *ost = output_streams[i]; > + switch (ost->st->codec->codec_type) { > + case AVMEDIA_TYPE_VIDEO: video_size += ost->data_size; break; > + case AVMEDIA_TYPE_AUDIO: audio_size += ost->data_size; break; > + default: other_size += ost->data_size; break; > + } > + extra_size += ost->st->codec->extradata_size; > + data_size += ost->data_size; > + } > + > + if (data_size && total_size >= data_size) > + percent = 100.0 * (total_size - data_size) / data_size; > > av_log(NULL, AV_LOG_INFO, "\n"); > - av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB global > headers:%1.0fkB muxing overhead: ", > + av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB other > streams:%1.0fkB global headers:%1.0fkB muxing overhead: ", > video_size / 1024.0, > audio_size / 1024.0, > - extra_size / 1024.0, > + other_size / 1024.0, > + extra_size / 1024.0); > if (percent >= 0.0) > av_log(NULL, AV_LOG_INFO, "%f%%", percent); > else > @@ -897,18 +906,15 @@ static void flush_encoders(void) > for (;;) { > int (*encode)(AVCodecContext*, AVPacket*, const AVFrame*, int*) > = NULL; > const char *desc; > - int64_t *size; > > switch (ost->st->codec->codec_type) { > case AVMEDIA_TYPE_AUDIO: > encode = avcodec_encode_audio2; > desc = "Audio"; > - size = &audio_size; > break; > case AVMEDIA_TYPE_VIDEO: > encode = avcodec_encode_video2; > desc = "Video"; > - size = &video_size; > break; > default: > stop_encoding = 1; > @@ -926,7 +932,6 @@ static void flush_encoders(void) > av_log(NULL, AV_LOG_FATAL, "%s encoding failed\n", desc); > exit_program(1); > } > - *size += ret; > if (ost->logfile && enc->stats_out) { > fprintf(ost->logfile, "%s", enc->stats_out); > } > @@ -997,12 +1002,8 @@ static void do_streamcopy(InputStream *ist, > OutputStream *ost, const AVPacket *p > } > > /* force the input stream PTS */ > - if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) > - audio_size += pkt->size; > - else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) { > - video_size += pkt->size; > + if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) > ost->sync_opts++; > - } > > if (pkt->pts != AV_NOPTS_VALUE) > opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, > ost->st->time_base) - ost_tb_start_time; > @@ -1831,7 +1832,6 @@ static int transcode_init(void) > if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000) > av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set > too low." > "It takes bits/s as argument, > not kbits/s\n"); > - extra_size += ost->st->codec->extradata_size; > } else { > av_opt_set_dict(ost->st->codec, &ost->opts); > } > diff --git a/avconv.h b/avconv.h > index c912fae..35ba90e 100644 > --- a/avconv.h > +++ b/avconv.h > @@ -336,6 +336,10 @@ typedef struct OutputStream { > enum AVPixelFormat pix_fmts[2]; > > AVCodecParserContext *parser; > + > + /* stats */ > + // combined size of all the packets written > + uint64_t data_size; > } OutputStream; > > typedef struct OutputFile { > -- > 1.7.10.4 > > _______________________________________________ > libav-devel mailing list > [email protected] > https://lists.libav.org/mailman/listinfo/libav-devel
Looks ok Vittorio _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
