add V4L2_PIX_FMT_RGB24 convert code
authorYusuke Suzuki <yusuke@geekfield.jp>
Mon, 3 Nov 2014 08:48:10 +0000 (17:48 +0900)
committerYusuke Suzuki <yusuke@geekfield.jp>
Tue, 4 Nov 2014 06:21:30 +0000 (15:21 +0900)
modules/videoio/src/cap_v4l.cpp

index efa9a8b..a0fe8f1 100644 (file)
@@ -294,7 +294,8 @@ enum PALETTE_TYPE {
   PALETTE_SBGGR8,
   PALETTE_SN9C10X,
   PALETTE_MJPEG,
-  PALETTE_SGBRG
+  PALETTE_SGBRG,
+  PALETTE_RGB24
 };
 
 typedef struct CvCaptureCAM_V4L
@@ -588,6 +589,10 @@ static int autosetup_capture_mode_v4l2(CvCaptureCAM_V4L* capture)
   {
     capture->palette = PALETTE_SGBRG;
   }
+  else if (try_palette_v4l2(capture, V4L2_PIX_FMT_RGB24) == 0)
+  {
+    capture->palette = PALETTE_RGB24;
+  }
       else
   {
     fprintf(stderr, "VIDEOIO ERROR: V4L2: Pixel format of incoming image is unsupported by OpenCV\n");
@@ -1916,6 +1921,18 @@ static void sgbrg2rgb24(long int WIDTH, long int HEIGHT, unsigned char *src, uns
     }
 }
 
+static void
+rgb24_to_rgb24 (int width, int height, unsigned char *src, unsigned char *dst)
+{
+  const int size = width * height;
+  for(int i = 0; i < size; ++i, src += 3, dst += 3)
+  {
+    *(dst + 0) = *(src + 2);
+    *(dst + 1) = *(src + 1);
+    *(dst + 2) = *(src + 0);
+  }
+}
+
 #define CLAMP(x)        ((x)<0?0:((x)>255)?255:(x))
 
 typedef struct {
@@ -2219,6 +2236,12 @@ static IplImage* icvRetrieveFrameCAM_V4L( CvCaptureCAM_V4L* capture, int) {
                 (unsigned char*)capture->buffers[(capture->bufferIndex+1) % capture->req.count].start,
                 (unsigned char*)capture->frame.imageData);
         break;
+    case PALETTE_RGB24:
+        rgb24_to_rgb24(capture->form.fmt.pix.width,
+                capture->form.fmt.pix.height,
+                (unsigned char*)capture->buffers[(capture->bufferIndex+1) % capture->req.count].start,
+                (unsigned char*)capture->frame.imageData);
+        break;
     }
   }
 #endif /* HAVE_CAMV4L2 */