diff options
author | Ondrej Zary <linux@rainbow-software.org> | 2013-08-30 16:54:24 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2013-09-26 06:20:48 -0400 |
commit | 7d687af4d5148ffb69da5f71c684380a478ad159 (patch) | |
tree | 02994f34303017d50415c46bf85272188da4988e | |
parent | 1966bc2a48f12d5d11c4fbe0880955cc4bfda0f9 (diff) |
[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: Ondrej Zary <linux@rainbow-software.org>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
-rw-r--r-- | drivers/media/usb/gspca/gspca.c | 20 | ||||
-rw-r--r-- | drivers/media/usb/gspca/gspca.h | 6 |
2 files changed, 20 insertions, 6 deletions
diff --git a/drivers/media/usb/gspca/gspca.c b/drivers/media/usb/gspca/gspca.c index c341bbb638f0..f3a7ace0fac9 100644 --- a/drivers/media/usb/gspca/gspca.c +++ b/drivers/media/usb/gspca/gspca.c | |||
@@ -1133,6 +1133,12 @@ static int try_fmt_vid_cap(struct gspca_dev *gspca_dev, | |||
1133 | mode = mode2; | 1133 | mode = mode2; |
1134 | } | 1134 | } |
1135 | fmt->fmt.pix = gspca_dev->cam.cam_mode[mode]; | 1135 | fmt->fmt.pix = gspca_dev->cam.cam_mode[mode]; |
1136 | if (gspca_dev->sd_desc->try_fmt) { | ||
1137 | /* pass original resolution to subdriver try_fmt */ | ||
1138 | fmt->fmt.pix.width = w; | ||
1139 | fmt->fmt.pix.height = h; | ||
1140 | gspca_dev->sd_desc->try_fmt(gspca_dev, fmt); | ||
1141 | } | ||
1136 | /* some drivers use priv internally, zero it before giving it to | 1142 | /* some drivers use priv internally, zero it before giving it to |
1137 | userspace */ | 1143 | userspace */ |
1138 | fmt->fmt.pix.priv = 0; | 1144 | fmt->fmt.pix.priv = 0; |
@@ -1171,17 +1177,16 @@ static int vidioc_s_fmt_vid_cap(struct file *file, void *priv, | |||
1171 | goto out; | 1177 | goto out; |
1172 | } | 1178 | } |
1173 | 1179 | ||
1174 | if (ret == gspca_dev->curr_mode) { | ||
1175 | ret = 0; | ||
1176 | goto out; /* same mode */ | ||
1177 | } | ||
1178 | |||
1179 | if (gspca_dev->streaming) { | 1180 | if (gspca_dev->streaming) { |
1180 | ret = -EBUSY; | 1181 | ret = -EBUSY; |
1181 | goto out; | 1182 | goto out; |
1182 | } | 1183 | } |
1183 | gspca_dev->curr_mode = ret; | 1184 | gspca_dev->curr_mode = ret; |
1184 | gspca_dev->pixfmt = gspca_dev->cam.cam_mode[ret]; | 1185 | if (gspca_dev->sd_desc->try_fmt) |
1186 | /* subdriver try_fmt can modify format parameters */ | ||
1187 | gspca_dev->pixfmt = fmt->fmt.pix; | ||
1188 | else | ||
1189 | gspca_dev->pixfmt = gspca_dev->cam.cam_mode[ret]; | ||
1185 | 1190 | ||
1186 | ret = 0; | 1191 | ret = 0; |
1187 | out: | 1192 | out: |
@@ -1196,6 +1201,9 @@ static int vidioc_enum_framesizes(struct file *file, void *priv, | |||
1196 | int i; | 1201 | int i; |
1197 | __u32 index = 0; | 1202 | __u32 index = 0; |
1198 | 1203 | ||
1204 | if (gspca_dev->sd_desc->enum_framesizes) | ||
1205 | return gspca_dev->sd_desc->enum_framesizes(gspca_dev, fsize); | ||
1206 | |||
1199 | for (i = 0; i < gspca_dev->cam.nmodes; i++) { | 1207 | for (i = 0; i < gspca_dev->cam.nmodes; i++) { |
1200 | if (fsize->pixel_format != | 1208 | if (fsize->pixel_format != |
1201 | gspca_dev->cam.cam_mode[i].pixelformat) | 1209 | gspca_dev->cam.cam_mode[i].pixelformat) |
diff --git a/drivers/media/usb/gspca/gspca.h b/drivers/media/usb/gspca/gspca.h index 0f3d15002555..300642dc1a17 100644 --- a/drivers/media/usb/gspca/gspca.h +++ b/drivers/media/usb/gspca/gspca.h | |||
@@ -88,6 +88,10 @@ typedef void (*cam_pkt_op) (struct gspca_dev *gspca_dev, | |||
88 | typedef int (*cam_int_pkt_op) (struct gspca_dev *gspca_dev, | 88 | typedef int (*cam_int_pkt_op) (struct gspca_dev *gspca_dev, |
89 | u8 *data, | 89 | u8 *data, |
90 | int len); | 90 | int len); |
91 | typedef void (*cam_format_op) (struct gspca_dev *gspca_dev, | ||
92 | struct v4l2_format *fmt); | ||
93 | typedef int (*cam_frmsize_op) (struct gspca_dev *gspca_dev, | ||
94 | struct v4l2_frmsizeenum *fsize); | ||
91 | 95 | ||
92 | /* subdriver description */ | 96 | /* subdriver description */ |
93 | struct sd_desc { | 97 | struct sd_desc { |
@@ -109,6 +113,8 @@ struct sd_desc { | |||
109 | cam_set_jpg_op set_jcomp; | 113 | cam_set_jpg_op set_jcomp; |
110 | cam_streamparm_op get_streamparm; | 114 | cam_streamparm_op get_streamparm; |
111 | cam_streamparm_op set_streamparm; | 115 | cam_streamparm_op set_streamparm; |
116 | cam_format_op try_fmt; | ||
117 | cam_frmsize_op enum_framesizes; | ||
112 | #ifdef CONFIG_VIDEO_ADV_DEBUG | 118 | #ifdef CONFIG_VIDEO_ADV_DEBUG |
113 | cam_set_reg_op set_register; | 119 | cam_set_reg_op set_register; |
114 | cam_get_reg_op get_register; | 120 | cam_get_reg_op get_register; |