[Sumover-dev] [svn commit] r4444 - vic/branches/mpeg4/video
sumover-dev at cs.ucl.ac.uk
sumover-dev at cs.ucl.ac.uk
Sun May 17 23:42:29 BST 2009
Author: douglask
Date: Sun May 17 23:42:23 2009
New Revision: 4444
Modified:
vic/branches/mpeg4/video/grabber-video4linux.cpp
Log:
Modified grabber-video4linux to use yuv_convert.cpp's YUV conversion routines
Modified: vic/branches/mpeg4/video/grabber-video4linux.cpp
==============================================================================
--- vic/branches/mpeg4/video/grabber-video4linux.cpp (original)
+++ vic/branches/mpeg4/video/grabber-video4linux.cpp Sun May 17 23:42:23 2009
@@ -9,9 +9,6 @@
Added brightness, contrast, hue and saturation controls.
by Jean-Marc Orliaguet <jmo at medialab.chalmers.se>
- Added support for various YUV byte orders.
- by Jean-Marc Orliaguet <jmo at medialab.chalmers.se>
-
Added support for NTSC/PAL/SECAM video norm selection. (14/10/99)
by Jean-Marc Orliaguet <jmo at medialab.chalmers.se>
@@ -55,6 +52,7 @@
#include "vic_tcl.h"
#include "device-input.h"
#include "module.h"
+#include "yuv_convert.h"
/* here you can tune the device names */
static const char *devlist[] = {
@@ -82,13 +80,6 @@
#define CF_420 1
#define CF_CIF 2
-
-/* YUV Byte order */
-#define BYTE_ORDER_YUYV 0
-#define BYTE_ORDER_YVYU 1
-#define BYTE_ORDER_UYVY 2
-#define BYTE_ORDER_VYUY 3
-
/* VIDEO NORMS */
#define MAX_NORMS 4
@@ -108,10 +99,6 @@
void format();
void setsize();
- void packed422_to_planar422(char *, const char *);
- void packed422_to_planar420(char *, const char *);
- void planar420_to_planar422(char *, const char *);
-
struct video_capability capability;
struct video_channel *channels;
struct video_picture pict;
@@ -128,11 +115,10 @@
int fd_;
int format_;
- int have_422P;
- int have_422;
- int have_420P;
+ int have_YUV422P;
+ int have_YUV422;
+ int have_YUV420P;
int v4lformat_;
- int byteorder_;
int cformat_;
int port_;
int norm_;
@@ -310,9 +296,9 @@
struct video_mmap vid_mmap;
have_mmap = 0;
- have_422P = 0;
- have_422 = 0;
- have_420P = 0;
+ have_YUV422P = 0;
+ have_YUV422 = 0;
+ have_YUV420P = 0;
port_ = 0;
norm_ = 0;
@@ -384,23 +370,23 @@
vid_mmap.format = VIDEO_PALETTE_YUV422P;
if (-1 != v4l1_ioctl(fd_, VIDIOCMCAPTURE, &vid_mmap)) {
- have_422P = 1;
+ have_YUV422P = 1;
debug_msg("Device capture VIDEO_PALETTE_YUV422P\n");
}
vid_mmap.format = VIDEO_PALETTE_YUV420P;
if (-1 != v4l1_ioctl(fd_, VIDIOCMCAPTURE, &vid_mmap)) {
- have_420P = 1;
+ have_YUV420P = 1;
debug_msg("Device capture VIDEO_PALETTE_YUV420P\n");
}
vid_mmap.format = VIDEO_PALETTE_YUV422;
if (-1 != v4l1_ioctl(fd_, VIDIOCMCAPTURE, &vid_mmap)) {
- have_422 = 1;
+ have_YUV422 = 1;
debug_msg("Device capture VIDEO_PALETTE_YUV422\n");
}
- if( !( have_422P || have_422 || have_420P)){
+ if( !( have_YUV422P || have_YUV422 || have_YUV420P)){
debug_msg("No suitable palette found\n");
v4l1_close(fd_);
status_=-1;
@@ -433,14 +419,6 @@
Tcl & tcl = Tcl::instance();
- byteorder_ = 0;
-
- if (tcl.attr("yuv_byteOrder") != NULL)
- byteorder_ = atoi(tcl.attr("yuv_byteOrder"));
-
- if (!((byteorder_ >= 0) && (byteorder_ <= 3)))
- byteorder_ = 0;
-
if (argc == 3) {
if (strcmp(argv[1], "decimate") == 0) {
decimate_ = atoi(argv[2]);
@@ -523,12 +501,6 @@
}
}
- if (strcmp(argv[1], "yuv_byteorder") == 0) {
- byteorder_ = atoi(argv[2]);
- return (TCL_OK);
- }
-
-
if (strcmp(argv[1], "fps") == 0) {
debug_msg("V4L: fps %s\n", argv[2]);
}
@@ -623,24 +595,21 @@
switch (cformat_) {
case CF_420:
case CF_CIF:
- if (have_420P)
- memcpy((void *) frame_, (const void *) fr,
- (size_t) height_ * width_ * 3 / 2);
- else
- packed422_to_planar420((char *) frame_, fr);
+ if (have_YUV420P)
+ planarYUYV420_to_planarYUYV420((char *)frame_, outw_, outh_, fr, inw_, inh_);
+ else if (have_YUV422)
+ packedYUYV422_to_planarYUYV420((char *)frame_, outw_, outh_, fr, inw_, inh_);
+ else if (have_YUV422P)
+ planarYUYV422_to_planarYUYV420((char *)frame_, outw_, outh_, fr, inw_, inh_);
break;
case CF_422:
- if (have_422P)
- memcpy((void *) frame_, (const void *) fr,
- (size_t) height_ * width_ * 2);
- else if (have_422) {
- packed422_to_planar422((char *) frame_, fr);
- }
- else {
- // have_420P
- planar420_to_planar422((char *) frame_, fr);
- }
+ if (have_YUV422P)
+ planarYUYV422_to_planarYUYV422((char *)frame_, outw_, outh_, fr, inw_, inh_);
+ else if (have_YUV422)
+ packedYUYV422_to_planarYUYV422((char *)frame_, outw_, outh_, fr, inw_, inh_);
+ else if (have_YUV420P)
+ planarYUYV420_to_planarYUYV422((char *)frame_, outw_, outh_, fr, inw_, inh_);
break;
}
@@ -650,7 +619,7 @@
if (have_mmap) {
if (-1 ==
v4l1_ioctl(fd_, VIDIOCMCAPTURE,
- (grab_count % 2) ? &gb_odd : &gb_even))
+ (grab_count % 2) ? &gb_odd : &gb_even))
perror("ioctl VIDIOMCAPTURE");
else
grab_count++;
@@ -663,288 +632,6 @@
return (target_->consume(&f));
}
-void V4lGrabber::packed422_to_planar422(char *dest, const char *src)
-{
- int i;
- char *y, *u, *v;
- unsigned int a, *srca;
-
- srca = (unsigned int *) src;
-
- i = (width_ * height_) / 2;
- y = dest;
- u = y + width_ * height_;
- v = u + width_ * height_ / 2;
-
-
- switch (byteorder_) {
- case BYTE_ORDER_YUYV:
- while (--i) {
- a = *(srca++);
-#if BYTE_ORDER == LITTLE_ENDIAN
- *(y++) = a & 0xff;
- a >>= 8;
- *(u++) = a & 0xff;
- a >>= 8;
- *(y++) = a & 0xff;
- a >>= 8;
- *(v++) = a & 0xff;
-#else
- *(v++) = a & 0xff;
- a >>= 8;
- *(y++) = a & 0xff;
- a >>= 8;
- *(u++) = a & 0xff;
- a >>= 8;
- *(y++) = a & 0xff;
-#endif
- }
- break;
-
- case BYTE_ORDER_YVYU:
- while (--i) {
- a = *(srca++);
-#if BYTE_ORDER == LITTLE_ENDIAN
- *(y++) = a & 0xff;
- a >>= 8;
- *(v++) = a & 0xff;
- a >>= 8;
- *(y++) = a & 0xff;
- a >>= 8;
- *(u++) = a & 0xff;
-#else
- *(u++) = a & 0xff;
- a >>= 8;
- *(y++) = a & 0xff;
- a >>= 8;
- *(v++) = a & 0xff;
- a >>= 8;
- *(y++) = a & 0xff;
-#endif
- }
- break;
-
- case BYTE_ORDER_UYVY:
- while (--i) {
- a = *(srca++);
-#if BYTE_ORDER == LITTLE_ENDIAN
- *(u++) = a & 0xff;
- a >>= 8;
- *(y++) = a & 0xff;
- a >>= 8;
- *(v++) = a & 0xff;
- a >>= 8;
- *(y++) = a & 0xff;
-#else
- *(y++) = a & 0xff;
- a >>= 8;
- *(v++) = a & 0xff;
- a >>= 8;
- *(y++) = a & 0xff;
- a >>= 8;
- *(u++) = a & 0xff;
-#endif
-
- }
- break;
-
- case BYTE_ORDER_VYUY:
- while (--i) {
- a = *(srca++);
-#if BYTE_ORDER == LITTLE_ENDIAN
- *(v++) = a & 0xff;
- a >>= 8;
- *(y++) = a & 0xff;
- a >>= 8;
- *(u++) = a & 0xff;
- a >>= 8;
- *(y++) = a & 0xff;
-#else
- *(y++) = a & 0xff;
- a >>= 8;
- *(u++) = a & 0xff;
- a >>= 8;
- *(y++) = a & 0xff;
- a >>= 8;
- *(v++) = a & 0xff;
-#endif
- }
- break;
- }
-
-}
-
-void V4lGrabber::packed422_to_planar420(char *dest, const char *src)
-{
- int a1, b;
- char *y, *u, *v;
- unsigned int a, *srca;
-
- srca = (unsigned int *) src;
-
- y = dest;
- u = y + width_ * height_;
- v = u + width_ * height_ / 4;
-
- switch (byteorder_) {
- case BYTE_ORDER_YUYV:
- for (a1 = height_; a1 > 0; a1 -= 2) {
- for (b = width_; b > 0; b -= 2) {
- a = *(srca++);
-#if BYTE_ORDER == LITTLE_ENDIAN
- *(y++) = a & 0xff; a >>= 8;
- *(u++) = a & 0xff; a >>= 8;
- *(y++) = a & 0xff; a >>= 8;
- *(v++) = a & 0xff;
-#else
- *(v++) = a & 0xff; a >>= 8;
- *(y+1) = a & 0xff; a >>= 8;
- *(u++) = a & 0xff; a >>= 8;
- *(y) = a; y += 2;
-#endif
- }
- for (b = width_; b > 0; b -= 2) {
- a = *(srca++);
-#if BYTE_ORDER == LITTLE_ENDIAN
- *(y++) = a & 0xff; a >>= 16;
- *(y++) = a & 0xff;
-#else
- a >>= 8;
- *(y+1) = a & 0xff; a >>= 16;
- *(y) = a; y += 2;
-#endif
- }
- }
- break;
-
- case BYTE_ORDER_YVYU:
- for (a1 = height_; a1 > 0; a1 -= 2) {
- for (b = width_; b > 0; b -= 2) {
- a = *(srca++);
-#if BYTE_ORDER == LITTLE_ENDIAN
- *(y++) = a & 0xff; a >>= 8;
- *(v++) = a & 0xff; a >>= 8;
- *(y++) = a & 0xff; a >>= 8;
- *(u++) = a & 0xff;
-#else
- *(u++) = a & 0xff; a >>= 8;
- *(y+1) = a & 0xff; a >>= 8;
- *(v++) = a & 0xff; a >>= 8;
- *(y) = a; y += 2;
-#endif
- }
- for (b = width_; b > 0; b -= 2) {
- a = *(srca++);
-#if BYTE_ORDER == LITTLE_ENDIAN
- *(y++) = a & 0xff; a >>= 16;
- *(y++) = a & 0xff;
-#else
- a >>= 8;
- *(y+1) = a & 0xff; a >>= 16;
- *(y) = a; y += 2;
-#endif
- }
- }
- break;
-
- case BYTE_ORDER_UYVY:
- for (a1 = height_; a1 > 0; a1 -= 2) {
- for (b = width_; b > 0; b -= 2) {
- a = *(srca++);
-#if BYTE_ORDER == LITTLE_ENDIAN
- *(u++) = a & 0xff; a >>= 8;
- *(y++) = a & 0xff; a >>= 8;
- *(v++) = a & 0xff; a >>= 8;
- *(y++) = a & 0xff;
-#else
- *(y+1) = a & 0xff; a >>= 8;
- *(v++) = a & 0xff; a >>= 8;
- *(y) = a & 0xff; a >>= 8;
- *(u++) = a & 0xff;
- y += 2;
-#endif
- }
- for (b = width_; b > 0; b -= 2) {
- a = *(srca++);
-#if BYTE_ORDER == LITTLE_ENDIAN
- a >>= 8;
- *(y++) = a & 0xff; a >>= 16;
- *(y++) = a & 0xff;
-#else
- *(y+1) = a & 0xff; a >>= 16;
- *(y) = a; y += 2;
-#endif
-
- }
- }
- break;
-
- case BYTE_ORDER_VYUY:
- for (a1 = height_; a1 > 0; a1 -= 2) {
- for (b = width_; b > 0; b -= 2) {
- a = *(srca++);
-#if BYTE_ORDER == LITTLE_ENDIAN
- *(v++) = a & 0xff; a >>= 8;
- *(y++) = a & 0xff; a >>= 8;
- *(u++) = a & 0xff; a >>= 8;
- *(y++) = a & 0xff;
-#else
- *(y+1) = a & 0xff; a >>= 8;
- *(u++) = a & 0xff; a >>= 8;
- *(y) = a & 0xff; a >>= 8;
- *(v++) = a & 0xff;
- y += 2;
-#endif
- }
- for (b = width_; b > 0; b -= 2) {
- a = *(srca++);
-#if BYTE_ORDER == LITTLE_ENDIAN
- a >>= 8;
- *(y++) = a & 0xff; a >>= 16;
- *(y++) = a & 0xff;
-#else
- *(y+1) = a & 0xff; a >>= 16;
- *(y) = a; y += 2;
-#endif
- }
- }
- break;
- }
-}
-
-
-void V4lGrabber::planar420_to_planar422(char *dest, const char *src)
-{
- int line, stride;
- unsigned char *sy, *su, *sv, *ty, *tu, *tv;
-
- stride = 2 * width_;
- sy = (unsigned char *) src;
- su = sy + width_ * height_;
- sv = su + width_ * height_ / 4;
-
- ty = (unsigned char *) dest;
- tu = ty + width_ * height_;
- tv = tu + width_ * height_ / 2;
-
- /* Copy planar lumina block */
- memcpy(ty, sy, width_ * height_);
-
- /* Copy the chroma under consideration of chroma for two lines in YUV420 */
- for (line = 0; line < height_; line += 2) {
- memcpy(tu, su, stride);
- memcpy(tv, sv, stride);
- // Don't increment sourceline if line = 2,6,10,14,...
- if ((line & 3) != 2) {
- su += width_;
- sv += width_;
- }
- tu += width_;
- tv += width_;
- }
-}
-
-
void V4lGrabber::format()
{
struct video_channel channel;
@@ -973,7 +660,7 @@
}
// FIXED by barz 2006/9/19: YUV422 is default
- if (have_420P)
+ if (have_YUV420P)
v4lformat_ = VIDEO_PALETTE_YUV420P;
else
v4lformat_ = VIDEO_PALETTE_YUV422;
@@ -989,7 +676,7 @@
break;
case CF_422:
set_size_422(width_, height_);
- if (have_422P) {
+ if (have_YUV422P) {
v4lformat_ = VIDEO_PALETTE_YUV422P;
debug_msg("Capturing directly in 422 Planar\n");
}
More information about the Sumover-dev
mailing list