[PATCH v2 7/8] media: venus: report the QC10C data stride

From: Dmitry Baryshkov

Date: Fri Nov 06 2026 - 08:48:55 EST


For QC10C capture buffers the decoder reports bytesperline as the width
aligned to 128, as for 8-bit formats. QC10C packs three 10-bit samples
in 32 bits and pads each line to 256 bytes per 192 pixels, so the
reported value does not describe the buffer: a 1920 pixel line takes
2560 bytes, not 1920. Userspace passing the frame on to other devices
has to take the stride from bytesperline and gets it wrong.

Report the stride the buffer actually has, as computed for the
buffer size and as Iris already does. The downstream msm_vidc driver
reports VENUS_Y_STRIDE(), which for NV12_BPP10_UBWC is the same
ALIGN(ALIGN(width, 192) * 4 / 3, 256).

Fixes: cef92b14e653 ("media: venus: Add a handling of QC10C compressed format")
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@xxxxxxxxxxxxxxxx>
---
drivers/media/platform/qcom/venus/vdec.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/media/platform/qcom/venus/vdec.c b/drivers/media/platform/qcom/venus/vdec.c
index 6a43ea191da1..9de0c9bc2919 100644
--- a/drivers/media/platform/qcom/venus/vdec.c
+++ b/drivers/media/platform/qcom/venus/vdec.c
@@ -227,7 +227,10 @@ vdec_try_fmt_common(struct venus_inst *inst, struct v4l2_format *f)
stride *= 2;

pfmt[0].sizeimage = szimage;
- pfmt[0].bytesperline = ALIGN(stride, 128);
+ if (pixmp->pixelformat == V4L2_PIX_FMT_QC10C)
+ pfmt[0].bytesperline = DIV_ROUND_UP(pixmp->width, 192) * 256;
+ else
+ pfmt[0].bytesperline = ALIGN(stride, 128);
} else {
pfmt[0].sizeimage = clamp_t(u32, pfmt[0].sizeimage, 0, SZ_8M);
pfmt[0].sizeimage = max(pfmt[0].sizeimage, szimage);

--
2.47.3