[PATCH 15/45] media: qcom: camss: video: use helpers for line-based formats
From: Gjorgji . Rosikopulos . gjorgji . rosikopulos
Date: Tue Oct 06 2026 - 18:44:24 EST
From: Atanas Filipov <atanas.filipov@xxxxxxxxxxxxxxxx>
Use the V4L2 format helpers to calculate line-based plane sizes from
the selected format.
Signed-off-by: Atanas Filipov <atanas.filipov@xxxxxxxxxxxxxxxx>
---
.../media/platform/qcom/camss/camss-video.c | 76 +++++++++++--------
1 file changed, 44 insertions(+), 32 deletions(-)
diff --git a/drivers/media/platform/qcom/camss/camss-video.c b/drivers/media/platform/qcom/camss/camss-video.c
index c570d7f9258c..803e5ce9b9fd 100644
--- a/drivers/media/platform/qcom/camss/camss-video.c
+++ b/drivers/media/platform/qcom/camss/camss-video.c
@@ -7,7 +7,9 @@
* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
* Copyright (C) 2015-2018 Linaro Ltd.
*/
+#include <linux/align.h>
#include <linux/slab.h>
+
#include <media/media-entity.h>
#include <media/v4l2-dev.h>
#include <media/v4l2-device.h>
@@ -513,29 +515,59 @@ static int video_g_fmt(struct file *file, void *fh, struct v4l2_format *f)
return 0;
}
+static int video_try_line_based(struct camss_video *video, struct v4l2_format *f)
+{
+ struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp;
+ const struct v4l2_format_info *info;
+ unsigned int i;
+ u32 alignment = video->bpl_alignment ?: 1;
+
+ for (i = 0; i < video->nformats; i++) {
+ if (pix_mp->pixelformat == video->formats[i].pixelformat)
+ break;
+ }
+
+ if (i == video->nformats)
+ pix_mp->pixelformat = video->formats[0].pixelformat;
+
+ info = v4l2_format_info(pix_mp->pixelformat);
+ if (!info) {
+ dev_err(video->camss->dev, "No V4L2 info for requested format\n");
+ return -EINVAL;
+ }
+
+ pix_mp->width = clamp_t(u32, pix_mp->width, 1, CAMSS_FRAME_MAX_WIDTH);
+ pix_mp->height = clamp_t(u32, pix_mp->height, 1, CAMSS_FRAME_MAX_HEIGHT_PIX);
+
+ pix_mp->width = max_t(u32, round_down(pix_mp->width, info->hdiv), info->hdiv);
+ pix_mp->height = max_t(u32, round_down(pix_mp->height, info->vdiv), info->vdiv);
+
+ pix_mp->field = V4L2_FIELD_NONE;
+ pix_mp->colorspace = V4L2_COLORSPACE_SRGB;
+ pix_mp->flags = 0;
+ pix_mp->ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(pix_mp->colorspace);
+ pix_mp->quantization =
+ V4L2_MAP_QUANTIZATION_DEFAULT(true, pix_mp->colorspace,
+ pix_mp->ycbcr_enc);
+ pix_mp->xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(pix_mp->colorspace);
+
+ return v4l2_fill_pixfmt_mp_aligned(pix_mp, pix_mp->pixelformat,
+ pix_mp->width, pix_mp->height, alignment);
+}
+
static int __video_try_fmt(struct camss_video *video, struct v4l2_format *f)
{
unsigned int alignment = video->bpl_alignment;
struct v4l2_pix_format_mplane *pix_mp;
const struct camss_format_info *fi;
- struct v4l2_plane_pix_format *p;
- u32 bytesperline[3] = { 0 };
- u32 sizeimage[3] = { 0 };
u32 width, height;
- u32 bpl, lines;
+ u32 bpl;
int i, j;
pix_mp = &f->fmt.pix_mp;
if (video->line_based)
- for (i = 0; i < pix_mp->num_planes && i < 3; i++) {
- p = &pix_mp->plane_fmt[i];
- bytesperline[i] = clamp_t(u32, p->bytesperline,
- 1, 65528);
- sizeimage[i] = clamp_t(u32, p->sizeimage,
- bytesperline[i],
- bytesperline[i] * CAMSS_FRAME_MAX_HEIGHT_PIX);
- }
+ return video_try_line_based(video, f);
for (j = 0; j < video->nformats; j++)
if (pix_mp->pixelformat == video->formats[j].pixelformat)
@@ -574,26 +606,6 @@ static int __video_try_fmt(struct camss_video *video, struct v4l2_format *f)
pix_mp->colorspace, pix_mp->ycbcr_enc);
pix_mp->xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(pix_mp->colorspace);
- if (video->line_based)
- for (i = 0; i < pix_mp->num_planes; i++) {
- p = &pix_mp->plane_fmt[i];
- p->bytesperline = clamp_t(u32, p->bytesperline,
- 1, 65528);
- p->sizeimage = clamp_t(u32, p->sizeimage,
- p->bytesperline,
- p->bytesperline * CAMSS_FRAME_MAX_HEIGHT_PIX);
- lines = p->sizeimage / p->bytesperline;
-
- if (p->bytesperline < bytesperline[i])
- p->bytesperline = roundup(bytesperline[i], alignment);
-
- if (p->sizeimage < p->bytesperline * lines)
- p->sizeimage = p->bytesperline * lines;
-
- if (p->sizeimage < sizeimage[i])
- p->sizeimage = sizeimage[i];
- }
-
return 0;
}
--
2.34.1