All of lore.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.