1 /*
2 * Copyright (C) 2001-2012 Michael Niedermayer <michaelni@gmx.at>
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 #include <math.h>
22 #include <stdint.h>
23 #include <stdio.h>
24 #include <string.h>
25
26 #include "libavutil/avutil.h"
27 #include "libavutil/bswap.h"
28 #include "libavutil/cpu.h"
29 #include "libavutil/intreadwrite.h"
30 #include "libavutil/mathematics.h"
31 #include "libavutil/pixdesc.h"
32 #include "libavutil/avassert.h"
33 #include "config.h"
34 #include "rgb2rgb.h"
35 #include "swscale.h"
36 #include "swscale_internal.h"
37
38 #define input_pixel(pos) (isBE(origin) ? AV_RB16(pos) : AV_RL16(pos))
39
40 #define r ((origin == AV_PIX_FMT_BGR48BE || origin == AV_PIX_FMT_BGR48LE || origin == AV_PIX_FMT_BGRA64BE || origin == AV_PIX_FMT_BGRA64LE) ? b_r : r_b)
41 #define b ((origin == AV_PIX_FMT_BGR48BE || origin == AV_PIX_FMT_BGR48LE || origin == AV_PIX_FMT_BGRA64BE || origin == AV_PIX_FMT_BGRA64LE) ? r_b : b_r)
42
43 static av_always_inline void
rgb64ToY_c_template(uint16_t * dst,const uint16_t * src,int width,enum AVPixelFormat origin,int32_t * rgb2yuv)44 rgb64ToY_c_template(uint16_t *dst, const uint16_t *src, int width,
45 enum AVPixelFormat origin, int32_t *rgb2yuv)
46 {
47 int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
48 int i;
49 for (i = 0; i < width; i++) {
50 unsigned int r_b = input_pixel(&src[i*4+0]);
51 unsigned int g = input_pixel(&src[i*4+1]);
52 unsigned int b_r = input_pixel(&src[i*4+2]);
53
54 dst[i] = (ry*r + gy*g + by*b + (0x2001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
55 }
56 }
57
58 static av_always_inline void
rgb64ToUV_c_template(uint16_t * dstU,uint16_t * dstV,const uint16_t * src1,const uint16_t * src2,int width,enum AVPixelFormat origin,int32_t * rgb2yuv)59 rgb64ToUV_c_template(uint16_t *dstU, uint16_t *dstV,
60 const uint16_t *src1, const uint16_t *src2,
61 int width, enum AVPixelFormat origin, int32_t *rgb2yuv)
62 {
63 int i;
64 int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
65 int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
66 av_assert1(src1==src2);
67 for (i = 0; i < width; i++) {
68 int r_b = input_pixel(&src1[i*4+0]);
69 int g = input_pixel(&src1[i*4+1]);
70 int b_r = input_pixel(&src1[i*4+2]);
71
72 dstU[i] = (ru*r + gu*g + bu*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
73 dstV[i] = (rv*r + gv*g + bv*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
74 }
75 }
76
77 static av_always_inline void
rgb64ToUV_half_c_template(uint16_t * dstU,uint16_t * dstV,const uint16_t * src1,const uint16_t * src2,int width,enum AVPixelFormat origin,int32_t * rgb2yuv)78 rgb64ToUV_half_c_template(uint16_t *dstU, uint16_t *dstV,
79 const uint16_t *src1, const uint16_t *src2,
80 int width, enum AVPixelFormat origin, int32_t *rgb2yuv)
81 {
82 int i;
83 int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
84 int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
85 av_assert1(src1==src2);
86 for (i = 0; i < width; i++) {
87 int r_b = (input_pixel(&src1[8 * i + 0]) + input_pixel(&src1[8 * i + 4]) + 1) >> 1;
88 int g = (input_pixel(&src1[8 * i + 1]) + input_pixel(&src1[8 * i + 5]) + 1) >> 1;
89 int b_r = (input_pixel(&src1[8 * i + 2]) + input_pixel(&src1[8 * i + 6]) + 1) >> 1;
90
91 dstU[i]= (ru*r + gu*g + bu*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
92 dstV[i]= (rv*r + gv*g + bv*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
93 }
94 }
95
96 #define rgb64funcs(pattern, BE_LE, origin) \
97 static void pattern ## 64 ## BE_LE ## ToY_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused0, const uint8_t *unused1,\
98 int width, uint32_t *rgb2yuv) \
99 { \
100 const uint16_t *src = (const uint16_t *) _src; \
101 uint16_t *dst = (uint16_t *) _dst; \
102 rgb64ToY_c_template(dst, src, width, origin, rgb2yuv); \
103 } \
104 \
105 static void pattern ## 64 ## BE_LE ## ToUV_c(uint8_t *_dstU, uint8_t *_dstV, \
106 const uint8_t *unused0, const uint8_t *_src1, const uint8_t *_src2, \
107 int width, uint32_t *rgb2yuv) \
108 { \
109 const uint16_t *src1 = (const uint16_t *) _src1, \
110 *src2 = (const uint16_t *) _src2; \
111 uint16_t *dstU = (uint16_t *) _dstU, *dstV = (uint16_t *) _dstV; \
112 rgb64ToUV_c_template(dstU, dstV, src1, src2, width, origin, rgb2yuv); \
113 } \
114 \
115 static void pattern ## 64 ## BE_LE ## ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, \
116 const uint8_t *unused0, const uint8_t *_src1, const uint8_t *_src2, \
117 int width, uint32_t *rgb2yuv) \
118 { \
119 const uint16_t *src1 = (const uint16_t *) _src1, \
120 *src2 = (const uint16_t *) _src2; \
121 uint16_t *dstU = (uint16_t *) _dstU, *dstV = (uint16_t *) _dstV; \
122 rgb64ToUV_half_c_template(dstU, dstV, src1, src2, width, origin, rgb2yuv); \
123 }
124
rgb64funcs(rgb,LE,AV_PIX_FMT_RGBA64LE)125 rgb64funcs(rgb, LE, AV_PIX_FMT_RGBA64LE)
126 rgb64funcs(rgb, BE, AV_PIX_FMT_RGBA64BE)
127 rgb64funcs(bgr, LE, AV_PIX_FMT_BGRA64LE)
128 rgb64funcs(bgr, BE, AV_PIX_FMT_BGRA64BE)
129
130 static av_always_inline void rgb48ToY_c_template(uint16_t *dst,
131 const uint16_t *src, int width,
132 enum AVPixelFormat origin,
133 int32_t *rgb2yuv)
134 {
135 int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
136 int i;
137 for (i = 0; i < width; i++) {
138 unsigned int r_b = input_pixel(&src[i * 3 + 0]);
139 unsigned int g = input_pixel(&src[i * 3 + 1]);
140 unsigned int b_r = input_pixel(&src[i * 3 + 2]);
141
142 dst[i] = (ry*r + gy*g + by*b + (0x2001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
143 }
144 }
145
rgb48ToUV_c_template(uint16_t * dstU,uint16_t * dstV,const uint16_t * src1,const uint16_t * src2,int width,enum AVPixelFormat origin,int32_t * rgb2yuv)146 static av_always_inline void rgb48ToUV_c_template(uint16_t *dstU,
147 uint16_t *dstV,
148 const uint16_t *src1,
149 const uint16_t *src2,
150 int width,
151 enum AVPixelFormat origin,
152 int32_t *rgb2yuv)
153 {
154 int i;
155 int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
156 int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
157 av_assert1(src1 == src2);
158 for (i = 0; i < width; i++) {
159 int r_b = input_pixel(&src1[i * 3 + 0]);
160 int g = input_pixel(&src1[i * 3 + 1]);
161 int b_r = input_pixel(&src1[i * 3 + 2]);
162
163 dstU[i] = (ru*r + gu*g + bu*b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
164 dstV[i] = (rv*r + gv*g + bv*b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
165 }
166 }
167
rgb48ToUV_half_c_template(uint16_t * dstU,uint16_t * dstV,const uint16_t * src1,const uint16_t * src2,int width,enum AVPixelFormat origin,int32_t * rgb2yuv)168 static av_always_inline void rgb48ToUV_half_c_template(uint16_t *dstU,
169 uint16_t *dstV,
170 const uint16_t *src1,
171 const uint16_t *src2,
172 int width,
173 enum AVPixelFormat origin,
174 int32_t *rgb2yuv)
175 {
176 int i;
177 int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
178 int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
179 av_assert1(src1 == src2);
180 for (i = 0; i < width; i++) {
181 int r_b = (input_pixel(&src1[6 * i + 0]) +
182 input_pixel(&src1[6 * i + 3]) + 1) >> 1;
183 int g = (input_pixel(&src1[6 * i + 1]) +
184 input_pixel(&src1[6 * i + 4]) + 1) >> 1;
185 int b_r = (input_pixel(&src1[6 * i + 2]) +
186 input_pixel(&src1[6 * i + 5]) + 1) >> 1;
187
188 dstU[i] = (ru*r + gu*g + bu*b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
189 dstV[i] = (rv*r + gv*g + bv*b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
190 }
191 }
192
193 #undef r
194 #undef b
195 #undef input_pixel
196
197 #define rgb48funcs(pattern, BE_LE, origin) \
198 static void pattern ## 48 ## BE_LE ## ToY_c(uint8_t *_dst, \
199 const uint8_t *_src, \
200 const uint8_t *unused0, const uint8_t *unused1,\
201 int width, \
202 uint32_t *rgb2yuv) \
203 { \
204 const uint16_t *src = (const uint16_t *)_src; \
205 uint16_t *dst = (uint16_t *)_dst; \
206 rgb48ToY_c_template(dst, src, width, origin, rgb2yuv); \
207 } \
208 \
209 static void pattern ## 48 ## BE_LE ## ToUV_c(uint8_t *_dstU, \
210 uint8_t *_dstV, \
211 const uint8_t *unused0, \
212 const uint8_t *_src1, \
213 const uint8_t *_src2, \
214 int width, \
215 uint32_t *rgb2yuv) \
216 { \
217 const uint16_t *src1 = (const uint16_t *)_src1, \
218 *src2 = (const uint16_t *)_src2; \
219 uint16_t *dstU = (uint16_t *)_dstU, \
220 *dstV = (uint16_t *)_dstV; \
221 rgb48ToUV_c_template(dstU, dstV, src1, src2, width, origin, rgb2yuv); \
222 } \
223 \
224 static void pattern ## 48 ## BE_LE ## ToUV_half_c(uint8_t *_dstU, \
225 uint8_t *_dstV, \
226 const uint8_t *unused0, \
227 const uint8_t *_src1, \
228 const uint8_t *_src2, \
229 int width, \
230 uint32_t *rgb2yuv) \
231 { \
232 const uint16_t *src1 = (const uint16_t *)_src1, \
233 *src2 = (const uint16_t *)_src2; \
234 uint16_t *dstU = (uint16_t *)_dstU, \
235 *dstV = (uint16_t *)_dstV; \
236 rgb48ToUV_half_c_template(dstU, dstV, src1, src2, width, origin, rgb2yuv); \
237 }
238
rgb48funcs(rgb,LE,AV_PIX_FMT_RGB48LE)239 rgb48funcs(rgb, LE, AV_PIX_FMT_RGB48LE)
240 rgb48funcs(rgb, BE, AV_PIX_FMT_RGB48BE)
241 rgb48funcs(bgr, LE, AV_PIX_FMT_BGR48LE)
242 rgb48funcs(bgr, BE, AV_PIX_FMT_BGR48BE)
243
244 #define input_pixel(i) ((origin == AV_PIX_FMT_RGBA || \
245 origin == AV_PIX_FMT_BGRA || \
246 origin == AV_PIX_FMT_ARGB || \
247 origin == AV_PIX_FMT_ABGR) \
248 ? AV_RN32A(&src[(i) * 4]) \
249 : (isBE(origin) ? AV_RB16(&src[(i) * 2]) \
250 : AV_RL16(&src[(i) * 2])))
251
252 static av_always_inline void rgb16_32ToY_c_template(int16_t *dst,
253 const uint8_t *src,
254 int width,
255 enum AVPixelFormat origin,
256 int shr, int shg,
257 int shb, int shp,
258 int maskr, int maskg,
259 int maskb, int rsh,
260 int gsh, int bsh, int S,
261 int32_t *rgb2yuv)
262 {
263 const int ry = rgb2yuv[RY_IDX]<<rsh, gy = rgb2yuv[GY_IDX]<<gsh, by = rgb2yuv[BY_IDX]<<bsh;
264 const unsigned rnd = (32<<((S)-1)) + (1<<(S-7));
265 int i;
266
267 for (i = 0; i < width; i++) {
268 int px = input_pixel(i) >> shp;
269 int b = (px & maskb) >> shb;
270 int g = (px & maskg) >> shg;
271 int r = (px & maskr) >> shr;
272
273 dst[i] = (ry * r + gy * g + by * b + rnd) >> ((S)-6);
274 }
275 }
276
rgb16_32ToUV_c_template(int16_t * dstU,int16_t * dstV,const uint8_t * src,int width,enum AVPixelFormat origin,int shr,int shg,int shb,int shp,int maskr,int maskg,int maskb,int rsh,int gsh,int bsh,int S,int32_t * rgb2yuv)277 static av_always_inline void rgb16_32ToUV_c_template(int16_t *dstU,
278 int16_t *dstV,
279 const uint8_t *src,
280 int width,
281 enum AVPixelFormat origin,
282 int shr, int shg,
283 int shb, int shp,
284 int maskr, int maskg,
285 int maskb, int rsh,
286 int gsh, int bsh, int S,
287 int32_t *rgb2yuv)
288 {
289 const int ru = rgb2yuv[RU_IDX] * (1 << rsh), gu = rgb2yuv[GU_IDX] * (1 << gsh), bu = rgb2yuv[BU_IDX] * (1 << bsh),
290 rv = rgb2yuv[RV_IDX] * (1 << rsh), gv = rgb2yuv[GV_IDX] * (1 << gsh), bv = rgb2yuv[BV_IDX] * (1 << bsh);
291 const unsigned rnd = (256u<<((S)-1)) + (1<<(S-7));
292 int i;
293
294 for (i = 0; i < width; i++) {
295 int px = input_pixel(i) >> shp;
296 int b = (px & maskb) >> shb;
297 int g = (px & maskg) >> shg;
298 int r = (px & maskr) >> shr;
299
300 dstU[i] = (ru * r + gu * g + bu * b + rnd) >> ((S)-6);
301 dstV[i] = (rv * r + gv * g + bv * b + rnd) >> ((S)-6);
302 }
303 }
304
rgb16_32ToUV_half_c_template(int16_t * dstU,int16_t * dstV,const uint8_t * src,int width,enum AVPixelFormat origin,int shr,int shg,int shb,int shp,int maskr,int maskg,int maskb,int rsh,int gsh,int bsh,int S,int32_t * rgb2yuv)305 static av_always_inline void rgb16_32ToUV_half_c_template(int16_t *dstU,
306 int16_t *dstV,
307 const uint8_t *src,
308 int width,
309 enum AVPixelFormat origin,
310 int shr, int shg,
311 int shb, int shp,
312 int maskr, int maskg,
313 int maskb, int rsh,
314 int gsh, int bsh, int S,
315 int32_t *rgb2yuv)
316 {
317 const int ru = rgb2yuv[RU_IDX] * (1 << rsh), gu = rgb2yuv[GU_IDX] * (1 << gsh), bu = rgb2yuv[BU_IDX] * (1 << bsh),
318 rv = rgb2yuv[RV_IDX] * (1 << rsh), gv = rgb2yuv[GV_IDX] * (1 << gsh), bv = rgb2yuv[BV_IDX] * (1 << bsh),
319 maskgx = ~(maskr | maskb);
320 const unsigned rnd = (256U<<(S)) + (1<<(S-6));
321 int i;
322
323 maskr |= maskr << 1;
324 maskb |= maskb << 1;
325 maskg |= maskg << 1;
326 for (i = 0; i < width; i++) {
327 unsigned px0 = input_pixel(2 * i + 0) >> shp;
328 unsigned px1 = input_pixel(2 * i + 1) >> shp;
329 int b, r, g = (px0 & maskgx) + (px1 & maskgx);
330 int rb = px0 + px1 - g;
331
332 b = (rb & maskb) >> shb;
333 if (shp ||
334 origin == AV_PIX_FMT_BGR565LE || origin == AV_PIX_FMT_BGR565BE ||
335 origin == AV_PIX_FMT_RGB565LE || origin == AV_PIX_FMT_RGB565BE) {
336 g >>= shg;
337 } else {
338 g = (g & maskg) >> shg;
339 }
340 r = (rb & maskr) >> shr;
341
342 dstU[i] = (ru * r + gu * g + bu * b + (unsigned)rnd) >> ((S)-6+1);
343 dstV[i] = (rv * r + gv * g + bv * b + (unsigned)rnd) >> ((S)-6+1);
344 }
345 }
346
347 #undef input_pixel
348
349 #define rgb16_32_wrapper(fmt, name, shr, shg, shb, shp, maskr, \
350 maskg, maskb, rsh, gsh, bsh, S) \
351 static void name ## ToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, \
352 int width, uint32_t *tab) \
353 { \
354 rgb16_32ToY_c_template((int16_t*)dst, src, width, fmt, shr, shg, shb, shp, \
355 maskr, maskg, maskb, rsh, gsh, bsh, S, tab); \
356 } \
357 \
358 static void name ## ToUV_c(uint8_t *dstU, uint8_t *dstV, \
359 const uint8_t *unused0, const uint8_t *src, const uint8_t *dummy, \
360 int width, uint32_t *tab) \
361 { \
362 rgb16_32ToUV_c_template((int16_t*)dstU, (int16_t*)dstV, src, width, fmt, \
363 shr, shg, shb, shp, \
364 maskr, maskg, maskb, rsh, gsh, bsh, S, tab);\
365 } \
366 \
367 static void name ## ToUV_half_c(uint8_t *dstU, uint8_t *dstV, \
368 const uint8_t *unused0, const uint8_t *src, \
369 const uint8_t *dummy, \
370 int width, uint32_t *tab) \
371 { \
372 rgb16_32ToUV_half_c_template((int16_t*)dstU, (int16_t*)dstV, src, width, fmt, \
373 shr, shg, shb, shp, \
374 maskr, maskg, maskb, \
375 rsh, gsh, bsh, S, tab); \
376 }
377
378 rgb16_32_wrapper(AV_PIX_FMT_BGR32, bgr32, 16, 0, 0, 0, 0xFF0000, 0xFF00, 0x00FF, 8, 0, 8, RGB2YUV_SHIFT + 8)
379 rgb16_32_wrapper(AV_PIX_FMT_BGR32_1, bgr321, 16, 0, 0, 8, 0xFF0000, 0xFF00, 0x00FF, 8, 0, 8, RGB2YUV_SHIFT + 8)
380 rgb16_32_wrapper(AV_PIX_FMT_RGB32, rgb32, 0, 0, 16, 0, 0x00FF, 0xFF00, 0xFF0000, 8, 0, 8, RGB2YUV_SHIFT + 8)
381 rgb16_32_wrapper(AV_PIX_FMT_RGB32_1, rgb321, 0, 0, 16, 8, 0x00FF, 0xFF00, 0xFF0000, 8, 0, 8, RGB2YUV_SHIFT + 8)
382 rgb16_32_wrapper(AV_PIX_FMT_BGR565LE, bgr16le, 0, 0, 0, 0, 0x001F, 0x07E0, 0xF800, 11, 5, 0, RGB2YUV_SHIFT + 8)
383 rgb16_32_wrapper(AV_PIX_FMT_BGR555LE, bgr15le, 0, 0, 0, 0, 0x001F, 0x03E0, 0x7C00, 10, 5, 0, RGB2YUV_SHIFT + 7)
384 rgb16_32_wrapper(AV_PIX_FMT_BGR444LE, bgr12le, 0, 0, 0, 0, 0x000F, 0x00F0, 0x0F00, 8, 4, 0, RGB2YUV_SHIFT + 4)
385 rgb16_32_wrapper(AV_PIX_FMT_RGB565LE, rgb16le, 0, 0, 0, 0, 0xF800, 0x07E0, 0x001F, 0, 5, 11, RGB2YUV_SHIFT + 8)
386 rgb16_32_wrapper(AV_PIX_FMT_RGB555LE, rgb15le, 0, 0, 0, 0, 0x7C00, 0x03E0, 0x001F, 0, 5, 10, RGB2YUV_SHIFT + 7)
387 rgb16_32_wrapper(AV_PIX_FMT_RGB444LE, rgb12le, 0, 0, 0, 0, 0x0F00, 0x00F0, 0x000F, 0, 4, 8, RGB2YUV_SHIFT + 4)
388 rgb16_32_wrapper(AV_PIX_FMT_BGR565BE, bgr16be, 0, 0, 0, 0, 0x001F, 0x07E0, 0xF800, 11, 5, 0, RGB2YUV_SHIFT + 8)
389 rgb16_32_wrapper(AV_PIX_FMT_BGR555BE, bgr15be, 0, 0, 0, 0, 0x001F, 0x03E0, 0x7C00, 10, 5, 0, RGB2YUV_SHIFT + 7)
390 rgb16_32_wrapper(AV_PIX_FMT_BGR444BE, bgr12be, 0, 0, 0, 0, 0x000F, 0x00F0, 0x0F00, 8, 4, 0, RGB2YUV_SHIFT + 4)
391 rgb16_32_wrapper(AV_PIX_FMT_RGB565BE, rgb16be, 0, 0, 0, 0, 0xF800, 0x07E0, 0x001F, 0, 5, 11, RGB2YUV_SHIFT + 8)
392 rgb16_32_wrapper(AV_PIX_FMT_RGB555BE, rgb15be, 0, 0, 0, 0, 0x7C00, 0x03E0, 0x001F, 0, 5, 10, RGB2YUV_SHIFT + 7)
393 rgb16_32_wrapper(AV_PIX_FMT_RGB444BE, rgb12be, 0, 0, 0, 0, 0x0F00, 0x00F0, 0x000F, 0, 4, 8, RGB2YUV_SHIFT + 4)
394
gbr24pToUV_half_c(uint8_t * _dstU,uint8_t * _dstV,const uint8_t * gsrc,const uint8_t * bsrc,const uint8_t * rsrc,int width,uint32_t * rgb2yuv)395 static void gbr24pToUV_half_c(uint8_t *_dstU, uint8_t *_dstV,
396 const uint8_t *gsrc, const uint8_t *bsrc, const uint8_t *rsrc,
397 int width, uint32_t *rgb2yuv)
398 {
399 uint16_t *dstU = (uint16_t *)_dstU;
400 uint16_t *dstV = (uint16_t *)_dstV;
401 int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
402 int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
403
404 int i;
405 for (i = 0; i < width; i++) {
406 unsigned int g = gsrc[2*i] + gsrc[2*i+1];
407 unsigned int b = bsrc[2*i] + bsrc[2*i+1];
408 unsigned int r = rsrc[2*i] + rsrc[2*i+1];
409
410 dstU[i] = (ru*r + gu*g + bu*b + (0x4001<<(RGB2YUV_SHIFT-6))) >> (RGB2YUV_SHIFT-6+1);
411 dstV[i] = (rv*r + gv*g + bv*b + (0x4001<<(RGB2YUV_SHIFT-6))) >> (RGB2YUV_SHIFT-6+1);
412 }
413 }
414
rgba64leToA_c(uint8_t * _dst,const uint8_t * _src,const uint8_t * unused1,const uint8_t * unused2,int width,uint32_t * unused)415 static void rgba64leToA_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1,
416 const uint8_t *unused2, int width, uint32_t *unused)
417 {
418 int16_t *dst = (int16_t *)_dst;
419 const uint16_t *src = (const uint16_t *)_src;
420 int i;
421 for (i = 0; i < width; i++)
422 dst[i] = AV_RL16(src + 4 * i + 3);
423 }
424
rgba64beToA_c(uint8_t * _dst,const uint8_t * _src,const uint8_t * unused1,const uint8_t * unused2,int width,uint32_t * unused)425 static void rgba64beToA_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1,
426 const uint8_t *unused2, int width, uint32_t *unused)
427 {
428 int16_t *dst = (int16_t *)_dst;
429 const uint16_t *src = (const uint16_t *)_src;
430 int i;
431 for (i = 0; i < width; i++)
432 dst[i] = AV_RB16(src + 4 * i + 3);
433 }
434
abgrToA_c(uint8_t * _dst,const uint8_t * src,const uint8_t * unused1,const uint8_t * unused2,int width,uint32_t * unused)435 static void abgrToA_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused)
436 {
437 int16_t *dst = (int16_t *)_dst;
438 int i;
439 for (i=0; i<width; i++) {
440 dst[i]= src[4*i]<<6 | src[4*i]>>2;
441 }
442 }
443
rgbaToA_c(uint8_t * _dst,const uint8_t * src,const uint8_t * unused1,const uint8_t * unused2,int width,uint32_t * unused)444 static void rgbaToA_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused)
445 {
446 int16_t *dst = (int16_t *)_dst;
447 int i;
448 for (i=0; i<width; i++) {
449 dst[i]= src[4*i+3]<<6 | src[4*i+3]>>2;
450 }
451 }
452
palToA_c(uint8_t * _dst,const uint8_t * src,const uint8_t * unused1,const uint8_t * unused2,int width,uint32_t * pal)453 static void palToA_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *pal)
454 {
455 int16_t *dst = (int16_t *)_dst;
456 int i;
457 for (i=0; i<width; i++) {
458 int d= src[i];
459
460 dst[i]= (pal[d] >> 24)<<6 | pal[d]>>26;
461 }
462 }
463
palToY_c(uint8_t * _dst,const uint8_t * src,const uint8_t * unused1,const uint8_t * unused2,int width,uint32_t * pal)464 static void palToY_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *pal)
465 {
466 int16_t *dst = (int16_t *)_dst;
467 int i;
468 for (i = 0; i < width; i++) {
469 int d = src[i];
470
471 dst[i] = (pal[d] & 0xFF)<<6;
472 }
473 }
474
palToUV_c(uint8_t * _dstU,uint8_t * _dstV,const uint8_t * unused0,const uint8_t * src1,const uint8_t * src2,int width,uint32_t * pal)475 static void palToUV_c(uint8_t *_dstU, uint8_t *_dstV,
476 const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
477 int width, uint32_t *pal)
478 {
479 uint16_t *dstU = (uint16_t *)_dstU;
480 int16_t *dstV = (int16_t *)_dstV;
481 int i;
482 av_assert1(src1 == src2);
483 for (i = 0; i < width; i++) {
484 int p = pal[src1[i]];
485
486 dstU[i] = (uint8_t)(p>> 8)<<6;
487 dstV[i] = (uint8_t)(p>>16)<<6;
488 }
489 }
490
monowhite2Y_c(uint8_t * _dst,const uint8_t * src,const uint8_t * unused1,const uint8_t * unused2,int width,uint32_t * unused)491 static void monowhite2Y_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused)
492 {
493 int16_t *dst = (int16_t *)_dst;
494 int i, j;
495 width = (width + 7) >> 3;
496 for (i = 0; i < width; i++) {
497 int d = ~src[i];
498 for (j = 0; j < 8; j++)
499 dst[8*i+j]= ((d>>(7-j))&1) * 16383;
500 }
501 if(width&7){
502 int d= ~src[i];
503 for (j = 0; j < (width&7); j++)
504 dst[8*i+j]= ((d>>(7-j))&1) * 16383;
505 }
506 }
507
monoblack2Y_c(uint8_t * _dst,const uint8_t * src,const uint8_t * unused1,const uint8_t * unused2,int width,uint32_t * unused)508 static void monoblack2Y_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused)
509 {
510 int16_t *dst = (int16_t *)_dst;
511 int i, j;
512 width = (width + 7) >> 3;
513 for (i = 0; i < width; i++) {
514 int d = src[i];
515 for (j = 0; j < 8; j++)
516 dst[8*i+j]= ((d>>(7-j))&1) * 16383;
517 }
518 if(width&7){
519 int d = src[i];
520 for (j = 0; j < (width&7); j++)
521 dst[8*i+j] = ((d>>(7-j))&1) * 16383;
522 }
523 }
524
yuy2ToY_c(uint8_t * dst,const uint8_t * src,const uint8_t * unused1,const uint8_t * unused2,int width,uint32_t * unused)525 static void yuy2ToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
526 uint32_t *unused)
527 {
528 int i;
529 for (i = 0; i < width; i++)
530 dst[i] = src[2 * i];
531 }
532
yuy2ToUV_c(uint8_t * dstU,uint8_t * dstV,const uint8_t * unused0,const uint8_t * src1,const uint8_t * src2,int width,uint32_t * unused)533 static void yuy2ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src1,
534 const uint8_t *src2, int width, uint32_t *unused)
535 {
536 int i;
537 for (i = 0; i < width; i++) {
538 dstU[i] = src1[4 * i + 1];
539 dstV[i] = src1[4 * i + 3];
540 }
541 av_assert1(src1 == src2);
542 }
543
yvy2ToUV_c(uint8_t * dstU,uint8_t * dstV,const uint8_t * unused0,const uint8_t * src1,const uint8_t * src2,int width,uint32_t * unused)544 static void yvy2ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src1,
545 const uint8_t *src2, int width, uint32_t *unused)
546 {
547 int i;
548 for (i = 0; i < width; i++) {
549 dstV[i] = src1[4 * i + 1];
550 dstU[i] = src1[4 * i + 3];
551 }
552 av_assert1(src1 == src2);
553 }
554
y210le_UV_c(uint8_t * dstU,uint8_t * dstV,const uint8_t * unused0,const uint8_t * src,const uint8_t * unused1,int width,uint32_t * unused2)555 static void y210le_UV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src,
556 const uint8_t *unused1, int width, uint32_t *unused2)
557 {
558 int i;
559 for (i = 0; i < width; i++) {
560 AV_WN16(dstU + i * 2, AV_RL16(src + i * 8 + 2) >> 6);
561 AV_WN16(dstV + i * 2, AV_RL16(src + i * 8 + 6) >> 6);
562 }
563 }
564
y210le_Y_c(uint8_t * dst,const uint8_t * src,const uint8_t * unused0,const uint8_t * unused1,int width,uint32_t * unused2)565 static void y210le_Y_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused0,
566 const uint8_t *unused1, int width, uint32_t *unused2)
567 {
568 int i;
569 for (i = 0; i < width; i++)
570 AV_WN16(dst + i * 2, AV_RL16(src + i * 4) >> 6);
571 }
572
bswap16Y_c(uint8_t * _dst,const uint8_t * _src,const uint8_t * unused1,const uint8_t * unused2,int width,uint32_t * unused)573 static void bswap16Y_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1, const uint8_t *unused2, int width,
574 uint32_t *unused)
575 {
576 int i;
577 const uint16_t *src = (const uint16_t *)_src;
578 uint16_t *dst = (uint16_t *)_dst;
579 for (i = 0; i < width; i++)
580 dst[i] = av_bswap16(src[i]);
581 }
582
bswap16UV_c(uint8_t * _dstU,uint8_t * _dstV,const uint8_t * unused0,const uint8_t * _src1,const uint8_t * _src2,int width,uint32_t * unused)583 static void bswap16UV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *_src1,
584 const uint8_t *_src2, int width, uint32_t *unused)
585 {
586 int i;
587 const uint16_t *src1 = (const uint16_t *)_src1,
588 *src2 = (const uint16_t *)_src2;
589 uint16_t *dstU = (uint16_t *)_dstU, *dstV = (uint16_t *)_dstV;
590 for (i = 0; i < width; i++) {
591 dstU[i] = av_bswap16(src1[i]);
592 dstV[i] = av_bswap16(src2[i]);
593 }
594 }
595
read_ya16le_gray_c(uint8_t * dst,const uint8_t * src,const uint8_t * unused1,const uint8_t * unused2,int width,uint32_t * unused)596 static void read_ya16le_gray_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
597 uint32_t *unused)
598 {
599 int i;
600 for (i = 0; i < width; i++)
601 AV_WN16(dst + i * 2, AV_RL16(src + i * 4));
602 }
603
read_ya16le_alpha_c(uint8_t * dst,const uint8_t * src,const uint8_t * unused1,const uint8_t * unused2,int width,uint32_t * unused)604 static void read_ya16le_alpha_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
605 uint32_t *unused)
606 {
607 int i;
608 for (i = 0; i < width; i++)
609 AV_WN16(dst + i * 2, AV_RL16(src + i * 4 + 2));
610 }
611
read_ya16be_gray_c(uint8_t * dst,const uint8_t * src,const uint8_t * unused1,const uint8_t * unused2,int width,uint32_t * unused)612 static void read_ya16be_gray_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
613 uint32_t *unused)
614 {
615 int i;
616 for (i = 0; i < width; i++)
617 AV_WN16(dst + i * 2, AV_RB16(src + i * 4));
618 }
619
read_ya16be_alpha_c(uint8_t * dst,const uint8_t * src,const uint8_t * unused1,const uint8_t * unused2,int width,uint32_t * unused)620 static void read_ya16be_alpha_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
621 uint32_t *unused)
622 {
623 int i;
624 for (i = 0; i < width; i++)
625 AV_WN16(dst + i * 2, AV_RB16(src + i * 4 + 2));
626 }
627
read_ayuv64le_Y_c(uint8_t * dst,const uint8_t * src,const uint8_t * unused0,const uint8_t * unused1,int width,uint32_t * unused2)628 static void read_ayuv64le_Y_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused0, const uint8_t *unused1, int width,
629 uint32_t *unused2)
630 {
631 int i;
632 for (i = 0; i < width; i++)
633 AV_WN16(dst + i * 2, AV_RL16(src + i * 8 + 2));
634 }
635
636
read_ayuv64le_UV_c(uint8_t * dstU,uint8_t * dstV,const uint8_t * unused0,const uint8_t * src,const uint8_t * unused1,int width,uint32_t * unused2)637 static void read_ayuv64le_UV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src,
638 const uint8_t *unused1, int width, uint32_t *unused2)
639 {
640 int i;
641 for (i = 0; i < width; i++) {
642 AV_WN16(dstU + i * 2, AV_RL16(src + i * 8 + 4));
643 AV_WN16(dstV + i * 2, AV_RL16(src + i * 8 + 6));
644 }
645 }
646
read_ayuv64le_A_c(uint8_t * dst,const uint8_t * src,const uint8_t * unused0,const uint8_t * unused1,int width,uint32_t * unused2)647 static void read_ayuv64le_A_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused0, const uint8_t *unused1, int width,
648 uint32_t *unused2)
649 {
650 int i;
651 for (i = 0; i < width; i++)
652 AV_WN16(dst + i * 2, AV_RL16(src + i * 8));
653 }
654
655 /* This is almost identical to the previous, end exists only because
656 * yuy2ToY/UV)(dst, src + 1, ...) would have 100% unaligned accesses. */
uyvyToY_c(uint8_t * dst,const uint8_t * src,const uint8_t * unused1,const uint8_t * unused2,int width,uint32_t * unused)657 static void uyvyToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
658 uint32_t *unused)
659 {
660 int i;
661 for (i = 0; i < width; i++)
662 dst[i] = src[2 * i + 1];
663 }
664
uyvyToUV_c(uint8_t * dstU,uint8_t * dstV,const uint8_t * unused0,const uint8_t * src1,const uint8_t * src2,int width,uint32_t * unused)665 static void uyvyToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src1,
666 const uint8_t *src2, int width, uint32_t *unused)
667 {
668 int i;
669 for (i = 0; i < width; i++) {
670 dstU[i] = src1[4 * i + 0];
671 dstV[i] = src1[4 * i + 2];
672 }
673 av_assert1(src1 == src2);
674 }
675
nvXXtoUV_c(uint8_t * dst1,uint8_t * dst2,const uint8_t * src,int width)676 static av_always_inline void nvXXtoUV_c(uint8_t *dst1, uint8_t *dst2,
677 const uint8_t *src, int width)
678 {
679 int i;
680 for (i = 0; i < width; i++) {
681 dst1[i] = src[2 * i + 0];
682 dst2[i] = src[2 * i + 1];
683 }
684 }
685
nv12ToUV_c(uint8_t * dstU,uint8_t * dstV,const uint8_t * unused0,const uint8_t * src1,const uint8_t * src2,int width,uint32_t * unused)686 static void nv12ToUV_c(uint8_t *dstU, uint8_t *dstV,
687 const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
688 int width, uint32_t *unused)
689 {
690 nvXXtoUV_c(dstU, dstV, src1, width);
691 }
692
nv21ToUV_c(uint8_t * dstU,uint8_t * dstV,const uint8_t * unused0,const uint8_t * src1,const uint8_t * src2,int width,uint32_t * unused)693 static void nv21ToUV_c(uint8_t *dstU, uint8_t *dstV,
694 const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
695 int width, uint32_t *unused)
696 {
697 nvXXtoUV_c(dstV, dstU, src1, width);
698 }
699
p010LEToY_c(uint8_t * dst,const uint8_t * src,const uint8_t * unused1,const uint8_t * unused2,int width,uint32_t * unused)700 static void p010LEToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1,
701 const uint8_t *unused2, int width, uint32_t *unused)
702 {
703 int i;
704 for (i = 0; i < width; i++) {
705 AV_WN16(dst + i * 2, AV_RL16(src + i * 2) >> 6);
706 }
707 }
708
p010BEToY_c(uint8_t * dst,const uint8_t * src,const uint8_t * unused1,const uint8_t * unused2,int width,uint32_t * unused)709 static void p010BEToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1,
710 const uint8_t *unused2, int width, uint32_t *unused)
711 {
712 int i;
713 for (i = 0; i < width; i++) {
714 AV_WN16(dst + i * 2, AV_RB16(src + i * 2) >> 6);
715 }
716 }
717
p010LEToUV_c(uint8_t * dstU,uint8_t * dstV,const uint8_t * unused0,const uint8_t * src1,const uint8_t * src2,int width,uint32_t * unused)718 static void p010LEToUV_c(uint8_t *dstU, uint8_t *dstV,
719 const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
720 int width, uint32_t *unused)
721 {
722 int i;
723 for (i = 0; i < width; i++) {
724 AV_WN16(dstU + i * 2, AV_RL16(src1 + i * 4 + 0) >> 6);
725 AV_WN16(dstV + i * 2, AV_RL16(src1 + i * 4 + 2) >> 6);
726 }
727 }
728
p010BEToUV_c(uint8_t * dstU,uint8_t * dstV,const uint8_t * unused0,const uint8_t * src1,const uint8_t * src2,int width,uint32_t * unused)729 static void p010BEToUV_c(uint8_t *dstU, uint8_t *dstV,
730 const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
731 int width, uint32_t *unused)
732 {
733 int i;
734 for (i = 0; i < width; i++) {
735 AV_WN16(dstU + i * 2, AV_RB16(src1 + i * 4 + 0) >> 6);
736 AV_WN16(dstV + i * 2, AV_RB16(src1 + i * 4 + 2) >> 6);
737 }
738 }
739
p016LEToUV_c(uint8_t * dstU,uint8_t * dstV,const uint8_t * unused0,const uint8_t * src1,const uint8_t * src2,int width,uint32_t * unused)740 static void p016LEToUV_c(uint8_t *dstU, uint8_t *dstV,
741 const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
742 int width, uint32_t *unused)
743 {
744 int i;
745 for (i = 0; i < width; i++) {
746 AV_WN16(dstU + i * 2, AV_RL16(src1 + i * 4 + 0));
747 AV_WN16(dstV + i * 2, AV_RL16(src1 + i * 4 + 2));
748 }
749 }
750
p016BEToUV_c(uint8_t * dstU,uint8_t * dstV,const uint8_t * unused0,const uint8_t * src1,const uint8_t * src2,int width,uint32_t * unused)751 static void p016BEToUV_c(uint8_t *dstU, uint8_t *dstV,
752 const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
753 int width, uint32_t *unused)
754 {
755 int i;
756 for (i = 0; i < width; i++) {
757 AV_WN16(dstU + i * 2, AV_RB16(src1 + i * 4 + 0));
758 AV_WN16(dstV + i * 2, AV_RB16(src1 + i * 4 + 2));
759 }
760 }
761
762 #define input_pixel(pos) (isBE(origin) ? AV_RB16(pos) : AV_RL16(pos))
763
bgr24ToY_c(uint8_t * _dst,const uint8_t * src,const uint8_t * unused1,const uint8_t * unused2,int width,uint32_t * rgb2yuv)764 static void bgr24ToY_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2,
765 int width, uint32_t *rgb2yuv)
766 {
767 int16_t *dst = (int16_t *)_dst;
768 int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
769 int i;
770 for (i = 0; i < width; i++) {
771 int b = src[i * 3 + 0];
772 int g = src[i * 3 + 1];
773 int r = src[i * 3 + 2];
774
775 dst[i] = ((ry*r + gy*g + by*b + (32<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6));
776 }
777 }
778
bgr24ToUV_c(uint8_t * _dstU,uint8_t * _dstV,const uint8_t * unused0,const uint8_t * src1,const uint8_t * src2,int width,uint32_t * rgb2yuv)779 static void bgr24ToUV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
780 const uint8_t *src2, int width, uint32_t *rgb2yuv)
781 {
782 int16_t *dstU = (int16_t *)_dstU;
783 int16_t *dstV = (int16_t *)_dstV;
784 int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
785 int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
786 int i;
787 for (i = 0; i < width; i++) {
788 int b = src1[3 * i + 0];
789 int g = src1[3 * i + 1];
790 int r = src1[3 * i + 2];
791
792 dstU[i] = (ru*r + gu*g + bu*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
793 dstV[i] = (rv*r + gv*g + bv*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
794 }
795 av_assert1(src1 == src2);
796 }
797
bgr24ToUV_half_c(uint8_t * _dstU,uint8_t * _dstV,const uint8_t * unused0,const uint8_t * src1,const uint8_t * src2,int width,uint32_t * rgb2yuv)798 static void bgr24ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
799 const uint8_t *src2, int width, uint32_t *rgb2yuv)
800 {
801 int16_t *dstU = (int16_t *)_dstU;
802 int16_t *dstV = (int16_t *)_dstV;
803 int i;
804 int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
805 int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
806 for (i = 0; i < width; i++) {
807 int b = src1[6 * i + 0] + src1[6 * i + 3];
808 int g = src1[6 * i + 1] + src1[6 * i + 4];
809 int r = src1[6 * i + 2] + src1[6 * i + 5];
810
811 dstU[i] = (ru*r + gu*g + bu*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
812 dstV[i] = (rv*r + gv*g + bv*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
813 }
814 av_assert1(src1 == src2);
815 }
816
rgb24ToY_c(uint8_t * _dst,const uint8_t * src,const uint8_t * unused1,const uint8_t * unused2,int width,uint32_t * rgb2yuv)817 static void rgb24ToY_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
818 uint32_t *rgb2yuv)
819 {
820 int16_t *dst = (int16_t *)_dst;
821 int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
822 int i;
823 for (i = 0; i < width; i++) {
824 int r = src[i * 3 + 0];
825 int g = src[i * 3 + 1];
826 int b = src[i * 3 + 2];
827
828 dst[i] = ((ry*r + gy*g + by*b + (32<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6));
829 }
830 }
831
rgb24ToUV_c(uint8_t * _dstU,uint8_t * _dstV,const uint8_t * unused0,const uint8_t * src1,const uint8_t * src2,int width,uint32_t * rgb2yuv)832 static void rgb24ToUV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
833 const uint8_t *src2, int width, uint32_t *rgb2yuv)
834 {
835 int16_t *dstU = (int16_t *)_dstU;
836 int16_t *dstV = (int16_t *)_dstV;
837 int i;
838 int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
839 int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
840 av_assert1(src1 == src2);
841 for (i = 0; i < width; i++) {
842 int r = src1[3 * i + 0];
843 int g = src1[3 * i + 1];
844 int b = src1[3 * i + 2];
845
846 dstU[i] = (ru*r + gu*g + bu*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
847 dstV[i] = (rv*r + gv*g + bv*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
848 }
849 }
850
rgb24ToUV_half_c(uint8_t * _dstU,uint8_t * _dstV,const uint8_t * unused0,const uint8_t * src1,const uint8_t * src2,int width,uint32_t * rgb2yuv)851 static void rgb24ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
852 const uint8_t *src2, int width, uint32_t *rgb2yuv)
853 {
854 int16_t *dstU = (int16_t *)_dstU;
855 int16_t *dstV = (int16_t *)_dstV;
856 int i;
857 int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
858 int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
859 av_assert1(src1 == src2);
860 for (i = 0; i < width; i++) {
861 int r = src1[6 * i + 0] + src1[6 * i + 3];
862 int g = src1[6 * i + 1] + src1[6 * i + 4];
863 int b = src1[6 * i + 2] + src1[6 * i + 5];
864
865 dstU[i] = (ru*r + gu*g + bu*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
866 dstV[i] = (rv*r + gv*g + bv*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
867 }
868 }
869
planar_rgb_to_y(uint8_t * _dst,const uint8_t * src[4],int width,int32_t * rgb2yuv)870 static void planar_rgb_to_y(uint8_t *_dst, const uint8_t *src[4], int width, int32_t *rgb2yuv)
871 {
872 uint16_t *dst = (uint16_t *)_dst;
873 int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
874 int i;
875 for (i = 0; i < width; i++) {
876 int g = src[0][i];
877 int b = src[1][i];
878 int r = src[2][i];
879
880 dst[i] = (ry*r + gy*g + by*b + (0x801<<(RGB2YUV_SHIFT-7))) >> (RGB2YUV_SHIFT-6);
881 }
882 }
883
planar_rgb_to_a(uint8_t * _dst,const uint8_t * src[4],int width,int32_t * unused)884 static void planar_rgb_to_a(uint8_t *_dst, const uint8_t *src[4], int width, int32_t *unused)
885 {
886 uint16_t *dst = (uint16_t *)_dst;
887 int i;
888 for (i = 0; i < width; i++)
889 dst[i] = src[3][i] << 6;
890 }
891
planar_rgb_to_uv(uint8_t * _dstU,uint8_t * _dstV,const uint8_t * src[4],int width,int32_t * rgb2yuv)892 static void planar_rgb_to_uv(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *src[4], int width, int32_t *rgb2yuv)
893 {
894 uint16_t *dstU = (uint16_t *)_dstU;
895 uint16_t *dstV = (uint16_t *)_dstV;
896 int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
897 int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
898 int i;
899 for (i = 0; i < width; i++) {
900 int g = src[0][i];
901 int b = src[1][i];
902 int r = src[2][i];
903
904 dstU[i] = (ru*r + gu*g + bu*b + (0x4001<<(RGB2YUV_SHIFT-7))) >> (RGB2YUV_SHIFT-6);
905 dstV[i] = (rv*r + gv*g + bv*b + (0x4001<<(RGB2YUV_SHIFT-7))) >> (RGB2YUV_SHIFT-6);
906 }
907 }
908
909 #define rdpx(src) \
910 is_be ? AV_RB16(src) : AV_RL16(src)
planar_rgb16_to_y(uint8_t * _dst,const uint8_t * _src[4],int width,int bpc,int is_be,int32_t * rgb2yuv)911 static av_always_inline void planar_rgb16_to_y(uint8_t *_dst, const uint8_t *_src[4],
912 int width, int bpc, int is_be, int32_t *rgb2yuv)
913 {
914 int i;
915 const uint16_t **src = (const uint16_t **)_src;
916 uint16_t *dst = (uint16_t *)_dst;
917 int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
918 int shift = bpc < 16 ? bpc : 14;
919 for (i = 0; i < width; i++) {
920 int g = rdpx(src[0] + i);
921 int b = rdpx(src[1] + i);
922 int r = rdpx(src[2] + i);
923
924 dst[i] = ((ry*r + gy*g + by*b + (33 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + shift - 14));
925 }
926 }
927
planar_rgb16_to_a(uint8_t * _dst,const uint8_t * _src[4],int width,int bpc,int is_be,int32_t * rgb2yuv)928 static av_always_inline void planar_rgb16_to_a(uint8_t *_dst, const uint8_t *_src[4],
929 int width, int bpc, int is_be, int32_t *rgb2yuv)
930 {
931 int i;
932 const uint16_t **src = (const uint16_t **)_src;
933 uint16_t *dst = (uint16_t *)_dst;
934 int shift = bpc < 16 ? bpc : 14;
935
936 for (i = 0; i < width; i++) {
937 dst[i] = rdpx(src[3] + i) << (14 - shift);
938 }
939 }
940
planar_rgb16_to_uv(uint8_t * _dstU,uint8_t * _dstV,const uint8_t * _src[4],int width,int bpc,int is_be,int32_t * rgb2yuv)941 static av_always_inline void planar_rgb16_to_uv(uint8_t *_dstU, uint8_t *_dstV,
942 const uint8_t *_src[4], int width,
943 int bpc, int is_be, int32_t *rgb2yuv)
944 {
945 int i;
946 const uint16_t **src = (const uint16_t **)_src;
947 uint16_t *dstU = (uint16_t *)_dstU;
948 uint16_t *dstV = (uint16_t *)_dstV;
949 int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
950 int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
951 int shift = bpc < 16 ? bpc : 14;
952 for (i = 0; i < width; i++) {
953 int g = rdpx(src[0] + i);
954 int b = rdpx(src[1] + i);
955 int r = rdpx(src[2] + i);
956
957 dstU[i] = (ru*r + gu*g + bu*b + (257 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + shift - 14);
958 dstV[i] = (rv*r + gv*g + bv*b + (257 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + shift - 14);
959 }
960 }
961 #undef rdpx
962
963 #define rdpx(src) (is_be ? av_int2float(AV_RB32(src)): av_int2float(AV_RL32(src)))
964
planar_rgbf32_to_a(uint8_t * _dst,const uint8_t * _src[4],int width,int is_be,int32_t * rgb2yuv)965 static av_always_inline void planar_rgbf32_to_a(uint8_t *_dst, const uint8_t *_src[4], int width, int is_be, int32_t *rgb2yuv)
966 {
967 int i;
968 const float **src = (const float **)_src;
969 uint16_t *dst = (uint16_t *)_dst;
970
971 for (i = 0; i < width; i++) {
972 dst[i] = av_clip_uint16(lrintf(65535.0f * rdpx(src[3] + i)));
973 }
974 }
975
planar_rgbf32_to_uv(uint8_t * _dstU,uint8_t * _dstV,const uint8_t * _src[4],int width,int is_be,int32_t * rgb2yuv)976 static av_always_inline void planar_rgbf32_to_uv(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *_src[4], int width, int is_be, int32_t *rgb2yuv)
977 {
978 int i;
979 const float **src = (const float **)_src;
980 uint16_t *dstU = (uint16_t *)_dstU;
981 uint16_t *dstV = (uint16_t *)_dstV;
982 int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
983 int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
984 int bpc = 16;
985 int shift = 14;
986 for (i = 0; i < width; i++) {
987 int g = av_clip_uint16(lrintf(65535.0f * rdpx(src[0] + i)));
988 int b = av_clip_uint16(lrintf(65535.0f * rdpx(src[1] + i)));
989 int r = av_clip_uint16(lrintf(65535.0f * rdpx(src[2] + i)));
990
991 dstU[i] = (ru*r + gu*g + bu*b + (257 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + shift - 14);
992 dstV[i] = (rv*r + gv*g + bv*b + (257 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + shift - 14);
993 }
994 }
995
planar_rgbf32_to_y(uint8_t * _dst,const uint8_t * _src[4],int width,int is_be,int32_t * rgb2yuv)996 static av_always_inline void planar_rgbf32_to_y(uint8_t *_dst, const uint8_t *_src[4], int width, int is_be, int32_t *rgb2yuv)
997 {
998 int i;
999 const float **src = (const float **)_src;
1000 uint16_t *dst = (uint16_t *)_dst;
1001
1002 int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
1003 int bpc = 16;
1004 int shift = 14;
1005 for (i = 0; i < width; i++) {
1006 int g = av_clip_uint16(lrintf(65535.0f * rdpx(src[0] + i)));
1007 int b = av_clip_uint16(lrintf(65535.0f * rdpx(src[1] + i)));
1008 int r = av_clip_uint16(lrintf(65535.0f * rdpx(src[2] + i)));
1009
1010 dst[i] = ((ry*r + gy*g + by*b + (33 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + shift - 14));
1011 }
1012 }
1013
1014 #undef rdpx
1015
grayf32ToY16_c(uint8_t * _dst,const uint8_t * _src,const uint8_t * unused1,const uint8_t * unused2,int width,uint32_t * unused)1016 static av_always_inline void grayf32ToY16_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1,
1017 const uint8_t *unused2, int width, uint32_t *unused)
1018 {
1019 int i;
1020 const float *src = (const float *)_src;
1021 uint16_t *dst = (uint16_t *)_dst;
1022
1023 for (i = 0; i < width; ++i){
1024 dst[i] = av_clip_uint16(lrintf(65535.0f * src[i]));
1025 }
1026 }
1027
grayf32ToY16_bswap_c(uint8_t * _dst,const uint8_t * _src,const uint8_t * unused1,const uint8_t * unused2,int width,uint32_t * unused)1028 static av_always_inline void grayf32ToY16_bswap_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1,
1029 const uint8_t *unused2, int width, uint32_t *unused)
1030 {
1031 int i;
1032 const uint32_t *src = (const uint32_t *)_src;
1033 uint16_t *dst = (uint16_t *)_dst;
1034
1035 for (i = 0; i < width; ++i){
1036 dst[i] = av_clip_uint16(lrintf(65535.0f * av_int2float(av_bswap32(src[i]))));
1037 }
1038 }
1039
1040 #define rgb9plus_planar_funcs_endian(nbits, endian_name, endian) \
1041 static void planar_rgb##nbits##endian_name##_to_y(uint8_t *dst, const uint8_t *src[4], \
1042 int w, int32_t *rgb2yuv) \
1043 { \
1044 planar_rgb16_to_y(dst, src, w, nbits, endian, rgb2yuv); \
1045 } \
1046 static void planar_rgb##nbits##endian_name##_to_uv(uint8_t *dstU, uint8_t *dstV, \
1047 const uint8_t *src[4], int w, int32_t *rgb2yuv) \
1048 { \
1049 planar_rgb16_to_uv(dstU, dstV, src, w, nbits, endian, rgb2yuv); \
1050 } \
1051
1052 #define rgb9plus_planar_transparency_funcs(nbits) \
1053 static void planar_rgb##nbits##le_to_a(uint8_t *dst, const uint8_t *src[4], \
1054 int w, int32_t *rgb2yuv) \
1055 { \
1056 planar_rgb16_to_a(dst, src, w, nbits, 0, rgb2yuv); \
1057 } \
1058 static void planar_rgb##nbits##be_to_a(uint8_t *dst, const uint8_t *src[4], \
1059 int w, int32_t *rgb2yuv) \
1060 { \
1061 planar_rgb16_to_a(dst, src, w, nbits, 1, rgb2yuv); \
1062 }
1063
1064 #define rgb9plus_planar_funcs(nbits) \
1065 rgb9plus_planar_funcs_endian(nbits, le, 0) \
1066 rgb9plus_planar_funcs_endian(nbits, be, 1)
1067
1068 rgb9plus_planar_funcs(9)
1069 rgb9plus_planar_funcs(10)
1070 rgb9plus_planar_funcs(12)
1071 rgb9plus_planar_funcs(14)
1072 rgb9plus_planar_funcs(16)
1073
1074 rgb9plus_planar_transparency_funcs(10)
1075 rgb9plus_planar_transparency_funcs(12)
1076 rgb9plus_planar_transparency_funcs(16)
1077
1078 #define rgbf32_planar_funcs_endian(endian_name, endian) \
1079 static void planar_rgbf32##endian_name##_to_y(uint8_t *dst, const uint8_t *src[4], \
1080 int w, int32_t *rgb2yuv) \
1081 { \
1082 planar_rgbf32_to_y(dst, src, w, endian, rgb2yuv); \
1083 } \
1084 static void planar_rgbf32##endian_name##_to_uv(uint8_t *dstU, uint8_t *dstV, \
1085 const uint8_t *src[4], int w, int32_t *rgb2yuv) \
1086 { \
1087 planar_rgbf32_to_uv(dstU, dstV, src, w, endian, rgb2yuv); \
1088 } \
1089 static void planar_rgbf32##endian_name##_to_a(uint8_t *dst, const uint8_t *src[4], \
1090 int w, int32_t *rgb2yuv) \
1091 { \
1092 planar_rgbf32_to_a(dst, src, w, endian, rgb2yuv); \
1093 }
1094
1095 rgbf32_planar_funcs_endian(le, 0)
1096 rgbf32_planar_funcs_endian(be, 1)
1097
ff_sws_init_input_funcs(SwsContext * c)1098 av_cold void ff_sws_init_input_funcs(SwsContext *c)
1099 {
1100 enum AVPixelFormat srcFormat = c->srcFormat;
1101
1102 c->chrToYV12 = NULL;
1103 switch (srcFormat) {
1104 case AV_PIX_FMT_YUYV422:
1105 c->chrToYV12 = yuy2ToUV_c;
1106 break;
1107 case AV_PIX_FMT_YVYU422:
1108 c->chrToYV12 = yvy2ToUV_c;
1109 break;
1110 case AV_PIX_FMT_UYVY422:
1111 c->chrToYV12 = uyvyToUV_c;
1112 break;
1113 case AV_PIX_FMT_NV12:
1114 case AV_PIX_FMT_NV24:
1115 c->chrToYV12 = nv12ToUV_c;
1116 break;
1117 case AV_PIX_FMT_NV21:
1118 case AV_PIX_FMT_NV42:
1119 c->chrToYV12 = nv21ToUV_c;
1120 break;
1121 case AV_PIX_FMT_RGB8:
1122 case AV_PIX_FMT_BGR8:
1123 case AV_PIX_FMT_PAL8:
1124 case AV_PIX_FMT_BGR4_BYTE:
1125 case AV_PIX_FMT_RGB4_BYTE:
1126 c->chrToYV12 = palToUV_c;
1127 break;
1128 case AV_PIX_FMT_GBRP9LE:
1129 c->readChrPlanar = planar_rgb9le_to_uv;
1130 break;
1131 case AV_PIX_FMT_GBRAP10LE:
1132 case AV_PIX_FMT_GBRP10LE:
1133 c->readChrPlanar = planar_rgb10le_to_uv;
1134 break;
1135 case AV_PIX_FMT_GBRAP12LE:
1136 case AV_PIX_FMT_GBRP12LE:
1137 c->readChrPlanar = planar_rgb12le_to_uv;
1138 break;
1139 case AV_PIX_FMT_GBRP14LE:
1140 c->readChrPlanar = planar_rgb14le_to_uv;
1141 break;
1142 case AV_PIX_FMT_GBRAP16LE:
1143 case AV_PIX_FMT_GBRP16LE:
1144 c->readChrPlanar = planar_rgb16le_to_uv;
1145 break;
1146 case AV_PIX_FMT_GBRAPF32LE:
1147 case AV_PIX_FMT_GBRPF32LE:
1148 c->readChrPlanar = planar_rgbf32le_to_uv;
1149 break;
1150 case AV_PIX_FMT_GBRP9BE:
1151 c->readChrPlanar = planar_rgb9be_to_uv;
1152 break;
1153 case AV_PIX_FMT_GBRAP10BE:
1154 case AV_PIX_FMT_GBRP10BE:
1155 c->readChrPlanar = planar_rgb10be_to_uv;
1156 break;
1157 case AV_PIX_FMT_GBRAP12BE:
1158 case AV_PIX_FMT_GBRP12BE:
1159 c->readChrPlanar = planar_rgb12be_to_uv;
1160 break;
1161 case AV_PIX_FMT_GBRP14BE:
1162 c->readChrPlanar = planar_rgb14be_to_uv;
1163 break;
1164 case AV_PIX_FMT_GBRAP16BE:
1165 case AV_PIX_FMT_GBRP16BE:
1166 c->readChrPlanar = planar_rgb16be_to_uv;
1167 break;
1168 case AV_PIX_FMT_GBRAPF32BE:
1169 case AV_PIX_FMT_GBRPF32BE:
1170 c->readChrPlanar = planar_rgbf32be_to_uv;
1171 break;
1172 case AV_PIX_FMT_GBRAP:
1173 case AV_PIX_FMT_GBRP:
1174 c->readChrPlanar = planar_rgb_to_uv;
1175 break;
1176 #if HAVE_BIGENDIAN
1177 case AV_PIX_FMT_YUV420P9LE:
1178 case AV_PIX_FMT_YUV422P9LE:
1179 case AV_PIX_FMT_YUV444P9LE:
1180 case AV_PIX_FMT_YUV420P10LE:
1181 case AV_PIX_FMT_YUV422P10LE:
1182 case AV_PIX_FMT_YUV440P10LE:
1183 case AV_PIX_FMT_YUV444P10LE:
1184 case AV_PIX_FMT_YUV420P12LE:
1185 case AV_PIX_FMT_YUV422P12LE:
1186 case AV_PIX_FMT_YUV440P12LE:
1187 case AV_PIX_FMT_YUV444P12LE:
1188 case AV_PIX_FMT_YUV420P14LE:
1189 case AV_PIX_FMT_YUV422P14LE:
1190 case AV_PIX_FMT_YUV444P14LE:
1191 case AV_PIX_FMT_YUV420P16LE:
1192 case AV_PIX_FMT_YUV422P16LE:
1193 case AV_PIX_FMT_YUV444P16LE:
1194
1195 case AV_PIX_FMT_YUVA420P9LE:
1196 case AV_PIX_FMT_YUVA422P9LE:
1197 case AV_PIX_FMT_YUVA444P9LE:
1198 case AV_PIX_FMT_YUVA420P10LE:
1199 case AV_PIX_FMT_YUVA422P10LE:
1200 case AV_PIX_FMT_YUVA444P10LE:
1201 case AV_PIX_FMT_YUVA422P12LE:
1202 case AV_PIX_FMT_YUVA444P12LE:
1203 case AV_PIX_FMT_YUVA420P16LE:
1204 case AV_PIX_FMT_YUVA422P16LE:
1205 case AV_PIX_FMT_YUVA444P16LE:
1206 c->chrToYV12 = bswap16UV_c;
1207 break;
1208 #else
1209 case AV_PIX_FMT_YUV420P9BE:
1210 case AV_PIX_FMT_YUV422P9BE:
1211 case AV_PIX_FMT_YUV444P9BE:
1212 case AV_PIX_FMT_YUV420P10BE:
1213 case AV_PIX_FMT_YUV422P10BE:
1214 case AV_PIX_FMT_YUV440P10BE:
1215 case AV_PIX_FMT_YUV444P10BE:
1216 case AV_PIX_FMT_YUV420P12BE:
1217 case AV_PIX_FMT_YUV422P12BE:
1218 case AV_PIX_FMT_YUV440P12BE:
1219 case AV_PIX_FMT_YUV444P12BE:
1220 case AV_PIX_FMT_YUV420P14BE:
1221 case AV_PIX_FMT_YUV422P14BE:
1222 case AV_PIX_FMT_YUV444P14BE:
1223 case AV_PIX_FMT_YUV420P16BE:
1224 case AV_PIX_FMT_YUV422P16BE:
1225 case AV_PIX_FMT_YUV444P16BE:
1226
1227 case AV_PIX_FMT_YUVA420P9BE:
1228 case AV_PIX_FMT_YUVA422P9BE:
1229 case AV_PIX_FMT_YUVA444P9BE:
1230 case AV_PIX_FMT_YUVA420P10BE:
1231 case AV_PIX_FMT_YUVA422P10BE:
1232 case AV_PIX_FMT_YUVA444P10BE:
1233 case AV_PIX_FMT_YUVA422P12BE:
1234 case AV_PIX_FMT_YUVA444P12BE:
1235 case AV_PIX_FMT_YUVA420P16BE:
1236 case AV_PIX_FMT_YUVA422P16BE:
1237 case AV_PIX_FMT_YUVA444P16BE:
1238 c->chrToYV12 = bswap16UV_c;
1239 break;
1240 #endif
1241 case AV_PIX_FMT_AYUV64LE:
1242 c->chrToYV12 = read_ayuv64le_UV_c;
1243 break;
1244 case AV_PIX_FMT_P010LE:
1245 c->chrToYV12 = p010LEToUV_c;
1246 break;
1247 case AV_PIX_FMT_P010BE:
1248 c->chrToYV12 = p010BEToUV_c;
1249 break;
1250 case AV_PIX_FMT_P016LE:
1251 c->chrToYV12 = p016LEToUV_c;
1252 break;
1253 case AV_PIX_FMT_P016BE:
1254 c->chrToYV12 = p016BEToUV_c;
1255 break;
1256 case AV_PIX_FMT_Y210LE:
1257 c->chrToYV12 = y210le_UV_c;
1258 break;
1259 }
1260 if (c->chrSrcHSubSample) {
1261 switch (srcFormat) {
1262 case AV_PIX_FMT_RGBA64BE:
1263 c->chrToYV12 = rgb64BEToUV_half_c;
1264 break;
1265 case AV_PIX_FMT_RGBA64LE:
1266 c->chrToYV12 = rgb64LEToUV_half_c;
1267 break;
1268 case AV_PIX_FMT_BGRA64BE:
1269 c->chrToYV12 = bgr64BEToUV_half_c;
1270 break;
1271 case AV_PIX_FMT_BGRA64LE:
1272 c->chrToYV12 = bgr64LEToUV_half_c;
1273 break;
1274 case AV_PIX_FMT_RGB48BE:
1275 c->chrToYV12 = rgb48BEToUV_half_c;
1276 break;
1277 case AV_PIX_FMT_RGB48LE:
1278 c->chrToYV12 = rgb48LEToUV_half_c;
1279 break;
1280 case AV_PIX_FMT_BGR48BE:
1281 c->chrToYV12 = bgr48BEToUV_half_c;
1282 break;
1283 case AV_PIX_FMT_BGR48LE:
1284 c->chrToYV12 = bgr48LEToUV_half_c;
1285 break;
1286 case AV_PIX_FMT_RGB32:
1287 c->chrToYV12 = bgr32ToUV_half_c;
1288 break;
1289 case AV_PIX_FMT_RGB32_1:
1290 c->chrToYV12 = bgr321ToUV_half_c;
1291 break;
1292 case AV_PIX_FMT_BGR24:
1293 c->chrToYV12 = bgr24ToUV_half_c;
1294 break;
1295 case AV_PIX_FMT_BGR565LE:
1296 c->chrToYV12 = bgr16leToUV_half_c;
1297 break;
1298 case AV_PIX_FMT_BGR565BE:
1299 c->chrToYV12 = bgr16beToUV_half_c;
1300 break;
1301 case AV_PIX_FMT_BGR555LE:
1302 c->chrToYV12 = bgr15leToUV_half_c;
1303 break;
1304 case AV_PIX_FMT_BGR555BE:
1305 c->chrToYV12 = bgr15beToUV_half_c;
1306 break;
1307 case AV_PIX_FMT_GBRAP:
1308 case AV_PIX_FMT_GBRP:
1309 c->chrToYV12 = gbr24pToUV_half_c;
1310 break;
1311 case AV_PIX_FMT_BGR444LE:
1312 c->chrToYV12 = bgr12leToUV_half_c;
1313 break;
1314 case AV_PIX_FMT_BGR444BE:
1315 c->chrToYV12 = bgr12beToUV_half_c;
1316 break;
1317 case AV_PIX_FMT_BGR32:
1318 c->chrToYV12 = rgb32ToUV_half_c;
1319 break;
1320 case AV_PIX_FMT_BGR32_1:
1321 c->chrToYV12 = rgb321ToUV_half_c;
1322 break;
1323 case AV_PIX_FMT_RGB24:
1324 c->chrToYV12 = rgb24ToUV_half_c;
1325 break;
1326 case AV_PIX_FMT_RGB565LE:
1327 c->chrToYV12 = rgb16leToUV_half_c;
1328 break;
1329 case AV_PIX_FMT_RGB565BE:
1330 c->chrToYV12 = rgb16beToUV_half_c;
1331 break;
1332 case AV_PIX_FMT_RGB555LE:
1333 c->chrToYV12 = rgb15leToUV_half_c;
1334 break;
1335 case AV_PIX_FMT_RGB555BE:
1336 c->chrToYV12 = rgb15beToUV_half_c;
1337 break;
1338 case AV_PIX_FMT_RGB444LE:
1339 c->chrToYV12 = rgb12leToUV_half_c;
1340 break;
1341 case AV_PIX_FMT_RGB444BE:
1342 c->chrToYV12 = rgb12beToUV_half_c;
1343 break;
1344 }
1345 } else {
1346 switch (srcFormat) {
1347 case AV_PIX_FMT_RGBA64BE:
1348 c->chrToYV12 = rgb64BEToUV_c;
1349 break;
1350 case AV_PIX_FMT_RGBA64LE:
1351 c->chrToYV12 = rgb64LEToUV_c;
1352 break;
1353 case AV_PIX_FMT_BGRA64BE:
1354 c->chrToYV12 = bgr64BEToUV_c;
1355 break;
1356 case AV_PIX_FMT_BGRA64LE:
1357 c->chrToYV12 = bgr64LEToUV_c;
1358 break;
1359 case AV_PIX_FMT_RGB48BE:
1360 c->chrToYV12 = rgb48BEToUV_c;
1361 break;
1362 case AV_PIX_FMT_RGB48LE:
1363 c->chrToYV12 = rgb48LEToUV_c;
1364 break;
1365 case AV_PIX_FMT_BGR48BE:
1366 c->chrToYV12 = bgr48BEToUV_c;
1367 break;
1368 case AV_PIX_FMT_BGR48LE:
1369 c->chrToYV12 = bgr48LEToUV_c;
1370 break;
1371 case AV_PIX_FMT_RGB32:
1372 c->chrToYV12 = bgr32ToUV_c;
1373 break;
1374 case AV_PIX_FMT_RGB32_1:
1375 c->chrToYV12 = bgr321ToUV_c;
1376 break;
1377 case AV_PIX_FMT_BGR24:
1378 c->chrToYV12 = bgr24ToUV_c;
1379 break;
1380 case AV_PIX_FMT_BGR565LE:
1381 c->chrToYV12 = bgr16leToUV_c;
1382 break;
1383 case AV_PIX_FMT_BGR565BE:
1384 c->chrToYV12 = bgr16beToUV_c;
1385 break;
1386 case AV_PIX_FMT_BGR555LE:
1387 c->chrToYV12 = bgr15leToUV_c;
1388 break;
1389 case AV_PIX_FMT_BGR555BE:
1390 c->chrToYV12 = bgr15beToUV_c;
1391 break;
1392 case AV_PIX_FMT_BGR444LE:
1393 c->chrToYV12 = bgr12leToUV_c;
1394 break;
1395 case AV_PIX_FMT_BGR444BE:
1396 c->chrToYV12 = bgr12beToUV_c;
1397 break;
1398 case AV_PIX_FMT_BGR32:
1399 c->chrToYV12 = rgb32ToUV_c;
1400 break;
1401 case AV_PIX_FMT_BGR32_1:
1402 c->chrToYV12 = rgb321ToUV_c;
1403 break;
1404 case AV_PIX_FMT_RGB24:
1405 c->chrToYV12 = rgb24ToUV_c;
1406 break;
1407 case AV_PIX_FMT_RGB565LE:
1408 c->chrToYV12 = rgb16leToUV_c;
1409 break;
1410 case AV_PIX_FMT_RGB565BE:
1411 c->chrToYV12 = rgb16beToUV_c;
1412 break;
1413 case AV_PIX_FMT_RGB555LE:
1414 c->chrToYV12 = rgb15leToUV_c;
1415 break;
1416 case AV_PIX_FMT_RGB555BE:
1417 c->chrToYV12 = rgb15beToUV_c;
1418 break;
1419 case AV_PIX_FMT_RGB444LE:
1420 c->chrToYV12 = rgb12leToUV_c;
1421 break;
1422 case AV_PIX_FMT_RGB444BE:
1423 c->chrToYV12 = rgb12beToUV_c;
1424 break;
1425 }
1426 }
1427
1428 c->lumToYV12 = NULL;
1429 c->alpToYV12 = NULL;
1430 switch (srcFormat) {
1431 case AV_PIX_FMT_GBRP9LE:
1432 c->readLumPlanar = planar_rgb9le_to_y;
1433 break;
1434 case AV_PIX_FMT_GBRAP10LE:
1435 c->readAlpPlanar = planar_rgb10le_to_a;
1436 case AV_PIX_FMT_GBRP10LE:
1437 c->readLumPlanar = planar_rgb10le_to_y;
1438 break;
1439 case AV_PIX_FMT_GBRAP12LE:
1440 c->readAlpPlanar = planar_rgb12le_to_a;
1441 case AV_PIX_FMT_GBRP12LE:
1442 c->readLumPlanar = planar_rgb12le_to_y;
1443 break;
1444 case AV_PIX_FMT_GBRP14LE:
1445 c->readLumPlanar = planar_rgb14le_to_y;
1446 break;
1447 case AV_PIX_FMT_GBRAP16LE:
1448 c->readAlpPlanar = planar_rgb16le_to_a;
1449 case AV_PIX_FMT_GBRP16LE:
1450 c->readLumPlanar = planar_rgb16le_to_y;
1451 break;
1452 case AV_PIX_FMT_GBRAPF32LE:
1453 c->readAlpPlanar = planar_rgbf32le_to_a;
1454 case AV_PIX_FMT_GBRPF32LE:
1455 c->readLumPlanar = planar_rgbf32le_to_y;
1456 break;
1457 case AV_PIX_FMT_GBRP9BE:
1458 c->readLumPlanar = planar_rgb9be_to_y;
1459 break;
1460 case AV_PIX_FMT_GBRAP10BE:
1461 c->readAlpPlanar = planar_rgb10be_to_a;
1462 case AV_PIX_FMT_GBRP10BE:
1463 c->readLumPlanar = planar_rgb10be_to_y;
1464 break;
1465 case AV_PIX_FMT_GBRAP12BE:
1466 c->readAlpPlanar = planar_rgb12be_to_a;
1467 case AV_PIX_FMT_GBRP12BE:
1468 c->readLumPlanar = planar_rgb12be_to_y;
1469 break;
1470 case AV_PIX_FMT_GBRP14BE:
1471 c->readLumPlanar = planar_rgb14be_to_y;
1472 break;
1473 case AV_PIX_FMT_GBRAP16BE:
1474 c->readAlpPlanar = planar_rgb16be_to_a;
1475 case AV_PIX_FMT_GBRP16BE:
1476 c->readLumPlanar = planar_rgb16be_to_y;
1477 break;
1478 case AV_PIX_FMT_GBRAPF32BE:
1479 c->readAlpPlanar = planar_rgbf32be_to_a;
1480 case AV_PIX_FMT_GBRPF32BE:
1481 c->readLumPlanar = planar_rgbf32be_to_y;
1482 break;
1483 case AV_PIX_FMT_GBRAP:
1484 c->readAlpPlanar = planar_rgb_to_a;
1485 case AV_PIX_FMT_GBRP:
1486 c->readLumPlanar = planar_rgb_to_y;
1487 break;
1488 #if HAVE_BIGENDIAN
1489 case AV_PIX_FMT_YUV420P9LE:
1490 case AV_PIX_FMT_YUV422P9LE:
1491 case AV_PIX_FMT_YUV444P9LE:
1492 case AV_PIX_FMT_YUV420P10LE:
1493 case AV_PIX_FMT_YUV422P10LE:
1494 case AV_PIX_FMT_YUV440P10LE:
1495 case AV_PIX_FMT_YUV444P10LE:
1496 case AV_PIX_FMT_YUV420P12LE:
1497 case AV_PIX_FMT_YUV422P12LE:
1498 case AV_PIX_FMT_YUV440P12LE:
1499 case AV_PIX_FMT_YUV444P12LE:
1500 case AV_PIX_FMT_YUV420P14LE:
1501 case AV_PIX_FMT_YUV422P14LE:
1502 case AV_PIX_FMT_YUV444P14LE:
1503 case AV_PIX_FMT_YUV420P16LE:
1504 case AV_PIX_FMT_YUV422P16LE:
1505 case AV_PIX_FMT_YUV444P16LE:
1506
1507 case AV_PIX_FMT_GRAY9LE:
1508 case AV_PIX_FMT_GRAY10LE:
1509 case AV_PIX_FMT_GRAY12LE:
1510 case AV_PIX_FMT_GRAY14LE:
1511 case AV_PIX_FMT_GRAY16LE:
1512
1513 case AV_PIX_FMT_P016LE:
1514 c->lumToYV12 = bswap16Y_c;
1515 break;
1516 case AV_PIX_FMT_YUVA420P9LE:
1517 case AV_PIX_FMT_YUVA422P9LE:
1518 case AV_PIX_FMT_YUVA444P9LE:
1519 case AV_PIX_FMT_YUVA420P10LE:
1520 case AV_PIX_FMT_YUVA422P10LE:
1521 case AV_PIX_FMT_YUVA444P10LE:
1522 case AV_PIX_FMT_YUVA422P12LE:
1523 case AV_PIX_FMT_YUVA444P12LE:
1524 case AV_PIX_FMT_YUVA420P16LE:
1525 case AV_PIX_FMT_YUVA422P16LE:
1526 case AV_PIX_FMT_YUVA444P16LE:
1527 c->lumToYV12 = bswap16Y_c;
1528 c->alpToYV12 = bswap16Y_c;
1529 break;
1530 #else
1531 case AV_PIX_FMT_YUV420P9BE:
1532 case AV_PIX_FMT_YUV422P9BE:
1533 case AV_PIX_FMT_YUV444P9BE:
1534 case AV_PIX_FMT_YUV420P10BE:
1535 case AV_PIX_FMT_YUV422P10BE:
1536 case AV_PIX_FMT_YUV440P10BE:
1537 case AV_PIX_FMT_YUV444P10BE:
1538 case AV_PIX_FMT_YUV420P12BE:
1539 case AV_PIX_FMT_YUV422P12BE:
1540 case AV_PIX_FMT_YUV440P12BE:
1541 case AV_PIX_FMT_YUV444P12BE:
1542 case AV_PIX_FMT_YUV420P14BE:
1543 case AV_PIX_FMT_YUV422P14BE:
1544 case AV_PIX_FMT_YUV444P14BE:
1545 case AV_PIX_FMT_YUV420P16BE:
1546 case AV_PIX_FMT_YUV422P16BE:
1547 case AV_PIX_FMT_YUV444P16BE:
1548
1549 case AV_PIX_FMT_GRAY9BE:
1550 case AV_PIX_FMT_GRAY10BE:
1551 case AV_PIX_FMT_GRAY12BE:
1552 case AV_PIX_FMT_GRAY14BE:
1553 case AV_PIX_FMT_GRAY16BE:
1554
1555 case AV_PIX_FMT_P016BE:
1556 c->lumToYV12 = bswap16Y_c;
1557 break;
1558 case AV_PIX_FMT_YUVA420P9BE:
1559 case AV_PIX_FMT_YUVA422P9BE:
1560 case AV_PIX_FMT_YUVA444P9BE:
1561 case AV_PIX_FMT_YUVA420P10BE:
1562 case AV_PIX_FMT_YUVA422P10BE:
1563 case AV_PIX_FMT_YUVA444P10BE:
1564 case AV_PIX_FMT_YUVA422P12BE:
1565 case AV_PIX_FMT_YUVA444P12BE:
1566 case AV_PIX_FMT_YUVA420P16BE:
1567 case AV_PIX_FMT_YUVA422P16BE:
1568 case AV_PIX_FMT_YUVA444P16BE:
1569 c->lumToYV12 = bswap16Y_c;
1570 c->alpToYV12 = bswap16Y_c;
1571 break;
1572 #endif
1573 case AV_PIX_FMT_YA16LE:
1574 c->lumToYV12 = read_ya16le_gray_c;
1575 break;
1576 case AV_PIX_FMT_YA16BE:
1577 c->lumToYV12 = read_ya16be_gray_c;
1578 break;
1579 case AV_PIX_FMT_AYUV64LE:
1580 c->lumToYV12 = read_ayuv64le_Y_c;
1581 break;
1582 case AV_PIX_FMT_YUYV422:
1583 case AV_PIX_FMT_YVYU422:
1584 case AV_PIX_FMT_YA8:
1585 c->lumToYV12 = yuy2ToY_c;
1586 break;
1587 case AV_PIX_FMT_UYVY422:
1588 c->lumToYV12 = uyvyToY_c;
1589 break;
1590 case AV_PIX_FMT_BGR24:
1591 c->lumToYV12 = bgr24ToY_c;
1592 break;
1593 case AV_PIX_FMT_BGR565LE:
1594 c->lumToYV12 = bgr16leToY_c;
1595 break;
1596 case AV_PIX_FMT_BGR565BE:
1597 c->lumToYV12 = bgr16beToY_c;
1598 break;
1599 case AV_PIX_FMT_BGR555LE:
1600 c->lumToYV12 = bgr15leToY_c;
1601 break;
1602 case AV_PIX_FMT_BGR555BE:
1603 c->lumToYV12 = bgr15beToY_c;
1604 break;
1605 case AV_PIX_FMT_BGR444LE:
1606 c->lumToYV12 = bgr12leToY_c;
1607 break;
1608 case AV_PIX_FMT_BGR444BE:
1609 c->lumToYV12 = bgr12beToY_c;
1610 break;
1611 case AV_PIX_FMT_RGB24:
1612 c->lumToYV12 = rgb24ToY_c;
1613 break;
1614 case AV_PIX_FMT_RGB565LE:
1615 c->lumToYV12 = rgb16leToY_c;
1616 break;
1617 case AV_PIX_FMT_RGB565BE:
1618 c->lumToYV12 = rgb16beToY_c;
1619 break;
1620 case AV_PIX_FMT_RGB555LE:
1621 c->lumToYV12 = rgb15leToY_c;
1622 break;
1623 case AV_PIX_FMT_RGB555BE:
1624 c->lumToYV12 = rgb15beToY_c;
1625 break;
1626 case AV_PIX_FMT_RGB444LE:
1627 c->lumToYV12 = rgb12leToY_c;
1628 break;
1629 case AV_PIX_FMT_RGB444BE:
1630 c->lumToYV12 = rgb12beToY_c;
1631 break;
1632 case AV_PIX_FMT_RGB8:
1633 case AV_PIX_FMT_BGR8:
1634 case AV_PIX_FMT_PAL8:
1635 case AV_PIX_FMT_BGR4_BYTE:
1636 case AV_PIX_FMT_RGB4_BYTE:
1637 c->lumToYV12 = palToY_c;
1638 break;
1639 case AV_PIX_FMT_MONOBLACK:
1640 c->lumToYV12 = monoblack2Y_c;
1641 break;
1642 case AV_PIX_FMT_MONOWHITE:
1643 c->lumToYV12 = monowhite2Y_c;
1644 break;
1645 case AV_PIX_FMT_RGB32:
1646 c->lumToYV12 = bgr32ToY_c;
1647 break;
1648 case AV_PIX_FMT_RGB32_1:
1649 c->lumToYV12 = bgr321ToY_c;
1650 break;
1651 case AV_PIX_FMT_BGR32:
1652 c->lumToYV12 = rgb32ToY_c;
1653 break;
1654 case AV_PIX_FMT_BGR32_1:
1655 c->lumToYV12 = rgb321ToY_c;
1656 break;
1657 case AV_PIX_FMT_RGB48BE:
1658 c->lumToYV12 = rgb48BEToY_c;
1659 break;
1660 case AV_PIX_FMT_RGB48LE:
1661 c->lumToYV12 = rgb48LEToY_c;
1662 break;
1663 case AV_PIX_FMT_BGR48BE:
1664 c->lumToYV12 = bgr48BEToY_c;
1665 break;
1666 case AV_PIX_FMT_BGR48LE:
1667 c->lumToYV12 = bgr48LEToY_c;
1668 break;
1669 case AV_PIX_FMT_RGBA64BE:
1670 c->lumToYV12 = rgb64BEToY_c;
1671 break;
1672 case AV_PIX_FMT_RGBA64LE:
1673 c->lumToYV12 = rgb64LEToY_c;
1674 break;
1675 case AV_PIX_FMT_BGRA64BE:
1676 c->lumToYV12 = bgr64BEToY_c;
1677 break;
1678 case AV_PIX_FMT_BGRA64LE:
1679 c->lumToYV12 = bgr64LEToY_c;
1680 break;
1681 case AV_PIX_FMT_P010LE:
1682 c->lumToYV12 = p010LEToY_c;
1683 break;
1684 case AV_PIX_FMT_P010BE:
1685 c->lumToYV12 = p010BEToY_c;
1686 break;
1687 case AV_PIX_FMT_GRAYF32LE:
1688 #if HAVE_BIGENDIAN
1689 c->lumToYV12 = grayf32ToY16_bswap_c;
1690 #else
1691 c->lumToYV12 = grayf32ToY16_c;
1692 #endif
1693 break;
1694 case AV_PIX_FMT_GRAYF32BE:
1695 #if HAVE_BIGENDIAN
1696 c->lumToYV12 = grayf32ToY16_c;
1697 #else
1698 c->lumToYV12 = grayf32ToY16_bswap_c;
1699 #endif
1700 break;
1701 case AV_PIX_FMT_Y210LE:
1702 c->lumToYV12 = y210le_Y_c;
1703 break;
1704 }
1705 if (c->needAlpha) {
1706 if (is16BPS(srcFormat) || isNBPS(srcFormat)) {
1707 if (HAVE_BIGENDIAN == !isBE(srcFormat) && !c->readAlpPlanar)
1708 c->alpToYV12 = bswap16Y_c;
1709 }
1710 switch (srcFormat) {
1711 case AV_PIX_FMT_BGRA64LE:
1712 case AV_PIX_FMT_RGBA64LE: c->alpToYV12 = rgba64leToA_c; break;
1713 case AV_PIX_FMT_BGRA64BE:
1714 case AV_PIX_FMT_RGBA64BE: c->alpToYV12 = rgba64beToA_c; break;
1715 case AV_PIX_FMT_BGRA:
1716 case AV_PIX_FMT_RGBA:
1717 c->alpToYV12 = rgbaToA_c;
1718 break;
1719 case AV_PIX_FMT_ABGR:
1720 case AV_PIX_FMT_ARGB:
1721 c->alpToYV12 = abgrToA_c;
1722 break;
1723 case AV_PIX_FMT_YA8:
1724 c->alpToYV12 = uyvyToY_c;
1725 break;
1726 case AV_PIX_FMT_YA16LE:
1727 c->alpToYV12 = read_ya16le_alpha_c;
1728 break;
1729 case AV_PIX_FMT_YA16BE:
1730 c->alpToYV12 = read_ya16be_alpha_c;
1731 break;
1732 case AV_PIX_FMT_AYUV64LE:
1733 c->alpToYV12 = read_ayuv64le_A_c;
1734 break;
1735 case AV_PIX_FMT_PAL8 :
1736 c->alpToYV12 = palToA_c;
1737 break;
1738 }
1739 }
1740 }
1741