1 /*******************************************************************************
2 cmodel_yuv420p.c
3
4 libquicktime - A library for reading and writing quicktime/avi/mp4 files.
5 http://libquicktime.sourceforge.net
6
7 Copyright (C) 2002 Heroine Virtual Ltd.
8 Copyright (C) 2002-2011 Members of the libquicktime project.
9
10 This library is free software; you can redistribute it and/or modify it under
11 the terms of the GNU Lesser General Public License as published by the Free
12 Software Foundation; either version 2.1 of the License, or (at your option)
13 any later version.
14
15 This library is distributed in the hope that it will be useful, but WITHOUT
16 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
18 details.
19
20 You should have received a copy of the GNU Lesser General Public License along
21 with this library; if not, write to the Free Software Foundation, Inc., 51
22 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 *******************************************************************************/
24
25 #define HAVE_RGB_16_TO_RGB_24
26 #define HAVE_RGB_TO_YUV
27 #define HAVE_RGB_TO_YUVJ
28 #define HAVE_YUV_TO_RGB
29 #define HAVE_YUVJ_TO_RGB
30 #define HAVE_YUV_8_TO_YUVJ
31 #define HAVE_YUVJ_TO_YUV_8
32
33 #include "lqt_private.h"
34 #include "cmodel_permutation.h"
35
36 #define TRANSFER_FRAME_DEFAULT(output, \
37 y_in_offset, \
38 u_in_offset, \
39 v_in_offset, \
40 input_column) \
41 { \
42 register int i, j; \
43 \
44 switch(in_colormodel) \
45 { \
46 case BC_YUV420P: \
47 switch(out_colormodel) \
48 { \
49 case BC_BGR565: \
50 TRANSFER_YUV420P_IN_HEAD_16 \
51 transfer_YUV422P_to_BGR565((output), \
52 input_y + (y_in_offset), \
53 input_u + (u_in_offset), \
54 input_v + (v_in_offset)); \
55 TRANSFER_FRAME_TAIL \
56 break; \
57 case BC_RGB565: \
58 TRANSFER_YUV420P_IN_HEAD_16 \
59 transfer_YUV422P_to_RGB565((output), \
60 input_y + (y_in_offset), \
61 input_u + (u_in_offset), \
62 input_v + (v_in_offset)); \
63 TRANSFER_FRAME_TAIL \
64 break; \
65 case BC_BGR888: \
66 TRANSFER_YUV420P_IN_HEAD \
67 transfer_YUV422P_to_BGR888((output), \
68 input_y + (y_in_offset), \
69 input_u + (u_in_offset), \
70 input_v + (v_in_offset)); \
71 TRANSFER_FRAME_TAIL \
72 break; \
73 case BC_BGR8888: \
74 TRANSFER_YUV420P_IN_HEAD \
75 transfer_YUV422P_to_BGR8888((output), \
76 input_y + (y_in_offset), \
77 input_u + (u_in_offset), \
78 input_v + (v_in_offset)); \
79 TRANSFER_FRAME_TAIL \
80 break; \
81 case BC_YUV420P: \
82 for(i = 0; i < out_h; i++) \
83 { \
84 unsigned char *output_y = output_rows[0] + i * out_rowspan; \
85 unsigned char *output_u = output_rows[1] + i / 2 * out_rowspan_uv; \
86 unsigned char *output_v = output_rows[2] + i / 2 * out_rowspan_uv; \
87 unsigned char *input_y = input_rows[0] + row_table[i] * in_rowspan; \
88 unsigned char *input_u = input_rows[1] + row_table[i] / 2 * in_rowspan_uv; \
89 unsigned char *input_v = input_rows[2] + row_table[i] / 2 * in_rowspan_uv; \
90 for(j = 0; j < out_w; j++) \
91 { \
92 transfer_YUV422P_to_YUV420P(input_y + (y_in_offset), \
93 input_u + (u_in_offset), \
94 input_v + (v_in_offset), \
95 output_y, \
96 output_u, \
97 output_v, \
98 j); \
99 } \
100 } \
101 break; \
102 case BC_YUV422: \
103 TRANSFER_YUV420P_IN_HEAD \
104 transfer_YUV422P_to_YUV422((output), \
105 input_y + (y_in_offset), \
106 input_u + (u_in_offset), \
107 input_v + (v_in_offset), \
108 j); \
109 TRANSFER_FRAME_TAIL \
110 break; \
111 case BC_YUV422P: \
112 for(i = 0; i < out_h; i++) \
113 { \
114 unsigned char *output_y = output_rows[0] + i * out_rowspan; \
115 unsigned char *output_u = output_rows[1] + i * out_rowspan_uv; \
116 unsigned char *output_v = output_rows[2] + i * out_rowspan_uv; \
117 unsigned char *input_y = input_rows[0] + row_table[i] * in_rowspan; \
118 unsigned char *input_u = input_rows[1] + row_table[i] / 2 * in_rowspan_uv; \
119 unsigned char *input_v = input_rows[2] + row_table[i] / 2 * in_rowspan_uv; \
120 for(j = 0; j < out_w; j++) \
121 { \
122 transfer_YUV422P_to_YUV420P(input_y + (y_in_offset), \
123 input_u + (u_in_offset), \
124 input_v + (v_in_offset), \
125 output_y, \
126 output_u, \
127 output_v, \
128 j); \
129 } \
130 } \
131 break; \
132 case BC_YUV444P: \
133 for(i = 0; i < out_h; i++) \
134 { \
135 unsigned char *output_y = output_rows[0] + i * out_rowspan; \
136 unsigned char *output_u = output_rows[1] + i * out_rowspan_uv; \
137 unsigned char *output_v = output_rows[2] + i * out_rowspan_uv; \
138 unsigned char *input_y = input_rows[0] + row_table[i] * in_rowspan; \
139 unsigned char *input_u = input_rows[1] + row_table[i] / 2 * in_rowspan_uv; \
140 unsigned char *input_v = input_rows[2] + row_table[i] / 2 * in_rowspan_uv; \
141 for(j = 0; j < out_w; j++) \
142 { \
143 transfer_YUV422P_to_YUV444P(input_y + (y_in_offset), \
144 input_u + (u_in_offset), \
145 input_v + (v_in_offset), \
146 output_y, \
147 output_u, \
148 output_v, \
149 j); \
150 } \
151 } \
152 break; \
153 case BC_RGB888: \
154 TRANSFER_YUV420P_IN_HEAD \
155 transfer_YUV422P_to_RGB888((output), \
156 input_y + (y_in_offset), \
157 input_u + (u_in_offset), \
158 input_v + (v_in_offset)); \
159 TRANSFER_FRAME_TAIL \
160 break; \
161 case BC_RGBA8888: \
162 TRANSFER_YUV420P_IN_HEAD \
163 transfer_YUV422P_to_RGBA8888((output), \
164 input_y + (y_in_offset), \
165 input_u + (u_in_offset), \
166 input_v + (v_in_offset)); \
167 TRANSFER_FRAME_TAIL \
168 break; \
169 case BC_RGB161616: \
170 TRANSFER_YUV420P_IN_HEAD_16 \
171 transfer_YUV422P_to_RGB161616((output), \
172 input_y + (y_in_offset), \
173 input_u + (u_in_offset), \
174 input_v + (v_in_offset)); \
175 TRANSFER_FRAME_TAIL \
176 break; \
177 case BC_RGBA16161616: \
178 TRANSFER_YUV420P_IN_HEAD_16 \
179 transfer_YUV422P_to_RGBA16161616((output), \
180 input_y + (y_in_offset), \
181 input_u + (u_in_offset), \
182 input_v + (v_in_offset)); \
183 TRANSFER_FRAME_TAIL \
184 break; \
185 case BC_YUVA8888: \
186 TRANSFER_YUV420P_IN_HEAD \
187 transfer_YUV422P_to_YUVA8888((output), \
188 input_y + (y_in_offset), \
189 input_u + (u_in_offset), \
190 input_v + (v_in_offset)); \
191 TRANSFER_FRAME_TAIL \
192 break; \
193 } \
194 break; \
195 case BC_YUV411P: \
196 switch(out_colormodel) \
197 { \
198 case BC_RGB888: \
199 TRANSFER_YUV411P_IN_HEAD \
200 transfer_YUV411P_to_RGB888((output), \
201 input_y + (y_in_offset), \
202 input_u + (u_in_offset), \
203 input_v + (v_in_offset)); \
204 TRANSFER_FRAME_TAIL \
205 break; \
206 case BC_RGBA8888: \
207 TRANSFER_YUV411P_IN_HEAD \
208 transfer_YUV411P_to_RGBA8888((output), \
209 input_y + (y_in_offset), \
210 input_u + (u_in_offset), \
211 input_v + (v_in_offset)); \
212 TRANSFER_FRAME_TAIL \
213 break; \
214 } \
215 break; \
216 \
217 case BC_YUVJ444P: \
218 switch(out_colormodel) \
219 { \
220 case BC_RGB888: \
221 TRANSFER_YUV444P_IN_HEAD \
222 transfer_YUVJ444P_to_RGB888((output), \
223 input_y + (y_in_offset), \
224 input_u + (u_in_offset), \
225 input_v + (v_in_offset)); \
226 TRANSFER_FRAME_TAIL \
227 break; \
228 case BC_RGBA8888: \
229 TRANSFER_YUV444P_IN_HEAD \
230 transfer_YUVJ444P_to_RGBA8888((output), \
231 input_y + (y_in_offset), \
232 input_u + (u_in_offset), \
233 input_v + (v_in_offset)); \
234 TRANSFER_FRAME_TAIL \
235 break; \
236 case BC_YUVJ444P: \
237 for(i = 0; i < out_h; i++) \
238 { \
239 unsigned char *output_y = output_rows[0] + i * out_rowspan; \
240 unsigned char *output_u = output_rows[1] + i * out_rowspan_uv; \
241 unsigned char *output_v = output_rows[2] + i * out_rowspan_uv; \
242 unsigned char *input_y = input_rows[0] + row_table[i] * in_rowspan; \
243 unsigned char *input_u = input_rows[1] + row_table[i] * in_rowspan_uv; \
244 unsigned char *input_v = input_rows[2] + row_table[i] * in_rowspan_uv; \
245 for(j = 0; j < out_w; j++) \
246 { \
247 transfer_YUV444P_to_YUV444P(input_y + (y_in_offset), \
248 input_u + (u_in_offset), \
249 input_v + (v_in_offset), \
250 output_y, \
251 output_u, \
252 output_v, \
253 j); \
254 } \
255 } \
256 break; \
257 } \
258 break; \
259 \
260 case BC_YUVJ422P: \
261 switch(out_colormodel) \
262 { \
263 case BC_RGB888: \
264 TRANSFER_YUV422P_IN_HEAD \
265 transfer_YUVJ422P_to_RGB888((output), \
266 input_y + (y_in_offset), \
267 input_u + (u_in_offset), \
268 input_v + (v_in_offset)); \
269 TRANSFER_FRAME_TAIL \
270 break; \
271 case BC_RGBA8888: \
272 TRANSFER_YUV422P_IN_HEAD \
273 transfer_YUVJ422P_to_RGBA8888((output), \
274 input_y + (y_in_offset), \
275 input_u + (u_in_offset), \
276 input_v + (v_in_offset)); \
277 TRANSFER_FRAME_TAIL \
278 break; \
279 case BC_YUVJ422P: \
280 for(i = 0; i < out_h; i++) \
281 { \
282 unsigned char *output_y = output_rows[0] + i * out_rowspan; \
283 unsigned char *output_u = output_rows[1] + i * out_rowspan_uv; \
284 unsigned char *output_v = output_rows[2] + i * out_rowspan_uv; \
285 unsigned char *input_y = input_rows[0] + row_table[i] * in_rowspan; \
286 unsigned char *input_u = input_rows[1] + row_table[i] * in_rowspan_uv; \
287 unsigned char *input_v = input_rows[2] + row_table[i] * in_rowspan_uv; \
288 for(j = 0; j < out_w; j++) \
289 { \
290 transfer_YUV422P_to_YUV420P(input_y + (y_in_offset), \
291 input_u + (u_in_offset), \
292 input_v + (v_in_offset), \
293 output_y, \
294 output_u, \
295 output_v, \
296 j); \
297 } \
298 } \
299 break; \
300 case BC_YUV420P: \
301 for(i = 0; i < out_h; i++) \
302 { \
303 unsigned char *output_y = output_rows[0] + i * out_rowspan; \
304 unsigned char *output_u = output_rows[1] + i / 2 * out_rowspan_uv; \
305 unsigned char *output_v = output_rows[2] + i / 2 * out_rowspan_uv; \
306 unsigned char *input_y = input_rows[0] + row_table[i] * in_rowspan; \
307 unsigned char *input_u = input_rows[1] + row_table[i] * in_rowspan_uv; \
308 unsigned char *input_v = input_rows[2] + row_table[i] * in_rowspan_uv; \
309 for(j = 0; j < out_w; j++) \
310 { \
311 transfer_YUVJ422P_to_YUV420P(input_y + (y_in_offset), \
312 input_u + (u_in_offset), \
313 input_v + (v_in_offset), \
314 output_y, \
315 output_u, \
316 output_v, \
317 j); \
318 } \
319 } \
320 break; \
321 case BC_YUV422P: \
322 for(i = 0; i < out_h; i++) \
323 { \
324 unsigned char *output_y = output_rows[0] + i * out_rowspan; \
325 unsigned char *output_u = output_rows[1] + i * out_rowspan_uv; \
326 unsigned char *output_v = output_rows[2] + i * out_rowspan_uv; \
327 unsigned char *input_y = input_rows[0] + row_table[i] * in_rowspan; \
328 unsigned char *input_u = input_rows[1] + row_table[i] * in_rowspan_uv; \
329 unsigned char *input_v = input_rows[2] + row_table[i] * in_rowspan_uv; \
330 for(j = 0; j < out_w; j++) \
331 { \
332 transfer_YUVJ422P_to_YUV420P(input_y + (y_in_offset), \
333 input_u + (u_in_offset), \
334 input_v + (v_in_offset), \
335 output_y, \
336 output_u, \
337 output_v, \
338 j); \
339 } \
340 } \
341 break; \
342 case BC_YUV422: \
343 TRANSFER_YUV422_IN_HEAD \
344 transfer_YUVJ422P_to_YUV422((output), \
345 input_y + (y_in_offset), \
346 input_u + (u_in_offset), \
347 input_v + (v_in_offset), \
348 j); \
349 TRANSFER_FRAME_TAIL \
350 break; \
351 } \
352 break; \
353 \
354 case BC_YUVJ420P: \
355 switch(out_colormodel) \
356 { \
357 case BC_RGB888: \
358 TRANSFER_YUV420P_IN_HEAD \
359 transfer_YUVJ420P_to_RGB888((output), \
360 input_y + (y_in_offset), \
361 input_u + (u_in_offset), \
362 input_v + (v_in_offset)); \
363 TRANSFER_FRAME_TAIL \
364 break; \
365 case BC_RGBA8888: \
366 TRANSFER_YUV420P_IN_HEAD \
367 transfer_YUVJ420P_to_RGBA8888((output), \
368 input_y + (y_in_offset), \
369 input_u + (u_in_offset), \
370 input_v + (v_in_offset)); \
371 TRANSFER_FRAME_TAIL \
372 break; \
373 case BC_YUVJ420P: \
374 for(i = 0; i < out_h; i++) \
375 { \
376 unsigned char *output_y = output_rows[0] + i * out_rowspan; \
377 unsigned char *output_u = output_rows[1] + i / 2 * out_rowspan_uv; \
378 unsigned char *output_v = output_rows[2] + i / 2 * out_rowspan_uv; \
379 unsigned char *input_y = input_rows[0] + row_table[i] * in_rowspan; \
380 unsigned char *input_u = input_rows[1] + row_table[i] / 2 * in_rowspan_uv; \
381 unsigned char *input_v = input_rows[2] + row_table[i] / 2 * in_rowspan_uv; \
382 for(j = 0; j < out_w; j++) \
383 { \
384 transfer_YUV422P_to_YUV420P(input_y + (y_in_offset), \
385 input_u + (u_in_offset), \
386 input_v + (v_in_offset), \
387 output_y, \
388 output_u, \
389 output_v, \
390 j); \
391 } \
392 } \
393 break; \
394 } \
395 break; \
396 \
397 case BC_YUV422P: \
398 switch(out_colormodel) \
399 { \
400 case BC_BGR565: \
401 TRANSFER_YUV422P_IN_HEAD_16 \
402 transfer_YUV422P_to_BGR565((output), \
403 input_y + (y_in_offset), \
404 input_u + (u_in_offset), \
405 input_v + (v_in_offset)); \
406 TRANSFER_FRAME_TAIL \
407 break; \
408 case BC_RGB565: \
409 TRANSFER_YUV422P_IN_HEAD_16 \
410 transfer_YUV422P_to_RGB565((output), \
411 input_y + (y_in_offset), \
412 input_u + (u_in_offset), \
413 input_v + (v_in_offset)); \
414 TRANSFER_FRAME_TAIL \
415 break; \
416 case BC_BGR888: \
417 TRANSFER_YUV422P_IN_HEAD \
418 transfer_YUV422P_to_BGR888((output), \
419 input_y + (y_in_offset), \
420 input_u + (u_in_offset), \
421 input_v + (v_in_offset)); \
422 TRANSFER_FRAME_TAIL \
423 break; \
424 case BC_BGR8888: \
425 TRANSFER_YUV422P_IN_HEAD \
426 transfer_YUV422P_to_BGR8888((output), \
427 input_y + (y_in_offset), \
428 input_u + (u_in_offset), \
429 input_v + (v_in_offset)); \
430 TRANSFER_FRAME_TAIL \
431 break; \
432 case BC_RGB888: \
433 TRANSFER_YUV422P_IN_HEAD \
434 transfer_YUV422P_to_RGB888((output), \
435 input_y + (y_in_offset), \
436 input_u + (u_in_offset), \
437 input_v + (v_in_offset)); \
438 TRANSFER_FRAME_TAIL \
439 break; \
440 case BC_RGBA8888: \
441 TRANSFER_YUV422P_IN_HEAD \
442 transfer_YUV422P_to_RGBA8888((output), \
443 input_y + (y_in_offset), \
444 input_u + (u_in_offset), \
445 input_v + (v_in_offset)); \
446 TRANSFER_FRAME_TAIL \
447 break; \
448 case BC_RGB161616: \
449 TRANSFER_YUV422P_IN_HEAD_16 \
450 transfer_YUV422P_to_RGB161616((output), \
451 input_y + (y_in_offset), \
452 input_u + (u_in_offset), \
453 input_v + (v_in_offset)); \
454 TRANSFER_FRAME_TAIL \
455 break; \
456 case BC_RGBA16161616: \
457 TRANSFER_YUV422P_IN_HEAD_16 \
458 transfer_YUV422P_to_RGBA16161616((output), \
459 input_y + (y_in_offset), \
460 input_u + (u_in_offset), \
461 input_v + (v_in_offset)); \
462 TRANSFER_FRAME_TAIL \
463 break; \
464 case BC_YUVA8888: \
465 TRANSFER_YUV422P_IN_HEAD \
466 transfer_YUV422P_to_YUVA8888((output), \
467 input_y + (y_in_offset), \
468 input_u + (u_in_offset), \
469 input_v + (v_in_offset)); \
470 TRANSFER_FRAME_TAIL \
471 break; \
472 case BC_YUV420P: \
473 for(i = 0; i < out_h; i++) \
474 { \
475 unsigned char *output_y = output_rows[0] + i * out_rowspan; \
476 unsigned char *output_u = output_rows[1] + i / 2 * out_rowspan_uv; \
477 unsigned char *output_v = output_rows[2] + i / 2 * out_rowspan_uv; \
478 unsigned char *input_y = input_rows[0] + row_table[i] * in_rowspan; \
479 unsigned char *input_u = input_rows[1] + row_table[i] * in_rowspan_uv; \
480 unsigned char *input_v = input_rows[2] + row_table[i] * in_rowspan_uv; \
481 for(j = 0; j < out_w; j++) \
482 { \
483 transfer_YUV422P_to_YUV420P(input_y + (y_in_offset), \
484 input_u + (u_in_offset), \
485 input_v + (v_in_offset), \
486 output_y, \
487 output_u, \
488 output_v, \
489 j); \
490 } \
491 } \
492 break; \
493 case BC_YUV422: \
494 TRANSFER_YUV422_IN_HEAD \
495 transfer_YUV422P_to_YUV422((output), \
496 input_y + (y_in_offset), \
497 input_u + (u_in_offset), \
498 input_v + (v_in_offset), \
499 j); \
500 TRANSFER_FRAME_TAIL \
501 break; \
502 case BC_YUV422P: \
503 for(i = 0; i < out_h; i++) \
504 { \
505 unsigned char *output_y = output_rows[0] + i * out_rowspan; \
506 unsigned char *output_u = output_rows[1] + i * out_rowspan_uv; \
507 unsigned char *output_v = output_rows[2] + i * out_rowspan_uv; \
508 unsigned char *input_y = input_rows[0] + row_table[i] * in_rowspan; \
509 unsigned char *input_u = input_rows[1] + row_table[i] * in_rowspan_uv; \
510 unsigned char *input_v = input_rows[2] + row_table[i] * in_rowspan_uv; \
511 for(j = 0; j < out_w; j++) \
512 { \
513 transfer_YUV422P_to_YUV420P(input_y + (y_in_offset), \
514 input_u + (u_in_offset), \
515 input_v + (v_in_offset), \
516 output_y, \
517 output_u, \
518 output_v, \
519 j); \
520 } \
521 } \
522 break; \
523 case BC_YUV444P: \
524 for(i = 0; i < out_h; i++) \
525 { \
526 unsigned char *output_y = output_rows[0] + i * out_rowspan; \
527 unsigned char *output_u = output_rows[1] + i * out_rowspan_uv; \
528 unsigned char *output_v = output_rows[2] + i * out_rowspan_uv; \
529 unsigned char *input_y = input_rows[0] + row_table[i] * in_rowspan; \
530 unsigned char *input_u = input_rows[1] + row_table[i] * in_rowspan_uv; \
531 unsigned char *input_v = input_rows[2] + row_table[i] * in_rowspan_uv; \
532 for(j = 0; j < out_w; j++) \
533 { \
534 transfer_YUV422P_to_YUV444P(input_y + (y_in_offset), \
535 input_u + (u_in_offset), \
536 input_v + (v_in_offset), \
537 output_y, \
538 output_u, \
539 output_v, \
540 j); \
541 } \
542 } \
543 break; \
544 case BC_YUVJ422P: \
545 for(i = 0; i < out_h; i++) \
546 { \
547 unsigned char *output_y = output_rows[0] + i * out_rowspan; \
548 unsigned char *output_u = output_rows[1] + i * out_rowspan_uv; \
549 unsigned char *output_v = output_rows[2] + i * out_rowspan_uv; \
550 unsigned char *input_y = input_rows[0] + row_table[i] * in_rowspan; \
551 unsigned char *input_u = input_rows[1] + row_table[i] * in_rowspan_uv; \
552 unsigned char *input_v = input_rows[2] + row_table[i] * in_rowspan_uv; \
553 for(j = 0; j < out_w; j++) \
554 { \
555 transfer_YUV422P_to_YUVJ420P(input_y + (y_in_offset), \
556 input_u + (u_in_offset), \
557 input_v + (v_in_offset), \
558 output_y, \
559 output_u, \
560 output_v, \
561 j); \
562 } \
563 } \
564 break; \
565 } \
566 break; \
567 \
568 case BC_YUV422P16: \
569 switch(out_colormodel) \
570 { \
571 case BC_RGB888: \
572 TRANSFER_YUV422P16_IN_HEAD \
573 transfer_YUV422P16_to_RGB888((output), \
574 input_y + (y_in_offset), \
575 input_u + (u_in_offset), \
576 input_v + (v_in_offset)); \
577 TRANSFER_FRAME_TAIL \
578 break; \
579 case BC_RGBA8888: \
580 TRANSFER_YUV422P16_IN_HEAD \
581 transfer_YUV422P16_to_RGBA8888((output), \
582 input_y + (y_in_offset), \
583 input_u + (u_in_offset), \
584 input_v + (v_in_offset)); \
585 TRANSFER_FRAME_TAIL \
586 break; \
587 case BC_RGB161616: \
588 TRANSFER_YUV422P16_IN_HEAD_16 \
589 transfer_YUV422P16_to_RGB161616((output), \
590 input_y + (y_in_offset), \
591 input_u + (u_in_offset), \
592 input_v + (v_in_offset)); \
593 TRANSFER_FRAME_TAIL \
594 break; \
595 case BC_YUV422P16: \
596 for(i = 0; i < out_h; i++) \
597 { \
598 uint16_t *output_y = (uint16_t *)(output_rows[0] + i * out_rowspan); \
599 uint16_t *output_u = (uint16_t *)(output_rows[1] + i * out_rowspan_uv); \
600 uint16_t *output_v = (uint16_t *)(output_rows[2] + i * out_rowspan_uv); \
601 uint16_t *input_y = (uint16_t *)(input_rows[0] + row_table[i] * in_rowspan); \
602 uint16_t *input_u = (uint16_t *)(input_rows[1] + row_table[i] * in_rowspan_uv); \
603 uint16_t *input_v = (uint16_t *)(input_rows[2] + row_table[i] * in_rowspan_uv); \
604 for(j = 0; j < out_w; j++) \
605 { \
606 transfer_YUV422P16_to_YUV420P16(input_y + (y_in_offset), \
607 input_u + (u_in_offset), \
608 input_v + (v_in_offset), \
609 output_y, \
610 output_u, \
611 output_v, \
612 j); \
613 } \
614 } \
615 break; \
616 case BC_YUV422P: \
617 for(i = 0; i < out_h; i++) \
618 { \
619 uint8_t *output_y = (uint8_t *)(output_rows[0] + i * out_rowspan); \
620 uint8_t *output_u = (uint8_t *)(output_rows[1] + i * out_rowspan_uv); \
621 uint8_t *output_v = (uint8_t *)(output_rows[2] + i * out_rowspan_uv); \
622 uint16_t *input_y = (uint16_t *)(input_rows[0] + row_table[i] * in_rowspan); \
623 uint16_t *input_u = (uint16_t *)(input_rows[1] + row_table[i] * in_rowspan_uv); \
624 uint16_t *input_v = (uint16_t *)(input_rows[2] + row_table[i] * in_rowspan_uv); \
625 for(j = 0; j < out_w; j++) \
626 { \
627 transfer_YUV422P16_to_YUV420P(input_y + (y_in_offset), \
628 input_u + (u_in_offset), \
629 input_v + (v_in_offset), \
630 output_y, \
631 output_u, \
632 output_v, \
633 j); \
634 } \
635 } \
636 break; \
637 } \
638 break; \
639 case BC_YUV422P10: \
640 switch(out_colormodel) \
641 { \
642 case BC_RGB888: \
643 TRANSFER_YUV422P16_IN_HEAD \
644 transfer_YUV422P10_to_RGB888((output), \
645 input_y + (y_in_offset), \
646 input_u + (u_in_offset), \
647 input_v + (v_in_offset)); \
648 TRANSFER_FRAME_TAIL \
649 break; \
650 case BC_RGB161616: \
651 TRANSFER_YUV422P16_IN_HEAD_16 \
652 transfer_YUV422P10_to_RGB161616((output), \
653 input_y + (y_in_offset), \
654 input_u + (u_in_offset), \
655 input_v + (v_in_offset)); \
656 TRANSFER_FRAME_TAIL \
657 break; \
658 case BC_YUV422P10: \
659 for(i = 0; i < out_h; i++) \
660 { \
661 uint16_t *output_y = (uint16_t *)(output_rows[0] + i * out_rowspan); \
662 uint16_t *output_u = (uint16_t *)(output_rows[1] + i * out_rowspan_uv); \
663 uint16_t *output_v = (uint16_t *)(output_rows[2] + i * out_rowspan_uv); \
664 uint16_t *input_y = (uint16_t *)(input_rows[0] + row_table[i] * in_rowspan); \
665 uint16_t *input_u = (uint16_t *)(input_rows[1] + row_table[i] * in_rowspan_uv); \
666 uint16_t *input_v = (uint16_t *)(input_rows[2] + row_table[i] * in_rowspan_uv); \
667 for(j = 0; j < out_w; j++) \
668 { \
669 transfer_YUV422P16_to_YUV420P16(input_y + (y_in_offset), \
670 input_u + (u_in_offset), \
671 input_v + (v_in_offset), \
672 output_y, \
673 output_u, \
674 output_v, \
675 j); \
676 } \
677 } \
678 break; \
679 } \
680 break; \
681 case BC_YUVJ422P10: \
682 switch(out_colormodel) \
683 { \
684 case BC_RGB888: \
685 TRANSFER_YUV422P16_IN_HEAD \
686 transfer_YUVJ422P10_to_RGB888((output), \
687 input_y + (y_in_offset), \
688 input_u + (u_in_offset), \
689 input_v + (v_in_offset)); \
690 TRANSFER_FRAME_TAIL \
691 break; \
692 case BC_RGB161616: \
693 TRANSFER_YUV422P16_IN_HEAD_16 \
694 transfer_YUVJ422P10_to_RGB161616((output), \
695 input_y + (y_in_offset), \
696 input_u + (u_in_offset), \
697 input_v + (v_in_offset)); \
698 TRANSFER_FRAME_TAIL \
699 break; \
700 case BC_YUVJ422P10: \
701 for(i = 0; i < out_h; i++) \
702 { \
703 uint16_t *output_y = (uint16_t *)(output_rows[0] + i * out_rowspan); \
704 uint16_t *output_u = (uint16_t *)(output_rows[1] + i * out_rowspan_uv); \
705 uint16_t *output_v = (uint16_t *)(output_rows[2] + i * out_rowspan_uv); \
706 uint16_t *input_y = (uint16_t *)(input_rows[0] + row_table[i] * in_rowspan); \
707 uint16_t *input_u = (uint16_t *)(input_rows[1] + row_table[i] * in_rowspan_uv); \
708 uint16_t *input_v = (uint16_t *)(input_rows[2] + row_table[i] * in_rowspan_uv); \
709 for(j = 0; j < out_w; j++) \
710 { \
711 transfer_YUV422P16_to_YUV420P16(input_y + (y_in_offset), \
712 input_u + (u_in_offset), \
713 input_v + (v_in_offset), \
714 output_y, \
715 output_u, \
716 output_v, \
717 j); \
718 } \
719 } \
720 break; \
721 } \
722 break; \
723 case BC_YUV444P16: \
724 switch(out_colormodel) \
725 { \
726 case BC_RGB888: \
727 TRANSFER_YUV444P16_IN_HEAD \
728 transfer_YUV444P16_to_RGB888((output), \
729 input_y + (y_in_offset), \
730 input_u + (u_in_offset), \
731 input_v + (v_in_offset)); \
732 TRANSFER_FRAME_TAIL \
733 break; \
734 case BC_RGBA8888: \
735 TRANSFER_YUV444P16_IN_HEAD \
736 transfer_YUV444P16_to_RGBA8888((output), \
737 input_y + (y_in_offset), \
738 input_u + (u_in_offset), \
739 input_v + (v_in_offset)); \
740 TRANSFER_FRAME_TAIL \
741 break; \
742 case BC_RGB161616: \
743 TRANSFER_YUV444P16_IN_HEAD_16 \
744 transfer_YUV444P16_to_RGB161616((output), \
745 input_y + (y_in_offset), \
746 input_u + (u_in_offset), \
747 input_v + (v_in_offset)); \
748 TRANSFER_FRAME_TAIL \
749 break; \
750 case BC_YUV444P16: \
751 for(i = 0; i < out_h; i++) \
752 { \
753 uint16_t *output_y = (uint16_t *)(output_rows[0] + i * out_rowspan); \
754 uint16_t *output_u = (uint16_t *)(output_rows[1] + i * out_rowspan_uv); \
755 uint16_t *output_v = (uint16_t *)(output_rows[2] + i * out_rowspan_uv); \
756 uint16_t *input_y = (uint16_t *)(input_rows[0] + row_table[i] * in_rowspan); \
757 uint16_t *input_u = (uint16_t *)(input_rows[1] + row_table[i] * in_rowspan_uv); \
758 uint16_t *input_v = (uint16_t *)(input_rows[2] + row_table[i] * in_rowspan_uv); \
759 for(j = 0; j < out_w; j++) \
760 { \
761 transfer_YUV444P16_to_YUV444P16(input_y + (y_in_offset), \
762 input_u + (u_in_offset), \
763 input_v + (v_in_offset), \
764 output_y, \
765 output_u, \
766 output_v, \
767 j); \
768 } \
769 } \
770 break; \
771 case BC_YUV444P: \
772 for(i = 0; i < out_h; i++) \
773 { \
774 uint8_t *output_y = (uint8_t *)(output_rows[0] + i * out_rowspan); \
775 uint8_t *output_u = (uint8_t *)(output_rows[1] + i * out_rowspan_uv); \
776 uint8_t *output_v = (uint8_t *)(output_rows[2] + i * out_rowspan_uv); \
777 uint16_t *input_y = (uint16_t *)(input_rows[0] + row_table[i] * in_rowspan); \
778 uint16_t *input_u = (uint16_t *)(input_rows[1] + row_table[i] * in_rowspan_uv); \
779 uint16_t *input_v = (uint16_t *)(input_rows[2] + row_table[i] * in_rowspan_uv); \
780 for(j = 0; j < out_w; j++) \
781 { \
782 transfer_YUV444P16_to_YUV444P(input_y + (y_in_offset), \
783 input_u + (u_in_offset), \
784 input_v + (v_in_offset), \
785 output_y, \
786 output_u, \
787 output_v, \
788 j); \
789 } \
790 } \
791 break; \
792 } \
793 break; \
794 case BC_YUV444P: \
795 switch(out_colormodel) \
796 { \
797 case BC_BGR565: \
798 TRANSFER_YUV444P_IN_HEAD_16 \
799 transfer_YUV422P_to_BGR565((output), \
800 input_y + (y_in_offset), \
801 input_u + (u_in_offset), \
802 input_v + (v_in_offset)); \
803 TRANSFER_FRAME_TAIL \
804 break; \
805 case BC_RGB565: \
806 TRANSFER_YUV444P_IN_HEAD_16 \
807 transfer_YUV422P_to_RGB565((output), \
808 input_y + (y_in_offset), \
809 input_u + (u_in_offset), \
810 input_v + (v_in_offset)); \
811 TRANSFER_FRAME_TAIL \
812 break; \
813 case BC_BGR888: \
814 TRANSFER_YUV444P_IN_HEAD \
815 transfer_YUV422P_to_BGR888((output), \
816 input_y + (y_in_offset), \
817 input_u + (u_in_offset), \
818 input_v + (v_in_offset)); \
819 TRANSFER_FRAME_TAIL \
820 break; \
821 case BC_BGR8888: \
822 TRANSFER_YUV444P_IN_HEAD \
823 transfer_YUV422P_to_BGR8888((output), \
824 input_y + (y_in_offset), \
825 input_u + (u_in_offset), \
826 input_v + (v_in_offset)); \
827 TRANSFER_FRAME_TAIL \
828 break; \
829 case BC_RGB888: \
830 TRANSFER_YUV444P_IN_HEAD \
831 transfer_YUV422P_to_RGB888((output), \
832 input_y + (y_in_offset), \
833 input_u + (u_in_offset), \
834 input_v + (v_in_offset)); \
835 TRANSFER_FRAME_TAIL \
836 break; \
837 case BC_RGBA8888: \
838 TRANSFER_YUV444P_IN_HEAD \
839 transfer_YUV422P_to_RGBA8888((output), \
840 input_y + (y_in_offset), \
841 input_u + (u_in_offset), \
842 input_v + (v_in_offset)); \
843 TRANSFER_FRAME_TAIL \
844 break; \
845 case BC_RGB161616: \
846 TRANSFER_YUV444P_IN_HEAD_16 \
847 transfer_YUV422P_to_RGB161616((output), \
848 input_y + (y_in_offset), \
849 input_u + (u_in_offset), \
850 input_v + (v_in_offset)); \
851 TRANSFER_FRAME_TAIL \
852 break; \
853 case BC_RGBA16161616: \
854 TRANSFER_YUV444P_IN_HEAD_16 \
855 transfer_YUV422P_to_RGBA16161616((output), \
856 input_y + (y_in_offset), \
857 input_u + (u_in_offset), \
858 input_v + (v_in_offset)); \
859 TRANSFER_FRAME_TAIL \
860 break; \
861 case BC_YUVA8888: \
862 TRANSFER_YUV444P_IN_HEAD \
863 transfer_YUV422P_to_YUVA8888((output), \
864 input_y + (y_in_offset), \
865 input_u + (u_in_offset), \
866 input_v + (v_in_offset)); \
867 TRANSFER_FRAME_TAIL \
868 break; \
869 case BC_YUV420P: \
870 for(i = 0; i < out_h; i++) \
871 { \
872 unsigned char *output_y = output_rows[0] + i * out_rowspan; \
873 unsigned char *output_u = output_rows[1] + i / 2 * out_rowspan_uv; \
874 unsigned char *output_v = output_rows[2] + i / 2 * out_rowspan_uv; \
875 unsigned char *input_y = input_rows[0] + row_table[i] * in_rowspan; \
876 unsigned char *input_u = input_rows[1] + row_table[i] * in_rowspan_uv; \
877 unsigned char *input_v = input_rows[2] + row_table[i] * in_rowspan_uv; \
878 for(j = 0; j < out_w; j++) \
879 { \
880 transfer_YUV422P_to_YUV420P(input_y + (y_in_offset), \
881 input_u + (u_in_offset), \
882 input_v + (v_in_offset), \
883 output_y, \
884 output_u, \
885 output_v, \
886 j); \
887 } \
888 } \
889 break; \
890 case BC_YUV422: \
891 TRANSFER_YUV444P_IN_HEAD \
892 transfer_YUV422P_to_YUV422((output), \
893 input_y + (y_in_offset), \
894 input_u + (u_in_offset), \
895 input_v + (v_in_offset), \
896 j); \
897 TRANSFER_FRAME_TAIL \
898 break; \
899 case BC_YUV422P: \
900 for(i = 0; i < out_h; i++) \
901 { \
902 unsigned char *output_y = output_rows[0] + i * out_rowspan; \
903 unsigned char *output_u = output_rows[1] + i * out_rowspan_uv; \
904 unsigned char *output_v = output_rows[2] + i * out_rowspan_uv; \
905 unsigned char *input_y = input_rows[0] + row_table[i] * in_rowspan; \
906 unsigned char *input_u = input_rows[1] + row_table[i] * in_rowspan_uv; \
907 unsigned char *input_v = input_rows[2] + row_table[i] * in_rowspan_uv; \
908 for(j = 0; j < out_w; j++) \
909 { \
910 transfer_YUV422P_to_YUV420P(input_y + (y_in_offset), \
911 input_u + (u_in_offset), \
912 input_v + (v_in_offset), \
913 output_y, \
914 output_u, \
915 output_v, \
916 j); \
917 } \
918 } \
919 break; \
920 case BC_YUV444P: \
921 for(i = 0; i < out_h; i++) \
922 { \
923 unsigned char *output_y = output_rows[0] + i * out_rowspan; \
924 unsigned char *output_u = output_rows[1] + i * out_rowspan_uv; \
925 unsigned char *output_v = output_rows[2] + i * out_rowspan_uv; \
926 unsigned char *input_y = input_rows[0] + row_table[i] * in_rowspan; \
927 unsigned char *input_u = input_rows[1] + row_table[i] * in_rowspan_uv; \
928 unsigned char *input_v = input_rows[2] + row_table[i] * in_rowspan_uv; \
929 for(j = 0; j < out_w; j++) \
930 { \
931 transfer_YUV444P_to_YUV444P(input_y + (y_in_offset), \
932 input_u + (u_in_offset), \
933 input_v + (v_in_offset), \
934 output_y, \
935 output_u, \
936 output_v, \
937 j); \
938 } \
939 } \
940 break; \
941 } \
942 break; \
943 } \
944 }
945
cmodel_yuv420p(PERMUTATION_ARGS)946 void cmodel_yuv420p(PERMUTATION_ARGS)
947 {
948 if(scale)
949 {
950 TRANSFER_FRAME_DEFAULT(&output_row,
951 column_table[j],
952 column_table[j] / 2,
953 column_table[j] / 2,
954 0);
955 }
956 else
957 {
958 TRANSFER_FRAME_DEFAULT(&output_row,
959 j,
960 j / 2,
961 j / 2,
962 0);
963 }
964 }
965
cmodel_yuv411p(PERMUTATION_ARGS)966 void cmodel_yuv411p(PERMUTATION_ARGS)
967 {
968 if(scale)
969 {
970 TRANSFER_FRAME_DEFAULT(&output_row,
971 column_table[j],
972 column_table[j] / 4,
973 column_table[j] / 4,
974 0);
975 }
976 else
977 {
978 TRANSFER_FRAME_DEFAULT(&output_row,
979 j,
980 j / 4,
981 j / 4,
982 0);
983 }
984 }
985
986
cmodel_yuv444p(PERMUTATION_ARGS)987 void cmodel_yuv444p(PERMUTATION_ARGS)
988 {
989 if(scale)
990 {
991 TRANSFER_FRAME_DEFAULT(&output_row,
992 column_table[j],
993 column_table[j],
994 column_table[j],
995 0);
996 }
997 else
998 {
999 TRANSFER_FRAME_DEFAULT(&output_row,
1000 j,
1001 j,
1002 j,
1003 0);
1004 }
1005 }
1006