Skip to content

Commit 991b313

Browse files
Albert WangMauro Carvalho Chehab
authored andcommitted
[media] media: soc_camera: don't clear pix->sizeimage in JPEG mode
In JPEG mode, the size of image is variable due to different JPEG compression rate. We only can get the pix->sizeimage from the user. If we clear pix->sizeimage in soc_camera_try_fmt() then we will get it from: ret = soc_mbus_image_size(xlate->host_fmt, pix->bytesperline, pix->height); if (ret < 0) return ret; pix->sizeimage = max_t(u32, pix->sizeimage, ret); In general, this sizeimage will be larger than the actul JPEG image size. But vb2 will check the buffer and size of image in __qbuf_userptr(): /* Check if the provided plane buffer is large enough */ if (planes[plane].length < q->plane_sizes[plane]) So we shouldn't clear the pix->sizeimage and also shouldn't re-calculate the pix->sizeimage in soc_mbus_image_size() in JPEG mode We also shouldn't re-calculate pix->bytesperline: ret = soc_mbus_bytes_per_line(pix->width, xlate->host_fmt); if (ret < 0) return ret; pix->bytesperline = max_t(u32, pix->bytesperline, ret); pix->bytesperline also should be set by the user or by the driver's try_fmt() implementation. Change-Id: I700690a2287346127a624b5260922eaa5427a596 Signed-off-by: Albert Wang <[email protected]> Signed-off-by: Guennadi Liakhovetski <[email protected]> Signed-off-by: Mauro Carvalho Chehab <[email protected]>
1 parent ad5b987 commit 991b313

File tree

2 files changed

+8
-1
lines changed

2 files changed

+8
-1
lines changed

drivers/media/video/soc_camera.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,8 @@ static int soc_camera_try_fmt(struct soc_camera_device *icd,
171171
dev_dbg(icd->pdev, "TRY_FMT(%c%c%c%c, %ux%u)\n",
172172
pixfmtstr(pix->pixelformat), pix->width, pix->height);
173173

174-
if (!(ici->capabilities & SOCAM_HOST_CAP_STRIDE)) {
174+
if (pix->pixelformat != V4L2_PIX_FMT_JPEG &&
175+
!(ici->capabilities & SOCAM_HOST_CAP_STRIDE)) {
175176
pix->bytesperline = 0;
176177
pix->sizeimage = 0;
177178
}

drivers/media/video/soc_mediabus.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,9 @@ EXPORT_SYMBOL(soc_mbus_samples_per_pixel);
378378

379379
s32 soc_mbus_bytes_per_line(u32 width, const struct soc_mbus_pixelfmt *mf)
380380
{
381+
if (mf->fourcc == V4L2_PIX_FMT_JPEG)
382+
return 0;
383+
381384
if (mf->layout != SOC_MBUS_LAYOUT_PACKED)
382385
return width * mf->bits_per_sample / 8;
383386

@@ -400,6 +403,9 @@ EXPORT_SYMBOL(soc_mbus_bytes_per_line);
400403
s32 soc_mbus_image_size(const struct soc_mbus_pixelfmt *mf,
401404
u32 bytes_per_line, u32 height)
402405
{
406+
if (mf->fourcc == V4L2_PIX_FMT_JPEG)
407+
return 0;
408+
403409
if (mf->layout == SOC_MBUS_LAYOUT_PACKED)
404410
return bytes_per_line * height;
405411

0 commit comments

Comments
 (0)