[<prev] [next>] [day] [month] [year] [list]
Message-ID: <20250526093624.4760-1-jianhua.lin@mediatek.com>
Date: Mon, 26 May 2025 17:36:24 +0800
From: Jianhua Lin <jianhua.lin@...iatek.com>
To: <mchehab@...nel.org>, <matthias.bgg@...il.com>,
<angelogioacchino.delregno@...labora.com>
CC: <linux-kernel@...r.kernel.org>, <linux-arm-kernel@...ts.infradead.org>,
<linux-mediatek@...ts.infradead.org>,
<Project_Global_Chrome_Upstream_Group@...iatek.com>, Jianhua Lin
<jianhua.lin@...iatek.com>
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 <jianhua.lin@...iatek.com>
---
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
Powered by blists - more mailing lists