[PATCH v2 06/12] media: mediatek: jpeg: refactor jpeg buffer payload setting

kyrie.wu
2025-04-10T06:45:55Z

1. for multi-core jpegdec:
core0: |<-------- decoding buffer0 and resolution changed to smaller
core1: |<-------- decoding buffer1
core0: |<- handling resolution changing
core0: |<- vb2_set_plane_payload
2. the payload size is changed on the step of set format. Because core1
is running and streaming has not been stopped, the format cannot be
set again, resulting in no change in the payload size.
3. at this time, the payload size is bigger than buffer length,
it will print a warnning call trace
4. set payload size must less than buffer length

Signed-off-by: kyrie.wu <kyrie.wu@mediatek.com>
---
.../platform/mediatek/jpeg/mtk_jpeg_core.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c
index 0ea3851e0ab1..3b386ec44b36 100644
--- a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c
+++ b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c
@@ -719,10 +719,22 @@ static int mtk_jpeg_buf_prepare(struct vb2_buffer *vb)
plane_fmt = q_data->pix_mp.plane_fmt[i];
if (ctx->enable_exif &&
q_data->fmt->fourcc == V4L2_PIX_FMT_JPEG)
- vb2_set_plane_payload(vb, i, plane_fmt.sizeimage +
- MTK_JPEG_MAX_EXIF_SIZE);
+ if (vb->planes[i].length > (plane_fmt.sizeimage +
+ MTK_JPEG_MAX_EXIF_SIZE))
+ vb2_set_plane_payload(vb, i,
+ plane_fmt.sizeimage +
+ MTK_JPEG_MAX_EXIF_SIZE);
+ else
+ vb2_set_plane_payload(vb, i,
+ vb->planes[i].length);
+
else
- vb2_set_plane_payload(vb, i, plane_fmt.sizeimage);
+ if (vb->planes[i].length > plane_fmt.sizeimage)
+ vb2_set_plane_payload(vb, i,
+ plane_fmt.sizeimage);
+ else
+ vb2_set_plane_payload(vb, i,
+ vb->planes[i].length);
}

return 0;
--
2.46.0