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