From: Michael Trimarchi <michael@panicking.kicks-ass.org>
To: Antonio Ospite <ospite@studenti.unina.it>
Cc: linux-media@vger.kernel.org, Jean-Francois Moine <moinejf@free.fr>
Subject: Re: [RFC, PATCH] gspca: implement vidioc_enum_frameintervals
Date: Tue, 17 Nov 2009 11:57:09 +0100 [thread overview]
Message-ID: <4B028185.8030809@panicking.kicks-ass.org> (raw)
In-Reply-To: <20091117114147.09889427.ospite@studenti.unina.it>
Hi,
Antonio Ospite wrote:
> Hi,
>
> gspca does not implement vidioc_enum_frameintervals yet, so even if a
> camera can support multiple frame rates (or frame intervals) there is
> still no way to enumerate them from userspace.
>
> The following is just a quick and dirty implementation to show the
> problem and to have something to base the discussion on. In the patch
> there is also a working example of use with the ov534 subdriver.
>
> Someone with a better knowledge of gspca and v4l internals can suggest
> better solutions.
>
> The tests has been done using 'luvcview -L', the output before the
> patch:
> $ luvcview -d /dev/video1 -L
> luvcview 0.2.6
>
> SDL information:
> Video driver: x11
> A window manager is available
> Device information:
> Device path: /dev/video1
> { pixelformat = 'YUYV', description = 'YUYV' }
> { discrete: width = 320, height = 240 }
> Time interval between frame:
> 1/40, 1/30, { discrete: width = 640, height = 480 }
> Time interval between frame:
>
>
> And the output after it:
> $ luvcview -d /dev/video1 -L
> luvcview 0.2.6
>
> SDL information:
> Video driver: x11
> A window manager is available
> Device information:
> Device path: /dev/video1
> { pixelformat = 'YUYV', description = 'YUYV' }
> { discrete: width = 320, height = 240 }
> Time interval between frame: 1/125, 1/100, 1/75, 1/60, 1/50, 1/40, 1/30,
> { discrete: width = 640, height = 480 }
> Time interval between frame: 1/60, 1/50, 1/40, 1/30, 1/15,
>
> Thanks,
> Antonio
>
> diff -r 182b5f8fa160 linux/drivers/media/video/gspca/gspca.c
> --- a/linux/drivers/media/video/gspca/gspca.c Sun Nov 15 10:05:30 2009 +0100
> +++ b/linux/drivers/media/video/gspca/gspca.c Tue Nov 17 11:39:21 2009 +0100
> @@ -995,6 +995,37 @@
> return -EINVAL;
> }
>
> +static int vidioc_enum_frameintervals(struct file *filp, void *priv,
> + struct v4l2_frmivalenum *fival)
> +{
> + struct gspca_dev *gspca_dev = priv;
> + int mode = wxh_to_mode(gspca_dev, fival->width, fival->height);
> + int i;
> + __u32 index = 0;
> +
> + if (gspca_dev->cam.mode_framerates == NULL ||
> + gspca_dev->cam.mode_framerates[mode].nrates == 0)
> + return -EINVAL;
> +
> + /* FIXME: Needed? */
> + if (fival->pixel_format !=
> + gspca_dev->cam.cam_mode[mode].pixelformat)
> + return -EINVAL;
> +
> + for (i = 0; i < gspca_dev->cam.mode_framerates[mode].nrates; i++) {
> + if (fival->index == index) {
> + fival->type = V4L2_FRMSIZE_TYPE_DISCRETE;
> + fival->discrete.numerator = 1;
> + fival->discrete.denominator =
> + gspca_dev->cam.mode_framerates[mode].rates[i];
> + return 0;
> + }
> + index++;
> + }
> +
> + return -EINVAL;
> +}
> +
> static void gspca_release(struct video_device *vfd)
> {
> struct gspca_dev *gspca_dev = container_of(vfd, struct gspca_dev, vdev);
> @@ -1987,6 +2018,7 @@
> .vidioc_g_parm = vidioc_g_parm,
> .vidioc_s_parm = vidioc_s_parm,
> .vidioc_enum_framesizes = vidioc_enum_framesizes,
> + .vidioc_enum_frameintervals = vidioc_enum_frameintervals,
> #ifdef CONFIG_VIDEO_ADV_DEBUG
> .vidioc_g_register = vidioc_g_register,
> .vidioc_s_register = vidioc_s_register,
> diff -r 182b5f8fa160 linux/drivers/media/video/gspca/gspca.h
> --- a/linux/drivers/media/video/gspca/gspca.h Sun Nov 15 10:05:30 2009 +0100
> +++ b/linux/drivers/media/video/gspca/gspca.h Tue Nov 17 11:39:21 2009 +0100
> @@ -45,11 +45,17 @@
> /* image transfers */
> #define MAX_NURBS 4 /* max number of URBs */
>
> +struct framerates {
> + int *rates;
> + int nrates;
> +};
> +
> /* device information - set at probe time */
> struct cam {
> int bulk_size; /* buffer size when image transfer by bulk */
> const struct v4l2_pix_format *cam_mode; /* size nmodes */
> char nmodes;
> + const struct framerates *mode_framerates; /* size nmode, like cam_mode */
> __u8 bulk_nurbs; /* number of URBs in bulk mode
> * - cannot be > MAX_NURBS
> * - when 0 and bulk_size != 0 means
I think that the best thing is to slip in two patches. One is related to the gspa main
and the other is a change on a driver.
> diff -r 182b5f8fa160 linux/drivers/media/video/gspca/ov534.c
> --- a/linux/drivers/media/video/gspca/ov534.c Sun Nov 15 10:05:30 2009 +0100
> +++ b/linux/drivers/media/video/gspca/ov534.c Tue Nov 17 11:39:21 2009 +0100
> @@ -287,6 +287,20 @@
> .priv = 0},
> };
>
> +static int qvga_rates[] = {125, 100, 75, 60, 50, 40, 30};
> +static int vga_rates[] = {60, 50, 40, 30, 15};
> +
> +static const struct framerates ov772x_framerates[] = {
> + { /* 320x240 */
> + .rates = qvga_rates,
> + .nrates = ARRAY_SIZE(qvga_rates),
> + },
> + { /* 640x480 */
> + .rates = vga_rates,
> + .nrates = ARRAY_SIZE(vga_rates),
> + },
> +};
> +
> static const struct v4l2_pix_format ov965x_mode[] = {
> {320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
> .bytesperline = 320,
> @@ -1411,6 +1425,7 @@
> if (sd->sensor == SENSOR_OV772X) {
> cam->cam_mode = ov772x_mode;
> cam->nmodes = ARRAY_SIZE(ov772x_mode);
> + cam->mode_framerates = ov772x_framerates;
>
> cam->bulk = 1;
> cam->bulk_size = 16384;
>
>
Michael
next prev parent reply other threads:[~2009-11-17 10:57 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-11-17 10:41 [RFC, PATCH] gspca: implement vidioc_enum_frameintervals Antonio Ospite
2009-11-17 10:57 ` Michael Trimarchi [this message]
2009-11-19 8:08 ` Hans de Goede
2009-11-19 9:00 ` Michael Trimarchi
2009-11-19 9:27 ` Hans de Goede
2009-11-19 10:37 ` Antonio Ospite
2009-11-19 11:11 ` Hans de Goede
2009-11-19 11:48 ` Jean-Francois Moine
2009-12-01 15:39 ` [PATCH] " Antonio Ospite
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4B028185.8030809@panicking.kicks-ass.org \
--to=michael@panicking.kicks-ass.org \
--cc=linux-media@vger.kernel.org \
--cc=moinejf@free.fr \
--cc=ospite@studenti.unina.it \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.