71 name =
"Builtin decoder";
84 for (i = 0; i < 32; i++)
86 lut5[i] = (char)(((
float)i * 255.0) / 31.0);
88 for (i = 0; i < 64; i++)
90 lut6[i] = (char)(((
float)i * 255.0) / 63.0);
128 switch (
fmt.fmt.pix.pixelformat)
130 case V4L2_PIX_FMT_GREY:
133 unsigned char *src = frame +
crop.c.left + (
crop.c.top *
fmt.fmt.pix.width);
134 unsigned char *dest =
YBuf;
136 for (
unsigned int i = 0; i < (
unsigned int)
crop.c.height; i++)
138 memcpy(dest, src,
crop.c.width);
139 src +=
fmt.fmt.pix.width;
140 dest +=
crop.c.width;
149 case V4L2_PIX_FMT_Y16:
152 unsigned char *src = frame + 2 * (
crop.c.left) + (
crop.c.top *
fmt.fmt.pix.bytesperline);
155 for (
unsigned int i = 0; i < (
unsigned int)
crop.c.height; i++)
157 memcpy(dest, src, 2 *
crop.c.width);
158 src +=
fmt.fmt.pix.bytesperline;
159 dest += 2 *
crop.c.width;
168 case V4L2_PIX_FMT_YUV420:
169 case V4L2_PIX_FMT_YVU420:
172 unsigned char *src = frame +
crop.c.left + (
crop.c.top *
fmt.fmt.pix.width);
173 unsigned char *dest =
YBuf;
176 for (
unsigned int i = 0; i < (
unsigned int)
crop.c.height; i++)
178 memcpy(dest, src,
crop.c.width);
179 src +=
fmt.fmt.pix.width;
180 dest +=
crop.c.width;
184 src = frame + (
fmt.fmt.pix.width *
fmt.fmt.pix.height) +
185 ((
crop.c.left + (
crop.c.top *
fmt.fmt.pix.width) / 2) / 2);
186 if (
fmt.fmt.pix.pixelformat == V4L2_PIX_FMT_YVU420)
190 for (
unsigned int i = 0; i < (
unsigned int)
crop.c.height / 2; i++)
192 memcpy(dest, src,
crop.c.width / 2);
193 src +=
fmt.fmt.pix.width / 2;
194 dest +=
crop.c.width / 2;
198 src = frame + (
fmt.fmt.pix.width *
fmt.fmt.pix.height) +
199 ((
fmt.fmt.pix.width *
fmt.fmt.pix.height) / 4) +
200 ((
crop.c.left + (
crop.c.top *
fmt.fmt.pix.width) / 2) / 2);
201 if (
fmt.fmt.pix.pixelformat == V4L2_PIX_FMT_YVU420)
205 for (
unsigned int i = 0; i < (
unsigned int)
crop.c.height / 2; i++)
207 memcpy(dest, src,
crop.c.width / 2);
208 src +=
fmt.fmt.pix.width / 2;
209 dest +=
crop.c.width / 2;
215 if (
fmt.fmt.pix.pixelformat == V4L2_PIX_FMT_YUV420)
223 if (
fmt.fmt.pix.pixelformat == V4L2_PIX_FMT_YVU420)
233 case V4L2_PIX_FMT_NV12:
234 case V4L2_PIX_FMT_NV21:
237 unsigned char *src = frame +
crop.c.left + (
crop.c.top *
fmt.fmt.pix.bytesperline);
238 unsigned char *dest =
YBuf, *destv =
nullptr;
241 for (
unsigned int i = 0; i < (
unsigned int)
crop.c.height; i++)
243 memcpy(dest, src,
crop.c.width);
244 src +=
fmt.fmt.pix.bytesperline;
245 dest +=
crop.c.width;
250 src = frame + (
fmt.fmt.pix.bytesperline *
fmt.fmt.pix.height) +
251 ((
crop.c.left + (
crop.c.top *
fmt.fmt.pix.bytesperline) / 2) / 2);
252 if (
fmt.fmt.pix.pixelformat == V4L2_PIX_FMT_NV21)
257 for (
unsigned int i = 0; i < (
unsigned int)
crop.c.height / 2; i++)
259 unsigned char *s = src;
260 for (
unsigned int j = 0; j < (
unsigned int)
crop.c.width; j += 2)
265 src +=
fmt.fmt.pix.bytesperline;
270 unsigned char *src = frame;
271 unsigned char *dest =
YBuf;
272 unsigned char *destv =
VBuf;
273 unsigned char *s =
nullptr;
275 for (
unsigned int i = 0; i <
bufheight; i++)
278 src +=
fmt.fmt.pix.bytesperline;
283 if (
fmt.fmt.pix.pixelformat == V4L2_PIX_FMT_NV21)
288 for (
unsigned int i = 0; i <
bufheight / 2; i++)
292 for (
unsigned int j = 0; j <
bufwidth; j += 2)
297 src +=
fmt.fmt.pix.bytesperline;
302 case V4L2_PIX_FMT_YUYV:
305 unsigned char *src = frame + 2 * (
crop.c.left) + (
crop.c.top *
fmt.fmt.pix.bytesperline);
308 for (
unsigned int i = 0; i < (
unsigned int)
crop.c.height; i++)
310 memcpy(dest, src, 2 *
crop.c.width);
311 src +=
fmt.fmt.pix.bytesperline;
312 dest += 2 *
crop.c.width;
321 case V4L2_PIX_FMT_UYVY:
322 case V4L2_PIX_FMT_VYUY:
323 case V4L2_PIX_FMT_YVYU:
325 unsigned char *src =
nullptr;
327 unsigned char *s =
nullptr, *s1 =
nullptr, *s2 =
nullptr, *s3 =
nullptr, *s4 =
nullptr;
331 src = frame + 2 * (
crop.c.left) + (
crop.c.top *
fmt.fmt.pix.bytesperline);
342 switch (
fmt.fmt.pix.pixelformat)
344 case V4L2_PIX_FMT_UYVY:
350 case V4L2_PIX_FMT_VYUY:
356 case V4L2_PIX_FMT_YVYU:
363 for (
int j = 0; j < (int)(
bufwidth / 2); j++)
374 src +=
fmt.fmt.pix.bytesperline;
379 case V4L2_PIX_FMT_RGB24:
385 src = frame + (3 * (
crop.c.left)) + (
crop.c.top *
fmt.fmt.pix.bytesperline);
391 for (
unsigned int i = 0; i <
bufheight; i++)
394 src +=
fmt.fmt.pix.bytesperline;
401 case V4L2_PIX_FMT_RGB555:
407 src = frame + (2 * (
crop.c.left)) + (
crop.c.top *
fmt.fmt.pix.bytesperline);
413 for (
unsigned int i = 0; i <
bufheight; i++)
415 unsigned char *s = src;
416 for (
unsigned int j = 0; j <
bufwidth; j++)
418 *(dest++) =
lut5[((*(s + 1) & 0x7C) >> 2)];
419 *(dest++) =
lut5[(((*(s + 1) & 0x03) << 3) | ((*(s) & 0xE0) >> 5))];
420 *(dest++) =
lut5[((*s) & 0x1F)];
423 src +=
fmt.fmt.pix.bytesperline;
428 case V4L2_PIX_FMT_RGB565:
434 src = frame + (2 * (
crop.c.left)) + (
crop.c.top *
fmt.fmt.pix.bytesperline);
440 for (
unsigned int i = 0; i <
bufheight; i++)
442 unsigned char *s = src;
443 for (
unsigned int j = 0; j <
bufwidth; j++)
445 *(dest++) =
lut5[((*(s + 1) & 0xF8) >> 3)];
446 *(dest++) =
lut6[(((*(s + 1) & 0x07) << 3) | ((*(s) & 0xE0) >> 5))];
447 *(dest++) =
lut5[((*s) & 0x1F)];
450 src +=
fmt.fmt.pix.bytesperline;
455 case V4L2_PIX_FMT_SBGGR8:
459 case V4L2_PIX_FMT_SRGGB8:
462 case V4L2_PIX_FMT_SGRBG8:
465 case V4L2_PIX_FMT_SBGGR16:
470 case V4L2_PIX_FMT_JPEG:
471 case V4L2_PIX_FMT_MJPEG:
473 memcpy(
yuvBuffer, frame, buf->bytesused);
480 unsigned char *src =
YBuf;
484 *(src++) = random() % 255;
493 IDLog(
"Decoder set crop: %dx%d at (%d, %d)\n",
crop.c.width,
crop.c.height,
crop.c.left,
crop.c.top);
509 IDLog(
"Decoder reset crop\n");
516 IDLog(
"Decoder usesoftcrop %s\n", (c ?
"true" :
"false"));
522 (void)use_ext_pix_format;
528 IDLog(
"Decoder set format: %c%c%c%c size %dx%d bpp %d\n", (
fmt.fmt.pix.pixelformat) & 0xFF,
529 (
fmt.fmt.pix.pixelformat >> 8) & 0xFF, (
fmt.fmt.pix.pixelformat >> 16) & 0xFF,
530 (
fmt.fmt.pix.pixelformat >> 24) & 0xFF, f.fmt.pix.width, f.fmt.pix.height,
bpp);
536 IDLog(
"Decoder: Colorspace is %d, using default ycbcr encoding and quantization\n",
fmt.fmt.pix.colorspace);
543 return fmt.fmt.pix.pixelformat;
593 switch (
fmt.fmt.pix.pixelformat)
595 case V4L2_PIX_FMT_GREY:
596 case V4L2_PIX_FMT_JPEG:
597 case V4L2_PIX_FMT_MJPEG:
598 case V4L2_PIX_FMT_YUV420:
599 case V4L2_PIX_FMT_YVU420:
600 case V4L2_PIX_FMT_NV12:
601 case V4L2_PIX_FMT_NV21:
608 case V4L2_PIX_FMT_Y16:
609 case V4L2_PIX_FMT_YUYV:
610 case V4L2_PIX_FMT_UYVY:
611 case V4L2_PIX_FMT_VYUY:
612 case V4L2_PIX_FMT_YVYU:
615 case V4L2_PIX_FMT_RGB24:
616 case V4L2_PIX_FMT_RGB555:
617 case V4L2_PIX_FMT_RGB565:
618 case V4L2_PIX_FMT_SBGGR8:
619 case V4L2_PIX_FMT_SRGGB8:
620 case V4L2_PIX_FMT_SGRBG8:
621 case V4L2_PIX_FMT_SBGGR16:
631 IDLog(
"Decoder allocBuffers cropping %s\n", (
doCrop ?
"true" :
"false"));
636 unsigned char *src =
YBuf;
645 *dest++ = (*src++) / 255.0;
657 switch (
fmt.fmt.pix.pixelformat)
659 case V4L2_PIX_FMT_RGB24:
660 case V4L2_PIX_FMT_RGB555:
661 case V4L2_PIX_FMT_RGB565:
662 case V4L2_PIX_FMT_SBGGR8:
663 case V4L2_PIX_FMT_SRGGB8:
664 case V4L2_PIX_FMT_SGRBG8:
667 case V4L2_PIX_FMT_YUYV:
668 case V4L2_PIX_FMT_UYVY:
669 case V4L2_PIX_FMT_VYUY:
670 case V4L2_PIX_FMT_YVYU:
679 if (
fmt.fmt.pix.pixelformat == V4L2_PIX_FMT_Y16)
688 unsigned short *dest;
695 *dest++ = (
unsigned short)(*src++ * 65535.0);
722 unsigned char * V4L2_Builtin_Decoder::geColorBuffer()
727 switch (
fmt.fmt.pix.pixelformat)
729 case V4L2_PIX_FMT_GREY:
730 case V4L2_PIX_FMT_JPEG:
731 case V4L2_PIX_FMT_MJPEG:
732 case V4L2_PIX_FMT_YUV420:
733 case V4L2_PIX_FMT_YVU420:
734 case V4L2_PIX_FMT_NV12:
735 case V4L2_PIX_FMT_NV21:
739 case V4L2_PIX_FMT_YUYV:
740 case V4L2_PIX_FMT_UYVY:
741 case V4L2_PIX_FMT_VYUY:
742 case V4L2_PIX_FMT_YVYU:
745 case V4L2_PIX_FMT_RGB24:
746 case V4L2_PIX_FMT_RGB555:
747 case V4L2_PIX_FMT_RGB565:
748 case V4L2_PIX_FMT_SBGGR8:
749 case V4L2_PIX_FMT_SRGGB8:
752 case V4L2_PIX_FMT_Y16:
768 *dest++ = *(src + 1);
770 *dest++ = *(src + 1);
772 *dest++ = *(src + 1);
779 case V4L2_PIX_FMT_SBGGR16:
784 unsigned short * dest = (
unsigned short *)
colorBuffer;
787 *dest++ = *(src + 2);
788 *dest++ = *(src + 1);
804 if (
fmt.fmt.pix.pixelformat == V4L2_PIX_FMT_MJPEG)
820 switch (
fmt.fmt.pix.pixelformat)
822 case V4L2_PIX_FMT_GREY:
823 case V4L2_PIX_FMT_JPEG:
824 case V4L2_PIX_FMT_MJPEG:
825 case V4L2_PIX_FMT_YUV420:
826 case V4L2_PIX_FMT_YVU420:
827 case V4L2_PIX_FMT_NV12:
828 case V4L2_PIX_FMT_NV21:
831 case V4L2_PIX_FMT_YUYV:
832 case V4L2_PIX_FMT_UYVY:
833 case V4L2_PIX_FMT_VYUY:
834 case V4L2_PIX_FMT_YVYU:
840 case V4L2_PIX_FMT_RGB24:
841 case V4L2_PIX_FMT_RGB555:
842 case V4L2_PIX_FMT_RGB565:
843 case V4L2_PIX_FMT_SBGGR8:
844 case V4L2_PIX_FMT_SRGGB8:
845 case V4L2_PIX_FMT_SGRBG8:
846 case V4L2_PIX_FMT_SBGGR16:
878 std::make_pair(V4L2_PIX_FMT_RGB555,
new V4L2_Builtin_Decoder::format(V4L2_PIX_FMT_RGB555, 8,
true)));
881 std::make_pair(V4L2_PIX_FMT_RGB565,
new V4L2_Builtin_Decoder::format(V4L2_PIX_FMT_RGB565, 8,
true)));
888 std::make_pair(V4L2_PIX_FMT_RGB24,
new V4L2_Builtin_Decoder::format(V4L2_PIX_FMT_RGB24, 8,
true)));
895 std::make_pair(V4L2_PIX_FMT_GREY,
new V4L2_Builtin_Decoder::format(V4L2_PIX_FMT_GREY, 8,
true)));
902 std::make_pair(V4L2_PIX_FMT_Y16,
new V4L2_Builtin_Decoder::format(V4L2_PIX_FMT_Y16, 16,
true)));
917 std::make_pair(V4L2_PIX_FMT_YVU420,
new V4L2_Builtin_Decoder::format(V4L2_PIX_FMT_YVU420, 8,
true)));
920 std::make_pair(V4L2_PIX_FMT_YUYV,
new V4L2_Builtin_Decoder::format(V4L2_PIX_FMT_YUYV, 8,
true)));
924 std::make_pair(V4L2_PIX_FMT_YVYU,
new V4L2_Builtin_Decoder::format(V4L2_PIX_FMT_YVYU, 8,
true)));
927 std::make_pair(V4L2_PIX_FMT_UYVY,
new V4L2_Builtin_Decoder::format(V4L2_PIX_FMT_UYVY, 8,
true)));
930 std::make_pair(V4L2_PIX_FMT_VYUY,
new V4L2_Builtin_Decoder::format(V4L2_PIX_FMT_VYUY, 8,
true)));
941 std::make_pair(V4L2_PIX_FMT_YUV420,
new V4L2_Builtin_Decoder::format(V4L2_PIX_FMT_YUV420, 8,
true)));
949 std::make_pair(V4L2_PIX_FMT_NV12,
new V4L2_Builtin_Decoder::format(V4L2_PIX_FMT_NV12, 8,
true)));
952 std::make_pair(V4L2_PIX_FMT_NV21,
new V4L2_Builtin_Decoder::format(V4L2_PIX_FMT_NV21, 8,
true)));
973 std::make_pair(V4L2_PIX_FMT_SBGGR8,
new V4L2_Builtin_Decoder::format(V4L2_PIX_FMT_SBGGR8, 8,
false)));
977 std::make_pair(V4L2_PIX_FMT_SGRBG8,
new V4L2_Builtin_Decoder::format(V4L2_PIX_FMT_SGRBG8, 8,
false)));
980 std::make_pair(V4L2_PIX_FMT_SRGGB8,
new V4L2_Builtin_Decoder::format(V4L2_PIX_FMT_SRGGB8, 8,
false)));
1005 std::make_pair(V4L2_PIX_FMT_SBGGR16,
new V4L2_Builtin_Decoder::format(V4L2_PIX_FMT_SBGGR16, 16,
false)));
1010 std::make_pair(V4L2_PIX_FMT_MJPEG,
new V4L2_Builtin_Decoder::format(V4L2_PIX_FMT_MJPEG, 8,
false)));
1013 std::make_pair(V4L2_PIX_FMT_JPEG,
new V4L2_Builtin_Decoder::format(V4L2_PIX_FMT_JPEG, 8,
false)));
1056 for (std::map<unsigned int, struct format *>::iterator it =
supported_formats.begin();
void bayer_grbg_to_rgb24(unsigned char *dst, unsigned char *srcc, long int WIDTH, long int HEIGHT)
void ccvt_420p_rgb24(int width, int height, const void *src, void *dst)
void bayer16_2_rgb24(unsigned short *dst, unsigned short *src, long int WIDTH, long int HEIGHT)
void ccvt_yuyv_bgr32(int width, int height, const void *src, void *dst)
void bayer2rgb24(unsigned char *dst, unsigned char *src, long int WIDTH, long int HEIGHT)
int mjpegtoyuv420p(unsigned char *map, unsigned char *cap_map, int width, int height, unsigned int size)
mjpegtoyuv420p MPEG to YUV 420 P
void bayer_rggb_2rgb24(unsigned char *dst, unsigned char *srcc, long int WIDTH, long int HEIGHT)
void ccvt_yuyv_rgb24(int width, int height, const void *src, void *dst)
void ccvt_420p_bgr32(int width, int height, const void *src, void *dst)
void ccvt_rgb24_bgr32(int width, int height, const void *const src, void *const dst)
void ccvt_yuyv_420p(int width, int height, const void *src, void *dsty, void *dstu, void *dstv)
int RGB2YUV(int x_dim, int y_dim, void *bmp, void *y_out, void *u_out, void *v_out, int flip)
virtual void usesoftcrop(bool c)
virtual void decode(unsigned char *frame, struct v4l2_buffer *buf, bool native)
unsigned char * yuyvBuffer
virtual const std::vector< unsigned int > & getsupportedformats()
virtual float * getLinearY()
virtual void setQuantization(bool)
virtual bool setcrop(struct v4l2_crop c)
virtual unsigned char * getU()
virtual unsigned char * getRGBBuffer()
virtual ~V4L2_Builtin_Decoder()
virtual unsigned char * getY()
virtual unsigned char * getMJPEGBuffer(int &size)
unsigned char * colorBuffer
virtual void setformat(struct v4l2_format f, bool use_ext_pix_format)
void init_supported_formats()
virtual bool issupportedformat(unsigned int format)
virtual void setLinearization(bool)
virtual __u32 getFormat()
unsigned char * yuvBuffer
virtual unsigned char * getV()
std::map< unsigned int, struct format * > supported_formats
std::vector< unsigned int > vsuppformats
unsigned char * rgb24_buffer
void IDLog(const char *fmt,...)
void rangeY8(unsigned char *buf, unsigned int len)
unsigned int getQuantization(struct v4l2_format *fmt)
void linearize(float *buf, unsigned int len, struct v4l2_format *fmt)
#define QUANTIZATION_LIM_RANGE