here's a patch for videodog-0.06.c that i did while trying to get my
WinTV card to work. it was defaulting to PAL mode and i need NTSC. it
allows user to select input mode: PAL/NTSC/SECAM and also fixes a couple
small bugs.

douglas


--- videodog-0.06.c     Sun Apr 22 21:57:06 2001
+++ videodog-0.06-1.c   Sun Apr 22 21:56:56 2001
@@ -10,6 +10,11 @@
  *             added: -i option to change input ( note that not all devices aloow
this
  *             corrected bgr -> rgb issue ( depth 3 )
  *
+ *             22.april.2001 douglas repetto changes:
+ *                     -m option to change mode (PAL/NTSC/SECAM)
+ *                     fixed problem with device name loosing a letter
+ *                     added update_cap() routine so that Max Width and Height are
reported correctly when changing mode
+ *
  * Just grabs a frame from v4l device or set its picture defaults.
Useful for scripts, webcam scripts. 
  * Output: a raw frame ( RGB ) or pnm frame ( -p option )
  * 
@@ -31,6 +36,8 @@
  *
  * Optional:
  *
+ * i - Input
+ * m - Mode
  * u - Hue
  * c - Contrast
  * b - Brightness
@@ -42,7 +49,9 @@
  *     ./videodog -s -d /dev/video0 
  *                     - query the device about settings.
  *     ./videodog -x 320 -y 240 -w 3 -d /dev/video0 -p | cjpeg > lelel.jpg
- *                     - produces a lelel.jpg image with 320x240x24bpp ( 3 * 8)
+ *                     - produces a lelel.jpg image with 320x240x24bpp ( 3 * 8) *
./videodog -x 320 -y 240 -w 3 -d /dev/video0 -p | cjpeg > lelel.jpg
+ *     ./videodog -x 640 -y 480 -w 3 -i 1 -m NTSC -d /dev/video -p >
out.pnm
+ *                     - uses input 1 and NTSC mode to grab image
  *     ./videodog -s -d /dev/video0 -u 200 
  *                     - set Hue == 200 and query the device
  *
@@ -64,7 +73,7 @@
 
 
 #define VERSION "0.06"
-#define OPTSTR "hx:y:w:d:pu:c:b:l:sni:"
+#define OPTSTR "hx:y:w:d:pu:c:b:l:m:sni:"
 #define DOT fprintf(stderr,".");
 
 void showhelp(void) {
@@ -79,6 +88,7 @@
        fprintf (stderr, "Other options :\n");
        fprintf (stderr,"-h just show this lines, doesn't help you ok ?\n");
        fprintf (stderr,"-i input number (0 is the default) \n");
+       fprintf (stderr,"-m input mode (PAL/NTSC/SECAM) \n");
        fprintf (stderr,"-u image Hue\n");
        fprintf (stderr,"-c image Contrast\n");
        fprintf (stderr,"-b image Brightness \n");
@@ -93,21 +103,23 @@
 unsigned short int pnm=0;
 int x=0, y=0, w=0;
 unsigned char *v_device; /* device */
+unsigned char *v_mode; /* mode */
+unsigned char *default_mode = "NTSC";
 
 static struct video_picture     grab_pic;
 static struct video_capability   grab_cap;
-static struct video_channel      grab_vid; /* escolher canal e NTSC */
+static struct video_channel      grab_vid; /* escolher canal*/
+static struct video_tuner       grab_tun; /* choose PAL/NTSC/SECAM */
 static struct video_mmap         grab_buf;
 static int                       grab_fd, grab_size;
 static unsigned char            *grab_data;
 int hue=-1, contrast=-1, brightness=-1, colour=-1, nograb=0, showc=0i,
channel=0;
-
 /* prototype */
 
 void swap_rgb24(unsigned char *, int );
 unsigned char* grab_one(int *, int *);
 int grab_init();
-
+int update_cap();
 
 /* signal handler */
 void _sighandler (int sig) {
@@ -115,6 +127,7 @@
                        
                case SIGINT: /* ctrl+x */
                        free (v_device);
+                       free (v_mode);
                        close (grab_fd);
                        munmap(grab_data, grab_size);
                        fprintf (stderr, "Caught SIGINT - Cleaning \n");
@@ -136,7 +149,34 @@
        if (ioctl(grab_fd, VIDIOCGCHAN, &grab_vid) == -1) return;
        grab_vid.channel=channel;
        if (ioctl(grab_fd, VIDIOCSCHAN, &grab_vid) == -1) return;
+}
+
+void set_mode() {
+        if (ioctl(grab_fd, VIDIOCGTUNER, &grab_tun) == -1) return;
+
+       if (strcmp(v_mode, "PAL") == 0)
+       {
+               grab_tun.flags = VIDEO_TUNER_PAL;
+               grab_tun.mode = VIDEO_MODE_PAL;
+        }
+       else if (strcmp(v_mode, "NTSC") == 0)
+       {
+               grab_tun.flags = VIDEO_TUNER_NTSC;
+               grab_tun.mode = VIDEO_MODE_NTSC;
+        }
+       else if (strcmp(v_mode, "SECAM") == 0)
+       {
+               grab_tun.flags = VIDEO_TUNER_SECAM;
+               grab_tun.mode = VIDEO_MODE_SECAM;
+       }
+       else
+       {
+               fprintf(stderr, 
+                       "%s is not a valid mode.\n", v_mode);
+               return;
+       }
        
+       if (ioctl(grab_fd, VIDIOCSTUNER, &grab_tun) == -1) return;
 }
 
 void show_cap()        {       /* mostra settings atuais */ 
@@ -147,6 +187,7 @@
        fprintf (stderr, "Max Height : %d\n", grab_cap.maxheight);
        fprintf (stderr, "Current Settings :\n\n");
        fprintf (stderr, "\tInput : %i\n", grab_vid.channel);
+       fprintf (stderr, "\tMode: %s\n", v_mode);
        fprintf (stderr, "\tBrightness : %i\n", grab_pic.brightness);
        fprintf (stderr, "\tHue        : %i\n", grab_pic.hue);
        fprintf (stderr, "\tColour     : %i\n", grab_pic.colour);
@@ -176,12 +217,16 @@
                        case 'd':
                                v_device= (char *)malloc ((strlen(optarg) * 
sizeof(char))+1);
                                memset(v_device, 0, strlen(optarg));
-                               strncpy(v_device, optarg, strlen(optarg) -1 );
-                               
+                               strcpy(v_device, optarg);
                                break;
                        case 'i':
                                channel=atoi(optarg);
                                break;
+                       case 'm':
+                               v_mode= (char *)malloc ((strlen(optarg) * 
+sizeof(char))+1);
+                               memset(v_mode, 0, strlen(optarg));
+                               strcpy(v_mode, optarg);
+                               break;
                        case 'u':
                                hue=atoi(optarg);
                                break;
@@ -209,6 +254,12 @@
                        
                        }
                if (!x || !y || !w ) nograb=1;
+               if (!v_mode)
+               {
+                       v_mode= (char *)malloc ((strlen(default_mode) * sizeof(char)) 
++ 1);
+                       memset(v_mode, 0, strlen(default_mode));
+                       strcpy(v_mode, default_mode);
+               }                       
                if (!v_device) {
                        fprintf (stderr, " I NEED A DEVICE NAME \n");
                        showhelp();
@@ -217,6 +268,8 @@
                grab_init();
                set_picture();
                set_channel();
+               set_mode();
+               update_cap();
                if (showc) show_cap();
                
                if (pnm) {
@@ -230,6 +283,7 @@
                if (!nograb) fwrite ((unsigned char*)grab_one( &x, &y), x * y * w, 1,
stdout);
                
                free (v_device);
+               free (v_mode);
                close (grab_fd);
                munmap(grab_data, grab_size);
        
@@ -282,7 +336,15 @@
        grab_data =
mmap(0,grab_size,PROT_READ|PROT_WRITE,MAP_SHARED,grab_fd,0);
        return(1);
        }
-       
+
+int update_cap() {
+       if (ioctl(grab_fd,VIDIOCGCAP,&grab_cap) == -1) {
+               fprintf(stderr,"couldn't update capabilities.\n");
+               exit(1);
+               }
+       return(1);
+       }
+
 unsigned char* grab_one(int *width, int *height) {
        for (;;) {
                if (-1 == ioctl(grab_fd,VIDIOCMCAPTURE,&grab_buf)) {



-- 
                        douglas irving repetto 
                  http://music.columbia.edu/~douglas 
                  http://shoko.calarts.edu/musicdsp
               http://music.columbia.edu/cmc/dorkbotnyc
--- videodog-0.06.c     Sun Apr 22 21:57:06 2001
+++ videodog-0.06-1.c   Sun Apr 22 21:56:56 2001
@@ -10,6 +10,11 @@
  *             added: -i option to change input ( note that not all devices aloow this
  *             corrected bgr -> rgb issue ( depth 3 )
  *
+ *             22.april.2001 douglas repetto changes:
+ *                     -m option to change mode (PAL/NTSC/SECAM)
+ *                     fixed problem with device name loosing a letter
+ *                     added update_cap() routine so that Max Width and Height are 
+reported correctly when changing mode
+ *
  * Just grabs a frame from v4l device or set its picture defaults. Useful for 
scripts, webcam scripts. 
  * Output: a raw frame ( RGB ) or pnm frame ( -p option )
  * 
@@ -31,6 +36,8 @@
  *
  * Optional:
  *
+ * i - Input
+ * m - Mode
  * u - Hue
  * c - Contrast
  * b - Brightness
@@ -42,7 +49,9 @@
  *     ./videodog -s -d /dev/video0 
  *                     - query the device about settings.
  *     ./videodog -x 320 -y 240 -w 3 -d /dev/video0 -p | cjpeg > lelel.jpg
- *                     - produces a lelel.jpg image with 320x240x24bpp ( 3 * 8)
+ *                     - produces a lelel.jpg image with 320x240x24bpp ( 3 * 8) *     
+ ./videodog -x 320 -y 240 -w 3 -d /dev/video0 -p | cjpeg > lelel.jpg
+ *     ./videodog -x 640 -y 480 -w 3 -i 1 -m NTSC -d /dev/video -p > out.pnm
+ *                     - uses input 1 and NTSC mode to grab image
  *     ./videodog -s -d /dev/video0 -u 200 
  *                     - set Hue == 200 and query the device
  *
@@ -64,7 +73,7 @@
 
 
 #define VERSION "0.06"
-#define OPTSTR "hx:y:w:d:pu:c:b:l:sni:"
+#define OPTSTR "hx:y:w:d:pu:c:b:l:m:sni:"
 #define DOT fprintf(stderr,".");
 
 void showhelp(void) {
@@ -79,6 +88,7 @@
        fprintf (stderr, "Other options :\n");
        fprintf (stderr,"-h just show this lines, doesn't help you ok ?\n");
        fprintf (stderr,"-i input number (0 is the default) \n");
+       fprintf (stderr,"-m input mode (PAL/NTSC/SECAM) \n");
        fprintf (stderr,"-u image Hue\n");
        fprintf (stderr,"-c image Contrast\n");
        fprintf (stderr,"-b image Brightness \n");
@@ -93,21 +103,23 @@
 unsigned short int pnm=0;
 int x=0, y=0, w=0;
 unsigned char *v_device; /* device */
+unsigned char *v_mode; /* mode */
+unsigned char *default_mode = "NTSC";
 
 static struct video_picture     grab_pic;
 static struct video_capability   grab_cap;
-static struct video_channel      grab_vid; /* escolher canal e NTSC */
+static struct video_channel      grab_vid; /* escolher canal*/
+static struct video_tuner       grab_tun; /* choose PAL/NTSC/SECAM */
 static struct video_mmap         grab_buf;
 static int                       grab_fd, grab_size;
 static unsigned char            *grab_data;
 int hue=-1, contrast=-1, brightness=-1, colour=-1, nograb=0, showc=0i, channel=0;
-
 /* prototype */
 
 void swap_rgb24(unsigned char *, int );
 unsigned char* grab_one(int *, int *);
 int grab_init();
-
+int update_cap();
 
 /* signal handler */
 void _sighandler (int sig) {
@@ -115,6 +127,7 @@
                        
                case SIGINT: /* ctrl+x */
                        free (v_device);
+                       free (v_mode);
                        close (grab_fd);
                        munmap(grab_data, grab_size);
                        fprintf (stderr, "Caught SIGINT - Cleaning \n");
@@ -136,7 +149,34 @@
        if (ioctl(grab_fd, VIDIOCGCHAN, &grab_vid) == -1) return;
        grab_vid.channel=channel;
        if (ioctl(grab_fd, VIDIOCSCHAN, &grab_vid) == -1) return;
+}
+
+void set_mode() {
+        if (ioctl(grab_fd, VIDIOCGTUNER, &grab_tun) == -1) return;
+
+       if (strcmp(v_mode, "PAL") == 0)
+       {
+               grab_tun.flags = VIDEO_TUNER_PAL;
+               grab_tun.mode = VIDEO_MODE_PAL;
+        }
+       else if (strcmp(v_mode, "NTSC") == 0)
+       {
+               grab_tun.flags = VIDEO_TUNER_NTSC;
+               grab_tun.mode = VIDEO_MODE_NTSC;
+        }
+       else if (strcmp(v_mode, "SECAM") == 0)
+       {
+               grab_tun.flags = VIDEO_TUNER_SECAM;
+               grab_tun.mode = VIDEO_MODE_SECAM;
+       }
+       else
+       {
+               fprintf(stderr, 
+                       "%s is not a valid mode.\n", v_mode);
+               return;
+       }
        
+       if (ioctl(grab_fd, VIDIOCSTUNER, &grab_tun) == -1) return;
 }
 
 void show_cap()        {       /* mostra settings atuais */ 
@@ -147,6 +187,7 @@
        fprintf (stderr, "Max Height : %d\n", grab_cap.maxheight);
        fprintf (stderr, "Current Settings :\n\n");
        fprintf (stderr, "\tInput : %i\n", grab_vid.channel);
+       fprintf (stderr, "\tMode: %s\n", v_mode);
        fprintf (stderr, "\tBrightness : %i\n", grab_pic.brightness);
        fprintf (stderr, "\tHue        : %i\n", grab_pic.hue);
        fprintf (stderr, "\tColour     : %i\n", grab_pic.colour);
@@ -176,12 +217,16 @@
                        case 'd':
                                v_device= (char *)malloc ((strlen(optarg) * 
sizeof(char))+1);
                                memset(v_device, 0, strlen(optarg));
-                               strncpy(v_device, optarg, strlen(optarg) -1 );
-                               
+                               strcpy(v_device, optarg);
                                break;
                        case 'i':
                                channel=atoi(optarg);
                                break;
+                       case 'm':
+                               v_mode= (char *)malloc ((strlen(optarg) * 
+sizeof(char))+1);
+                               memset(v_mode, 0, strlen(optarg));
+                               strcpy(v_mode, optarg);
+                               break;
                        case 'u':
                                hue=atoi(optarg);
                                break;
@@ -209,6 +254,12 @@
                        
                        }
                if (!x || !y || !w ) nograb=1;
+               if (!v_mode)
+               {
+                       v_mode= (char *)malloc ((strlen(default_mode) * sizeof(char)) 
++ 1);
+                       memset(v_mode, 0, strlen(default_mode));
+                       strcpy(v_mode, default_mode);
+               }                       
                if (!v_device) {
                        fprintf (stderr, " I NEED A DEVICE NAME \n");
                        showhelp();
@@ -217,6 +268,8 @@
                grab_init();
                set_picture();
                set_channel();
+               set_mode();
+               update_cap();
                if (showc) show_cap();
                
                if (pnm) {
@@ -230,6 +283,7 @@
                if (!nograb) fwrite ((unsigned char*)grab_one( &x, &y), x * y * w, 1, 
stdout);
                
                free (v_device);
+               free (v_mode);
                close (grab_fd);
                munmap(grab_data, grab_size);
        
@@ -282,7 +336,15 @@
        grab_data = mmap(0,grab_size,PROT_READ|PROT_WRITE,MAP_SHARED,grab_fd,0);
        return(1);
        }
-       
+
+int update_cap() {
+       if (ioctl(grab_fd,VIDIOCGCAP,&grab_cap) == -1) {
+               fprintf(stderr,"couldn't update capabilities.\n");
+               exit(1);
+               }
+       return(1);
+       }
+
 unsigned char* grab_one(int *width, int *height) {
        for (;;) {
                if (-1 == ioctl(grab_fd,VIDIOCMCAPTURE,&grab_buf)) {

Reply via email to