Skip to content

Commit

Permalink
[media] em28xx: std fixes: don't implement in webcam mode, and fix st…
Browse files Browse the repository at this point in the history
…d changes

When in webcam mode the STD API shouldn't be implemented.
When changing the standard the resolution wasn't updated, and there was no
check against streaming-in-progress.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Devin Heitmueller <dheitmueller@kernellabs.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
  • Loading branch information
Hans Verkuil authored and Mauro Carvalho Chehab committed Jan 5, 2013
1 parent 7f52979 commit d8c95c0
Showing 1 changed file with 21 additions and 4 deletions.
25 changes: 21 additions & 4 deletions drivers/media/usb/em28xx/em28xx-video.c
Original file line number Diff line number Diff line change
Expand Up @@ -909,6 +909,8 @@ static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *norm)
struct em28xx *dev = fh->dev;
int rc;

if (dev->board.is_webcam)
return -ENOTTY;
rc = check_dev(dev);
if (rc < 0)
return rc;
Expand All @@ -924,6 +926,8 @@ static int vidioc_querystd(struct file *file, void *priv, v4l2_std_id *norm)
struct em28xx *dev = fh->dev;
int rc;

if (dev->board.is_webcam)
return -ENOTTY;
rc = check_dev(dev);
if (rc < 0)
return rc;
Expand All @@ -940,15 +944,24 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *norm)
struct v4l2_format f;
int rc;

if (dev->board.is_webcam)
return -ENOTTY;
if (*norm == dev->norm)
return 0;
rc = check_dev(dev);
if (rc < 0)
return rc;

if (videobuf_queue_is_busy(&fh->vb_vidq)) {
em28xx_errdev("%s queue busy\n", __func__);
return -EBUSY;
}

dev->norm = *norm;

/* Adjusts width/height, if needed */
f.fmt.pix.width = dev->width;
f.fmt.pix.height = dev->height;
f.fmt.pix.width = 720;
f.fmt.pix.height = (*norm & V4L2_STD_525_60) ? 480 : 576;
vidioc_try_fmt_vid_cap(file, priv, &f);

/* set new image size */
Expand Down Expand Up @@ -1034,6 +1047,9 @@ static int vidioc_enum_input(struct file *file, void *priv,
i->type = V4L2_INPUT_TYPE_TUNER;

i->std = dev->vdev->tvnorms;
/* webcams do not have the STD API */
if (dev->board.is_webcam)
i->capabilities = 0;

return 0;
}
Expand Down Expand Up @@ -2059,7 +2075,6 @@ static const struct video_device em28xx_video_template = {
.ioctl_ops = &video_ioctl_ops,

.tvnorms = V4L2_STD_ALL,
.current_norm = V4L2_STD_PAL,
};

static const struct v4l2_file_operations radio_fops = {
Expand Down Expand Up @@ -2109,6 +2124,8 @@ static struct video_device *em28xx_vdev_init(struct em28xx *dev,
vfd->debug = video_debug;
vfd->lock = &dev->lock;
set_bit(V4L2_FL_USE_FH_PRIO, &vfd->flags);
if (dev->board.is_webcam)
vfd->tvnorms = 0;

snprintf(vfd->name, sizeof(vfd->name), "%s %s",
dev->name, type_name);
Expand All @@ -2127,7 +2144,7 @@ int em28xx_register_analog_devices(struct em28xx *dev)
dev->name, EM28XX_VERSION);

/* set default norm */
dev->norm = em28xx_video_template.current_norm;
dev->norm = V4L2_STD_PAL;
v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_std, dev->norm);
dev->interlaced = EM28XX_INTERLACED_DEFAULT;

Expand Down

0 comments on commit d8c95c0

Please sign in to comment.