[FFmpeg-devel] [PATCH] ffprobe: report read nb_packets and nb_frames by stream, add count_frames and count_packets options

Stefano Sabatini stefasab at gmail.com
Mon Feb 6 11:09:43 CET 2012


On date Wednesday 2012-02-01 17:59:28 +0100, Matthieu Bouron encoded:
> Hi there,
> 
> First patch make ffprobe report the number of packets and frames
> (demuxed/decoded) in streams description when -show_packets and/or
> -show_frames are used.
> read_nb_frames is only shown in video stream description.
> 
> Second patch add two new options to ffprobe: -count_frames, -count_packets.
> These options will enable frame/packet counting without displaying per
> frame/packet information.
> Feel free to comment.
> 
> Matthieu

> From 977024538e8d0d19d5489623ebd330cedb966fa2 Mon Sep 17 00:00:00 2001
> From: Matthieu Bouron <matthieu.bouron at smartjog.com>
> Date: Wed, 1 Feb 2012 16:23:53 +0100
> Subject: [PATCH 1/2] ffprobe: report read nb_frames and nb_packets per stream
> 
> ---
>  doc/ffprobe.xsd |    3 +++
>  ffprobe.c       |   40 +++++++++++++++++++++++++++++++---------
>  2 files changed, 34 insertions(+), 9 deletions(-)
> 
> diff --git a/doc/ffprobe.xsd b/doc/ffprobe.xsd
> index 9ac80bb..13bbd7e 100644
> --- a/doc/ffprobe.xsd
> +++ b/doc/ffprobe.xsd
> @@ -97,6 +97,7 @@
>        <xsd:attribute name="pix_fmt"              type="xsd:string"/>
>        <xsd:attribute name="level"                type="xsd:int"/>
>        <xsd:attribute name="timecode"             type="xsd:string"/>
> +      <xsd:attribute name="read_nb_frames"       type="xsd:int"/>
>  
>        <!-- audio attributes -->
>        <xsd:attribute name="sample_fmt"       type="xsd:string"/>
> @@ -111,6 +112,8 @@
>        <xsd:attribute name="start_time"       type="xsd:float"/>
>        <xsd:attribute name="duration"         type="xsd:float"/>
>        <xsd:attribute name="nb_frames"        type="xsd:int"/>
> +      <xsd:attribute name="read_nb_packets"  type="xsd:int"/>
> +
>      </xsd:complexType>
>  
>      <xsd:complexType name="formatType">
> diff --git a/ffprobe.c b/ffprobe.c
> index ca6133e..620ce53 100644
> --- a/ffprobe.c
> +++ b/ffprobe.c
> @@ -133,6 +133,11 @@ static char *value_string(char *buf, int buf_size, struct unit_value uv)
>      return buf;
>  }
>  

> +typedef struct ProbeContext {
> +    uint64_t *streams_nb_packets;
> +    uint64_t *streams_nb_frames;
> +} ProbeContext;

Having a ProbeContext may be a good idea, but since we're using
globals right now I think it would be less confusing to make these
fields global as well.

> +
>  /* WRITERS API */
>  
>  typedef struct WriterContext WriterContext;
> @@ -1359,7 +1364,7 @@ static av_always_inline int get_decoded_frame(AVFormatContext *fmt_ctx,
>      return ret;
>  }
>  
> -static void show_packets(WriterContext *w, AVFormatContext *fmt_ctx)
> +static void show_packets(WriterContext *w, AVFormatContext *fmt_ctx, ProbeContext *probe_ctx)
>  {
>      AVPacket pkt, pkt1;
>      AVFrame frame;
> @@ -1368,8 +1373,10 @@ static void show_packets(WriterContext *w, AVFormatContext *fmt_ctx)
>      av_init_packet(&pkt);
>  
>      while (!av_read_frame(fmt_ctx, &pkt)) {
> -        if (do_show_packets)
> +        if (do_show_packets) {
>              show_packet(w, fmt_ctx, &pkt, i++);
> +            probe_ctx->streams_nb_packets[pkt.stream_index]++;
> +        }
>          if (do_show_frames) {
>              pkt1 = pkt;
>              while (1) {
> @@ -1380,6 +1387,7 @@ static void show_packets(WriterContext *w, AVFormatContext *fmt_ctx)
>                  show_frame(w, &frame, fmt_ctx->streams[pkt.stream_index]);
>                  pkt1.data += ret;
>                  pkt1.size -= ret;
> +                probe_ctx->streams_nb_frames[pkt.stream_index]++;
>              }
>          }
>          av_free_packet(&pkt);
> @@ -1390,12 +1398,14 @@ static void show_packets(WriterContext *w, AVFormatContext *fmt_ctx)
>      //Flush remaining frames that are cached in the decoder
>      for (i = 0; i < fmt_ctx->nb_streams; i++) {
>          pkt.stream_index = i;
> -        while (get_decoded_frame(fmt_ctx, &frame, &got_frame, &pkt) >= 0 && got_frame)
> +        while (get_decoded_frame(fmt_ctx, &frame, &got_frame, &pkt) >= 0 && got_frame) {
>              show_frame(w, &frame, fmt_ctx->streams[pkt.stream_index]);
> +            probe_ctx->streams_nb_frames[pkt.stream_index]++;
> +        }
>      }
>  }
>  
> -static void show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_idx)
> +static void show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_idx, ProbeContext *probe_ctx)
>  {
>      AVStream *stream = fmt_ctx->streams[stream_idx];
>      AVCodecContext *dec_ctx;
> @@ -1498,6 +1508,10 @@ static void show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_i
>      print_time("duration",      stream->duration,   &stream->time_base);
>      if (stream->nb_frames) print_fmt    ("nb_frames", "%"PRId64, stream->nb_frames);
>      else                   print_str_opt("nb_frames", "N/A");

> +    if (probe_ctx->streams_nb_frames[stream_idx] && dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO)
> +        print_fmt("read_nb_frames", "%"PRIu64, probe_ctx->streams_nb_frames[stream_idx]);
> +    if (probe_ctx->streams_nb_packets[stream_idx])
> +        print_fmt("read_nb_packets", "%"PRIu64, probe_ctx->streams_nb_packets[stream_idx]);

nit: "nb_read_frames", "nb_read_packets" look more readable/consistent to me

[...]

> From 91d96c37ae223f4a19d9c176d5e618c34f3088cd Mon Sep 17 00:00:00 2001
> From: Matthieu Bouron <matthieu.bouron at smartjog.com>
> Date: Wed, 1 Feb 2012 17:37:29 +0100
> Subject: [PATCH 2/2] ffprobe: add count_frames and count_packets options
> 
> ---
>  doc/ffprobe.texi |    8 ++++++++
>  ffprobe.c        |   19 +++++++++++++------
>  2 files changed, 21 insertions(+), 6 deletions(-)
[...]

Looks fine.
-- 
FFmpeg = Frightening and Free Meaningful Powerful Extended Geek


More information about the ffmpeg-devel mailing list