Merge pull request #346 from taka-no-me:decouple_V4L2

pull/360/merge
Andrey Kamaev 12 years ago committed by OpenCV Buildbot
commit c78cb21999
  1. 6
      CMakeLists.txt
  2. 3
      cmake/OpenCVFindLibsVideo.cmake
  3. 3
      cmake/templates/cvconfig.h.cmake
  4. 2
      modules/highgui/CMakeLists.txt
  5. 6
      modules/highgui/src/cap.cpp
  6. 4
      modules/highgui/src/cap_libv4l.cpp
  7. 404
      modules/highgui/src/cap_v4l.cpp

@ -137,7 +137,7 @@ OCV_OPTION(WITH_TBB "Include Intel TBB support" OFF
OCV_OPTION(WITH_CSTRIPES "Include C= support" OFF IF WIN32 ) OCV_OPTION(WITH_CSTRIPES "Include C= support" OFF IF WIN32 )
OCV_OPTION(WITH_TIFF "Include TIFF support" ON IF (NOT IOS) ) OCV_OPTION(WITH_TIFF "Include TIFF support" ON IF (NOT IOS) )
OCV_OPTION(WITH_UNICAP "Include Unicap support (GPL)" OFF IF (UNIX AND NOT APPLE AND NOT ANDROID) ) OCV_OPTION(WITH_UNICAP "Include Unicap support (GPL)" OFF IF (UNIX AND NOT APPLE AND NOT ANDROID) )
OCV_OPTION(WITH_V4L "Include Video 4 Linux support" ON IF (UNIX AND NOT APPLE AND NOT ANDROID) ) OCV_OPTION(WITH_V4L "Include Video 4 Linux support" ON IF (UNIX AND NOT ANDROID) )
OCV_OPTION(WITH_VIDEOINPUT "Build HighGUI with DirectShow support" ON IF WIN32 ) OCV_OPTION(WITH_VIDEOINPUT "Build HighGUI with DirectShow support" ON IF WIN32 )
OCV_OPTION(WITH_XIMEA "Include XIMEA cameras support" OFF IF (NOT ANDROID AND NOT APPLE) ) OCV_OPTION(WITH_XIMEA "Include XIMEA cameras support" OFF IF (NOT ANDROID AND NOT APPLE) )
OCV_OPTION(WITH_XINE "Include Xine support (GPL)" OFF IF (UNIX AND NOT APPLE AND NOT ANDROID) ) OCV_OPTION(WITH_XINE "Include Xine support (GPL)" OFF IF (UNIX AND NOT APPLE AND NOT ANDROID) )
@ -725,11 +725,13 @@ if(DEFINED WITH_V4L)
endif() endif()
if(HAVE_CAMV4L2) if(HAVE_CAMV4L2)
set(HAVE_CAMV4L2_STR "YES") set(HAVE_CAMV4L2_STR "YES")
elseif(HAVE_VIDEOIO)
set(HAVE_CAMV4L2_STR "YES(videoio)")
else() else()
set(HAVE_CAMV4L2_STR "NO") set(HAVE_CAMV4L2_STR "NO")
endif() endif()
status(" V4L/V4L2:" HAVE_LIBV4L THEN "Using libv4l (ver ${ALIASOF_libv4l1_VERSION})" status(" V4L/V4L2:" HAVE_LIBV4L THEN "Using libv4l (ver ${ALIASOF_libv4l1_VERSION})"
ELSE "${HAVE_CAMV4L_STR}/${HAVE_CAMV4L2_STR}") ELSE "${HAVE_CAMV4L_STR}/${HAVE_CAMV4L2_STR}")
endif(DEFINED WITH_V4L) endif(DEFINED WITH_V4L)
if(DEFINED WITH_VIDEOINPUT) if(DEFINED WITH_VIDEOINPUT)

@ -85,11 +85,12 @@ if(WITH_XINE)
endif(WITH_XINE) endif(WITH_XINE)
# --- V4L --- # --- V4L ---
ocv_clear_vars(HAVE_LIBV4L HAVE_CAMV4L HAVE_CAMV4L2) ocv_clear_vars(HAVE_LIBV4L HAVE_CAMV4L HAVE_CAMV4L2 HAVE_VIDEOIO)
if(WITH_V4L) if(WITH_V4L)
CHECK_MODULE(libv4l1 HAVE_LIBV4L) CHECK_MODULE(libv4l1 HAVE_LIBV4L)
CHECK_INCLUDE_FILE(linux/videodev.h HAVE_CAMV4L) CHECK_INCLUDE_FILE(linux/videodev.h HAVE_CAMV4L)
CHECK_INCLUDE_FILE(linux/videodev2.h HAVE_CAMV4L2) CHECK_INCLUDE_FILE(linux/videodev2.h HAVE_CAMV4L2)
CHECK_INCLUDE_FILE(sys/videoio.h HAVE_VIDEOIO)
endif(WITH_V4L) endif(WITH_V4L)
# --- OpenNI --- # --- OpenNI ---

@ -19,6 +19,9 @@
/* V4L2 capturing support */ /* V4L2 capturing support */
#cmakedefine HAVE_CAMV4L2 #cmakedefine HAVE_CAMV4L2
/* V4L2 capturing support in videoio.h */
#cmakedefine HAVE_VIDEOIO
/* V4L/V4L2 capturing support via libv4l */ /* V4L/V4L2 capturing support via libv4l */
#cmakedefine HAVE_LIBV4L #cmakedefine HAVE_LIBV4L

@ -131,7 +131,7 @@ endif(HAVE_UNICAP)
if(HAVE_LIBV4L) if(HAVE_LIBV4L)
list(APPEND highgui_srcs src/cap_libv4l.cpp) list(APPEND highgui_srcs src/cap_libv4l.cpp)
elseif(HAVE_CAMV4L OR HAVE_CAMV4L2) elseif(HAVE_CAMV4L OR HAVE_CAMV4L2 OR HAVE_VIDEOIO)
list(APPEND highgui_srcs src/cap_v4l.cpp) list(APPEND highgui_srcs src/cap_v4l.cpp)
endif() endif()

@ -172,7 +172,9 @@ CV_IMPL CvCapture * cvCreateCameraCapture (int index)
defined(HAVE_TYZX) || \ defined(HAVE_TYZX) || \
defined(HAVE_VFW) || \ defined(HAVE_VFW) || \
defined(HAVE_LIBV4L) || \ defined(HAVE_LIBV4L) || \
(defined(HAVE_CAMV4L) && defined(HAVE_CAMV4L2)) || \ defined(HAVE_CAMV4L) || \
defined(HAVE_CAMV4L2) || \
defined(HAVE_VIDEOIO) || \
defined(HAVE_GSTREAMER) || \ defined(HAVE_GSTREAMER) || \
defined(HAVE_DC1394_2) || \ defined(HAVE_DC1394_2) || \
defined(HAVE_DC1394) || \ defined(HAVE_DC1394) || \
@ -216,7 +218,7 @@ CV_IMPL CvCapture * cvCreateCameraCapture (int index)
return capture; return capture;
#endif #endif
#if defined HAVE_LIBV4L || (defined (HAVE_CAMV4L) && defined (HAVE_CAMV4L2)) #if defined HAVE_LIBV4L || defined HAVE_CAMV4L || defined HAVE_CAMV4L2 || defined HAVE_VIDEOIO
capture = cvCreateCameraCapture_V4L (index); capture = cvCreateCameraCapture_V4L (index);
if (capture) if (capture)
return capture; return capture;

@ -346,7 +346,11 @@ static int numCameras = 0;
static int indexList = 0; static int indexList = 0;
// IOCTL handling for V4L2 // IOCTL handling for V4L2
#ifdef HAVE_IOCTL_ULONG
static int xioctl( int fd, unsigned long request, void *arg)
#else
static int xioctl( int fd, int request, void *arg) static int xioctl( int fd, int request, void *arg)
#endif
{ {
int r; int r;

@ -202,7 +202,7 @@ make & enjoy!
#include "precomp.hpp" #include "precomp.hpp"
#if !defined WIN32 && defined HAVE_CAMV4L && defined HAVE_CAMV4L2 #if !defined WIN32 && (defined HAVE_CAMV4L || defined HAVE_CAMV4L2 || defined HAVE_VIDEOIO)
#define CLEAR(x) memset (&(x), 0, sizeof (x)) #define CLEAR(x) memset (&(x), 0, sizeof (x))
@ -214,19 +214,26 @@ make & enjoy!
#include <sys/types.h> #include <sys/types.h>
#include <sys/mman.h> #include <sys/mman.h>
#ifdef HAVE_CAMVAL
#include <linux/videodev.h> #include <linux/videodev.h>
#endif
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <asm/types.h> /* for videodev2.h */
#include <assert.h> #include <assert.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#ifdef HAVE_CAMV4L2 #ifdef HAVE_CAMV4L2
#include <asm/types.h> /* for videodev2.h */
#include <linux/videodev2.h> #include <linux/videodev2.h>
#endif #endif
#ifdef HAVE_VIDEOIO
#include <sys/videoio.h>
#define HAVE_CAMV4L2
#endif
/* Defaults - If your board can do better, set it here. Set for the most common type inputs. */ /* Defaults - If your board can do better, set it here. Set for the most common type inputs. */
#define DEFAULT_V4L_WIDTH 640 #define DEFAULT_V4L_WIDTH 640
#define DEFAULT_V4L_HEIGHT 480 #define DEFAULT_V4L_HEIGHT 480
@ -288,11 +295,13 @@ typedef struct CvCaptureCAM_V4L
int deviceHandle; int deviceHandle;
int bufferIndex; int bufferIndex;
int FirstCapture; int FirstCapture;
#ifdef HAVE_CAMV4L
struct video_capability capability; struct video_capability capability;
struct video_window captureWindow; struct video_window captureWindow;
struct video_picture imageProperties; struct video_picture imageProperties;
struct video_mbuf memoryBuffer; struct video_mbuf memoryBuffer;
struct video_mmap *mmaps; struct video_mmap *mmaps;
#endif /* HAVE_CAMV4L */
char *memoryMap; char *memoryMap;
IplImage frame; IplImage frame;
@ -345,24 +354,6 @@ static int icvSetVideoSize( CvCaptureCAM_V4L* capture, int w, int h);
static int numCameras = 0; static int numCameras = 0;
static int indexList = 0; static int indexList = 0;
#ifdef HAVE_CAMV4L2
// IOCTL handling for V4L2
static int xioctl( int fd, int request, void *arg)
{
int r;
do r = ioctl (fd, request, arg);
while (-1 == r && EINTR == errno);
return r;
}
#endif /* HAVE_CAMV4L2 */
/* Simple test program: Find number of Video Sources available. /* Simple test program: Find number of Video Sources available.
Start from 0 and go to MAX_CAMERAS while checking for the device with that name. Start from 0 and go to MAX_CAMERAS while checking for the device with that name.
If it fails on the first attempt of /dev/video0, then check if /dev/video is valid. If it fails on the first attempt of /dev/video0, then check if /dev/video is valid.
@ -393,6 +384,8 @@ static void icvInitCapture_V4L() {
}; /* End icvInitCapture_V4L */ }; /* End icvInitCapture_V4L */
#ifdef HAVE_CAMV4L
static int static int
try_palette(int fd, try_palette(int fd,
struct video_picture *cam_pic, struct video_picture *cam_pic,
@ -410,6 +403,8 @@ try_palette(int fd,
return 0; return 0;
} }
#endif /* HAVE_CAMV4L */
#ifdef HAVE_CAMV4L2 #ifdef HAVE_CAMV4L2
static int try_palette_v4l2(CvCaptureCAM_V4L* capture, unsigned long colorspace) static int try_palette_v4l2(CvCaptureCAM_V4L* capture, unsigned long colorspace)
@ -422,7 +417,7 @@ static int try_palette_v4l2(CvCaptureCAM_V4L* capture, unsigned long colorspace)
capture->form.fmt.pix.width = DEFAULT_V4L_WIDTH; capture->form.fmt.pix.width = DEFAULT_V4L_WIDTH;
capture->form.fmt.pix.height = DEFAULT_V4L_HEIGHT; capture->form.fmt.pix.height = DEFAULT_V4L_HEIGHT;
if (-1 == xioctl (capture->deviceHandle, VIDIOC_S_FMT, &capture->form)) if (-1 == ioctl (capture->deviceHandle, VIDIOC_S_FMT, &capture->form))
return -1; return -1;
@ -434,6 +429,8 @@ static int try_palette_v4l2(CvCaptureCAM_V4L* capture, unsigned long colorspace)
#endif /* HAVE_CAMV4L2 */ #endif /* HAVE_CAMV4L2 */
#ifdef HAVE_CAMV4L
static int try_init_v4l(CvCaptureCAM_V4L* capture, char *deviceName) static int try_init_v4l(CvCaptureCAM_V4L* capture, char *deviceName)
{ {
@ -449,7 +446,6 @@ static int try_init_v4l(CvCaptureCAM_V4L* capture, char *deviceName)
/* No matter what the name - it still must be opened! */ /* No matter what the name - it still must be opened! */
capture->deviceHandle = open(deviceName, O_RDWR); capture->deviceHandle = open(deviceName, O_RDWR);
if (capture->deviceHandle == 0) if (capture->deviceHandle == 0)
{ {
detect = -1; detect = -1;
@ -463,7 +459,6 @@ static int try_init_v4l(CvCaptureCAM_V4L* capture, char *deviceName)
if (ioctl(capture->deviceHandle, VIDIOCGCAP, &capture->capability) < 0) if (ioctl(capture->deviceHandle, VIDIOCGCAP, &capture->capability) < 0)
{ {
detect = 0; detect = 0;
icvCloseCAM_V4L(capture); icvCloseCAM_V4L(capture);
} }
else else
@ -476,54 +471,64 @@ static int try_init_v4l(CvCaptureCAM_V4L* capture, char *deviceName)
} }
#endif /* HAVE_CAMV4L */
#ifdef HAVE_CAMV4L2 #ifdef HAVE_CAMV4L2
static int try_init_v4l2(CvCaptureCAM_V4L* capture, char *deviceName) static int try_init_v4l2(CvCaptureCAM_V4L* capture, char *deviceName)
{ {
// if detect = -1 then unable to open device
// if detect = 0 then detected nothing
// if detect = 1 then V4L2 device
int detect = 0;
// Test device for V4L2 compability // Test device for V4L2 compability
// Return value:
// -1 then unable to open device
// 0 then detected nothing
// 1 then V4L2 device
int deviceIndex;
/* Open and test V4L2 device */ /* Open and test V4L2 device */
capture->deviceHandle = open (deviceName, O_RDWR /* required */ | O_NONBLOCK, 0); capture->deviceHandle = open (deviceName, O_RDWR /* required */ | O_NONBLOCK, 0);
if (-1 == capture->deviceHandle)
if (capture->deviceHandle == 0)
{ {
detect = -1; #ifndef NDEBUG
fprintf(stderr, "(DEBUG) try_init_v4l2 open \"%s\": %s\n", deviceName, strerror(errno));
#endif
icvCloseCAM_V4L(capture); icvCloseCAM_V4L(capture);
return -1;
} }
if (detect == 0) CLEAR (capture->cap);
if (-1 == ioctl (capture->deviceHandle, VIDIOC_QUERYCAP, &capture->cap))
{ {
CLEAR (capture->cap); #ifndef NDEBUG
if (-1 == xioctl (capture->deviceHandle, VIDIOC_QUERYCAP, &capture->cap)) fprintf(stderr, "(DEBUG) try_init_v4l2 VIDIOC_QUERYCAP \"%s\": %s\n", deviceName, strerror(errno));
{ #endif
detect = 0; icvCloseCAM_V4L(capture);
return 0;
}
icvCloseCAM_V4L(capture); /* Query channels number */
} if (-1 == ioctl (capture->deviceHandle, VIDIOC_G_INPUT, &deviceIndex))
else {
{ #ifndef NDEBUG
CLEAR (capture->capability); fprintf(stderr, "(DEBUG) try_init_v4l2 VIDIOC_G_INPUT \"%s\": %s\n", deviceName, strerror(errno));
capture->capability.type = capture->cap.capabilities; #endif
icvCloseCAM_V4L(capture);
return 0;
}
/* Query channels number */ /* Query information about current input */
if (-1 != xioctl (capture->deviceHandle, VIDIOC_G_INPUT, &capture->capability.channels)) CLEAR (capture->inp);
{ capture->inp.index = deviceIndex;
detect = 1; if (-1 == ioctl (capture->deviceHandle, VIDIOC_ENUMINPUT, &capture->inp))
} {
} #ifndef NDEBUG
fprintf(stderr, "(DEBUG) try_init_v4l2 VIDIOC_ENUMINPUT \"%s\": %s\n", deviceName, strerror(errno));
#endif
icvCloseCAM_V4L(capture);
return 0;
} }
return detect; return 1;
} }
@ -546,17 +551,12 @@ static int autosetup_capture_mode_v4l2(CvCaptureCAM_V4L* capture)
else else
#ifdef HAVE_JPEG #ifdef HAVE_JPEG
#ifdef __USE_GNU
/* support for MJPEG is only available with libjpeg and gcc,
because it's use libjepg and fmemopen()
*/
if (try_palette_v4l2(capture, V4L2_PIX_FMT_MJPEG) == 0 || if (try_palette_v4l2(capture, V4L2_PIX_FMT_MJPEG) == 0 ||
try_palette_v4l2(capture, V4L2_PIX_FMT_JPEG) == 0) try_palette_v4l2(capture, V4L2_PIX_FMT_JPEG) == 0)
{ {
capture->palette = PALETTE_MJPEG; capture->palette = PALETTE_MJPEG;
} }
else else
#endif
#endif #endif
if (try_palette_v4l2(capture, V4L2_PIX_FMT_YUYV) == 0) if (try_palette_v4l2(capture, V4L2_PIX_FMT_YUYV) == 0)
@ -593,6 +593,8 @@ static int autosetup_capture_mode_v4l2(CvCaptureCAM_V4L* capture)
#endif /* HAVE_CAMV4L2 */ #endif /* HAVE_CAMV4L2 */
#ifdef HAVE_CAMV4L
static int autosetup_capture_mode_v4l(CvCaptureCAM_V4L* capture) static int autosetup_capture_mode_v4l(CvCaptureCAM_V4L* capture)
{ {
@ -626,6 +628,8 @@ static int autosetup_capture_mode_v4l(CvCaptureCAM_V4L* capture)
} }
#endif /* HAVE_CAMV4L */
#ifdef HAVE_CAMV4L2 #ifdef HAVE_CAMV4L2
static void v4l2_scan_controls_enumerate_menu(CvCaptureCAM_V4L* capture) static void v4l2_scan_controls_enumerate_menu(CvCaptureCAM_V4L* capture)
@ -637,7 +641,7 @@ static void v4l2_scan_controls_enumerate_menu(CvCaptureCAM_V4L* capture)
(int)capture->querymenu.index <= capture->queryctrl.maximum; (int)capture->querymenu.index <= capture->queryctrl.maximum;
capture->querymenu.index++) capture->querymenu.index++)
{ {
if (0 == xioctl (capture->deviceHandle, VIDIOC_QUERYMENU, if (0 == ioctl (capture->deviceHandle, VIDIOC_QUERYMENU,
&capture->querymenu)) &capture->querymenu))
{ {
// printf (" %s\n", capture->querymenu.name); // printf (" %s\n", capture->querymenu.name);
@ -661,7 +665,7 @@ static void v4l2_scan_controls(CvCaptureCAM_V4L* capture)
CLEAR (capture->queryctrl); CLEAR (capture->queryctrl);
capture->queryctrl.id = ctrl_id; capture->queryctrl.id = ctrl_id;
if (0 == xioctl (capture->deviceHandle, VIDIOC_QUERYCTRL, if (0 == ioctl (capture->deviceHandle, VIDIOC_QUERYCTRL,
&capture->queryctrl)) &capture->queryctrl))
{ {
@ -731,7 +735,7 @@ static void v4l2_scan_controls(CvCaptureCAM_V4L* capture)
CLEAR (capture->queryctrl); CLEAR (capture->queryctrl);
capture->queryctrl.id = ctrl_id; capture->queryctrl.id = ctrl_id;
if (0 == xioctl (capture->deviceHandle, VIDIOC_QUERYCTRL, if (0 == ioctl (capture->deviceHandle, VIDIOC_QUERYCTRL,
&capture->queryctrl)) &capture->queryctrl))
{ {
@ -854,7 +858,7 @@ static int _capture_V4L2 (CvCaptureCAM_V4L *capture, char *deviceName)
capture->inp.index = CHANNEL_NUMBER; capture->inp.index = CHANNEL_NUMBER;
/* Set only channel number to CHANNEL_NUMBER */ /* Set only channel number to CHANNEL_NUMBER */
/* V4L2 have a status field from selected video mode */ /* V4L2 have a status field from selected video mode */
if (-1 == xioctl (capture->deviceHandle, VIDIOC_ENUMINPUT, &capture->inp)) if (-1 == ioctl (capture->deviceHandle, VIDIOC_ENUMINPUT, &capture->inp))
{ {
fprintf (stderr, "HIGHGUI ERROR: V4L2: Aren't able to set channel number\n"); fprintf (stderr, "HIGHGUI ERROR: V4L2: Aren't able to set channel number\n");
icvCloseCAM_V4L (capture); icvCloseCAM_V4L (capture);
@ -866,7 +870,7 @@ static int _capture_V4L2 (CvCaptureCAM_V4L *capture, char *deviceName)
CLEAR (capture->form); CLEAR (capture->form);
capture->form.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; capture->form.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (-1 == xioctl (capture->deviceHandle, VIDIOC_G_FMT, &capture->form)) { if (-1 == ioctl (capture->deviceHandle, VIDIOC_G_FMT, &capture->form)) {
fprintf( stderr, "HIGHGUI ERROR: V4L2: Could not obtain specifics of capture window.\n\n"); fprintf( stderr, "HIGHGUI ERROR: V4L2: Could not obtain specifics of capture window.\n\n");
icvCloseCAM_V4L(capture); icvCloseCAM_V4L(capture);
return -1; return -1;
@ -904,7 +908,7 @@ static int _capture_V4L2 (CvCaptureCAM_V4L *capture, char *deviceName)
capture->req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; capture->req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
capture->req.memory = V4L2_MEMORY_MMAP; capture->req.memory = V4L2_MEMORY_MMAP;
if (-1 == xioctl (capture->deviceHandle, VIDIOC_REQBUFS, &capture->req)) if (-1 == ioctl (capture->deviceHandle, VIDIOC_REQBUFS, &capture->req))
{ {
if (EINVAL == errno) if (EINVAL == errno)
{ {
@ -944,7 +948,7 @@ static int _capture_V4L2 (CvCaptureCAM_V4L *capture, char *deviceName)
buf.memory = V4L2_MEMORY_MMAP; buf.memory = V4L2_MEMORY_MMAP;
buf.index = n_buffers; buf.index = n_buffers;
if (-1 == xioctl (capture->deviceHandle, VIDIOC_QUERYBUF, &buf)) { if (-1 == ioctl (capture->deviceHandle, VIDIOC_QUERYBUF, &buf)) {
perror ("VIDIOC_QUERYBUF"); perror ("VIDIOC_QUERYBUF");
/* free capture, and returns an error code */ /* free capture, and returns an error code */
@ -976,8 +980,8 @@ static int _capture_V4L2 (CvCaptureCAM_V4L *capture, char *deviceName)
/* Set up Image data */ /* Set up Image data */
cvInitImageHeader( &capture->frame, cvInitImageHeader( &capture->frame,
cvSize( capture->captureWindow.width, cvSize( capture->form.fmt.pix.width,
capture->captureWindow.height ), capture->form.fmt.pix.height ),
IPL_DEPTH_8U, 3, IPL_ORIGIN_TL, 4 ); IPL_DEPTH_8U, 3, IPL_ORIGIN_TL, 4 );
/* Allocate space for RGBA data */ /* Allocate space for RGBA data */
capture->frame.imageData = (char *)cvAlloc(capture->frame.imageSize); capture->frame.imageData = (char *)cvAlloc(capture->frame.imageSize);
@ -987,6 +991,8 @@ static int _capture_V4L2 (CvCaptureCAM_V4L *capture, char *deviceName)
#endif /* HAVE_CAMV4L2 */ #endif /* HAVE_CAMV4L2 */
#ifdef HAVE_CAMV4L
static int _capture_V4L (CvCaptureCAM_V4L *capture, char *deviceName) static int _capture_V4L (CvCaptureCAM_V4L *capture, char *deviceName)
{ {
int detect_v4l = 0; int detect_v4l = 0;
@ -1105,6 +1111,8 @@ static int _capture_V4L (CvCaptureCAM_V4L *capture, char *deviceName)
return 1; return 1;
}; /* End _capture_V4L */ }; /* End _capture_V4L */
#endif /* HAVE_CAMV4L */
static CvCaptureCAM_V4L * icvCaptureFromCAM_V4L (int index) static CvCaptureCAM_V4L * icvCaptureFromCAM_V4L (int index)
{ {
static int autoindex; static int autoindex;
@ -1154,10 +1162,12 @@ static CvCaptureCAM_V4L * icvCaptureFromCAM_V4L (int index)
icvCloseCAM_V4L(capture); icvCloseCAM_V4L(capture);
V4L2_SUPPORT = 0; V4L2_SUPPORT = 0;
#endif /* HAVE_CAMV4L2 */ #endif /* HAVE_CAMV4L2 */
#ifdef HAVE_CAMV4L
if (_capture_V4L (capture, deviceName) == -1) { if (_capture_V4L (capture, deviceName) == -1) {
icvCloseCAM_V4L(capture); icvCloseCAM_V4L(capture);
return NULL; return NULL;
} }
#endif /* HAVE_CAMV4L */
#ifdef HAVE_CAMV4L2 #ifdef HAVE_CAMV4L2
} else { } else {
V4L2_SUPPORT = 1; V4L2_SUPPORT = 1;
@ -1177,7 +1187,7 @@ static int read_frame_v4l2(CvCaptureCAM_V4L* capture) {
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP; buf.memory = V4L2_MEMORY_MMAP;
if (-1 == xioctl (capture->deviceHandle, VIDIOC_DQBUF, &buf)) { if (-1 == ioctl (capture->deviceHandle, VIDIOC_DQBUF, &buf)) {
switch (errno) { switch (errno) {
case EAGAIN: case EAGAIN:
return 0; return 0;
@ -1185,7 +1195,7 @@ static int read_frame_v4l2(CvCaptureCAM_V4L* capture) {
case EIO: case EIO:
if (!(buf.flags & (V4L2_BUF_FLAG_QUEUED | V4L2_BUF_FLAG_DONE))) if (!(buf.flags & (V4L2_BUF_FLAG_QUEUED | V4L2_BUF_FLAG_DONE)))
{ {
if (xioctl(capture->deviceHandle, VIDIOC_QBUF, &buf) == -1) if (ioctl(capture->deviceHandle, VIDIOC_QBUF, &buf) == -1)
{ {
return 0; return 0;
} }
@ -1208,7 +1218,7 @@ static int read_frame_v4l2(CvCaptureCAM_V4L* capture) {
//printf("got data in buff %d, len=%d, flags=0x%X, seq=%d, used=%d)\n", //printf("got data in buff %d, len=%d, flags=0x%X, seq=%d, used=%d)\n",
// buf.index, buf.length, buf.flags, buf.sequence, buf.bytesused); // buf.index, buf.length, buf.flags, buf.sequence, buf.bytesused);
if (-1 == xioctl (capture->deviceHandle, VIDIOC_QBUF, &buf)) if (-1 == ioctl (capture->deviceHandle, VIDIOC_QBUF, &buf))
perror ("VIDIOC_QBUF"); perror ("VIDIOC_QBUF");
return 1; return 1;
@ -1266,7 +1276,9 @@ static int icvGrabFrameCAM_V4L(CvCaptureCAM_V4L* capture) {
#ifdef HAVE_CAMV4L2 #ifdef HAVE_CAMV4L2
#ifdef HAVE_CAMV4L
if (V4L2_SUPPORT == 1) if (V4L2_SUPPORT == 1)
#endif
{ {
for (capture->bufferIndex = 0; for (capture->bufferIndex = 0;
@ -1282,7 +1294,7 @@ static int icvGrabFrameCAM_V4L(CvCaptureCAM_V4L* capture) {
buf.memory = V4L2_MEMORY_MMAP; buf.memory = V4L2_MEMORY_MMAP;
buf.index = (unsigned long)capture->bufferIndex; buf.index = (unsigned long)capture->bufferIndex;
if (-1 == xioctl (capture->deviceHandle, VIDIOC_QBUF, &buf)) { if (-1 == ioctl (capture->deviceHandle, VIDIOC_QBUF, &buf)) {
perror ("VIDIOC_QBUF"); perror ("VIDIOC_QBUF");
return 0; return 0;
} }
@ -1290,14 +1302,18 @@ static int icvGrabFrameCAM_V4L(CvCaptureCAM_V4L* capture) {
/* enable the streaming */ /* enable the streaming */
capture->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; capture->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (-1 == xioctl (capture->deviceHandle, VIDIOC_STREAMON, if (-1 == ioctl (capture->deviceHandle, VIDIOC_STREAMON,
&capture->type)) { &capture->type)) {
/* error enabling the stream */ /* error enabling the stream */
perror ("VIDIOC_STREAMON"); perror ("VIDIOC_STREAMON");
return 0; return 0;
} }
} else }
#endif /* HAVE_CAMV4L2 */ #endif /* HAVE_CAMV4L2 */
#if defined(HAVE_CAMV4L) && defined(HAVE_CAMV4L2)
else
#endif /* HAVE_CAMV4L && HAVE_CAMV4L2 */
#ifdef HAVE_CAMV4L
{ {
for (capture->bufferIndex = 0; for (capture->bufferIndex = 0;
@ -1316,6 +1332,7 @@ static int icvGrabFrameCAM_V4L(CvCaptureCAM_V4L* capture) {
} }
} }
#endif /* HAVE_CAMV4L */
#if defined(V4L_ABORT_BADJPEG) && defined(HAVE_CAMV4L2) #if defined(V4L_ABORT_BADJPEG) && defined(HAVE_CAMV4L2)
if (V4L2_SUPPORT == 1) if (V4L2_SUPPORT == 1)
@ -1337,8 +1354,12 @@ static int icvGrabFrameCAM_V4L(CvCaptureCAM_V4L* capture) {
mainloop_v4l2(capture); mainloop_v4l2(capture);
} else }
#endif /* HAVE_CAMV4L2 */ #endif /* HAVE_CAMV4L2 */
#if defined(HAVE_CAMV4L) && defined(HAVE_CAMV4L2)
else
#endif /* HAVE_CAMV4L && HAVE_CAMV4L2 */
#ifdef HAVE_CAMV4L
{ {
capture->mmaps[capture->bufferIndex].frame = capture->bufferIndex; capture->mmaps[capture->bufferIndex].frame = capture->bufferIndex;
@ -1358,6 +1379,7 @@ static int icvGrabFrameCAM_V4L(CvCaptureCAM_V4L* capture) {
} }
} }
#endif /* HAVE_CAMV4L */
return(1); return(1);
} }
@ -1393,7 +1415,7 @@ static int icvGrabFrameCAM_V4L(CvCaptureCAM_V4L* capture) {
static inline void static inline void
move_420_block(int yTL, int yTR, int yBL, int yBR, int u, int v, move_420_block(int yTL, int yTR, int yBL, int yBR, int u, int v,
int rowPixels, unsigned char * rgb) int rowPixels, unsigned char * rgb)
{ {
const int rvScale = 91881; const int rvScale = 91881;
const int guScale = -22553; const int guScale = -22553;
@ -1432,7 +1454,7 @@ move_420_block(int yTL, int yTR, int yBL, int yBR, int u, int v,
static inline void static inline void
move_411_block(int yTL, int yTR, int yBL, int yBR, int u, int v, move_411_block(int yTL, int yTR, int yBL, int yBR, int u, int v,
int /*rowPixels*/, unsigned char * rgb) int /*rowPixels*/, unsigned char * rgb)
{ {
const int rvScale = 91881; const int rvScale = 91881;
const int guScale = -22553; const int guScale = -22553;
@ -1524,6 +1546,7 @@ yuv420p_to_rgb24(int width, int height,
// //
/* Converts from interlaced YUV420 to RGB24. */ /* Converts from interlaced YUV420 to RGB24. */
/* [FD] untested... */ /* [FD] untested... */
#ifdef HAVE_CAMV4L
static void static void
yuv420_to_rgb24(int width, int height, yuv420_to_rgb24(int width, int height,
unsigned char *pIn0, unsigned char *pOut0) unsigned char *pIn0, unsigned char *pOut0)
@ -1568,6 +1591,7 @@ yuv420_to_rgb24(int width, int height,
pOut += width * bytes; pOut += width * bytes;
} }
} }
#endif //HAVE_CAMV4L
// Consider a YUV411P image of 8x2 pixels. // Consider a YUV411P image of 8x2 pixels.
// //
@ -1619,6 +1643,8 @@ yuv411p_to_rgb24(int width, int height,
/* based on ccvt_yuyv_bgr32() from camstream */ /* based on ccvt_yuyv_bgr32() from camstream */
#define SAT(c) \ #define SAT(c) \
if (c & (~255)) { if (c < 0) c = 0; else c = 255; } if (c & (~255)) { if (c < 0) c = 0; else c = 255; }
#ifdef HAVE_CAMV4L2
static void static void
yuyv_to_rgb24 (int width, int height, unsigned char *src, unsigned char *dst) yuyv_to_rgb24 (int width, int height, unsigned char *src, unsigned char *dst)
{ {
@ -1710,6 +1736,7 @@ uyvy_to_rgb24 (int width, int height, unsigned char *src, unsigned char *dst)
} }
} }
} }
#endif //HAVE_CAMV4L2
#ifdef HAVE_JPEG #ifdef HAVE_JPEG
@ -1736,6 +1763,7 @@ mjpeg_to_rgb24 (int width, int height,
* *
*/ */
#ifdef HAVE_CAMV4L2
static void bayer2rgb24(long int WIDTH, long int HEIGHT, unsigned char *src, unsigned char *dst) static void bayer2rgb24(long int WIDTH, long int HEIGHT, unsigned char *src, unsigned char *dst)
{ {
long int i; long int i;
@ -1897,7 +1925,6 @@ static void sgbrg2rgb24(long int WIDTH, long int HEIGHT, unsigned char *src, uns
} }
} }
#define CLAMP(x) ((x)<0?0:((x)>255)?255:(x)) #define CLAMP(x) ((x)<0?0:((x)>255)?255:(x))
typedef struct { typedef struct {
@ -2068,13 +2095,14 @@ static int sonix_decompress(int width, int height, unsigned char *inp, unsigned
return 0; return 0;
} }
#endif //HAVE_CAMV4L2
static IplImage* icvRetrieveFrameCAM_V4L( CvCaptureCAM_V4L* capture, int) { static IplImage* icvRetrieveFrameCAM_V4L( CvCaptureCAM_V4L* capture, int) {
#ifdef HAVE_CAMV4L2 #ifdef HAVE_CAMV4L2
if (V4L2_SUPPORT == 0) if (V4L2_SUPPORT == 0)
#endif /* HAVE_CAMV4L2 */ #endif /* HAVE_CAMV4L2 */
#ifdef HAVE_CAMV4L
{ {
/* [FD] this really belongs here */ /* [FD] this really belongs here */
@ -2083,6 +2111,7 @@ static IplImage* icvRetrieveFrameCAM_V4L( CvCaptureCAM_V4L* capture, int) {
} }
} }
#endif /* HAVE_CAMV4L */
/* Now get what has already been captured as a IplImage return */ /* Now get what has already been captured as a IplImage return */
@ -2103,8 +2132,12 @@ static IplImage* icvRetrieveFrameCAM_V4L( CvCaptureCAM_V4L* capture, int) {
capture->frame.imageData = (char *)cvAlloc(capture->frame.imageSize); capture->frame.imageData = (char *)cvAlloc(capture->frame.imageSize);
} }
} else }
#endif /* HAVE_CAMV4L2 */ #endif /* HAVE_CAMV4L2 */
#if defined(HAVE_CAMV4L) && defined(HAVE_CAMV4L2)
else
#endif /* HAVE_CAMV4L && HAVE_CAMV4L2 */
#ifdef HAVE_CAMV4L
{ {
if((capture->frame.width != capture->mmaps[capture->bufferIndex].width) if((capture->frame.width != capture->mmaps[capture->bufferIndex].width)
@ -2118,118 +2151,118 @@ static IplImage* icvRetrieveFrameCAM_V4L( CvCaptureCAM_V4L* capture, int) {
} }
} }
#endif /* HAVE_CAMV4L */
#ifdef HAVE_CAMV4L2 #ifdef HAVE_CAMV4L2
if (V4L2_SUPPORT == 1) if (V4L2_SUPPORT == 1)
{ {
switch (capture->palette) switch (capture->palette)
{ {
case PALETTE_BGR24: case PALETTE_BGR24:
memcpy((char *)capture->frame.imageData, memcpy((char *)capture->frame.imageData,
(char *)capture->buffers[capture->bufferIndex].start, (char *)capture->buffers[capture->bufferIndex].start,
capture->frame.imageSize); capture->frame.imageSize);
break; break;
case PALETTE_YVU420: case PALETTE_YVU420:
yuv420p_to_rgb24(capture->form.fmt.pix.width, yuv420p_to_rgb24(capture->form.fmt.pix.width,
capture->form.fmt.pix.height, capture->form.fmt.pix.height,
(unsigned char*)(capture->buffers[capture->bufferIndex].start), (unsigned char*)(capture->buffers[capture->bufferIndex].start),
(unsigned char*)capture->frame.imageData); (unsigned char*)capture->frame.imageData);
break; break;
case PALETTE_YUV411P: case PALETTE_YUV411P:
yuv411p_to_rgb24(capture->form.fmt.pix.width, yuv411p_to_rgb24(capture->form.fmt.pix.width,
capture->form.fmt.pix.height, capture->form.fmt.pix.height,
(unsigned char*)(capture->buffers[capture->bufferIndex].start), (unsigned char*)(capture->buffers[capture->bufferIndex].start),
(unsigned char*)capture->frame.imageData); (unsigned char*)capture->frame.imageData);
break; break;
#ifdef HAVE_JPEG #ifdef HAVE_JPEG
#ifdef __USE_GNU case PALETTE_MJPEG:
/* support for MJPEG is only available with libjpeg and gcc, if (!mjpeg_to_rgb24(capture->form.fmt.pix.width,
because it's use libjepg and fmemopen() capture->form.fmt.pix.height,
*/ (unsigned char*)(capture->buffers[capture->bufferIndex]
case PALETTE_MJPEG: .start),
if (!mjpeg_to_rgb24(capture->form.fmt.pix.width, capture->buffers[capture->bufferIndex].length,
capture->form.fmt.pix.height, (unsigned char*)capture->frame.imageData))
(unsigned char*)(capture->buffers[capture->bufferIndex] return 0;
.start), break;
capture->buffers[capture->bufferIndex].length,
(unsigned char*)capture->frame.imageData))
return 0;
break;
#endif
#endif #endif
case PALETTE_YUYV: case PALETTE_YUYV:
yuyv_to_rgb24(capture->form.fmt.pix.width, yuyv_to_rgb24(capture->form.fmt.pix.width,
capture->form.fmt.pix.height, capture->form.fmt.pix.height,
(unsigned char*)(capture->buffers[capture->bufferIndex].start), (unsigned char*)(capture->buffers[capture->bufferIndex].start),
(unsigned char*)capture->frame.imageData); (unsigned char*)capture->frame.imageData);
break; break;
case PALETTE_UYVY:
case PALETTE_UYVY: uyvy_to_rgb24(capture->form.fmt.pix.width,
uyvy_to_rgb24(capture->form.fmt.pix.width, capture->form.fmt.pix.height,
capture->form.fmt.pix.height, (unsigned char*)(capture->buffers[capture->bufferIndex].start),
(unsigned char*)(capture->buffers[capture->bufferIndex].start), (unsigned char*)capture->frame.imageData);
(unsigned char*)capture->frame.imageData); break;
break; case PALETTE_SBGGR8:
case PALETTE_SBGGR8: bayer2rgb24(capture->form.fmt.pix.width,
bayer2rgb24(capture->form.fmt.pix.width, capture->form.fmt.pix.height,
capture->form.fmt.pix.height, (unsigned char*)capture->buffers[capture->bufferIndex].start,
(unsigned char*)capture->buffers[capture->bufferIndex].start, (unsigned char*)capture->frame.imageData);
(unsigned char*)capture->frame.imageData); break;
break;
case PALETTE_SN9C10X:
case PALETTE_SN9C10X: sonix_decompress_init();
sonix_decompress_init(); sonix_decompress(capture->form.fmt.pix.width,
sonix_decompress(capture->form.fmt.pix.width, capture->form.fmt.pix.height,
capture->form.fmt.pix.height, (unsigned char*)capture->buffers[capture->bufferIndex].start,
(unsigned char*)capture->buffers[capture->bufferIndex].start, (unsigned char*)capture->buffers[(capture->bufferIndex+1) % capture->req.count].start);
(unsigned char*)capture->buffers[(capture->bufferIndex+1) % capture->req.count].start);
bayer2rgb24(capture->form.fmt.pix.width,
bayer2rgb24(capture->form.fmt.pix.width, capture->form.fmt.pix.height,
capture->form.fmt.pix.height, (unsigned char*)capture->buffers[(capture->bufferIndex+1) % capture->req.count].start,
(unsigned char*)capture->buffers[(capture->bufferIndex+1) % capture->req.count].start, (unsigned char*)capture->frame.imageData);
(unsigned char*)capture->frame.imageData); break;
break;
case PALETTE_SGBRG:
case PALETTE_SGBRG: sgbrg2rgb24(capture->form.fmt.pix.width,
sgbrg2rgb24(capture->form.fmt.pix.width, capture->form.fmt.pix.height,
capture->form.fmt.pix.height, (unsigned char*)capture->buffers[(capture->bufferIndex+1) % capture->req.count].start,
(unsigned char*)capture->buffers[(capture->bufferIndex+1) % capture->req.count].start, (unsigned char*)capture->frame.imageData);
(unsigned char*)capture->frame.imageData); break;
break; }
} }
} else
#endif /* HAVE_CAMV4L2 */ #endif /* HAVE_CAMV4L2 */
#if defined(HAVE_CAMV4L) && defined(HAVE_CAMV4L2)
else
#endif /* HAVE_CAMV4L && HAVE_CAMV4L2 */
#ifdef HAVE_CAMV4L
{ {
switch(capture->imageProperties.palette) { switch(capture->imageProperties.palette)
case VIDEO_PALETTE_RGB24: {
case VIDEO_PALETTE_RGB24:
memcpy((char *)capture->frame.imageData, memcpy((char *)capture->frame.imageData,
(char *)(capture->memoryMap + capture->memoryBuffer.offsets[capture->bufferIndex]), (char *)(capture->memoryMap + capture->memoryBuffer.offsets[capture->bufferIndex]),
capture->frame.imageSize); capture->frame.imageSize);
break; break;
case VIDEO_PALETTE_YUV420P: case VIDEO_PALETTE_YUV420P:
yuv420p_to_rgb24(capture->captureWindow.width, yuv420p_to_rgb24(capture->captureWindow.width,
capture->captureWindow.height, capture->captureWindow.height,
(unsigned char*)(capture->memoryMap + capture->memoryBuffer.offsets[capture->bufferIndex]), (unsigned char*)(capture->memoryMap + capture->memoryBuffer.offsets[capture->bufferIndex]),
(unsigned char*)capture->frame.imageData); (unsigned char*)capture->frame.imageData);
break; break;
case VIDEO_PALETTE_YUV420: case VIDEO_PALETTE_YUV420:
yuv420_to_rgb24(capture->captureWindow.width, yuv420_to_rgb24(capture->captureWindow.width,
capture->captureWindow.height, capture->captureWindow.height,
(unsigned char*)(capture->memoryMap + capture->memoryBuffer.offsets[capture->bufferIndex]), (unsigned char*)(capture->memoryMap + capture->memoryBuffer.offsets[capture->bufferIndex]),
(unsigned char*)capture->frame.imageData); (unsigned char*)capture->frame.imageData);
break; break;
case VIDEO_PALETTE_YUV411P: case VIDEO_PALETTE_YUV411P:
yuv411p_to_rgb24(capture->captureWindow.width, yuv411p_to_rgb24(capture->captureWindow.width,
capture->captureWindow.height, capture->captureWindow.height,
(unsigned char*)(capture->memoryMap + capture->memoryBuffer.offsets[capture->bufferIndex]), (unsigned char*)(capture->memoryMap + capture->memoryBuffer.offsets[capture->bufferIndex]),
(unsigned char*)capture->frame.imageData); (unsigned char*)capture->frame.imageData);
break; break;
default: default:
fprintf( stderr, fprintf( stderr,
"HIGHGUI ERROR: V4L: Cannot convert from palette %d to RGB\n", "HIGHGUI ERROR: V4L: Cannot convert from palette %d to RGB\n",
capture->imageProperties.palette); capture->imageProperties.palette);
@ -2238,6 +2271,7 @@ static IplImage* icvRetrieveFrameCAM_V4L( CvCaptureCAM_V4L* capture, int) {
} }
} }
#endif /* HAVE_CAMV4L */
return(&capture->frame); return(&capture->frame);
} }
@ -2247,7 +2281,9 @@ static double icvGetPropertyCAM_V4L (CvCaptureCAM_V4L* capture,
#ifdef HAVE_CAMV4L2 #ifdef HAVE_CAMV4L2
#ifdef HAVE_CAMV4L
if (V4L2_SUPPORT == 1) if (V4L2_SUPPORT == 1)
#endif
{ {
/* default value for min and max */ /* default value for min and max */
@ -2256,7 +2292,7 @@ static double icvGetPropertyCAM_V4L (CvCaptureCAM_V4L* capture,
CLEAR (capture->form); CLEAR (capture->form);
capture->form.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; capture->form.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (-1 == xioctl (capture->deviceHandle, VIDIOC_G_FMT, &capture->form)) { if (-1 == ioctl (capture->deviceHandle, VIDIOC_G_FMT, &capture->form)) {
/* display an error message, and return an error code */ /* display an error message, and return an error code */
perror ("VIDIOC_G_FMT"); perror ("VIDIOC_G_FMT");
return -1; return -1;
@ -2297,7 +2333,7 @@ static double icvGetPropertyCAM_V4L (CvCaptureCAM_V4L* capture,
return -1; return -1;
} }
if (-1 == xioctl (capture->deviceHandle, VIDIOC_G_CTRL, if (-1 == ioctl (capture->deviceHandle, VIDIOC_G_CTRL,
&capture->control)) { &capture->control)) {
fprintf( stderr, "HIGHGUI ERROR: V4L2: "); fprintf( stderr, "HIGHGUI ERROR: V4L2: ");
@ -2358,8 +2394,12 @@ static double icvGetPropertyCAM_V4L (CvCaptureCAM_V4L* capture,
/* all was OK, so convert to 0.0 - 1.0 range, and return the value */ /* all was OK, so convert to 0.0 - 1.0 range, and return the value */
return ((float)capture->control.value - v4l2_min + 1) / (v4l2_max - v4l2_min); return ((float)capture->control.value - v4l2_min + 1) / (v4l2_max - v4l2_min);
} else }
#endif /* HAVE_CAMV4L2 */ #endif /* HAVE_CAMV4L2 */
#if defined(HAVE_CAMV4L) && defined(HAVE_CAMV4L2)
else
#endif /* HAVE_CAMV4L && HAVE_CAMV4L2 */
#ifdef HAVE_CAMV4L
{ {
int retval = -1; int retval = -1;
@ -2417,6 +2457,7 @@ static double icvGetPropertyCAM_V4L (CvCaptureCAM_V4L* capture,
return float (retval) / 0xFFFF; return float (retval) / 0xFFFF;
} }
#endif /* HAVE_CAMV4L */
}; };
@ -2430,7 +2471,7 @@ static int icvSetVideoSize( CvCaptureCAM_V4L* capture, int w, int h) {
CLEAR (capture->cropcap); CLEAR (capture->cropcap);
capture->cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; capture->cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (xioctl (capture->deviceHandle, VIDIOC_CROPCAP, &capture->cropcap) < 0) { if (ioctl (capture->deviceHandle, VIDIOC_CROPCAP, &capture->cropcap) < 0) {
fprintf(stderr, "HIGHGUI ERROR: V4L/V4L2: VIDIOC_CROPCAP\n"); fprintf(stderr, "HIGHGUI ERROR: V4L/V4L2: VIDIOC_CROPCAP\n");
} else { } else {
@ -2439,7 +2480,7 @@ static int icvSetVideoSize( CvCaptureCAM_V4L* capture, int w, int h) {
capture->crop.c= capture->cropcap.defrect; capture->crop.c= capture->cropcap.defrect;
/* set the crop area, but don't exit if the device don't support croping */ /* set the crop area, but don't exit if the device don't support croping */
if (xioctl (capture->deviceHandle, VIDIOC_S_CROP, &capture->crop) < 0) { if (ioctl (capture->deviceHandle, VIDIOC_S_CROP, &capture->crop) < 0) {
fprintf(stderr, "HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP\n"); fprintf(stderr, "HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP\n");
} }
} }
@ -2448,7 +2489,7 @@ static int icvSetVideoSize( CvCaptureCAM_V4L* capture, int w, int h) {
capture->form.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; capture->form.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
/* read the current setting, mainly to retreive the pixelformat information */ /* read the current setting, mainly to retreive the pixelformat information */
xioctl (capture->deviceHandle, VIDIOC_G_FMT, &capture->form); ioctl (capture->deviceHandle, VIDIOC_G_FMT, &capture->form);
/* set the values we want to change */ /* set the values we want to change */
capture->form.fmt.pix.width = w; capture->form.fmt.pix.width = w;
@ -2463,7 +2504,7 @@ static int icvSetVideoSize( CvCaptureCAM_V4L* capture, int w, int h) {
* don't test if the set of the size is ok, because some device * don't test if the set of the size is ok, because some device
* don't allow changing the size, and we will get the real size * don't allow changing the size, and we will get the real size
* later */ * later */
xioctl (capture->deviceHandle, VIDIOC_S_FMT, &capture->form); ioctl (capture->deviceHandle, VIDIOC_S_FMT, &capture->form);
/* try to set framerate to 30 fps */ /* try to set framerate to 30 fps */
struct v4l2_streamparm setfps; struct v4l2_streamparm setfps;
@ -2471,14 +2512,14 @@ static int icvSetVideoSize( CvCaptureCAM_V4L* capture, int w, int h) {
setfps.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; setfps.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
setfps.parm.capture.timeperframe.numerator = 1; setfps.parm.capture.timeperframe.numerator = 1;
setfps.parm.capture.timeperframe.denominator = 30; setfps.parm.capture.timeperframe.denominator = 30;
xioctl (capture->deviceHandle, VIDIOC_S_PARM, &setfps); ioctl (capture->deviceHandle, VIDIOC_S_PARM, &setfps);
/* we need to re-initialize some things, like buffers, because the size has /* we need to re-initialize some things, like buffers, because the size has
* changed */ * changed */
capture->FirstCapture = 1; capture->FirstCapture = 1;
/* Get window info again, to get the real value */ /* Get window info again, to get the real value */
if (-1 == xioctl (capture->deviceHandle, VIDIOC_G_FMT, &capture->form)) if (-1 == ioctl (capture->deviceHandle, VIDIOC_G_FMT, &capture->form))
{ {
fprintf(stderr, "HIGHGUI ERROR: V4L/V4L2: Could not obtain specifics of capture window.\n\n"); fprintf(stderr, "HIGHGUI ERROR: V4L/V4L2: Could not obtain specifics of capture window.\n\n");
@ -2489,8 +2530,12 @@ static int icvSetVideoSize( CvCaptureCAM_V4L* capture, int w, int h) {
return 0; return 0;
} else }
#endif /* HAVE_CAMV4L2 */ #endif /* HAVE_CAMV4L2 */
#if defined(HAVE_CAMV4L) && defined(HAVE_CAMV4L2)
else
#endif /* HAVE_CAMV4L && HAVE_CAMV4L2 */
#ifdef HAVE_CAMV4L
{ {
if (capture==0) return 0; if (capture==0) return 0;
@ -2517,6 +2562,7 @@ static int icvSetVideoSize( CvCaptureCAM_V4L* capture, int w, int h) {
capture->FirstCapture = 1; capture->FirstCapture = 1;
} }
#endif /* HAVE_CAMV4L */
return 0; return 0;
@ -2573,7 +2619,7 @@ static int icvSetControl (CvCaptureCAM_V4L* capture,
} }
/* get the min and max values */ /* get the min and max values */
if (-1 == xioctl (capture->deviceHandle, if (-1 == ioctl (capture->deviceHandle,
VIDIOC_G_CTRL, &capture->control)) { VIDIOC_G_CTRL, &capture->control)) {
// perror ("VIDIOC_G_CTRL for getting min/max values"); // perror ("VIDIOC_G_CTRL for getting min/max values");
return -1; return -1;
@ -2643,13 +2689,17 @@ static int icvSetControl (CvCaptureCAM_V4L* capture,
capture->control.value = (int)(value * (v4l2_max - v4l2_min) + v4l2_min); capture->control.value = (int)(value * (v4l2_max - v4l2_min) + v4l2_min);
/* The driver may clamp the value or return ERANGE, ignored here */ /* The driver may clamp the value or return ERANGE, ignored here */
if (-1 == xioctl (capture->deviceHandle, if (-1 == ioctl (capture->deviceHandle,
VIDIOC_S_CTRL, &capture->control) && errno != ERANGE) { VIDIOC_S_CTRL, &capture->control) && errno != ERANGE) {
perror ("VIDIOC_S_CTRL"); perror ("VIDIOC_S_CTRL");
return -1; return -1;
} }
} else }
#endif /* HAVE_CAMV4L2 */ #endif /* HAVE_CAMV4L2 */
#if defined(HAVE_CAMV4L) && defined(HAVE_CAMV4L2)
else
#endif /* HAVE_CAMV4L && HAVE_CAMV4L2 */
#ifdef HAVE_CAMV4L
{ {
int v4l_value; int v4l_value;
@ -2694,6 +2744,7 @@ static int icvSetControl (CvCaptureCAM_V4L* capture,
return -1; return -1;
} }
} }
#endif /* HAVE_CAMV4L */
/* all was OK */ /* all was OK */
return 0; return 0;
@ -2754,6 +2805,7 @@ static void icvCloseCAM_V4L( CvCaptureCAM_V4L* capture ){
#ifdef HAVE_CAMV4L2 #ifdef HAVE_CAMV4L2
if (V4L2_SUPPORT == 0) if (V4L2_SUPPORT == 0)
#endif /* HAVE_CAMV4L2 */ #endif /* HAVE_CAMV4L2 */
#ifdef HAVE_CAMV4L
{ {
if (capture->mmaps) if (capture->mmaps)
@ -2762,10 +2814,14 @@ static void icvCloseCAM_V4L( CvCaptureCAM_V4L* capture ){
munmap(capture->memoryMap, capture->memoryBuffer.size); munmap(capture->memoryMap, capture->memoryBuffer.size);
} }
#endif /* HAVE_CAMV4L */
#if defined(HAVE_CAMV4L) && defined(HAVE_CAMV4L2)
else
#endif /* HAVE_CAMV4L && HAVE_CAMV4L2 */
#ifdef HAVE_CAMV4L2 #ifdef HAVE_CAMV4L2
else { {
capture->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; capture->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (ioctl(capture->deviceHandle, VIDIOC_STREAMOFF, &capture->type) < 0) { if (-1 == ioctl(capture->deviceHandle, VIDIOC_STREAMOFF, &capture->type)) {
perror ("Unable to stop the stream."); perror ("Unable to stop the stream.");
} }

Loading…
Cancel
Save