⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 patch-linux-2.4.22-qcamvc-1.0.6

📁 VC编写的USB QuickCam驱动程序,实现四种视频格式在linux下的编码,信号来自摄像源
💻 6
📖 第 1 页 / 共 5 页
字号:
diff -urN -X dontdiff linux-2.4.22/CREDITS linux-2.4.22qcamvc/CREDITS--- linux-2.4.22/CREDITS	2003-08-28 19:26:06.000000000 +0200+++ linux-2.4.22qcamvc/CREDITS	2003-08-28 20:20:17.000000000 +0200@@ -689,6 +689,12 @@ S: D-69231 Rauenberg S: Germany +N: Daniele De Marchi+E: demarchidaniele@libero.it+W: sf.net/projects/usb-quickcam-vc+D: QuickCam VC driver+S: Italy+ N: Peter Denison E: peterd@pnd-pc.demon.co.uk W: http://www.pnd-pc.demon.co.uk/promise/diff -urN -X dontdiff linux-2.4.22/Documentation/Configure.help linux-2.4.22qcamvc/Documentation/Configure.help--- linux-2.4.22/Documentation/Configure.help	2003-08-28 19:26:06.000000000 +0200+++ linux-2.4.22qcamvc/Documentation/Configure.help	2003-08-28 20:21:53.000000000 +0200@@ -24107,6 +24107,32 @@   otherwise say N. This will not work with the Creative Webcam III.   It is also available as a module (cpia_usb.o). +QuickCam VC Video For Linux+CONFIG_VIDEO_QCAMVC+  This is the video4linux driver for Connectix QuickCam VC cameras.+  If you have one of these cameras (PP or usb), say Y here and +  select parallel port and/or USB lowlevel support below, +  otherwise say N. +  This will not work with any othen QuickCam camera( pro, color, etc).++  This driver is also available as a module (qcamvc.o).++QuickCam VC Parallel Port Lowlevel Support+CONFIG_VIDEO_QCAMVC_PP+  This is the lowlevel parallel port support for the Connectix +  QuickCam VC. If you have the parallel port version of this camera,+  say Y here, otherwise say N. ++  It is also available as a module (qcamvc_pp.o).++QuickCam VC USB Lowlevel Support+CONFIG_VIDEO_QCAMVC_USB+  This is the lowlevel usb support for the Connectix QuickCam VC. +  If you have the parallel port version of this camera,+  say Y here, otherwise say N. ++  It is also available as a module (qcamvc_usb.o).+ Mediavision Pro Movie Studio Video For Linux CONFIG_VIDEO_PMS   Say Y if you have such a thing.  This driver is also available as adiff -urN -X dontdiff linux-2.4.22/drivers/media/video/Config.in linux-2.4.22qcamvc/drivers/media/video/Config.in--- linux-2.4.22/drivers/media/video/Config.in	2003-08-28 19:26:10.000000000 +0200+++ linux-2.4.22qcamvc/drivers/media/video/Config.in	2003-08-28 20:26:32.000000000 +0200@@ -36,6 +36,17 @@     dep_tristate '    CPiA USB Lowlevel Support' CONFIG_VIDEO_CPIA_USB $CONFIG_VIDEO_CPIA $CONFIG_USB   fi fi+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then+  dep_tristate '  QuickCam VC Video for Linux (EXPERIMENTAL)' CONFIG_VIDEO_QCAMVC $CONFIG_VIDEO_DEV+  if [ "$CONFIG_VIDEO_QCAMVC" != "n" ]; then+    if [ "$CONFIG_PARPORT_1284" != "n" ]; then+      dep_tristate '    QuickCam VC Parallel Port Lowlevel Support' CONFIG_VIDEO_QCAMVC_PP $CONFIG_VIDEO_QCAMVC $CONFIG_PARPORT+    fi+    if [ "$CONFIG_USB" != "n" ]; then+      dep_tristate '    QuickCam VC USB Lowlevel Support' CONFIG_VIDEO_QCAMVC_USB $CONFIG_VIDEO_QCAMVC $CONFIG_USB+    fi+  fi+fi dep_tristate '  SAA5249 Teletext processor' CONFIG_VIDEO_SAA5249 $CONFIG_VIDEO_DEV $CONFIG_I2C dep_tristate '  SAB3036 tuner' CONFIG_TUNER_3036 $CONFIG_VIDEO_DEV $CONFIG_I2C if [ "$CONFIG_EXPERIMENTAL" = "y" ]; thendiff -urN -X dontdiff linux-2.4.22/drivers/media/video/Makefile linux-2.4.22qcamvc/drivers/media/video/Makefile--- linux-2.4.22/drivers/media/video/Makefile	2003-08-28 19:26:10.000000000 +0200+++ linux-2.4.22qcamvc/drivers/media/video/Makefile	2003-08-28 20:17:40.000000000 +0200@@ -25,7 +25,7 @@ # All of the (potential) objects that export symbols. # This list comes from 'grep -l EXPORT_SYMBOL *.[hc]'. -export-objs     :=	i2c-old.o videodev.o bttv-if.o cpia.o+export-objs     :=	i2c-old.o videodev.o bttv-if.o cpia.o qcamvc.o  list-multi	:=	bttv.o zoran.o bttv-objs	:=	bttv-driver.o bttv-cards.o bttv-if.o@@ -56,6 +56,9 @@ obj-$(CONFIG_VIDEO_CPIA) += cpia.o obj-$(CONFIG_VIDEO_CPIA_PP) += cpia_pp.o obj-$(CONFIG_VIDEO_CPIA_USB) += cpia_usb.o+obj-$(CONFIG_VIDEO_QCAMVC) += qcamvc.o+obj-$(CONFIG_VIDEO_QCAMVC_PP) += qcamvc_pp.o+obj-$(CONFIG_VIDEO_QCAMVC_USB) += qcamvc_usb.o obj-$(CONFIG_VIDEO_MEYE) += meye.o obj-$(CONFIG_VIDEO_SWARM_7114H) += swarm_saa7114h.o obj-$(CONFIG_TUNER_3036) += tuner-3036.odiff -urN -X dontdiff linux-2.4.22/drivers/media/video/qcamvc.c linux-2.4.22qcamvc/drivers/media/video/qcamvc.c--- linux-2.4.22/drivers/media/video/qcamvc.c	1970-01-01 01:00:00.000000000 +0100+++ linux-2.4.22qcamvc/drivers/media/video/qcamvc.c	2003-08-28 20:16:40.000000000 +0200@@ -0,0 +1,1466 @@+/*+ *+ *    Connectix USB QuickCam VC Video Camera driver+ *+ *    (C) Copyright 2001 De Marchi Daniele+ *+ *    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., 675 Mass Ave, Cambridge, MA 02139, USA.+ *+ *    Jan 2001 This driver develop started on the linux + *            kernel 2.4.0.+ *+ */++#include "qcamvc.h"+#ifdef CONFIG_KMOD+#include <linux/kmod.h>+#endif+#include <linux/proc_fs.h>+#include <linux/vmalloc.h>+#include <linux/wrapper.h>++#ifdef MODULE+MODULE_AUTHOR("De Marchi Daniele <demarchidaniele@libero.it>");+MODULE_DESCRIPTION("V4L-driver for QuickCam VC cameras");+MODULE_LICENSE("GPL");+MODULE_SUPPORTED_DEVICE("video");+#endif++#ifdef CONFIG_VIDEO_QCAMVC_PP+extern int qcamvc_pp_init(void);+#endif+#ifdef CONFIG_VIDEO_QCAMVC_USB+extern int qcamvc_usb_init(void);+#endif+++static long    qcamvc_vread(struct video_device *dev, char *buf, unsigned long count, int noblock);+static long    qcamvc_vwrite(struct video_device *dev, const char *buf, unsigned long count, int noblock);+static int     qcamvc_vioctl(struct video_device *dev, unsigned int cmd, void *arg);+static int     qcamvc_vopen(struct video_device *dev, int flags);+static void    qcamvc_vclose(struct video_device *dev);+static int     qcamvc_init_done(struct video_device *dev);+#ifdef USE_MMAP+static int qcamvc_vmmap(struct video_device *dev, const char *adr, unsigned long size);+#endif++static struct video_device qcamvc_template = {+  name:         "QuickCam VC",+  type:         VID_TYPE_CAPTURE,+  hardware:     VID_HARDWARE_QCAM_C,+  open:         qcamvc_vopen,+  close:        qcamvc_vclose,+  read:         qcamvc_vread,+  write:        qcamvc_vwrite,+  ioctl:        qcamvc_vioctl,+  initialize:   qcamvc_init_done,+#ifdef USE_MMAP+  mmap:         qcamvc_vmmap,+#endif+};++/*****************************************************************************/+/*                                                                           */+/* QuickCam Video CODEC                                                      */+/*                                                                           */+/*****************************************************************************/+static void hue_reg(struct qcamvc *qcamvc)+{+  float a,b;+  int cnt;+  +  if (qcamvc->hue_calc == 1) return;+  +  a = (qcamvc->blue_hue * 1.12) / 128;+  b = (qcamvc->red_hue * 1.39999999999) / 128;  ++  for (cnt = 0 ; cnt < 0xff ; cnt++)+    {+      qcamvc->table_a[cnt] = (float) cnt * b;+      qcamvc->table_b[cnt] = (float) cnt * a;+  +      if(qcamvc->table_a[cnt] > 0xff) qcamvc->table_a[cnt] = 0xff; if(qcamvc->table_a[cnt] < 0   ) qcamvc->table_a[cnt] = 0;+      if(qcamvc->table_b[cnt] > 0xff) qcamvc->table_b[cnt] = 0xff; if(qcamvc->table_b[cnt] < 0   ) qcamvc->table_b[cnt] = 0;+    }+  +  a = qcamvc->santrast / 100;+  +  qcamvc->VAR_A = a * 1.731999999999999;+  qcamvc->VAR_B = a * 0.336;+  qcamvc->VAR_C = a * 0.697999999999999;+  qcamvc->VAR_D = a * 1.370999999999999;+  +  qcamvc->hue_calc = 1;+}++static void get_pixel(struct qcamvc *qcamvc, float pix_a, float pix_b, unsigned char pix_c, \+	      unsigned char pix_d, float pix_e, \+	      unsigned char *pred, unsigned char *pgreen, unsigned char *pblue)+{+  +  float a,b;+  float blue,green,red;++  a = pix_b - qcamvc->table_a[pix_c];+  b = qcamvc->table_b[pix_d] - pix_e;+ +  if(pix_a >= 0) {if(pix_a > 0xff) {pix_a = 0xff;}} else {pix_a = 0;}+  if(a <= 112)   {if(a < -112) {a = -112;}} else {a = 112;}+  if(b <= 112)   {if(b < -112) {b = -112;}} else {b = 112;}+  +  blue =  ( b * qcamvc->VAR_A ) +  pix_a;+  green = ( a * qcamvc->VAR_C ) - (( b * qcamvc->VAR_B) - pix_a );+  red =   ( a * qcamvc->VAR_D ) + pix_a;+   +  if(red >= 0) {if(red > 0xff) red = 0xff;} else {red = 0;}+  if(green >= 0) {if(green > 0xff) green = 0xff;} else {green = 0;}  +  if(blue >= 0) {if(blue > 0xff) blue = 0xff;} else {blue = 0;}+  +  *pred   = (unsigned char) red;  +  *pgreen = (unsigned char) green;  +  *pblue  = (unsigned char) blue;+  +}+++static void codec(struct qcamvc *qcamvc, unsigned char *inbuf, unsigned char *outbuf)+{+  int width=qcamvc->width;+  int height=qcamvc->height;+  unsigned char red=0, green=0, blue=0;+  int x,y;+  unsigned char pix1, pix2, pix3, pix4;+  unsigned char *pointer1, *pointer2;+  unsigned char *table = (unsigned char *) kmalloc(width * height, GFP_KERNEL);+  unsigned char *pointer_last_line =(unsigned char *) kmalloc(width, GFP_KERNEL);++  pointer1 = inbuf;+  pointer2 = table;+  + for (y = 0 ; y < height ; y ++ ){+   for (x = width - 1 ; x >= 0 ; x--){+     *(pointer2 + x) = *(pointer1);+     pointer1 ++;+   }+   pointer2 = pointer2 + width;+ }+  +  pointer1 = inbuf;+  pointer2 = (outbuf + qcamvc->width * qcamvc->height * 3) - 1;+  if (qcamvc->hue_calc == 0 ) hue_reg(qcamvc);+  memcpy( pointer_last_line, pointer1, width);+  for(y = 0 ; y < height ; y++) {  +    if (current->need_resched) schedule();+    +    if((y & 1) == 0) {      +      for (x = 0 ; x < width ; x++){+	if((x & 1) != 0) {+	  pix1 = (( *(width + pointer1)) + (*(x + pointer_last_line))) / 2;	       +	  pix2 = (((*(width + pointer1 + 1)) + (*(x + pointer_last_line)) )) / 2 ;	       +	  pix3 = *pointer1;+	  pix4 = *(pointer1 + 1);	+	} else {	  +	  pix1 = ((*(width + pointer1 + 1)) + (*(x + 1 + pointer_last_line))) / 2;+	  pix2 = ((*(width + pointer1)) + (*(x + pointer_last_line))) / 2;		+	  pix3 = *(pointer1 + 1);+	  pix4 = *pointer1;	  +	}	+	get_pixel(qcamvc, (pix4 + pix3) / 2,  pix4, pix3, pix1, pix2, &blue, &green, &red);+	(unsigned char)*(pointer2)     = blue;  +	(unsigned char)*(pointer2 - 1) = green; +	(unsigned char)*(pointer2 - 2) = red;	+	pointer2-=3;+	pointer1++;	+      }      +    } else {++      for (x = 0 ; x < width ; x++){+	if((x & 1) != 0) {+	  pix3 = (*(width + pointer1) + *(x + pointer_last_line)) / 2;		+	  pix4 = (*(width + pointer1 + 1) + *(x + 1 + pointer_last_line)) / 2;	       +	  pix1 = *pointer1 & 0xff;+	  pix2 = *(pointer1 + 1);	  +	} else {	  +	  pix3 = (*(width + pointer1 + 1) + *(x + 1 + pointer_last_line)) / 2;+	  pix4 = (*(width + pointer1)     + *(x +     pointer_last_line)) / 2;+	  pix1 = *(pointer1 + 1);+	  pix2 = *pointer1;+	}	+	get_pixel(qcamvc, (pix1 + pix2) / 2,  pix4, pix3, pix1, pix2, &blue, &green, &red);+	(unsigned char)*(pointer2)     = blue;  +	(unsigned char)*(pointer2 - 1) = green; +	(unsigned char)*(pointer2 - 2) = red;	+	pointer2-=3;+	pointer1++;+      }                  +    }+    memcpy(pointer_last_line, pointer1 - width, width);+  } +  kfree(table);+  kfree(pointer_last_line);+}++static void qcamvc_set_topmost_row(struct qcamvc *qcamvc,  unsigned char val)+{+  qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_SET_TOPMOST_ROW, &val, sizeof(val));+}++static void qcamvc_set_bottommost_row(struct qcamvc *qcamvc,  unsigned char val)+{+  qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_SET_BOTTOMMOST_ROW, &val, sizeof(val));+}++static void qcamvc_set_leftmost_column(struct qcamvc *qcamvc,  unsigned char val)+{+  qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_SET_LEFTMOST_COLUMN, &val, sizeof(val));+}++static void qcamvc_set_rightmost_column(struct qcamvc *qcamvc,  unsigned char val)+{+  qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_SET_RIGHTMOST_COLUMN, &val, sizeof(val));+}++static void qcamvc_set_exposure(struct qcamvc *qcamvc,  unsigned char val)+{+  unsigned char buffer[2];+  GET_VALUES(buffer,val);+  qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_SET_EXPOSURE, buffer, sizeof(buffer));+  if(qcamvc->streaming) qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_GET_FRAME, NULL, 0);+}++static void qcamvc_set_brightness(struct qcamvc *qcamvc,  unsigned char val)+{+  short i,j;+  unsigned char buffer[21]={+    0x58, 0xd8, 0x58, 0xd8, 0x58,+    0xd8, 0x58, 0xd8, 0x58, 0xd8,+    0x58, 0xd8, 0x58, 0xd8, 0x58,+    0xd8, 0x58, 0xd8, 0x58, 0xd8, 0x5c};++  for(i=1, j=18 ; i<=0x80 ; i*=2 , j-=2)+    {+      if( val & i) {+	buffer[j] = buffer[j] | 1;+	buffer[j+1] = buffer[j+1] | 1;}+    }++  qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_SET_BRIGHTNESS, buffer, sizeof(buffer));+  if(qcamvc->streaming) qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_GET_FRAME, NULL, 0);+}++static int bpc6_init(struct qcamvc *qcamvc)+{+  int ret=0;+  long i,q;+  unsigned char buffer[0x40];+  unsigned char *bigbuffer;++  FIRST_ROW; LAST_ROW;+  FIRST_COL; LAST_COL;+  MUL_FACTOR;++  bigbuffer=kmalloc(BIGBUFFER_SIZE , GFP_KERNEL);+  if (bigbuffer==NULL) +    {+      printk("QuickCam VC: Init bigbuffer kmalloc error.\n");+      return -1;+  }+  +  for(i=0; i<BIGBUFFER_SIZE ; i+=2)+    {+    q=i;+     *(bigbuffer + i ) = (unsigned char )(q >> 11);+     *(bigbuffer + i + 1) = (unsigned char) 0xc0;+    }++  buffer[0]=0x78; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x0f, buffer, 1);+  buffer[0]=0x00; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_SET_MISC, buffer, 1);+  buffer[0]=0x58; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x0f, buffer, 1);+  buffer[0]=0x18; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x0f, buffer, 1);++  qcamvc_set_topmost_row     (qcamvc, 0x0e);+  qcamvc_set_leftmost_column (qcamvc, 0x0f);+  qcamvc_set_bottommost_row  (qcamvc, 0x86);+  qcamvc_set_rightmost_column(qcamvc, 0xaf);++  qcamvc_set_brightness(qcamvc, qcamvc->brightness);++  buffer[0]=0x7f;buffer[1]=0x81;+  qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x02, buffer, 2);++  buffer[0]=0x00; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_SET_MISC, buffer, 1);+  buffer[0]=0x00; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x0e, buffer, 1);+  qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x0d, bigbuffer, BIGBUFFER_SIZE);+  buffer[0]=0x00; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x0e, buffer, 1);++  buffer[0]=0x01; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x0e, buffer, 1);+  buffer[0]=0x00; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_SET_MISC, buffer, 1);+  buffer[0]=0x78; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x0f, buffer, 1);+  buffer[0]=0x00; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_SET_MISC, buffer, 1);+  buffer[0]=0x58; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x0f, buffer, 1);++  qcamvc_set_brightness(qcamvc, qcamvc->brightness);+  qcamvc_set_exposure(qcamvc, qcamvc->exposure);++  buffer[0]=0x11; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x0a, buffer, 1);+  buffer[0]=0x11; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x0a, buffer, 1);++  qcamvc_set_topmost_row     (qcamvc, firstrow[qcamvc->res]);+  qcamvc_set_leftmost_column (qcamvc, firstcolumn[qcamvc->res]);+  qcamvc_set_bottommost_row  (qcamvc, lastrow[qcamvc->res]);+  qcamvc_set_rightmost_column(qcamvc, lastcolumn[qcamvc->res]);+

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -