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