Commit e68ac6281c for ffmpeg
commit e68ac6281cea3487416b88584ba603e2e2424955
Author: Michael Niedermayer <michael@niedermayer.cc>
Date: Thu Oct 29 13:39:05 2026 +0100
avcodec/decode: factor the LCEVC frame parsing out of its two callers
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index e1d908fd52..92dbdc4998 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -1614,6 +1614,35 @@ int ff_decode_frame_props_from_pkt(const AVCodecContext *avctx,
return 0;
}
+#if CONFIG_LIBLCEVC_DEC
+static int lcevc_parse_frame(AVCodecContext *avctx, DecodeContext *dc, AVFrame *frame)
+{
+ int ret;
+
+ dc->lcevc.frame = dc->lcevc.ctx &&
+ av_frame_get_side_data(frame, AV_FRAME_DATA_LCEVC);
+ if (!dc->lcevc.frame)
+ return 0;
+
+ ret = ff_lcevc_parse_frame(dc->lcevc.ctx, frame, &dc->lcevc.format,
+ &dc->lcevc.base_format,
+ &dc->lcevc.width, &dc->lcevc.height);
+ if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE))
+ return ret;
+
+ if (ret < 0 || !dc->lcevc.width || !dc->lcevc.height ||
+ frame->format != dc->lcevc.base_format) {
+ dc->lcevc.frame = 0;
+ return 0;
+ }
+
+ dc->lcevc.base_width = frame->width;
+ dc->lcevc.base_height = frame->height;
+
+ return 0;
+}
+#endif
+
int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
{
int ret;
@@ -1661,27 +1690,16 @@ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
AVCodecInternal *avci = avctx->internal;
DecodeContext *dc = decode_ctx(avci);
- dc->lcevc.frame = dc->lcevc.ctx &&
- av_frame_get_side_data(frame, AV_FRAME_DATA_LCEVC);
+ ret = lcevc_parse_frame(avctx, dc, frame);
+ if (ret < 0)
+ return ret;
+ // force get_buffer2() to allocate the base frame with at least the dimensions
+ // of the final enhanced frame, in order to prevent reinitializing the buffer
+ // pools unnecessarely
if (dc->lcevc.frame) {
- ret = ff_lcevc_parse_frame(dc->lcevc.ctx, frame, &dc->lcevc.format,
- &dc->lcevc.base_format,
- &dc->lcevc.width, &dc->lcevc.height);
- if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE))
- return ret;
-
- // force get_buffer2() to allocate the base frame with at least the dimensions
- // of the final enhanced frame, in order to prevent reinitializing the buffer
- // pools unnecessarely
- if (!ret && dc->lcevc.width && dc->lcevc.height &&
- frame->format == dc->lcevc.base_format) {
- dc->lcevc.base_width = frame->width;
- dc->lcevc.base_height = frame->height;
- frame->width = FFMAX(frame->width, dc->lcevc.width);
- frame->height = FFMAX(frame->height, dc->lcevc.height);
- } else
- dc->lcevc.frame = 0;
+ frame->width = FFMAX(frame->width, dc->lcevc.width);
+ frame->height = FFMAX(frame->height, dc->lcevc.height);
}
#endif
@@ -1740,23 +1758,9 @@ int ff_attach_decode_data(AVCodecContext *avctx, AVFrame *frame)
DecodeContext *dc = decode_ctx(avci);
if (!dc->lcevc.frame) {
- dc->lcevc.frame = dc->lcevc.ctx &&
- av_frame_get_side_data(frame, AV_FRAME_DATA_LCEVC);
-
- if (dc->lcevc.frame) {
- int ret = ff_lcevc_parse_frame(dc->lcevc.ctx, frame, &dc->lcevc.format,
- &dc->lcevc.base_format,
- &dc->lcevc.width, &dc->lcevc.height);
- if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE))
- return ret;
-
- if (!ret && dc->lcevc.width && dc->lcevc.height &&
- frame->format == dc->lcevc.base_format) {
- dc->lcevc.base_width = frame->width;
- dc->lcevc.base_height = frame->height;
- } else
- dc->lcevc.frame = 0;
- }
+ int ret = lcevc_parse_frame(avctx, dc, frame);
+ if (ret < 0)
+ return ret;
}
if (dc->lcevc.frame) {
FFLCEVCFrame *frame_ctx;