Skip to content

Commit

Permalink
V4L/DVB (12525): soc-camera: prohibit geometry change with initialise…
Browse files Browse the repository at this point in the history
…d buffers

Prohibit S_FMT and S_CROP with a different window width or height after video
buffer initialisation. This simplifies the work to be done in specific host and
client drivers, and it doesn't seem to make much sense to allow these changes.
We do however allow S_CROP with equal width and height to just move the window,
this doesn't affect video buffer management and is usually easy enough to
implement.

Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
  • Loading branch information
Guennadi Liakhovetski authored and Mauro Carvalho Chehab committed Sep 19, 2009
1 parent 68a54f0 commit b897a91
Showing 1 changed file with 12 additions and 2 deletions.
14 changes: 12 additions & 2 deletions drivers/media/video/soc_camera.c
Original file line number Diff line number Diff line change
Expand Up @@ -517,8 +517,8 @@ static int soc_camera_s_fmt_vid_cap(struct file *file, void *priv,

mutex_lock(&icf->vb_vidq.vb_lock);

if (videobuf_queue_is_busy(&icf->vb_vidq)) {
dev_err(&icd->dev, "S_FMT denied: queue busy\n");
if (icf->vb_vidq.bufs[0]) {
dev_err(&icd->dev, "S_FMT denied: queue initialised\n");
ret = -EBUSY;
goto unlock;
}
Expand Down Expand Up @@ -768,6 +768,15 @@ static int soc_camera_s_crop(struct file *file, void *fh,
/* Cropping is allowed during a running capture, guard consistency */
mutex_lock(&icf->vb_vidq.vb_lock);

/* Prohibit window size change with initialised buffers */
if (icf->vb_vidq.bufs[0] && (rect.width != icd->rect_current.width ||
rect.height != icd->rect_current.height)) {
dev_err(&icd->dev,
"S_CROP denied: queue initialised and sizes differ\n");
ret = -EBUSY;
goto unlock;
}

if (rect.width > icd->rect_max.width)
rect.width = icd->rect_max.width;

Expand All @@ -792,6 +801,7 @@ static int soc_camera_s_crop(struct file *file, void *fh,
if (!ret)
icd->rect_current = rect;

unlock:
mutex_unlock(&icf->vb_vidq.vb_lock);

return ret;
Expand Down

0 comments on commit b897a91

Please sign in to comment.