[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