[FFmpeg-devel] [PATCH 2/2] ffprobe: refactor frames decoding.

Stefano Sabatini stefasab at gmail.com
Wed Jul 25 00:57:55 CEST 2012


On date Tuesday 2012-07-24 16:01:35 +0200, Nicolas George encoded:
> 
> Signed-off-by: Nicolas George <nicolas.george at normalesup.org>
> ---
>  ffprobe.c |   49 ++++++++++++++++++++++---------------------------
>  1 file changed, 22 insertions(+), 27 deletions(-)
> 
> 
> Slightly less code duplication, and easier to extend for what I want to do.
> 
> The output is unchanged for all FATE samples that can be decoded without
> additional options.
> 
> 
> diff --git a/ffprobe.c b/ffprobe.c
> index 9de0d59..531cea2 100644
> --- a/ffprobe.c
> +++ b/ffprobe.c
> @@ -1653,36 +1653,45 @@ static void show_frame(WriterContext *w, AVFrame *frame, AVStream *stream)
>      fflush(stdout);
>  }
>  
> -static av_always_inline int get_decoded_frame(AVFormatContext *fmt_ctx,
> -                                              AVFrame *frame, int *got_frame,
> -                                              AVPacket *pkt)

> +static av_always_inline int process_decoded_frame(WriterContext *w,
> +                                                  AVFormatContext *fmt_ctx,
> +                                                  AVFrame *frame, AVPacket *pkt)

process_decoded_frame -> process_frame

the latter is simpler and seems less misleading (since the frame is
not yet decoded)

>  {
>      AVCodecContext *dec_ctx = fmt_ctx->streams[pkt->stream_index]->codec;
> -    int ret = 0;
> +    int ret = 0, got_frame = 0;
>  
> -    *got_frame = 0;
> +    avcodec_get_frame_defaults(frame);
>      if (dec_ctx->codec) {
>          switch (dec_ctx->codec_type) {
>          case AVMEDIA_TYPE_VIDEO:
> -            ret = avcodec_decode_video2(dec_ctx, frame, got_frame, pkt);
> +            ret = avcodec_decode_video2(dec_ctx, frame, &got_frame, pkt);
>              if (!ret)
>                  ret = pkt->size;
>              break;
>  
>          case AVMEDIA_TYPE_AUDIO:
> -            ret = avcodec_decode_audio4(dec_ctx, frame, got_frame, pkt);
> +            ret = avcodec_decode_audio4(dec_ctx, frame, &got_frame, pkt);
>              break;
>          }
>      }
>  
> -    return ret;
> +    if (ret < 0)
> +        return ret;
> +    pkt->data += ret;
> +    pkt->size -= ret;
> +    if (got_frame) {
> +        nb_streams_frames[pkt->stream_index]++;
> +        if (do_show_frames)
> +            show_frame(w, frame, fmt_ctx->streams[pkt->stream_index]);
> +    }
> +    return got_frame;
>  }
>  
>  static void read_packets(WriterContext *w, AVFormatContext *fmt_ctx)
>  {
>      AVPacket pkt, pkt1;
>      AVFrame frame;
> -    int i = 0, ret, got_frame;
> +    int i = 0;
>  
>      av_init_packet(&pkt);
>  
> @@ -1694,17 +1703,8 @@ static void read_packets(WriterContext *w, AVFormatContext *fmt_ctx)
>          }
>          if (do_read_frames) {
>              pkt1 = pkt;
> -            while (pkt1.size) {
> -                avcodec_get_frame_defaults(&frame);
> -                ret = get_decoded_frame(fmt_ctx, &frame, &got_frame, &pkt1);
> -                if (ret < 0 || !got_frame)
> -                    break;
> -                if (do_show_frames)
> -                    show_frame(w, &frame, fmt_ctx->streams[pkt.stream_index]);
> -                pkt1.data += ret;
> -                pkt1.size -= ret;
> -                nb_streams_frames[pkt.stream_index]++;
> -            }

> +            while (pkt1.size &&
> +                   process_decoded_frame(w, fmt_ctx, &frame, &pkt1) > 0);

nit: maybe drop "> 0".

>          }
>          av_free_packet(&pkt);
>      }
> @@ -1714,13 +1714,8 @@ static void read_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) {
> -            if (do_read_frames) {
> -                if (do_show_frames)
> -                    show_frame(w, &frame, fmt_ctx->streams[pkt.stream_index]);
> -                nb_streams_frames[pkt.stream_index]++;
> -            }
> -        }

> +        if (do_read_frames)
> +            while (process_decoded_frame(w, fmt_ctx, &frame, &pkt) > 0);

Now this is doing:
pkt->data += ret;
pkt->size -= ret;

and pkt->data is NULL.

Verify that the decoder is returning 0 when the data is flushed (as I
suppose it does).

Looks good otherwise, thanks.
-- 
FFmpeg = Fierce and Fundamental Mysterious Pure Enchanting Gangster


More information about the ffmpeg-devel mailing list