From e56d91f8a8b5198b0464a44acc157176770409cd Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Tue, 17 Oct 2023 19:32:34 +0200 Subject: [PATCH] avcodec/h264dec: Support skipping frames that used gray gap frames Signed-off-by: Michael Niedermayer --- libavcodec/h264dec.c | 7 +++++++ libavcodec/h264dec.h | 1 + 2 files changed, 8 insertions(+) diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c index b48821db24..aa0022a3ab 100644 --- a/libavcodec/h264dec.c +++ b/libavcodec/h264dec.c @@ -939,6 +939,12 @@ static int finalize_frame(H264Context *h, AVFrame *dst, H264Picture *out, int *g (h->avctx->flags2 & AV_CODEC_FLAG2_SHOW_ALL) || out->recovered)) { + if (h->skip_gray > 0 && + h->non_gray && out->gray && + !(h->avctx->flags2 & AV_CODEC_FLAG2_SHOW_ALL) + ) + return 0; + if (!h->avctx->hwaccel && (out->field_poc[0] == INT_MAX || out->field_poc[1] == INT_MAX) @@ -1091,6 +1097,7 @@ static const AVOption h264_options[] = { { "nal_length_size", "nal_length_size", OFFSET(nal_length_size), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 4, VDX }, { "enable_er", "Enable error resilience on damaged frames (unsafe)", OFFSET(enable_er), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VD }, { "x264_build", "Assume this x264 version if no x264 version found in any SEI", OFFSET(x264_build), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VD }, + { "skip_gray", "Do not return gray gap frames", OFFSET(skip_gray), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 1, VD }, { "noref_gray", "Avoid using gray gap frames as references", OFFSET(noref_gray), AV_OPT_TYPE_INT, {.i64 = 1}, -1, 1, VD }, { NULL }, }; diff --git a/libavcodec/h264dec.h b/libavcodec/h264dec.h index 591769ab25..447c2499d9 100644 --- a/libavcodec/h264dec.h +++ b/libavcodec/h264dec.h @@ -572,6 +572,7 @@ typedef struct H264Context { int non_gray; ///< Did we encounter a intra frame after a gray gap frame int noref_gray; + int skip_gray; } H264Context; extern const uint16_t ff_h264_mb_sizes[4];