• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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