[FFmpeg-devel] [PATCH] ffmpeg.c: allow ffmpeg to output stats for each video stream

Michael Niedermayer michael at niedermayer.cc
Fri May 25 17:37:28 EEST 2018


On Tue, May 22, 2018 at 03:40:54PM -0700, Wang Cao wrote:
> - Make ffmpeg to output stats for each video/audio streams and each ouptut file ffmpeg output log in print_report.
> - The report of video/audio sizes is clear as previously all output
> video/audio sizes were combined to report and it is unclear such stats
> is for one output files or aggregates for all output files.
> 
> Signed-off-by: Wang Cao <wangcao at google.com>
> ---
>  fftools/ffmpeg.c | 65 ++++++++++++++++++++++++++++++++----------------
>  1 file changed, 44 insertions(+), 21 deletions(-)
> 
> diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
> index 5a19a09d9a..0b98521852 100644
> --- a/fftools/ffmpeg.c
> +++ b/fftools/ffmpeg.c
> @@ -1526,17 +1526,28 @@ static int reap_filters(int flush)
>      return 0;
>  }
>  
> -static void print_final_stats(int64_t total_size)
> +static void print_final_stats()
>  {
>      uint64_t video_size = 0, audio_size = 0, extra_size = 0, other_size = 0;
>      uint64_t subtitle_size = 0;
>      uint64_t data_size = 0;
> +    int64_t total_size;
>      float percent = -1.0;
>      int i, j;
>      int pass1_used = 1;
> +    AVFormatContext *oc;
>  
>      for (i = 0; i < nb_output_streams; i++) {
>          OutputStream *ost = output_streams[i];
> +        if (i > 0 && ost->file_index != output_streams[i-1]->file_index) {
> +            video_size = 0;
> +            audio_size = 0;
> +            extra_size = 0;
> +            other_size = 0;
> +            subtitle_size = 0;
> +            data_size = 0;
> +        }
> +
>          switch (ost->enc_ctx->codec_type) {
>              case AVMEDIA_TYPE_VIDEO: video_size += ost->data_size; break;
>              case AVMEDIA_TYPE_AUDIO: audio_size += ost->data_size; break;
> @@ -1545,25 +1556,37 @@ static void print_final_stats(int64_t total_size)
>          }
>          extra_size += ost->enc_ctx->extradata_size;
>          data_size  += ost->data_size;
> +
>          if (   (ost->enc_ctx->flags & (AV_CODEC_FLAG_PASS1 | AV_CODEC_FLAG_PASS2))
>              != AV_CODEC_FLAG_PASS1)
>              pass1_used = 0;
> -    }
> -
> +        
> +        // Print stats for each output file.
> +        if (i == nb_output_streams-1 || ost->file_index != output_streams[i+1]->file_index) {
> +            oc = output_files[ost->file_index]->ctx; 
> +            total_size =  avio_size(oc->pb);
> +            if (total_size <= 0) // FIXME improve avio_size() so it works with non seekable output too
> +                total_size = avio_tell(oc->pb);
> +                
>      if (data_size && total_size>0 && total_size >= data_size)
>          percent = 100.0 * (total_size - data_size) / data_size;

> -
> +        

Adding trailing whitespace



>      av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB subtitle:%1.0fkB other streams:%1.0fkB global headers:%1.0fkB muxing overhead: ",
>             video_size / 1024.0,
>             audio_size / 1024.0,
>             subtitle_size / 1024.0,
>             other_size / 1024.0,
>             extra_size / 1024.0);
> +           
>      if (percent >= 0.0)

not related, whitespace change


>          av_log(NULL, AV_LOG_INFO, "%f%%", percent);
>      else
>          av_log(NULL, AV_LOG_INFO, "unknown");
>      av_log(NULL, AV_LOG_INFO, "\n");
> +        }
> +    }
> +
> +
>  
>      /* print verbose per-stream stats */
>      for (i = 0; i < nb_input_files; i++) {
> @@ -1676,13 +1699,6 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti
>  
>      t = (cur_time-timer_start) / 1000000.0;
>  
> -
> -    oc = output_files[0]->ctx;
> -
> -    total_size = avio_size(oc->pb);
> -    if (total_size <= 0) // FIXME improve avio_size() so it works with non seekable output too
> -        total_size = avio_tell(oc->pb);
> -
>      vid = 0;
>      av_bprint_init(&buf, 0, AV_BPRINT_SIZE_AUTOMATIC);
>      av_bprint_init(&buf_script, 0, 1);
> @@ -1693,12 +1709,13 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti
>          if (!ost->stream_copy)
>              q = ost->quality / (float) FF_QP2LAMBDA;
>  
> -        if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
> +        if (is_last_report && vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
>              av_bprintf(&buf, "q=%2.1f ", q);
>              av_bprintf(&buf_script, "stream_%d_%d_q=%.1f\n",
>                         ost->file_index, ost->index, q);
>          }
> -        if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
> +        if (is_last_report || !is_last_report && !vid) {
> +            if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
>              float fps;
>  
>              frame_number = ost->frame_number;
> @@ -1750,14 +1767,16 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti
>                             ost->file_index, ost->index, p);
>              }
>              vid = 1;
> -        }
> +            }
> +        

>          /* compute min output value */
>          if (av_stream_get_end_pts(ost->st) != AV_NOPTS_VALUE)
>              pts = FFMAX(pts, av_rescale_q(av_stream_get_end_pts(ost->st),
> -                                          ost->st->time_base, AV_TIME_BASE_Q));
> +                                      ost->st->time_base, AV_TIME_BASE_Q));

unrelated and incorrect indention change



>          if (is_last_report)
>              nb_frames_drop += ost->last_dropped;
> -    }
> +
> +            total_size = ost->data_size;
>  
>      secs = FFABS(pts) / AV_TIME_BASE;
>      us = FFABS(pts) % AV_TIME_BASE;
> @@ -1810,14 +1829,18 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti
>          av_bprintf(&buf, " speed=%4.3gx", speed);
>          av_bprintf(&buf_script, "speed=%4.3gx\n", speed);
>      }
> -
> +            
> +            if (is_last_report)
> +                av_bprintf(&buf, "\n");
> +	    }
> +    }
> +    
>      if (print_stats || is_last_report) {
> -        const char end = is_last_report ? '\n' : '\r';
> +        const char end = '\r';
>          if (print_stats==1 && AV_LOG_INFO > av_log_get_level()) {
>              fprintf(stderr, "%s    %c", buf.str, end);
>          } else
>              av_log(NULL, AV_LOG_INFO, "%s    %c", buf.str, end);
> -
>      fflush(stderr);
>      }
>      av_bprint_finalize(&buf, NULL);
> @@ -1835,9 +1858,9 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti
>                         "Error closing progress log, loss of information possible: %s\n", av_err2str(ret));
>          }
>      }
> -
> +    

unlreated addition of trailing whitespace

please look at and cleanup the patch



[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

When the tyrant has disposed of foreign enemies by conquest or treaty, and
there is nothing more to fear from them, then he is always stirring up
some war or other, in order that the people may require a leader. -- Plato
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20180525/2626656f/attachment.sig>


More information about the ffmpeg-devel mailing list