1 /* 2 # (C) 2008 Hans de Goede <hdegoede@redhat.com> 3 4 # This program is free software; you can redistribute it and/or modify 5 # it under the terms of the GNU Lesser General Public License as published by 6 # the Free Software Foundation; either version 2.1 of the License, or 7 # (at your option) any later version. 8 # 9 # This program is distributed in the hope that it will be useful, 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 # GNU Lesser General Public License for more details. 13 # 14 # You should have received a copy of the GNU Lesser General Public License 15 # along with this program; if not, write to the Free Software 16 # Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA 17 */ 18 19 #ifndef __LIBV4LCONVERT_PRIV_H 20 #define __LIBV4LCONVERT_PRIV_H 21 22 #include <stdio.h> 23 #include <stdint.h> 24 #include <sys/types.h> 25 #ifdef HAVE_JPEG 26 #include <jpeglib.h> 27 #endif 28 #include <setjmp.h> 29 #include "libv4l-plugin.h" 30 #include "libv4lconvert.h" 31 #include "control/libv4lcontrol.h" 32 #include "processing/libv4lprocessing.h" 33 #include "tinyjpeg.h" 34 35 #define ARRAY_SIZE(x) ((int)sizeof(x)/(int)sizeof((x)[0])) 36 #define BITS_PER_LONG (8 * sizeof(long)) 37 38 #define V4LCONVERT_ERROR_MSG_SIZE 256 39 #define V4LCONVERT_MAX_FRAMESIZES 256 40 41 #define V4LCONVERT_ERR(...) \ 42 snprintf(data->error_msg, V4LCONVERT_ERROR_MSG_SIZE, \ 43 "v4l-convert: error " __VA_ARGS__) 44 45 /* Card flags */ 46 #define V4LCONVERT_IS_UVC 0x01 47 #define V4LCONVERT_USE_TINYJPEG 0x02 48 49 struct v4lconvert_data { 50 int fd; 51 int flags; /* bitfield */ 52 int control_flags; /* bitfield */ 53 unsigned int no_formats; 54 unsigned long supported_src_formats[128 / BITS_PER_LONG]; 55 char error_msg[V4LCONVERT_ERROR_MSG_SIZE]; 56 struct jdec_private *tinyjpeg; 57 #ifdef HAVE_JPEG 58 struct jpeg_error_mgr jerr; 59 int jerr_errno; 60 jmp_buf jerr_jmp_state; 61 struct jpeg_decompress_struct cinfo; 62 int cinfo_initialized; 63 #endif // HAVE_JPEG 64 struct v4l2_frmsizeenum framesizes[V4LCONVERT_MAX_FRAMESIZES]; 65 /* Bitmask of all supported src_formats which can do for a size */ 66 int64_t framesize_supported_src_formats[V4LCONVERT_MAX_FRAMESIZES]; 67 unsigned int no_framesizes; 68 int bandwidth; 69 int fps; 70 int convert1_buf_size; 71 int convert2_buf_size; 72 int rotate90_buf_size; 73 int flip_buf_size; 74 int convert_pixfmt_buf_size; 75 unsigned char *convert1_buf; 76 unsigned char *convert2_buf; 77 unsigned char *rotate90_buf; 78 unsigned char *flip_buf; 79 unsigned char *convert_pixfmt_buf; 80 struct v4lcontrol_data *control; 81 struct v4lprocessing_data *processing; 82 void *dev_ops_priv; 83 const struct libv4l_dev_ops *dev_ops; 84 85 /* Data for external decompression helpers code */ 86 pid_t decompress_pid; 87 int decompress_in_pipe[2]; /* Data from helper to us */ 88 int decompress_out_pipe[2]; /* Data from us to helper */ 89 90 /* For mr97310a decoder */ 91 int frames_dropped; 92 93 /* For cpia1 decoder */ 94 unsigned char *previous_frame; 95 }; 96 97 struct v4lconvert_pixfmt { 98 unsigned int fmt; /* v4l2 fourcc */ 99 int bpp; /* bits per pixel, 0 for compressed formats */ 100 int rgb_rank; /* rank for converting to rgb32 / bgr32 */ 101 int yuv_rank; /* rank for converting to yuv420 / yvu420 */ 102 int needs_conversion; 103 }; 104 105 void v4lconvert_fixup_fmt(struct v4l2_format *fmt); 106 107 unsigned char *v4lconvert_alloc_buffer(int needed, 108 unsigned char **buf, int *buf_size); 109 110 int v4lconvert_oom_error(struct v4lconvert_data *data); 111 112 void v4lconvert_rgb24_to_yuv420(const unsigned char *src, unsigned char *dest, 113 const struct v4l2_format *src_fmt, int bgr, int yvu, int bpp); 114 115 void v4lconvert_yuv420_to_rgb24(const unsigned char *src, unsigned char *dst, 116 int width, int height, int stride, int yvu); 117 118 void v4lconvert_yuv420_to_bgr24(const unsigned char *src, unsigned char *dst, 119 int width, int height, int stride, int yvu); 120 121 void v4lconvert_yuyv_to_rgb24(const unsigned char *src, unsigned char *dst, 122 int width, int height, int stride); 123 124 void v4lconvert_yuyv_to_bgr24(const unsigned char *src, unsigned char *dst, 125 int width, int height, int stride); 126 127 void v4lconvert_yuyv_to_yuv420(const unsigned char *src, unsigned char *dst, 128 int width, int height, int stride, int yvu); 129 130 void v4lconvert_nv16_to_yuyv(const unsigned char *src, unsigned char *dest, 131 int width, int height, int stride); 132 133 void v4lconvert_yvyu_to_rgb24(const unsigned char *src, unsigned char *dst, 134 int width, int height, int stride); 135 136 void v4lconvert_yvyu_to_bgr24(const unsigned char *src, unsigned char *dst, 137 int width, int height, int stride); 138 139 void v4lconvert_uyvy_to_rgb24(const unsigned char *src, unsigned char *dst, 140 int width, int height, int stride); 141 142 void v4lconvert_uyvy_to_bgr24(const unsigned char *src, unsigned char *dst, 143 int width, int height, int stride); 144 145 void v4lconvert_uyvy_to_yuv420(const unsigned char *src, unsigned char *dst, 146 int width, int height, int stride, int yvu); 147 148 void v4lconvert_swap_rgb(const unsigned char *src, unsigned char *dst, 149 int width, int height); 150 151 void v4lconvert_swap_uv(const unsigned char *src, unsigned char *dst, 152 const struct v4l2_format *src_fmt); 153 154 void v4lconvert_grey_to_rgb24(const unsigned char *src, unsigned char *dest, 155 int width, int height, int stride); 156 157 void v4lconvert_grey_to_yuv420(const unsigned char *src, unsigned char *dest, 158 const struct v4l2_format *src_fmt); 159 160 void v4lconvert_y16_to_rgb24(const unsigned char *src, unsigned char *dest, 161 int width, int height, int little_endian); 162 163 void v4lconvert_y16_to_yuv420(const unsigned char *src, unsigned char *dest, 164 const struct v4l2_format *src_fmt, int little_endian); 165 166 void v4lconvert_rgb32_to_rgb24(const unsigned char *src, unsigned char *dest, 167 int width, int height, int bgr); 168 169 int v4lconvert_y10b_to_rgb24(struct v4lconvert_data *data, 170 const unsigned char *src, unsigned char *dest, int width, int height); 171 172 int v4lconvert_y10b_to_yuv420(struct v4lconvert_data *data, 173 const unsigned char *src, unsigned char *dest, int width, int height); 174 175 void v4lconvert_rgb565_to_rgb24(const unsigned char *src, unsigned char *dest, 176 int width, int height, int stride); 177 178 void v4lconvert_rgb565_to_bgr24(const unsigned char *src, unsigned char *dest, 179 int width, int height, int stride); 180 181 void v4lconvert_rgb565_to_yuv420(const unsigned char *src, unsigned char *dest, 182 const struct v4l2_format *src_fmt, int yvu); 183 184 void v4lconvert_spca501_to_yuv420(const unsigned char *src, unsigned char *dst, 185 int width, int height, int yvu); 186 187 void v4lconvert_spca505_to_yuv420(const unsigned char *src, unsigned char *dst, 188 int width, int height, int yvu); 189 190 void v4lconvert_spca508_to_yuv420(const unsigned char *src, unsigned char *dst, 191 int width, int height, int yvu); 192 193 void v4lconvert_cit_yyvyuy_to_yuv420(const unsigned char *src, 194 unsigned char *ydest, 195 int width, int height, int yvu); 196 197 void v4lconvert_konica_yuv420_to_yuv420(const unsigned char *src, 198 unsigned char *ydest, 199 int width, int height, int yvu); 200 201 void v4lconvert_m420_to_yuv420(const unsigned char *src, 202 unsigned char *ydest, 203 int width, int height, int yvu); 204 205 int v4lconvert_cpia1_to_yuv420(struct v4lconvert_data *data, 206 const unsigned char *src, int src_size, 207 unsigned char *dst, int width, int height, int yvu); 208 209 void v4lconvert_sn9c20x_to_yuv420(const unsigned char *src, unsigned char *dst, 210 int width, int height, int yvu); 211 212 int v4lconvert_se401_to_rgb24(struct v4lconvert_data *data, 213 const unsigned char *src, int src_size, 214 unsigned char *dest, int width, int height); 215 216 int v4lconvert_decode_jpeg_tinyjpeg(struct v4lconvert_data *data, 217 unsigned char *src, int src_size, unsigned char *dest, 218 struct v4l2_format *fmt, unsigned int dest_pix_fmt, int flags); 219 220 int v4lconvert_decode_jpeg_libjpeg(struct v4lconvert_data *data, 221 unsigned char *src, int src_size, unsigned char *dest, 222 struct v4l2_format *fmt, unsigned int dest_pix_fmt); 223 224 int v4lconvert_decode_jpgl(const unsigned char *src, int src_size, 225 unsigned int dest_pix_fmt, unsigned char *dest, int width, int height); 226 227 void v4lconvert_decode_spca561(const unsigned char *src, unsigned char *dst, 228 int width, int height); 229 230 void v4lconvert_decode_sn9c10x(const unsigned char *src, unsigned char *dst, 231 int width, int height); 232 233 int v4lconvert_decode_pac207(struct v4lconvert_data *data, 234 const unsigned char *inp, int src_size, unsigned char *outp, 235 int width, int height); 236 237 int v4lconvert_decode_mr97310a(struct v4lconvert_data *data, 238 const unsigned char *src, int src_size, unsigned char *dst, 239 int width, int height); 240 241 int v4lconvert_decode_jl2005bcd(struct v4lconvert_data *data, 242 const unsigned char *src, int src_size, 243 unsigned char *dest, int width, int height); 244 245 void v4lconvert_decode_sn9c2028(const unsigned char *src, unsigned char *dst, 246 int width, int height); 247 248 void v4lconvert_decode_sq905c(const unsigned char *src, unsigned char *dst, 249 int width, int height); 250 251 void v4lconvert_decode_stv0680(const unsigned char *src, unsigned char *dst, 252 int width, int height); 253 254 void v4lconvert_bayer_to_rgb24(const unsigned char *bayer, 255 unsigned char *rgb, int width, int height, const unsigned int stride, unsigned int pixfmt); 256 257 void v4lconvert_bayer_to_bgr24(const unsigned char *bayer, 258 unsigned char *rgb, int width, int height, const unsigned int stride, unsigned int pixfmt); 259 260 void v4lconvert_bayer_to_yuv420(const unsigned char *bayer, unsigned char *yuv, 261 int width, int height, const unsigned int stride, unsigned int src_pixfmt, int yvu); 262 263 void v4lconvert_bayer10_to_bayer8(void *bayer10, 264 unsigned char *bayer8, int width, int height); 265 266 void v4lconvert_bayer10p_to_bayer8(unsigned char *bayer10p, 267 unsigned char *bayer8, int width, int height); 268 269 void v4lconvert_bayer16_to_bayer8(unsigned char *bayer16, 270 unsigned char *bayer8, int width, int height); 271 272 void v4lconvert_nv12_16l16_to_rgb24(const unsigned char *src, 273 unsigned char *dst, int width, int height); 274 275 void v4lconvert_nv12_16l16_to_bgr24(const unsigned char *src, 276 unsigned char *dst, int width, int height); 277 278 void v4lconvert_nv12_16l16_to_yuv420(const unsigned char *src, 279 unsigned char *dst, int width, int height, int yvu); 280 281 void v4lconvert_hsv_to_rgb24(const unsigned char *src, unsigned char *dest, 282 int width, int height, int bgr, int Xin, unsigned char hsv_enc); 283 284 void v4lconvert_nv12_to_rgb24(const unsigned char *src, unsigned char *dest, 285 int width, int height, int stride, int bgr); 286 287 void v4lconvert_nv12_to_yuv420(const unsigned char *src, unsigned char *dest, 288 int width, int height, int stride, int yvu); 289 290 void v4lconvert_rotate90(unsigned char *src, unsigned char *dest, 291 struct v4l2_format *fmt); 292 293 void v4lconvert_flip(unsigned char *src, unsigned char *dest, 294 struct v4l2_format *fmt, int hflip, int vflip); 295 296 void v4lconvert_crop(unsigned char *src, unsigned char *dest, 297 const struct v4l2_format *src_fmt, const struct v4l2_format *dest_fmt); 298 299 int v4lconvert_helper_decompress(struct v4lconvert_data *data, 300 const char *helper, const unsigned char *src, int src_size, 301 unsigned char *dest, int dest_size, int width, int height, int command); 302 303 void v4lconvert_helper_cleanup(struct v4lconvert_data *data); 304 305 #endif 306