(no subject)
From: Jianhua Lin <hidden>
Date: 2025-05-26 09:31:19
Also in:
linux-mediatek, lkml
Subsystem:
media input infrastructure (v4l/dvb), mediatek jpeg driver, the rest · Maintainers:
Mauro Carvalho Chehab, Bin Liu, Linus Torvalds
From: Jianhua Lin <redacted> Date: Thu, 17 Apr 2025 11:28:00 +0800 Subject: [PATCH v3 1/1] media: mediatek: jpeg: fix buffer alignment The JPEG encoder image stride register must be MCU aligned. For YUV422, it's 32-byte aligned, and for YUV420, it's 16-byte aligned. The minimal DCT block size is 8x8, so the vertical buffer alignment for YUV422 is 8-byte aligned, and for YUV420, it's 16-byte aligned. Signed-off-by: Jianhua Lin <redacted> --- Changes compared with v2: - Add missing subject Changes compared with v1: - Fix the side effects of v1 when encoding YUV420 with resolution 720x480, the ouput image is abnormal. - Fix signed-off-by .../platform/mediatek/jpeg/mtk_jpeg_core.c | 44 ++++++++++++------- 1 file changed, 29 insertions(+), 15 deletions(-)
diff --git a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c
index 834d2a354692..f01a81feb692 100644
--- a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c
+++ b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c@@ -40,8 +40,8 @@ static struct mtk_jpeg_fmt mtk_jpeg_enc_formats[] = { .h_sample = {4, 4}, .v_sample = {4, 2}, .colplanes = 2, - .h_align = 4, - .v_align = 4, + .h_align = 16, + .v_align = 16, .flags = MTK_JPEG_FMT_FLAG_OUTPUT, }, {
@@ -50,8 +50,8 @@ static struct mtk_jpeg_fmt mtk_jpeg_enc_formats[] = { .h_sample = {4, 4}, .v_sample = {4, 2}, .colplanes = 2, - .h_align = 4, - .v_align = 4, + .h_align = 16, + .v_align = 16, .flags = MTK_JPEG_FMT_FLAG_OUTPUT, }, {
@@ -60,8 +60,8 @@ static struct mtk_jpeg_fmt mtk_jpeg_enc_formats[] = { .h_sample = {8}, .v_sample = {4}, .colplanes = 1, - .h_align = 5, - .v_align = 3, + .h_align = 32, + .v_align = 8, .flags = MTK_JPEG_FMT_FLAG_OUTPUT, }, {
@@ -70,8 +70,8 @@ static struct mtk_jpeg_fmt mtk_jpeg_enc_formats[] = { .h_sample = {8}, .v_sample = {4}, .colplanes = 1, - .h_align = 5, - .v_align = 3, + .h_align = 32, + .v_align = 8, .flags = MTK_JPEG_FMT_FLAG_OUTPUT, }, };
@@ -87,8 +87,8 @@ static struct mtk_jpeg_fmt mtk_jpeg_dec_formats[] = { .h_sample = {4, 2, 2}, .v_sample = {4, 2, 2}, .colplanes = 3, - .h_align = 5, - .v_align = 4, + .h_align = 16, + .v_align = 16, .flags = MTK_JPEG_FMT_FLAG_CAPTURE, }, {
@@ -96,8 +96,8 @@ static struct mtk_jpeg_fmt mtk_jpeg_dec_formats[] = { .h_sample = {4, 2, 2}, .v_sample = {4, 4, 4}, .colplanes = 3, - .h_align = 5, - .v_align = 3, + .h_align = 32, + .v_align = 8, .flags = MTK_JPEG_FMT_FLAG_CAPTURE, }, };
@@ -260,6 +260,7 @@ static int mtk_jpeg_try_fmt_mplane(struct v4l2_pix_format_mplane *pix_mp, struct mtk_jpeg_fmt *fmt) { int i; + u32 h_align; pix_mp->field = V4L2_FIELD_NONE;
@@ -283,9 +284,15 @@ static int mtk_jpeg_try_fmt_mplane(struct v4l2_pix_format_mplane *pix_mp, } /* other fourcc */ + if (pix_mp->pixelformat == V4L2_PIX_FMT_YUYV || + pix_mp->pixelformat == V4L2_PIX_FMT_YVYU) + h_align = fmt->h_align / 2; + else + h_align = fmt->h_align; + pix_mp->height = clamp(round_up(pix_mp->height, fmt->v_align), MTK_JPEG_MIN_HEIGHT, MTK_JPEG_MAX_HEIGHT); - pix_mp->width = clamp(round_up(pix_mp->width, fmt->h_align), + pix_mp->width = clamp(round_up(pix_mp->width, h_align), MTK_JPEG_MIN_WIDTH, MTK_JPEG_MAX_WIDTH); for (i = 0; i < fmt->colplanes; i++) {
@@ -293,8 +300,15 @@ static int mtk_jpeg_try_fmt_mplane(struct v4l2_pix_format_mplane *pix_mp, u32 stride = pix_mp->width * fmt->h_sample[i] / 4; u32 h = pix_mp->height * fmt->v_sample[i] / 4; - pfmt->bytesperline = stride; - pfmt->sizeimage = stride * h; + if (pix_mp->pixelformat == V4L2_PIX_FMT_YUYV || + pix_mp->pixelformat == V4L2_PIX_FMT_YVYU) { + stride = round_up(stride, fmt->h_align); + pfmt->bytesperline = stride; + pfmt->sizeimage = stride * h; + } else { + pfmt->bytesperline = stride; + pfmt->sizeimage = stride * h; + } } return 0; }
--
2.46.0