* [FFmpeg-devel] [PATCH] Optimize lcevc away if disabled (PR #20818)
@ 2025-11-02 15:58 mkver via ffmpeg-devel
0 siblings, 0 replies; only message in thread
From: mkver via ffmpeg-devel @ 2025-11-02 15:58 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: mkver
PR #20818 opened by mkver
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20818
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20818.patch
>From abf819cff61d779f131fa7c23232952b46496928 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Sun, 2 Nov 2025 15:03:33 +0100
Subject: [PATCH 1/5] avcodec/pthread_frame: Call ff_decode_internal_sync()
only during init
It is not necessary to do it more than once, as none of the fields
set change after init.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/pthread_frame.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c
index abf0d5a199..0b56af916d 100644
--- a/libavcodec/pthread_frame.c
+++ b/libavcodec/pthread_frame.c
@@ -401,7 +401,6 @@ FF_ENABLE_DEPRECATION_WARNINGS
dst->hwaccel_flags = src->hwaccel_flags;
av_refstruct_replace(&dst->internal->pool, src->internal->pool);
- ff_decode_internal_sync(dst, src);
}
if (for_user) {
--
2.49.1
>From 182b9c7a4a7117371d51caa917f26162db53cc56 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Sun, 2 Nov 2025 15:29:59 +0100
Subject: [PATCH 2/5] avcodec/decode: Don't allocate LCEVC context for
non-video
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/decode.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index d8e523f327..df4e1b38c7 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -2080,9 +2080,11 @@ int ff_decode_preinit(AVCodecContext *avctx)
return ret;
if (!(avctx->export_side_data & AV_CODEC_EXPORT_DATA_ENHANCEMENTS)) {
- ret = ff_lcevc_alloc(&dc->lcevc);
- if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE))
- return ret;
+ if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
+ ret = ff_lcevc_alloc(&dc->lcevc);
+ if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE))
+ return ret;
+ }
}
return 0;
--
2.49.1
>From 2786e5a9ad32920fccee9352161e81c8e733563b Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Sun, 2 Nov 2025 16:00:06 +0100
Subject: [PATCH 3/5] avcodec/decode: Put lcevc fields into structure of their
own
Makes it easier to see that width and height in DecodeContext is
actually a lcevc field.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/decode.c | 34 ++++++++++++++++++----------------
1 file changed, 18 insertions(+), 16 deletions(-)
diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index df4e1b38c7..b7859d3e25 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -94,10 +94,12 @@ typedef struct DecodeContext {
*/
uint64_t side_data_pref_mask;
- FFLCEVCContext *lcevc;
- int lcevc_frame;
- int width;
- int height;
+ struct {
+ FFLCEVCContext *ctx;
+ int frame;
+ int width;
+ int height;
+ } lcevc;
} DecodeContext;
static DecodeContext *decode_ctx(AVCodecInternal *avci)
@@ -1661,12 +1663,12 @@ static void update_frame_props(AVCodecContext *avctx, AVFrame *frame)
AVCodecInternal *avci = avctx->internal;
DecodeContext *dc = decode_ctx(avci);
- dc->lcevc_frame = dc->lcevc && avctx->codec_type == AVMEDIA_TYPE_VIDEO &&
+ dc->lcevc.frame = dc->lcevc.ctx && avctx->codec_type == AVMEDIA_TYPE_VIDEO &&
av_frame_get_side_data(frame, AV_FRAME_DATA_LCEVC);
- if (dc->lcevc_frame) {
- dc->width = frame->width;
- dc->height = frame->height;
+ if (dc->lcevc.frame) {
+ dc->lcevc.width = frame->width;
+ dc->lcevc.height = frame->height;
frame->width = frame->width * 2 / FFMAX(frame->sample_aspect_ratio.den, 1);
frame->height = frame->height * 2 / FFMAX(frame->sample_aspect_ratio.num, 1);
}
@@ -1677,7 +1679,7 @@ static int attach_post_process_data(AVCodecContext *avctx, AVFrame *frame)
AVCodecInternal *avci = avctx->internal;
DecodeContext *dc = decode_ctx(avci);
- if (dc->lcevc_frame) {
+ if (dc->lcevc.frame) {
FrameDecodeData *fdd = frame->private_ref;
FFLCEVCFrame *frame_ctx;
int ret;
@@ -1692,13 +1694,13 @@ static int attach_post_process_data(AVCodecContext *avctx, AVFrame *frame)
return AVERROR(ENOMEM);
}
- frame_ctx->lcevc = av_refstruct_ref(dc->lcevc);
+ frame_ctx->lcevc = av_refstruct_ref(dc->lcevc.ctx);
frame_ctx->frame->width = frame->width;
frame_ctx->frame->height = frame->height;
frame_ctx->frame->format = frame->format;
- frame->width = dc->width;
- frame->height = dc->height;
+ frame->width = dc->lcevc.width;
+ frame->height = dc->lcevc.height;
ret = avctx->get_buffer2(avctx, frame_ctx->frame, 0);
if (ret < 0) {
@@ -1712,7 +1714,7 @@ static int attach_post_process_data(AVCodecContext *avctx, AVFrame *frame)
fdd->post_process_opaque_free = ff_lcevc_unref;
fdd->post_process = ff_lcevc_process;
}
- dc->lcevc_frame = 0;
+ dc->lcevc.frame = 0;
return 0;
}
@@ -2081,7 +2083,7 @@ int ff_decode_preinit(AVCodecContext *avctx)
if (!(avctx->export_side_data & AV_CODEC_EXPORT_DATA_ENHANCEMENTS)) {
if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
- ret = ff_lcevc_alloc(&dc->lcevc);
+ ret = ff_lcevc_alloc(&dc->lcevc.ctx);
if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE))
return ret;
}
@@ -2324,7 +2326,7 @@ void ff_decode_internal_sync(AVCodecContext *dst, const AVCodecContext *src)
dst_dc->initial_pict_type = src_dc->initial_pict_type;
dst_dc->intra_only_flag = src_dc->intra_only_flag;
- av_refstruct_replace(&dst_dc->lcevc, src_dc->lcevc);
+ av_refstruct_replace(&dst_dc->lcevc.ctx, src_dc->lcevc.ctx);
}
void ff_decode_internal_uninit(AVCodecContext *avctx)
@@ -2332,7 +2334,7 @@ void ff_decode_internal_uninit(AVCodecContext *avctx)
AVCodecInternal *avci = avctx->internal;
DecodeContext *dc = decode_ctx(avci);
- av_refstruct_unref(&dc->lcevc);
+ av_refstruct_unref(&dc->lcevc.ctx);
}
static int attach_displaymatrix(AVCodecContext *avctx, AVFrame *frame, int orientation)
--
2.49.1
>From 63685709b96e28691f0876f4b405fefb547e76c5 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Sun, 2 Nov 2025 16:49:26 +0100
Subject: [PATCH 4/5] avcodec/decode: Mark init,close functions as av_cold
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/decode.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index b7859d3e25..e20569e170 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -1962,7 +1962,7 @@ static av_cold void progress_frame_pool_free_entry_cb(AVRefStructOpaque opaque,
av_frame_free(&progress->f);
}
-int ff_decode_preinit(AVCodecContext *avctx)
+av_cold int ff_decode_preinit(AVCodecContext *avctx)
{
AVCodecInternal *avci = avctx->internal;
DecodeContext *dc = decode_ctx(avci);
@@ -2296,7 +2296,7 @@ int ff_hwaccel_frame_priv_alloc(AVCodecContext *avctx, void **hwaccel_picture_pr
return 0;
}
-void ff_decode_flush_buffers(AVCodecContext *avctx)
+av_cold void ff_decode_flush_buffers(AVCodecContext *avctx)
{
AVCodecInternal *avci = avctx->internal;
DecodeContext *dc = decode_ctx(avci);
@@ -2314,12 +2314,12 @@ void ff_decode_flush_buffers(AVCodecContext *avctx)
dc->draining_started = 0;
}
-AVCodecInternal *ff_decode_internal_alloc(void)
+av_cold AVCodecInternal *ff_decode_internal_alloc(void)
{
return av_mallocz(sizeof(DecodeContext));
}
-void ff_decode_internal_sync(AVCodecContext *dst, const AVCodecContext *src)
+av_cold void ff_decode_internal_sync(AVCodecContext *dst, const AVCodecContext *src)
{
const DecodeContext *src_dc = decode_ctx(src->internal);
DecodeContext *dst_dc = decode_ctx(dst->internal);
@@ -2329,7 +2329,7 @@ void ff_decode_internal_sync(AVCodecContext *dst, const AVCodecContext *src)
av_refstruct_replace(&dst_dc->lcevc.ctx, src_dc->lcevc.ctx);
}
-void ff_decode_internal_uninit(AVCodecContext *avctx)
+av_cold void ff_decode_internal_uninit(AVCodecContext *avctx)
{
AVCodecInternal *avci = avctx->internal;
DecodeContext *dc = decode_ctx(avci);
--
2.49.1
>From 8e90f150ebccf3f30fe139245b7d22fd6f1ee4a9 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Sun, 2 Nov 2025 16:50:36 +0100
Subject: [PATCH 5/5] avcodec/decode: Optimize lcevc away if disabled
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/Makefile | 2 +-
libavcodec/decode.c | 12 ++++++++++++
libavcodec/lcevcdec.c | 10 ----------
3 files changed, 13 insertions(+), 11 deletions(-)
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 972a17f060..49c284ef9e 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -47,7 +47,6 @@ OBJS = ac3_parser.o \
get_buffer.o \
imgconvert.o \
jni.o \
- lcevcdec.o \
mathtables.o \
mediacodec.o \
mpeg12framerate.o \
@@ -130,6 +129,7 @@ OBJS-$(CONFIG_IVIDSP) += ivi_dsp.o
OBJS-$(CONFIG_JNI) += ffjni.o jni.o
OBJS-$(CONFIG_JPEGTABLES) += jpegtables.o
OBJS-$(CONFIG_LCMS2) += fflcms2.o
+OBJS-$(CONFIG_LIBLCEVC_DEC) += lcevcdec.o
OBJS-$(CONFIG_LLAUDDSP) += lossless_audiodsp.o
OBJS-$(CONFIG_LLVIDDSP) += lossless_videodsp.o
OBJS-$(CONFIG_LLVIDENCDSP) += lossless_videoencdsp.o
diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index e20569e170..8976f22035 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -94,12 +94,14 @@ typedef struct DecodeContext {
*/
uint64_t side_data_pref_mask;
+#if CONFIG_LIBLCEVC_DEC
struct {
FFLCEVCContext *ctx;
int frame;
int width;
int height;
} lcevc;
+#endif
} DecodeContext;
static DecodeContext *decode_ctx(AVCodecInternal *avci)
@@ -1660,6 +1662,7 @@ int ff_attach_decode_data(AVFrame *frame)
static void update_frame_props(AVCodecContext *avctx, AVFrame *frame)
{
+#if CONFIG_LIBLCEVC_DEC
AVCodecInternal *avci = avctx->internal;
DecodeContext *dc = decode_ctx(avci);
@@ -1672,10 +1675,12 @@ static void update_frame_props(AVCodecContext *avctx, AVFrame *frame)
frame->width = frame->width * 2 / FFMAX(frame->sample_aspect_ratio.den, 1);
frame->height = frame->height * 2 / FFMAX(frame->sample_aspect_ratio.num, 1);
}
+#endif
}
static int attach_post_process_data(AVCodecContext *avctx, AVFrame *frame)
{
+#if CONFIG_LIBLCEVC_DEC
AVCodecInternal *avci = avctx->internal;
DecodeContext *dc = decode_ctx(avci);
@@ -1715,6 +1720,7 @@ static int attach_post_process_data(AVCodecContext *avctx, AVFrame *frame)
fdd->post_process = ff_lcevc_process;
}
dc->lcevc.frame = 0;
+#endif
return 0;
}
@@ -2083,9 +2089,11 @@ av_cold int ff_decode_preinit(AVCodecContext *avctx)
if (!(avctx->export_side_data & AV_CODEC_EXPORT_DATA_ENHANCEMENTS)) {
if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
+#if CONFIG_LIBLCEVC_DEC
ret = ff_lcevc_alloc(&dc->lcevc.ctx);
if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE))
return ret;
+#endif
}
}
@@ -2326,15 +2334,19 @@ av_cold void ff_decode_internal_sync(AVCodecContext *dst, const AVCodecContext *
dst_dc->initial_pict_type = src_dc->initial_pict_type;
dst_dc->intra_only_flag = src_dc->intra_only_flag;
+#if CONFIG_LIBLCEVC_DEC
av_refstruct_replace(&dst_dc->lcevc.ctx, src_dc->lcevc.ctx);
+#endif
}
av_cold void ff_decode_internal_uninit(AVCodecContext *avctx)
{
+#if CONFIG_LIBLCEVC_DEC
AVCodecInternal *avci = avctx->internal;
DecodeContext *dc = decode_ctx(avci);
av_refstruct_unref(&dc->lcevc.ctx);
+#endif
}
static int attach_displaymatrix(AVCodecContext *avctx, AVFrame *frame, int orientation)
diff --git a/libavcodec/lcevcdec.c b/libavcodec/lcevcdec.c
index c2d1b11383..f55f55a03f 100644
--- a/libavcodec/lcevcdec.c
+++ b/libavcodec/lcevcdec.c
@@ -16,8 +16,6 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include "config_components.h"
-
#include "libavutil/avassert.h"
#include "libavutil/frame.h"
#include "libavutil/imgutils.h"
@@ -28,7 +26,6 @@
#include "decode.h"
#include "lcevcdec.h"
-#if CONFIG_LIBLCEVC_DEC
static LCEVC_ColorFormat map_format(int format)
{
switch (format) {
@@ -249,11 +246,9 @@ static void lcevc_free(AVRefStructOpaque unused, void *obj)
LCEVC_DestroyDecoder(lcevc->decoder);
memset(lcevc, 0, sizeof(*lcevc));
}
-#endif
static int lcevc_init(FFLCEVCContext *lcevc, void *logctx)
{
-#if CONFIG_LIBLCEVC_DEC
LCEVC_AccelContextHandle dummy = { 0 };
const int32_t event = LCEVC_Log;
@@ -272,7 +267,6 @@ static int lcevc_init(FFLCEVCContext *lcevc, void *logctx)
return AVERROR_EXTERNAL;
}
-#endif
lcevc->initialized = 1;
return 0;
@@ -291,7 +285,6 @@ int ff_lcevc_process(void *logctx, AVFrame *frame)
return ret;
}
-#if CONFIG_LIBLCEVC_DEC
av_assert0(frame_ctx->frame);
@@ -304,7 +297,6 @@ int ff_lcevc_process(void *logctx, AVFrame *frame)
return ret;
av_frame_remove_side_data(frame, AV_FRAME_DATA_LCEVC);
-#endif
return 0;
}
@@ -312,11 +304,9 @@ int ff_lcevc_process(void *logctx, AVFrame *frame)
int ff_lcevc_alloc(FFLCEVCContext **plcevc)
{
FFLCEVCContext *lcevc = NULL;
-#if CONFIG_LIBLCEVC_DEC
lcevc = av_refstruct_alloc_ext(sizeof(*lcevc), 0, NULL, lcevc_free);
if (!lcevc)
return AVERROR(ENOMEM);
-#endif
*plcevc = lcevc;
return 0;
}
--
2.49.1
_______________________________________________
ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org
To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2025-11-04 15:45 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-11-02 15:58 [FFmpeg-devel] [PATCH] Optimize lcevc away if disabled (PR #20818) mkver via ffmpeg-devel
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git