On Tue, 09 Mar 2010 14:01:55 +0200, Damyan Ivanov wrote:

> > Ack, and it's probably not difficult for someone who speaks C.
> I added v4l2.patch and the module compiles.

Cool!
 
> Please someone with a camera, test it. There are sample scripts in 
> examples/.

1) With your patch:

$ for s in examples/*; do echo "=== $s ==="; PERL5LIB=/:examples perl $s; done
=== examples/autotune ===
Can't call method "mode" on an undefined value at examples/autotune line 25.
=== examples/capture ===
Can't call method "mode" on an undefined value at examples/capture line 85.
=== examples/dumpepg ===
Electronic Program Guide <.epg>

can't open .epg: No such file or directory at examples/dumpepg line 14
=== examples/epgview ===
=== examples/finder ===
Can't call method "mode" on an undefined value at examples/finder line 10.
=== examples/getepg ===
Undefined subroutine &Video::Capture::V4l::VBI::v4l_open called at 
/usr/lib/perl5/Video/Capture/V4l.pm line 177.
=== examples/grab ===
Device: name USB Camera (046d:08a2), type capture, channels 1, audios 0, sizes 
48x32-640x480
Channel 0: name zc3xx, tuners 0, flags, type camera, norm 0
Audio Channel 0: volume 0, bass 0, treble 0, flags, name Microphone, mode 0, 
balance 0, step 1
Picture Settings: brightness 32896, hue 0, colour 0, contrast 32768, whiteness 
39321, depth 8, palette 0
Can't call method "mode" on an undefined value at examples/grab line 103.
=== examples/indexer ===
Can't call method "mode" on an undefined value at examples/indexer line 10.
=== examples/linux-dsp-ioctl.ph ===
=== examples/mp2enc ===
/tmp/vstream did not return a true value at examples/mp2enc line 10.
=== examples/mpgenc ===
/tmp/vstream did not return a true value at examples/mpgenc line 10.
=== examples/nbcmp3 ===
Undefined subroutine &Video::Capture::V4l::VBI::v4l_open called at 
/usr/lib/perl5/Video/Capture/V4l.pm line 177.
=== examples/record ===
Device: name USB Camera (046d:08a2), type capture, channels 1, audios 0, sizes 
48x32-640x480
Channel 0: name zc3xx, tuners 0, flags, type camera, norm 0
Audio Channel 0: volume 0, bass 0, treble 0, flags, name Microphone, mode 0, 
balance 0, step 1
Picture Settings: brightness 32896, hue 0, colour 0, contrast 32768, whiteness 
39321, depth 8, palette 0
Can't call method "mode" on an undefined value at examples/record line 103.
=== examples/settv ===
Device: name USB Camera (046d:08a2), type capture, channels 1, audios 0, sizes 
48x32-640x480
Channel 0: name zc3xx, tuners 0, flags, type camera, norm 0
Audio Channel 0: volume 0, bass 0, treble 0, flags, name Microphone, mode 0, 
balance 0, step 1
Picture Settings: brightness 32896, hue 0, colour 0, contrast 32768, whiteness 
39321, depth 8, palette 0
Can't call method "mode" on an undefined value at examples/settv line 105.
=== examples/vbi ===
Undefined subroutine &Video::Capture::V4l::VBI::v4l_open called at 
/usr/lib/perl5/Video/Capture/V4l.pm line 177.
=== examples/vbi-info ===
Undefined subroutine &Video::Capture::V4l::VBI::v4l_open called at 
/usr/lib/perl5/Video/Capture/V4l.pm line 177.
=== examples/xsview ===
/tmp/vstream did not return a true value at examples/xsview line 9.


2) If I add v4l_open to Video::Capture::V4l::VBI (attachment vbi.diff):

$ for s in examples/*; do echo "=== $s ==="; PERL5LIB=/:examples perl $s; done
=== examples/autotune ===
Can't call method "mode" on an undefined value at examples/autotune line 25.
=== examples/capture ===
Can't call method "mode" on an undefined value at examples/capture line 85.
=== examples/dumpepg ===
Electronic Program Guide <.epg>

can't open .epg: No such file or directory at examples/dumpepg line 14
=== examples/epgview ===
=== examples/finder ===
Can't call method "mode" on an undefined value at examples/finder line 10.
=== examples/getepg ===
Capturing VBI block. Make sure you have tuned in to a channel with EPG!
Aquisition may take up to twenty minutes (and more)!
Negative offset to vec in lvalue context at examples/getepg line 175.
=== examples/grab ===
Device: name USB Camera (046d:08a2), type capture, channels 1, audios 0, sizes 
48x32-640x480
Channel 0: name zc3xx, tuners 0, flags, type camera, norm 0
Audio Channel 0: volume 0, bass 0, treble 0, flags, name Microphone, mode 0, 
balance 0, step 1
Picture Settings: brightness 32896, hue 0, colour 0, contrast 32768, whiteness 
39321, depth 8, palette 0
Can't call method "mode" on an undefined value at examples/grab line 103.
=== examples/indexer ===
Can't call method "mode" on an undefined value at examples/indexer line 10.
=== examples/linux-dsp-ioctl.ph ===
=== examples/mp2enc ===
/tmp/vstream did not return a true value at examples/mp2enc line 10.
=== examples/mpgenc ===
/tmp/vstream did not return a true value at examples/mpgenc line 10.
=== examples/nbcmp3 ===
panic: sv_setpvn called with negative strlen at examples/nbcmp3 line 27.
=== examples/record ===
Device: name USB Camera (046d:08a2), type capture, channels 1, audios 0, sizes 
48x32-640x480
Channel 0: name zc3xx, tuners 0, flags, type camera, norm 0
Audio Channel 0: volume 0, bass 0, treble 0, flags, name Microphone, mode 0, 
balance 0, step 1
Picture Settings: brightness 32896, hue 0, colour 0, contrast 32768, whiteness 
39321, depth 8, palette 0
Can't call method "mode" on an undefined value at examples/record line 103.
=== examples/settv ===
Device: name USB Camera (046d:08a2), type capture, channels 1, audios 0, sizes 
48x32-640x480
Channel 0: name zc3xx, tuners 0, flags, type camera, norm 0
Audio Channel 0: volume 0, bass 0, treble 0, flags, name Microphone, mode 0, 
balance 0, step 1
Picture Settings: brightness 32896, hue 0, colour 0, contrast 32768, whiteness 
39321, depth 8, palette 0
Can't call method "mode" on an undefined value at examples/settv line 105.
=== examples/vbi ===
Capturing VBI block. Make sure you have tuned in to a channel!
Negative offset to vec in lvalue context at examples/vbi line 53.
=== examples/vbi-info ===
VBI capturing started.

You can enter the following commands, ended by <return>

q   quit
c   clear

panic: sv_setpvn called with negative strlen at examples/vbi-info line 44.
=== examples/xsview ===
/tmp/vstream did not return a true value at examples/xsview line 9.


3) I'm wondering if we need to replace munmap/ioctl/mmap/read too?
   I've started to do that some time ago (attachment v4l1.patch)
   but now I don't see a difference.


4) Testing is a bit difficult for me with my cheap webcam, since it
   doesn't support many functions; IIUIC some stuff expects a TV card
   ...

Cheers,
gregor
-- 
 .''`.   http://info.comodo.priv.at/ -- GPG Key IDs: 0x8649AA06, 0x00F3CFE4
 : :' :  Debian GNU/Linux user, admin, & developer - http://www.debian.org/
 `. `'   Member of VIBE!AT & SPI, fellow of Free Software Foundation Europe
   `-    NP: Rolling Stones
Index: debian/patches/v4l2.patch
===================================================================
--- debian/patches/v4l2.patch	(revision 53987)
+++ debian/patches/v4l2.patch	(working copy)
@@ -33,7 +33,23 @@
  #ifndef pTHX_
  #define pTHX_
  #endif
-@@ -430,6 +432,15 @@ _picture_new(fd)
+@@ -314,6 +316,15 @@ queued(self)
+ 	OUTPUT:
+         RETVAL
+ 
++int
++v4l_open (file,oflag)
++        char    *file
++        int     oflag
++        CODE:
++            RETVAL = v4l1_open (file, oflag);
++        OUTPUT:
++        RETVAL
++
+ MODULE = Video::Capture::V4l		PACKAGE = Video::Capture::V4l		
+ 
+ SV *
+@@ -430,6 +441,15 @@ _picture_new(fd)
          OUTPUT:
          RETVAL
  
--- a/V4l/V4l.xs
+++ b/V4l/V4l.xs
@@ -10,6 +10,7 @@
 #include <string.h>
 #include <pthread.h>
 #include <linux/videodev.h>
+#include <libv4l1.h>
 
 #define NEED_newCONSTSUB
 #include "../gppport.h"
@@ -91,7 +92,7 @@ static int
 private_free (pTHX_ SV *obj, MAGIC *mg)
 {
   struct private *p = (struct private *)mg->mg_ptr;
-  munmap (p->mmap_base, p->vm.size);
+  v4l1_munmap (p->mmap_base, p->vm.size);
   return 0;
 }
 
@@ -107,9 +108,9 @@ find_private (SV *sv)
     {
       struct private p;
       p.fd = SvIV (*hv_fetch (hv, "fd", 2, 0));
-      if (ioctl (p.fd, VIDIOCGMBUF, &p.vm) == 0)
+      if (v4l1_ioctl (p.fd, VIDIOCGMBUF, &p.vm) == 0)
         {
-          p.mmap_base = (unsigned char *)mmap (0, p.vm.size, PROT_READ|PROT_WRITE, MAP_SHARED, p.fd, 0);
+          p.mmap_base = (unsigned char *)v4l1_mmap (0, p.vm.size, PROT_READ|PROT_WRITE, MAP_SHARED, p.fd, 0);
           if (p.mmap_base)
             {
               sv_magic ((SV*)hv, 0, '~', (char*)&p, sizeof p);
@@ -166,7 +167,7 @@ vbi_snatcher_thread (void *arg)
           pthread_mutex_unlock (&vbi_lock);
 
           next->next = 0;
-          next->size = read (vbi_fd, next->data, VBI_BPF);
+          next->size = v4l1_read (vbi_fd, next->data, VBI_BPF);
 
           pthread_mutex_lock (&vbi_lock);
 
@@ -231,7 +232,7 @@ field(self)
 
             RETVAL = newSVpvn ("", 0);
             SvGROW (RETVAL, VBI_BPF);
-            len = read (fd, SvPV_nolen (RETVAL), VBI_BPF);
+            len = v4l1_read (fd, SvPV_nolen (RETVAL), VBI_BPF);
             SvCUR_set (RETVAL, len);
           }
 
@@ -344,7 +345,7 @@ capture(sv,frame,width,height,format = V
             vm.height = height;
             vm.width  = width;
             vm.format = format;
-            if (ioctl (p->fd, VIDIOCMCAPTURE, &vm) == 0)
+            if (v4l1_ioctl (p->fd, VIDIOCMCAPTURE, &vm) == 0)
               {
                 SV *fr = newSV (0);
                 SvUPGRADE (fr, SVt_PV);
@@ -372,7 +373,7 @@ sync(sv,frame)
 {
         struct private *p;
         if ((p = find_private (sv))
-            && ioctl (p->fd, VIDIOCSYNC, &frame) == 0)
+            && v4l1_ioctl (p->fd, VIDIOCSYNC, &frame) == 0)
           XSRETURN_YES;
         else
           XSRETURN_EMPTY;
@@ -386,11 +387,11 @@ _freq (fd,fr)
         if (items > 1)
           {
             fr = ((fr<<4)+499)/1000;
-            ioctl (fd, VIDIOCSFREQ, &fr);
+            v4l1_ioctl (fd, VIDIOCSFREQ, &fr);
           }
         if (GIMME_V != G_VOID)
           {
-            if (ioctl (fd, VIDIOCGFREQ, &fr) == 0)
+            if (v4l1_ioctl (fd, VIDIOCGFREQ, &fr) == 0)
               RETVAL = (fr*1000+7)>>4;
             else
               XSRETURN_EMPTY;
@@ -456,7 +457,7 @@ void
 get(sv)
 	SV *	sv
         CODE:
-        XSRETURN_bool (ioctl (SvIV (SvRV (sv)), VIDIOCGCAP, old_struct (sv, "Video::Capture::V4l::Capability")) == 0);
+        XSRETURN_bool (v4l1_ioctl (SvIV (SvRV (sv)), VIDIOCGCAP, old_struct (sv, "Video::Capture::V4l::Capability")) == 0);
 
 MODULE = Video::Capture::V4l		PACKAGE = Video::Capture::V4l::Channel
 
@@ -464,13 +465,13 @@ void
 get(sv)
 	SV *	sv
         CODE:
-        XSRETURN_bool (ioctl (SvIV (SvRV (sv)), VIDIOCGCHAN, old_struct (sv, "Video::Capture::V4l::Channel")) == 0);
+        XSRETURN_bool (v4l1_ioctl (SvIV (SvRV (sv)), VIDIOCGCHAN, old_struct (sv, "Video::Capture::V4l::Channel")) == 0);
 
 void
 set(sv)
 	SV *	sv
         CODE:
-        XSRETURN_bool (ioctl (SvIV (SvRV (sv)), VIDIOCSCHAN, old_struct (sv, "Video::Capture::V4l::Channel")) == 0);
+        XSRETURN_bool (v4l1_ioctl (SvIV (SvRV (sv)), VIDIOCSCHAN, old_struct (sv, "Video::Capture::V4l::Channel")) == 0);
 
 MODULE = Video::Capture::V4l		PACKAGE = Video::Capture::V4l::Tuner
 
@@ -478,13 +479,13 @@ void
 get(sv)
 	SV *	sv
         CODE:
-        XSRETURN_bool (ioctl (SvIV (SvRV (sv)), VIDIOCGTUNER, old_struct (sv, "Video::Capture::V4l::Tuner")) == 0);
+        XSRETURN_bool (v4l1_ioctl (SvIV (SvRV (sv)), VIDIOCGTUNER, old_struct (sv, "Video::Capture::V4l::Tuner")) == 0);
 
 void
 set(sv)
 	SV *	sv
         CODE:
-        XSRETURN_bool (ioctl (SvIV (SvRV (sv)), VIDIOCSTUNER, old_struct (sv, "Video::Capture::V4l::Tuner")) == 0);
+        XSRETURN_bool (v4l1_ioctl (SvIV (SvRV (sv)), VIDIOCSTUNER, old_struct (sv, "Video::Capture::V4l::Tuner")) == 0);
 
 MODULE = Video::Capture::V4l		PACKAGE = Video::Capture::V4l::Audio
 
@@ -492,13 +493,13 @@ void
 get(sv)
 	SV *	sv
         CODE:
-        XSRETURN_bool (ioctl (SvIV (SvRV (sv)), VIDIOCGAUDIO, old_struct (sv, "Video::Capture::V4l::Audio")) == 0);
+        XSRETURN_bool (v4l1_ioctl (SvIV (SvRV (sv)), VIDIOCGAUDIO, old_struct (sv, "Video::Capture::V4l::Audio")) == 0);
 
 void
 set(sv)
 	SV *	sv
         CODE:
-        XSRETURN_bool (ioctl (SvIV (SvRV (sv)), VIDIOCSAUDIO, old_struct (sv, "Video::Capture::V4l::Audio")) == 0);
+        XSRETURN_bool (v4l1_ioctl (SvIV (SvRV (sv)), VIDIOCSAUDIO, old_struct (sv, "Video::Capture::V4l::Audio")) == 0);
 
 MODULE = Video::Capture::V4l		PACKAGE = Video::Capture::V4l::Picture
 
@@ -506,13 +507,13 @@ void
 get(sv)
 	SV *	sv
         CODE:
-        XSRETURN_bool (ioctl (SvIV (SvRV (sv)), VIDIOCGPICT, old_struct (sv, "Video::Capture::V4l::Picture")) == 0);
+        XSRETURN_bool (v4l1_ioctl (SvIV (SvRV (sv)), VIDIOCGPICT, old_struct (sv, "Video::Capture::V4l::Picture")) == 0);
 
 void
 set(sv)
 	SV *	sv
         CODE:
-        XSRETURN_bool (ioctl (SvIV (SvRV (sv)), VIDIOCSPICT, old_struct (sv, "Video::Capture::V4l::Picture")) == 0);
+        XSRETURN_bool (v4l1_ioctl (SvIV (SvRV (sv)), VIDIOCSPICT, old_struct (sv, "Video::Capture::V4l::Picture")) == 0);
 
 # accessors/mutators
 INCLUDE: ./genacc |

Attachment: signature.asc
Description: Digital signature

Reply via email to