public inbox for linux-media@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0 of 2] gspca, ov534 framerate support
@ 2008-12-09 23:15 Jim Paris
  2008-12-09 23:15 ` [PATCH 1 of 2] gspca: allow subdrivers to handle v4l2_streamparm requests Jim Paris
  2008-12-09 23:15 ` [PATCH 2 of 2] gspca: ov534: add framerate support Jim Paris
  0 siblings, 2 replies; 4+ messages in thread
From: Jim Paris @ 2008-12-09 23:15 UTC (permalink / raw)
  To: video4linux-list

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:video4linux-list-request@redhat.com?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1 of 2] gspca: allow subdrivers to handle v4l2_streamparm requests
  2008-12-09 23:15 [PATCH 0 of 2] gspca, ov534 framerate support Jim Paris
@ 2008-12-09 23:15 ` Jim Paris
  2008-12-10  9:05   ` niuxinlong_1984
  2008-12-09 23:15 ` [PATCH 2 of 2] gspca: ov534: add framerate support Jim Paris
  1 sibling, 1 reply; 4+ messages in thread
From: Jim Paris @ 2008-12-09 23:15 UTC (permalink / raw)
  To: video4linux-list

# HG changeset patch
# User jim@jtan.com
# 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.

Signed-off-by: Jim Paris <jim@jtan.com>

diff -r 51458dbe1fda -r c3eafdd5ba7c linux/drivers/media/video/gspca/gspca.c
--- a/linux/drivers/media/video/gspca/gspca.c	Tue Dec 09 16:55:39 2008 -0500
+++ b/linux/drivers/media/video/gspca/gspca.c	Tue Dec 09 17:05:41 2008 -0500
@@ -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 -r c3eafdd5ba7c linux/drivers/media/video/gspca/gspca.h
--- a/linux/drivers/media/video/gspca/gspca.h	Tue Dec 09 16:55:39 2008 -0500
+++ b/linux/drivers/media/video/gspca/gspca.h	Tue Dec 09 17:05:41 2008 -0500
@@ -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:video4linux-list-request@redhat.com?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 2 of 2] gspca: ov534: add framerate support
  2008-12-09 23:15 [PATCH 0 of 2] gspca, ov534 framerate support Jim Paris
  2008-12-09 23:15 ` [PATCH 1 of 2] gspca: allow subdrivers to handle v4l2_streamparm requests Jim Paris
@ 2008-12-09 23:15 ` Jim Paris
  1 sibling, 0 replies; 4+ messages in thread
From: Jim Paris @ 2008-12-09 23:15 UTC (permalink / raw)
  To: video4linux-list

# HG changeset patch
# User jim@jtan.com
# 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

Signed-off-by: Jim Paris <jim@jtan.com>

diff -r c3eafdd5ba7c -r 95986d276e15 linux/drivers/media/video/gspca/ov534.c
--- a/linux/drivers/media/video/gspca/ov534.c	Tue Dec 09 17:05:41 2008 -0500
+++ b/linux/drivers/media/video/gspca/ov534.c	Tue Dec 09 18:13:24 2008 -0500
@@ -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:video4linux-list-request@redhat.com?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re:[PATCH 1 of 2] gspca: allow subdrivers to handle v4l2_streamparm requests
  2008-12-09 23:15 ` [PATCH 1 of 2] gspca: allow subdrivers to handle v4l2_streamparm requests Jim Paris
@ 2008-12-10  9:05   ` niuxinlong_1984
  0 siblings, 0 replies; 4+ messages in thread
From: niuxinlong_1984 @ 2008-12-10  9:05 UTC (permalink / raw)
  To: Jim Paris; +Cc: video4linux-list

 
 


在2008-12-10,"Jim Paris" <jim@jtan.com> 写道:
># HG changeset patch
># User jim@jtan.com
># 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.
>
>Signed-off-by: Jim Paris <jim@jtan.com>
>
>diff -r 51458dbe1fda -r c3eafdd5ba7c linux/drivers/media/video/gspca/gspca.c
>--- a/linux/drivers/media/video/gspca/gspca.c	Tue Dec 09 16:55:39 2008 -0500
>+++ b/linux/drivers/media/video/gspca/gspca.c	Tue Dec 09 17:05:41 2008 -0500
>@@ -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 -r c3eafdd5ba7c linux/drivers/media/video/gspca/gspca.h
>--- a/linux/drivers/media/video/gspca/gspca.h	Tue Dec 09 16:55:39 2008 -0500
>+++ b/linux/drivers/media/video/gspca/gspca.h	Tue Dec 09 17:05:41 2008 -0500
>@@ -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:video4linux-list-request@redhat.com?subject=unsubscribe
>https://www.redhat.com/mailman/listinfo/video4linux-list
--
video4linux-list mailing list
Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2008-12-10  9:05 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-12-09 23:15 [PATCH 0 of 2] gspca, ov534 framerate support Jim Paris
2008-12-09 23:15 ` [PATCH 1 of 2] gspca: allow subdrivers to handle v4l2_streamparm requests Jim Paris
2008-12-10  9:05   ` niuxinlong_1984
2008-12-09 23:15 ` [PATCH 2 of 2] gspca: ov534: add framerate support Jim Paris

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox