* [FFmpeg-devel] [PATCH] avcodec/lcevcdec: fix input dimensions for the base picture (PR #21269)
@ 2025-12-23 0:57 James Almer via ffmpeg-devel
0 siblings, 0 replies; only message in thread
From: James Almer via ffmpeg-devel @ 2025-12-23 0:57 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: James Almer
PR #21269 opened by James Almer (jamrial)
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21269
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21269.patch
>From 6bef7777d6651328b80d70490ac1456eeb466657 Mon Sep 17 00:00:00 2001
From: James Almer <jamrial@gmail.com>
Date: Mon, 22 Dec 2025 21:53:47 -0300
Subject: [PATCH 1/3] avcodec/lcevcdec: avoid copying the input frame
Based on the lcevc filter implementation.
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavcodec/lcevcdec.c | 37 +++++++------------------------------
1 file changed, 7 insertions(+), 30 deletions(-)
diff --git a/libavcodec/lcevcdec.c b/libavcodec/lcevcdec.c
index f55f55a03f..bccd524bf5 100644
--- a/libavcodec/lcevcdec.c
+++ b/libavcodec/lcevcdec.c
@@ -49,10 +49,7 @@ static int alloc_base_frame(void *logctx, FFLCEVCContext *lcevc,
{
LCEVC_PictureDesc desc;
LCEVC_ColorFormat fmt = map_format(frame->format);
- LCEVC_PictureLockHandle lock;
- uint8_t *data[4] = { NULL };
- int linesizes[4] = { 0 };
- uint32_t planes;
+ LCEVC_PicturePlaneDesc planes[AV_VIDEO_MAX_PLANES] = { 0 };
LCEVC_ReturnCode res;
res = LCEVC_DefaultPictureDesc(&desc, fmt, frame->width, frame->height);
@@ -66,36 +63,16 @@ static int alloc_base_frame(void *logctx, FFLCEVCContext *lcevc,
desc.sampleAspectRatioNum = frame->sample_aspect_ratio.num;
desc.sampleAspectRatioDen = frame->sample_aspect_ratio.den;
+ for (int i = 0; i < AV_VIDEO_MAX_PLANES; i++) {
+ planes[i].firstSample = frame->data[i];
+ planes[i].rowByteStride = frame->linesize[i];
+ }
+
/* Allocate LCEVC Picture */
- res = LCEVC_AllocPicture(lcevc->decoder, &desc, picture);
+ res = LCEVC_AllocPictureExternal(lcevc->decoder, &desc, NULL, planes, picture);
if (res != LCEVC_Success) {
return AVERROR_EXTERNAL;
}
- res = LCEVC_LockPicture(lcevc->decoder, *picture, LCEVC_Access_Write, &lock);
- if (res != LCEVC_Success)
- return AVERROR_EXTERNAL;
-
- res = LCEVC_GetPicturePlaneCount(lcevc->decoder, *picture, &planes);
- if (res != LCEVC_Success)
- return AVERROR_EXTERNAL;
-
- for (unsigned i = 0; i < planes; i++) {
- LCEVC_PicturePlaneDesc plane;
-
- res = LCEVC_GetPictureLockPlaneDesc(lcevc->decoder, lock, i, &plane);
- if (res != LCEVC_Success)
- return AVERROR_EXTERNAL;
-
- data[i] = plane.firstSample;
- linesizes[i] = plane.rowByteStride;
- }
-
- av_image_copy2(data, linesizes, frame->data, frame->linesize,
- frame->format, frame->width, frame->height);
-
- res = LCEVC_UnlockPicture(lcevc->decoder, lock);
- if (res != LCEVC_Success)
- return AVERROR_EXTERNAL;
return 0;
}
--
2.49.1
>From 6921861dd18345e762d59f1ee4b9d61683b3db32 Mon Sep 17 00:00:00 2001
From: James Almer <jamrial@gmail.com>
Date: Mon, 22 Dec 2025 21:54:43 -0300
Subject: [PATCH 2/3] avcodec/lcevcdec: fix input dimensions for the base
picture
Fixes crashes with some samples.
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavcodec/lcevcdec.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/libavcodec/lcevcdec.c b/libavcodec/lcevcdec.c
index bccd524bf5..179ebdd708 100644
--- a/libavcodec/lcevcdec.c
+++ b/libavcodec/lcevcdec.c
@@ -50,9 +50,11 @@ static int alloc_base_frame(void *logctx, FFLCEVCContext *lcevc,
LCEVC_PictureDesc desc;
LCEVC_ColorFormat fmt = map_format(frame->format);
LCEVC_PicturePlaneDesc planes[AV_VIDEO_MAX_PLANES] = { 0 };
+ int width = frame->width - frame->crop_left - frame->crop_right;
+ int height = frame->height - frame->crop_top - frame->crop_bottom;
LCEVC_ReturnCode res;
- res = LCEVC_DefaultPictureDesc(&desc, fmt, frame->width, frame->height);
+ res = LCEVC_DefaultPictureDesc(&desc, fmt, width, height);
if (res != LCEVC_Success)
return AVERROR_EXTERNAL;
--
2.49.1
>From f2e0eb48594e83c3dbd026358afaabc9b9ed552c Mon Sep 17 00:00:00 2001
From: James Almer <jamrial@gmail.com>
Date: Mon, 22 Dec 2025 21:56:09 -0300
Subject: [PATCH 3/3] avcodec/lcevcdec: free pictures on error
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavcodec/lcevcdec.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/libavcodec/lcevcdec.c b/libavcodec/lcevcdec.c
index 179ebdd708..4f6d793625 100644
--- a/libavcodec/lcevcdec.c
+++ b/libavcodec/lcevcdec.c
@@ -126,8 +126,10 @@ static int lcevc_send_frame(void *logctx, FFLCEVCFrame *frame_ctx, const AVFrame
return ret;
res = LCEVC_SendDecoderBase(lcevc->decoder, in->pts, picture, -1, NULL);
- if (res != LCEVC_Success)
+ if (res != LCEVC_Success) {
+ LCEVC_FreePicture(lcevc->decoder, picture);
return AVERROR_EXTERNAL;
+ }
memset(&picture, 0, sizeof(picture));
ret = alloc_enhanced_frame(logctx, frame_ctx, &picture);
@@ -135,8 +137,10 @@ static int lcevc_send_frame(void *logctx, FFLCEVCFrame *frame_ctx, const AVFrame
return ret;
res = LCEVC_SendDecoderPicture(lcevc->decoder, picture);
- if (res != LCEVC_Success)
+ if (res != LCEVC_Success) {
+ LCEVC_FreePicture(lcevc->decoder, picture);
return AVERROR_EXTERNAL;
+ }
return 0;
}
@@ -154,8 +158,10 @@ static int generate_output(void *logctx, FFLCEVCFrame *frame_ctx, AVFrame *out)
return AVERROR_EXTERNAL;
res = LCEVC_GetPictureDesc(lcevc->decoder, picture, &desc);
- if (res != LCEVC_Success)
+ if (res != LCEVC_Success) {
+ LCEVC_FreePicture(lcevc->decoder, picture);
return AVERROR_EXTERNAL;
+ }
out->crop_top = desc.cropTop;
out->crop_bottom = desc.cropBottom;
--
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-12-23 0:58 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-12-23 0:57 [FFmpeg-devel] [PATCH] avcodec/lcevcdec: fix input dimensions for the base picture (PR #21269) James Almer 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