unsigned char* macvdCamera::getFrame() { OSErr err; int isUpdated = 0; if (!vdgIsGrabbing(pVdg)) return NULL; if (err = vdgIdle( pVdg, &isUpdated)) { printf("could not grab frame\n"); return NULL; } if (isUpdated) { unsigned char *src = (unsigned char*)pDstData; unsigned char *dest = buffer; switch (colour) { case true: { uyvy2rgb(width,height,src,dest); break; } case false: { uyvy2gray(width,height,src,dest); break; } } return buffer; } return NULL; }
static void process_image(const void * src, int len, usb_cam_camera_image_t *dest) { if(pixelformat==V4L2_PIX_FMT_YUYV) yuyv2rgb((char*)src, dest->image, dest->width*dest->height); else if(pixelformat==V4L2_PIX_FMT_UYVY) uyvy2rgb((char*)src, dest->image, dest->width*dest->height); else if(pixelformat==V4L2_PIX_FMT_MJPEG) mjpeg2rgb((char*)src, len, dest->image, dest->width*dest->height); }
Image ColorConvert::apply(Image im, string from, string to) { // check for the trivial case assert(from != to, "color conversion from %s to %s is pointless\n", from.c_str(), to.c_str()); // unsupported destination color spaces if (to == "yuyv" || to == "uyvy") { panic("Unsupported destination color space: %s\n", to.c_str()); } // direct conversions that don't have to go via rgb if (from == "yuyv" && to == "yuv") { return yuyv2yuv(im); } else if (from == "uyvy" && to == "yuv") { return uyvy2yuv(im); } else if (from == "xyz" && to == "lab") { return xyz2lab(im); } else if (from == "lab" && to == "xyz") { return lab2xyz(im); } else if (from == "argb" && to == "xyz") { return argb2xyz(im); } else if (from == "xyz" && to == "argb") { return xyz2argb(im); } else if (from != "rgb" && to != "rgb") { // conversions that go through rgb Image halfway = apply(im, from, "rgb"); return apply(halfway, "rgb", to); } else if (from == "rgb") { // from rgb if (to == "hsv" || to == "hsl" || to == "hsb") { return rgb2hsv(im); } else if (to == "yuv") { return rgb2yuv(im); } else if (to == "xyz") { return rgb2xyz(im); } else if (to == "y" || to == "gray" || to == "grayscale" || to == "luminance") { return rgb2y(im); } else if (to == "lab") { return rgb2lab(im); } else if (to == "argb") { return rgb2argb(im); } else { panic("Unknown color space %s\n", to.c_str()); } } else { //(to == "rgb") if (from == "hsv" || from == "hsl" || from == "hsb") { return hsv2rgb(im); } else if (from == "yuv") { return yuv2rgb(im); } else if (from == "xyz") { return xyz2rgb(im); } else if (from == "y" || from == "gray" || from == "grayscale" || from == "luminance") { return y2rgb(im); } else if (from == "lab") { return lab2rgb(im); } else if (from == "uyvy") { return uyvy2rgb(im); } else if (from == "yuyv") { return yuyv2rgb(im); } else if (from == "argb") { return argb2rgb(im); } else { panic("Unknown color space %s\n", from.c_str()); } } // keep the compiler happy return Image(); }
unsigned char* V4Linux2Camera::getFrame() { if (dev_handle<0) return NULL; if (ioctl(dev_handle, VIDIOC_DQBUF, &v4l2_buf)<0) { running = false; return NULL; } unsigned char *raw_buffer = (unsigned char*)buffers[v4l2_buf.index].start; if (raw_buffer==NULL) return NULL; if(cfg->color) { if (cfg->frame) { if (pixelformat==V4L2_PIX_FMT_YUYV) crop_yuyv2rgb(cfg->cam_width,raw_buffer,frm_buffer); else if (pixelformat==V4L2_PIX_FMT_UYVY) crop_uyvy2rgb(cfg->cam_width,raw_buffer,frm_buffer); else if (pixelformat==V4L2_PIX_FMT_YUV420) { //TODO } else if (pixelformat==V4L2_PIX_FMT_YUV410) { //TODO } else if (pixelformat==V4L2_PIX_FMT_GREY) crop_gray2rgb(cfg->cam_width,raw_buffer, frm_buffer); else if ((pixelformat == V4L2_PIX_FMT_MJPEG) || (pixelformat == V4L2_PIX_FMT_JPEG)) { int jpegSubsamp; tjDecompressHeader2(_jpegDecompressor, raw_buffer, v4l2_buf.bytesused, &cfg->cam_width, &cfg->cam_height, &jpegSubsamp); tjDecompress2(_jpegDecompressor, raw_buffer, v4l2_buf.bytesused, cam_buffer, cfg->cam_width, 0, cfg->cam_height, TJPF_RGB, TJFLAG_FASTDCT); crop(cfg->cam_width, cfg->cam_height,cam_buffer,frm_buffer,3); } } else { if (pixelformat==V4L2_PIX_FMT_YUYV) yuyv2rgb(cfg->cam_width,cfg->cam_height,raw_buffer,cam_buffer); else if (pixelformat==V4L2_PIX_FMT_UYVY) uyvy2rgb(cfg->cam_width,cfg->cam_height,raw_buffer,cam_buffer); else if (pixelformat==V4L2_PIX_FMT_YUV420) { //TODO } else if (pixelformat==V4L2_PIX_FMT_YUV410) { //TODO } else if (pixelformat==V4L2_PIX_FMT_GREY) gray2rgb(cfg->cam_width,cfg->cam_height,raw_buffer,cam_buffer); else if ((pixelformat == V4L2_PIX_FMT_MJPEG) || (pixelformat == V4L2_PIX_FMT_JPEG)) { int jpegSubsamp; tjDecompressHeader2(_jpegDecompressor, raw_buffer, v4l2_buf.bytesused, &cfg->cam_width, &cfg->cam_height, &jpegSubsamp); tjDecompress2(_jpegDecompressor, raw_buffer, v4l2_buf.bytesused, cam_buffer, cfg->cam_width, 0, cfg->cam_height, TJPF_RGB, TJFLAG_FASTDCT); } } } else { if (cfg->frame) { if (pixelformat==V4L2_PIX_FMT_YUYV) crop_yuyv2gray(cfg->cam_width,raw_buffer,frm_buffer); else if (pixelformat==V4L2_PIX_FMT_UYVY) crop_uyvy2gray(cfg->cam_width,raw_buffer,frm_buffer); else if (pixelformat==V4L2_PIX_FMT_YUV420) crop(cfg->cam_width, cfg->cam_height,raw_buffer,frm_buffer,1); else if (pixelformat==V4L2_PIX_FMT_YUV410) crop(cfg->cam_width, cfg->cam_height,raw_buffer,frm_buffer,1); else if (pixelformat==V4L2_PIX_FMT_GREY) crop(cfg->cam_width, cfg->cam_height,raw_buffer,frm_buffer,1); else if ((pixelformat == V4L2_PIX_FMT_MJPEG) || (pixelformat == V4L2_PIX_FMT_JPEG)) { int jpegSubsamp; tjDecompressHeader2(_jpegDecompressor, raw_buffer, v4l2_buf.bytesused, &cfg->cam_width, &cfg->cam_height, &jpegSubsamp); tjDecompress2(_jpegDecompressor, raw_buffer, v4l2_buf.bytesused, cam_buffer, cfg->cam_width, 0, cfg->cam_height, TJPF_GRAY, TJFLAG_FASTDCT); crop(cfg->cam_width, cfg->cam_height,cam_buffer,frm_buffer,1); } } else { if (pixelformat==V4L2_PIX_FMT_YUYV) yuyv2gray(cfg->cam_width, cfg->cam_height, raw_buffer, cam_buffer); else if (pixelformat==V4L2_PIX_FMT_UYVY) uyvy2gray(cfg->cam_width, cfg->cam_height, raw_buffer, cam_buffer); else if (pixelformat==V4L2_PIX_FMT_YUV420) memcpy(cam_buffer,raw_buffer,cfg->cam_width*cfg->cam_height); else if (pixelformat==V4L2_PIX_FMT_YUV410) memcpy(cam_buffer,raw_buffer,cfg->cam_width*cfg->cam_height); //else if (pixelformat==V4L2_PIX_FMT_GREY) memcpy(cam_buffer,raw_buffer,cam_width*cam_height); else if ((pixelformat == V4L2_PIX_FMT_MJPEG) || (pixelformat == V4L2_PIX_FMT_JPEG)) { int jpegSubsamp; tjDecompressHeader2(_jpegDecompressor, raw_buffer, v4l2_buf.bytesused, &cfg->cam_width, &cfg->cam_height, &jpegSubsamp); tjDecompress2(_jpegDecompressor, raw_buffer, v4l2_buf.bytesused, cam_buffer, cfg->cam_width, 0, cfg->cam_height, TJPF_GRAY, TJFLAG_FASTDCT); } } } if (-1 == ioctl (dev_handle, VIDIOC_QBUF, &v4l2_buf)) { printf("cannot unqueue buffer: %s\n", strerror(errno)); return NULL; } if (cfg->frame) return frm_buffer; else if ((!cfg->color) && (pixelformat==V4L2_PIX_FMT_GREY)) return raw_buffer; else return cam_buffer; }