[FFmpeg-devel] [PATCH 3/4] lavc: Add a flag in AVPacket to discard packet after decoding. Discard frames after decoding based on the flag.

wm4 nfxjfg at googlemail.com
Mon Sep 19 21:32:15 EEST 2016


On Tue,  9 Aug 2016 18:48:21 -0700
Sasi Inguva <isasi-at-google.com at ffmpeg.org> wrote:

> Signed-off-by: Sasi Inguva <isasi at google.com>
> ---
>  libavcodec/avcodec.h |  6 ++++++
>  libavcodec/utils.c   | 14 +++++++++++++-
>  libavcodec/version.h |  2 +-
>  3 files changed, 20 insertions(+), 2 deletions(-)
> 
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index 3b21537..d68da01 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -1621,6 +1621,12 @@ typedef struct AVPacket {
>  } AVPacket;
>  #define AV_PKT_FLAG_KEY     0x0001 ///< The packet contains a keyframe
>  #define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted
> +/**
> + * Flag is used to discard packets which are required to maintain valid
> + * decoder state but are not required for output and should be dropped
> + * after decoding.
> + **/
> +#define AV_PKT_FLAG_DISCARD   0x0004
>  
>  enum AVSideDataParamChangeFlags {
>      AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT  = 0x0001,
> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
> index f7adb52..399cf72 100644
> --- a/libavcodec/utils.c
> +++ b/libavcodec/utils.c
> @@ -784,6 +784,12 @@ int ff_init_buffer_info(AVCodecContext *avctx, AVFrame *frame)
>              }
>          }
>          add_metadata_from_side_data(pkt, frame);
> +
> +        if (pkt->flags & AV_PKT_FLAG_DISCARD) {
> +            frame->flags |= AV_FRAME_FLAG_DISCARD;
> +        } else {
> +            frame->flags = (frame->flags & ~AV_FRAME_FLAG_DISCARD);
> +        }

Many external decoders won't be able to do this correctly, because they
won't call ff_init_buffer_info in the "right moment". They're
asynchronous, buffered, opaque.

But I guess you don't care, neither did whoever pushed this low quality
patch before the patch was fixed?

>      } else {
>          frame->pkt_pts = AV_NOPTS_VALUE;
>          av_frame_set_pkt_pos     (frame, -1);
> @@ -2248,7 +2254,9 @@ fail:
>              if(ret == tmp.size)
>                  ret = avpkt->size;
>          }
> -
> +        if (picture->flags & AV_FRAME_FLAG_DISCARD) {
> +            *got_picture_ptr = 0;
> +        }
>          if (*got_picture_ptr) {
>              if (!avctx->refcounted_frames) {
>                  int err = unrefcount_frame(avci, picture);
> @@ -2412,6 +2420,10 @@ int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx,
>                  avctx->internal->skip_samples = 0;
>              }
>          }
> +
> +        if ((frame->flags & AV_FRAME_FLAG_DISCARD) && avctx->internal->skip_samples <= 0) {
> +            *got_frame_ptr = 0;
> +        }
>  fail:
>          avctx->internal->pkt = NULL;
>          if (did_split) {
> diff --git a/libavcodec/version.h b/libavcodec/version.h
> index 4ded1ee..a697261 100644
> --- a/libavcodec/version.h
> +++ b/libavcodec/version.h
> @@ -28,7 +28,7 @@
>  #include "libavutil/version.h"
>  
>  #define LIBAVCODEC_VERSION_MAJOR  57
> -#define LIBAVCODEC_VERSION_MINOR  51
> +#define LIBAVCODEC_VERSION_MINOR  52
>  #define LIBAVCODEC_VERSION_MICRO 100
>  
>  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \



More information about the ffmpeg-devel mailing list