pwc
[Top] [All Lists]

Re: [pwc] raw format decompression

To: Luc Saillard <>
Subject: Re: [pwc] raw format decompression
From: Björn Annighöfer <>
Date: Wed, 30 May 2007 17:17:42 +0200
Luc Saillard schrieb:
On Wed, May 30, 2007 at 01:41:24PM +0200, Björn Annighöfer wrote:

Thanks Luc,

that was exactly what i needed. I changed the libpwc a litle bit, now i
have a version that compiles and even works under windows (if sombody is
interested).


Sen me the patch, i'll update the package.


An other question: It decompression works perfect for 320x240. But I
tried 160x120 and there it produces only image with funny vertical
colored lines.


Hum i don't known if in 320x240, the format is compressed. Else the format is
in YUV420P in non compressed mode.

Luc


I am no linux homie, so i hope i did this right.
libpwc can now be compiled under linux and windows (MSVS).

Björn
diff -Naur libpwc-20060524/borrowed/types.h 
libpwc-20060524-win32/borrowed/types.h
--- libpwc-20060524/borrowed/types.h    1970-01-01 01:00:00.000000000 +0100
+++ libpwc-20060524-win32/borrowed/types.h      2007-05-27 22:00:37.000000000 
+0200
@@ -0,0 +1,11 @@
+#ifndef _LINUX_TYPES_H
+#define _LINUX_TYPES_H
+
+typedef        unsigned char __u8;
+typedef char __s8;
+typedef        unsigned short  __u16;
+typedef        short __s16;
+typedef        unsigned long   __u32;
+typedef        long    __s32;
+
+#endif
\ No newline at end of file
diff -Naur libpwc-20060524/borrowed/videodev2.h 
libpwc-20060524-win32/borrowed/videodev2.h
--- libpwc-20060524/borrowed/videodev2.h        1970-01-01 01:00:00.000000000 
+0100
+++ libpwc-20060524-win32/borrowed/videodev2.h  2007-05-27 22:00:37.000000000 
+0200
@@ -0,0 +1,1283 @@
+/*
+ *     Video for Linux Two
+ *
+ *     Header file for v4l or V4L2 drivers and applications
+ * with public API.
+ * All kernel-specific stuff were moved to media/v4l2-dev.h, so
+ * no #if __KERNEL tests are allowed here
+ *
+ *     See http://linuxtv.org for more info
+ *
+ *     Author: Bill Dirks <>
+ *             Justin Schoeman
+ *             et al.
+ */
+#ifndef __LINUX_VIDEODEV2_H
+#define __LINUX_VIDEODEV2_H
+#ifdef __KERNEL__
+#include <linux/time.h>     /* need struct timeval */
+#include <linux/compiler.h> /* need __user */
+#else
+#define __user
+#endif
+#ifdef _WIN32
+       #include "borrowed/types.h"
+#else
+       #include "linux/types.h"
+#endif
+
+/*
+ * Common stuff for both V4L1 and V4L2
+ * Moved from videodev.h
+ */
+#define VIDEO_MAX_FRAME               32
+
+#define VID_TYPE_CAPTURE       1       /* Can capture */
+#define VID_TYPE_TUNER         2       /* Can tune */
+#define VID_TYPE_TELETEXT      4       /* Does teletext */
+#define VID_TYPE_OVERLAY       8       /* Overlay onto frame buffer */
+#define VID_TYPE_CHROMAKEY     16      /* Overlay by chromakey */
+#define VID_TYPE_CLIPPING      32      /* Can clip */
+#define VID_TYPE_FRAMERAM      64      /* Uses the frame buffer memory */
+#define VID_TYPE_SCALES                128     /* Scalable */
+#define VID_TYPE_MONOCHROME    256     /* Monochrome only */
+#define VID_TYPE_SUBCAPTURE    512     /* Can capture subareas of the image */
+#define VID_TYPE_MPEG_DECODER  1024    /* Can decode MPEG streams */
+#define VID_TYPE_MPEG_ENCODER  2048    /* Can encode MPEG streams */
+#define VID_TYPE_MJPEG_DECODER 4096    /* Can decode MJPEG streams */
+#define VID_TYPE_MJPEG_ENCODER 8192    /* Can encode MJPEG streams */
+
+/*
+ *     M I S C E L L A N E O U S
+ */
+
+/*  Four-character-code (FOURCC) */
+#define v4l2_fourcc(a,b,c,d)\
+       (((__u32)(a)<<0)|((__u32)(b)<<8)|((__u32)(c)<<16)|((__u32)(d)<<24))
+
+/*
+ *     E N U M S
+ */
+enum v4l2_field {
+       V4L2_FIELD_ANY        = 0, /* driver can choose from none,
+                                     top, bottom, interlaced
+                                     depending on whatever it thinks
+                                     is approximate ... */
+       V4L2_FIELD_NONE       = 1, /* this device has no fields ... */
+       V4L2_FIELD_TOP        = 2, /* top field only */
+       V4L2_FIELD_BOTTOM     = 3, /* bottom field only */
+       V4L2_FIELD_INTERLACED = 4, /* both fields interlaced */
+       V4L2_FIELD_SEQ_TB     = 5, /* both fields sequential into one
+                                     buffer, top-bottom order */
+       V4L2_FIELD_SEQ_BT     = 6, /* same as above + bottom-top order */
+       V4L2_FIELD_ALTERNATE  = 7, /* both fields alternating into
+                                     separate buffers */
+};
+#define V4L2_FIELD_HAS_TOP(field)      \
+       ((field) == V4L2_FIELD_TOP      ||\
+        (field) == V4L2_FIELD_INTERLACED ||\
+        (field) == V4L2_FIELD_SEQ_TB   ||\
+        (field) == V4L2_FIELD_SEQ_BT)
+#define V4L2_FIELD_HAS_BOTTOM(field)   \
+       ((field) == V4L2_FIELD_BOTTOM   ||\
+        (field) == V4L2_FIELD_INTERLACED ||\
+        (field) == V4L2_FIELD_SEQ_TB   ||\
+        (field) == V4L2_FIELD_SEQ_BT)
+#define V4L2_FIELD_HAS_BOTH(field)     \
+       ((field) == V4L2_FIELD_INTERLACED ||\
+        (field) == V4L2_FIELD_SEQ_TB   ||\
+        (field) == V4L2_FIELD_SEQ_BT)
+
+enum v4l2_buf_type {
+       V4L2_BUF_TYPE_VIDEO_CAPTURE      = 1,
+       V4L2_BUF_TYPE_VIDEO_OUTPUT       = 2,
+       V4L2_BUF_TYPE_VIDEO_OVERLAY      = 3,
+       V4L2_BUF_TYPE_VBI_CAPTURE        = 4,
+       V4L2_BUF_TYPE_VBI_OUTPUT         = 5,
+#if 1
+       /* Experimental Sliced VBI */
+       V4L2_BUF_TYPE_SLICED_VBI_CAPTURE = 6,
+       V4L2_BUF_TYPE_SLICED_VBI_OUTPUT  = 7,
+#endif
+       V4L2_BUF_TYPE_PRIVATE            = 0x80,
+};
+
+enum v4l2_ctrl_type {
+       V4L2_CTRL_TYPE_INTEGER       = 1,
+       V4L2_CTRL_TYPE_BOOLEAN       = 2,
+       V4L2_CTRL_TYPE_MENU          = 3,
+       V4L2_CTRL_TYPE_BUTTON        = 4,
+       V4L2_CTRL_TYPE_INTEGER64     = 5,
+       V4L2_CTRL_TYPE_CTRL_CLASS    = 6,
+};
+
+enum v4l2_tuner_type {
+       V4L2_TUNER_RADIO             = 1,
+       V4L2_TUNER_ANALOG_TV         = 2,
+       V4L2_TUNER_DIGITAL_TV        = 3,
+};
+
+enum v4l2_memory {
+       V4L2_MEMORY_MMAP             = 1,
+       V4L2_MEMORY_USERPTR          = 2,
+       V4L2_MEMORY_OVERLAY          = 3,
+};
+
+/* see also http://vektor.theorem.ca/graphics/ycbcr/ */
+enum v4l2_colorspace {
+       /* ITU-R 601 -- broadcast NTSC/PAL */
+       V4L2_COLORSPACE_SMPTE170M     = 1,
+
+       /* 1125-Line (US) HDTV */
+       V4L2_COLORSPACE_SMPTE240M     = 2,
+
+       /* HD and modern captures. */
+       V4L2_COLORSPACE_REC709        = 3,
+
+       /* broken BT878 extents (601, luma range 16-253 instead of 16-235) */
+       V4L2_COLORSPACE_BT878         = 4,
+
+       /* These should be useful.  Assume 601 extents. */
+       V4L2_COLORSPACE_470_SYSTEM_M  = 5,
+       V4L2_COLORSPACE_470_SYSTEM_BG = 6,
+
+       /* I know there will be cameras that send this.  So, this is
+        * unspecified chromaticities and full 0-255 on each of the
+        * Y'CbCr components
+        */
+       V4L2_COLORSPACE_JPEG          = 7,
+
+       /* For RGB colourspaces, this is probably a good start. */
+       V4L2_COLORSPACE_SRGB          = 8,
+};
+
+enum v4l2_priority {
+       V4L2_PRIORITY_UNSET       = 0,  /* not initialized */
+       V4L2_PRIORITY_BACKGROUND  = 1,
+       V4L2_PRIORITY_INTERACTIVE = 2,
+       V4L2_PRIORITY_RECORD      = 3,
+       V4L2_PRIORITY_DEFAULT     = V4L2_PRIORITY_INTERACTIVE,
+};
+
+struct v4l2_rect {
+       __s32   left;
+       __s32   top;
+       __s32   width;
+       __s32   height;
+};
+
+struct v4l2_fract {
+       __u32   numerator;
+       __u32   denominator;
+};
+
+/*
+ *     D R I V E R   C A P A B I L I T I E S
+ */
+struct v4l2_capability
+{
+       __u8    driver[16];     /* i.e. "bttv" */
+       __u8    card[32];       /* i.e. "Hauppauge WinTV" */
+       __u8    bus_info[32];   /* "PCI:" + pci_name(pci_dev) */
+       __u32   version;        /* should use KERNEL_VERSION() */
+       __u32   capabilities;   /* Device capabilities */
+       __u32   reserved[4];
+};
+
+/* Values for 'capabilities' field */
+#define V4L2_CAP_VIDEO_CAPTURE         0x00000001  /* Is a video capture 
device */
+#define V4L2_CAP_VIDEO_OUTPUT          0x00000002  /* Is a video output device 
*/
+#define V4L2_CAP_VIDEO_OVERLAY         0x00000004  /* Can do video overlay */
+#define V4L2_CAP_VBI_CAPTURE           0x00000010  /* Is a raw VBI capture 
device */
+#define V4L2_CAP_VBI_OUTPUT            0x00000020  /* Is a raw VBI output 
device */
+#if 1
+#define V4L2_CAP_SLICED_VBI_CAPTURE    0x00000040  /* Is a sliced VBI capture 
device */
+#define V4L2_CAP_SLICED_VBI_OUTPUT     0x00000080  /* Is a sliced VBI output 
device */
+#endif
+#define V4L2_CAP_RDS_CAPTURE           0x00000100  /* RDS data capture */
+
+#define V4L2_CAP_TUNER                 0x00010000  /* has a tuner */
+#define V4L2_CAP_AUDIO                 0x00020000  /* has audio support */
+#define V4L2_CAP_RADIO                 0x00040000  /* is a radio device */
+
+#define V4L2_CAP_READWRITE              0x01000000  /* read/write systemcalls 
*/
+#define V4L2_CAP_ASYNCIO                0x02000000  /* async I/O */
+#define V4L2_CAP_STREAMING              0x04000000  /* streaming I/O ioctls */
+
+/*
+ *     V I D E O   I M A G E   F O R M A T
+ */
+struct v4l2_pix_format
+{
+       __u32                   width;
+       __u32                   height;
+       __u32                   pixelformat;
+       enum v4l2_field         field;
+       __u32                   bytesperline;   /* for padding, zero if unused 
*/
+       __u32                   sizeimage;
+       enum v4l2_colorspace    colorspace;
+       __u32                   priv;           /* private data, depends on 
pixelformat */
+};
+
+/*      Pixel format         FOURCC                        depth  Description  
*/
+#define V4L2_PIX_FMT_RGB332  v4l2_fourcc('R','G','B','1') /*  8  RGB-3-3-2     
*/
+#define V4L2_PIX_FMT_RGB555  v4l2_fourcc('R','G','B','O') /* 16  RGB-5-5-5     
*/
+#define V4L2_PIX_FMT_RGB565  v4l2_fourcc('R','G','B','P') /* 16  RGB-5-6-5     
*/
+#define V4L2_PIX_FMT_RGB555X v4l2_fourcc('R','G','B','Q') /* 16  RGB-5-5-5 BE  
*/
+#define V4L2_PIX_FMT_RGB565X v4l2_fourcc('R','G','B','R') /* 16  RGB-5-6-5 BE  
*/
+#define V4L2_PIX_FMT_BGR24   v4l2_fourcc('B','G','R','3') /* 24  BGR-8-8-8     
*/
+#define V4L2_PIX_FMT_RGB24   v4l2_fourcc('R','G','B','3') /* 24  RGB-8-8-8     
*/
+#define V4L2_PIX_FMT_BGR32   v4l2_fourcc('B','G','R','4') /* 32  BGR-8-8-8-8   
*/
+#define V4L2_PIX_FMT_RGB32   v4l2_fourcc('R','G','B','4') /* 32  RGB-8-8-8-8   
*/
+#define V4L2_PIX_FMT_GREY    v4l2_fourcc('G','R','E','Y') /*  8  Greyscale     
*/
+#define V4L2_PIX_FMT_YVU410  v4l2_fourcc('Y','V','U','9') /*  9  YVU 4:1:0     
*/
+#define V4L2_PIX_FMT_YVU420  v4l2_fourcc('Y','V','1','2') /* 12  YVU 4:2:0     
*/
+#define V4L2_PIX_FMT_YUYV    v4l2_fourcc('Y','U','Y','V') /* 16  YUV 4:2:2     
*/
+#define V4L2_PIX_FMT_UYVY    v4l2_fourcc('U','Y','V','Y') /* 16  YUV 4:2:2     
*/
+#define V4L2_PIX_FMT_YUV422P v4l2_fourcc('4','2','2','P') /* 16  YVU422 planar 
*/
+#define V4L2_PIX_FMT_YUV411P v4l2_fourcc('4','1','1','P') /* 16  YVU411 planar 
*/
+#define V4L2_PIX_FMT_Y41P    v4l2_fourcc('Y','4','1','P') /* 12  YUV 4:1:1     
*/
+
+/* two planes -- one Y, one Cr + Cb interleaved  */
+#define V4L2_PIX_FMT_NV12    v4l2_fourcc('N','V','1','2') /* 12  Y/CbCr 4:2:0  
*/
+#define V4L2_PIX_FMT_NV21    v4l2_fourcc('N','V','2','1') /* 12  Y/CrCb 4:2:0  
*/
+
+/*  The following formats are not defined in the V4L2 specification */
+#define V4L2_PIX_FMT_YUV410  v4l2_fourcc('Y','U','V','9') /*  9  YUV 4:1:0     
*/
+#define V4L2_PIX_FMT_YUV420  v4l2_fourcc('Y','U','1','2') /* 12  YUV 4:2:0     
*/
+#define V4L2_PIX_FMT_YYUV    v4l2_fourcc('Y','Y','U','V') /* 16  YUV 4:2:2     
*/
+#define V4L2_PIX_FMT_HI240   v4l2_fourcc('H','I','2','4') /*  8  8-bit color   
*/
+#define V4L2_PIX_FMT_HM12    v4l2_fourcc('H','M','1','2') /*  8  YUV 4:1:1 
16x16 macroblocks */
+
+/* see http://www.siliconimaging.com/RGB%20Bayer.htm */
+#define V4L2_PIX_FMT_SBGGR8  v4l2_fourcc('B','A','8','1') /*  8  BGBG.. GRGR.. 
*/
+
+/* compressed formats */
+#define V4L2_PIX_FMT_MJPEG    v4l2_fourcc('M','J','P','G') /* Motion-JPEG   */
+#define V4L2_PIX_FMT_JPEG     v4l2_fourcc('J','P','E','G') /* JFIF JPEG     */
+#define V4L2_PIX_FMT_DV       v4l2_fourcc('d','v','s','d') /* 1394          */
+#define V4L2_PIX_FMT_MPEG     v4l2_fourcc('M','P','E','G') /* MPEG-1/2/4    */
+
+/*  Vendor-specific formats   */
+#define V4L2_PIX_FMT_WNVA     v4l2_fourcc('W','N','V','A') /* Winnov hw 
compress */
+#define V4L2_PIX_FMT_SN9C10X  v4l2_fourcc('S','9','1','0') /* SN9C10x 
compression */
+#define V4L2_PIX_FMT_PWC1     v4l2_fourcc('P','W','C','1') /* pwc older webcam 
*/
+#define V4L2_PIX_FMT_PWC2     v4l2_fourcc('P','W','C','2') /* pwc newer webcam 
*/
+#define V4L2_PIX_FMT_ET61X251 v4l2_fourcc('E','6','2','5') /* ET61X251 
compression */
+
+/*
+ *     F O R M A T   E N U M E R A T I O N
+ */
+struct v4l2_fmtdesc
+{
+       __u32               index;             /* Format number      */
+       enum v4l2_buf_type  type;              /* buffer type        */
+       __u32               flags;
+       __u8                description[32];   /* Description string */
+       __u32               pixelformat;       /* Format fourcc      */
+       __u32               reserved[4];
+};
+
+#define V4L2_FMT_FLAG_COMPRESSED 0x0001
+
+/*
+ *     T I M E C O D E
+ */
+struct v4l2_timecode
+{
+       __u32   type;
+       __u32   flags;
+       __u8    frames;
+       __u8    seconds;
+       __u8    minutes;
+       __u8    hours;
+       __u8    userbits[4];
+};
+
+/*  Type  */
+#define V4L2_TC_TYPE_24FPS             1
+#define V4L2_TC_TYPE_25FPS             2
+#define V4L2_TC_TYPE_30FPS             3
+#define V4L2_TC_TYPE_50FPS             4
+#define V4L2_TC_TYPE_60FPS             5
+
+/*  Flags  */
+#define V4L2_TC_FLAG_DROPFRAME         0x0001 /* "drop-frame" mode */
+#define V4L2_TC_FLAG_COLORFRAME                0x0002
+#define V4L2_TC_USERBITS_field         0x000C
+#define V4L2_TC_USERBITS_USERDEFINED   0x0000
+#define V4L2_TC_USERBITS_8BITCHARS     0x0008
+/* The above is based on SMPTE timecodes */
+
+#ifdef __KERNEL__
+/*
+ *     M P E G   C O M P R E S S I O N   P A R A M E T E R S
+ *
+ *  ### WARNING: This experimental MPEG compression API is obsolete.
+ *  ###          It is replaced by the MPEG controls API.
+ *  ###          This old API will disappear in the near future!
+ *
+ */
+enum v4l2_bitrate_mode {
+       V4L2_BITRATE_NONE = 0,  /* not specified */
+       V4L2_BITRATE_CBR,       /* constant bitrate */
+       V4L2_BITRATE_VBR,       /* variable bitrate */
+};
+struct v4l2_bitrate {
+       /* rates are specified in kbit/sec */
+       enum v4l2_bitrate_mode  mode;
+       __u32                   min;
+       __u32                   target;  /* use this one for CBR */
+       __u32                   max;
+};
+
+enum v4l2_mpeg_streamtype {
+       V4L2_MPEG_SS_1,         /* MPEG-1 system stream */
+       V4L2_MPEG_PS_2,         /* MPEG-2 program stream */
+       V4L2_MPEG_TS_2,         /* MPEG-2 transport stream */
+       V4L2_MPEG_PS_DVD,       /* MPEG-2 program stream with DVD header fixups 
*/
+};
+enum v4l2_mpeg_audiotype {
+       V4L2_MPEG_AU_2_I,       /* MPEG-2 layer 1 */
+       V4L2_MPEG_AU_2_II,      /* MPEG-2 layer 2 */
+       V4L2_MPEG_AU_2_III,     /* MPEG-2 layer 3 */
+       V4L2_MPEG_AC3,          /* AC3 */
+       V4L2_MPEG_LPCM,         /* LPCM */
+};
+enum v4l2_mpeg_videotype {
+       V4L2_MPEG_VI_1,         /* MPEG-1 */
+       V4L2_MPEG_VI_2,         /* MPEG-2 */
+};
+enum v4l2_mpeg_aspectratio {
+       V4L2_MPEG_ASPECT_SQUARE = 1,   /* square pixel */
+       V4L2_MPEG_ASPECT_4_3    = 2,   /*  4 : 3       */
+       V4L2_MPEG_ASPECT_16_9   = 3,   /* 16 : 9       */
+       V4L2_MPEG_ASPECT_1_221  = 4,   /*  1 : 2,21    */
+};
+
+struct v4l2_mpeg_compression {
+       /* general */
+       enum v4l2_mpeg_streamtype       st_type;
+       struct v4l2_bitrate             st_bitrate;
+
+       /* transport streams */
+       __u16                           ts_pid_pmt;
+       __u16                           ts_pid_audio;
+       __u16                           ts_pid_video;
+       __u16                           ts_pid_pcr;
+
+       /* program stream */
+       __u16                           ps_size;
+       __u16                           reserved_1;    /* align */
+
+       /* audio */
+       enum v4l2_mpeg_audiotype        au_type;
+       struct v4l2_bitrate             au_bitrate;
+       __u32                           au_sample_rate;
+       __u8                            au_pesid;
+       __u8                            reserved_2[3]; /* align */
+
+       /* video */
+       enum v4l2_mpeg_videotype        vi_type;
+       enum v4l2_mpeg_aspectratio      vi_aspect_ratio;
+       struct v4l2_bitrate             vi_bitrate;
+       __u32                           vi_frame_rate;
+       __u16                           vi_frames_per_gop;
+       __u16                           vi_bframes_count;
+       __u8                            vi_pesid;
+       __u8                            reserved_3[3]; /* align */
+
+       /* misc flags */
+       __u32                           closed_gops:1;
+       __u32                           pulldown:1;
+       __u32                           reserved_4:30; /* align */
+
+       /* I don't expect the above being perfect yet ;) */
+       __u32                           reserved_5[8];
+};
+#endif
+
+struct v4l2_jpegcompression
+{
+       int quality;
+
+       int  APPn;              /* Number of APP segment to be written,
+                                * must be 0..15 */
+       int  APP_len;           /* Length of data in JPEG APPn segment */
+       char APP_data[60];      /* Data in the JPEG APPn segment. */
+
+       int  COM_len;           /* Length of data in JPEG COM segment */
+       char COM_data[60];      /* Data in JPEG COM segment */
+
+       __u32 jpeg_markers;     /* Which markers should go into the JPEG
+                                * output. Unless you exactly know what
+                                * you do, leave them untouched.
+                                * Inluding less markers will make the
+                                * resulting code smaller, but there will
+                                * be fewer aplications which can read it.
+                                * The presence of the APP and COM marker
+                                * is influenced by APP_len and COM_len
+                                * ONLY, not by this property! */
+
+#define V4L2_JPEG_MARKER_DHT (1<<3)    /* Define Huffman Tables */
+#define V4L2_JPEG_MARKER_DQT (1<<4)    /* Define Quantization Tables */
+#define V4L2_JPEG_MARKER_DRI (1<<5)    /* Define Restart Interval */
+#define V4L2_JPEG_MARKER_COM (1<<6)    /* Comment segment */
+#define V4L2_JPEG_MARKER_APP (1<<7)    /* App segment, driver will
+                                       * allways use APP0 */
+};
+
+/*
+ *     M E M O R Y - M A P P I N G   B U F F E R S
+ */
+#ifndef _WIN32
+struct v4l2_requestbuffers
+{
+       __u32                   count;
+       enum v4l2_buf_type      type;
+       enum v4l2_memory        memory;
+       __u32                   reserved[2];
+};
+
+struct v4l2_buffer
+{
+       __u32                   index;
+       enum v4l2_buf_type      type;
+       __u32                   bytesused;
+       __u32                   flags;
+       enum v4l2_field         field;
+       struct timeval          timestamp;
+       struct v4l2_timecode    timecode;
+       __u32                   sequence;
+
+       /* memory location */
+       enum v4l2_memory        memory;
+       union {
+               __u32           offset;
+               unsigned long   userptr;
+       } m;
+       __u32                   length;
+       __u32                   input;
+       __u32                   reserved;
+};
+#endif _WIN32
+
+/*  Flags for 'flags' field */
+#define V4L2_BUF_FLAG_MAPPED   0x0001  /* Buffer is mapped (flag) */
+#define V4L2_BUF_FLAG_QUEUED   0x0002  /* Buffer is queued for processing */
+#define V4L2_BUF_FLAG_DONE     0x0004  /* Buffer is ready */
+#define V4L2_BUF_FLAG_KEYFRAME 0x0008  /* Image is a keyframe (I-frame) */
+#define V4L2_BUF_FLAG_PFRAME   0x0010  /* Image is a P-frame */
+#define V4L2_BUF_FLAG_BFRAME   0x0020  /* Image is a B-frame */
+#define V4L2_BUF_FLAG_TIMECODE 0x0100  /* timecode field is valid */
+#define V4L2_BUF_FLAG_INPUT     0x0200  /* input field is valid */
+
+/*
+ *     O V E R L A Y   P R E V I E W
+ */
+#ifndef _WIN32
+struct v4l2_framebuffer
+{
+       __u32                   capability;
+       __u32                   flags;
+/* FIXME: in theory we should pass something like PCI device + memory
+ * region + offset instead of some physical address */
+       void*                   base;
+       struct v4l2_pix_format  fmt;
+};
+#endif _WIN32
+/*  Flags for the 'capability' field. Read only */
+#define V4L2_FBUF_CAP_EXTERNOVERLAY    0x0001
+#define V4L2_FBUF_CAP_CHROMAKEY                0x0002
+#define V4L2_FBUF_CAP_LIST_CLIPPING     0x0004
+#define V4L2_FBUF_CAP_BITMAP_CLIPPING  0x0008
+/*  Flags for the 'flags' field. */
+#define V4L2_FBUF_FLAG_PRIMARY         0x0001
+#define V4L2_FBUF_FLAG_OVERLAY         0x0002
+#define V4L2_FBUF_FLAG_CHROMAKEY       0x0004
+
+#ifndef _WIN32
+struct v4l2_clip
+{
+       struct v4l2_rect        c;
+       struct v4l2_clip        __user *next;
+};
+
+struct v4l2_window
+{
+       struct v4l2_rect        w;
+       enum v4l2_field         field;
+       __u32                   chromakey;
+       struct v4l2_clip        __user *clips;
+       __u32                   clipcount;
+       void                    __user *bitmap;
+};
+
+/*
+ *     C A P T U R E   P A R A M E T E R S
+ */
+struct v4l2_captureparm
+{
+       __u32              capability;    /*  Supported modes */
+       __u32              capturemode;   /*  Current mode */
+       struct v4l2_fract  timeperframe;  /*  Time per frame in .1us units */
+       __u32              extendedmode;  /*  Driver-specific extensions */
+       __u32              readbuffers;   /*  # of buffers for read */
+       __u32              reserved[4];
+};
+
+/*  Flags for 'capability' and 'capturemode' fields */
+#define V4L2_MODE_HIGHQUALITY  0x0001  /*  High quality imaging mode */
+#define V4L2_CAP_TIMEPERFRAME  0x1000  /*  timeperframe field is supported */
+
+struct v4l2_outputparm
+{
+       __u32              capability;   /*  Supported modes */
+       __u32              outputmode;   /*  Current mode */
+       struct v4l2_fract  timeperframe; /*  Time per frame in seconds */
+       __u32              extendedmode; /*  Driver-specific extensions */
+       __u32              writebuffers; /*  # of buffers for write */
+       __u32              reserved[4];
+};
+
+/*
+ *     I N P U T   I M A G E   C R O P P I N G
+ */
+struct v4l2_cropcap {
+       enum v4l2_buf_type      type;
+       struct v4l2_rect        bounds;
+       struct v4l2_rect        defrect;
+       struct v4l2_fract       pixelaspect;
+};
+
+struct v4l2_crop {
+       enum v4l2_buf_type      type;
+       struct v4l2_rect        c;
+};
+
+/*
+ *      A N A L O G   V I D E O   S T A N D A R D
+ */
+
+typedef __u64 v4l2_std_id;
+
+
+/* one bit for each */
+#define V4L2_STD_PAL_B          ((v4l2_std_id)0x00000001)
+#define V4L2_STD_PAL_B1         ((v4l2_std_id)0x00000002)
+#define V4L2_STD_PAL_G          ((v4l2_std_id)0x00000004)
+#define V4L2_STD_PAL_H          ((v4l2_std_id)0x00000008)
+#define V4L2_STD_PAL_I          ((v4l2_std_id)0x00000010)
+#define V4L2_STD_PAL_D          ((v4l2_std_id)0x00000020)
+#define V4L2_STD_PAL_D1         ((v4l2_std_id)0x00000040)
+#define V4L2_STD_PAL_K          ((v4l2_std_id)0x00000080)
+
+#define V4L2_STD_PAL_M          ((v4l2_std_id)0x00000100)
+#define V4L2_STD_PAL_N          ((v4l2_std_id)0x00000200)
+#define V4L2_STD_PAL_Nc         ((v4l2_std_id)0x00000400)
+#define V4L2_STD_PAL_60         ((v4l2_std_id)0x00000800)
+
+#define V4L2_STD_NTSC_M         ((v4l2_std_id)0x00001000)
+#define V4L2_STD_NTSC_M_JP      ((v4l2_std_id)0x00002000)
+#define V4L2_STD_NTSC_443       ((v4l2_std_id)0x00004000)
+#define V4L2_STD_NTSC_M_KR      ((v4l2_std_id)0x00008000)
+
+#define V4L2_STD_SECAM_B        ((v4l2_std_id)0x00010000)
+#define V4L2_STD_SECAM_D        ((v4l2_std_id)0x00020000)
+#define V4L2_STD_SECAM_G        ((v4l2_std_id)0x00040000)
+#define V4L2_STD_SECAM_H        ((v4l2_std_id)0x00080000)
+#define V4L2_STD_SECAM_K        ((v4l2_std_id)0x00100000)
+#define V4L2_STD_SECAM_K1       ((v4l2_std_id)0x00200000)
+#define V4L2_STD_SECAM_L        ((v4l2_std_id)0x00400000)
+#define V4L2_STD_SECAM_LC       ((v4l2_std_id)0x00800000)
+
+/* ATSC/HDTV */
+#define V4L2_STD_ATSC_8_VSB     ((v4l2_std_id)0x01000000)
+#define V4L2_STD_ATSC_16_VSB    ((v4l2_std_id)0x02000000)
+
+/* some merged standards */
+#define V4L2_STD_MN    
(V4L2_STD_PAL_M|V4L2_STD_PAL_N|V4L2_STD_PAL_Nc|V4L2_STD_NTSC)
+#define V4L2_STD_B     (V4L2_STD_PAL_B|V4L2_STD_PAL_B1|V4L2_STD_SECAM_B)
+#define V4L2_STD_GH    
(V4L2_STD_PAL_G|V4L2_STD_PAL_H|V4L2_STD_SECAM_G|V4L2_STD_SECAM_H)
+#define V4L2_STD_DK    (V4L2_STD_PAL_DK|V4L2_STD_SECAM_DK)
+
+/* some common needed stuff */
+#define V4L2_STD_PAL_BG                (V4L2_STD_PAL_B         |\
+                                V4L2_STD_PAL_B1        |\
+                                V4L2_STD_PAL_G)
+#define V4L2_STD_PAL_DK                (V4L2_STD_PAL_D         |\
+                                V4L2_STD_PAL_D1        |\
+                                V4L2_STD_PAL_K)
+#define V4L2_STD_PAL           (V4L2_STD_PAL_BG        |\
+                                V4L2_STD_PAL_DK        |\
+                                V4L2_STD_PAL_H         |\
+                                V4L2_STD_PAL_I)
+#define V4L2_STD_NTSC           (V4L2_STD_NTSC_M       |\
+                                V4L2_STD_NTSC_M_JP     |\
+                                V4L2_STD_NTSC_M_KR)
+#define V4L2_STD_SECAM_DK              (V4L2_STD_SECAM_D       |\
+                                V4L2_STD_SECAM_K       |\
+                                V4L2_STD_SECAM_K1)
+#define V4L2_STD_SECAM         (V4L2_STD_SECAM_B       |\
+                                V4L2_STD_SECAM_G       |\
+                                V4L2_STD_SECAM_H       |\
+                                V4L2_STD_SECAM_DK      |\
+                                V4L2_STD_SECAM_L       |\
+                                V4L2_STD_SECAM_LC)
+
+#define V4L2_STD_525_60                (V4L2_STD_PAL_M         |\
+                                V4L2_STD_PAL_60        |\
+                                V4L2_STD_NTSC          |\
+                                V4L2_STD_NTSC_443)
+#define V4L2_STD_625_50                (V4L2_STD_PAL           |\
+                                V4L2_STD_PAL_N         |\
+                                V4L2_STD_PAL_Nc        |\
+                                V4L2_STD_SECAM)
+#define V4L2_STD_ATSC           (V4L2_STD_ATSC_8_VSB    |\
+                                V4L2_STD_ATSC_16_VSB)
+
+#define V4L2_STD_UNKNOWN        0
+#define V4L2_STD_ALL            (V4L2_STD_525_60       |\
+                                V4L2_STD_625_50)
+
+struct v4l2_standard
+{
+       __u32                index;
+       v4l2_std_id          id;
+       __u8                 name[24];
+       struct v4l2_fract    frameperiod; /* Frames, not fields */
+       __u32                framelines;
+       __u32                reserved[4];
+};
+
+/*
+ *     V I D E O   I N P U T S
+ */
+struct v4l2_input
+{
+       __u32        index;             /*  Which input */
+       __u8         name[32];          /*  Label */
+       __u32        type;              /*  Type of input */
+       __u32        audioset;          /*  Associated audios (bitfield) */
+       __u32        tuner;             /*  Associated tuner */
+       v4l2_std_id  std;
+       __u32        status;
+       __u32        reserved[4];
+};
+#endif _WIN32
+/*  Values for the 'type' field */
+#define V4L2_INPUT_TYPE_TUNER          1
+#define V4L2_INPUT_TYPE_CAMERA         2
+
+/* field 'status' - general */
+#define V4L2_IN_ST_NO_POWER    0x00000001  /* Attached device is off */
+#define V4L2_IN_ST_NO_SIGNAL   0x00000002
+#define V4L2_IN_ST_NO_COLOR    0x00000004
+
+/* field 'status' - analog */
+#define V4L2_IN_ST_NO_H_LOCK   0x00000100  /* No horizontal sync lock */
+#define V4L2_IN_ST_COLOR_KILL  0x00000200  /* Color killer is active */
+
+/* field 'status' - digital */
+#define V4L2_IN_ST_NO_SYNC     0x00010000  /* No synchronization lock */
+#define V4L2_IN_ST_NO_EQU      0x00020000  /* No equalizer lock */
+#define V4L2_IN_ST_NO_CARRIER  0x00040000  /* Carrier recovery failed */
+
+/* field 'status' - VCR and set-top box */
+#define V4L2_IN_ST_MACROVISION 0x01000000  /* Macrovision detected */
+#define V4L2_IN_ST_NO_ACCESS   0x02000000  /* Conditional access denied */
+#define V4L2_IN_ST_VTR         0x04000000  /* VTR time constant */
+
+/*
+ *     V I D E O   O U T P U T S
+ */
+#ifndef _WIN32
+struct v4l2_output
+{
+       __u32        index;             /*  Which output */
+       __u8         name[32];          /*  Label */
+       __u32        type;              /*  Type of output */
+       __u32        audioset;          /*  Associated audios (bitfield) */
+       __u32        modulator;         /*  Associated modulator */
+       v4l2_std_id  std;
+       __u32        reserved[4];
+};
+/*  Values for the 'type' field */
+#define V4L2_OUTPUT_TYPE_MODULATOR             1
+#define V4L2_OUTPUT_TYPE_ANALOG                        2
+#define V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY      3
+
+/*
+ *     C O N T R O L S
+ */
+struct v4l2_control
+{
+       __u32                id;
+       __s32                value;
+};
+
+struct v4l2_ext_control
+{
+       __u32 id;
+       __u32 reserved2[2];
+       union {
+               __s32 value;
+               __s64 value64;
+               void *reserved;
+       };
+} __attribute__ ((packed));
+
+struct v4l2_ext_controls
+{
+       __u32 ctrl_class;
+       __u32 count;
+       __u32 error_idx;
+       __u32 reserved[2];
+       struct v4l2_ext_control *controls;
+};
+#endif _WIN32
+/*  Values for ctrl_class field */
+#define V4L2_CTRL_CLASS_USER 0x00980000        /* Old-style 'user' controls */
+#define V4L2_CTRL_CLASS_MPEG 0x00990000        /* MPEG-compression controls */
+
+#define V4L2_CTRL_ID_MASK                (0x0fffffff)
+#define V4L2_CTRL_ID2CLASS(id)    ((id) & 0x0fff0000UL)
+#define V4L2_CTRL_DRIVER_PRIV(id) (((id) & 0xffff) >= 0x1000)
+
+/*  Used in the VIDIOC_QUERYCTRL ioctl for querying controls */
+#ifndef _WIN32
+struct v4l2_queryctrl
+{
+       __u32                id;
+       enum v4l2_ctrl_type  type;
+       __u8                 name[32];  /* Whatever */
+       __s32                minimum;   /* Note signedness */
+       __s32                maximum;
+       __s32                step;
+       __s32                default_value;
+       __u32                flags;
+       __u32                reserved[2];
+};
+
+/*  Used in the VIDIOC_QUERYMENU ioctl for querying menu items */
+struct v4l2_querymenu
+{
+       __u32           id;
+       __u32           index;
+       __u8            name[32];       /* Whatever */
+       __u32           reserved;
+};
+#endif _WIN32
+/*  Control flags  */
+#define V4L2_CTRL_FLAG_DISABLED                0x0001
+#define V4L2_CTRL_FLAG_GRABBED         0x0002
+#define V4L2_CTRL_FLAG_READ_ONLY       0x0004
+#define V4L2_CTRL_FLAG_UPDATE          0x0008
+#define V4L2_CTRL_FLAG_INACTIVE        0x0010
+#define V4L2_CTRL_FLAG_SLIDER          0x0020
+
+/*  Query flag, to be ORed with the control ID */
+#define V4L2_CTRL_FLAG_NEXT_CTRL       0x80000000
+
+/*  User-class control IDs defined by V4L2 */
+#define V4L2_CID_BASE                  (V4L2_CTRL_CLASS_USER | 0x900)
+#define V4L2_CID_USER_BASE             V4L2_CID_BASE
+/*  IDs reserved for driver specific controls */
+#define V4L2_CID_PRIVATE_BASE          0x08000000
+
+#define V4L2_CID_USER_CLASS            (V4L2_CTRL_CLASS_USER | 1)
+#define V4L2_CID_BRIGHTNESS            (V4L2_CID_BASE+0)
+#define V4L2_CID_CONTRAST              (V4L2_CID_BASE+1)
+#define V4L2_CID_SATURATION            (V4L2_CID_BASE+2)
+#define V4L2_CID_HUE                   (V4L2_CID_BASE+3)
+#define V4L2_CID_AUDIO_VOLUME          (V4L2_CID_BASE+5)
+#define V4L2_CID_AUDIO_BALANCE         (V4L2_CID_BASE+6)
+#define V4L2_CID_AUDIO_BASS            (V4L2_CID_BASE+7)
+#define V4L2_CID_AUDIO_TREBLE          (V4L2_CID_BASE+8)
+#define V4L2_CID_AUDIO_MUTE            (V4L2_CID_BASE+9)
+#define V4L2_CID_AUDIO_LOUDNESS                (V4L2_CID_BASE+10)
+#define V4L2_CID_BLACK_LEVEL           (V4L2_CID_BASE+11)
+#define V4L2_CID_AUTO_WHITE_BALANCE    (V4L2_CID_BASE+12)
+#define V4L2_CID_DO_WHITE_BALANCE      (V4L2_CID_BASE+13)
+#define V4L2_CID_RED_BALANCE           (V4L2_CID_BASE+14)
+#define V4L2_CID_BLUE_BALANCE          (V4L2_CID_BASE+15)
+#define V4L2_CID_GAMMA                 (V4L2_CID_BASE+16)
+#define V4L2_CID_WHITENESS             (V4L2_CID_GAMMA) /* ? Not sure */
+#define V4L2_CID_EXPOSURE              (V4L2_CID_BASE+17)
+#define V4L2_CID_AUTOGAIN              (V4L2_CID_BASE+18)
+#define V4L2_CID_GAIN                  (V4L2_CID_BASE+19)
+#define V4L2_CID_HFLIP                 (V4L2_CID_BASE+20)
+#define V4L2_CID_VFLIP                 (V4L2_CID_BASE+21)
+#define V4L2_CID_HCENTER               (V4L2_CID_BASE+22)
+#define V4L2_CID_VCENTER               (V4L2_CID_BASE+23)
+#define V4L2_CID_LASTP1                        (V4L2_CID_BASE+24) /* last CID 
+ 1 */
+
+/*  MPEG-class control IDs defined by V4L2 */
+#define V4L2_CID_MPEG_BASE                     (V4L2_CTRL_CLASS_MPEG | 0x900)
+#define V4L2_CID_MPEG_CLASS                    (V4L2_CTRL_CLASS_MPEG | 1)
+
+/*  MPEG streams */
+#define V4L2_CID_MPEG_STREAM_TYPE              (V4L2_CID_MPEG_BASE+0)
+enum v4l2_mpeg_stream_type {
+       V4L2_MPEG_STREAM_TYPE_MPEG2_PS   = 0, /* MPEG-2 program stream */
+       V4L2_MPEG_STREAM_TYPE_MPEG2_TS   = 1, /* MPEG-2 transport stream */
+       V4L2_MPEG_STREAM_TYPE_MPEG1_SS   = 2, /* MPEG-1 system stream */
+       V4L2_MPEG_STREAM_TYPE_MPEG2_DVD  = 3, /* MPEG-2 DVD-compatible stream */
+       V4L2_MPEG_STREAM_TYPE_MPEG1_VCD  = 4, /* MPEG-1 VCD-compatible stream */
+       V4L2_MPEG_STREAM_TYPE_MPEG2_SVCD = 5, /* MPEG-2 SVCD-compatible stream 
*/
+};
+#define V4L2_CID_MPEG_STREAM_PID_PMT           (V4L2_CID_MPEG_BASE+1)
+#define V4L2_CID_MPEG_STREAM_PID_AUDIO                 (V4L2_CID_MPEG_BASE+2)
+#define V4L2_CID_MPEG_STREAM_PID_VIDEO                 (V4L2_CID_MPEG_BASE+3)
+#define V4L2_CID_MPEG_STREAM_PID_PCR           (V4L2_CID_MPEG_BASE+4)
+#define V4L2_CID_MPEG_STREAM_PES_ID_AUDIO      (V4L2_CID_MPEG_BASE+5)
+#define V4L2_CID_MPEG_STREAM_PES_ID_VIDEO      (V4L2_CID_MPEG_BASE+6)
+#define V4L2_CID_MPEG_STREAM_VBI_FMT           (V4L2_CID_MPEG_BASE+7)
+enum v4l2_mpeg_stream_vbi_fmt {
+       V4L2_MPEG_STREAM_VBI_FMT_NONE = 0,  /* No VBI in the MPEG stream */
+       V4L2_MPEG_STREAM_VBI_FMT_IVTV = 1,  /* VBI in private packets, IVTV 
format */
+};
+
+/*  MPEG audio */
+#define V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ      (V4L2_CID_MPEG_BASE+100)
+enum v4l2_mpeg_audio_sampling_freq {
+       V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100 = 0,
+       V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000 = 1,
+       V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000 = 2,
+};
+#define V4L2_CID_MPEG_AUDIO_ENCODING           (V4L2_CID_MPEG_BASE+101)
+enum v4l2_mpeg_audio_encoding {
+       V4L2_MPEG_AUDIO_ENCODING_LAYER_1 = 0,
+       V4L2_MPEG_AUDIO_ENCODING_LAYER_2 = 1,
+       V4L2_MPEG_AUDIO_ENCODING_LAYER_3 = 2,
+};
+#define V4L2_CID_MPEG_AUDIO_L1_BITRATE                 (V4L2_CID_MPEG_BASE+102)
+enum v4l2_mpeg_audio_l1_bitrate {
+       V4L2_MPEG_AUDIO_L1_BITRATE_32K  = 0,
+       V4L2_MPEG_AUDIO_L1_BITRATE_64K  = 1,
+       V4L2_MPEG_AUDIO_L1_BITRATE_96K  = 2,
+       V4L2_MPEG_AUDIO_L1_BITRATE_128K = 3,
+       V4L2_MPEG_AUDIO_L1_BITRATE_160K = 4,
+       V4L2_MPEG_AUDIO_L1_BITRATE_192K = 5,
+       V4L2_MPEG_AUDIO_L1_BITRATE_224K = 6,
+       V4L2_MPEG_AUDIO_L1_BITRATE_256K = 7,
+       V4L2_MPEG_AUDIO_L1_BITRATE_288K = 8,
+       V4L2_MPEG_AUDIO_L1_BITRATE_320K = 9,
+       V4L2_MPEG_AUDIO_L1_BITRATE_352K = 10,
+       V4L2_MPEG_AUDIO_L1_BITRATE_384K = 11,
+       V4L2_MPEG_AUDIO_L1_BITRATE_416K = 12,
+       V4L2_MPEG_AUDIO_L1_BITRATE_448K = 13,
+};
+#define V4L2_CID_MPEG_AUDIO_L2_BITRATE                 (V4L2_CID_MPEG_BASE+103)
+enum v4l2_mpeg_audio_l2_bitrate {
+       V4L2_MPEG_AUDIO_L2_BITRATE_32K  = 0,
+       V4L2_MPEG_AUDIO_L2_BITRATE_48K  = 1,
+       V4L2_MPEG_AUDIO_L2_BITRATE_56K  = 2,
+       V4L2_MPEG_AUDIO_L2_BITRATE_64K  = 3,
+       V4L2_MPEG_AUDIO_L2_BITRATE_80K  = 4,
+       V4L2_MPEG_AUDIO_L2_BITRATE_96K  = 5,
+       V4L2_MPEG_AUDIO_L2_BITRATE_112K = 6,
+       V4L2_MPEG_AUDIO_L2_BITRATE_128K = 7,
+       V4L2_MPEG_AUDIO_L2_BITRATE_160K = 8,
+       V4L2_MPEG_AUDIO_L2_BITRATE_192K = 9,
+       V4L2_MPEG_AUDIO_L2_BITRATE_224K = 10,
+       V4L2_MPEG_AUDIO_L2_BITRATE_256K = 11,
+       V4L2_MPEG_AUDIO_L2_BITRATE_320K = 12,
+       V4L2_MPEG_AUDIO_L2_BITRATE_384K = 13,
+};
+#define V4L2_CID_MPEG_AUDIO_L3_BITRATE                 (V4L2_CID_MPEG_BASE+104)
+enum v4l2_mpeg_audio_l3_bitrate {
+       V4L2_MPEG_AUDIO_L3_BITRATE_32K  = 0,
+       V4L2_MPEG_AUDIO_L3_BITRATE_40K  = 1,
+       V4L2_MPEG_AUDIO_L3_BITRATE_48K  = 2,
+       V4L2_MPEG_AUDIO_L3_BITRATE_56K  = 3,
+       V4L2_MPEG_AUDIO_L3_BITRATE_64K  = 4,
+       V4L2_MPEG_AUDIO_L3_BITRATE_80K  = 5,
+       V4L2_MPEG_AUDIO_L3_BITRATE_96K  = 6,
+       V4L2_MPEG_AUDIO_L3_BITRATE_112K = 7,
+       V4L2_MPEG_AUDIO_L3_BITRATE_128K = 8,
+       V4L2_MPEG_AUDIO_L3_BITRATE_160K = 9,
+       V4L2_MPEG_AUDIO_L3_BITRATE_192K = 10,
+       V4L2_MPEG_AUDIO_L3_BITRATE_224K = 11,
+       V4L2_MPEG_AUDIO_L3_BITRATE_256K = 12,
+       V4L2_MPEG_AUDIO_L3_BITRATE_320K = 13,
+};
+#define V4L2_CID_MPEG_AUDIO_MODE               (V4L2_CID_MPEG_BASE+105)
+enum v4l2_mpeg_audio_mode {
+       V4L2_MPEG_AUDIO_MODE_STEREO       = 0,
+       V4L2_MPEG_AUDIO_MODE_JOINT_STEREO = 1,
+       V4L2_MPEG_AUDIO_MODE_DUAL         = 2,
+       V4L2_MPEG_AUDIO_MODE_MONO         = 3,
+};
+#define V4L2_CID_MPEG_AUDIO_MODE_EXTENSION     (V4L2_CID_MPEG_BASE+106)
+enum v4l2_mpeg_audio_mode_extension {
+       V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_4  = 0,
+       V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_8  = 1,
+       V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_12 = 2,
+       V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_16 = 3,
+};
+#define V4L2_CID_MPEG_AUDIO_EMPHASIS           (V4L2_CID_MPEG_BASE+107)
+enum v4l2_mpeg_audio_emphasis {
+       V4L2_MPEG_AUDIO_EMPHASIS_NONE         = 0,
+       V4L2_MPEG_AUDIO_EMPHASIS_50_DIV_15_uS = 1,
+       V4L2_MPEG_AUDIO_EMPHASIS_CCITT_J17    = 2,
+};
+#define V4L2_CID_MPEG_AUDIO_CRC                (V4L2_CID_MPEG_BASE+108)
+enum v4l2_mpeg_audio_crc {
+       V4L2_MPEG_AUDIO_CRC_NONE  = 0,
+       V4L2_MPEG_AUDIO_CRC_CRC16 = 1,
+};
+
+/*  MPEG video */
+#define V4L2_CID_MPEG_VIDEO_ENCODING           (V4L2_CID_MPEG_BASE+200)
+enum v4l2_mpeg_video_encoding {
+       V4L2_MPEG_VIDEO_ENCODING_MPEG_1 = 0,
+       V4L2_MPEG_VIDEO_ENCODING_MPEG_2 = 1,
+};
+#define V4L2_CID_MPEG_VIDEO_ASPECT             (V4L2_CID_MPEG_BASE+201)
+enum v4l2_mpeg_video_aspect {
+       V4L2_MPEG_VIDEO_ASPECT_1x1     = 0,
+       V4L2_MPEG_VIDEO_ASPECT_4x3     = 1,
+       V4L2_MPEG_VIDEO_ASPECT_16x9    = 2,
+       V4L2_MPEG_VIDEO_ASPECT_221x100 = 3,
+};
+#define V4L2_CID_MPEG_VIDEO_B_FRAMES           (V4L2_CID_MPEG_BASE+202)
+#define V4L2_CID_MPEG_VIDEO_GOP_SIZE           (V4L2_CID_MPEG_BASE+203)
+#define V4L2_CID_MPEG_VIDEO_GOP_CLOSURE        (V4L2_CID_MPEG_BASE+204)
+#define V4L2_CID_MPEG_VIDEO_PULLDOWN           (V4L2_CID_MPEG_BASE+205)
+#define V4L2_CID_MPEG_VIDEO_BITRATE_MODE       (V4L2_CID_MPEG_BASE+206)
+enum v4l2_mpeg_video_bitrate_mode {
+       V4L2_MPEG_VIDEO_BITRATE_MODE_VBR = 0,
+       V4L2_MPEG_VIDEO_BITRATE_MODE_CBR = 1,
+};
+#define V4L2_CID_MPEG_VIDEO_BITRATE            (V4L2_CID_MPEG_BASE+207)
+#define V4L2_CID_MPEG_VIDEO_BITRATE_PEAK       (V4L2_CID_MPEG_BASE+208)
+#define V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION (V4L2_CID_MPEG_BASE+209)
+
+/*  MPEG-class control IDs specific to the CX2584x driver as defined by V4L2 */
+#define V4L2_CID_MPEG_CX2341X_BASE                             
(V4L2_CTRL_CLASS_MPEG | 0x1000)
+#define V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE        
(V4L2_CID_MPEG_CX2341X_BASE+0)
+enum v4l2_mpeg_cx2341x_video_spatial_filter_mode {
+       V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_MANUAL = 0,
+       V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO   = 1,
+};
+#define V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER             
(V4L2_CID_MPEG_CX2341X_BASE+1)
+#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE   
(V4L2_CID_MPEG_CX2341X_BASE+2)
+enum v4l2_mpeg_cx2341x_video_luma_spatial_filter_type {
+       V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_OFF                  = 
0,
+       V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_1D_HOR               = 
1,
+       V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_1D_VERT              = 
2,
+       V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_2D_HV_SEPARABLE      = 
3,
+       V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_2D_SYM_NON_SEPARABLE = 
4,
+};
+#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE         
(V4L2_CID_MPEG_CX2341X_BASE+3)
+enum v4l2_mpeg_cx2341x_video_chroma_spatial_filter_type {
+       V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_OFF    = 0,
+       V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_1D_HOR = 1,
+};
+#define V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE       
(V4L2_CID_MPEG_CX2341X_BASE+4)
+enum v4l2_mpeg_cx2341x_video_temporal_filter_mode {
+       V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_MANUAL = 0,
+       V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_AUTO   = 1,
+};
+#define V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER            
(V4L2_CID_MPEG_CX2341X_BASE+5)
+#define V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE                 
(V4L2_CID_MPEG_CX2341X_BASE+6)
+enum v4l2_mpeg_cx2341x_video_median_filter_type {
+       V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF      = 0,
+       V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_HOR      = 1,
+       V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_VERT     = 2,
+       V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_HOR_VERT = 3,
+       V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_DIAG     = 4,
+};
+#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM  
(V4L2_CID_MPEG_CX2341X_BASE+7)
+#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP     
(V4L2_CID_MPEG_CX2341X_BASE+8)
+#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM        
(V4L2_CID_MPEG_CX2341X_BASE+9)
+#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP   
(V4L2_CID_MPEG_CX2341X_BASE+10)
+
+/*
+ *     T U N I N G
+ */
+struct v4l2_tuner
+{
+       __u32                   index;
+       __u8                    name[32];
+       enum v4l2_tuner_type    type;
+       __u32                   capability;
+       __u32                   rangelow;
+       __u32                   rangehigh;
+       __u32                   rxsubchans;
+       __u32                   audmode;
+       __s32                   signal;
+       __s32                   afc;
+       __u32                   reserved[4];
+};
+
+struct v4l2_modulator
+{
+       __u32                   index;
+       __u8                    name[32];
+       __u32                   capability;
+       __u32                   rangelow;
+       __u32                   rangehigh;
+       __u32                   txsubchans;
+       __u32                   reserved[4];
+};
+
+/*  Flags for the 'capability' field */
+#define V4L2_TUNER_CAP_LOW             0x0001
+#define V4L2_TUNER_CAP_NORM            0x0002
+#define V4L2_TUNER_CAP_STEREO          0x0010
+#define V4L2_TUNER_CAP_LANG2           0x0020
+#define V4L2_TUNER_CAP_SAP             0x0020
+#define V4L2_TUNER_CAP_LANG1           0x0040
+
+/*  Flags for the 'rxsubchans' field */
+#define V4L2_TUNER_SUB_MONO            0x0001
+#define V4L2_TUNER_SUB_STEREO          0x0002
+#define V4L2_TUNER_SUB_LANG2           0x0004
+#define V4L2_TUNER_SUB_SAP             0x0004
+#define V4L2_TUNER_SUB_LANG1           0x0008
+
+/*  Values for the 'audmode' field */
+#define V4L2_TUNER_MODE_MONO           0x0000
+#define V4L2_TUNER_MODE_STEREO         0x0001
+#define V4L2_TUNER_MODE_LANG2          0x0002
+#define V4L2_TUNER_MODE_SAP            0x0002
+#define V4L2_TUNER_MODE_LANG1          0x0003
+#define V4L2_TUNER_MODE_LANG1_LANG2    0x0004
+
+struct v4l2_frequency
+{
+       __u32                 tuner;
+       enum v4l2_tuner_type  type;
+       __u32                 frequency;
+       __u32                 reserved[8];
+};
+
+/*
+ *     A U D I O
+ */
+struct v4l2_audio
+{
+       __u32   index;
+       __u8    name[32];
+       __u32   capability;
+       __u32   mode;
+       __u32   reserved[2];
+};
+
+/*  Flags for the 'capability' field */
+#define V4L2_AUDCAP_STEREO             0x00001
+#define V4L2_AUDCAP_AVL                        0x00002
+
+/*  Flags for the 'mode' field */
+#define V4L2_AUDMODE_AVL               0x00001
+
+struct v4l2_audioout
+{
+       __u32   index;
+       __u8    name[32];
+       __u32   capability;
+       __u32   mode;
+       __u32   reserved[2];
+};
+
+/*
+ *     D A T A   S E R V I C E S   ( V B I )
+ *
+ *     Data services API by Michael Schimek
+ */
+
+/* Raw VBI */
+struct v4l2_vbi_format
+{
+       __u32   sampling_rate;          /* in 1 Hz */
+       __u32   offset;
+       __u32   samples_per_line;
+       __u32   sample_format;          /* V4L2_PIX_FMT_* */
+       __s32   start[2];
+       __u32   count[2];
+       __u32   flags;                  /* V4L2_VBI_* */
+       __u32   reserved[2];            /* must be zero */
+};
+
+/*  VBI flags  */
+#define V4L2_VBI_UNSYNC                (1<< 0)
+#define V4L2_VBI_INTERLACED    (1<< 1)
+
+#if 1
+/* Sliced VBI
+ *
+ *    This implements is a proposal V4L2 API to allow SLICED VBI
+ * required for some hardware encoders. It should change without
+ * notice in the definitive implementation.
+ */
+
+struct v4l2_sliced_vbi_format
+{
+       __u16   service_set;
+       /* service_lines[0][...] specifies lines 0-23 (1-23 used) of the first 
field
+          service_lines[1][...] specifies lines 0-23 (1-23 used) of the second 
field
+                                (equals frame lines 313-336 for 625 line video
+                                 standards, 263-286 for 525 line standards) */
+       __u16   service_lines[2][24];
+       __u32   io_size;
+       __u32   reserved[2];            /* must be zero */
+};
+
+/* Teletext World System Teletext
+   (WST), defined on ITU-R BT.653-2 */
+#define V4L2_SLICED_TELETEXT_B          (0x0001)
+/* Video Program System, defined on ETS 300 231*/
+#define V4L2_SLICED_VPS                 (0x0400)
+/* Closed Caption, defined on EIA-608 */
+#define V4L2_SLICED_CAPTION_525         (0x1000)
+/* Wide Screen System, defined on ITU-R BT1119.1 */
+#define V4L2_SLICED_WSS_625             (0x4000)
+
+#define V4L2_SLICED_VBI_525             (V4L2_SLICED_CAPTION_525)
+#define V4L2_SLICED_VBI_625             (V4L2_SLICED_TELETEXT_B | 
V4L2_SLICED_VPS | V4L2_SLICED_WSS_625)
+
+
+struct v4l2_sliced_vbi_cap
+{
+       __u16   service_set;
+       /* service_lines[0][...] specifies lines 0-23 (1-23 used) of the first 
field
+          service_lines[1][...] specifies lines 0-23 (1-23 used) of the second 
field
+                                (equals frame lines 313-336 for 625 line video
+                                 standards, 263-286 for 525 line standards) */
+       __u16   service_lines[2][24];
+       __u32   reserved[4];    /* must be 0 */
+};
+
+struct v4l2_sliced_vbi_data
+{
+       __u32   id;
+       __u32   field;          /* 0: first field, 1: second field */
+       __u32   line;           /* 1-23 */
+       __u32   reserved;       /* must be 0 */
+       __u8    data[48];
+};
+#endif
+
+/*
+ *     A G G R E G A T E   S T R U C T U R E S
+ */
+
+/*     Stream data format
+ */
+#ifndef _WIN32
+struct v4l2_format
+{
+       enum v4l2_buf_type type;
+       union
+       {
+               struct v4l2_pix_format          pix;     // 
V4L2_BUF_TYPE_VIDEO_CAPTURE
+               struct v4l2_window              win;     // 
V4L2_BUF_TYPE_VIDEO_OVERLAY
+               struct v4l2_vbi_format          vbi;     // 
V4L2_BUF_TYPE_VBI_CAPTURE
+#if 1
+               struct v4l2_sliced_vbi_format   sliced;  // 
V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
+#endif
+               __u8    raw_data[200];                   // user-defined
+       } fmt;
+};
+
+
+/*     Stream type-dependent parameters
+ */
+struct v4l2_streamparm
+{
+       enum v4l2_buf_type type;
+       union
+       {
+               struct v4l2_captureparm capture;
+               struct v4l2_outputparm  output;
+               __u8    raw_data[200];  /* user-defined */
+       } parm;
+};
+#endif _WIN32
+/*
+ *     I O C T L   C O D E S   F O R   V I D E O   D E V I C E S
+ *
+ */
+#define VIDIOC_QUERYCAP                _IOR  ('V',  0, struct v4l2_capability)
+#define VIDIOC_RESERVED                _IO   ('V',  1)
+#define VIDIOC_ENUM_FMT         _IOWR ('V',  2, struct v4l2_fmtdesc)
+#define VIDIOC_G_FMT           _IOWR ('V',  4, struct v4l2_format)
+#define VIDIOC_S_FMT           _IOWR ('V',  5, struct v4l2_format)
+#ifdef __KERNEL__
+#define VIDIOC_G_MPEGCOMP       _IOR  ('V',  6, struct v4l2_mpeg_compression)
+#define VIDIOC_S_MPEGCOMP      _IOW  ('V',  7, struct v4l2_mpeg_compression)
+#endif
+#define VIDIOC_REQBUFS         _IOWR ('V',  8, struct v4l2_requestbuffers)
+#define VIDIOC_QUERYBUF                _IOWR ('V',  9, struct v4l2_buffer)
+#define VIDIOC_G_FBUF          _IOR  ('V', 10, struct v4l2_framebuffer)
+#define VIDIOC_S_FBUF          _IOW  ('V', 11, struct v4l2_framebuffer)
+#define VIDIOC_OVERLAY         _IOW  ('V', 14, int)
+#define VIDIOC_QBUF            _IOWR ('V', 15, struct v4l2_buffer)
+#define VIDIOC_DQBUF           _IOWR ('V', 17, struct v4l2_buffer)
+#define VIDIOC_STREAMON                _IOW  ('V', 18, int)
+#define VIDIOC_STREAMOFF       _IOW  ('V', 19, int)
+#define VIDIOC_G_PARM          _IOWR ('V', 21, struct v4l2_streamparm)
+#define VIDIOC_S_PARM          _IOWR ('V', 22, struct v4l2_streamparm)
+#define VIDIOC_G_STD           _IOR  ('V', 23, v4l2_std_id)
+#define VIDIOC_S_STD           _IOW  ('V', 24, v4l2_std_id)
+#define VIDIOC_ENUMSTD         _IOWR ('V', 25, struct v4l2_standard)
+#define VIDIOC_ENUMINPUT       _IOWR ('V', 26, struct v4l2_input)
+#define VIDIOC_G_CTRL          _IOWR ('V', 27, struct v4l2_control)
+#define VIDIOC_S_CTRL          _IOWR ('V', 28, struct v4l2_control)
+#define VIDIOC_G_TUNER         _IOWR ('V', 29, struct v4l2_tuner)
+#define VIDIOC_S_TUNER         _IOW  ('V', 30, struct v4l2_tuner)
+#define VIDIOC_G_AUDIO         _IOR  ('V', 33, struct v4l2_audio)
+#define VIDIOC_S_AUDIO         _IOW  ('V', 34, struct v4l2_audio)
+#define VIDIOC_QUERYCTRL       _IOWR ('V', 36, struct v4l2_queryctrl)
+#define VIDIOC_QUERYMENU       _IOWR ('V', 37, struct v4l2_querymenu)
+#define VIDIOC_G_INPUT         _IOR  ('V', 38, int)
+#define VIDIOC_S_INPUT         _IOWR ('V', 39, int)
+#define VIDIOC_G_OUTPUT                _IOR  ('V', 46, int)
+#define VIDIOC_S_OUTPUT                _IOWR ('V', 47, int)
+#define VIDIOC_ENUMOUTPUT      _IOWR ('V', 48, struct v4l2_output)
+#define VIDIOC_G_AUDOUT                _IOR  ('V', 49, struct v4l2_audioout)
+#define VIDIOC_S_AUDOUT                _IOW  ('V', 50, struct v4l2_audioout)
+#define VIDIOC_G_MODULATOR     _IOWR ('V', 54, struct v4l2_modulator)
+#define VIDIOC_S_MODULATOR     _IOW  ('V', 55, struct v4l2_modulator)
+#define VIDIOC_G_FREQUENCY     _IOWR ('V', 56, struct v4l2_frequency)
+#define VIDIOC_S_FREQUENCY     _IOW  ('V', 57, struct v4l2_frequency)
+#define VIDIOC_CROPCAP         _IOWR ('V', 58, struct v4l2_cropcap)
+#define VIDIOC_G_CROP          _IOWR ('V', 59, struct v4l2_crop)
+#define VIDIOC_S_CROP          _IOW  ('V', 60, struct v4l2_crop)
+#define VIDIOC_G_JPEGCOMP      _IOR  ('V', 61, struct v4l2_jpegcompression)
+#define VIDIOC_S_JPEGCOMP      _IOW  ('V', 62, struct v4l2_jpegcompression)
+#define VIDIOC_QUERYSTD        _IOR  ('V', 63, v4l2_std_id)
+#define VIDIOC_TRY_FMT         _IOWR ('V', 64, struct v4l2_format)
+#define VIDIOC_ENUMAUDIO       _IOWR ('V', 65, struct v4l2_audio)
+#define VIDIOC_ENUMAUDOUT      _IOWR ('V', 66, struct v4l2_audioout)
+#define VIDIOC_G_PRIORITY       _IOR  ('V', 67, enum v4l2_priority)
+#define VIDIOC_S_PRIORITY       _IOW  ('V', 68, enum v4l2_priority)
+#if 1
+#define VIDIOC_G_SLICED_VBI_CAP _IOR  ('V', 69, struct v4l2_sliced_vbi_cap)
+#endif
+#define VIDIOC_LOG_STATUS       _IO   ('V', 70)
+#define VIDIOC_G_EXT_CTRLS     _IOWR ('V', 71, struct v4l2_ext_controls)
+#define VIDIOC_S_EXT_CTRLS     _IOWR ('V', 72, struct v4l2_ext_controls)
+#define VIDIOC_TRY_EXT_CTRLS   _IOWR ('V', 73, struct v4l2_ext_controls)
+
+#ifdef __OLD_VIDIOC_
+/* for compatibility, will go away some day */
+#define VIDIOC_OVERLAY_OLD             _IOWR ('V', 14, int)
+#define VIDIOC_S_PARM_OLD              _IOW  ('V', 22, struct v4l2_streamparm)
+#define VIDIOC_S_CTRL_OLD              _IOW  ('V', 28, struct v4l2_control)
+#define VIDIOC_G_AUDIO_OLD             _IOWR ('V', 33, struct v4l2_audio)
+#define VIDIOC_G_AUDOUT_OLD            _IOWR ('V', 49, struct v4l2_audioout)
+#define VIDIOC_CROPCAP_OLD             _IOR  ('V', 58, struct v4l2_cropcap)
+#endif
+
+#define BASE_VIDIOC_PRIVATE    192             /* 192-255 are private */
+
+#endif /* __LINUX_VIDEODEV2_H */
+
+/*
+ * Local variables:
+ * c-basic-offset: 8
+ * End:
+ */
diff -Naur libpwc-20060524/borrowed/videodev.h 
libpwc-20060524-win32/borrowed/videodev.h
--- libpwc-20060524/borrowed/videodev.h 1970-01-01 01:00:00.000000000 +0100
+++ libpwc-20060524-win32/borrowed/videodev.h   2007-05-27 22:00:37.000000000 
+0200
@@ -0,0 +1,351 @@
+/*
+ *     Video for Linux version 1 - OBSOLETE
+ *
+ *     Header file for v4l1 drivers and applications, for
+ *     Linux kernels 2.2.x or 2.4.x.
+ *
+ *     Provides header for legacy drivers and applications
+ *
+ *     See http://linuxtv.org for more info
+ *
+ */
+#ifndef __LINUX_VIDEODEV_H
+#define __LINUX_VIDEODEV_H
+
+#ifdef _WIN32
+       #include "borrowed/videodev2.h"
+#else
+       #include "linux/videodev2.h"
+#endif
+
+#if defined(CONFIG_VIDEO_V4L1_COMPAT) || !defined (__KERNEL__)
+
+struct video_capability
+{
+       char name[32];
+       int type;
+       int channels;   /* Num channels */
+       int audios;     /* Num audio devices */
+       int maxwidth;   /* Supported width */
+       int maxheight;  /* And height */
+       int minwidth;   /* Supported width */
+       int minheight;  /* And height */
+};
+
+
+struct video_channel
+{
+       int channel;
+       char name[32];
+       int tuners;
+       __u32  flags;
+#define VIDEO_VC_TUNER         1       /* Channel has a tuner */
+#define VIDEO_VC_AUDIO         2       /* Channel has audio */
+       __u16  type;
+#define VIDEO_TYPE_TV          1
+#define VIDEO_TYPE_CAMERA      2
+       __u16 norm;                     /* Norm set by channel */
+};
+
+struct video_tuner
+{
+       int tuner;
+       char name[32];
+       unsigned long rangelow, rangehigh;      /* Tuner range */
+       __u32 flags;
+#define VIDEO_TUNER_PAL                1
+#define VIDEO_TUNER_NTSC       2
+#define VIDEO_TUNER_SECAM      4
+#define VIDEO_TUNER_LOW                8       /* Uses KHz not MHz */
+#define VIDEO_TUNER_NORM       16      /* Tuner can set norm */
+#define VIDEO_TUNER_STEREO_ON  128     /* Tuner is seeing stereo */
+#define VIDEO_TUNER_RDS_ON      256     /* Tuner is seeing an RDS datastream */
+#define VIDEO_TUNER_MBS_ON      512     /* Tuner is seeing an MBS datastream */
+       __u16 mode;                     /* PAL/NTSC/SECAM/OTHER */
+#define VIDEO_MODE_PAL         0
+#define VIDEO_MODE_NTSC                1
+#define VIDEO_MODE_SECAM       2
+#define VIDEO_MODE_AUTO                3
+       __u16 signal;                   /* Signal strength 16bit scale */
+};
+
+struct video_picture
+{
+       __u16   brightness;
+       __u16   hue;
+       __u16   colour;
+       __u16   contrast;
+       __u16   whiteness;      /* Black and white only */
+       __u16   depth;          /* Capture depth */
+       __u16   palette;        /* Palette in use */
+#define VIDEO_PALETTE_GREY     1       /* Linear greyscale */
+#define VIDEO_PALETTE_HI240    2       /* High 240 cube (BT848) */
+#define VIDEO_PALETTE_RGB565   3       /* 565 16 bit RGB */
+#define VIDEO_PALETTE_RGB24    4       /* 24bit RGB */
+#define VIDEO_PALETTE_RGB32    5       /* 32bit RGB */
+#define VIDEO_PALETTE_RGB555   6       /* 555 15bit RGB */
+#define VIDEO_PALETTE_YUV422   7       /* YUV422 capture */
+#define VIDEO_PALETTE_YUYV     8
+#define VIDEO_PALETTE_UYVY     9       /* The great thing about standards is 
... */
+#define VIDEO_PALETTE_YUV420   10
+#define VIDEO_PALETTE_YUV411   11      /* YUV411 capture */
+#define VIDEO_PALETTE_RAW      12      /* RAW capture (BT848) */
+#define VIDEO_PALETTE_YUV422P  13      /* YUV 4:2:2 Planar */
+#define VIDEO_PALETTE_YUV411P  14      /* YUV 4:1:1 Planar */
+#define VIDEO_PALETTE_YUV420P  15      /* YUV 4:2:0 Planar */
+#define VIDEO_PALETTE_YUV410P  16      /* YUV 4:1:0 Planar */
+#define VIDEO_PALETTE_PLANAR   13      /* start of planar entries */
+#define VIDEO_PALETTE_COMPONENT 7      /* start of component entries */
+};
+
+struct video_audio
+{
+       int     audio;          /* Audio channel */
+       __u16   volume;         /* If settable */
+       __u16   bass, treble;
+       __u32   flags;
+#define VIDEO_AUDIO_MUTE       1
+#define VIDEO_AUDIO_MUTABLE    2
+#define VIDEO_AUDIO_VOLUME     4
+#define VIDEO_AUDIO_BASS       8
+#define VIDEO_AUDIO_TREBLE     16
+#define VIDEO_AUDIO_BALANCE    32
+       char    name[16];
+#define VIDEO_SOUND_MONO       1
+#define VIDEO_SOUND_STEREO     2
+#define VIDEO_SOUND_LANG1      4
+#define VIDEO_SOUND_LANG2      8
+       __u16   mode;
+       __u16   balance;        /* Stereo balance */
+       __u16   step;           /* Step actual volume uses */
+};
+
+struct video_clip
+{
+       __s32   x,y;
+       __s32   width, height;
+       struct  video_clip *next;       /* For user use/driver use only */
+};
+
+struct video_window
+{
+       __u32   x,y;                    /* Position of window */
+       __u32   width,height;           /* Its size */
+       __u32   chromakey;
+       __u32   flags;
+       struct  video_clip __user *clips;       /* Set only */
+       int     clipcount;
+#define VIDEO_WINDOW_INTERLACE 1
+#define VIDEO_WINDOW_CHROMAKEY 16      /* Overlay by chromakey */
+#define VIDEO_CLIP_BITMAP      -1
+/* bitmap is 1024x625, a '1' bit represents a clipped pixel */
+#define VIDEO_CLIPMAP_SIZE     (128 * 625)
+};
+
+struct video_capture
+{
+       __u32   x,y;                    /* Offsets into image */
+       __u32   width, height;          /* Area to capture */
+       __u16   decimation;             /* Decimation divider */
+       __u16   flags;                  /* Flags for capture */
+#define VIDEO_CAPTURE_ODD              0       /* Temporal */
+#define VIDEO_CAPTURE_EVEN             1
+};
+
+struct video_buffer
+{
+       void    *base;
+       int     height,width;
+       int     depth;
+       int     bytesperline;
+};
+
+struct video_mmap
+{
+       unsigned        int frame;              /* Frame (0 - n) for double 
buffer */
+       int             height,width;
+       unsigned        int format;             /* should be VIDEO_PALETTE_* */
+};
+
+struct video_key
+{
+       __u8    key[8];
+       __u32   flags;
+};
+
+struct video_mbuf
+{
+       int     size;           /* Total memory to map */
+       int     frames;         /* Frames */
+       int     offsets[VIDEO_MAX_FRAME];
+};
+
+#define        VIDEO_NO_UNIT   (-1)
+
+struct video_unit
+{
+       int     video;          /* Video minor */
+       int     vbi;            /* VBI minor */
+       int     radio;          /* Radio minor */
+       int     audio;          /* Audio minor */
+       int     teletext;       /* Teletext minor */
+};
+
+struct vbi_format {
+       __u32   sampling_rate;  /* in Hz */
+       __u32   samples_per_line;
+       __u32   sample_format;  /* VIDEO_PALETTE_RAW only (1 byte) */
+       __s32   start[2];       /* starting line for each frame */
+       __u32   count[2];       /* count of lines for each frame */
+       __u32   flags;
+#define        VBI_UNSYNC      1       /* can distingues between top/bottom 
field */
+#define        VBI_INTERLACED  2       /* lines are interlaced */
+};
+
+/* video_info is biased towards hardware mpeg encode/decode */
+/* but it could apply generically to any hardware compressor/decompressor */
+struct video_info
+{
+       __u32   frame_count;    /* frames output since decode/encode began */
+       __u32   h_size;         /* current unscaled horizontal size */
+       __u32   v_size;         /* current unscaled veritcal size */
+       __u32   smpte_timecode; /* current SMPTE timecode (for current GOP) */
+       __u32   picture_type;   /* current picture type */
+       __u32   temporal_reference;     /* current temporal reference */
+       __u8    user_data[256]; /* user data last found in compressed stream */
+       /* user_data[0] contains user data flags, user_data[1] has count */
+};
+
+/* generic structure for setting playback modes */
+struct video_play_mode
+{
+       int     mode;
+       int     p1;
+       int     p2;
+};
+
+/* for loading microcode / fpga programming */
+struct video_code
+{
+       char    loadwhat[16];   /* name or tag of file being passed */
+       int     datasize;
+       __u8    *data;
+};
+
+#define VIDIOCGCAP             _IOR('v',1,struct video_capability)     /* Get 
capabilities */
+#define VIDIOCGCHAN            _IOWR('v',2,struct video_channel)       /* Get 
channel info (sources) */
+#define VIDIOCSCHAN            _IOW('v',3,struct video_channel)        /* Set 
channel  */
+#define VIDIOCGTUNER           _IOWR('v',4,struct video_tuner)         /* Get 
tuner abilities */
+#define VIDIOCSTUNER           _IOW('v',5,struct video_tuner)          /* Tune 
the tuner for the current channel */
+#define VIDIOCGPICT            _IOR('v',6,struct video_picture)        /* Get 
picture properties */
+#define VIDIOCSPICT            _IOW('v',7,struct video_picture)        /* Set 
picture properties */
+#define VIDIOCCAPTURE          _IOW('v',8,int)                         /* 
Start, end capture */
+#define VIDIOCGWIN             _IOR('v',9, struct video_window)        /* Get 
the video overlay window */
+#define VIDIOCSWIN             _IOW('v',10, struct video_window)       /* Set 
the video overlay window - passes clip list for hardware smarts , chromakey etc 
*/
+#define VIDIOCGFBUF            _IOR('v',11, struct video_buffer)       /* Get 
frame buffer */
+#define VIDIOCSFBUF            _IOW('v',12, struct video_buffer)       /* Set 
frame buffer - root only */
+#define VIDIOCKEY              _IOR('v',13, struct video_key)          /* 
Video key event - to dev 255 is to all - cuts capture on all DMA windows with 
this key (0xFFFFFFFF == all) */
+#define VIDIOCGFREQ            _IOR('v',14, unsigned long)             /* Set 
tuner */
+#define VIDIOCSFREQ            _IOW('v',15, unsigned long)             /* Set 
tuner */
+#define VIDIOCGAUDIO           _IOR('v',16, struct video_audio)        /* Get 
audio info */
+#define VIDIOCSAUDIO           _IOW('v',17, struct video_audio)        /* 
Audio source, mute etc */
+#define VIDIOCSYNC             _IOW('v',18, int)                       /* Sync 
with mmap grabbing */
+#define VIDIOCMCAPTURE         _IOW('v',19, struct video_mmap)         /* Grab 
frames */
+#define VIDIOCGMBUF            _IOR('v',20, struct video_mbuf)         /* 
Memory map buffer info */
+#define VIDIOCGUNIT            _IOR('v',21, struct video_unit)         /* Get 
attached units */
+#define VIDIOCGCAPTURE         _IOR('v',22, struct video_capture)      /* Get 
subcapture */
+#define VIDIOCSCAPTURE         _IOW('v',23, struct video_capture)      /* Set 
subcapture */
+#define VIDIOCSPLAYMODE                _IOW('v',24, struct video_play_mode)    
/* Set output video mode/feature */
+#define VIDIOCSWRITEMODE       _IOW('v',25, int)                       /* Set 
write mode */
+#define VIDIOCGPLAYINFO                _IOR('v',26, struct video_info)         
/* Get current playback info from hardware */
+#define VIDIOCSMICROCODE       _IOW('v',27, struct video_code)         /* Load 
microcode into hardware */
+#define        VIDIOCGVBIFMT           _IOR('v',28, struct vbi_format)         
/* Get VBI information */
+#define        VIDIOCSVBIFMT           _IOW('v',29, struct vbi_format)         
/* Set VBI information */
+
+
+#define BASE_VIDIOCPRIVATE     192             /* 192-255 are private */
+
+/* VIDIOCSWRITEMODE */
+#define VID_WRITE_MPEG_AUD             0
+#define VID_WRITE_MPEG_VID             1
+#define VID_WRITE_OSD                  2
+#define VID_WRITE_TTX                  3
+#define VID_WRITE_CC                   4
+#define VID_WRITE_MJPEG                        5
+
+/* VIDIOCSPLAYMODE */
+#define VID_PLAY_VID_OUT_MODE          0
+       /* p1: = VIDEO_MODE_PAL, VIDEO_MODE_NTSC, etc ... */
+#define VID_PLAY_GENLOCK               1
+       /* p1: 0 = OFF, 1 = ON */
+       /* p2: GENLOCK FINE DELAY value */
+#define VID_PLAY_NORMAL                        2
+#define VID_PLAY_PAUSE                 3
+#define VID_PLAY_SINGLE_FRAME          4
+#define VID_PLAY_FAST_FORWARD          5
+#define VID_PLAY_SLOW_MOTION           6
+#define VID_PLAY_IMMEDIATE_NORMAL      7
+#define VID_PLAY_SWITCH_CHANNELS       8
+#define VID_PLAY_FREEZE_FRAME          9
+#define VID_PLAY_STILL_MODE            10
+#define VID_PLAY_MASTER_MODE           11
+       /* p1: see below */
+#define                VID_PLAY_MASTER_NONE    1
+#define                VID_PLAY_MASTER_VIDEO   2
+#define                VID_PLAY_MASTER_AUDIO   3
+#define VID_PLAY_ACTIVE_SCANLINES      12
+       /* p1 = first active; p2 = last active */
+#define VID_PLAY_RESET                 13
+#define VID_PLAY_END_MARK              14
+
+
+
+#define VID_HARDWARE_BT848     1
+#define VID_HARDWARE_QCAM_BW   2
+#define VID_HARDWARE_PMS       3
+#define VID_HARDWARE_QCAM_C    4
+#define VID_HARDWARE_PSEUDO    5
+#define VID_HARDWARE_SAA5249   6
+#define VID_HARDWARE_AZTECH    7
+#define VID_HARDWARE_SF16MI    8
+#define VID_HARDWARE_RTRACK    9
+#define VID_HARDWARE_ZOLTRIX   10
+#define VID_HARDWARE_SAA7146    11
+#define VID_HARDWARE_VIDEUM    12      /* Reserved for Winnov videum */
+#define VID_HARDWARE_RTRACK2   13
+#define VID_HARDWARE_PERMEDIA2 14      /* Reserved for Permedia2 */
+#define VID_HARDWARE_RIVA128   15      /* Reserved for RIVA 128 */
+#define VID_HARDWARE_PLANB     16      /* PowerMac motherboard video-in */
+#define VID_HARDWARE_BROADWAY  17      /* Broadway project */
+#define VID_HARDWARE_GEMTEK    18
+#define VID_HARDWARE_TYPHOON   19
+#define VID_HARDWARE_VINO      20      /* SGI Indy Vino */
+#define VID_HARDWARE_CADET     21      /* Cadet radio */
+#define VID_HARDWARE_TRUST     22      /* Trust FM Radio */
+#define VID_HARDWARE_TERRATEC  23      /* TerraTec ActiveRadio */
+#define VID_HARDWARE_CPIA      24
+#define VID_HARDWARE_ZR36120   25      /* Zoran ZR36120/ZR36125 */
+#define VID_HARDWARE_ZR36067   26      /* Zoran ZR36067/36060 */
+#define VID_HARDWARE_OV511     27
+#define VID_HARDWARE_ZR356700  28      /* Zoran 36700 series */
+#define VID_HARDWARE_W9966     29
+#define VID_HARDWARE_SE401     30      /* SE401 USB webcams */
+#define VID_HARDWARE_PWC       31      /* Philips webcams */
+#define VID_HARDWARE_MEYE      32      /* Sony Vaio MotionEye cameras */
+#define VID_HARDWARE_CPIA2     33
+#define VID_HARDWARE_VICAM      34
+#define VID_HARDWARE_SF16FMR2  35
+#define VID_HARDWARE_W9968CF   36
+#define VID_HARDWARE_SAA7114H   37
+#define VID_HARDWARE_SN9C102   38
+#define VID_HARDWARE_ARV       39
+
+#endif /* CONFIG_VIDEO_V4L1_COMPAT */
+
+#endif /* __LINUX_VIDEODEV_H */
+
+/*
+ * Local variables:
+ * c-basic-offset: 8
+ * End:
+ */
diff -Naur libpwc-20060524/convert.c libpwc-20060524-win32/convert.c
--- libpwc-20060524/convert.c   2007-05-27 22:00:25.000000000 +0200
+++ libpwc-20060524-win32/convert.c     2007-05-27 22:00:29.000000000 +0200
@@ -44,8 +44,13 @@
    fflush(stderr); \
 } while(0)
 #else
-#define error(fmt, args...) do { return -1; } while(0)
-#define trace(fmt, args...) do { } while (0)
+#ifndef _WIN32
+       #define error(fmt, args...) do { return -1; } while(0)
+       #define trace(fmt, args...) do { } while (0)
+#else
+       #define error(args) do { return -1; } while(0)
+       #define trace(args) do { } while (0)
+#endif
 #endif
 
 
@@ -185,7 +190,11 @@
 #define BLACK_U 128
 #define BLACK_V 128
 
+#ifdef _WIN32
+static unsigned short ple16_to_cpu(const void *arg)
+#else
 static inline unsigned short ple16_to_cpu(const void *arg)
+#endif
 {
   const unsigned char *data = arg;
   return data[0] | (data[1]<<8);
diff -Naur libpwc-20060524/convert.c.bak libpwc-20060524-win32/convert.c.bak
--- libpwc-20060524/convert.c.bak       1970-01-01 01:00:00.000000000 +0100
+++ libpwc-20060524-win32/convert.c.bak 2007-05-27 22:00:29.000000000 +0200
@@ -0,0 +1,1047 @@
+/*
+ * Colorspace conversion routine
+ *
+ * (C) 2006  Luc Saillard 
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ */
+
+
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include "libpwc.h"
+#include "pwc-dec23.h"
+
+#if 0
+#include <stdio.h>
+#define error(fmt, args...) do { \
+   fprintf(stderr, fmt, ## args); \
+   fflush(stderr); \
+   return -1; \
+} while(0)
+
+#define trace(fmt, args...) do { \
+   fprintf(stderr, fmt, ## args); \
+   fflush(stderr); \
+} while(0)
+#else
+#ifndef _WIN32
+       #define error(fmt, args...) do { return -1; } while(0)
+       #define trace(fmt, args...) do { } while (0)
+#else
+       #define error(args) do { return -1; } while(0)
+       #define trace(args) do { } while (0)
+#endif
+#endif
+
+
+#define SCALEBITS 10
+#define ONE_HALF  (1UL << (SCALEBITS - 1))
+#define FIX(x)    ((int) ((x) * (1UL<<SCALEBITS) + 0.5))
+
+#define CROP(x) \
+  (((x)<=0)?0:(((x)>=255)?255:(x)))
+
+/*
+ * Please note when converting colorspace from YUV to RGB.
+ * Not all YUV have the same colorspace. 
+ *
+ * The conversion equations to be implemented are therefore
+ *      Y  =  0.29900 * R + 0.58700 * G + 0.11400 * B  [ 0 ... 1 ]
+ *      Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B   [ -0.5 ... 0.5 ]
+ *      Cr =  0.50000 * R - 0.41869 * G - 0.08131 * B   [ -0.5 ... 0.5 ]
+ * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
+ */
+#define LOAD_UV_FOR_RGB(u_in, v_in)                    \
+  do {                                                 \
+     cb = (*u_in++) - 128;                             \
+     cr = (*v_in++) - 128;                             \
+     r_add = FIX(1.40200*255.0/224.0) * cr + ONE_HALF; \
+     g_add = ONE_HALF - (FIX(0.34414*255.0/224.0) * cb)        \
+                     - (FIX(0.71414*255.0/224.0) * cr);\
+     b_add = FIX(1.77200*255.0/224.0) * cb + ONE_HALF; \
+  } while(0)
+
+#define RGB_OUT(y_in, y_out, r_add, g_add, b_add)      \
+  do { \
+     int y = ((*y_in++) - 16) * FIX(255.0/219.0);      \
+     *y_out++ = CROP((y + r_add) >> SCALEBITS);                \
+     *y_out++ = CROP((y + g_add) >> SCALEBITS);                \
+     *y_out++ = CROP((y + b_add) >> SCALEBITS);                \
+  } while(0)
+
+#define BGR_OUT(y_in, y_out)                           \
+  do {                                                         \
+     int y = ((*y_in++) - 16) * FIX(255.0/219.0);      \
+     *y_out++ = CROP((y + b_add) >> SCALEBITS);                \
+     *y_out++ = CROP((y + g_add) >> SCALEBITS);                \
+     *y_out++ = CROP((y + r_add) >> SCALEBITS);                \
+  } while(0)
+
+#define RGBA_OUT(y_in, y_out, r_add, g_add, b_add) \
+  do { \
+     int y = ((*y_in++) - 16) * FIX(255.0/219.0); \
+     *y_out++ = CROP((y + r_add) >> SCALEBITS); \
+     *y_out++ = CROP((y + g_add) >> SCALEBITS); \
+     *y_out++ = CROP((y + b_add) >> SCALEBITS); \
+     y_out++; \
+  } while(0)
+
+#define BGRA_OUT(y_in, y_out, r_add, g_add, b_add) \
+  do { \
+     int y = ((*y_in++) - 16) * FIX(255.0/219.0); \
+     *y_out++ = CROP((y + b_add) >> SCALEBITS); \
+     *y_out++ = CROP((y + g_add) >> SCALEBITS); \
+     *y_out++ = CROP((y + r_add) >> SCALEBITS); \
+     y_out++; \
+  } while(0)
+
+/*
+ * The conversion equations to be implemented are therefore
+ *      Y  =  0.29900 * R + 0.58700 * G + 0.11400 * B  [ 0 ... 1 ]
+ *      Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B   [ -0.5 ... 0.5 ]
+ *      Cr =  0.50000 * R - 0.41869 * G - 0.08131 * B   [ -0.5 ... 0.5 ]
+ * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
+ */
+#define RGB_TO_Y(r, g, b)   \
+  (                         \
+     (                      \
+         FIX(0.29900) * (r) \
+       + FIX(0.58700) * (g) \
+       + FIX(0.11400) * (b) \
+       + ONE_HALF           \
+     ) >> SCALEBITS         \
+  )
+
+
+/* one U for 4 pixels, so divide by 4 the result */
+#define RGB_TO_U(r, g, b)      \
+  (                            \
+     (                         \
+        (  0                   \
+          - FIX(0.16874) * r   \
+          - FIX(0.33126) * g   \
+          + FIX(0.50000) * b   \
+          + (ONE_HALF * 4) - 1 \
+       ) >> (SCALEBITS + 2)    \
+     ) + 128                   \
+  )
+
+#define RGB_TO_V(r, g, b)      \
+  (                            \
+     (                         \
+        (                      \
+          - FIX(0.50000) * r   \
+          - FIX(0.41869) * g   \
+          + FIX(0.08131) * b   \
+          + (ONE_HALF * 4) - 1 \
+       ) >> (SCALEBITS + 2)    \
+     ) + 128                   \
+  )
+
+#define LOAD_RGB_FOR_YUV(rgb)          \
+  do {                                         \
+     r_sum = r = *rgb++;               \
+     g_sum = g = *rgb++;               \
+     b_sum = b = *rgb++;               \
+  } while(0)
+
+#define LOAD_AND_ADD_RGB_FOR_YUV(rgb)  \
+  do {                                         \
+     r_sum += (r = *rgb++);            \
+     g_sum += (g = *rgb++);            \
+     b_sum += (b = *rgb++);            \
+  } while(0)
+
+#define LOAD_BGR_FOR_YUV(rgb)          \
+  do {                                         \
+     b_sum = b = *rgb++;               \
+     g_sum = g = *rgb++;               \
+     r_sum = r = *rgb++;               \
+  } while(0)
+
+#define LOAD_AND_ADD_BGR_FOR_YUV(rgb)  \
+  do {                                         \
+     b_sum += (b = *rgb++);            \
+     g_sum += (g = *rgb++);            \
+     r_sum += (r = *rgb++);            \
+  } while(0)
+ 
+#define BLACK_Y 0
+#define BLACK_U 128
+#define BLACK_V 128
+
+static unsigned short ple16_to_cpu(const void *arg)
+{
+  const unsigned char *data = arg;
+  return data[0] | (data[1]<<8);
+}
+
+static int v4l_alloc_buffers(struct format_t *fmt)
+{
+  unsigned int buffer_len;
+  const int w = fmt->width;
+  const int h = fmt->height;
+
+  switch (fmt->format) {
+    case V4L2_PIX_FMT_YUYV:
+    case V4L2_PIX_FMT_UYVY:
+      buffer_len = w * h * 2;
+      fmt->data[0] = malloc(buffer_len);
+      break;
+
+    case V4L2_PIX_FMT_YUV420:
+      buffer_len = w * h * 3 / 2;
+      fmt->data[0] = malloc(buffer_len);
+      fmt->data[1] = fmt->data[0] + (w*h);
+      fmt->data[2] = fmt->data[0] + (w*h) + (w*h)/4;
+      break;
+
+    case V4L2_PIX_FMT_RGB24:
+    case V4L2_PIX_FMT_BGR24:
+      buffer_len = w * h * 3;
+      fmt->data[0] = malloc(buffer_len);
+      fmt->data[1] = NULL;
+      fmt->data[2] = NULL;
+      break;
+
+    case V4L2_PIX_FMT_SBGGR8:
+      buffer_len = w * h;
+      fmt->data[0] = malloc(buffer_len);
+      fmt->data[1] = NULL;
+      fmt->data[2] = NULL;
+      break;
+
+    default:
+      error("Output buffer is not allocated, and we can't allocate the 
buffer\n");
+      return -1;
+  }
+
+  return 0;
+}
+
+
+static int pwc_rgb24_to_yuv420p_resize(struct format_t *in, struct format_t 
*out)
+{
+
+
+  return 0;
+}
+
+static int pwc_rgb24_to_yuv420p_same_size(struct format_t *in, struct format_t 
*out)
+{
+  unsigned int x;
+  const unsigned char *rgbline1, *rgbline2;
+  unsigned char *dyline1, *dyline2;
+  unsigned int width = in->width;
+  unsigned int height = in->height;
+  const unsigned char *rgb = in->data[0];
+  unsigned char *dy = out->data[0];
+  unsigned char *du = out->data[1];
+  unsigned char *dv = out->data[2];
+  unsigned int rgb_offset_to_next_line = width*3;
+  unsigned int y_offset_to_next_line = width;
+
+  /* Conversion is done by two lines and two pixels, so size must be pair */
+  while (height>0)
+   {
+     rgbline1 = rgb;
+     rgbline2 = rgbline1 + rgb_offset_to_next_line;
+
+     dyline1 = dy;                             /* first line */
+     dyline2 = dy + y_offset_to_next_line;     /* second line */
+
+     for (x=0; x<width; x+=2)
+      {
+       int r, g, b;
+       int r_sum, g_sum, b_sum;
+
+       LOAD_RGB_FOR_YUV(rgbline1);
+       *dyline1++ = RGB_TO_Y(r, g, b);
+       LOAD_AND_ADD_RGB_FOR_YUV(rgbline1);
+       *dyline1++ = RGB_TO_Y(r, g, b);
+
+       LOAD_AND_ADD_RGB_FOR_YUV(rgbline2);
+       *dyline2++ = RGB_TO_Y(r, g, b);
+       LOAD_AND_ADD_RGB_FOR_YUV(rgbline2);
+       *dyline2++ = RGB_TO_Y(r, g, b);
+
+       *du++ = RGB_TO_U(r, g, b);
+       *dv++ = RGB_TO_V(r, g, b);
+      }
+
+     rgb += rgb_offset_to_next_line * 2;
+     dy  += y_offset_to_next_line * 2;
+     height -= 2;
+   }
+
+  return 0;
+}
+
+static int pwc_bgr24_to_yuv420p_resize(struct format_t *in, struct format_t 
*out)
+{
+
+
+  return 0;
+}
+
+static int pwc_bgr24_to_yuv420p_same_size(struct format_t *in, struct format_t 
*out)
+{
+  unsigned int x;
+  const unsigned char *rgbline1, *rgbline2;
+  unsigned char *dyline1, *dyline2;
+  unsigned int width = in->width;
+  unsigned int height = in->height;
+  const unsigned char *rgb = in->data[0];
+  unsigned char *dy = out->data[0];
+  unsigned char *du = out->data[1];
+  unsigned char *dv = out->data[2];
+  unsigned int rgb_offset_to_next_line = width*3;
+  unsigned int y_offset_to_next_line = width;
+
+  /* Conversion is done by two lines and two pixels, so size must be pair */
+  while (height>0)
+   {
+     rgbline1 = rgb;
+     rgbline2 = rgbline1 + rgb_offset_to_next_line;
+
+     dyline1 = dy;                             /* first line */
+     dyline2 = dy + y_offset_to_next_line;     /* second line */
+
+     for (x=0; x<width; x+=2)
+      {
+       int r, g, b;
+       int r_sum, g_sum, b_sum;
+
+       LOAD_BGR_FOR_YUV(rgbline1);
+       *dyline1++ = RGB_TO_Y(r, g, b);
+       LOAD_AND_ADD_BGR_FOR_YUV(rgbline1);
+       *dyline1++ = RGB_TO_Y(r, g, b);
+
+       LOAD_AND_ADD_BGR_FOR_YUV(rgbline2);
+       *dyline2++ = RGB_TO_Y(r, g, b);
+       LOAD_AND_ADD_BGR_FOR_YUV(rgbline2);
+       *dyline2++ = RGB_TO_Y(r, g, b);
+
+       *du++ = RGB_TO_U(r, g, b);
+       *dv++ = RGB_TO_V(r, g, b);
+      }
+
+     rgb += rgb_offset_to_next_line * 2;
+     dy  += y_offset_to_next_line * 2;
+     height -= 2;
+   }
+
+  return 0;
+}
+
+static int pwc_yuv420p_to_rgb24_same_size(struct format_t *in, struct format_t 
*out)
+{
+  unsigned int x;
+  const unsigned char *yline1, *yline2;
+  unsigned char *dline1, *dline2;
+  unsigned int width = in->width;
+  unsigned int height = in->height;
+  const unsigned char *py = in->data[0];
+  const unsigned char *pu = in->data[1];
+  const unsigned char *pv = in->data[2];
+  unsigned char *d = out->data[0];
+  unsigned int d_offset_to_next_line = width*3;
+  unsigned int y_offset_to_next_line = width;
+
+  /* Conversion is done by two lines and two pixels, so size must be pair */
+  while (height>0)
+   {
+     yline1 = py;                              /* first line */
+     yline2 = py + y_offset_to_next_line;      /* second line */
+
+     dline1 = d;
+     dline2 = dline1 + d_offset_to_next_line;
+
+     for (x=0; x<width; x+=2)
+      {
+       int cb, cr, r_add, g_add, b_add;
+       LOAD_UV_FOR_RGB(pu, pv);
+       BGR_OUT(yline1, dline1);
+       BGR_OUT(yline1, dline1);
+       BGR_OUT(yline2, dline2);
+       BGR_OUT(yline2, dline2);
+      }
+
+     d  += d_offset_to_next_line * 2;
+     py += y_offset_to_next_line * 2;
+     height -= 2;
+   }
+
+  return 0;
+}
+
+static int pwc_yuv420p_to_rgb24_resize(struct format_t *in, struct format_t 
*out)
+{
+
+
+  return 0;
+}
+
+
+static int pwc_yuv420p_to_bgr24_same_size(struct format_t *in, struct format_t 
*out)
+{
+  unsigned int x;
+  const unsigned char *yline1, *yline2;
+  unsigned char *dline1, *dline2;
+  unsigned int width = in->width;
+  unsigned int height = in->height;
+  const unsigned char *py = in->data[0];
+  const unsigned char *pu = in->data[1];
+  const unsigned char *pv = in->data[2];
+  unsigned char *d = out->data[0];
+  unsigned int d_offset_to_next_line = width*3;
+  unsigned int y_offset_to_next_line = width;
+
+  /* Conversion is done by two lines and two pixels, so size must be pair */
+  while (height>0)
+   {
+     yline1 = py;                              /* first line */
+     yline2 = py + y_offset_to_next_line;      /* second line */
+
+     dline1 = d;
+     dline2 = dline1 + d_offset_to_next_line;
+
+     for (x=0; x<width; x+=2)
+      {
+       int cb, cr, r_add, g_add, b_add;
+       LOAD_UV_FOR_RGB(pu, pv);
+       BGR_OUT(yline1, dline1);
+       BGR_OUT(yline1, dline1);
+       BGR_OUT(yline2, dline2);
+       BGR_OUT(yline2, dline2);
+      }
+
+     d  += d_offset_to_next_line * 2;
+     py += y_offset_to_next_line * 2;
+     height -= 2;
+   }
+
+  return 0;
+}
+
+static int pwc_yuv420p_to_bgr24_resize(struct format_t *in, struct format_t 
*out)
+{
+
+  return 0;
+}
+
+
+static struct pwc_t *pwc_fill_pwc_struct(struct format_t *fmt)
+{
+  struct pwc_t *pwc;
+  const struct pwc_raw_frame *frame;
+  int type;
+
+  pwc = libpwc_init();
+  if (pwc == NULL)
+    return NULL;
+
+  /* Fill pwc structure */
+  frame = (struct pwc_raw_frame *)fmt->data[0];
+  memcpy(pwc->cmd, frame->cmd, 4);
+  type = ple16_to_cpu(&frame->type);
+  switch (type)
+   {
+     /* Currently not supported */
+    case 645:
+    case 646:
+    case 675:
+    default:
+      free(pwc);
+      return NULL;
+
+    case 680:
+    case 690:
+    case 720:
+    case 730:
+    case 740:
+    case 750:
+      pwc->codec_version = V4L2_PIX_FMT_PWC2;
+      if (pwc->cmd[0] & 0x80)
+       pwc->mode_bayer = 1;
+      break;
+   }
+  pwc->type = type;
+  pwc->vbandlength = ple16_to_cpu(&frame->vbandlength);
+  pwc->width = fmt->width;
+  pwc->height = fmt->height;
+
+
+  return pwc;
+}
+
+static int pwc_rawpwc2_to_yuv420p(struct format_t *in, struct format_t *out)
+{
+  struct pwc_t *pwc;
+  const struct pwc_raw_frame *frame;
+  int err;
+
+  pwc = pwc_fill_pwc_struct(in);
+  if (pwc == NULL)
+    return -1;
+
+  err = pwc_dec23_init(pwc, pwc->type, pwc->cmd);
+  if (err < 0)
+    return err;
+
+  frame = (const struct pwc_raw_frame *)in->data[0];
+  if (pwc->mode_bayer)
+   {
+     /* For now, it's not supported */
+     err = -1;
+     goto error_free_pwc;
+   }
+  else
+   {
+     pwc_dec23_decompress(pwc, frame->rawframe, out->data[0]);
+
+   }
+
+error_free_pwc:
+  free(pwc);
+  return err;
+}
+
+
+static int pwc_rawpwc2_to_rgb24(struct format_t *in, struct format_t *out)
+{
+  struct pwc_t *pwc;
+  const struct pwc_raw_frame *frame;
+  int err;
+  struct format_t temp_fmt;
+
+  pwc = pwc_fill_pwc_struct(in);
+  if (pwc == NULL)
+    return -1;
+
+  err = pwc_dec23_init(pwc, pwc->type, pwc->cmd);
+  if (err < 0)
+     goto error_free_pwc;
+
+  frame = (const struct pwc_raw_frame *)in->data[0];
+  if (pwc->mode_bayer)
+   { /* decode in bayer format, and then in rgb */
+     temp_fmt.width = out->width;
+     temp_fmt.height = out->height;
+     temp_fmt.format = V4L2_PIX_FMT_SBGGR8;
+     err = v4l_alloc_buffers(&temp_fmt);
+     if (err < 0)
+       goto error_free_pwc;
+
+     pwc_dec23_decompress_bayer(pwc, frame->rawframe, temp_fmt.data[0]);
+     //err = v4l_sggr8_to_rgb24(in, out);
+     err = -1;
+     if (err < 0)
+       goto error_free_temp_buffer;
+
+   }
+  else
+   { /* we must decode in yuv420p and then convert the whole buffer in rgb */
+     temp_fmt.width = out->width;
+     temp_fmt.height = out->height;
+     temp_fmt.format = V4L2_PIX_FMT_YUV420;
+     err = v4l_alloc_buffers(&temp_fmt);
+     if (err < 0)
+       goto error_free_pwc;
+
+     pwc_dec23_decompress(pwc, frame->rawframe, temp_fmt.data[0]);
+     if (out->format == V4L2_PIX_FMT_BGR24)
+       err = pwc_yuv420p_to_bgr24_same_size(&temp_fmt, out);
+     else
+       err = pwc_yuv420p_to_rgb24_same_size(&temp_fmt, out);
+     if (err < 0)
+       goto error_free_temp_buffer;
+
+   }
+
+error_free_temp_buffer:
+  free(temp_fmt.data[0]);
+
+error_free_pwc:
+  free(pwc);
+  return err;
+}
+
+/*
+ *
+ *  UYVY422 (square 4x4 pixels == 32 bytes)
+ *
+ *    YU. Y.V YU. Y.V
+ *    YU. Y.V YU. Y.V
+ *    YU. Y.V YU. Y.V
+ *    YU. Y.V YU. Y.V
+ *
+ *  YUV420P (square 4x4 pixels == 24 bytes)
+ *
+ *    YUV  Y.. YUV Y..
+ *    Y..  Y.. Y.. Y..
+ *    YUV  Y.. YUV Y..
+ *    Y..  Y.. Y.. Y..
+ *
+ * Lose some bits of information.
+ *
+ */
+static int pwc_uyvy_to_yuv420p_same_size(struct format_t *in, struct format_t 
*out)
+{
+  unsigned int x, h;
+  const unsigned int width = in->width;
+  const unsigned int height = in->height;
+  const unsigned char *s = in->data[0];
+  unsigned char *y = out->data[0];
+  unsigned char *u = out->data[1];
+  unsigned char *v = out->data[2];
+
+  for (h=0; h<height; h+=2)
+   {
+     /* Copy the first line keeping all information */
+     for (x=0; x<width; x+=2)
+      {
+       *u++ = *s++;
+       *y++ = *s++;
+       *v++ = *s++;
+       *y++ = *s++;
+      }
+     /* Copy the second line discarding u and v information */
+     for (x=0; x<width; x+=2)
+      {
+       s++;
+       *y++ = *s++;
+       s++;
+       *y++ = *s++;
+      }
+   }
+  return 0;
+}
+
+/*
+ *
+ *  YUYV422 (square 4x4 pixels == 32 bytes)
+ *
+ *    YU. Y.V YU. Y.V
+ *    YU. Y.V YU. Y.V
+ *    YU. Y.V YU. Y.V
+ *    YU. Y.V YU. Y.V
+ *
+ *  YUV420P (square 4x4 pixels == 24 bytes)
+ *
+ *    YUV  Y.. YUV Y..
+ *    Y..  Y.. Y.. Y..
+ *    YUV  Y.. YUV Y..
+ *    Y..  Y.. Y.. Y..
+ *
+ */
+static int pwc_uyvy_to_yuv420p_resize(struct format_t *in, struct format_t 
*out)
+{
+  unsigned int x, h;
+  const unsigned int width = in->width;
+  const unsigned int height = in->height;
+  unsigned char *y = out->data[0];
+  unsigned char *u = out->data[1];
+  unsigned char *v = out->data[2];
+
+  if ( (out->width * out->height) > (in->width * in->height) )
+   {
+     // dest is bigger than the source. No subsampling.
+     // Place the src in the middle of the destination.
+     unsigned int yOffset = (out->height - in->height)/2;
+     unsigned int xOffset = (out->width - in->width)/2;
+     unsigned int bpixels = yOffset * out->width;
+     const unsigned char *s = in->data[0];
+
+     memset(y, BLACK_Y, bpixels);
+     y += bpixels;
+     memset(u, BLACK_U, bpixels/4);
+     u += bpixels/4;
+     memset(v, BLACK_V, bpixels/4);
+     v += bpixels/4;
+
+     for (h=0; h<height; h+=2)
+      {
+       /* Black border */
+       memset(y, BLACK_Y, xOffset);
+       y += xOffset;
+       memset(u, BLACK_U, xOffset/2);
+       u += xOffset/2;
+       memset(v, BLACK_V, xOffset/2);
+       v += xOffset/2;
+
+       /* Copy the first line keeping all information */
+       for (x=0; x<width; x+=2)
+        {
+          *u++ = *s++;
+          *y++ = *s++;
+          *v++ = *s++;
+          *y++ = *s++;
+        }
+       /* Fill the border with black (right and then left) */
+       for (x=0; x<xOffset*2; x++)
+         *y++ = BLACK_Y;
+
+       /* Copy the second line discarding u and v information */
+       for (x=0; x<width; x+=2)
+        {
+          s++;
+          *y++ = *s++;
+          s++;
+          *y++ = *s++;
+        }
+       /* Fill the border with black (right side) */
+       memset(y, BLACK_Y, xOffset);
+       y += xOffset;
+       memset(u, BLACK_U, xOffset/2);
+       u += xOffset/2;
+       memset(v, BLACK_V, xOffset/2);
+       v += xOffset/2;
+      }
+     memset(y, BLACK_Y, bpixels);
+     memset(u, BLACK_U, bpixels/4);
+     memset(v, BLACK_V, bpixels/4);
+   }
+  else
+   {
+     // source is bigger than the destination
+     // We are doing linear interpolation to find value.
+#define FIX_FLOAT       12
+    unsigned int dx = (in->width<<FIX_FLOAT)/out->width;
+    unsigned int dy = (in->height<<FIX_FLOAT)/out->height;
+    unsigned int fy, fx;
+
+    for (fy=0, h=0; h<out->height; h+=2, fy+=dy*2)
+      {
+       /* Copy the first line with U&V */
+       unsigned int yy = fy>>FIX_FLOAT;
+       unsigned int yy2 = (fy+dy)>>FIX_FLOAT;
+       const unsigned char *line1, *line2;
+       unsigned char lastU, lastV;
+
+       line1 = in->data[0] + (yy*2*in->width);
+       line2 = in->data[0] + (yy2*2*in->width);
+       lastU = line1[0];
+       lastV = line1[2];
+       for (fx=0, x=0; x<out->width; x+=2, fx+=dx*2)
+        {
+             unsigned int xx = (fx>>FIX_FLOAT)*2;
+             if ( (xx&2) == 0)
+              {
+                *u++ = lastU = (line1[xx] + line2[xx])/2;
+                *v++ = lastV = (line1[xx+2] + line2[xx+2])/2;
+              }
+             else
+              {
+                *u++ = lastU;
+                *v++ = lastV = (line1[xx+0] + line2[xx+0])/2;
+              }
+             *y++ = line1[xx+1];
+             xx = ((fx+dx)>>FIX_FLOAT)*2;
+             if ( (xx&2) == 0)
+                lastU = (line1[xx] + line2[xx])/2;
+             else
+                lastV = (line1[xx] + line2[xx])/2;
+             *y++ = line1[xx+1];
+        }
+
+       /* Copy the second line without U&V */
+       for (fx=0, x=0; x<out->width; x++, fx+=dx)
+        {
+          unsigned int xx = (fx>>FIX_FLOAT)*2;
+          *y++ = line2[xx+1];
+        }
+      }
+
+   }
+  return 0;
+}
+
+
+/*
+ *
+ *  YUYV422 (square 4x4 pixels == 32 bytes)
+ *
+ *    YU. Y.V YU. Y.V
+ *    YU. Y.V YU. Y.V
+ *    YU. Y.V YU. Y.V
+ *    YU. Y.V YU. Y.V
+ *
+ *  YUV420P (square 4x4 pixels == 24 bytes)
+ *
+ *    YUV  Y.. YUV Y..
+ *    Y..  Y.. Y.. Y..
+ *    YUV  Y.. YUV Y..
+ *    Y..  Y.. Y.. Y..
+ *
+ * Lose some bits of information.
+ */
+static int pwc_yuyv_to_yuv420p_same_size(struct format_t *in, struct format_t 
*out)
+{
+  unsigned int x, h;
+  const unsigned int width = in->width;
+  const unsigned int height = in->height;
+  const unsigned char *s = in->data[0];
+  unsigned char *y = out->data[0];
+  unsigned char *u = out->data[1];
+  unsigned char *v = out->data[2];
+
+  for (h=0; h<height; h+=2)
+   {
+     /* Copy the first line keeping all information */
+     for (x=0; x<width; x+=2)
+      {
+       *y++ = *s++;
+       *u++ = *s++;
+       *y++ = *s++;
+       *v++ = *s++;
+      }
+     /* Copy the second line discarding u and v information */
+     for (x=0; x<width; x+=2)
+      {
+       *y++ = *s++;
+       s++;
+       *y++ = *s++;
+       s++;
+      }
+   }
+  return 0;
+}
+
+/*
+ *
+ *  YUYV422 (square 4x4 pixels == 32 bytes)
+ *
+ *    YU. Y.V YU. Y.V
+ *    YU. Y.V YU. Y.V
+ *    YU. Y.V YU. Y.V
+ *    YU. Y.V YU. Y.V
+ *
+ *  YUV420P (square 4x4 pixels == 24 bytes)
+ *
+ *    YUV  Y.. YUV Y..
+ *    Y..  Y.. Y.. Y..
+ *    YUV  Y.. YUV Y..
+ *    Y..  Y.. Y.. Y..
+ *
+ */
+static int pwc_yuyv_to_yuv420p_resize(struct format_t *in, struct format_t 
*out)
+{
+  unsigned int x, h;
+  const unsigned int width = in->width;
+  const unsigned int height = in->height;
+  unsigned char *y = out->data[0];
+  unsigned char *u = out->data[1];
+  unsigned char *v = out->data[2];
+
+  if ( (out->width * out->height) > (in->width * in->height) )
+   {
+     // dest is bigger than the source. No subsampling.
+     // Place the src in the middle of the destination.
+     unsigned int yOffset = (out->height - in->height)/2;
+     unsigned int xOffset = (out->width - in->width)/2;
+     unsigned int bpixels = yOffset * out->width;
+     const unsigned char *s = in->data[0];
+
+     memset(y, BLACK_Y, bpixels);
+     y += bpixels;
+     memset(u, BLACK_U, bpixels/4);
+     u += bpixels/4;
+     memset(v, BLACK_V, bpixels/4);
+     v += bpixels/4;
+
+     for (h=0; h<height; h+=2)
+      {
+       /* Black border */
+       memset(y, BLACK_Y, xOffset);
+       y += xOffset;
+       memset(u, BLACK_U, xOffset/2);
+       u += xOffset/2;
+       memset(v, BLACK_V, xOffset/2);
+       v += xOffset/2;
+
+       /* Copy the first line keeping all information */
+       for (x=0; x<width; x+=2)
+        {
+          *y++ = *s++;
+          *u++ = *s++;
+          *y++ = *s++;
+          *v++ = *s++;
+        }
+       /* Fill the border with black (right and then left) */
+       for (x=0; x<xOffset*2; x++)
+         *y++ = BLACK_Y;
+
+       /* Copy the second line discarding u and v information */
+       for (x=0; x<width; x+=2)
+        {
+          *y++ = *s++;
+          s++;
+          *y++ = *s++;
+          s++;
+        }
+       /* Fill the border with black (right side) */
+       memset(y, BLACK_Y, xOffset);
+       y += xOffset;
+       memset(u, BLACK_U, xOffset/2);
+       u += xOffset/2;
+       memset(v, BLACK_V, xOffset/2);
+       v += xOffset/2;
+      }
+     memset(y, BLACK_Y, bpixels);
+     memset(u, BLACK_U, bpixels/4);
+     memset(v, BLACK_V, bpixels/4);
+   }
+  else
+   {
+     // source is bigger than the destination
+     // We are doing linear interpolation to find value.
+#define FIX_FLOAT       12
+    unsigned int dx = (in->width<<FIX_FLOAT)/out->width;
+    unsigned int dy = (in->height<<FIX_FLOAT)/out->height;
+    unsigned int fy, fx;
+
+    for (fy=0, h=0; h<out->height; h+=2, fy+=dy*2)
+      {
+       /* Copy the first line with U&V */
+       unsigned int yy = fy>>FIX_FLOAT;
+       unsigned int yy2 = (fy+dy)>>FIX_FLOAT;
+       const unsigned char *line1, *line2;
+       unsigned char lastU, lastV;
+
+       line1 = in->data[0] + (yy*2*in->width);
+       line2 = in->data[0] + (yy2*2*in->width);
+       lastU = line1[1];
+       lastV = line1[3];
+       for (fx=0, x=0; x<out->width; x+=2, fx+=dx*2)
+        {
+             unsigned int xx = (fx>>FIX_FLOAT)*2;
+             *y++ = line1[xx];
+             if ( (xx&2) == 0)
+              {
+                *u++ = lastU = (line1[xx+1] + line2[xx+1])/2;
+                *v++ = lastV = (line1[xx+3] + line2[xx+3])/2;
+              }
+             else
+              {
+                *u++ = lastU;
+                *v++ = lastV = (line1[xx+1] + line2[xx+1])/2;
+              }
+             xx = ((fx+dx)>>FIX_FLOAT)*2;
+             *y++ = line1[xx];
+             if ( (xx&2) == 0)
+                lastU = (line1[xx+1] + line2[xx+1])/2;
+             else
+                lastV = (line1[xx+1] + line2[xx+1])/2;
+        }
+
+       /* Copy the second line without U&V */
+       for (fx=0, x=0; x<out->width; x++, fx+=dx)
+        {
+          unsigned int xx = (fx>>FIX_FLOAT)*2;
+          *y++ = line2[xx];
+        }
+      }
+
+   }
+  return 0;
+}
+
+
+static const struct colorspace {
+   int in_format;
+   int out_format;
+   int (*convert)(struct format_t *format_in, struct format_t *format_out);
+   int (*resize)(struct format_t *format_in, struct format_t *format_out);
+} colorspace_fcts[] = {
+    {V4L2_PIX_FMT_RGB24,  V4L2_PIX_FMT_YUV420, pwc_rgb24_to_yuv420p_same_size, 
pwc_rgb24_to_yuv420p_resize },
+    {V4L2_PIX_FMT_BGR24,  V4L2_PIX_FMT_YUV420, pwc_bgr24_to_yuv420p_same_size, 
pwc_bgr24_to_yuv420p_resize },
+    {V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_RGB24,  pwc_yuv420p_to_rgb24_same_size, 
pwc_yuv420p_to_rgb24_resize },
+    {V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_BGR24,  pwc_yuv420p_to_bgr24_same_size, 
pwc_yuv420p_to_bgr24_resize },
+    {V4L2_PIX_FMT_PWC2,   V4L2_PIX_FMT_YUV420, pwc_rawpwc2_to_yuv420p },
+    {V4L2_PIX_FMT_PWC2,   V4L2_PIX_FMT_RGB24,  pwc_rawpwc2_to_rgb24},
+    {V4L2_PIX_FMT_PWC2,   V4L2_PIX_FMT_BGR24,  pwc_rawpwc2_to_rgb24},
+    {V4L2_PIX_FMT_UYVY,          V4L2_PIX_FMT_YUV420, 
pwc_uyvy_to_yuv420p_same_size, pwc_uyvy_to_yuv420p_resize},
+    {V4L2_PIX_FMT_YUYV,          V4L2_PIX_FMT_YUV420, 
pwc_yuyv_to_yuv420p_same_size, pwc_yuyv_to_yuv420p_resize},
+};
+
+int convert_and_resize(struct format_t *format_in, struct format_t *format_out)
+{
+  int i;
+
+  for (i=0; i<sizeof(colorspace_fcts)/sizeof(struct colorspace); i++) {
+
+     trace("input_format: %c%c%c%c  output_format: %c%c%c%c current_converter: 
%c%c%c%c -> %c%c%c%c\n",
+        (format_in->format>>0)&0xff,
+        (format_in->format>>8)&0xff,
+        (format_in->format>>16)&0xff,
+        (format_in->format>>24)&0xff,
+        (format_out->format>>0)&0xff,
+        (format_out->format>>8)&0xff,
+        (format_out->format>>16)&0xff,
+        (format_out->format>>24)&0xff,
+        (colorspace_fcts[i].in_format>>0)&0xff,
+        (colorspace_fcts[i].in_format>>8)&0xff,
+        (colorspace_fcts[i].in_format>>16)&0xff,
+        (colorspace_fcts[i].in_format>>24)&0xff,
+        (colorspace_fcts[i].out_format>>0)&0xff,
+        (colorspace_fcts[i].out_format>>8)&0xff,
+        (colorspace_fcts[i].out_format>>16)&0xff,
+        (colorspace_fcts[i].out_format>>24)&0xff
+      );
+
+
+     if (   (format_in->format == colorspace_fcts[i].in_format)
+        && (format_out->format == colorspace_fcts[i].out_format)) {
+
+       /* Allocate memory if needed */
+       if (format_out->data[0] == NULL) {
+          if (v4l_alloc_buffers(format_out) < 0)
+            return -1;
+       }
+
+       if (   (format_in->width != format_out->width)
+           || (format_in->height != format_out->height)) {
+          if (colorspace_fcts[i].resize)
+            return colorspace_fcts[i].resize(format_in, format_out);
+       } else {
+          if (colorspace_fcts[i].convert)
+            return colorspace_fcts[i].convert(format_in, format_out);
+       }
+     }
+  }
+  /* Conversion routine not found, try to convert to YUV420P and then in the 
wanted color */
+  /* TODO: */
+  trace("No converter found for %c%c%c%c to %c%c%c%c.\n",
+        (format_in->format>>0)&0xff,
+        (format_in->format>>8)&0xff,
+        (format_in->format>>16)&0xff,
+        (format_in->format>>24)&0xff,
+        (format_out->format>>0)&0xff,
+        (format_out->format>>8)&0xff,
+        (format_out->format>>16)&0xff,
+        (format_out->format>>24)&0xff);
+  return -1;
+}
+
+
diff -Naur libpwc-20060524/libpwc.c libpwc-20060524-win32/libpwc.c
--- libpwc-20060524/libpwc.c    2007-05-27 22:00:26.000000000 +0200
+++ libpwc-20060524-win32/libpwc.c      2007-05-27 22:00:31.000000000 +0200
@@ -4,9 +4,13 @@
  * (C) 2004-2006 Luc Saillard 
  *
  */
-
-#include <linux/videodev.h>
-#include <linux/videodev2.h>
+#ifdef _WIN32
+       #include "borrowed/videodev.h"
+       #include "borrowed/videodev2.h"
+#else
+       #include "linux/videodev.h"
+       #include "linux/videodev2.h"
+#endif
 
 #include <stdlib.h>
 #include <stdio.h>
@@ -161,7 +165,7 @@
    */
   if (out_format == V4L2_PIX_FMT_RGB24) 
    {
-     void *rgb_data, *yuv_data;
+     __u8 *rgb_data, *yuv_data;
      unsigned char *py, *pu, *pv;
      int output_buffer_size = pwc->width * pwc->height * 3;
      int yuvlen;
@@ -196,7 +200,7 @@
   return 0;
 }
 
-static inline unsigned short ple16_to_cpu(const void *arg)
+unsigned short ple16_to_cpu(const void *arg)
 {
   const unsigned char *data = arg;
   return data[0] | (data[1]<<8);
diff -Naur libpwc-20060524/libpwc.h libpwc-20060524-win32/libpwc.h
--- libpwc-20060524/libpwc.h    2007-05-27 22:00:26.000000000 +0200
+++ libpwc-20060524-win32/libpwc.h      2007-05-27 22:00:32.000000000 +0200
@@ -26,8 +26,13 @@
 #ifndef LIBPWC_H
 #define LIBPWC_H
 
-#include <linux/videodev.h>
-#include <linux/videodev2.h>
+#ifdef _WIN32
+       #include "borrowed/videodev.h"
+       #include "borrowed/videodev2.h"
+#else
+       #include "linux/videodev.h"
+       #include "linux/videodev2.h"
+#endif
 #include "pwc-ioctl.h"
 
 #define LIBPWC_VER_STRING "0.1.0"
diff -Naur libpwc-20060524/libpwc.sln libpwc-20060524-win32/libpwc.sln
--- libpwc-20060524/libpwc.sln  1970-01-01 01:00:00.000000000 +0100
+++ libpwc-20060524-win32/libpwc.sln    2007-05-27 22:00:32.000000000 +0200
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpwc", "libpwc.vcproj", 
"{8CACBDD5-96C3-4514-8E6F-4C2D10F62564}"
+EndProject
+Global
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution
+               Debug|Win32 = Debug|Win32
+               Release|Win32 = Release|Win32
+       EndGlobalSection
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution
+               {8CACBDD5-96C3-4514-8E6F-4C2D10F62564}.Debug|Win32.ActiveCfg = 
Debug|Win32
+               {8CACBDD5-96C3-4514-8E6F-4C2D10F62564}.Debug|Win32.Build.0 = 
Debug|Win32
+               {8CACBDD5-96C3-4514-8E6F-4C2D10F62564}.Release|Win32.ActiveCfg 
= Release|Win32
+               {8CACBDD5-96C3-4514-8E6F-4C2D10F62564}.Release|Win32.Build.0 = 
Release|Win32
+       EndGlobalSection
+       GlobalSection(SolutionProperties) = preSolution
+               HideSolutionNode = FALSE
+       EndGlobalSection
+EndGlobal
diff -Naur libpwc-20060524/libpwc.vcproj libpwc-20060524-win32/libpwc.vcproj
--- libpwc-20060524/libpwc.vcproj       1970-01-01 01:00:00.000000000 +0100
+++ libpwc-20060524-win32/libpwc.vcproj 2007-05-27 22:00:32.000000000 +0200
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+       ProjectType="Visual C++"
+       Version="8,00"
+       Name="libpwc"
+       ProjectGUID="{8CACBDD5-96C3-4514-8E6F-4C2D10F62564}"
+       RootNamespace="libpwc"
+       Keyword="Win32Proj"
+       >
+       <Platforms>
+               <Platform
+                       Name="Win32"
+               />
+       </Platforms>
+       <ToolFiles>
+       </ToolFiles>
+       <Configurations>
+               <Configuration
+                       Name="Debug|Win32"
+                       OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+                       IntermediateDirectory="$(ConfigurationName)"
+                       ConfigurationType="4"
+                       CharacterSet="1"
+                       >
+                       <Tool
+                               Name="VCPreBuildEventTool"
+                       />
+                       <Tool
+                               Name="VCCustomBuildTool"
+                       />
+                       <Tool
+                               Name="VCXMLDataGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCWebServiceProxyGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCMIDLTool"
+                       />
+                       <Tool
+                               Name="VCCLCompilerTool"
+                               Optimization="0"
+                               AdditionalIncludeDirectories=""
+                               PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
+                               MinimalRebuild="true"
+                               BasicRuntimeChecks="3"
+                               RuntimeLibrary="3"
+                               UsePrecompiledHeader="0"
+                               WarningLevel="3"
+                               Detect64BitPortabilityProblems="true"
+                               DebugInformationFormat="4"
+                       />
+                       <Tool
+                               Name="VCManagedResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCPreLinkEventTool"
+                       />
+                       <Tool
+                               Name="VCLibrarianTool"
+                               OutputFile="$(ProjectName)d.lib"
+                       />
+                       <Tool
+                               Name="VCALinkTool"
+                       />
+                       <Tool
+                               Name="VCXDCMakeTool"
+                       />
+                       <Tool
+                               Name="VCBscMakeTool"
+                       />
+                       <Tool
+                               Name="VCFxCopTool"
+                       />
+                       <Tool
+                               Name="VCPostBuildEventTool"
+                       />
+               </Configuration>
+               <Configuration
+                       Name="Release|Win32"
+                       OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+                       IntermediateDirectory="$(ConfigurationName)"
+                       ConfigurationType="4"
+                       CharacterSet="1"
+                       WholeProgramOptimization="1"
+                       >
+                       <Tool
+                               Name="VCPreBuildEventTool"
+                       />
+                       <Tool
+                               Name="VCCustomBuildTool"
+                       />
+                       <Tool
+                               Name="VCXMLDataGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCWebServiceProxyGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCMIDLTool"
+                       />
+                       <Tool
+                               Name="VCCLCompilerTool"
+                               AdditionalIncludeDirectories=""
+                               PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
+                               RuntimeLibrary="2"
+                               UsePrecompiledHeader="0"
+                               WarningLevel="3"
+                               Detect64BitPortabilityProblems="true"
+                               DebugInformationFormat="3"
+                       />
+                       <Tool
+                               Name="VCManagedResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCPreLinkEventTool"
+                       />
+                       <Tool
+                               Name="VCLibrarianTool"
+                               OutputFile="$(ProjectName).lib"
+                       />
+                       <Tool
+                               Name="VCALinkTool"
+                       />
+                       <Tool
+                               Name="VCXDCMakeTool"
+                       />
+                       <Tool
+                               Name="VCBscMakeTool"
+                       />
+                       <Tool
+                               Name="VCFxCopTool"
+                       />
+                       <Tool
+                               Name="VCPostBuildEventTool"
+                       />
+               </Configuration>
+       </Configurations>
+       <References>
+       </References>
+       <Files>
+               <Filter
+                       Name="Source Files"
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+                       
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+                       >
+                       <File
+                               RelativePath=".\convert.c"
+                               >
+                       </File>
+                       <File
+                               RelativePath=".\libpwc.c"
+                               >
+                       </File>
+                       <File
+                               RelativePath=".\pwc-dec23.c"
+                               >
+                       </File>
+                       <File
+                               RelativePath=".\pwc-kiara.c"
+                               >
+                       </File>
+                       <File
+                               RelativePath=".\pwc-raw.c"
+                               >
+                       </File>
+                       <File
+                               RelativePath=".\pwc-timon.c"
+                               >
+                       </File>
+               </Filter>
+               <Filter
+                       Name="Header Files"
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"
+                       
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+                       >
+                       <File
+                               RelativePath=".\libpwc.h"
+                               >
+                       </File>
+                       <File
+                               RelativePath=".\pwc-dec23.h"
+                               >
+                       </File>
+                       <File
+                               RelativePath=".\pwc-ioctl.h"
+                               >
+                       </File>
+                       <File
+                               RelativePath=".\pwc-kiara.h"
+                               >
+                       </File>
+                       <File
+                               RelativePath=".\pwc-raw.h"
+                               >
+                       </File>
+                       <File
+                               RelativePath=".\pwc-timon.h"
+                               >
+                       </File>
+               </Filter>
+               <Filter
+                       Name="Resource Files"
+                       
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+                       
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+                       >
+               </Filter>
+               <File
+                       RelativePath=".\ReadMe.txt"
+                       >
+               </File>
+       </Files>
+       <Globals>
+       </Globals>
+</VisualStudioProject>
diff -Naur libpwc-20060524/pwc-dec23.c libpwc-20060524-win32/pwc-dec23.c
--- libpwc-20060524/pwc-dec23.c 2007-05-27 22:00:26.000000000 +0200
+++ libpwc-20060524-win32/pwc-dec23.c   2007-05-27 22:00:32.000000000 +0200
@@ -817,9 +817,15 @@
  * pwc->height
  *
  */
+#ifdef _WIN32
+void pwc_dec23_decompress(const struct pwc_t *pwc,
+                         const __u8 *src,
+                         __u8 *dst)
+#else
 void pwc_dec23_decompress(const struct pwc_t *pwc,
                          const void *src,
                          void *dst)
+#endif
 {
        unsigned char *pout_planar_y;
        unsigned char *pout_planar_u;
@@ -859,9 +865,15 @@
  * pwc->height
  *
  */
+#ifdef _WIN32
+void pwc_dec23_decompress_bayer(const struct pwc_t *pwc,
+                               const __u8 *src,
+                               __u8 *dst)
+#else
 void pwc_dec23_decompress_bayer(const struct pwc_t *pwc,
                                const void *src,
                                void *dst)
+#endif
 {
        int i, bytes_per_band;
 
diff -Naur libpwc-20060524/pwc-dec23.c.bak libpwc-20060524-win32/pwc-dec23.c.bak
--- libpwc-20060524/pwc-dec23.c.bak     1970-01-01 01:00:00.000000000 +0100
+++ libpwc-20060524-win32/pwc-dec23.c.bak       2007-05-27 22:00:33.000000000 
+0200
@@ -0,0 +1,886 @@
+/* 
+ * Linux driver for Philips webcam
+ * Decompression for chipset version 2 et 3
+ * (C) 2004-2006  Luc Saillard 
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ *  vim: set ts=8,sw=8,cino=:  
+ */
+
+#include "pwc-timon.h"
+#include "pwc-kiara.h"
+#include "pwc-dec23.h"
+#include "libpwc.h"
+
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+
+static void build_subblock_pattern(struct pwc_dec23_private *pdec)
+{
+       static const unsigned int initial_values[12] = {
+               -0x526500, -0x221200, 0x221200, 0x526500,
+                          -0x3de200, 0x3de200,
+                -0x6db480, -0x2d5d00, 0x2d5d00, 0x6db480,
+                          -0x12c200, 0x12c200
+
+       };
+       static const unsigned int values_derivated[12] = {
+               0xa4ca, 0x4424, -0x4424, -0xa4ca, 
+                       0x7bc4, -0x7bc4,
+               0xdb69, 0x5aba, -0x5aba, -0xdb69,
+                       0x2584, -0x2584
+       };
+       unsigned int temp_values[12];
+       int i, j;
+
+       memcpy(temp_values, initial_values, sizeof(initial_values));
+       for (i = 0; i < 256; i++) {
+               for (j = 0; j < 12; j++) {
+                       pdec->table_subblock[i][j] = temp_values[j];
+                       temp_values[j] += values_derivated[j];
+               }
+       }
+}
+
+static void build_bit_powermask_table(struct pwc_dec23_private *pdec)
+{
+       unsigned char *p;
+       unsigned int bit, byte, mask, val;
+       unsigned int bitpower = 1;
+
+       for (bit = 0; bit < 8; bit++) {
+               mask = bitpower - 1;
+               p = pdec->table_bitpowermask[bit];
+               for (byte = 0; byte < 256; byte++) {
+                       val = (byte & mask);
+                       if (byte & bitpower)
+                               val = -val;
+                       *p++ = val;
+               }
+               bitpower<<=1;
+       }
+}
+
+
+static void build_table_color(const unsigned int romtable[16][8],
+                             unsigned char p0004[16][1024],
+                             unsigned char p8004[16][256])
+{
+       int compression_mode, j, k, bit, pw;
+       unsigned char *p0, *p8;
+       const unsigned int *r;
+
+       /* We have 16 compressions tables */
+       for (compression_mode = 0; compression_mode < 16; compression_mode++) {
+               p0 = p0004[compression_mode];
+               p8 = p8004[compression_mode];
+               r  = romtable[compression_mode];
+
+               for (j = 0; j < 8; j++, r++, p0 += 128) {
+
+                       for (k = 0; k < 16; k++) {
+                               if (k == 0)
+                                       bit = 1;
+                               else if (k >= 1 && k < 3)
+                                       bit = (r[0] >> 15) & 7;
+                               else if (k >= 3 && k < 6)
+                                       bit = (r[0] >> 12) & 7;
+                               else if (k >= 6 && k < 10)
+                                       bit = (r[0] >> 9) & 7;
+                               else if (k >= 10 && k < 13)
+                                       bit = (r[0] >> 6) & 7;
+                               else if (k >= 13 && k < 15)
+                                       bit = (r[0] >> 3) & 7;
+                               else
+                                       bit = (r[0]) & 7;
+                               if (k == 0)
+                                       *p8++ = 8;
+                               else
+                                       *p8++ = j - bit;
+                               *p8++ = bit;
+
+                               pw = 1 << bit;
+                               p0[k + 0x00] = (1 * pw) + 0x80;
+                               p0[k + 0x10] = (2 * pw) + 0x80;
+                               p0[k + 0x20] = (3 * pw) + 0x80;
+                               p0[k + 0x30] = (4 * pw) + 0x80;
+                               p0[k + 0x40] = (-1 * pw) + 0x80;
+                               p0[k + 0x50] = (-2 * pw) + 0x80;
+                               p0[k + 0x60] = (-3 * pw) + 0x80;
+                               p0[k + 0x70] = (-4 * pw) + 0x80;
+                       }       /* end of for (k=0; k<16; k++, p8++) */
+               }       /* end of for (j=0; j<8; j++ , table++) */
+       } /* end of foreach compression_mode */
+}
+
+
+/*
+ *
+ */
+static void fill_table_dc00_d800(struct pwc_dec23_private *pdec)
+{
+#define SCALEBITS 15
+#define ONE_HALF  (1UL << (SCALEBITS - 1))
+       int i;
+       unsigned int offset1 = ONE_HALF;
+       unsigned int offset2 = 0x0000;
+
+       for (i=0; i<256; i++) {
+               pdec->table_dc00[i] = offset1 & ~(ONE_HALF);
+               pdec->table_d800[i] = offset2;
+
+               offset1 += 0x7bc4;
+               offset2 += 0x7bc4;
+       }
+}
+
+/*
+ * To decode the stream:
+ *   if look_bits(2) == 0:     # op == 2 in the lookup table
+ *      skip_bits(2)
+ *      end of the stream
+ *   elif look_bits(3) == 7:   # op == 1 in the lookup table
+ *      skip_bits(3)
+ *      yyyy = get_bits(4)
+ *      xxxx = get_bits(8)
+ *   else:                     # op == 0 in the lookup table
+ *      skip_bits(x)
+ *
+ * For speedup processing, we build a lookup table and we takes the first 6 
bits.
+ * 
+ * struct {
+ *   unsigned char op;     // operation to execute
+ *   unsigned char bits;    // bits use to perform operation
+ *   unsigned char offset1; // offset to add to access in the table_0004 % 16
+ *   unsigned char offset2; // offset to add to access in the table_0004
+ * }
+ *
+ * How to build this table ?
+ *   op == 2 when (i%4)==0
+ *   op == 1 when (i%8)==7
+ *   op == 0 otherwise
+ *
+ */
+static const unsigned char hash_table_ops[64*4] = {
+       0x02, 0x00, 0x00, 0x00,
+       0x00, 0x03, 0x01, 0x00,
+       0x00, 0x04, 0x01, 0x10,
+       0x00, 0x06, 0x01, 0x30,
+       0x02, 0x00, 0x00, 0x00,
+       0x00, 0x03, 0x01, 0x40,
+       0x00, 0x05, 0x01, 0x20,
+       0x01, 0x00, 0x00, 0x00,
+       0x02, 0x00, 0x00, 0x00,
+       0x00, 0x03, 0x01, 0x00,
+       0x00, 0x04, 0x01, 0x50,
+       0x00, 0x05, 0x02, 0x00,
+       0x02, 0x00, 0x00, 0x00,
+       0x00, 0x03, 0x01, 0x40,
+       0x00, 0x05, 0x03, 0x00,
+       0x01, 0x00, 0x00, 0x00,
+       0x02, 0x00, 0x00, 0x00,
+       0x00, 0x03, 0x01, 0x00,
+       0x00, 0x04, 0x01, 0x10,
+       0x00, 0x06, 0x02, 0x10,
+       0x02, 0x00, 0x00, 0x00,
+       0x00, 0x03, 0x01, 0x40,
+       0x00, 0x05, 0x01, 0x60,
+       0x01, 0x00, 0x00, 0x00,
+       0x02, 0x00, 0x00, 0x00,
+       0x00, 0x03, 0x01, 0x00,
+       0x00, 0x04, 0x01, 0x50,
+       0x00, 0x05, 0x02, 0x40,
+       0x02, 0x00, 0x00, 0x00,
+       0x00, 0x03, 0x01, 0x40,
+       0x00, 0x05, 0x03, 0x40,
+       0x01, 0x00, 0x00, 0x00,
+       0x02, 0x00, 0x00, 0x00,
+       0x00, 0x03, 0x01, 0x00,
+       0x00, 0x04, 0x01, 0x10,
+       0x00, 0x06, 0x01, 0x70,
+       0x02, 0x00, 0x00, 0x00,
+       0x00, 0x03, 0x01, 0x40,
+       0x00, 0x05, 0x01, 0x20,
+       0x01, 0x00, 0x00, 0x00,
+       0x02, 0x00, 0x00, 0x00,
+       0x00, 0x03, 0x01, 0x00,
+       0x00, 0x04, 0x01, 0x50,
+       0x00, 0x05, 0x02, 0x00,
+       0x02, 0x00, 0x00, 0x00,
+       0x00, 0x03, 0x01, 0x40,
+       0x00, 0x05, 0x03, 0x00,
+       0x01, 0x00, 0x00, 0x00,
+       0x02, 0x00, 0x00, 0x00,
+       0x00, 0x03, 0x01, 0x00,
+       0x00, 0x04, 0x01, 0x10,
+       0x00, 0x06, 0x02, 0x50,
+       0x02, 0x00, 0x00, 0x00,
+       0x00, 0x03, 0x01, 0x40,
+       0x00, 0x05, 0x01, 0x60,
+       0x01, 0x00, 0x00, 0x00,
+       0x02, 0x00, 0x00, 0x00,
+       0x00, 0x03, 0x01, 0x00,
+       0x00, 0x04, 0x01, 0x50,
+       0x00, 0x05, 0x02, 0x40,
+       0x02, 0x00, 0x00, 0x00,
+       0x00, 0x03, 0x01, 0x40,
+       0x00, 0x05, 0x03, 0x40,
+       0x01, 0x00, 0x00, 0x00
+};
+
+/*
+ *
+ */
+static const unsigned int MulIdx[16][16] = {
+       {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
+       {0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3,},
+       {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,},
+       {4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4,},
+       {6, 7, 8, 9, 7, 10, 11, 8, 8, 11, 10, 7, 9, 8, 7, 6,},
+       {4, 5, 5, 4, 4, 5, 5, 4, 4, 5, 5, 4, 4, 5, 5, 4,},
+       {1, 3, 0, 2, 1, 3, 0, 2, 1, 3, 0, 2, 1, 3, 0, 2,},
+       {0, 3, 3, 0, 1, 2, 2, 1, 2, 1, 1, 2, 3, 0, 0, 3,},
+       {0, 1, 2, 3, 3, 2, 1, 0, 3, 2, 1, 0, 0, 1, 2, 3,},
+       {1, 1, 1, 1, 3, 3, 3, 3, 0, 0, 0, 0, 2, 2, 2, 2,},
+       {7, 10, 11, 8, 9, 8, 7, 6, 6, 7, 8, 9, 8, 11, 10, 7,},
+       {4, 5, 5, 4, 5, 4, 4, 5, 5, 4, 4, 5, 4, 5, 5, 4,},
+       {7, 9, 6, 8, 10, 8, 7, 11, 11, 7, 8, 10, 8, 6, 9, 7,},
+       {1, 3, 0, 2, 2, 0, 3, 1, 2, 0, 3, 1, 1, 3, 0, 2,},
+       {1, 2, 2, 1, 3, 0, 0, 3, 0, 3, 3, 0, 2, 1, 1, 2,},
+       {10, 8, 7, 11, 8, 6, 9, 7, 7, 9, 6, 8, 11, 7, 8, 10}
+};
+
+#define MAX_OUTER_CROP_VALUE   (512)
+static unsigned char pwc_crop_table[256 + 2*MAX_OUTER_CROP_VALUE];
+#define CLAMP(x) (pwc_crop_table[MAX_OUTER_CROP_VALUE+(x)])
+#define USE_OLD_CODE_ALGORITHM 0
+
+
+/* If the type or the command change, we rebuild the lookup table */
+int pwc_dec23_init(struct pwc_t *pwc, int type, unsigned char *cmd)
+{
+       int flags, version, shift, i;
+       struct pwc_dec23_private *pdec;
+
+       if ( (pwc->type == type) && (memcmp(pwc->cmd, cmd, 4)==0) && 
pwc->tables)
+               return 0;
+
+       if (pwc->tables)
+               free(pwc->tables);
+
+       pwc->tables = calloc(1,sizeof(struct pwc_dec23_private));
+       if (pwc->tables == NULL)
+               return -ENOMEM;
+
+       pdec = pwc->tables;
+       if (DEVICE_USE_CODEC3(type)) {
+
+               flags = cmd[2] & 0x18;
+               if (flags == 8)
+                       pdec->nbits = 7;        /* More bits, mean more bits to 
encode the stream, but better quality */
+               else if (flags == 0x10)
+                       pdec->nbits = 8;
+               else
+                       pdec->nbits = 6;
+
+               version = cmd[2] >> 5;
+               build_table_color(KiaraRomTable[version][0], 
pdec->table_0004_pass1, pdec->table_8004_pass1);
+               build_table_color(KiaraRomTable[version][1], 
pdec->table_0004_pass2, pdec->table_8004_pass2);
+
+       } else {
+
+               flags = cmd[2] & 6;
+               if (flags == 2)
+                       pdec->nbits = 7;
+               else if (flags == 4)
+                       pdec->nbits = 8;
+               else
+                       pdec->nbits = 6;
+
+               version = cmd[2] >> 3;
+               build_table_color(TimonRomTable[version][0], 
pdec->table_0004_pass1, pdec->table_8004_pass1);
+               build_table_color(TimonRomTable[version][1], 
pdec->table_0004_pass2, pdec->table_8004_pass2);
+       }
+
+       /* Informations can be coded on a variable number of bits but never 
less than 8 */
+       shift = 8 - pdec->nbits;
+       pdec->scalebits = SCALEBITS - shift;
+       pdec->nbitsmask = 0xFF >> shift;
+
+       fill_table_dc00_d800(pdec);
+       build_subblock_pattern(pdec);
+       build_bit_powermask_table(pdec);
+
+       /* Build the static table to clamp some value:
+        * if(x>255) return 255; 
+        * else if (x<0) return 0; 
+        * else return x;
+        */
+       for (i=0;i<MAX_OUTER_CROP_VALUE;i++)
+         pwc_crop_table[i] = 0;
+       for (i=0; i<256; i++)
+         pwc_crop_table[MAX_OUTER_CROP_VALUE+i] = i;
+       for (i=0; i<MAX_OUTER_CROP_VALUE; i++)
+         pwc_crop_table[MAX_OUTER_CROP_VALUE+256+i] = 255;
+
+       return 0;
+}
+
+/*
+ * Copy the 4x4 image block to Y plane buffer
+ */
+static void copy_image_block_Y(const int *src, unsigned char *dst, unsigned 
int bytes_per_line, unsigned int scalebits)
+{
+#if USE_OLD_CODE_ALGORITHM
+       int i;
+       const int *c = src;
+       unsigned char *d = dst;
+       for (i = 0; i < 4; i++, c++)
+               *d++ = CLAMP((*c) >> scalebits);
+
+       d = dst + bytes_per_line;
+       for (i = 0; i < 4; i++, c++)
+               *d++ = CLAMP((*c) >> scalebits);
+
+       d = dst + bytes_per_line*2;
+       for (i = 0; i < 4; i++, c++)
+               *d++ = CLAMP((*c) >> scalebits);
+
+       d = dst + bytes_per_line*3;
+       for (i = 0; i < 4; i++, c++)
+               *d++ = CLAMP((*c) >> scalebits);
+#else
+       const unsigned char *cm = pwc_crop_table+MAX_OUTER_CROP_VALUE;
+       const int *c = src;
+       unsigned char *d = dst;
+
+       *d++ = cm[c[0] >> scalebits];
+       *d++ = cm[c[1] >> scalebits];
+       *d++ = cm[c[2] >> scalebits];
+       *d++ = cm[c[3] >> scalebits];
+
+       d = dst + bytes_per_line;
+       *d++ = cm[c[4] >> scalebits];
+       *d++ = cm[c[5] >> scalebits];
+       *d++ = cm[c[6] >> scalebits];
+       *d++ = cm[c[7] >> scalebits];
+
+       d = dst + bytes_per_line*2;
+       *d++ = cm[c[8] >> scalebits];
+       *d++ = cm[c[9] >> scalebits];
+       *d++ = cm[c[10] >> scalebits];
+       *d++ = cm[c[11] >> scalebits];
+
+       d = dst + bytes_per_line*3;
+       *d++ = cm[c[12] >> scalebits];
+       *d++ = cm[c[13] >> scalebits];
+       *d++ = cm[c[14] >> scalebits];
+       *d++ = cm[c[15] >> scalebits];
+#endif
+}
+
+/*
+ * Copy the 4x4 image block to a CrCb plane buffer
+ * 
+ */
+static void copy_image_block_CrCb(const int *src, unsigned char *dst, unsigned 
int bytes_per_line, unsigned int scalebits)
+{
+#if USE_OLD_CODE_ALGORITHM
+       int i;
+       const int *c1 = src;
+       const int *c2 = src + 4;
+       unsigned char *d = dst;
+
+       for (i = 0; i < 4; i++, c1++, c2++) {
+               *d++ = CLAMP((*c1) >> scalebits);
+               *d++ = CLAMP((*c2) >> scalebits);
+       }
+       c1 = src + 12;
+       d = dst + bytes_per_line;
+       for (i = 0; i < 4; i++, c1++, c2++) {
+               *d++ = CLAMP((*c1) >> scalebits);
+               *d++ = CLAMP((*c2) >> scalebits);
+       }
+#else
+       /* Unroll all loops */
+       const unsigned char *cm = pwc_crop_table+MAX_OUTER_CROP_VALUE;
+       const int *c = src;
+       unsigned char *d = dst;
+
+       *d++ = cm[c[0] >> scalebits];
+       *d++ = cm[c[4] >> scalebits];
+       *d++ = cm[c[1] >> scalebits];
+       *d++ = cm[c[5] >> scalebits];
+       *d++ = cm[c[2] >> scalebits];
+       *d++ = cm[c[6] >> scalebits];
+       *d++ = cm[c[3] >> scalebits];
+       *d++ = cm[c[7] >> scalebits];
+
+       d = dst + bytes_per_line;
+       *d++ = cm[c[12] >> scalebits];
+       *d++ = cm[c[8] >> scalebits];
+       *d++ = cm[c[13] >> scalebits];
+       *d++ = cm[c[9] >> scalebits];
+       *d++ = cm[c[14] >> scalebits];
+       *d++ = cm[c[10] >> scalebits];
+       *d++ = cm[c[15] >> scalebits];
+       *d++ = cm[c[11] >> scalebits];
+#endif
+}
+
+/*
+ * Format: 8x2 pixels
+ *   . G . G . G . G . G . G . G
+ *   . . . . . . . . . . . . . .
+ *   . G . G . G . G . G . G . G
+ *   . . . . . . . . . . . . . .
+ *   or
+ *   . . . . . . . . . . . . . .
+ *   G . G . G . G . G . G . G .
+ *   . . . . . . . . . . . . . .
+ *   G . G . G . G . G . G . G .
+*/
+static void copy_image_block_Green(const int *src, unsigned char *dst, 
unsigned int bytes_per_line, unsigned int scalebits)
+{
+#if USE_OLD_CODE_ALGORITHM
+       int i;
+       unsigned char *d;
+       const int *c = src;
+
+       d = dst;
+       for (i = 0; i < 8; i++, c++)
+               d[i*2] = CLAMP((*c) >> scalebits);
+
+       d = dst + bytes_per_line;
+       for (i = 0; i < 8; i++, c++)
+               d[i*2] = CLAMP((*c) >> scalebits);
+#else
+       /* Unroll all loops */
+       const unsigned char *cm = pwc_crop_table+MAX_OUTER_CROP_VALUE;
+       unsigned char *d = dst;
+       const int *c = src;
+
+       d[0] = cm[c[0] >> scalebits];
+       d[2] = cm[c[1] >> scalebits];
+       d[4] = cm[c[2] >> scalebits];
+       d[6] = cm[c[3] >> scalebits];
+       d[8] = cm[c[4] >> scalebits];
+       d[10] = cm[c[5] >> scalebits];
+       d[12] = cm[c[6] >> scalebits];
+       d[14] = cm[c[7] >> scalebits];
+
+       d = dst + bytes_per_line;
+       d[0] = cm[c[8] >> scalebits];
+       d[2] = cm[c[9] >> scalebits];
+       d[4] = cm[c[10] >> scalebits];
+       d[6] = cm[c[11] >> scalebits];
+       d[8] = cm[c[12] >> scalebits];
+       d[10] = cm[c[13] >> scalebits];
+       d[12] = cm[c[14] >> scalebits];
+       d[14] = cm[c[15] >> scalebits];
+#endif
+}
+
+/*
+ * Format: 4x4 pixels
+ *   R . R . R . R
+ *   . B . B . B .
+ *   R . R . R . R
+ *   . B . B . B .
+ */
+static void copy_image_block_RedBlue(const int *src, unsigned char *dst, 
unsigned int bytes_per_line, unsigned int scalebits)
+{
+#if USE_OLD_CODE_ALGORITHM
+       int i;
+       unsigned char *d;
+       const int *c = src;
+
+       d = dst;
+       for (i = 0; i < 4; i++, c++)
+               d[i*2] = CLAMP((*c) >> scalebits);
+
+       d = dst + bytes_per_line;
+       for (i = 0; i < 4; i++, c++)
+               d[i*2+1] = CLAMP((*c) >> scalebits);
+
+       d = dst + bytes_per_line*2;
+       for (i = 0; i < 4; i++, c++)
+               d[i*2] = CLAMP((*c) >> scalebits);
+
+       d = dst + bytes_per_line*3;
+       for (i = 0; i < 4; i++, c++)
+               d[i*2+1] = CLAMP((*c) >> scalebits);
+#else
+       /* Unroll all loops */
+       const unsigned char *cm = pwc_crop_table+MAX_OUTER_CROP_VALUE;
+       unsigned char *d = dst;
+       const int *c = src;
+
+       d[0] = cm[c[0] >> scalebits];
+       d[2] = cm[c[1] >> scalebits];
+       d[4] = cm[c[2] >> scalebits];
+       d[6] = cm[c[3] >> scalebits];
+
+       d = dst + bytes_per_line;
+       d[1] = cm[c[4] >> scalebits];
+       d[3] = cm[c[5] >> scalebits];
+       d[5] = cm[c[6] >> scalebits];
+       d[7] = cm[c[7] >> scalebits];
+
+       d = dst + bytes_per_line*2;
+       d[0] = cm[c[8] >> scalebits];
+       d[2] = cm[c[9] >> scalebits];
+       d[4] = cm[c[10] >> scalebits];
+       d[6] = cm[c[11] >> scalebits];
+
+       d = dst + bytes_per_line*3;
+       d[1] = cm[c[12] >> scalebits];
+       d[3] = cm[c[13] >> scalebits];
+       d[5] = cm[c[14] >> scalebits];
+       d[7] = cm[c[15] >> scalebits];
+
+#endif
+}
+
+
+/*
+ * To manage the stream, we keep in a 32 bits variables,
+ * the next bits in the stream. fill_nbits() add to
+ * the reservoir at least wanted nbits.
+ *
+ */
+#define fill_nbits(pdec, nbits_wanted) do { \
+   while (pdec->nbits_in_reservoir<(nbits_wanted)) \
+    { \
+      pdec->reservoir |= (*(pdec->stream)++) << (pdec->nbits_in_reservoir); \
+      pdec->nbits_in_reservoir += 8; \
+    } \
+}  while(0);
+
+#define skip_nbits(pdec, nbits_to_skip) do { \
+   pdec->reservoir >>= (nbits_to_skip); \
+   pdec->nbits_in_reservoir -= (nbits_to_skip); \
+}  while(0);
+
+#define get_nbits(pdec, nbits_wanted, result) do { \
+   fill_nbits(pdec, nbits_wanted); \
+   result = (pdec->reservoir) & ((1U<<(nbits_wanted))-1); \
+   skip_nbits(pdec, nbits_wanted); \
+}  while(0);
+
+#define __get_nbits(pdec, nbits_wanted, result) do { \
+   result = (pdec->reservoir) & ((1U<<(nbits_wanted))-1); \
+   skip_nbits(pdec, nbits_wanted); \
+}  while(0);
+
+#define look_nbits(pdec, nbits_wanted) \
+   ((pdec->reservoir) & ((1U<<(nbits_wanted))-1))
+
+/*
+ * Decode a 4x4 pixel block
+ */
+static void decode_block(struct pwc_dec23_private *pdec,
+                        const unsigned char *ptable0004,
+                        const unsigned char *ptable8004)
+{
+       unsigned int primary_color;
+       unsigned int channel_v, offset1, op;
+       int i;
+
+       fill_nbits(pdec, 16);
+       __get_nbits(pdec, pdec->nbits, primary_color);
+
+       if (look_nbits(pdec,2) == 0) {
+               skip_nbits(pdec, 2);
+               /* Very simple, the color is the same for all pixels of the 
square */
+               for (i = 0; i < 16; i++)
+                       pdec->temp_colors[i] = pdec->table_dc00[primary_color];
+
+               return;
+       }
+
+       /* This block is encoded with small pattern */
+       for (i = 0; i < 16; i++)
+               pdec->temp_colors[i] = pdec->table_d800[primary_color];
+
+       __get_nbits(pdec, 3, channel_v);
+       channel_v = ((channel_v & 1) << 2) | (channel_v & 2) | ((channel_v & 4) 
>> 2);
+
+       ptable0004 += (channel_v * 128);
+       ptable8004 += (channel_v * 32);
+
+       offset1 = 0;
+       do
+       {
+               unsigned int htable_idx, rows = 0;
+               const unsigned int *block;
+
+               /* [  zzzz y x x ]
+                *     xx == 00 :=> end of the block def, remove the two bits 
from the stream
+                *    yxx == 111
+                *    yxx == any other value
+                *    
+                */
+               fill_nbits(pdec, 16);
+               htable_idx = look_nbits(pdec, 6);
+               op = hash_table_ops[htable_idx * 4];
+
+               if (op == 2) {
+                       skip_nbits(pdec, 2);
+
+               } else if (op == 1) {
+                       /* 15bits [ xxxx xxxx yyyy 111 ]
+                        * yyy => offset in the table8004
+                        * xxx => offset in the tabled004 (tree)
+                        */
+                       unsigned int mask, shift;
+                       unsigned int nbits, col1;
+                       unsigned int yyyy;
+
+                       skip_nbits(pdec, 3);
+                       /* offset1 += yyyy */
+                       __get_nbits(pdec, 4, yyyy);
+                       offset1 += 1 + yyyy;
+                       offset1 &= 0x0F;
+                       nbits = ptable8004[offset1 * 2];
+
+                       /* col1 = xxxx xxxx */
+                       __get_nbits(pdec, nbits+1, col1);
+
+                       /* Bit mask table */
+                       mask = pdec->table_bitpowermask[nbits][col1];
+                       shift = ptable8004[offset1 * 2 + 1];
+                       rows = ((mask << shift) + 0x80) & 0xFF;
+
+                       block = pdec->table_subblock[rows];
+                       for (i = 0; i < 16; i++)
+                               pdec->temp_colors[i] += 
block[MulIdx[offset1][i]];
+
+               } else {
+                       /* op == 0
+                        * offset1 is coded on 3 bits
+                        */    
+                       unsigned int shift;
+
+                       offset1 += hash_table_ops [htable_idx * 4 + 2];
+                       offset1 &= 0x0F;
+
+                       rows = ptable0004[offset1 + hash_table_ops [htable_idx 
* 4 + 3]];
+                       block = pdec->table_subblock[rows];
+                       for (i = 0; i < 16; i++)
+                               pdec->temp_colors[i] += 
block[MulIdx[offset1][i]];
+
+                       shift = hash_table_ops[htable_idx * 4 + 1];
+                       skip_nbits(pdec, shift);
+               }
+
+       } while (op != 2);
+
+}
+
+static void DecompressBand23(struct pwc_dec23_private *pdec,
+                            const unsigned char *rawyuv,
+                            unsigned char *planar_y,
+                            unsigned char *planar_u,
+                            unsigned char *planar_v,
+                            unsigned int pixels_per_line)      /* aka number 
of pixels per line */
+{
+       int compression_index, nblocks;
+       const unsigned char *ptable0004;
+       const unsigned char *ptable8004;
+
+       pdec->reservoir = 0;
+       pdec->nbits_in_reservoir = 0;
+       pdec->stream = rawyuv + 1;      /* The first byte of the stream is 
skipped */
+
+       get_nbits(pdec, 4, compression_index);
+
+       /* pass 1: uncompress Y component */
+       nblocks = pixels_per_line / 4;
+
+       ptable0004 = pdec->table_0004_pass1[compression_index];
+       ptable8004 = pdec->table_8004_pass1[compression_index];
+
+       /* Each block decode a square of 4x4 */
+       while (nblocks) {
+               decode_block(pdec, ptable0004, ptable8004);
+               copy_image_block_Y(pdec->temp_colors, planar_y, 
pixels_per_line, pdec->scalebits);
+               planar_y += 4;
+               nblocks--;
+       }
+
+       /* pass 2: uncompress UV component */
+       nblocks = pixels_per_line / 8;
+
+       ptable0004 = pdec->table_0004_pass2[compression_index];
+       ptable8004 = pdec->table_8004_pass2[compression_index];
+
+       /* Each block decode a square of 4x4 */
+       while (nblocks) {
+               decode_block(pdec, ptable0004, ptable8004);
+               copy_image_block_CrCb(pdec->temp_colors, planar_u, 
pixels_per_line/2, pdec->scalebits);
+
+               decode_block(pdec, ptable0004, ptable8004);
+               copy_image_block_CrCb(pdec->temp_colors, planar_v, 
pixels_per_line/2, pdec->scalebits);
+
+               planar_v += 8;
+               planar_u += 8;
+               nblocks -= 2;
+       }
+
+}
+
+/*
+ * Size need to be a multiple of 8 in width
+ *
+ * Return a block of four line encoded like this:
+ *
+ *   G R G R G R G R G R G R G R G R
+ *   B G B G B G B G B G B G B G B G
+ *   G R G R G R G R G R G R G R G R
+ *   B G B G B G B G B G B G B G B G
+ * 
+ */
+static void DecompressBandBayer(struct pwc_dec23_private *pdec,
+                               const unsigned char *rawyuv,
+                               unsigned char *rgbbayer,
+                               unsigned int pixels_per_line)   /* aka number 
of pixels per line */
+{
+       int compression_index, nblocks;
+       const unsigned char *ptable0004;
+       const unsigned char *ptable8004;
+       unsigned char *dest;
+
+       pdec->reservoir = 0;
+       pdec->nbits_in_reservoir = 0;
+       pdec->stream = rawyuv + 1;      /* The first byte of the stream is 
skipped */
+
+       get_nbits(pdec, 4, compression_index);
+
+       /* pass 1: uncompress RB component */
+       nblocks = pixels_per_line / 4;
+
+       ptable0004 = pdec->table_0004_pass1[compression_index];
+       ptable8004 = pdec->table_8004_pass1[compression_index];
+       dest = rgbbayer;
+
+       /* Each block decode a square of 4x4 */
+       while (nblocks) {
+               decode_block(pdec, ptable0004, ptable8004);
+               copy_image_block_RedBlue(pdec->temp_colors, rgbbayer, 
pixels_per_line, pdec->scalebits);
+               dest += 8;
+               nblocks--;
+       }
+
+       /* pass 2: uncompress G component */
+       nblocks = pixels_per_line / 8;
+
+       ptable0004 = pdec->table_0004_pass2[compression_index];
+       ptable8004 = pdec->table_8004_pass2[compression_index];
+
+       /* Each block decode a square of 4x4 */
+       while (nblocks) {
+               decode_block(pdec, ptable0004, ptable8004);
+               copy_image_block_Green(pdec->temp_colors, rgbbayer+1, 
pixels_per_line, pdec->scalebits);
+
+               decode_block(pdec, ptable0004, ptable8004);
+               copy_image_block_Green(pdec->temp_colors, 
rgbbayer+pixels_per_line, pixels_per_line, pdec->scalebits);
+
+               rgbbayer += 16;
+               nblocks -= 2;
+       }
+}
+
+/**
+ *
+ * Use from pwc structure
+ * pwc->bandlength:
+ * pwc->width
+ * pwc->height
+ *
+ */
+void pwc_dec23_decompress(const struct pwc_t *pwc,
+                         const __u8 *src,
+                         __u8 *dst)
+{
+       unsigned char *pout_planar_y;
+       unsigned char *pout_planar_u;
+       unsigned char *pout_planar_v;
+       int i, n, bytes_per_band;
+
+       n = pwc->width * pwc->height;
+
+       /* offset in Y plane */
+       pout_planar_y = dst;
+
+       /* offsets in U/V planes */
+       pout_planar_u = dst + n;
+       pout_planar_v = dst + n + n / 4;
+
+       /* each band is 4 lines */
+       bytes_per_band = pwc->width * 4;
+
+       for (i = 0; i < pwc->height; i += 4) {
+               DecompressBand23(pwc->tables,
+                                src,
+                                pout_planar_y, pout_planar_u, pout_planar_v,
+                                pwc->width);
+
+               src += pwc->vbandlength;
+               pout_planar_y += bytes_per_band;
+               pout_planar_u += pwc->width;
+               pout_planar_v += pwc->width;
+       }
+}
+
+/**
+ *
+ * Use from pwc structure
+ * pwc->bandlength:
+ * pwc->width
+ * pwc->height
+ *
+ */
+void pwc_dec23_decompress_bayer(const struct pwc_t *pwc,
+                               const __u8 *src,
+                               __u8 *dst)
+{
+       int i, bytes_per_band;
+
+       /* each band is 4 lines */
+       bytes_per_band = pwc->width * 4;
+
+       for (i = 0; i < pwc->height; i += 4) {
+               DecompressBandBayer(pwc->tables, src, dst, pwc->width);
+               src += pwc->vbandlength;
+               dst += bytes_per_band;
+       }
+}
+
+
+void pwc_dec23_exit(struct pwc_t *pwc)
+{
+       if (pwc->tables)
+               free(pwc->tables);
+       pwc->tables = NULL;
+}
+
+/* vim: set cino= formatoptions=croql cindent shiftwidth=8 tabstop=8: */
diff -Naur libpwc-20060524/pwc-ioctl.h libpwc-20060524-win32/pwc-ioctl.h
--- libpwc-20060524/pwc-ioctl.h 2007-05-27 22:00:27.000000000 +0200
+++ libpwc-20060524-win32/pwc-ioctl.h   2007-05-27 22:00:33.000000000 +0200
@@ -52,7 +52,12 @@
              ...       the function
  */
 
-#include <linux/types.h>
+#ifdef _WIN32
+       #include "borrowed/types.h"
+#else
+       #include "linux/types.h"
+#endif
+
 
 #ifndef __le16
 /* Compatibility for older kernel */
@@ -316,6 +321,15 @@
 #define V4L2_CID_PRIVATE_FLICKERLESS     (V4L2_CID_PRIVATE_BASE + 7)
 #define V4L2_CID_PRIVATE_NOISE_REDUCTION (V4L2_CID_PRIVATE_BASE + 8)
 
+#ifdef _WIN32
+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 */
+};
+#else
 struct pwc_raw_frame {
    __le16 type;                /* type of the webcam */
    __le16 vbandlength; /* Size of 4lines compressed (used by the decompressor) 
*/
@@ -323,6 +337,6 @@
                           only the first 3 bytes is filled) */
    __u8   rawframe[0]; /* frame_size = H/4*vbandlength */
 } __attribute__ ((packed));
-
+#endif
 
 #endif
diff -Naur libpwc-20060524/pwc-ioctl.h.bak libpwc-20060524-win32/pwc-ioctl.h.bak
--- libpwc-20060524/pwc-ioctl.h.bak     1970-01-01 01:00:00.000000000 +0100
+++ libpwc-20060524-win32/pwc-ioctl.h.bak       2007-05-27 22:00:34.000000000 
+0200
@@ -0,0 +1,333 @@
+#ifndef PWC_IOCTL_H
+#define PWC_IOCTL_H
+
+/* (C) 2001-2004 Nemosoft Unv.
+   (C) 2004      Luc Saillard 
+
+   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.
+   Please send bug reports and support requests to <>.
+   The decompression routines have been implemented by reverse-engineering the
+   Nemosoft binary pwcx module. Caveat emptor.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+/* 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.
+ */
+
+/*
+   Changes
+   2001/08/03  Alvarado   Added ioctl constants to access methods for
+                          changing white balance and red/blue gains
+   2002/12/15  G. H. Fernandez-Toribio   VIDIOCGREALSIZE
+   2003/12/13  Nemosft Unv. Some modifications to make interfacing to
+               PWCX easier
+   2006/01/01  Luc Saillard Add raw format definition
+ */
+
+/* These are private ioctl() commands, specific for the Philips webcams.
+   They contain functions not found in other webcams, and settings not
+   specified in the Video4Linux API.
+
+   The #define names are built up like follows:
+   VIDIOC              VIDeo IOCtl prefix
+         PWC           Philps WebCam
+            G           optional: Get
+            S           optional: Set
+             ...       the function
+ */
+
+#ifdef _WIN32
+       #include "borrowed/types.h"
+#else
+       #include "linux/types.h"
+#endif
+
+
+#ifndef __le16
+/* Compatibility for older kernel */
+typedef __u16 __le16;
+#endif
+
+ /* Enumeration of image sizes */
+#define PSZ_SQCIF      0x00
+#define PSZ_QSIF       0x01
+#define PSZ_QCIF       0x02
+#define PSZ_SIF                0x03
+#define PSZ_CIF                0x04
+#define PSZ_VGA                0x05
+#define PSZ_MAX                6
+
+
+/* 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.
+ */
+#define PWC_FPS_SHIFT          16
+#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 */
+struct pwc_coord
+{
+       int x, y;               /* guess what */
+       int size;               /* size, or offset */
+};
+
+
+/* Used with VIDIOCPWCPROBE */
+struct pwc_probe
+{
+       char name[32];
+       int type;
+};
+
+struct pwc_serial
+{
+       char serial[30];        /* String with serial number. Contains 
terminating 0 */
+};
+       
+/* pwc_whitebalance.mode values */
+#define PWC_WB_INDOOR          0
+#define PWC_WB_OUTDOOR         1
+#define PWC_WB_FL              2
+#define PWC_WB_MANUAL          3
+#define PWC_WB_AUTO            4
+
+/* Used with VIDIOCPWC[SG]AWB (Auto White Balance). 
+   Set mode to one of the PWC_WB_* values above.
+   *red and *blue are the respective gains of these colour components inside 
+   the camera; range 0..65535
+   When 'mode' == PWC_WB_MANUAL, 'manual_red' and 'manual_blue' are set or 
read; 
+   otherwise undefined.
+   'read_red' and 'read_blue' are read-only.
+*/   
+struct pwc_whitebalance
+{
+       int mode;
+       int manual_red, manual_blue;    /* R/W */
+       int read_red, read_blue;        /* R/O */
+};
+
+/* 
+   'control_speed' and 'control_delay' are used in automatic whitebalance mode,
+   and tell the camera how fast it should react to changes in lighting, and 
+   with how much delay. Valid values are 0..65535.
+*/
+struct pwc_wb_speed
+{
+       int control_speed;
+       int control_delay;
+
+};
+
+/* Used with VIDIOCPWC[SG]LED */
+struct pwc_leds
+{
+       int led_on;                     /* Led on-time; range = 0..25000 */
+       int led_off;                    /* Led off-time; range = 0..25000  */
+};
+
+/* Image size (used with GREALSIZE) */
+struct pwc_imagesize
+{
+       int width;
+       int height;
+};
+
+/* Defines and structures for Motorized Pan & Tilt */
+#define PWC_MPT_PAN            0x01
+#define PWC_MPT_TILT           0x02
+#define PWC_MPT_TIMEOUT                0x04 /* for status */
+
+/* Set angles; when absolute != 0, the angle is absolute and the 
+   driver calculates the relative offset for you. This can only
+   be used with VIDIOCPWCSANGLE; VIDIOCPWCGANGLE always returns
+   absolute angles.
+ */   
+struct pwc_mpt_angles
+{
+       int absolute;           /* write-only */
+       int pan;                /* degrees * 100 */
+       int tilt;               /* degress * 100 */
+};
+
+/* Range of angles of the camera, both horizontally and vertically.
+ */
+struct pwc_mpt_range
+{
+       int pan_min, pan_max;           /* degrees * 100 */
+       int tilt_min, tilt_max;
+};
+
+struct pwc_mpt_status
+{
+       int status;
+       int time_pan;
+       int time_tilt;
+};
+
+
+/* This is used for out-of-kernel decompression. With it, you can get
+   all the necessary information to initialize and use the decompressor
+   routines in standalone applications.
+ */   
+struct pwc_video_command
+{
+       int type;               /* camera type (645, 675, 730, etc.) */
+       int release;            /* release number */
+
+        int size;              /* one of PSZ_* */
+        int alternate;
+       int command_len;        /* length of USB video command */
+       unsigned char command_buf[13];  /* Actual USB video command */
+       int bandlength;         /* >0 = compressed */
+       int frame_size;         /* Size of one (un)compressed frame */
+};
+
+/* Flags for PWCX subroutines. Not all modules honour all flags. */
+#define PWCX_FLAG_PLANAR       0x0001
+#define PWCX_FLAG_BAYER                0x0008
+
+
+/* IOCTL definitions */
+
+ /* Restore user settings */
+#define VIDIOCPWCRUSER         _IO('v', 192)
+ /* Save user settings */
+#define VIDIOCPWCSUSER         _IO('v', 193)
+ /* Restore factory settings */
+#define VIDIOCPWCFACTORY       _IO('v', 194)
+
+ /* You can manipulate the compression factor. A compression preference of 0
+    means use uncompressed modes when available; 1 is low compression, 2 is
+    medium and 3 is high compression preferred. Of course, the higher the
+    compression, the lower the bandwidth used but more chance of artefacts
+    in the image. The driver automatically chooses a higher compression when
+    the preferred mode is not available.
+  */
+ /* Set preferred compression quality (0 = uncompressed, 3 = highest 
compression) */
+#define VIDIOCPWCSCQUAL                _IOW('v', 195, int)
+ /* Get preferred compression quality */
+#define VIDIOCPWCGCQUAL                _IOR('v', 195, int)
+
+
+/* Retrieve serial number of camera */
+#define VIDIOCPWCGSERIAL       _IOR('v', 198, struct pwc_serial)
+
+ /* This is a probe function; since so many devices are supported, it
+    becomes difficult to include all the names in programs that want to
+    check for the enhanced Philips stuff. So in stead, try this PROBE;
+    it returns a structure with the original name, and the corresponding
+    Philips type.
+    To use, fill the structure with zeroes, call PROBE and if that succeeds,
+    compare the name with that returned from VIDIOCGCAP; they should be the
+    same. If so, you can be assured it is a Philips (OEM) cam and the type
+    is valid.
+ */
+#define VIDIOCPWCPROBE         _IOR('v', 199, struct pwc_probe)
+
+ /* Set AGC (Automatic Gain Control); int < 0 = auto, 0..65535 = fixed */
+#define VIDIOCPWCSAGC          _IOW('v', 200, int)
+ /* Get AGC; int < 0 = auto; >= 0 = fixed, range 0..65535 */
+#define VIDIOCPWCGAGC          _IOR('v', 200, int)
+ /* Set shutter speed; int < 0 = auto; >= 0 = fixed, range 0..65535 */
+#define VIDIOCPWCSSHUTTER      _IOW('v', 201, int)
+
+ /* Color compensation (Auto White Balance) */
+#define VIDIOCPWCSAWB           _IOW('v', 202, struct pwc_whitebalance)
+#define VIDIOCPWCGAWB           _IOR('v', 202, struct pwc_whitebalance)
+
+ /* Auto WB speed */
+#define VIDIOCPWCSAWBSPEED     _IOW('v', 203, struct pwc_wb_speed)
+#define VIDIOCPWCGAWBSPEED     _IOR('v', 203, struct pwc_wb_speed)
+
+ /* LEDs on/off/blink; int range 0..65535 */
+#define VIDIOCPWCSLED           _IOW('v', 205, struct pwc_leds)
+#define VIDIOCPWCGLED           _IOR('v', 205, struct pwc_leds)
+
+  /* Contour (sharpness); int < 0 = auto, 0..65536 = fixed */
+#define VIDIOCPWCSCONTOUR      _IOW('v', 206, int)
+#define VIDIOCPWCGCONTOUR      _IOR('v', 206, int)
+
+  /* Backlight compensation; 0 = off, otherwise on */
+#define VIDIOCPWCSBACKLIGHT    _IOW('v', 207, int)
+#define VIDIOCPWCGBACKLIGHT    _IOR('v', 207, int)
+
+  /* Flickerless mode; = 0 off, otherwise on */
+#define VIDIOCPWCSFLICKER      _IOW('v', 208, int)
+#define VIDIOCPWCGFLICKER      _IOR('v', 208, int)  
+
+  /* Dynamic noise reduction; 0 off, 3 = high noise reduction */
+#define VIDIOCPWCSDYNNOISE     _IOW('v', 209, int)
+#define VIDIOCPWCGDYNNOISE     _IOR('v', 209, int)
+
+ /* Real image size as used by the camera; tells you whether or not there's a 
gray border around the image */
+#define VIDIOCPWCGREALSIZE     _IOR('v', 210, struct pwc_imagesize)
+
+ /* Motorized pan & tilt functions */ 
+#define VIDIOCPWCMPTRESET      _IOW('v', 211, int)
+#define VIDIOCPWCMPTGRANGE     _IOR('v', 211, struct pwc_mpt_range)
+#define VIDIOCPWCMPTSANGLE     _IOW('v', 212, struct pwc_mpt_angles)
+#define VIDIOCPWCMPTGANGLE     _IOR('v', 212, struct pwc_mpt_angles)
+#define VIDIOCPWCMPTSTATUS     _IOR('v', 213, struct pwc_mpt_status)
+
+ /* Get the USB set-video command; needed for initializing libpwcx */
+#define VIDIOCPWCGVIDCMD       _IOR('v', 215, struct pwc_video_command)
+struct pwc_table_init_buffer {
+   int len;
+   char *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
_______________________________________________
pwc mailing list

http://lists.saillard.org/mailman/listinfo/pwc
<Prev in Thread] Current Thread [Next in Thread>
  • Re: [pwc] raw format decompression, Björn Annighöfer <=
Admin

Disclaimer: Neither Andrew Taylor nor the University of NSW School of Computer and Engineering take any responsibility for the contents of this archive. It is purely a compilation of material sent by many people to the birding-aus mailing list. It has not been checked for accuracy nor its content verified in any way. If you wish to get material removed from the archive or have other queries about the archive e-mail Andrew Taylor at this address: andrewt@cse.unsw.EDU.AU