Commit 5525cc4d authored by Pavel Rojtberg's avatar Pavel Rojtberg

implement CAP_PROP_MODE, CAP_PROP_FOURCC and CAP_PROP_FORMAT

do not use a custom enum instead of the V4L2 fourcc defines for palette.
This way we can easily implement CAP_PROP_FOURCC and CAP_PROP_MODE.
parent c0fe522c
...@@ -280,25 +280,12 @@ static unsigned int n_buffers = 0; ...@@ -280,25 +280,12 @@ static unsigned int n_buffers = 0;
#define V4L2_PIX_FMT_SN9C10X v4l2_fourcc('S','9','1','0') /* SN9C10x cmpr. */ #define V4L2_PIX_FMT_SN9C10X v4l2_fourcc('S','9','1','0') /* SN9C10x cmpr. */
#endif #endif
#ifndef V4L2_PIX_FMT_SGBRG #ifndef V4L2_PIX_FMT_SGBRG8
#define V4L2_PIX_FMT_SGBRG v4l2_fourcc('G','B','R','G') /* bayer GBRG GBGB.. RGRG.. */ #define V4L2_PIX_FMT_SGBRG8 v4l2_fourcc('G','B','R','G') /* bayer GBRG GBGB.. RGRG.. */
#endif #endif
#endif /* HAVE_CAMV4L2 */ #endif /* HAVE_CAMV4L2 */
enum PALETTE_TYPE {
PALETTE_BGR24 = 1,
PALETTE_YVU420,
PALETTE_YUV411P,
PALETTE_YUYV,
PALETTE_UYVY,
PALETTE_SBGGR8,
PALETTE_SN9C10X,
PALETTE_MJPEG,
PALETTE_SGBRG,
PALETTE_RGB24
};
typedef struct CvCaptureCAM_V4L typedef struct CvCaptureCAM_V4L
{ {
int deviceHandle; int deviceHandle;
...@@ -315,7 +302,7 @@ typedef struct CvCaptureCAM_V4L ...@@ -315,7 +302,7 @@ typedef struct CvCaptureCAM_V4L
IplImage frame; IplImage frame;
#ifdef HAVE_CAMV4L2 #ifdef HAVE_CAMV4L2
enum PALETTE_TYPE palette; __u32 palette;
int index; int index;
int width, height; int width, height;
__u32 fps; __u32 fps;
...@@ -564,17 +551,17 @@ static int autosetup_capture_mode_v4l2(CvCaptureCAM_V4L* capture) ...@@ -564,17 +551,17 @@ static int autosetup_capture_mode_v4l2(CvCaptureCAM_V4L* capture)
{ {
if (try_palette_v4l2(capture, V4L2_PIX_FMT_BGR24) == 0) if (try_palette_v4l2(capture, V4L2_PIX_FMT_BGR24) == 0)
{ {
capture->palette = PALETTE_BGR24; capture->palette = V4L2_PIX_FMT_BGR24;
} }
else else
if (try_palette_v4l2(capture, V4L2_PIX_FMT_YVU420) == 0) if (try_palette_v4l2(capture, V4L2_PIX_FMT_YVU420) == 0)
{ {
capture->palette = PALETTE_YVU420; capture->palette = V4L2_PIX_FMT_YVU420;
} }
else else
if (try_palette_v4l2(capture, V4L2_PIX_FMT_YUV411P) == 0) if (try_palette_v4l2(capture, V4L2_PIX_FMT_YUV411P) == 0)
{ {
capture->palette = PALETTE_YUV411P; capture->palette = V4L2_PIX_FMT_YUV411P;
} }
else else
...@@ -582,35 +569,35 @@ static int autosetup_capture_mode_v4l2(CvCaptureCAM_V4L* capture) ...@@ -582,35 +569,35 @@ static int autosetup_capture_mode_v4l2(CvCaptureCAM_V4L* capture)
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 = V4L2_PIX_FMT_MJPEG;
} }
else else
#endif #endif
if (try_palette_v4l2(capture, V4L2_PIX_FMT_YUYV) == 0) if (try_palette_v4l2(capture, V4L2_PIX_FMT_YUYV) == 0)
{ {
capture->palette = PALETTE_YUYV; capture->palette = V4L2_PIX_FMT_YUYV;
} }
else if (try_palette_v4l2(capture, V4L2_PIX_FMT_UYVY) == 0) else if (try_palette_v4l2(capture, V4L2_PIX_FMT_UYVY) == 0)
{ {
capture->palette = PALETTE_UYVY; capture->palette = V4L2_PIX_FMT_UYVY;
} }
else else
if (try_palette_v4l2(capture, V4L2_PIX_FMT_SN9C10X) == 0) if (try_palette_v4l2(capture, V4L2_PIX_FMT_SN9C10X) == 0)
{ {
capture->palette = PALETTE_SN9C10X; capture->palette = V4L2_PIX_FMT_SN9C10X;
} else } else
if (try_palette_v4l2(capture, V4L2_PIX_FMT_SBGGR8) == 0) if (try_palette_v4l2(capture, V4L2_PIX_FMT_SBGGR8) == 0)
{ {
capture->palette = PALETTE_SBGGR8; capture->palette = V4L2_PIX_FMT_SBGGR8;
} else } else
if (try_palette_v4l2(capture, V4L2_PIX_FMT_SGBRG) == 0) if (try_palette_v4l2(capture, V4L2_PIX_FMT_SGBRG8) == 0)
{ {
capture->palette = PALETTE_SGBRG; capture->palette = V4L2_PIX_FMT_SGBRG8;
} }
else if (try_palette_v4l2(capture, V4L2_PIX_FMT_RGB24) == 0) else if (try_palette_v4l2(capture, V4L2_PIX_FMT_RGB24) == 0)
{ {
capture->palette = PALETTE_RGB24; capture->palette = V4L2_PIX_FMT_RGB24;
} }
else else
{ {
...@@ -2103,27 +2090,28 @@ static IplImage* icvRetrieveFrameCAM_V4L( CvCaptureCAM_V4L* capture, int) { ...@@ -2103,27 +2090,28 @@ static IplImage* icvRetrieveFrameCAM_V4L( CvCaptureCAM_V4L* capture, int) {
{ {
switch (capture->palette) switch (capture->palette)
{ {
case PALETTE_BGR24: case V4L2_PIX_FMT_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 V4L2_PIX_FMT_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 V4L2_PIX_FMT_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
case PALETTE_MJPEG: case V4L2_PIX_FMT_MJPEG:
case V4L2_PIX_FMT_JPEG:
if (!mjpeg_to_rgb24(capture->form.fmt.pix.width, if (!mjpeg_to_rgb24(capture->form.fmt.pix.width,
capture->form.fmt.pix.height, capture->form.fmt.pix.height,
(unsigned char*)(capture->buffers[capture->bufferIndex] (unsigned char*)(capture->buffers[capture->bufferIndex]
...@@ -2134,26 +2122,26 @@ static IplImage* icvRetrieveFrameCAM_V4L( CvCaptureCAM_V4L* capture, int) { ...@@ -2134,26 +2122,26 @@ static IplImage* icvRetrieveFrameCAM_V4L( CvCaptureCAM_V4L* capture, int) {
break; break;
#endif #endif
case PALETTE_YUYV: case V4L2_PIX_FMT_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 V4L2_PIX_FMT_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 V4L2_PIX_FMT_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 V4L2_PIX_FMT_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,
...@@ -2166,13 +2154,13 @@ static IplImage* icvRetrieveFrameCAM_V4L( CvCaptureCAM_V4L* capture, int) { ...@@ -2166,13 +2154,13 @@ static IplImage* icvRetrieveFrameCAM_V4L( CvCaptureCAM_V4L* capture, int) {
(unsigned char*)capture->frame.imageData); (unsigned char*)capture->frame.imageData);
break; break;
case PALETTE_SGBRG: case V4L2_PIX_FMT_SGBRG8:
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;
case PALETTE_RGB24: case V4L2_PIX_FMT_RGB24:
rgb24_to_rgb24(capture->form.fmt.pix.width, rgb24_to_rgb24(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,
...@@ -2273,6 +2261,11 @@ static double icvGetPropertyCAM_V4L (CvCaptureCAM_V4L* capture, ...@@ -2273,6 +2261,11 @@ static double icvGetPropertyCAM_V4L (CvCaptureCAM_V4L* capture,
return capture->form.fmt.pix.width; return capture->form.fmt.pix.width;
case CV_CAP_PROP_FRAME_HEIGHT: case CV_CAP_PROP_FRAME_HEIGHT:
return capture->form.fmt.pix.height; return capture->form.fmt.pix.height;
case CV_CAP_PROP_FOURCC:
case CV_CAP_PROP_MODE:
return capture->palette;
case CV_CAP_PROP_FORMAT:
return CV_8UC3;
} }
if(property_id == CV_CAP_PROP_FPS) { if(property_id == CV_CAP_PROP_FPS) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment