]> git.sesse.net Git - ffmpeg/blob - libswscale/input.c
Merge commit '88c612e3a4d5b584e2d9f6e2541de78d67bdfb9f'
[ffmpeg] / libswscale / input.c
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
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
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
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
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
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
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
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
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] << rsh, gu = rgb2yuv[GU_IDX] << gsh, bu = rgb2yuv[BU_IDX] << bsh,
290               rv       = rgb2yuv[RV_IDX] << rsh, gv = rgb2yuv[GV_IDX] << gsh, bv = rgb2yuv[BV_IDX] << 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
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] << rsh, gu = rgb2yuv[GU_IDX] << gsh, bu = rgb2yuv[BU_IDX] << bsh,
318               rv       = rgb2yuv[RV_IDX] << rsh, gv = rgb2yuv[GV_IDX] << gsh, bv = rgb2yuv[BV_IDX] << 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
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
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
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
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;
441     }
442 }
443
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;
450     }
451 }
452
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;
461     }
462 }
463
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
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
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
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
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
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
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
555 static void bswap16Y_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1, const uint8_t *unused2, int width,
556                        uint32_t *unused)
557 {
558     int i;
559     const uint16_t *src = (const uint16_t *)_src;
560     uint16_t *dst       = (uint16_t *)_dst;
561     for (i = 0; i < width; i++)
562         dst[i] = av_bswap16(src[i]);
563 }
564
565 static void bswap16UV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *_src1,
566                         const uint8_t *_src2, int width, uint32_t *unused)
567 {
568     int i;
569     const uint16_t *src1 = (const uint16_t *)_src1,
570     *src2                = (const uint16_t *)_src2;
571     uint16_t *dstU       = (uint16_t *)_dstU, *dstV = (uint16_t *)_dstV;
572     for (i = 0; i < width; i++) {
573         dstU[i] = av_bswap16(src1[i]);
574         dstV[i] = av_bswap16(src2[i]);
575     }
576 }
577
578 static void read_ya16le_gray_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
579                                uint32_t *unused)
580 {
581     int i;
582     for (i = 0; i < width; i++)
583         AV_WN16(dst + i * 2, AV_RL16(src + i * 4));
584 }
585
586 static void read_ya16le_alpha_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
587                                 uint32_t *unused)
588 {
589     int i;
590     for (i = 0; i < width; i++)
591         AV_WN16(dst + i * 2, AV_RL16(src + i * 4 + 2));
592 }
593
594 static void read_ya16be_gray_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
595                                uint32_t *unused)
596 {
597     int i;
598     for (i = 0; i < width; i++)
599         AV_WN16(dst + i * 2, AV_RB16(src + i * 4));
600 }
601
602 static void read_ya16be_alpha_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
603                                 uint32_t *unused)
604 {
605     int i;
606     for (i = 0; i < width; i++)
607         AV_WN16(dst + i * 2, AV_RB16(src + i * 4 + 2));
608 }
609
610 /* This is almost identical to the previous, end exists only because
611  * yuy2ToY/UV)(dst, src + 1, ...) would have 100% unaligned accesses. */
612 static void uyvyToY_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         dst[i] = src[2 * i + 1];
618 }
619
620 static void uyvyToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src1,
621                        const uint8_t *src2, int width, uint32_t *unused)
622 {
623     int i;
624     for (i = 0; i < width; i++) {
625         dstU[i] = src1[4 * i + 0];
626         dstV[i] = src1[4 * i + 2];
627     }
628     av_assert1(src1 == src2);
629 }
630
631 static av_always_inline void nvXXtoUV_c(uint8_t *dst1, uint8_t *dst2,
632                                         const uint8_t *src, int width)
633 {
634     int i;
635     for (i = 0; i < width; i++) {
636         dst1[i] = src[2 * i + 0];
637         dst2[i] = src[2 * i + 1];
638     }
639 }
640
641 static void nv12ToUV_c(uint8_t *dstU, uint8_t *dstV,
642                        const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
643                        int width, uint32_t *unused)
644 {
645     nvXXtoUV_c(dstU, dstV, src1, width);
646 }
647
648 static void nv21ToUV_c(uint8_t *dstU, uint8_t *dstV,
649                        const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
650                        int width, uint32_t *unused)
651 {
652     nvXXtoUV_c(dstV, dstU, src1, width);
653 }
654
655 #define input_pixel(pos) (isBE(origin) ? AV_RB16(pos) : AV_RL16(pos))
656
657 static void bgr24ToY_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2,
658                        int width, uint32_t *rgb2yuv)
659 {
660     int16_t *dst = (int16_t *)_dst;
661     int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
662     int i;
663     for (i = 0; i < width; i++) {
664         int b = src[i * 3 + 0];
665         int g = src[i * 3 + 1];
666         int r = src[i * 3 + 2];
667
668         dst[i] = ((ry*r + gy*g + by*b + (32<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6));
669     }
670 }
671
672 static void bgr24ToUV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
673                         const uint8_t *src2, int width, uint32_t *rgb2yuv)
674 {
675     int16_t *dstU = (int16_t *)_dstU;
676     int16_t *dstV = (int16_t *)_dstV;
677     int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
678     int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
679     int i;
680     for (i = 0; i < width; i++) {
681         int b = src1[3 * i + 0];
682         int g = src1[3 * i + 1];
683         int r = src1[3 * i + 2];
684
685         dstU[i] = (ru*r + gu*g + bu*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
686         dstV[i] = (rv*r + gv*g + bv*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
687     }
688     av_assert1(src1 == src2);
689 }
690
691 static void bgr24ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
692                              const uint8_t *src2, int width, uint32_t *rgb2yuv)
693 {
694     int16_t *dstU = (int16_t *)_dstU;
695     int16_t *dstV = (int16_t *)_dstV;
696     int i;
697     int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
698     int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
699     for (i = 0; i < width; i++) {
700         int b = src1[6 * i + 0] + src1[6 * i + 3];
701         int g = src1[6 * i + 1] + src1[6 * i + 4];
702         int r = src1[6 * i + 2] + src1[6 * i + 5];
703
704         dstU[i] = (ru*r + gu*g + bu*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
705         dstV[i] = (rv*r + gv*g + bv*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
706     }
707     av_assert1(src1 == src2);
708 }
709
710 static void rgb24ToY_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
711                        uint32_t *rgb2yuv)
712 {
713     int16_t *dst = (int16_t *)_dst;
714     int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
715     int i;
716     for (i = 0; i < width; i++) {
717         int r = src[i * 3 + 0];
718         int g = src[i * 3 + 1];
719         int b = src[i * 3 + 2];
720
721         dst[i] = ((ry*r + gy*g + by*b + (32<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6));
722     }
723 }
724
725 static void rgb24ToUV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
726                         const uint8_t *src2, int width, uint32_t *rgb2yuv)
727 {
728     int16_t *dstU = (int16_t *)_dstU;
729     int16_t *dstV = (int16_t *)_dstV;
730     int i;
731     int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
732     int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
733     av_assert1(src1 == src2);
734     for (i = 0; i < width; i++) {
735         int r = src1[3 * i + 0];
736         int g = src1[3 * i + 1];
737         int b = src1[3 * i + 2];
738
739         dstU[i] = (ru*r + gu*g + bu*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
740         dstV[i] = (rv*r + gv*g + bv*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
741     }
742 }
743
744 static void rgb24ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
745                              const uint8_t *src2, int width, uint32_t *rgb2yuv)
746 {
747     int16_t *dstU = (int16_t *)_dstU;
748     int16_t *dstV = (int16_t *)_dstV;
749     int i;
750     int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
751     int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
752     av_assert1(src1 == src2);
753     for (i = 0; i < width; i++) {
754         int r = src1[6 * i + 0] + src1[6 * i + 3];
755         int g = src1[6 * i + 1] + src1[6 * i + 4];
756         int b = src1[6 * i + 2] + src1[6 * i + 5];
757
758         dstU[i] = (ru*r + gu*g + bu*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
759         dstV[i] = (rv*r + gv*g + bv*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
760     }
761 }
762
763 static void planar_rgb_to_y(uint8_t *_dst, const uint8_t *src[4], int width, int32_t *rgb2yuv)
764 {
765     uint16_t *dst = (uint16_t *)_dst;
766     int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
767     int i;
768     for (i = 0; i < width; i++) {
769         int g = src[0][i];
770         int b = src[1][i];
771         int r = src[2][i];
772
773         dst[i] = (ry*r + gy*g + by*b + (0x801<<(RGB2YUV_SHIFT-7))) >> (RGB2YUV_SHIFT-6);
774     }
775 }
776
777 static void planar_rgb_to_a(uint8_t *_dst, const uint8_t *src[4], int width, int32_t *unused)
778 {
779     uint16_t *dst = (uint16_t *)_dst;
780     int i;
781     for (i = 0; i < width; i++)
782         dst[i] = src[3][i] << 6;
783 }
784
785 static void planar_rgb_to_uv(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *src[4], int width, int32_t *rgb2yuv)
786 {
787     uint16_t *dstU = (uint16_t *)_dstU;
788     uint16_t *dstV = (uint16_t *)_dstV;
789     int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
790     int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
791     int i;
792     for (i = 0; i < width; i++) {
793         int g = src[0][i];
794         int b = src[1][i];
795         int r = src[2][i];
796
797         dstU[i] = (ru*r + gu*g + bu*b + (0x4001<<(RGB2YUV_SHIFT-7))) >> (RGB2YUV_SHIFT-6);
798         dstV[i] = (rv*r + gv*g + bv*b + (0x4001<<(RGB2YUV_SHIFT-7))) >> (RGB2YUV_SHIFT-6);
799     }
800 }
801
802 #define rdpx(src) \
803     is_be ? AV_RB16(src) : AV_RL16(src)
804 static av_always_inline void planar_rgb16_to_y(uint8_t *_dst, const uint8_t *_src[4],
805                                                int width, int bpc, int is_be, int32_t *rgb2yuv)
806 {
807     int i;
808     const uint16_t **src = (const uint16_t **)_src;
809     uint16_t *dst        = (uint16_t *)_dst;
810     int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
811     int shift = bpc < 16 ? bpc : 14;
812     for (i = 0; i < width; i++) {
813         int g = rdpx(src[0] + i);
814         int b = rdpx(src[1] + i);
815         int r = rdpx(src[2] + i);
816
817         dst[i] = ((ry*r + gy*g + by*b + (33 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + shift - 14));
818     }
819 }
820
821 static av_always_inline void planar_rgb16_to_uv(uint8_t *_dstU, uint8_t *_dstV,
822                                                 const uint8_t *_src[4], int width,
823                                                 int bpc, int is_be, int32_t *rgb2yuv)
824 {
825     int i;
826     const uint16_t **src = (const uint16_t **)_src;
827     uint16_t *dstU       = (uint16_t *)_dstU;
828     uint16_t *dstV       = (uint16_t *)_dstV;
829     int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
830     int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
831     int shift = bpc < 16 ? bpc : 14;
832     for (i = 0; i < width; i++) {
833         int g = rdpx(src[0] + i);
834         int b = rdpx(src[1] + i);
835         int r = rdpx(src[2] + i);
836
837         dstU[i] = (ru*r + gu*g + bu*b + (257 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + shift - 14);
838         dstV[i] = (rv*r + gv*g + bv*b + (257 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + shift - 14);
839     }
840 }
841 #undef rdpx
842
843 #define rgb9plus_planar_funcs_endian(nbits, endian_name, endian)                                    \
844 static void planar_rgb##nbits##endian_name##_to_y(uint8_t *dst, const uint8_t *src[4],              \
845                                                   int w, int32_t *rgb2yuv)                          \
846 {                                                                                                   \
847     planar_rgb16_to_y(dst, src, w, nbits, endian, rgb2yuv);                                         \
848 }                                                                                                   \
849 static void planar_rgb##nbits##endian_name##_to_uv(uint8_t *dstU, uint8_t *dstV,                    \
850                                                    const uint8_t *src[4], int w, int32_t *rgb2yuv)  \
851 {                                                                                                   \
852     planar_rgb16_to_uv(dstU, dstV, src, w, nbits, endian, rgb2yuv);                                 \
853 }                                                                                                   \
854
855 #define rgb9plus_planar_funcs(nbits)            \
856     rgb9plus_planar_funcs_endian(nbits, le, 0)  \
857     rgb9plus_planar_funcs_endian(nbits, be, 1)
858
859 rgb9plus_planar_funcs(9)
860 rgb9plus_planar_funcs(10)
861 rgb9plus_planar_funcs(12)
862 rgb9plus_planar_funcs(14)
863 rgb9plus_planar_funcs(16)
864
865 av_cold void ff_sws_init_input_funcs(SwsContext *c)
866 {
867     enum AVPixelFormat srcFormat = c->srcFormat;
868
869     c->chrToYV12 = NULL;
870     switch (srcFormat) {
871     case AV_PIX_FMT_YUYV422:
872         c->chrToYV12 = yuy2ToUV_c;
873         break;
874     case AV_PIX_FMT_YVYU422:
875         c->chrToYV12 = yvy2ToUV_c;
876         break;
877     case AV_PIX_FMT_UYVY422:
878         c->chrToYV12 = uyvyToUV_c;
879         break;
880     case AV_PIX_FMT_NV12:
881         c->chrToYV12 = nv12ToUV_c;
882         break;
883     case AV_PIX_FMT_NV21:
884         c->chrToYV12 = nv21ToUV_c;
885         break;
886     case AV_PIX_FMT_RGB8:
887     case AV_PIX_FMT_BGR8:
888     case AV_PIX_FMT_PAL8:
889     case AV_PIX_FMT_BGR4_BYTE:
890     case AV_PIX_FMT_RGB4_BYTE:
891         c->chrToYV12 = palToUV_c;
892         break;
893     case AV_PIX_FMT_GBRP9LE:
894         c->readChrPlanar = planar_rgb9le_to_uv;
895         break;
896     case AV_PIX_FMT_GBRP10LE:
897         c->readChrPlanar = planar_rgb10le_to_uv;
898         break;
899     case AV_PIX_FMT_GBRP12LE:
900         c->readChrPlanar = planar_rgb12le_to_uv;
901         break;
902     case AV_PIX_FMT_GBRP14LE:
903         c->readChrPlanar = planar_rgb14le_to_uv;
904         break;
905     case AV_PIX_FMT_GBRAP16LE:
906     case AV_PIX_FMT_GBRP16LE:
907         c->readChrPlanar = planar_rgb16le_to_uv;
908         break;
909     case AV_PIX_FMT_GBRP9BE:
910         c->readChrPlanar = planar_rgb9be_to_uv;
911         break;
912     case AV_PIX_FMT_GBRP10BE:
913         c->readChrPlanar = planar_rgb10be_to_uv;
914         break;
915     case AV_PIX_FMT_GBRP12BE:
916         c->readChrPlanar = planar_rgb12be_to_uv;
917         break;
918     case AV_PIX_FMT_GBRP14BE:
919         c->readChrPlanar = planar_rgb14be_to_uv;
920         break;
921     case AV_PIX_FMT_GBRAP16BE:
922     case AV_PIX_FMT_GBRP16BE:
923         c->readChrPlanar = planar_rgb16be_to_uv;
924         break;
925     case AV_PIX_FMT_GBRAP:
926     case AV_PIX_FMT_GBRP:
927         c->readChrPlanar = planar_rgb_to_uv;
928         break;
929 #if HAVE_BIGENDIAN
930     case AV_PIX_FMT_YUV444P9LE:
931     case AV_PIX_FMT_YUV422P9LE:
932     case AV_PIX_FMT_YUV420P9LE:
933     case AV_PIX_FMT_YUV422P10LE:
934     case AV_PIX_FMT_YUV444P10LE:
935     case AV_PIX_FMT_YUV420P10LE:
936     case AV_PIX_FMT_YUV422P12LE:
937     case AV_PIX_FMT_YUV444P12LE:
938     case AV_PIX_FMT_YUV420P12LE:
939     case AV_PIX_FMT_YUV422P14LE:
940     case AV_PIX_FMT_YUV444P14LE:
941     case AV_PIX_FMT_YUV420P14LE:
942     case AV_PIX_FMT_YUV420P16LE:
943     case AV_PIX_FMT_YUV422P16LE:
944     case AV_PIX_FMT_YUV444P16LE:
945
946     case AV_PIX_FMT_YUVA444P9LE:
947     case AV_PIX_FMT_YUVA422P9LE:
948     case AV_PIX_FMT_YUVA420P9LE:
949     case AV_PIX_FMT_YUVA444P10LE:
950     case AV_PIX_FMT_YUVA422P10LE:
951     case AV_PIX_FMT_YUVA420P10LE:
952     case AV_PIX_FMT_YUVA420P16LE:
953     case AV_PIX_FMT_YUVA422P16LE:
954     case AV_PIX_FMT_YUVA444P16LE:
955         c->chrToYV12 = bswap16UV_c;
956         break;
957 #else
958     case AV_PIX_FMT_YUV444P9BE:
959     case AV_PIX_FMT_YUV422P9BE:
960     case AV_PIX_FMT_YUV420P9BE:
961     case AV_PIX_FMT_YUV444P10BE:
962     case AV_PIX_FMT_YUV422P10BE:
963     case AV_PIX_FMT_YUV420P10BE:
964     case AV_PIX_FMT_YUV444P12BE:
965     case AV_PIX_FMT_YUV422P12BE:
966     case AV_PIX_FMT_YUV420P12BE:
967     case AV_PIX_FMT_YUV444P14BE:
968     case AV_PIX_FMT_YUV422P14BE:
969     case AV_PIX_FMT_YUV420P14BE:
970     case AV_PIX_FMT_YUV420P16BE:
971     case AV_PIX_FMT_YUV422P16BE:
972     case AV_PIX_FMT_YUV444P16BE:
973
974     case AV_PIX_FMT_YUVA444P9BE:
975     case AV_PIX_FMT_YUVA422P9BE:
976     case AV_PIX_FMT_YUVA420P9BE:
977     case AV_PIX_FMT_YUVA444P10BE:
978     case AV_PIX_FMT_YUVA422P10BE:
979     case AV_PIX_FMT_YUVA420P10BE:
980     case AV_PIX_FMT_YUVA420P16BE:
981     case AV_PIX_FMT_YUVA422P16BE:
982     case AV_PIX_FMT_YUVA444P16BE:
983         c->chrToYV12 = bswap16UV_c;
984         break;
985 #endif
986     }
987     if (c->chrSrcHSubSample) {
988         switch (srcFormat) {
989         case AV_PIX_FMT_RGBA64BE:
990             c->chrToYV12 = rgb64BEToUV_half_c;
991             break;
992         case AV_PIX_FMT_RGBA64LE:
993             c->chrToYV12 = rgb64LEToUV_half_c;
994             break;
995         case AV_PIX_FMT_BGRA64BE:
996             c->chrToYV12 = bgr64BEToUV_half_c;
997             break;
998         case AV_PIX_FMT_BGRA64LE:
999             c->chrToYV12 = bgr64LEToUV_half_c;
1000             break;
1001         case AV_PIX_FMT_RGB48BE:
1002             c->chrToYV12 = rgb48BEToUV_half_c;
1003             break;
1004         case AV_PIX_FMT_RGB48LE:
1005             c->chrToYV12 = rgb48LEToUV_half_c;
1006             break;
1007         case AV_PIX_FMT_BGR48BE:
1008             c->chrToYV12 = bgr48BEToUV_half_c;
1009             break;
1010         case AV_PIX_FMT_BGR48LE:
1011             c->chrToYV12 = bgr48LEToUV_half_c;
1012             break;
1013         case AV_PIX_FMT_RGB32:
1014             c->chrToYV12 = bgr32ToUV_half_c;
1015             break;
1016         case AV_PIX_FMT_RGB32_1:
1017             c->chrToYV12 = bgr321ToUV_half_c;
1018             break;
1019         case AV_PIX_FMT_BGR24:
1020             c->chrToYV12 = bgr24ToUV_half_c;
1021             break;
1022         case AV_PIX_FMT_BGR565LE:
1023             c->chrToYV12 = bgr16leToUV_half_c;
1024             break;
1025         case AV_PIX_FMT_BGR565BE:
1026             c->chrToYV12 = bgr16beToUV_half_c;
1027             break;
1028         case AV_PIX_FMT_BGR555LE:
1029             c->chrToYV12 = bgr15leToUV_half_c;
1030             break;
1031         case AV_PIX_FMT_BGR555BE:
1032             c->chrToYV12 = bgr15beToUV_half_c;
1033             break;
1034         case AV_PIX_FMT_GBRAP:
1035         case AV_PIX_FMT_GBRP:
1036             c->chrToYV12 = gbr24pToUV_half_c;
1037             break;
1038         case AV_PIX_FMT_BGR444LE:
1039             c->chrToYV12 = bgr12leToUV_half_c;
1040             break;
1041         case AV_PIX_FMT_BGR444BE:
1042             c->chrToYV12 = bgr12beToUV_half_c;
1043             break;
1044         case AV_PIX_FMT_BGR32:
1045             c->chrToYV12 = rgb32ToUV_half_c;
1046             break;
1047         case AV_PIX_FMT_BGR32_1:
1048             c->chrToYV12 = rgb321ToUV_half_c;
1049             break;
1050         case AV_PIX_FMT_RGB24:
1051             c->chrToYV12 = rgb24ToUV_half_c;
1052             break;
1053         case AV_PIX_FMT_RGB565LE:
1054             c->chrToYV12 = rgb16leToUV_half_c;
1055             break;
1056         case AV_PIX_FMT_RGB565BE:
1057             c->chrToYV12 = rgb16beToUV_half_c;
1058             break;
1059         case AV_PIX_FMT_RGB555LE:
1060             c->chrToYV12 = rgb15leToUV_half_c;
1061             break;
1062         case AV_PIX_FMT_RGB555BE:
1063             c->chrToYV12 = rgb15beToUV_half_c;
1064             break;
1065         case AV_PIX_FMT_RGB444LE:
1066             c->chrToYV12 = rgb12leToUV_half_c;
1067             break;
1068         case AV_PIX_FMT_RGB444BE:
1069             c->chrToYV12 = rgb12beToUV_half_c;
1070             break;
1071         }
1072     } else {
1073         switch (srcFormat) {
1074         case AV_PIX_FMT_RGBA64BE:
1075             c->chrToYV12 = rgb64BEToUV_c;
1076             break;
1077         case AV_PIX_FMT_RGBA64LE:
1078             c->chrToYV12 = rgb64LEToUV_c;
1079             break;
1080         case AV_PIX_FMT_BGRA64BE:
1081             c->chrToYV12 = bgr64BEToUV_c;
1082             break;
1083         case AV_PIX_FMT_BGRA64LE:
1084             c->chrToYV12 = bgr64LEToUV_c;
1085             break;
1086         case AV_PIX_FMT_RGB48BE:
1087             c->chrToYV12 = rgb48BEToUV_c;
1088             break;
1089         case AV_PIX_FMT_RGB48LE:
1090             c->chrToYV12 = rgb48LEToUV_c;
1091             break;
1092         case AV_PIX_FMT_BGR48BE:
1093             c->chrToYV12 = bgr48BEToUV_c;
1094             break;
1095         case AV_PIX_FMT_BGR48LE:
1096             c->chrToYV12 = bgr48LEToUV_c;
1097             break;
1098         case AV_PIX_FMT_RGB32:
1099             c->chrToYV12 = bgr32ToUV_c;
1100             break;
1101         case AV_PIX_FMT_RGB32_1:
1102             c->chrToYV12 = bgr321ToUV_c;
1103             break;
1104         case AV_PIX_FMT_BGR24:
1105             c->chrToYV12 = bgr24ToUV_c;
1106             break;
1107         case AV_PIX_FMT_BGR565LE:
1108             c->chrToYV12 = bgr16leToUV_c;
1109             break;
1110         case AV_PIX_FMT_BGR565BE:
1111             c->chrToYV12 = bgr16beToUV_c;
1112             break;
1113         case AV_PIX_FMT_BGR555LE:
1114             c->chrToYV12 = bgr15leToUV_c;
1115             break;
1116         case AV_PIX_FMT_BGR555BE:
1117             c->chrToYV12 = bgr15beToUV_c;
1118             break;
1119         case AV_PIX_FMT_BGR444LE:
1120             c->chrToYV12 = bgr12leToUV_c;
1121             break;
1122         case AV_PIX_FMT_BGR444BE:
1123             c->chrToYV12 = bgr12beToUV_c;
1124             break;
1125         case AV_PIX_FMT_BGR32:
1126             c->chrToYV12 = rgb32ToUV_c;
1127             break;
1128         case AV_PIX_FMT_BGR32_1:
1129             c->chrToYV12 = rgb321ToUV_c;
1130             break;
1131         case AV_PIX_FMT_RGB24:
1132             c->chrToYV12 = rgb24ToUV_c;
1133             break;
1134         case AV_PIX_FMT_RGB565LE:
1135             c->chrToYV12 = rgb16leToUV_c;
1136             break;
1137         case AV_PIX_FMT_RGB565BE:
1138             c->chrToYV12 = rgb16beToUV_c;
1139             break;
1140         case AV_PIX_FMT_RGB555LE:
1141             c->chrToYV12 = rgb15leToUV_c;
1142             break;
1143         case AV_PIX_FMT_RGB555BE:
1144             c->chrToYV12 = rgb15beToUV_c;
1145             break;
1146         case AV_PIX_FMT_RGB444LE:
1147             c->chrToYV12 = rgb12leToUV_c;
1148             break;
1149         case AV_PIX_FMT_RGB444BE:
1150             c->chrToYV12 = rgb12beToUV_c;
1151             break;
1152         }
1153     }
1154
1155     c->lumToYV12 = NULL;
1156     c->alpToYV12 = NULL;
1157     switch (srcFormat) {
1158     case AV_PIX_FMT_GBRP9LE:
1159         c->readLumPlanar = planar_rgb9le_to_y;
1160         break;
1161     case AV_PIX_FMT_GBRP10LE:
1162         c->readLumPlanar = planar_rgb10le_to_y;
1163         break;
1164     case AV_PIX_FMT_GBRP12LE:
1165         c->readLumPlanar = planar_rgb12le_to_y;
1166         break;
1167     case AV_PIX_FMT_GBRP14LE:
1168         c->readLumPlanar = planar_rgb14le_to_y;
1169         break;
1170     case AV_PIX_FMT_GBRAP16LE:
1171     case AV_PIX_FMT_GBRP16LE:
1172         c->readLumPlanar = planar_rgb16le_to_y;
1173         break;
1174     case AV_PIX_FMT_GBRP9BE:
1175         c->readLumPlanar = planar_rgb9be_to_y;
1176         break;
1177     case AV_PIX_FMT_GBRP10BE:
1178         c->readLumPlanar = planar_rgb10be_to_y;
1179         break;
1180     case AV_PIX_FMT_GBRP12BE:
1181         c->readLumPlanar = planar_rgb12be_to_y;
1182         break;
1183     case AV_PIX_FMT_GBRP14BE:
1184         c->readLumPlanar = planar_rgb14be_to_y;
1185         break;
1186     case AV_PIX_FMT_GBRAP16BE:
1187     case AV_PIX_FMT_GBRP16BE:
1188         c->readLumPlanar = planar_rgb16be_to_y;
1189         break;
1190     case AV_PIX_FMT_GBRAP:
1191         c->readAlpPlanar = planar_rgb_to_a;
1192     case AV_PIX_FMT_GBRP:
1193         c->readLumPlanar = planar_rgb_to_y;
1194         break;
1195 #if HAVE_BIGENDIAN
1196     case AV_PIX_FMT_YUV444P9LE:
1197     case AV_PIX_FMT_YUV422P9LE:
1198     case AV_PIX_FMT_YUV420P9LE:
1199     case AV_PIX_FMT_YUV444P10LE:
1200     case AV_PIX_FMT_YUV422P10LE:
1201     case AV_PIX_FMT_YUV420P10LE:
1202     case AV_PIX_FMT_YUV444P12LE:
1203     case AV_PIX_FMT_YUV422P12LE:
1204     case AV_PIX_FMT_YUV420P12LE:
1205     case AV_PIX_FMT_YUV444P14LE:
1206     case AV_PIX_FMT_YUV422P14LE:
1207     case AV_PIX_FMT_YUV420P14LE:
1208     case AV_PIX_FMT_YUV420P16LE:
1209     case AV_PIX_FMT_YUV422P16LE:
1210     case AV_PIX_FMT_YUV444P16LE:
1211
1212     case AV_PIX_FMT_GRAY16LE:
1213         c->lumToYV12 = bswap16Y_c;
1214         break;
1215     case AV_PIX_FMT_YUVA444P9LE:
1216     case AV_PIX_FMT_YUVA422P9LE:
1217     case AV_PIX_FMT_YUVA420P9LE:
1218     case AV_PIX_FMT_YUVA444P10LE:
1219     case AV_PIX_FMT_YUVA422P10LE:
1220     case AV_PIX_FMT_YUVA420P10LE:
1221     case AV_PIX_FMT_YUVA420P16LE:
1222     case AV_PIX_FMT_YUVA422P16LE:
1223     case AV_PIX_FMT_YUVA444P16LE:
1224         c->lumToYV12 = bswap16Y_c;
1225         c->alpToYV12 = bswap16Y_c;
1226         break;
1227 #else
1228     case AV_PIX_FMT_YUV444P9BE:
1229     case AV_PIX_FMT_YUV422P9BE:
1230     case AV_PIX_FMT_YUV420P9BE:
1231     case AV_PIX_FMT_YUV444P10BE:
1232     case AV_PIX_FMT_YUV422P10BE:
1233     case AV_PIX_FMT_YUV420P10BE:
1234     case AV_PIX_FMT_YUV444P12BE:
1235     case AV_PIX_FMT_YUV422P12BE:
1236     case AV_PIX_FMT_YUV420P12BE:
1237     case AV_PIX_FMT_YUV444P14BE:
1238     case AV_PIX_FMT_YUV422P14BE:
1239     case AV_PIX_FMT_YUV420P14BE:
1240     case AV_PIX_FMT_YUV420P16BE:
1241     case AV_PIX_FMT_YUV422P16BE:
1242     case AV_PIX_FMT_YUV444P16BE:
1243
1244     case AV_PIX_FMT_GRAY16BE:
1245         c->lumToYV12 = bswap16Y_c;
1246         break;
1247     case AV_PIX_FMT_YUVA444P9BE:
1248     case AV_PIX_FMT_YUVA422P9BE:
1249     case AV_PIX_FMT_YUVA420P9BE:
1250     case AV_PIX_FMT_YUVA444P10BE:
1251     case AV_PIX_FMT_YUVA422P10BE:
1252     case AV_PIX_FMT_YUVA420P10BE:
1253     case AV_PIX_FMT_YUVA420P16BE:
1254     case AV_PIX_FMT_YUVA422P16BE:
1255     case AV_PIX_FMT_YUVA444P16BE:
1256         c->lumToYV12 = bswap16Y_c;
1257         c->alpToYV12 = bswap16Y_c;
1258         break;
1259 #endif
1260     case AV_PIX_FMT_YA16LE:
1261         c->lumToYV12 = read_ya16le_gray_c;
1262         break;
1263     case AV_PIX_FMT_YA16BE:
1264         c->lumToYV12 = read_ya16be_gray_c;
1265         break;
1266     case AV_PIX_FMT_YUYV422:
1267     case AV_PIX_FMT_YVYU422:
1268     case AV_PIX_FMT_YA8:
1269         c->lumToYV12 = yuy2ToY_c;
1270         break;
1271     case AV_PIX_FMT_UYVY422:
1272         c->lumToYV12 = uyvyToY_c;
1273         break;
1274     case AV_PIX_FMT_BGR24:
1275         c->lumToYV12 = bgr24ToY_c;
1276         break;
1277     case AV_PIX_FMT_BGR565LE:
1278         c->lumToYV12 = bgr16leToY_c;
1279         break;
1280     case AV_PIX_FMT_BGR565BE:
1281         c->lumToYV12 = bgr16beToY_c;
1282         break;
1283     case AV_PIX_FMT_BGR555LE:
1284         c->lumToYV12 = bgr15leToY_c;
1285         break;
1286     case AV_PIX_FMT_BGR555BE:
1287         c->lumToYV12 = bgr15beToY_c;
1288         break;
1289     case AV_PIX_FMT_BGR444LE:
1290         c->lumToYV12 = bgr12leToY_c;
1291         break;
1292     case AV_PIX_FMT_BGR444BE:
1293         c->lumToYV12 = bgr12beToY_c;
1294         break;
1295     case AV_PIX_FMT_RGB24:
1296         c->lumToYV12 = rgb24ToY_c;
1297         break;
1298     case AV_PIX_FMT_RGB565LE:
1299         c->lumToYV12 = rgb16leToY_c;
1300         break;
1301     case AV_PIX_FMT_RGB565BE:
1302         c->lumToYV12 = rgb16beToY_c;
1303         break;
1304     case AV_PIX_FMT_RGB555LE:
1305         c->lumToYV12 = rgb15leToY_c;
1306         break;
1307     case AV_PIX_FMT_RGB555BE:
1308         c->lumToYV12 = rgb15beToY_c;
1309         break;
1310     case AV_PIX_FMT_RGB444LE:
1311         c->lumToYV12 = rgb12leToY_c;
1312         break;
1313     case AV_PIX_FMT_RGB444BE:
1314         c->lumToYV12 = rgb12beToY_c;
1315         break;
1316     case AV_PIX_FMT_RGB8:
1317     case AV_PIX_FMT_BGR8:
1318     case AV_PIX_FMT_PAL8:
1319     case AV_PIX_FMT_BGR4_BYTE:
1320     case AV_PIX_FMT_RGB4_BYTE:
1321         c->lumToYV12 = palToY_c;
1322         break;
1323     case AV_PIX_FMT_MONOBLACK:
1324         c->lumToYV12 = monoblack2Y_c;
1325         break;
1326     case AV_PIX_FMT_MONOWHITE:
1327         c->lumToYV12 = monowhite2Y_c;
1328         break;
1329     case AV_PIX_FMT_RGB32:
1330         c->lumToYV12 = bgr32ToY_c;
1331         break;
1332     case AV_PIX_FMT_RGB32_1:
1333         c->lumToYV12 = bgr321ToY_c;
1334         break;
1335     case AV_PIX_FMT_BGR32:
1336         c->lumToYV12 = rgb32ToY_c;
1337         break;
1338     case AV_PIX_FMT_BGR32_1:
1339         c->lumToYV12 = rgb321ToY_c;
1340         break;
1341     case AV_PIX_FMT_RGB48BE:
1342         c->lumToYV12 = rgb48BEToY_c;
1343         break;
1344     case AV_PIX_FMT_RGB48LE:
1345         c->lumToYV12 = rgb48LEToY_c;
1346         break;
1347     case AV_PIX_FMT_BGR48BE:
1348         c->lumToYV12 = bgr48BEToY_c;
1349         break;
1350     case AV_PIX_FMT_BGR48LE:
1351         c->lumToYV12 = bgr48LEToY_c;
1352         break;
1353     case AV_PIX_FMT_RGBA64BE:
1354         c->lumToYV12 = rgb64BEToY_c;
1355         break;
1356     case AV_PIX_FMT_RGBA64LE:
1357         c->lumToYV12 = rgb64LEToY_c;
1358         break;
1359     case AV_PIX_FMT_BGRA64BE:
1360         c->lumToYV12 = bgr64BEToY_c;
1361         break;
1362     case AV_PIX_FMT_BGRA64LE:
1363         c->lumToYV12 = bgr64LEToY_c;
1364     }
1365     if (c->alpPixBuf) {
1366         if (is16BPS(srcFormat) || isNBPS(srcFormat)) {
1367             if (HAVE_BIGENDIAN == !isBE(srcFormat))
1368                 c->alpToYV12 = bswap16Y_c;
1369         }
1370         switch (srcFormat) {
1371         case AV_PIX_FMT_BGRA64LE:
1372         case AV_PIX_FMT_RGBA64LE:  c->alpToYV12 = rgba64leToA_c; break;
1373         case AV_PIX_FMT_BGRA64BE:
1374         case AV_PIX_FMT_RGBA64BE:  c->alpToYV12 = rgba64beToA_c; break;
1375         case AV_PIX_FMT_BGRA:
1376         case AV_PIX_FMT_RGBA:
1377             c->alpToYV12 = rgbaToA_c;
1378             break;
1379         case AV_PIX_FMT_ABGR:
1380         case AV_PIX_FMT_ARGB:
1381             c->alpToYV12 = abgrToA_c;
1382             break;
1383         case AV_PIX_FMT_YA8:
1384             c->alpToYV12 = uyvyToY_c;
1385             break;
1386         case AV_PIX_FMT_YA16LE:
1387             c->alpToYV12 = read_ya16le_alpha_c;
1388             break;
1389         case AV_PIX_FMT_YA16BE:
1390             c->alpToYV12 = read_ya16be_alpha_c;
1391             break;
1392         case AV_PIX_FMT_PAL8 :
1393             c->alpToYV12 = palToA_c;
1394             break;
1395         }
1396     }
1397 }