patches/opencv-04-v4l2.diff
author jurikm
Sun, 12 Feb 2012 14:04:10 +0000
changeset 8245 383896da4129
parent 2630 76008ae2dbc0
permissions -rw-r--r--
SFEsauerbraten.spec: add IPS package name
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
     1
--- OpenCV-2.1.0.orig/CMakeLists.txt	2010-04-05 21:24:37.000000000 -0400
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
     2
+++ OpenCV-2.1.0/CMakeLists.txt	2010-05-12 17:19:20.551785342 -0400
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
     3
@@ -201,6 +201,7 @@
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
     4
     include(OpenCVFindPkgConfig.cmake OPTIONAL)
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
     5
     include(CheckFunctionExists)
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
     6
     include(CheckIncludeFile)
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
     7
+    include(CheckIncludeFiles)
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
     8
 endif()
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
     9
 
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
    10
 #if(MSVC)
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
    11
@@ -404,7 +405,13 @@
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
    12
         if(WITH_V4L)
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    13
             CHECK_MODULE(libv4l1 HAVE_LIBV4L)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    14
             CHECK_INCLUDE_FILE(linux/videodev.h HAVE_CAMV4L)
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
    15
-            CHECK_INCLUDE_FILE(linux/videodev2.h HAVE_CAMV4L2)
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
    16
+            CHECK_INCLUDE_FILES("asm/types.h;linux/videodev2.h" HAVE_LINUX_V4L2)
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
    17
+            if(NOT HAVE_LINUX_V4L2)
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
    18
+                CHECK_INCLUDE_FILES("sys/types.h;sys/ioccom.h;sys/videodev2.h" HAVE_OTHER_V4L2)
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
    19
+            endif()
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
    20
+            if(HAVE_LINUX_V4L2 OR HAVE_OTHER_V4L2)
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
    21
+                set(HAVE_CAMV4L2 TRUE)
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
    22
+            endif()
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    23
         else()
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    24
             set(HAVE_LIBV4L FALSE)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    25
             set(HAVE_CAMV4L FALSE)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    26
--- OpenCV-2.1.0.orig/src/highgui/cvcap.cpp	2010-04-05 21:24:44.000000000 -0400
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    27
+++ OpenCV-2.1.0/src/highgui/cvcap.cpp	2010-05-09 06:35:20.867721938 -0400
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    28
@@ -129,7 +129,7 @@
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    29
     for (int i = 0; domains[i] >= 0; i++)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    30
     {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    31
         #if defined(HAVE_VIDEOINPUT) || defined(HAVE_TYZX) || defined(HAVE_VFW) || \
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    32
-        defined(HAVE_CAMV4L) || defined (HAVE_CAMV4L2) || defined(HAVE_GSTREAMER) || \
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
    33
+        defined(HAVE_CAMV4L) || defined (HAVE_CAMV4L2) || \
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    34
         defined(HAVE_DC1394_2) || defined(HAVE_DC1394) || defined(HAVE_CMU1394) || \
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    35
         defined(HAVE_GSTREAMER) || defined(HAVE_MIL) || defined(HAVE_QUICKTIME) || \
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    36
         defined(HAVE_UNICAP) || defined(HAVE_PVAPI)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    37
--- OpenCV-2.1.0.orig/src/highgui/cvcap_v4l.cpp	2010-04-05 21:24:44.000000000 -0400
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
    38
+++ OpenCV-2.1.0/src/highgui/cvcap_v4l.cpp	2010-05-12 20:38:16.605463073 -0400
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    39
@@ -202,7 +202,7 @@
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    40
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    41
 #include "_highgui.h"
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    42
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    43
-#if !defined WIN32 && defined HAVE_CAMV4L
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
    44
+#if !defined WIN32 && (defined HAVE_CAMV4L || defined HAVE_CAMV4L2)
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    45
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    46
 #define CLEAR(x) memset (&(x), 0, sizeof (x))
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    47
 
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
    48
@@ -214,17 +214,24 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    49
 #include <sys/types.h>
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    50
 #include <sys/mman.h>
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    51
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    52
+#ifdef HAVE_CAMV4L
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    53
 #include <linux/videodev.h>
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    54
+#endif
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    55
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    56
 #include <string.h>
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    57
 #include <stdlib.h>
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    58
-#include <asm/types.h>          /* for videodev2.h */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    59
 #include <assert.h>
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    60
 #include <sys/stat.h>
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    61
 #include <sys/ioctl.h>
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
    62
 
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    63
 #ifdef HAVE_CAMV4L2
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
    64
+#if defined __linux || defined __linux__
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
    65
+#include <asm/types.h>
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    66
 #include <linux/videodev2.h>
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
    67
+#else
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    68
+#include <sys/ioccom.h>
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    69
+#include <sys/videodev2.h>
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    70
+#endif
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
    71
 #endif
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    72
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    73
 /* Defaults - If your board can do better, set it here.  Set for the most common type inputs. */
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
    74
@@ -255,8 +262,6 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    75
   size_t  length;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    76
 };
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    77
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    78
-static unsigned int n_buffers = 0;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    79
-
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    80
 /* Additional V4L2 pixelformats support for Sonix SN9C10x base webcams */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    81
 #ifndef V4L2_PIX_FMT_SBGGR8
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    82
 #define V4L2_PIX_FMT_SBGGR8  v4l2_fourcc('B','A','8','1') /* 8 BGBG.. GRGR.. */
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
    83
@@ -286,18 +291,25 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    84
     int deviceHandle;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    85
     int bufferIndex;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    86
     int FirstCapture;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    87
+    bool devicePollable;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    88
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    89
+#ifdef HAVE_CAMV4L
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    90
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    91
     struct video_capability capability;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    92
     struct video_window     captureWindow;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    93
     struct video_picture    imageProperties;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    94
     struct video_mbuf       memoryBuffer;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    95
     struct video_mmap       *mmaps;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    96
     char *memoryMap;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    97
+#endif /* HAVE_CAMV4L */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    98
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    99
     IplImage frame;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   100
 
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   101
 #ifdef HAVE_CAMV4L2
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   102
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   103
    /* V4L2 variables */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   104
    buffer buffers[MAX_V4L_BUFFERS + 1];
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   105
+   unsigned int n_buffers;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   106
    struct v4l2_capability cap;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   107
    struct v4l2_input inp;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   108
    struct v4l2_format form;
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   109
@@ -391,6 +403,7 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   110
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   111
 }; /* End icvInitCapture_V4L */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   112
 
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   113
+#ifdef HAVE_CAMV4L
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   114
 static int
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   115
 try_palette(int fd,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   116
             struct video_picture *cam_pic,
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   117
@@ -407,6 +420,7 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   118
     return 1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   119
   return 0;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   120
 }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   121
+#endif /* HAVE_CAMV4L */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   122
 
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   123
 #ifdef HAVE_CAMV4L2
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   124
 
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   125
@@ -431,8 +445,9 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   126
 }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   127
 
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   128
 #endif /* HAVE_CAMV4L2 */
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   129
+#ifdef HAVE_CAMV4L
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   130
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   131
-static int try_init_v4l(CvCaptureCAM_V4L* capture, char *deviceName)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   132
+static int try_init_v4l(CvCaptureCAM_V4L* capture, const char *deviceName)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   133
 {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   134
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   135
   // if detect = -1 then unable to open device
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   136
@@ -474,9 +489,10 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   137
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   138
 }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   139
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   140
+#endif /* HAVE_CAMV4L */
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   141
 #ifdef HAVE_CAMV4L2
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   142
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   143
-static int try_init_v4l2(CvCaptureCAM_V4L* capture, char *deviceName)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   144
+static int try_init_v4l2(CvCaptureCAM_V4L* capture, const char *deviceName)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   145
 {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   146
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   147
   // if detect = -1 then unable to open device
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   148
@@ -491,7 +507,6 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   149
   capture->deviceHandle = open (deviceName, O_RDWR /* required */ | O_NONBLOCK, 0);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   150
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   151
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   152
-
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   153
   if (capture->deviceHandle == 0)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   154
   {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   155
     detect = -1;
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   156
@@ -510,6 +525,8 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   157
     }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   158
       else
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   159
     {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   160
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   161
+#ifdef HAVE_CAMV4L
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   162
       CLEAR (capture->capability);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   163
       capture->capability.type = capture->cap.capabilities;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   164
 
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   165
@@ -518,6 +535,10 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   166
       {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   167
         detect = 1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   168
       }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   169
+#else
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   170
+      detect = 1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   171
+#endif /* HAVE_CAMV4L */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   172
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   173
     }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   174
   }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   175
 
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   176
@@ -544,10 +565,6 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   177
   else
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   178
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   179
 #ifdef HAVE_JPEG
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   180
-#ifdef __USE_GNU
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   181
-      /* support for MJPEG is only available with libjpeg and gcc,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   182
-	 because it's use libjepg and fmemopen()
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   183
-      */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   184
   if (try_palette_v4l2(capture, V4L2_PIX_FMT_MJPEG) == 0 ||
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   185
       try_palette_v4l2(capture, V4L2_PIX_FMT_JPEG) == 0)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   186
   {
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   187
@@ -555,7 +572,6 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   188
   }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   189
   else
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   190
 #endif
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   191
-#endif
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   192
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   193
   if (try_palette_v4l2(capture, V4L2_PIX_FMT_YUYV) == 0)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   194
   {
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   195
@@ -590,6 +606,7 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   196
 }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   197
 
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   198
 #endif /* HAVE_CAMV4L2 */
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   199
+#ifdef HAVE_CAMV4L
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   200
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   201
 static int autosetup_capture_mode_v4l(CvCaptureCAM_V4L* capture)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   202
 {
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   203
@@ -624,6 +641,7 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   204
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   205
 }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   206
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   207
+#endif /* HAVE_CAMV4L */
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   208
 #ifdef HAVE_CAMV4L2
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   209
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   210
 static void v4l2_scan_controls_enumerate_menu(CvCaptureCAM_V4L* capture)
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   211
@@ -648,7 +666,7 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   212
 static void v4l2_scan_controls(CvCaptureCAM_V4L* capture)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   213
 {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   214
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   215
-  __u32 ctrl_id;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   216
+  unsigned int ctrl_id;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   217
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   218
   for (ctrl_id = V4L2_CID_BASE;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   219
        ctrl_id < V4L2_CID_LASTP1;
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   220
@@ -794,7 +812,111 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   221
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   222
 }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   223
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   224
-static int _capture_V4L2 (CvCaptureCAM_V4L *capture, char *deviceName)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   225
+static int init_read_v4l2 (CvCaptureCAM_V4L *capture)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   226
+{
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   227
+   unsigned int size = capture->form.fmt.pix.sizeimage;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   228
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   229
+   capture->buffers[0].start = malloc( size );
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   230
+   if (!capture->buffers[0].start) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   231
+       perror ("malloc");
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   232
+       return -1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   233
+   }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   234
+   capture->buffers[0].length = size;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   235
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   236
+   capture->buffers[MAX_V4L_BUFFERS].start = malloc( size );
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   237
+   if (!capture->buffers[MAX_V4L_BUFFERS].start) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   238
+       perror ("malloc");
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   239
+       return -1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   240
+   }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   241
+   capture->buffers[MAX_V4L_BUFFERS].length = size;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   242
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   243
+   capture->n_buffers = 0;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   244
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   245
+   return 0;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   246
+}
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   247
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   248
+static int init_mmap_v4l2 (CvCaptureCAM_V4L *capture, const char *deviceName)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   249
+{
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   250
+   unsigned int buffer_number = DEFAULT_V4L_BUFFERS;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   251
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   252
+   CLEAR (capture->req);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   253
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   254
+   try_again:
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   255
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   256
+   capture->req.count = buffer_number;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   257
+   capture->req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   258
+   capture->req.memory = V4L2_MEMORY_MMAP;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   259
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   260
+   if (-1 == xioctl (capture->deviceHandle, VIDIOC_REQBUFS, &capture->req))
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   261
+   {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   262
+       if (EINVAL == errno)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   263
+       {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   264
+         fprintf (stderr, "%s does not support memory mapping\n", deviceName);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   265
+       } else {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   266
+         perror ("VIDIOC_REQBUFS");
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   267
+       }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   268
+       return -1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   269
+   }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   270
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   271
+   if (capture->req.count < buffer_number)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   272
+   {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   273
+       if (buffer_number == 1)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   274
+       {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   275
+           fprintf (stderr, "Insufficient buffer memory on %s\n", deviceName);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   276
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   277
+           return -1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   278
+       } else {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   279
+         buffer_number--;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   280
+	 fprintf (stderr, "Insufficient buffer memory on %s -- decreaseing buffers\n", deviceName);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   281
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   282
+	 goto try_again;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   283
+       }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   284
+   }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   285
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   286
+   for (unsigned int n_buffers = 0; n_buffers < capture->req.count; ++n_buffers)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   287
+   {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   288
+       struct v4l2_buffer buf;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   289
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   290
+       CLEAR (buf);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   291
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   292
+       buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   293
+       buf.memory = V4L2_MEMORY_MMAP;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   294
+       buf.index = n_buffers;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   295
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   296
+       if (-1 == xioctl (capture->deviceHandle, VIDIOC_QUERYBUF, &buf)) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   297
+           perror ("VIDIOC_QUERYBUF");
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   298
+           return -1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   299
+       }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   300
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   301
+       capture->buffers[n_buffers].length = buf.length;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   302
+       capture->buffers[n_buffers].start =
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   303
+         mmap (NULL /* start anywhere */,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   304
+               buf.length,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   305
+               PROT_READ | PROT_WRITE /* required */,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   306
+               MAP_SHARED /* recommended */,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   307
+               capture->deviceHandle, buf.m.offset);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   308
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   309
+       if (MAP_FAILED == capture->buffers[n_buffers].start) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   310
+           perror ("mmap");
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   311
+           return -1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   312
+       }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   313
+   }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   314
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   315
+   unsigned int size = capture->form.fmt.pix.sizeimage;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   316
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   317
+   capture->buffers[MAX_V4L_BUFFERS].start = malloc( size );
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   318
+   if (!capture->buffers[MAX_V4L_BUFFERS].start) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   319
+       perror ("malloc");
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   320
+       return -1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   321
+   }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   322
+   capture->buffers[MAX_V4L_BUFFERS].length = size;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   323
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   324
+   capture->n_buffers = capture->req.count;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   325
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   326
+   return 0;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   327
+}
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   328
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   329
+static int _capture_V4L2 (CvCaptureCAM_V4L *capture, const char *deviceName)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   330
 {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   331
    int detect_v4l2 = 0;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   332
 
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   333
@@ -870,10 +992,6 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   334
        return -1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   335
    }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   336
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   337
-   if (V4L2_SUPPORT == 0)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   338
-   {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   339
-   }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   340
-
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   341
    if (autosetup_capture_mode_v4l2(capture) == -1)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   342
        return -1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   343
 
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   344
@@ -892,90 +1010,28 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   345
    if (capture->form.fmt.pix.sizeimage < min)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   346
        capture->form.fmt.pix.sizeimage = min;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   347
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   348
-   CLEAR (capture->req);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   349
-
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   350
-   unsigned int buffer_number = DEFAULT_V4L_BUFFERS;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   351
-
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   352
-   try_again:
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   353
-
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   354
-   capture->req.count = buffer_number;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   355
-   capture->req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   356
-   capture->req.memory = V4L2_MEMORY_MMAP;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   357
-
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   358
-   if (-1 == xioctl (capture->deviceHandle, VIDIOC_REQBUFS, &capture->req))
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   359
-   {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   360
-       if (EINVAL == errno)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   361
-       {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   362
-         fprintf (stderr, "%s does not support memory mapping\n", deviceName);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   363
-       } else {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   364
-         perror ("VIDIOC_REQBUFS");
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   365
-       }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   366
-       /* free capture, and returns an error code */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   367
-       icvCloseCAM_V4L (capture);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   368
-       return -1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   369
-   }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   370
-
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   371
-   if (capture->req.count < buffer_number)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   372
-   {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   373
-       if (buffer_number == 1)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   374
-       {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   375
-           fprintf (stderr, "Insufficient buffer memory on %s\n", deviceName);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   376
-
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   377
-           /* free capture, and returns an error code */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   378
-           icvCloseCAM_V4L (capture);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   379
-           return -1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   380
-       } else {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   381
-         buffer_number--;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   382
-	 fprintf (stderr, "Insufficient buffer memory on %s -- decreaseing buffers\n", deviceName);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   383
-
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   384
-	 goto try_again;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   385
-       }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   386
-   }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   387
-
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   388
-   for (n_buffers = 0; n_buffers < capture->req.count; ++n_buffers)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   389
-   {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   390
-       struct v4l2_buffer buf;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   391
-
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   392
-       CLEAR (buf);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   393
-
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   394
-       buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   395
-       buf.memory = V4L2_MEMORY_MMAP;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   396
-       buf.index = n_buffers;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   397
-
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   398
-       if (-1 == xioctl (capture->deviceHandle, VIDIOC_QUERYBUF, &buf)) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   399
-           perror ("VIDIOC_QUERYBUF");
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   400
-
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   401
-           /* free capture, and returns an error code */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   402
-           icvCloseCAM_V4L (capture);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   403
+   if (capture->cap.capabilities & V4L2_CAP_STREAMING) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   404
+       if (-1 == init_mmap_v4l2(capture, deviceName)) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   405
+           icvCloseCAM_V4L(capture);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   406
            return -1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   407
        }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   408
-
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   409
-       capture->buffers[n_buffers].length = buf.length;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   410
-       capture->buffers[n_buffers].start =
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   411
-         mmap (NULL /* start anywhere */,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   412
-               buf.length,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   413
-               PROT_READ | PROT_WRITE /* required */,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   414
-               MAP_SHARED /* recommended */,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   415
-               capture->deviceHandle, buf.m.offset);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   416
-
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   417
-       if (MAP_FAILED == capture->buffers[n_buffers].start) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   418
-           perror ("mmap");
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   419
-
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   420
-           /* free capture, and returns an error code */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   421
-           icvCloseCAM_V4L (capture);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   422
+   } else {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   423
+       if (capture->cap.capabilities & V4L2_CAP_READWRITE) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   424
+           if (-1 == init_read_v4l2(capture)) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   425
+               icvCloseCAM_V4L(capture);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   426
+               return -1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   427
+           }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   428
+       } else {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   429
+           fprintf( stderr, "HIGHGUI ERROR: V4L2: device %s does not support either memory mapped or read/write I/O.\n",deviceName);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   430
+           icvCloseCAM_V4L(capture);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   431
            return -1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   432
        }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   433
-
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   434
-       if (n_buffers == 0) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   435
-	 capture->buffers[MAX_V4L_BUFFERS].start = malloc( buf.length );
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   436
-	 capture->buffers[MAX_V4L_BUFFERS].length = buf.length;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   437
-       }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   438
    }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   439
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   440
    /* Set up Image data */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   441
    cvInitImageHeader( &capture->frame,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   442
-                      cvSize( capture->captureWindow.width,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   443
-                              capture->captureWindow.height ),
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   444
+                      cvSize( capture->form.fmt.pix.width,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   445
+                              capture->form.fmt.pix.height ),
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   446
                       IPL_DEPTH_8U, 3, IPL_ORIGIN_TL, 4 );
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   447
    /* Allocate space for RGBA data */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   448
    capture->frame.imageData = (char *)cvAlloc(capture->frame.imageSize);
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   449
@@ -984,8 +1040,9 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   450
 }; /* End _capture_V4L2 */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   451
 
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   452
 #endif /* HAVE_CAMV4L2 */
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   453
+#ifdef HAVE_CAMV4L
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   454
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   455
-static int _capture_V4L (CvCaptureCAM_V4L *capture, char *deviceName)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   456
+static int _capture_V4L (CvCaptureCAM_V4L *capture, const char *deviceName)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   457
 {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   458
    int detect_v4l = 0;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   459
 
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   460
@@ -1103,6 +1160,8 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   461
    return 1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   462
 }; /* End _capture_V4L */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   463
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   464
+#endif /* HAVE_CAMV4L */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   465
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   466
 static CvCaptureCAM_V4L * icvCaptureFromCAM_V4L (int index)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   467
 {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   468
    static int autoindex;
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   469
@@ -1152,10 +1211,12 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   470
        icvCloseCAM_V4L(capture);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   471
        V4L2_SUPPORT = 0;
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   472
 #endif  /* HAVE_CAMV4L2 */
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   473
+#ifdef HAVE_CAMV4L
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   474
        if (_capture_V4L (capture, deviceName) == -1) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   475
            icvCloseCAM_V4L(capture);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   476
            return NULL;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   477
        }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   478
+#endif  /* HAVE_CAMV4L */
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   479
 #ifdef HAVE_CAMV4L2
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   480
    } else {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   481
        V4L2_SUPPORT = 1;
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   482
@@ -1168,6 +1229,26 @@
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   483
 #ifdef HAVE_CAMV4L2
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   484
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   485
 static int read_frame_v4l2(CvCaptureCAM_V4L* capture) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   486
+    if (-1 == read(capture->deviceHandle,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   487
+                   capture->buffers[0].start,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   488
+                   capture->buffers[0].length)) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   489
+        switch (errno) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   490
+        case EAGAIN:
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   491
+            return 0;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   492
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   493
+        case EIO:
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   494
+        default:
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   495
+            /* display the error and stop processing */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   496
+            perror ("read");
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   497
+            return 1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   498
+        }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   499
+    }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   500
+    capture->bufferIndex = 0;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   501
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   502
+    return 1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   503
+}
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   504
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   505
+static int mmap_read_frame_v4l2(CvCaptureCAM_V4L* capture) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   506
     struct v4l2_buffer buf;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   507
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   508
     CLEAR (buf);
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   509
@@ -1197,18 +1278,12 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   510
         }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   511
    }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   512
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   513
-   assert(buf.index < capture->req.count);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   514
+   assert(buf.index < capture->n_buffers);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   515
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   516
-   memcpy(capture->buffers[MAX_V4L_BUFFERS].start,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   517
-	  capture->buffers[buf.index].start,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   518
-	  capture->buffers[MAX_V4L_BUFFERS].length );
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   519
-   capture->bufferIndex = MAX_V4L_BUFFERS;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   520
+   capture->bufferIndex = buf.index;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   521
    //printf("got data in buff %d, len=%d, flags=0x%X, seq=%d, used=%d)\n",
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   522
    //	  buf.index, buf.length, buf.flags, buf.sequence, buf.bytesused);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   523
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   524
-   if (-1 == xioctl (capture->deviceHandle, VIDIOC_QBUF, &buf))
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   525
-       perror ("VIDIOC_QBUF");
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   526
-
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   527
    return 1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   528
 }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   529
 
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   530
@@ -1218,7 +1293,7 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   531
     count = 1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   532
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   533
     while (count-- > 0) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   534
-        for (;;) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   535
+        for (; capture->devicePollable == true;) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   536
             fd_set fds;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   537
             struct timeval tv;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   538
             int r;
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   539
@@ -1233,10 +1308,12 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   540
             r = select (capture->deviceHandle+1, &fds, NULL, NULL, &tv);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   541
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   542
             if (-1 == r) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   543
-                if (EINTR == errno)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   544
+                if (EINTR == errno || EAGAIN == errno)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   545
                     continue;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   546
-
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   547
-                perror ("select");
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   548
+                if (ENXIO == errno)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   549
+		    capture->devicePollable = false;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   550
+		else
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   551
+                    perror ("select");
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   552
             }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   553
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   554
             if (0 == r) {
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   555
@@ -1245,7 +1322,12 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   556
                 /* end the infinite loop */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   557
                 break;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   558
             }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   559
+        }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   560
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   561
+        if (capture->n_buffers != 0) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   562
+            if (mmap_read_frame_v4l2 (capture))
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   563
+                break;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   564
+        } else {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   565
             if (read_frame_v4l2 (capture))
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   566
                 break;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   567
         }
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   568
@@ -1267,9 +1349,7 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   569
       if (V4L2_SUPPORT == 1)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   570
       {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   571
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   572
-        for (capture->bufferIndex = 0;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   573
-             capture->bufferIndex < ((int)capture->req.count);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   574
-             ++capture->bufferIndex)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   575
+        for (unsigned int n_buffers = 0; n_buffers < capture->n_buffers; ++n_buffers)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   576
         {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   577
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   578
           struct v4l2_buffer buf;
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   579
@@ -1278,7 +1358,7 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   580
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   581
           buf.type        = V4L2_BUF_TYPE_VIDEO_CAPTURE;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   582
           buf.memory      = V4L2_MEMORY_MMAP;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   583
-          buf.index       = (unsigned long)capture->bufferIndex;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   584
+          buf.index       = (unsigned long)n_buffers;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   585
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   586
           if (-1 == xioctl (capture->deviceHandle, VIDIOC_QBUF, &buf)) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   587
               perror ("VIDIOC_QBUF");
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   588
@@ -1286,17 +1366,20 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   589
           }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   590
         }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   591
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   592
-        /* enable the streaming */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   593
-        capture->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   594
-        if (-1 == xioctl (capture->deviceHandle, VIDIOC_STREAMON,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   595
-                          &capture->type)) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   596
-            /* error enabling the stream */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   597
-            perror ("VIDIOC_STREAMON");
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   598
-            return 0;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   599
-        }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   600
+        if (capture->n_buffers != 0) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   601
+            /* enable the streaming */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   602
+            capture->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   603
+            if (-1 == xioctl (capture->deviceHandle, VIDIOC_STREAMON,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   604
+                              &capture->type)) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   605
+                /* error enabling the stream */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   606
+                perror ("VIDIOC_STREAMON");
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   607
+                return 0;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   608
+            }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   609
+	}
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   610
       } else
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   611
 #endif /* HAVE_CAMV4L2 */
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   612
       {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   613
+#ifdef HAVE_CAMV4L
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   614
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   615
         for (capture->bufferIndex = 0;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   616
          capture->bufferIndex < (capture->memoryBuffer.frames-1);
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   617
@@ -1313,9 +1396,12 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   618
           }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   619
         }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   620
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   621
+#else
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   622
+        return 0;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   623
+#endif /* HAVE_CAMV4L */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   624
       }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   625
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   626
-#if defined(V4L_ABORT_BADJPEG) && defined(HAVE_CAMV4L2)
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   627
+#if defined V4L_ABORT_BADJPEG && defined HAVE_CAMV4L2
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   628
      if (V4L2_SUPPORT == 1)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   629
      {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   630
         // skip first frame. it is often bad -- this is unnotied in traditional apps,
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   631
@@ -1338,6 +1424,7 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   632
    } else
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   633
 #endif /* HAVE_CAMV4L2 */
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   634
    {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   635
+#ifdef HAVE_CAMV4L
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   636
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   637
      capture->mmaps[capture->bufferIndex].frame  = capture->bufferIndex;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   638
      capture->mmaps[capture->bufferIndex].width  = capture->captureWindow.width;
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   639
@@ -1355,6 +1442,7 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   640
         capture->bufferIndex = 0;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   641
      }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   642
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   643
+#endif /* HAVE_CAMV4L */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   644
    }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   645
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   646
    return(1);
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   647
@@ -2006,8 +2094,7 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   648
   unsigned char *addr;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   649
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   650
   if (!init_done) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   651
-    /* do sonix_decompress_init first! */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   652
-    return -1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   653
+    sonix_decompress_init();
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   654
   }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   655
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   656
   bitpos = 0;
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   657
@@ -2074,12 +2161,16 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   658
   if (V4L2_SUPPORT == 0)
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   659
 #endif /* HAVE_CAMV4L2 */
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   660
   {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   661
+#ifdef HAVE_CAMV4L
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   662
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   663
     /* [FD] this really belongs here */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   664
     if (ioctl(capture->deviceHandle, VIDIOCSYNC, &capture->mmaps[capture->bufferIndex].frame) == -1) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   665
       fprintf( stderr, "HIGHGUI ERROR: V4L: Could not SYNC to video stream. %s\n", strerror(errno));
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   666
     }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   667
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   668
+#else
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   669
+    return 0;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   670
+#endif /* HAVE_CAMV4L */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   671
   }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   672
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   673
    /* Now get what has already been captured as a IplImage return */
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   674
@@ -2104,6 +2195,7 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   675
   } else
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   676
 #endif /* HAVE_CAMV4L2 */
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   677
   {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   678
+#if HAVE_CAMV4L
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   679
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   680
     if((capture->frame.width != capture->mmaps[capture->bufferIndex].width)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   681
       || (capture->frame.height != capture->mmaps[capture->bufferIndex].height)) {
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   682
@@ -2115,6 +2207,7 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   683
        capture->frame.imageData = (char *)cvAlloc(capture->frame.imageSize);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   684
     }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   685
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   686
+#endif /* HAVE_CAMV4L */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   687
   }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   688
 
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   689
 #ifdef HAVE_CAMV4L2
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   690
@@ -2140,10 +2233,6 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   691
                        (unsigned char*)capture->frame.imageData);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   692
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   693
 #ifdef HAVE_JPEG
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   694
-#ifdef __USE_GNU
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   695
-    /* support for MJPEG is only available with libjpeg and gcc,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   696
-       because it's use libjepg and fmemopen()
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   697
-    */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   698
     if (PALETTE_MJPEG == 1)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   699
       if (!mjpeg_to_rgb24(capture->form.fmt.pix.width,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   700
 			  capture->form.fmt.pix.height,
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   701
@@ -2153,7 +2242,6 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   702
 			  (unsigned char*)capture->frame.imageData))
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   703
 	return 0;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   704
 #endif
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   705
-#endif
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   706
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   707
     if (PALETTE_YUYV == 1)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   708
 	yuyv_to_rgb24(capture->form.fmt.pix.width,
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   709
@@ -2177,16 +2265,14 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   710
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   711
     if (PALETTE_SN9C10X == 1)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   712
     {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   713
-      sonix_decompress_init();
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   714
-
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   715
       sonix_decompress(capture->form.fmt.pix.width,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   716
                        capture->form.fmt.pix.height,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   717
                        (unsigned char*)capture->buffers[capture->bufferIndex].start,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   718
-                       (unsigned char*)capture->buffers[(capture->bufferIndex+1) % capture->req.count].start);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   719
+                       (unsigned char*)capture->buffers[MAX_V4L_BUFFERS].start);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   720
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   721
       bayer2rgb24(capture->form.fmt.pix.width,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   722
                   capture->form.fmt.pix.height,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   723
-                  (unsigned char*)capture->buffers[(capture->bufferIndex+1) % capture->req.count].start,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   724
+                  (unsigned char*)capture->buffers[MAX_V4L_BUFFERS].start,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   725
                   (unsigned char*)capture->frame.imageData);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   726
     }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   727
 
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   728
@@ -2194,13 +2280,14 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   729
     {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   730
        sgbrg2rgb24(capture->form.fmt.pix.width,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   731
                   capture->form.fmt.pix.height,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   732
-                  (unsigned char*)capture->buffers[(capture->bufferIndex+1) % capture->req.count].start,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   733
+                  (unsigned char*)capture->buffers[capture->bufferIndex].start,
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   734
                   (unsigned char*)capture->frame.imageData);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   735
     }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   736
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   737
   } else
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   738
 #endif /* HAVE_CAMV4L2 */
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   739
   {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   740
+#if HAVE_CAMV4L
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   741
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   742
     switch(capture->imageProperties.palette) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   743
       case VIDEO_PALETTE_RGB24:
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   744
@@ -2234,7 +2321,23 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   745
         return 0;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   746
     }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   747
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   748
+#endif /* HAVE_CAMV4L */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   749
+  }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   750
+
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   751
+#ifdef HAVE_CAMV4L2
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   752
+  if (capture->n_buffers != 0) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   753
+      struct v4l2_buffer buf;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   754
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   755
+      CLEAR (buf);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   756
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   757
+      buf.type        = V4L2_BUF_TYPE_VIDEO_CAPTURE;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   758
+      buf.memory      = V4L2_MEMORY_MMAP;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   759
+      buf.index       = (unsigned long)capture->bufferIndex;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   760
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   761
+      if (-1 == xioctl (capture->deviceHandle, VIDIOC_QBUF, &buf))
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   762
+          perror ("VIDIOC_QBUF");
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   763
   }
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   764
+#endif /* HAVE_CAMV4L2 */
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   765
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   766
    return(&capture->frame);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   767
 }
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   768
@@ -2358,6 +2461,7 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   769
   } else
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   770
 #endif /* HAVE_CAMV4L2 */
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   771
   {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   772
+#ifdef HAVE_CAMV4L
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   773
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   774
     int retval = -1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   775
 
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   776
@@ -2413,6 +2517,9 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   777
     /* all was OK, so convert to 0.0 - 1.0 range, and return the value */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   778
     return float (retval) / 0xFFFF;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   779
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   780
+#else
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   781
+    return -1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   782
+#endif /* HAVE_CAMV4L */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   783
   }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   784
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   785
 };
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   786
@@ -2482,6 +2589,7 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   787
   } else
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   788
 #endif /* HAVE_CAMV4L2 */
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   789
   {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   790
+#ifdef HAVE_CAMV4L
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   791
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   792
     if (capture==0) return 0;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   793
      if (w>capture->capability.maxwidth) {
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   794
@@ -2506,6 +2614,7 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   795
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   796
      capture->FirstCapture = 1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   797
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   798
+#endif /* HAVE_CAMV4L */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   799
   }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   800
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   801
   return 0;
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   802
@@ -2641,6 +2750,7 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   803
   } else
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   804
 #endif /* HAVE_CAMV4L2 */
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   805
   {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   806
+#ifdef HAVE_CAMV4L
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   807
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   808
     int v4l_value;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   809
 
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   810
@@ -2683,6 +2793,9 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   811
        icvCloseCAM_V4L(capture);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   812
        return -1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   813
     }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   814
+#else
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   815
+    return -1;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   816
+#endif /* HAVE_CAMV4L */
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   817
   }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   818
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   819
   /* all was OK */
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   820
@@ -2745,31 +2858,41 @@
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   821
      if (V4L2_SUPPORT == 0)
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   822
 #endif /* HAVE_CAMV4L2 */
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   823
      {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   824
+#ifdef HAVE_CAMV4L
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   825
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   826
        if (capture->mmaps)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   827
          free(capture->mmaps);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   828
        if (capture->memoryMap)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   829
          munmap(capture->memoryMap, capture->memoryBuffer.size);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   830
 
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   831
+#endif /* HAVE_CAMV4L */
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   832
      }
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   833
 #ifdef HAVE_CAMV4L2
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   834
      else {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   835
        capture->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   836
-       if (ioctl(capture->deviceHandle, VIDIOC_STREAMOFF, &capture->type) < 0) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   837
-           perror ("Unable to stop the stream.");
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   838
+       if (capture->n_buffers != 0) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   839
+           if (ioctl(capture->deviceHandle, VIDIOC_STREAMOFF, &capture->type) < 0) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   840
+               perror ("Unable to stop the stream.");
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   841
+           }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   842
        }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   843
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   844
-       for (unsigned int n_buffers = 0; n_buffers < capture->req.count; ++n_buffers)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   845
+       if (capture->buffers[MAX_V4L_BUFFERS].start != NULL)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   846
        {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   847
-           if (-1 == munmap (capture->buffers[n_buffers].start, capture->buffers[n_buffers].length)) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   848
+    	   free(capture->buffers[MAX_V4L_BUFFERS].start);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   849
+    	   capture->buffers[MAX_V4L_BUFFERS].start = NULL;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   850
+       }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   851
+
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   852
+       for (unsigned int n_buffers = 0; n_buffers < capture->n_buffers; ++n_buffers)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   853
+       {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   854
+           if (-1 == munmap ((char *)capture->buffers[n_buffers].start, capture->buffers[n_buffers].length)) {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   855
                perror ("munmap");
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   856
            }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   857
        }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   858
 
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   859
-       if (capture->buffers[MAX_V4L_BUFFERS].start)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   860
+       if (capture->n_buffers == 0)
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   861
        {
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   862
-    	   free(capture->buffers[MAX_V4L_BUFFERS].start);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   863
-    	   capture->buffers[MAX_V4L_BUFFERS].start = 0;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   864
+    	   free(capture->buffers[0].start);
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   865
+    	   capture->buffers[0].start = NULL;
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   866
        }
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   867
      }
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   868
 #endif /* HAVE_CAMV4L2 */
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   869
@@ -2848,4 +2971,4 @@
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   870
     return 0;
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   871
 }
2612
60810d271d9e 2010-05-09 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   872
 
2630
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   873
-#endif
76008ae2dbc0 2010-05-13 Albert Lee <[email protected]>
trisk
parents: 2612
diff changeset
   874
+#endif /* !WIN32 && (HAVE_CAMV4L || HAVE_CAMV4L2) */