Commit 7d687af4 authored by Ondrej Zary's avatar Ondrej Zary Committed by Mauro Carvalho Chehab

[media] gspca: Support variable resolution

Add variable resolution support to gspca by allowing subdrivers to
specify try_fmt and enum_framesizes functions.
Signed-off-by: default avatarOndrej Zary <linux@rainbow-software.org>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarMauro Carvalho Chehab <m.chehab@samsung.com>
parent 1966bc2a
...@@ -1133,6 +1133,12 @@ static int try_fmt_vid_cap(struct gspca_dev *gspca_dev, ...@@ -1133,6 +1133,12 @@ static int try_fmt_vid_cap(struct gspca_dev *gspca_dev,
mode = mode2; mode = mode2;
} }
fmt->fmt.pix = gspca_dev->cam.cam_mode[mode]; fmt->fmt.pix = gspca_dev->cam.cam_mode[mode];
if (gspca_dev->sd_desc->try_fmt) {
/* pass original resolution to subdriver try_fmt */
fmt->fmt.pix.width = w;
fmt->fmt.pix.height = h;
gspca_dev->sd_desc->try_fmt(gspca_dev, fmt);
}
/* some drivers use priv internally, zero it before giving it to /* some drivers use priv internally, zero it before giving it to
userspace */ userspace */
fmt->fmt.pix.priv = 0; fmt->fmt.pix.priv = 0;
...@@ -1171,16 +1177,15 @@ static int vidioc_s_fmt_vid_cap(struct file *file, void *priv, ...@@ -1171,16 +1177,15 @@ static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
goto out; goto out;
} }
if (ret == gspca_dev->curr_mode) {
ret = 0;
goto out; /* same mode */
}
if (gspca_dev->streaming) { if (gspca_dev->streaming) {
ret = -EBUSY; ret = -EBUSY;
goto out; goto out;
} }
gspca_dev->curr_mode = ret; gspca_dev->curr_mode = ret;
if (gspca_dev->sd_desc->try_fmt)
/* subdriver try_fmt can modify format parameters */
gspca_dev->pixfmt = fmt->fmt.pix;
else
gspca_dev->pixfmt = gspca_dev->cam.cam_mode[ret]; gspca_dev->pixfmt = gspca_dev->cam.cam_mode[ret];
ret = 0; ret = 0;
...@@ -1196,6 +1201,9 @@ static int vidioc_enum_framesizes(struct file *file, void *priv, ...@@ -1196,6 +1201,9 @@ static int vidioc_enum_framesizes(struct file *file, void *priv,
int i; int i;
__u32 index = 0; __u32 index = 0;
if (gspca_dev->sd_desc->enum_framesizes)
return gspca_dev->sd_desc->enum_framesizes(gspca_dev, fsize);
for (i = 0; i < gspca_dev->cam.nmodes; i++) { for (i = 0; i < gspca_dev->cam.nmodes; i++) {
if (fsize->pixel_format != if (fsize->pixel_format !=
gspca_dev->cam.cam_mode[i].pixelformat) gspca_dev->cam.cam_mode[i].pixelformat)
......
...@@ -88,6 +88,10 @@ typedef void (*cam_pkt_op) (struct gspca_dev *gspca_dev, ...@@ -88,6 +88,10 @@ typedef void (*cam_pkt_op) (struct gspca_dev *gspca_dev,
typedef int (*cam_int_pkt_op) (struct gspca_dev *gspca_dev, typedef int (*cam_int_pkt_op) (struct gspca_dev *gspca_dev,
u8 *data, u8 *data,
int len); int len);
typedef void (*cam_format_op) (struct gspca_dev *gspca_dev,
struct v4l2_format *fmt);
typedef int (*cam_frmsize_op) (struct gspca_dev *gspca_dev,
struct v4l2_frmsizeenum *fsize);
/* subdriver description */ /* subdriver description */
struct sd_desc { struct sd_desc {
...@@ -109,6 +113,8 @@ struct sd_desc { ...@@ -109,6 +113,8 @@ struct sd_desc {
cam_set_jpg_op set_jcomp; cam_set_jpg_op set_jcomp;
cam_streamparm_op get_streamparm; cam_streamparm_op get_streamparm;
cam_streamparm_op set_streamparm; cam_streamparm_op set_streamparm;
cam_format_op try_fmt;
cam_frmsize_op enum_framesizes;
#ifdef CONFIG_VIDEO_ADV_DEBUG #ifdef CONFIG_VIDEO_ADV_DEBUG
cam_set_reg_op set_register; cam_set_reg_op set_register;
cam_get_reg_op get_register; cam_get_reg_op get_register;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment