gspca, ov534 framerate support
PATCH 1/1 gspca, ov534 framerate support
Hi,
These two patches add frame rate support to ov534, as expected by programs like luvcview. The first adds a gspca passthrough for VIDIOC_G_PARM and VIDIOC_S_PARM to subdrivers, and the second adds their implementation to ov534.
Mplayer still doesn't get the FPS (it must do something different), but luvcview works correctly:
$ luvcview -i 50 luvcview 0.2.4
SDL information:
Video driver: x11
A window manager is available
Device information:
Device path: /dev/video0
Stream settings:
Frame format: YUYV (MJPG is not supported by device)
Frame size: 640x480
Frame rate: 50 fps
Comments?
-jim
--
video4linux-list mailing list
Unsubscribe mailto:[email protected]?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list
PATCH 1/1 gspca: allow subdrivers to handle v4l2_streamparm requests
# HG changeset patch
# User [email protected]
# Date 1228860341 18000
# Node ID c3eafdd5ba7cb667ed301e7feed6b02b57f1aa7a # Parent 51458dbe1fdab9f2463a49772fb8be39eabe520c
gspca: allow subdrivers to handle v4l2_streamparm requests
Add get_streamparm and set_streamparm operations so subdrivers can get/set stream parameters such as framerate.
linux/drivers/media/video/gspca/gspca.c +20 -0
@@ -1337,6 +1337,16 @@memset (parm,0 ,sizeof *parm); parm->type =V4L2_BUF_TYPE_VIDEO_CAPTURE ; parm->parm.capture.readbuffers = gspca_dev->nbufread; + +if (gspca_dev->sd_desc->get_streamparm) { +int ret; +if (mutex_lock_interruptible (&gspca_dev->usb_lock)) +return -ERESTARTSYS ; + ret = gspca_dev->sd_desc->get_streamparm (gspca_dev, parm); +mutex_unlock (&gspca_dev->usb_lock); +return ret; + } +return 0 ; }
@@ -1351,6 +1361,16 @@ parm->parm.capture.readbuffers = gspca_dev->nbufread; else gspca_dev->nbufread = n; + +if (gspca_dev->sd_desc->set_streamparm) { +int ret; +if (mutex_lock_interruptible (&gspca_dev->usb_lock)) +return -ERESTARTSYS ; + ret = gspca_dev->sd_desc->set_streamparm (gspca_dev, parm); +mutex_unlock (&gspca_dev->usb_lock); +return ret; + } +return 0 ; }
linux/drivers/media/video/gspca/gspca.h +4 -0
@@ -74,6 +74,8 @@typedef int (*cam_cf_op ) (struct gspca_dev *,const struct usb_device_id *);typedef int (*cam_jpg_op ) (struct gspca_dev *,struct v4l2_jpegcompression *); +typedef int (*cam_streamparm_op ) (struct gspca_dev *, +struct v4l2_streamparm *);typedef int (*cam_qmnu_op ) (struct gspca_dev *,struct v4l2_querymenu *); typedef void (*cam_pkt_op) (struct gspca_dev *gspca_dev,
@@ -106,6 +108,8 @@cam_jpg_op get_jcomp;cam_jpg_op set_jcomp;cam_qmnu_op querymenu; +cam_streamparm_op get_streamparm; +cam_streamparm_op set_streamparm; };/* packet types when moving from iso buf to frame buf */
--
video4linux-list mailing list
Unsubscribe mailto:[email protected]?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list
PATCH 1/1 gspca: ov534: add framerate support
In reply to Jim Paris# HG changeset patch
# User [email protected]
# Date 1228864404 18000
# Node ID 95986d276e158e35aae7b8640d9a411f781ca108 # Parent c3eafdd5ba7cb667ed301e7feed6b02b57f1aa7a
gspca: ov534: add framerate support
Add support for getting and setting framerate via v4l2 controls, rather than setting a fixed value at module insertion.
This allows, for example, luvcview to change the framerate:
luvcview -i 30
luvcview -i 50
linux/drivers/media/video/gspca/ov534.c +78 -37
@@ -43,14 +43,12 @@MODULE_DESCRIPTION ("GSPCA/OV534 USB Camera Driver" );MODULE_LICENSE ("GPL" ); -/* global parameters */ -static int frame_rate; -/* specific webcam descriptor */ struct sd {struct gspca_dev gspca_dev;/* !! must be the first item */ __u32 last_fid;__u32 last_pts; +int frame_rate; };/* V4L2 controls supported by the driver */
@@ -296,6 +294,40 @@ { 0x0c, 0xd0 } }; +/* set framerate */ +static void ov534_set_frame_rate (struct gspca_dev *gspca_dev) +{ +struct sd *sd = (struct sd *) gspca_dev; +int fr = sd->frame_rate; + +switch (fr) { +case 50 : +sccb_reg_write (gspca_dev->dev,0x11 ,0x01 ); +sccb_reg_write (gspca_dev->dev,0x0d ,0x41 ); +ov534_reg_write (gspca_dev->dev,0xe5 ,0x02 ); +break ; +case 40 : +sccb_reg_write (gspca_dev->dev,0x11 ,0x02 ); +sccb_reg_write (gspca_dev->dev,0x0d ,0xc1 ); +ov534_reg_write (gspca_dev->dev,0xe5 ,0x04 ); +break ; +/* case 30: */ +default : + fr =30 ; +sccb_reg_write (gspca_dev->dev,0x11 ,0x04 ); +sccb_reg_write (gspca_dev->dev,0x0d ,0x81 ); +ov534_reg_write (gspca_dev->dev,0xe5 ,0x02 ); +break ; +case 15 : +sccb_reg_write (gspca_dev->dev,0x11 ,0x03 ); +sccb_reg_write (gspca_dev->dev,0x0d ,0x41 ); +ov534_reg_write (gspca_dev->dev,0xe5 ,0x04 ); +break ; + } + + sd->frame_rate = fr; +PDEBUG (D_PROBE ,"frame_rate: %d" , fr); +}/* setup method */ static void ov534_setup (struct usb_device *udev)
@@ -339,38 +371,8 @@/* this function is called at probe and resume time */ static int sd_init (struct gspca_dev *gspca_dev) { -int fr; -ov534_setup (gspca_dev->dev); - - fr = frame_rate; - -switch (fr) { -case 50 : -sccb_reg_write (gspca_dev->dev,0x11 ,0x01 ); -sccb_reg_write (gspca_dev->dev,0x0d ,0x41 ); -ov534_reg_write (gspca_dev->dev,0xe5 ,0x02 ); -break ; -case 40 : -sccb_reg_write (gspca_dev->dev,0x11 ,0x02 ); -sccb_reg_write (gspca_dev->dev,0x0d ,0xc1 ); -ov534_reg_write (gspca_dev->dev,0xe5 ,0x04 ); -break ; -/* case 30: */ -default : - fr =30 ; -sccb_reg_write (gspca_dev->dev,0x11 ,0x04 ); -sccb_reg_write (gspca_dev->dev,0x0d ,0x81 ); -ov534_reg_write (gspca_dev->dev,0xe5 ,0x02 ); -break ; -case 15 : -sccb_reg_write (gspca_dev->dev,0x11 ,0x03 ); -sccb_reg_write (gspca_dev->dev,0x0d ,0x41 ); -ov534_reg_write (gspca_dev->dev,0xe5 ,0x04 ); -break ; - } - -PDEBUG (D_PROBE ,"frame_rate: %d" , fr); +ov534_set_frame_rate (gspca_dev);return 0 ; }
@@ -477,6 +479,46 @@ goto scan_next; } +/* get stream parameters (framerate) */ +int sd_get_streamparm (struct gspca_dev *gspca_dev, +struct v4l2_streamparm *parm) +{ +struct v4l2_captureparm *cp = &parm->parm.capture; +struct v4l2_fract *tpf = &cp->timeperframe; +struct sd *sd = (struct sd *) gspca_dev; + +if (parm->type !=V4L2_BUF_TYPE_VIDEO_CAPTURE ) +return -EINVAL ; + + cp->capability |=V4L2_CAP_TIMEPERFRAME ; + tpf->numerator =1 ; + tpf->denominator = sd->frame_rate; + +return 0 ; +} + +/* set stream parameters (framerate) */ +int sd_set_streamparm (struct gspca_dev *gspca_dev, +struct v4l2_streamparm *parm) +{ +struct v4l2_captureparm *cp = &parm->parm.capture; +struct v4l2_fract *tpf = &cp->timeperframe; +struct sd *sd = (struct sd *) gspca_dev; + +if (parm->type !=V4L2_BUF_TYPE_VIDEO_CAPTURE ) +return -EINVAL ; + +/* Set requested framerate */ + sd->frame_rate = tpf->denominator / tpf->numerator; +ov534_set_frame_rate (gspca_dev); + +/* Return the actual framerate */ + tpf->numerator =1 ; + tpf->denominator = sd->frame_rate; + +return 0 ; +} +/* sub-driver description */ static const struct sd_desc sd_desc = { .name =MODULE_NAME ,
@@ -487,6 +529,8 @@ .start = sd_start, .stopN = sd_stopN, .pkt_scan = sd_pkt_scan, + .get_streamparm = sd_get_streamparm, + .set_streamparm = sd_set_streamparm, };/* -- module initialisation -- */
@@ -534,6 +578,3 @@module_init (sd_mod_init);module_exit (sd_mod_exit); - -module_param (frame_rate, int,0644 ); -MODULE_PARM_DESC (frame_rate,"Frame rate (15, 30, 40, 50)" );
--
video4linux-list mailing list
Unsubscribe mailto:[email protected]?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list
Re:[PATCH 1 of 2] gspca: allow subdrivers to handle v4l2_streamparm requests
In reply to Jim ParisQuoted 72 lines · 在2008-12-10,"Jim Paris" <[email protected]> 写道:
# HG changeset patch
# User [email protected]
# Date 1228860341 18000
# Node IDc3eafdd5ba7cb667ed301e7feed6b02b57f1aa7a# Parent51458dbe1fdab9f2463a49772fb8be39eabe520c
gspca: allow subdrivers to handlev4l2_streamparmrequestsAdd
get_streamparmandset_streamparmoperations so subdrivers can get/set stream parameters such as framerate.Signed-off-by Jim Paris <[email protected]>diff -r
51458dbe1fda-rc3eafdd5ba7clinux/drivers/media/video/gspca/gspca.clinux/drivers/media/video/gspca/gspca.c +20
-0@@ -1337,6 +1337,16 @@memset (parm,0 ,sizeof *parm); parm->type =V4L2_BUF_TYPE_VIDEO_CAPTURE ; parm->parm.capture.readbuffers = gspca_dev->nbufread; + +if (gspca_dev->sd_desc->get_streamparm) { +int ret; +if (mutex_lock_interruptible (&gspca_dev->usb_lock)) +return -ERESTARTSYS ; + ret = gspca_dev->sd_desc->get_streamparm (gspca_dev, parm); +mutex_unlock (&gspca_dev->usb_lock); +return ret; + } +return 0 ; }@@ -1351,6 +1361,16 @@ parm->parm.capture.readbuffers = gspca_dev->nbufread; else gspca_dev->nbufread = n; + +if (gspca_dev->sd_desc->set_streamparm) { +int ret; +if (mutex_lock_interruptible (&gspca_dev->usb_lock)) +return -ERESTARTSYS ; + ret = gspca_dev->sd_desc->set_streamparm (gspca_dev, parm); +mutex_unlock (&gspca_dev->usb_lock); +return ret; + } +return 0 ; }diff -r
51458dbe1fda-rc3eafdd5ba7clinux/drivers/media/video/gspca/gspca.hlinux/drivers/media/video/gspca/gspca.h +4
-1@@ -74,6 +74,8 @@typedef int (*cam_cf_op ) (struct gspca_dev *,const struct usb_device_id *);typedef int (*cam_jpg_op ) (struct gspca_dev *,struct v4l2_jpegcompression *); +typedef int (*cam_streamparm_op ) (struct gspca_dev *, +struct v4l2_streamparm *);typedef int (*cam_qmnu_op ) (struct gspca_dev *,struct v4l2_querymenu *); typedef void (*cam_pkt_op) (struct gspca_dev *gspca_dev,@@ -106,6 +108,8 @@cam_jpg_op get_jcomp;cam_jpg_op set_jcomp;cam_qmnu_op querymenu; +cam_streamparm_op get_streamparm; +cam_streamparm_op set_streamparm; };/* packet types when moving from iso buf to frame buf */ --
Quoted 3 lines
video4linux-list mailing list
Unsubscribe mailto:[email protected]?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list
--
video4linux-list mailing list
Unsubscribe mailto:[email protected]?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list