Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=9ee6d78cd4112c0f5a257a01383c64dadbf66da9
Commit:     9ee6d78cd4112c0f5a257a01383c64dadbf66da9
Parent:     1de69238111a65283a4548d8fd4727397873a02f
Author:     Luc Saillard <[EMAIL PROTECTED]>
AuthorDate: Sun Apr 22 23:54:36 2007 -0300
Committer:  Mauro Carvalho Chehab <[EMAIL PROTECTED]>
CommitDate: Fri Apr 27 15:45:50 2007 -0300

    V4L/DVB (5547): Add ENUM_FRAMESIZES and ENUM_FRAMEINTERVALS ioctls
    
    This patch add support for the VIDIOC_ENUM_FRAMESIZES and
    VIDIOC_ENUM_FRAMEINTERVALS ioctl.
    * check if the maximum native framesize for raw mode is correct
    * raw mode framerates for all three chipset types
    
    Signed-off-by: Gregor Jasny <[EMAIL PROTECTED]>
    Signed-off-by: Luc Saillard <[EMAIL PROTECTED]>
    Signed-off-by: Mauro Carvalho Chehab <[EMAIL PROTECTED]>
---
 drivers/media/video/pwc/pwc-ctrl.c  |   61 +++++++++++++++++++++++++++++++++-
 drivers/media/video/pwc/pwc-if.c    |    2 +-
 drivers/media/video/pwc/pwc-ioctl.h |   36 +++++++++++++++++++-
 drivers/media/video/pwc/pwc-kiara.c |    2 +
 drivers/media/video/pwc/pwc-kiara.h |    5 ++-
 drivers/media/video/pwc/pwc-timon.c |    4 ++-
 drivers/media/video/pwc/pwc-timon.h |    6 ++-
 drivers/media/video/pwc/pwc-v4l.c   |   58 +++++++++++++++++++++++++++++++++
 drivers/media/video/pwc/pwc.h       |    5 ++-
 9 files changed, 168 insertions(+), 11 deletions(-)

diff --git a/drivers/media/video/pwc/pwc-ctrl.c 
b/drivers/media/video/pwc/pwc-ctrl.c
index 0bd1155..338ced7 100644
--- a/drivers/media/video/pwc/pwc-ctrl.c
+++ b/drivers/media/video/pwc/pwc-ctrl.c
@@ -140,6 +140,8 @@ static const char *size2name[PSZ_MAX] =
    An alternate value of 0 means this mode is not available at all.
  */
 
+#define PWC_FPS_MAX_NALA 8
+
 struct Nala_table_entry {
        char alternate;                 /* USB alternate setting */
        int compressed;                 /* Compressed yes/no */
@@ -147,7 +149,9 @@ struct Nala_table_entry {
        unsigned char mode[3];          /* precomputed mode table */
 };
 
-static struct Nala_table_entry Nala_table[PSZ_MAX][8] =
+static unsigned int Nala_fps_vector[PWC_FPS_MAX_NALA] = { 4, 5, 7, 10, 12, 15, 
20, 24 };
+
+static struct Nala_table_entry Nala_table[PSZ_MAX][PWC_FPS_MAX_NALA] =
 {
 #include "pwc-nala.h"
 };
@@ -423,6 +427,59 @@ int pwc_set_video_mode(struct pwc_device *pdev, int width, 
int height, int frame
        return 0;
 }
 
+static unsigned int pwc_get_fps_Nala(struct pwc_device *pdev, unsigned int 
index, unsigned int size)
+{
+       unsigned int i;
+
+       for (i = 0; i < PWC_FPS_MAX_NALA; i++) {
+               if (Nala_table[size][i].alternate) {
+                       if (index--==0) return Nala_fps_vector[i];
+               }
+       }
+       return 0;
+}
+
+static unsigned int pwc_get_fps_Kiara(struct pwc_device *pdev, unsigned int 
index, unsigned int size)
+{
+       unsigned int i;
+
+       for (i = 0; i < PWC_FPS_MAX_KIARA; i++) {
+               if (Kiara_table[size][i][3].alternate) {
+                       if (index--==0) return Kiara_fps_vector[i];
+               }
+       }
+       return 0;
+}
+
+static unsigned int pwc_get_fps_Timon(struct pwc_device *pdev, unsigned int 
index, unsigned int size)
+{
+       unsigned int i;
+
+       for (i=0; i < PWC_FPS_MAX_TIMON; i++) {
+               if (Timon_table[size][i][3].alternate) {
+                       if (index--==0) return Timon_fps_vector[i];
+               }
+       }
+       return 0;
+}
+
+unsigned int pwc_get_fps(struct pwc_device *pdev, unsigned int index, unsigned 
int size)
+{
+       unsigned int ret;
+
+       if (DEVICE_USE_CODEC1(pdev->type)) {
+               ret = pwc_get_fps_Nala(pdev, index, size);
+
+       } else if (DEVICE_USE_CODEC3(pdev->type)) {
+               ret = pwc_get_fps_Kiara(pdev, index, size);
+
+       } else {
+               ret = pwc_get_fps_Timon(pdev, index, size);
+       }
+
+       return ret;
+}
+
 #define BLACK_Y 0
 #define BLACK_U 128
 #define BLACK_V 128
@@ -1343,7 +1400,7 @@ int pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, 
void *arg)
                                ret = pwc_read_red_gain(pdev, 
&ARGR(wb).read_red);
                                if (ret < 0)
                                        break;
-                               ret =pwc_read_blue_gain(pdev, 
&ARGR(wb).read_blue);
+                               ret = pwc_read_blue_gain(pdev, 
&ARGR(wb).read_blue);
                                if (ret < 0)
                                        break;
                        }
diff --git a/drivers/media/video/pwc/pwc-if.c b/drivers/media/video/pwc/pwc-if.c
index 6f09108..085332a 100644
--- a/drivers/media/video/pwc/pwc-if.c
+++ b/drivers/media/video/pwc/pwc-if.c
@@ -1493,7 +1493,7 @@ static int usb_pwc_probe(struct usb_interface *intf, 
const struct usb_device_id
                case 0x0329:
                        PWC_INFO("Philips SPC 900NC USB webcam detected.\n");
                        name = "Philips SPC 900NC webcam";
-                       type_id = 720;
+                       type_id = 740;
                        break;
                default:
                        return -ENODEV;
diff --git a/drivers/media/video/pwc/pwc-ioctl.h 
b/drivers/media/video/pwc/pwc-ioctl.h
index 784bc72..cec6602 100644
--- a/drivers/media/video/pwc/pwc-ioctl.h
+++ b/drivers/media/video/pwc/pwc-ioctl.h
@@ -2,7 +2,7 @@
 #define PWC_IOCTL_H
 
 /* (C) 2001-2004 Nemosoft Unv.
-   (C) 2004      Luc Saillard ([EMAIL PROTECTED])
+   (C) 2004-2006 Luc Saillard ([EMAIL PROTECTED])
 
    NOTE: this version of pwc is an unofficial (modified) release of pwc & pcwx
    driver and thus may have bugs that are not present in the original version.
@@ -25,7 +25,7 @@
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
 
-/* This is pwc-ioctl.h belonging to PWC 8.12.1
+/* This is pwc-ioctl.h belonging to PWC 10.0.10
    It contains structures and defines to communicate from user space
    directly to the driver.
  */
@@ -51,6 +51,9 @@
             ...        the function
  */
 
+#include <linux/types.h>
+#include <linux/version.h>
+
 
  /* Enumeration of image sizes */
 #define PSZ_SQCIF      0x00
@@ -65,6 +68,8 @@
 /* The frame rate is encoded in the video_window.flags parameter using
    the upper 16 bits, since some flags are defined nowadays. The following
    defines provide a mask and shift to filter out this value.
+   This value can also be passing using the private flag when using v4l2 and
+   VIDIOC_S_FMT ioctl.
 
    In 'Snapshot' mode the camera freezes its automatic exposure and colour
    balance controls.
@@ -73,6 +78,8 @@
 #define PWC_FPS_MASK           0x00FF0000
 #define PWC_FPS_FRMASK         0x003F0000
 #define PWC_FPS_SNAPSHOT       0x00400000
+#define PWC_QLT_MASK           0x03000000
+#define PWC_QLT_SHIFT          24
 
 
 /* structure for transferring x & y coordinates */
@@ -289,4 +296,29 @@ struct pwc_table_init_buffer {
 };
 #define VIDIOCPWCGVIDTABLE     _IOR('v', 216, struct pwc_table_init_buffer)
 
+/*
+ * This is private command used when communicating with v4l2.
+ * In the future all private ioctl will be remove/replace to
+ * use interface offer by v4l2.
+ */
+
+#define V4L2_CID_PRIVATE_SAVE_USER       (V4L2_CID_PRIVATE_BASE + 0)
+#define V4L2_CID_PRIVATE_RESTORE_USER    (V4L2_CID_PRIVATE_BASE + 1)
+#define V4L2_CID_PRIVATE_RESTORE_FACTORY (V4L2_CID_PRIVATE_BASE + 2)
+#define V4L2_CID_PRIVATE_COLOUR_MODE     (V4L2_CID_PRIVATE_BASE + 3)
+#define V4L2_CID_PRIVATE_AUTOCONTOUR     (V4L2_CID_PRIVATE_BASE + 4)
+#define V4L2_CID_PRIVATE_CONTOUR         (V4L2_CID_PRIVATE_BASE + 5)
+#define V4L2_CID_PRIVATE_BACKLIGHT       (V4L2_CID_PRIVATE_BASE + 6)
+#define V4L2_CID_PRIVATE_FLICKERLESS     (V4L2_CID_PRIVATE_BASE + 7)
+#define V4L2_CID_PRIVATE_NOISE_REDUCTION (V4L2_CID_PRIVATE_BASE + 8)
+
+struct pwc_raw_frame {
+   __le16 type;                /* type of the webcam */
+   __le16 vbandlength; /* Size of 4lines compressed (used by the decompressor) 
*/
+   __u8   cmd[4];      /* the four byte of the command (in case of nala,
+                          only the first 3 bytes is filled) */
+   __u8   rawframe[0]; /* frame_size = H/4*vbandlength */
+} __attribute__ ((packed));
+
+
 #endif
diff --git a/drivers/media/video/pwc/pwc-kiara.c 
b/drivers/media/video/pwc/pwc-kiara.c
index fec39cc..f4ae83c 100644
--- a/drivers/media/video/pwc/pwc-kiara.c
+++ b/drivers/media/video/pwc/pwc-kiara.c
@@ -42,6 +42,8 @@
 #include "pwc-kiara.h"
 #include "pwc-uncompress.h"
 
+const unsigned int Kiara_fps_vector[PWC_FPS_MAX_KIARA] = { 5, 10, 15, 20, 25, 
30 };
+
 const struct Kiara_table_entry Kiara_table[PSZ_MAX][6][4] =
 {
    /* SQCIF */
diff --git a/drivers/media/video/pwc/pwc-kiara.h 
b/drivers/media/video/pwc/pwc-kiara.h
index 0bdb225..047dad8 100644
--- a/drivers/media/video/pwc/pwc-kiara.h
+++ b/drivers/media/video/pwc/pwc-kiara.h
@@ -29,6 +29,8 @@
 
 #include <media/pwc-ioctl.h>
 
+#define PWC_FPS_MAX_KIARA 6
+
 struct Kiara_table_entry
 {
        char alternate;                 /* USB alternate interface */
@@ -37,8 +39,9 @@ struct Kiara_table_entry
        unsigned char mode[12];         /* precomputed mode settings for cam */
 };
 
-extern const struct Kiara_table_entry Kiara_table[PSZ_MAX][6][4];
+extern const struct Kiara_table_entry 
Kiara_table[PSZ_MAX][PWC_FPS_MAX_KIARA][4];
 extern const unsigned int KiaraRomTable[8][2][16][8];
+extern const unsigned int Kiara_fps_vector[PWC_FPS_MAX_KIARA];
 
 #endif
 
diff --git a/drivers/media/video/pwc/pwc-timon.c 
b/drivers/media/video/pwc/pwc-timon.c
index be65bdc..c56c174 100644
--- a/drivers/media/video/pwc/pwc-timon.c
+++ b/drivers/media/video/pwc/pwc-timon.c
@@ -40,7 +40,9 @@
 
 #include "pwc-timon.h"
 
-const struct Timon_table_entry Timon_table[PSZ_MAX][6][4] =
+const unsigned int Timon_fps_vector[PWC_FPS_MAX_TIMON] = { 5, 10, 15, 20, 25, 
30 };
+
+const struct Timon_table_entry Timon_table[PSZ_MAX][PWC_FPS_MAX_TIMON][4] =
 {
    /* SQCIF */
    {
diff --git a/drivers/media/video/pwc/pwc-timon.h 
b/drivers/media/video/pwc/pwc-timon.h
index eef9e2c..a6e2222 100644
--- a/drivers/media/video/pwc/pwc-timon.h
+++ b/drivers/media/video/pwc/pwc-timon.h
@@ -44,6 +44,8 @@
 
 #include <media/pwc-ioctl.h>
 
+#define PWC_FPS_MAX_TIMON 6
+
 struct Timon_table_entry
 {
        char alternate;                 /* USB alternate interface */
@@ -52,9 +54,9 @@ struct Timon_table_entry
        unsigned char mode[13];         /* precomputed mode settings for cam */
 };
 
-extern const struct Timon_table_entry Timon_table[PSZ_MAX][6][4];
+extern const struct Timon_table_entry 
Timon_table[PSZ_MAX][PWC_FPS_MAX_TIMON][4];
 extern const unsigned int TimonRomTable [16][2][16][8];
-
+extern const unsigned int Timon_fps_vector[PWC_FPS_MAX_TIMON];
 
 #endif
 
diff --git a/drivers/media/video/pwc/pwc-v4l.c 
b/drivers/media/video/pwc/pwc-v4l.c
index d5e6bc8..e20251d 100644
--- a/drivers/media/video/pwc/pwc-v4l.c
+++ b/drivers/media/video/pwc/pwc-v4l.c
@@ -1193,6 +1193,64 @@ int pwc_video_do_ioctl(struct inode *inode, struct file 
*file,
                        return 0;
                }
 
+               case VIDIOC_ENUM_FRAMESIZES:
+               {
+                       struct v4l2_frmsizeenum *fsize = arg;
+                       unsigned int i = 0, index = fsize->index;
+
+                       if (fsize->pixel_format == V4L2_PIX_FMT_YUV420) {
+                               for (i = 0; i < PSZ_MAX; i++) {
+                                       if (pdev->image_mask & (1UL << i)) {
+                                               if (!index--) {
+                                                       fsize->type = 
V4L2_FRMSIZE_TYPE_DISCRETE;
+                                                       fsize->discrete.width = 
pwc_image_sizes[i].x;
+                                                       fsize->discrete.height 
= pwc_image_sizes[i].y;
+                                                       return 0;
+                                               }
+                                       }
+                               }
+                       } else if (fsize->index == 0 &&
+                                  ((fsize->pixel_format == V4L2_PIX_FMT_PWC1 
&& DEVICE_USE_CODEC1(pdev->type)) ||
+                                   (fsize->pixel_format == V4L2_PIX_FMT_PWC2 
&& DEVICE_USE_CODEC23(pdev->type)))) {
+
+                               fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
+                               fsize->discrete.width = pdev->abs_max.x;
+                               fsize->discrete.height = pdev->abs_max.y;
+                               return 0;
+                       }
+                       return -EINVAL;
+               }
+
+               case VIDIOC_ENUM_FRAMEINTERVALS:
+               {
+                       struct v4l2_frmivalenum *fival = arg;
+                       int size = -1;
+                       unsigned int i;
+
+                       for (i = 0; i < PSZ_MAX; i++) {
+                               if (pwc_image_sizes[i].x == fival->width &&
+                                   pwc_image_sizes[i].y == fival->height) {
+                                       size = i;
+                                       break;
+                               }
+                       }
+
+                       /* TODO: Support raw format */
+                       if (size < 0 || fival->pixel_format != 
V4L2_PIX_FMT_YUV420) {
+                               return -EINVAL;
+                       }
+
+                       i = pwc_get_fps(pdev, fival->index, size);
+                       if (!i)
+                               return -EINVAL;
+
+                       fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
+                       fival->discrete.numerator = 1;
+                       fival->discrete.denominator = i;
+
+                       return 0;
+               }
+
                default:
                        return pwc_ioctl(pdev, cmd, arg);
        } /* ..switch */
diff --git a/drivers/media/video/pwc/pwc.h b/drivers/media/video/pwc/pwc.h
index e778a2b..acbb931 100644
--- a/drivers/media/video/pwc/pwc.h
+++ b/drivers/media/video/pwc/pwc.h
@@ -44,7 +44,7 @@
 #define PWC_MINOR      0
 #define PWC_EXTRAMINOR 12
 #define PWC_VERSION_CODE KERNEL_VERSION(PWC_MAJOR,PWC_MINOR,PWC_EXTRAMINOR)
-#define PWC_VERSION    "10.0.12"
+#define PWC_VERSION    "10.0.13"
 #define PWC_NAME       "pwc"
 #define PFX            PWC_NAME ": "
 
@@ -85,7 +85,7 @@
 #define PWC_INFO(fmt, args...) printk(KERN_INFO PFX fmt, ##args)
 #define PWC_TRACE(fmt, args...) PWC_DEBUG(TRACE, fmt, ##args)
 
-#else /* if ! CONFIG_PWC_DEBUG */
+#else /* if ! CONFIG_USB_PWC_DEBUG */
 
 #define PWC_ERROR(fmt, args...) printk(KERN_ERR PFX fmt, ##args)
 #define PWC_WARNING(fmt, args...) printk(KERN_WARNING PFX fmt, ##args)
@@ -287,6 +287,7 @@ void pwc_construct(struct pwc_device *pdev);
 /** Functions in pwc-ctrl.c */
 /* Request a certain video mode. Returns < 0 if not possible */
 extern int pwc_set_video_mode(struct pwc_device *pdev, int width, int height, 
int frames, int compression, int snapshot);
+extern unsigned int pwc_get_fps(struct pwc_device *pdev, unsigned int index, 
unsigned int size);
 /* Calculate the number of bytes per image (not frame) */
 extern int pwc_mpt_reset(struct pwc_device *pdev, int flags);
 extern int pwc_mpt_set_angle(struct pwc_device *pdev, int pan, int tilt);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to