swscale: Add GRAY10
[libav.git] / libswscale / input.c
CommitLineData
2dd7a1c0
RB
1/*
2 * Copyright (C) 2001-2003 Michael Niedermayer <michaelni@gmx.at>
3 *
4 * This file is part of Libav.
5 *
6 * Libav 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 * Libav 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 Libav; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21#include <assert.h>
22#include <math.h>
23#include <stdint.h>
24#include <stdio.h>
25#include <string.h>
26
27#include "libavutil/avutil.h"
28#include "libavutil/bswap.h"
29#include "libavutil/cpu.h"
30#include "libavutil/intreadwrite.h"
31#include "libavutil/mathematics.h"
32#include "libavutil/pixdesc.h"
33#include "config.h"
34#include "rgb2rgb.h"
35#include "swscale.h"
36#include "swscale_internal.h"
37
38#define RGB2YUV_SHIFT 15
9b75ae05
DB
39#define BY ((int)(0.114 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
40#define BV (-(int)(0.081 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
41#define BU ((int)(0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
42#define GY ((int)(0.587 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
43#define GV (-(int)(0.419 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
44#define GU (-(int)(0.331 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
45#define RY ((int)(0.299 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
46#define RV ((int)(0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
47#define RU (-(int)(0.169 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
2dd7a1c0
RB
48
49#define input_pixel(pos) (isBE(origin) ? AV_RB16(pos) : AV_RL16(pos))
50
716d413c
AK
51#define r ((origin == AV_PIX_FMT_BGR48BE || origin == AV_PIX_FMT_BGR48LE) ? b_r : r_b)
52#define b ((origin == AV_PIX_FMT_BGR48BE || origin == AV_PIX_FMT_BGR48LE) ? r_b : b_r)
2dd7a1c0 53
9b75ae05
DB
54static av_always_inline void rgb48ToY_c_template(uint16_t *dst,
55 const uint16_t *src, int width,
716d413c 56 enum AVPixelFormat origin)
2dd7a1c0
RB
57{
58 int i;
59 for (i = 0; i < width; i++) {
9b75ae05
DB
60 unsigned int r_b = input_pixel(&src[i * 3 + 0]);
61 unsigned int g = input_pixel(&src[i * 3 + 1]);
62 unsigned int b_r = input_pixel(&src[i * 3 + 2]);
2dd7a1c0 63
9b75ae05 64 dst[i] = (RY * r + GY * g + BY * b + (0x2001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
2dd7a1c0
RB
65 }
66}
67
9b75ae05
DB
68static av_always_inline void rgb48ToUV_c_template(uint16_t *dstU,
69 uint16_t *dstV,
70 const uint16_t *src1,
71 const uint16_t *src2,
72 int width,
716d413c 73 enum AVPixelFormat origin)
2dd7a1c0
RB
74{
75 int i;
9b75ae05 76 assert(src1 == src2);
2dd7a1c0 77 for (i = 0; i < width; i++) {
9b75ae05
DB
78 int r_b = input_pixel(&src1[i * 3 + 0]);
79 int g = input_pixel(&src1[i * 3 + 1]);
80 int b_r = input_pixel(&src1[i * 3 + 2]);
2dd7a1c0 81
9b75ae05
DB
82 dstU[i] = (RU * r + GU * g + BU * b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
83 dstV[i] = (RV * r + GV * g + BV * b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
2dd7a1c0
RB
84 }
85}
86
9b75ae05
DB
87static av_always_inline void rgb48ToUV_half_c_template(uint16_t *dstU,
88 uint16_t *dstV,
89 const uint16_t *src1,
90 const uint16_t *src2,
91 int width,
716d413c 92 enum AVPixelFormat origin)
2dd7a1c0
RB
93{
94 int i;
9b75ae05 95 assert(src1 == src2);
2dd7a1c0 96 for (i = 0; i < width; i++) {
9b75ae05
DB
97 int r_b = (input_pixel(&src1[6 * i + 0]) +
98 input_pixel(&src1[6 * i + 3]) + 1) >> 1;
99 int g = (input_pixel(&src1[6 * i + 1]) +
100 input_pixel(&src1[6 * i + 4]) + 1) >> 1;
101 int b_r = (input_pixel(&src1[6 * i + 2]) +
102 input_pixel(&src1[6 * i + 5]) + 1) >> 1;
2dd7a1c0 103
9b75ae05
DB
104 dstU[i] = (RU * r + GU * g + BU * b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
105 dstV[i] = (RV * r + GV * g + BV * b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
2dd7a1c0
RB
106 }
107}
108
109#undef r
110#undef b
111#undef input_pixel
112
9b75ae05
DB
113#define rgb48funcs(pattern, BE_LE, origin) \
114static void pattern ## 48 ## BE_LE ## ToY_c(uint8_t *_dst, \
115 const uint8_t *_src, \
116 int width, \
117 uint32_t *unused) \
118{ \
119 const uint16_t *src = (const uint16_t *)_src; \
120 uint16_t *dst = (uint16_t *)_dst; \
121 rgb48ToY_c_template(dst, src, width, origin); \
122} \
123 \
124static void pattern ## 48 ## BE_LE ## ToUV_c(uint8_t *_dstU, \
125 uint8_t *_dstV, \
126 const uint8_t *_src1, \
127 const uint8_t *_src2, \
128 int width, \
129 uint32_t *unused) \
130{ \
131 const uint16_t *src1 = (const uint16_t *)_src1, \
132 *src2 = (const uint16_t *)_src2; \
133 uint16_t *dstU = (uint16_t *)_dstU, \
134 *dstV = (uint16_t *)_dstV; \
135 rgb48ToUV_c_template(dstU, dstV, src1, src2, width, origin); \
136} \
137 \
138static void pattern ## 48 ## BE_LE ## ToUV_half_c(uint8_t *_dstU, \
139 uint8_t *_dstV, \
140 const uint8_t *_src1, \
141 const uint8_t *_src2, \
142 int width, \
143 uint32_t *unused) \
144{ \
145 const uint16_t *src1 = (const uint16_t *)_src1, \
146 *src2 = (const uint16_t *)_src2; \
147 uint16_t *dstU = (uint16_t *)_dstU, \
148 *dstV = (uint16_t *)_dstV; \
149 rgb48ToUV_half_c_template(dstU, dstV, src1, src2, width, origin); \
2dd7a1c0
RB
150}
151
716d413c
AK
152rgb48funcs(rgb, LE, AV_PIX_FMT_RGB48LE)
153rgb48funcs(rgb, BE, AV_PIX_FMT_RGB48BE)
154rgb48funcs(bgr, LE, AV_PIX_FMT_BGR48LE)
155rgb48funcs(bgr, BE, AV_PIX_FMT_BGR48BE)
2dd7a1c0 156
716d413c
AK
157#define input_pixel(i) ((origin == AV_PIX_FMT_RGBA || \
158 origin == AV_PIX_FMT_BGRA || \
159 origin == AV_PIX_FMT_ARGB || \
160 origin == AV_PIX_FMT_ABGR) \
9b75ae05
DB
161 ? AV_RN32A(&src[(i) * 4]) \
162 : (isBE(origin) ? AV_RB16(&src[(i) * 2]) \
163 : AV_RL16(&src[(i) * 2])))
164
165static av_always_inline void rgb16_32ToY_c_template(uint8_t *dst,
166 const uint8_t *src,
167 int width,
716d413c 168 enum AVPixelFormat origin,
9b75ae05
DB
169 int shr, int shg,
170 int shb, int shp,
171 int maskr, int maskg,
172 int maskb, int rsh,
173 int gsh, int bsh, int S)
174{
175 const int ry = RY << rsh, gy = GY << gsh, by = BY << bsh;
2dd7a1c0
RB
176 const unsigned rnd = 33u << (S - 1);
177 int i;
178
179 for (i = 0; i < width; i++) {
180 int px = input_pixel(i) >> shp;
9b75ae05
DB
181 int b = (px & maskb) >> shb;
182 int g = (px & maskg) >> shg;
183 int r = (px & maskr) >> shr;
2dd7a1c0
RB
184
185 dst[i] = (ry * r + gy * g + by * b + rnd) >> S;
186 }
187}
188
9b75ae05
DB
189static av_always_inline void rgb16_32ToUV_c_template(uint8_t *dstU,
190 uint8_t *dstV,
191 const uint8_t *src,
192 int width,
716d413c 193 enum AVPixelFormat origin,
9b75ae05
DB
194 int shr, int shg,
195 int shb, int shp,
196 int maskr, int maskg,
197 int maskb, int rsh,
198 int gsh, int bsh, int S)
2dd7a1c0 199{
9b75ae05
DB
200 const int ru = RU << rsh, gu = GU << gsh, bu = BU << bsh,
201 rv = RV << rsh, gv = GV << gsh, bv = BV << bsh;
2dd7a1c0
RB
202 const unsigned rnd = 257u << (S - 1);
203 int i;
204
205 for (i = 0; i < width; i++) {
206 int px = input_pixel(i) >> shp;
9b75ae05
DB
207 int b = (px & maskb) >> shb;
208 int g = (px & maskg) >> shg;
209 int r = (px & maskr) >> shr;
2dd7a1c0
RB
210
211 dstU[i] = (ru * r + gu * g + bu * b + rnd) >> S;
212 dstV[i] = (rv * r + gv * g + bv * b + rnd) >> S;
213 }
214}
215
9b75ae05
DB
216static av_always_inline void rgb16_32ToUV_half_c_template(uint8_t *dstU,
217 uint8_t *dstV,
218 const uint8_t *src,
219 int width,
716d413c 220 enum AVPixelFormat origin,
9b75ae05
DB
221 int shr, int shg,
222 int shb, int shp,
223 int maskr, int maskg,
224 int maskb, int rsh,
225 int gsh, int bsh, int S)
2dd7a1c0 226{
9b75ae05
DB
227 const int ru = RU << rsh, gu = GU << gsh, bu = BU << bsh,
228 rv = RV << rsh, gv = GV << gsh, bv = BV << bsh,
229 maskgx = ~(maskr | maskb);
2dd7a1c0
RB
230 const unsigned rnd = 257u << S;
231 int i;
232
9b75ae05
DB
233 maskr |= maskr << 1;
234 maskb |= maskb << 1;
235 maskg |= maskg << 1;
2dd7a1c0
RB
236 for (i = 0; i < width; i++) {
237 int px0 = input_pixel(2 * i + 0) >> shp;
238 int px1 = input_pixel(2 * i + 1) >> shp;
239 int b, r, g = (px0 & maskgx) + (px1 & maskgx);
240 int rb = px0 + px1 - g;
241
242 b = (rb & maskb) >> shb;
9b75ae05 243 if (shp ||
716d413c
AK
244 origin == AV_PIX_FMT_BGR565LE || origin == AV_PIX_FMT_BGR565BE ||
245 origin == AV_PIX_FMT_RGB565LE || origin == AV_PIX_FMT_RGB565BE) {
2dd7a1c0
RB
246 g >>= shg;
247 } else {
9b75ae05 248 g = (g & maskg) >> shg;
2dd7a1c0
RB
249 }
250 r = (rb & maskr) >> shr;
251
252 dstU[i] = (ru * r + gu * g + bu * b + rnd) >> (S + 1);
253 dstV[i] = (rv * r + gv * g + bv * b + rnd) >> (S + 1);
254 }
255}
256
257#undef input_pixel
258
9b75ae05
DB
259#define rgb16_32_wrapper(fmt, name, shr, shg, shb, shp, maskr, \
260 maskg, maskb, rsh, gsh, bsh, S) \
261static void name ## ToY_c(uint8_t *dst, const uint8_t *src, \
262 int width, uint32_t *unused) \
263{ \
264 rgb16_32ToY_c_template(dst, src, width, fmt, shr, shg, shb, shp, \
265 maskr, maskg, maskb, rsh, gsh, bsh, S); \
266} \
267 \
268static void name ## ToUV_c(uint8_t *dstU, uint8_t *dstV, \
269 const uint8_t *src, const uint8_t *dummy, \
270 int width, uint32_t *unused) \
271{ \
272 rgb16_32ToUV_c_template(dstU, dstV, src, width, fmt, \
273 shr, shg, shb, shp, \
274 maskr, maskg, maskb, rsh, gsh, bsh, S); \
275} \
276 \
277static void name ## ToUV_half_c(uint8_t *dstU, uint8_t *dstV, \
278 const uint8_t *src, \
279 const uint8_t *dummy, \
280 int width, uint32_t *unused) \
281{ \
282 rgb16_32ToUV_half_c_template(dstU, dstV, src, width, fmt, \
283 shr, shg, shb, shp, \
284 maskr, maskg, maskb, \
285 rsh, gsh, bsh, S); \
286}
287
716d413c
AK
288rgb16_32_wrapper(AV_PIX_FMT_BGR32, bgr32, 16, 0, 0, 0, 0xFF0000, 0xFF00, 0x00FF, 8, 0, 8, RGB2YUV_SHIFT + 8)
289rgb16_32_wrapper(AV_PIX_FMT_BGR32_1, bgr321, 16, 0, 0, 8, 0xFF0000, 0xFF00, 0x00FF, 8, 0, 8, RGB2YUV_SHIFT + 8)
290rgb16_32_wrapper(AV_PIX_FMT_RGB32, rgb32, 0, 0, 16, 0, 0x00FF, 0xFF00, 0xFF0000, 8, 0, 8, RGB2YUV_SHIFT + 8)
291rgb16_32_wrapper(AV_PIX_FMT_RGB32_1, rgb321, 0, 0, 16, 8, 0x00FF, 0xFF00, 0xFF0000, 8, 0, 8, RGB2YUV_SHIFT + 8)
292rgb16_32_wrapper(AV_PIX_FMT_BGR565LE, bgr16le, 0, 0, 0, 0, 0x001F, 0x07E0, 0xF800, 11, 5, 0, RGB2YUV_SHIFT + 8)
293rgb16_32_wrapper(AV_PIX_FMT_BGR555LE, bgr15le, 0, 0, 0, 0, 0x001F, 0x03E0, 0x7C00, 10, 5, 0, RGB2YUV_SHIFT + 7)
294rgb16_32_wrapper(AV_PIX_FMT_BGR444LE, bgr12le, 0, 0, 0, 0, 0x000F, 0x00F0, 0x0F00, 8, 4, 0, RGB2YUV_SHIFT + 4)
295rgb16_32_wrapper(AV_PIX_FMT_RGB565LE, rgb16le, 0, 0, 0, 0, 0xF800, 0x07E0, 0x001F, 0, 5, 11, RGB2YUV_SHIFT + 8)
296rgb16_32_wrapper(AV_PIX_FMT_RGB555LE, rgb15le, 0, 0, 0, 0, 0x7C00, 0x03E0, 0x001F, 0, 5, 10, RGB2YUV_SHIFT + 7)
297rgb16_32_wrapper(AV_PIX_FMT_RGB444LE, rgb12le, 0, 0, 0, 0, 0x0F00, 0x00F0, 0x000F, 0, 4, 8, RGB2YUV_SHIFT + 4)
298rgb16_32_wrapper(AV_PIX_FMT_BGR565BE, bgr16be, 0, 0, 0, 0, 0x001F, 0x07E0, 0xF800, 11, 5, 0, RGB2YUV_SHIFT + 8)
299rgb16_32_wrapper(AV_PIX_FMT_BGR555BE, bgr15be, 0, 0, 0, 0, 0x001F, 0x03E0, 0x7C00, 10, 5, 0, RGB2YUV_SHIFT + 7)
300rgb16_32_wrapper(AV_PIX_FMT_BGR444BE, bgr12be, 0, 0, 0, 0, 0x000F, 0x00F0, 0x0F00, 8, 4, 0, RGB2YUV_SHIFT + 4)
301rgb16_32_wrapper(AV_PIX_FMT_RGB565BE, rgb16be, 0, 0, 0, 0, 0xF800, 0x07E0, 0x001F, 0, 5, 11, RGB2YUV_SHIFT + 8)
302rgb16_32_wrapper(AV_PIX_FMT_RGB555BE, rgb15be, 0, 0, 0, 0, 0x7C00, 0x03E0, 0x001F, 0, 5, 10, RGB2YUV_SHIFT + 7)
303rgb16_32_wrapper(AV_PIX_FMT_RGB444BE, rgb12be, 0, 0, 0, 0, 0x0F00, 0x00F0, 0x000F, 0, 4, 8, RGB2YUV_SHIFT + 4)
9b75ae05
DB
304
305static void abgrToA_c(uint8_t *dst, const uint8_t *src, int width,
306 uint32_t *unused)
2dd7a1c0
RB
307{
308 int i;
9b75ae05
DB
309 for (i = 0; i < width; i++)
310 dst[i] = src[4 * i];
2dd7a1c0
RB
311}
312
9b75ae05
DB
313static void rgbaToA_c(uint8_t *dst, const uint8_t *src, int width,
314 uint32_t *unused)
2dd7a1c0
RB
315{
316 int i;
9b75ae05
DB
317 for (i = 0; i < width; i++)
318 dst[i] = src[4 * i + 3];
2dd7a1c0
RB
319}
320
321static void palToY_c(uint8_t *dst, const uint8_t *src, int width, uint32_t *pal)
322{
323 int i;
9b75ae05
DB
324 for (i = 0; i < width; i++) {
325 int d = src[i];
2dd7a1c0 326
9b75ae05 327 dst[i] = pal[d] & 0xFF;
2dd7a1c0
RB
328 }
329}
330
331static void palToUV_c(uint8_t *dstU, uint8_t *dstV,
332 const uint8_t *src1, const uint8_t *src2,
333 int width, uint32_t *pal)
334{
335 int i;
336 assert(src1 == src2);
9b75ae05
DB
337 for (i = 0; i < width; i++) {
338 int p = pal[src1[i]];
2dd7a1c0 339
9b75ae05
DB
340 dstU[i] = p >> 8;
341 dstV[i] = p >> 16;
2dd7a1c0
RB
342 }
343}
344
345static void monowhite2Y_c(uint8_t *dst, const uint8_t *src,
346 int width, uint32_t *unused)
347{
348 int i, j;
bc0bdda7
RB
349 width = (width + 7) >> 3;
350 for (i = 0; i < width; i++) {
9b75ae05
DB
351 int d = ~src[i];
352 for (j = 0; j < 8; j++)
353 dst[8 * i + j] = ((d >> (7 - j)) & 1) * 255;
2dd7a1c0
RB
354 }
355}
356
357static void monoblack2Y_c(uint8_t *dst, const uint8_t *src,
358 int width, uint32_t *unused)
359{
360 int i, j;
bc0bdda7
RB
361 width = (width + 7) >> 3;
362 for (i = 0; i < width; i++) {
9b75ae05
DB
363 int d = src[i];
364 for (j = 0; j < 8; j++)
365 dst[8 * i + j] = ((d >> (7 - j)) & 1) * 255;
2dd7a1c0
RB
366 }
367}
368
369static void yuy2ToY_c(uint8_t *dst, const uint8_t *src, int width,
370 uint32_t *unused)
371{
372 int i;
9b75ae05
DB
373 for (i = 0; i < width; i++)
374 dst[i] = src[2 * i];
2dd7a1c0
RB
375}
376
377static void yuy2ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
378 const uint8_t *src2, int width, uint32_t *unused)
379{
380 int i;
9b75ae05
DB
381 for (i = 0; i < width; i++) {
382 dstU[i] = src1[4 * i + 1];
383 dstV[i] = src1[4 * i + 3];
2dd7a1c0
RB
384 }
385 assert(src1 == src2);
386}
387
92b099da
VG
388static void yvy2ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
389 const uint8_t *src2, int width, uint32_t *unused)
390{
391 int i;
392 for (i = 0; i < width; i++) {
393 dstV[i] = src1[4 * i + 1];
394 dstU[i] = src1[4 * i + 3];
395 }
396 assert(src1 == src2);
397}
398
9b75ae05
DB
399static void bswap16Y_c(uint8_t *_dst, const uint8_t *_src, int width,
400 uint32_t *unused)
2dd7a1c0
RB
401{
402 int i;
9b75ae05
DB
403 const uint16_t *src = (const uint16_t *)_src;
404 uint16_t *dst = (uint16_t *)_dst;
405 for (i = 0; i < width; i++)
2dd7a1c0 406 dst[i] = av_bswap16(src[i]);
2dd7a1c0
RB
407}
408
409static void bswap16UV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *_src1,
410 const uint8_t *_src2, int width, uint32_t *unused)
411{
412 int i;
9b75ae05
DB
413 const uint16_t *src1 = (const uint16_t *)_src1,
414 *src2 = (const uint16_t *)_src2;
415 uint16_t *dstU = (uint16_t *)_dstU, *dstV = (uint16_t *)_dstV;
416 for (i = 0; i < width; i++) {
2dd7a1c0
RB
417 dstU[i] = av_bswap16(src1[i]);
418 dstV[i] = av_bswap16(src2[i]);
419 }
420}
421
f84a1b59
VG
422static void read_ya16le_gray_c(uint8_t *dst, const uint8_t *src, int width,
423 uint32_t *unused)
424{
425 int i;
426 for (i = 0; i < width; i++)
427 AV_WN16(dst + i * 2, AV_RL16(src + i * 4));
428}
429
430static void read_ya16le_alpha_c(uint8_t *dst, const uint8_t *src, int width,
431 uint32_t *unused)
432{
433 int i;
434 for (i = 0; i < width; i++)
435 AV_WN16(dst + i * 2, AV_RL16(src + i * 4 + 2));
436}
437
438static void read_ya16be_gray_c(uint8_t *dst, const uint8_t *src, int width,
439 uint32_t *unused)
440{
441 int i;
442 for (i = 0; i < width; i++)
443 AV_WN16(dst + i * 2, AV_RB16(src + i * 4));
444}
445
446static void read_ya16be_alpha_c(uint8_t *dst, const uint8_t *src, int width,
447 uint32_t *unused)
448{
449 int i;
450 for (i = 0; i < width; i++)
451 AV_WN16(dst + i * 2, AV_RB16(src + i * 4 + 2));
452}
453
2dd7a1c0 454/* This is almost identical to the previous, end exists only because
9b75ae05 455 * yuy2ToY/UV)(dst, src + 1, ...) would have 100% unaligned accesses. */
2dd7a1c0
RB
456static void uyvyToY_c(uint8_t *dst, const uint8_t *src, int width,
457 uint32_t *unused)
458{
459 int i;
9b75ae05
DB
460 for (i = 0; i < width; i++)
461 dst[i] = src[2 * i + 1];
2dd7a1c0
RB
462}
463
464static void uyvyToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
465 const uint8_t *src2, int width, uint32_t *unused)
466{
467 int i;
9b75ae05
DB
468 for (i = 0; i < width; i++) {
469 dstU[i] = src1[4 * i + 0];
470 dstV[i] = src1[4 * i + 2];
2dd7a1c0
RB
471 }
472 assert(src1 == src2);
473}
474
475static av_always_inline void nvXXtoUV_c(uint8_t *dst1, uint8_t *dst2,
476 const uint8_t *src, int width)
477{
478 int i;
479 for (i = 0; i < width; i++) {
9b75ae05
DB
480 dst1[i] = src[2 * i + 0];
481 dst2[i] = src[2 * i + 1];
2dd7a1c0
RB
482 }
483}
484
485static void nv12ToUV_c(uint8_t *dstU, uint8_t *dstV,
486 const uint8_t *src1, const uint8_t *src2,
487 int width, uint32_t *unused)
488{
489 nvXXtoUV_c(dstU, dstV, src1, width);
490}
491
492static void nv21ToUV_c(uint8_t *dstU, uint8_t *dstV,
493 const uint8_t *src1, const uint8_t *src2,
494 int width, uint32_t *unused)
495{
496 nvXXtoUV_c(dstV, dstU, src1, width);
497}
498
e78e5b73
HL
499static void p010LEToY_c(uint8_t *dst, const uint8_t *src, int width, uint32_t *unused)
500{
501 int i;
502 for (i = 0; i < width; i++) {
503 AV_WN16(dst + i * 2, AV_RL16(src + i * 2) >> 6);
504 }
505}
506
507static void p010BEToY_c(uint8_t *dst, const uint8_t *src, int width, uint32_t *unused)
508{
509 int i;
510 for (i = 0; i < width; i++) {
511 AV_WN16(dst + i * 2, AV_RB16(src + i * 2) >> 6);
512 }
513}
514
515static void p010LEToUV_c(uint8_t *dstU, uint8_t *dstV,
516 const uint8_t *src1, const uint8_t *src2,
517 int width, uint32_t *unused)
518{
519 int i;
520 for (i = 0; i < width; i++) {
521 AV_WN16(dstU + i * 2, AV_RL16(src1 + i * 4 + 0) >> 6);
522 AV_WN16(dstV + i * 2, AV_RL16(src1 + i * 4 + 2) >> 6);
523 }
524}
525
526static void p010BEToUV_c(uint8_t *dstU, uint8_t *dstV,
527 const uint8_t *src1, const uint8_t *src2,
528 int width, uint32_t *unused)
529{
530 int i;
531 for (i = 0; i < width; i++) {
532 AV_WN16(dstU + i * 2, AV_RB16(src1 + i * 4 + 0) >> 6);
533 AV_WN16(dstV + i * 2, AV_RB16(src1 + i * 4 + 2) >> 6);
534 }
535}
536
2dd7a1c0
RB
537#define input_pixel(pos) (isBE(origin) ? AV_RB16(pos) : AV_RL16(pos))
538
539static void bgr24ToY_c(uint8_t *dst, const uint8_t *src,
540 int width, uint32_t *unused)
541{
542 int i;
9b75ae05
DB
543 for (i = 0; i < width; i++) {
544 int b = src[i * 3 + 0];
545 int g = src[i * 3 + 1];
546 int r = src[i * 3 + 2];
2dd7a1c0 547
9b75ae05 548 dst[i] = ((RY * r + GY * g + BY * b + (33 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT);
2dd7a1c0
RB
549 }
550}
551
552static void bgr24ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
553 const uint8_t *src2, int width, uint32_t *unused)
554{
555 int i;
9b75ae05
DB
556 for (i = 0; i < width; i++) {
557 int b = src1[3 * i + 0];
558 int g = src1[3 * i + 1];
559 int r = src1[3 * i + 2];
2dd7a1c0 560
9b75ae05
DB
561 dstU[i] = (RU * r + GU * g + BU * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
562 dstV[i] = (RV * r + GV * g + BV * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
2dd7a1c0
RB
563 }
564 assert(src1 == src2);
565}
566
567static void bgr24ToUV_half_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
568 const uint8_t *src2, int width, uint32_t *unused)
569{
570 int i;
9b75ae05
DB
571 for (i = 0; i < width; i++) {
572 int b = src1[6 * i + 0] + src1[6 * i + 3];
573 int g = src1[6 * i + 1] + src1[6 * i + 4];
574 int r = src1[6 * i + 2] + src1[6 * i + 5];
2dd7a1c0 575
9b75ae05
DB
576 dstU[i] = (RU * r + GU * g + BU * b + (257 << RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT + 1);
577 dstV[i] = (RV * r + GV * g + BV * b + (257 << RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT + 1);
2dd7a1c0
RB
578 }
579 assert(src1 == src2);
580}
581
582static void rgb24ToY_c(uint8_t *dst, const uint8_t *src, int width,
583 uint32_t *unused)
584{
585 int i;
9b75ae05
DB
586 for (i = 0; i < width; i++) {
587 int r = src[i * 3 + 0];
588 int g = src[i * 3 + 1];
589 int b = src[i * 3 + 2];
2dd7a1c0 590
9b75ae05 591 dst[i] = ((RY * r + GY * g + BY * b + (33 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT);
2dd7a1c0
RB
592 }
593}
594
595static void rgb24ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
596 const uint8_t *src2, int width, uint32_t *unused)
597{
598 int i;
9b75ae05
DB
599 assert(src1 == src2);
600 for (i = 0; i < width; i++) {
601 int r = src1[3 * i + 0];
602 int g = src1[3 * i + 1];
603 int b = src1[3 * i + 2];
604
605 dstU[i] = (RU * r + GU * g + BU * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
606 dstV[i] = (RV * r + GV * g + BV * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
2dd7a1c0
RB
607 }
608}
609
610static void rgb24ToUV_half_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
611 const uint8_t *src2, int width, uint32_t *unused)
612{
613 int i;
9b75ae05
DB
614 assert(src1 == src2);
615 for (i = 0; i < width; i++) {
616 int r = src1[6 * i + 0] + src1[6 * i + 3];
617 int g = src1[6 * i + 1] + src1[6 * i + 4];
618 int b = src1[6 * i + 2] + src1[6 * i + 5];
619
620 dstU[i] = (RU * r + GU * g + BU * b + (257 << RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT + 1);
621 dstV[i] = (RV * r + GV * g + BV * b + (257 << RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT + 1);
2dd7a1c0
RB
622 }
623}
624
625static void planar_rgb_to_y(uint8_t *dst, const uint8_t *src[4], int width)
626{
627 int i;
628 for (i = 0; i < width; i++) {
629 int g = src[0][i];
630 int b = src[1][i];
631 int r = src[2][i];
632
633 dst[i] = ((RY * r + GY * g + BY * b + (33 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT);
634 }
635}
636
2df72777 637static void planar_rgb_to_a(uint8_t *dst, const uint8_t *src[4], int width)
92806167 638{
92806167
PM
639 int i;
640 for (i = 0; i < width; i++)
2df72777 641 dst[i] = src[3][i];
92806167
PM
642}
643
404410a5 644static void planar_rgb_to_uv(uint8_t *dstU, uint8_t *dstV, const uint8_t *src[4], int width)
2dd7a1c0
RB
645{
646 int i;
2dd7a1c0 647 for (i = 0; i < width; i++) {
404410a5
RB
648 int g = src[0][i];
649 int b = src[1][i];
650 int r = src[2][i];
2dd7a1c0 651
404410a5
RB
652 dstU[i] = (RU * r + GU * g + BU * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
653 dstV[i] = (RV * r + GV * g + BV * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
2dd7a1c0
RB
654 }
655}
656
404410a5
RB
657#define rdpx(src) \
658 is_be ? AV_RB16(src) : AV_RL16(src)
659static av_always_inline void planar_rgb16_to_y(uint8_t *_dst, const uint8_t *_src[4],
660 int width, int bpc, int is_be)
2dd7a1c0
RB
661{
662 int i;
9b75ae05
DB
663 const uint16_t **src = (const uint16_t **)_src;
664 uint16_t *dst = (uint16_t *)_dst;
2dd7a1c0 665 for (i = 0; i < width; i++) {
404410a5
RB
666 int g = rdpx(src[0] + i);
667 int b = rdpx(src[1] + i);
668 int r = rdpx(src[2] + i);
2dd7a1c0 669
404410a5 670 dst[i] = ((RY * r + GY * g + BY * b + (33 << (RGB2YUV_SHIFT + bpc - 9))) >> RGB2YUV_SHIFT);
2dd7a1c0
RB
671 }
672}
673
be9dba5c
MN
674static av_always_inline void planar_rgb16_to_a(uint8_t *_dst, const uint8_t *_src[4],
675 int width, int bpc, int is_be)
676{
677 int i;
678 const uint16_t **src = (const uint16_t **)_src;
679 uint16_t *dst = (uint16_t *)_dst;
680 int shift = bpc < 15 ? bpc : 14;
681
682 for (i = 0; i < width; i++) {
683 dst[i] = rdpx(src[3] + i) << (14 - shift);
684 }
685}
686
404410a5 687static void planar_rgb9le_to_y(uint8_t *dst, const uint8_t *src[4], int w)
2dd7a1c0 688{
404410a5
RB
689 planar_rgb16_to_y(dst, src, w, 9, 0);
690}
2dd7a1c0 691
404410a5
RB
692static void planar_rgb9be_to_y(uint8_t *dst, const uint8_t *src[4], int w)
693{
694 planar_rgb16_to_y(dst, src, w, 9, 1);
2dd7a1c0
RB
695}
696
404410a5 697static void planar_rgb10le_to_y(uint8_t *dst, const uint8_t *src[4], int w)
2dd7a1c0 698{
404410a5
RB
699 planar_rgb16_to_y(dst, src, w, 10, 0);
700}
2dd7a1c0 701
f6a9c20a
PM
702static void planar_rgb10le_to_a(uint8_t *dst, const uint8_t *src[4], int w)
703{
704 planar_rgb16_to_a(dst, src, w, 10, 0);
705}
706
404410a5
RB
707static void planar_rgb10be_to_y(uint8_t *dst, const uint8_t *src[4], int w)
708{
709 planar_rgb16_to_y(dst, src, w, 10, 1);
2dd7a1c0
RB
710}
711
f6a9c20a
PM
712static void planar_rgb10be_to_a(uint8_t *dst, const uint8_t *src[4], int w)
713{
714 planar_rgb16_to_a(dst, src, w, 10, 1);
715}
716
328ea6a9
MN
717static void planar_rgb12le_to_y(uint8_t *dst, const uint8_t *src[4], int w)
718{
719 planar_rgb16_to_y(dst, src, w, 12, 0);
720}
721
be9dba5c
MN
722static void planar_rgb12le_to_a(uint8_t *dst, const uint8_t *src[4], int w)
723{
724 planar_rgb16_to_a(dst, src, w, 12, 0);
725}
726
328ea6a9
MN
727static void planar_rgb12be_to_y(uint8_t *dst, const uint8_t *src[4], int w)
728{
729 planar_rgb16_to_y(dst, src, w, 12, 1);
730}
731
be9dba5c
MN
732static void planar_rgb12be_to_a(uint8_t *dst, const uint8_t *src[4], int w)
733{
734 planar_rgb16_to_a(dst, src, w, 12, 1);
735}
736
404410a5
RB
737static void planar_rgb16le_to_y(uint8_t *dst, const uint8_t *src[4], int w)
738{
739 planar_rgb16_to_y(dst, src, w, 16, 0);
740}
741
be9dba5c
MN
742static void planar_rgb16le_to_a(uint8_t *dst, const uint8_t *src[4], int w)
743{
744 planar_rgb16_to_a(dst, src, w, 16, 0);
745}
746
404410a5
RB
747static void planar_rgb16be_to_y(uint8_t *dst, const uint8_t *src[4], int w)
748{
749 planar_rgb16_to_y(dst, src, w, 16, 1);
750}
751
be9dba5c
MN
752static void planar_rgb16be_to_a(uint8_t *dst, const uint8_t *src[4], int w)
753{
754 planar_rgb16_to_a(dst, src, w, 16, 1);
755}
756
404410a5
RB
757static av_always_inline void planar_rgb16_to_uv(uint8_t *_dstU, uint8_t *_dstV,
758 const uint8_t *_src[4], int width,
759 int bpc, int is_be)
2dd7a1c0
RB
760{
761 int i;
9b75ae05
DB
762 const uint16_t **src = (const uint16_t **)_src;
763 uint16_t *dstU = (uint16_t *)_dstU;
764 uint16_t *dstV = (uint16_t *)_dstV;
2dd7a1c0 765 for (i = 0; i < width; i++) {
404410a5
RB
766 int g = rdpx(src[0] + i);
767 int b = rdpx(src[1] + i);
768 int r = rdpx(src[2] + i);
2dd7a1c0 769
404410a5
RB
770 dstU[i] = (RU * r + GU * g + BU * b + (257 << (RGB2YUV_SHIFT + bpc - 9))) >> RGB2YUV_SHIFT;
771 dstV[i] = (RV * r + GV * g + BV * b + (257 << (RGB2YUV_SHIFT + bpc - 9))) >> RGB2YUV_SHIFT;
2dd7a1c0
RB
772 }
773}
404410a5
RB
774#undef rdpx
775
776static void planar_rgb9le_to_uv(uint8_t *dstU, uint8_t *dstV,
777 const uint8_t *src[4], int w)
778{
779 planar_rgb16_to_uv(dstU, dstV, src, w, 9, 0);
780}
781
782static void planar_rgb9be_to_uv(uint8_t *dstU, uint8_t *dstV,
783 const uint8_t *src[4], int w)
784{
785 planar_rgb16_to_uv(dstU, dstV, src, w, 9, 1);
786}
787
788static void planar_rgb10le_to_uv(uint8_t *dstU, uint8_t *dstV,
789 const uint8_t *src[4], int w)
790{
791 planar_rgb16_to_uv(dstU, dstV, src, w, 10, 0);
792}
793
794static void planar_rgb10be_to_uv(uint8_t *dstU, uint8_t *dstV,
795 const uint8_t *src[4], int w)
796{
797 planar_rgb16_to_uv(dstU, dstV, src, w, 10, 1);
798}
799
328ea6a9
MN
800static void planar_rgb12le_to_uv(uint8_t *dstU, uint8_t *dstV,
801 const uint8_t *src[4], int w)
802{
803 planar_rgb16_to_uv(dstU, dstV, src, w, 12, 0);
804}
805
806static void planar_rgb12be_to_uv(uint8_t *dstU, uint8_t *dstV,
807 const uint8_t *src[4], int w)
808{
809 planar_rgb16_to_uv(dstU, dstV, src, w, 12, 1);
810}
811
404410a5
RB
812static void planar_rgb16le_to_uv(uint8_t *dstU, uint8_t *dstV,
813 const uint8_t *src[4], int w)
814{
815 planar_rgb16_to_uv(dstU, dstV, src, w, 16, 0);
816}
817
818static void planar_rgb16be_to_uv(uint8_t *dstU, uint8_t *dstV,
819 const uint8_t *src[4], int w)
820{
821 planar_rgb16_to_uv(dstU, dstV, src, w, 16, 1);
822}
2dd7a1c0
RB
823
824av_cold void ff_sws_init_input_funcs(SwsContext *c)
825{
716d413c 826 enum AVPixelFormat srcFormat = c->srcFormat;
2dd7a1c0
RB
827
828 c->chrToYV12 = NULL;
9b75ae05 829 switch (srcFormat) {
716d413c 830 case AV_PIX_FMT_YUYV422:
9b75ae05
DB
831 c->chrToYV12 = yuy2ToUV_c;
832 break;
92b099da
VG
833 case AV_PIX_FMT_YVYU422:
834 c->chrToYV12 = yvy2ToUV_c;
835 break;
716d413c 836 case AV_PIX_FMT_UYVY422:
9b75ae05
DB
837 c->chrToYV12 = uyvyToUV_c;
838 break;
716d413c 839 case AV_PIX_FMT_NV12:
9b75ae05
DB
840 c->chrToYV12 = nv12ToUV_c;
841 break;
716d413c 842 case AV_PIX_FMT_NV21:
9b75ae05
DB
843 c->chrToYV12 = nv21ToUV_c;
844 break;
716d413c
AK
845 case AV_PIX_FMT_RGB8:
846 case AV_PIX_FMT_BGR8:
847 case AV_PIX_FMT_PAL8:
848 case AV_PIX_FMT_BGR4_BYTE:
849 case AV_PIX_FMT_RGB4_BYTE:
9b75ae05
DB
850 c->chrToYV12 = palToUV_c;
851 break;
716d413c 852 case AV_PIX_FMT_GBRP9LE:
404410a5
RB
853 c->readChrPlanar = planar_rgb9le_to_uv;
854 break;
f6a9c20a 855 case AV_PIX_FMT_GBRAP10LE:
716d413c 856 case AV_PIX_FMT_GBRP10LE:
404410a5
RB
857 c->readChrPlanar = planar_rgb10le_to_uv;
858 break;
81f1f6c3 859 case AV_PIX_FMT_GBRAP12LE:
328ea6a9
MN
860 case AV_PIX_FMT_GBRP12LE:
861 c->readChrPlanar = planar_rgb12le_to_uv;
862 break;
92806167 863 case AV_PIX_FMT_GBRAP16LE:
716d413c 864 case AV_PIX_FMT_GBRP16LE:
9b75ae05
DB
865 c->readChrPlanar = planar_rgb16le_to_uv;
866 break;
716d413c 867 case AV_PIX_FMT_GBRP9BE:
404410a5
RB
868 c->readChrPlanar = planar_rgb9be_to_uv;
869 break;
f6a9c20a 870 case AV_PIX_FMT_GBRAP10BE:
716d413c 871 case AV_PIX_FMT_GBRP10BE:
404410a5
RB
872 c->readChrPlanar = planar_rgb10be_to_uv;
873 break;
81f1f6c3 874 case AV_PIX_FMT_GBRAP12BE:
328ea6a9
MN
875 case AV_PIX_FMT_GBRP12BE:
876 c->readChrPlanar = planar_rgb12be_to_uv;
877 break;
92806167 878 case AV_PIX_FMT_GBRAP16BE:
716d413c 879 case AV_PIX_FMT_GBRP16BE:
9b75ae05
DB
880 c->readChrPlanar = planar_rgb16be_to_uv;
881 break;
92806167 882 case AV_PIX_FMT_GBRAP:
716d413c 883 case AV_PIX_FMT_GBRP:
9b75ae05
DB
884 c->readChrPlanar = planar_rgb_to_uv;
885 break;
2dd7a1c0 886#if HAVE_BIGENDIAN
716d413c 887 case AV_PIX_FMT_YUV420P9LE:
de8e096c
VG
888 case AV_PIX_FMT_YUV422P9LE:
889 case AV_PIX_FMT_YUV444P9LE:
890 case AV_PIX_FMT_YUV420P10LE:
716d413c
AK
891 case AV_PIX_FMT_YUV422P10LE:
892 case AV_PIX_FMT_YUV444P10LE:
85406e7a 893 case AV_PIX_FMT_YUV420P12LE:
0aebbbd0 894 case AV_PIX_FMT_YUV422P12LE:
eb542106 895 case AV_PIX_FMT_YUV444P12LE:
716d413c
AK
896 case AV_PIX_FMT_YUV420P16LE:
897 case AV_PIX_FMT_YUV422P16LE:
898 case AV_PIX_FMT_YUV444P16LE:
38fdf725 899 case AV_PIX_FMT_YUVA420P9LE:
de8e096c
VG
900 case AV_PIX_FMT_YUVA422P9LE:
901 case AV_PIX_FMT_YUVA444P9LE:
902 case AV_PIX_FMT_YUVA420P10LE:
38fdf725
KS
903 case AV_PIX_FMT_YUVA422P10LE:
904 case AV_PIX_FMT_YUVA444P10LE:
38fdf725
KS
905 case AV_PIX_FMT_YUVA420P16LE:
906 case AV_PIX_FMT_YUVA422P16LE:
907 case AV_PIX_FMT_YUVA444P16LE:
9b75ae05
DB
908 c->chrToYV12 = bswap16UV_c;
909 break;
2dd7a1c0 910#else
716d413c 911 case AV_PIX_FMT_YUV420P9BE:
de8e096c
VG
912 case AV_PIX_FMT_YUV422P9BE:
913 case AV_PIX_FMT_YUV444P9BE:
716d413c 914 case AV_PIX_FMT_YUV420P10BE:
de8e096c
VG
915 case AV_PIX_FMT_YUV422P10BE:
916 case AV_PIX_FMT_YUV444P10BE:
85406e7a 917 case AV_PIX_FMT_YUV420P12BE:
0aebbbd0 918 case AV_PIX_FMT_YUV422P12BE:
eb542106 919 case AV_PIX_FMT_YUV444P12BE:
716d413c
AK
920 case AV_PIX_FMT_YUV420P16BE:
921 case AV_PIX_FMT_YUV422P16BE:
922 case AV_PIX_FMT_YUV444P16BE:
38fdf725 923 case AV_PIX_FMT_YUVA420P9BE:
de8e096c
VG
924 case AV_PIX_FMT_YUVA422P9BE:
925 case AV_PIX_FMT_YUVA444P9BE:
926 case AV_PIX_FMT_YUVA420P10BE:
38fdf725
KS
927 case AV_PIX_FMT_YUVA422P10BE:
928 case AV_PIX_FMT_YUVA444P10BE:
38fdf725
KS
929 case AV_PIX_FMT_YUVA420P16BE:
930 case AV_PIX_FMT_YUVA422P16BE:
931 case AV_PIX_FMT_YUVA444P16BE:
9b75ae05
DB
932 c->chrToYV12 = bswap16UV_c;
933 break;
2dd7a1c0 934#endif
e78e5b73
HL
935 case AV_PIX_FMT_P010LE:
936 c->chrToYV12 = p010LEToUV_c;
937 break;
938 case AV_PIX_FMT_P010BE:
939 c->chrToYV12 = p010BEToUV_c;
940 break;
2dd7a1c0
RB
941 }
942 if (c->chrSrcHSubSample) {
9b75ae05 943 switch (srcFormat) {
716d413c 944 case AV_PIX_FMT_RGB48BE:
9b75ae05
DB
945 c->chrToYV12 = rgb48BEToUV_half_c;
946 break;
716d413c 947 case AV_PIX_FMT_RGB48LE:
9b75ae05
DB
948 c->chrToYV12 = rgb48LEToUV_half_c;
949 break;
716d413c 950 case AV_PIX_FMT_BGR48BE:
9b75ae05
DB
951 c->chrToYV12 = bgr48BEToUV_half_c;
952 break;
716d413c 953 case AV_PIX_FMT_BGR48LE:
9b75ae05
DB
954 c->chrToYV12 = bgr48LEToUV_half_c;
955 break;
716d413c 956 case AV_PIX_FMT_RGB32:
9b75ae05
DB
957 c->chrToYV12 = bgr32ToUV_half_c;
958 break;
716d413c 959 case AV_PIX_FMT_RGB32_1:
9b75ae05
DB
960 c->chrToYV12 = bgr321ToUV_half_c;
961 break;
716d413c 962 case AV_PIX_FMT_BGR24:
9b75ae05
DB
963 c->chrToYV12 = bgr24ToUV_half_c;
964 break;
716d413c 965 case AV_PIX_FMT_BGR565LE:
9b75ae05
DB
966 c->chrToYV12 = bgr16leToUV_half_c;
967 break;
716d413c 968 case AV_PIX_FMT_BGR565BE:
9b75ae05
DB
969 c->chrToYV12 = bgr16beToUV_half_c;
970 break;
716d413c 971 case AV_PIX_FMT_BGR555LE:
9b75ae05
DB
972 c->chrToYV12 = bgr15leToUV_half_c;
973 break;
716d413c 974 case AV_PIX_FMT_BGR555BE:
9b75ae05
DB
975 c->chrToYV12 = bgr15beToUV_half_c;
976 break;
716d413c 977 case AV_PIX_FMT_BGR444LE:
9b75ae05
DB
978 c->chrToYV12 = bgr12leToUV_half_c;
979 break;
716d413c 980 case AV_PIX_FMT_BGR444BE:
9b75ae05
DB
981 c->chrToYV12 = bgr12beToUV_half_c;
982 break;
716d413c 983 case AV_PIX_FMT_BGR32:
9b75ae05
DB
984 c->chrToYV12 = rgb32ToUV_half_c;
985 break;
716d413c 986 case AV_PIX_FMT_BGR32_1:
9b75ae05
DB
987 c->chrToYV12 = rgb321ToUV_half_c;
988 break;
716d413c 989 case AV_PIX_FMT_RGB24:
9b75ae05
DB
990 c->chrToYV12 = rgb24ToUV_half_c;
991 break;
716d413c 992 case AV_PIX_FMT_RGB565LE:
9b75ae05
DB
993 c->chrToYV12 = rgb16leToUV_half_c;
994 break;
716d413c 995 case AV_PIX_FMT_RGB565BE:
9b75ae05
DB
996 c->chrToYV12 = rgb16beToUV_half_c;
997 break;
716d413c 998 case AV_PIX_FMT_RGB555LE:
9b75ae05
DB
999 c->chrToYV12 = rgb15leToUV_half_c;
1000 break;
716d413c 1001 case AV_PIX_FMT_RGB555BE:
9b75ae05
DB
1002 c->chrToYV12 = rgb15beToUV_half_c;
1003 break;
716d413c 1004 case AV_PIX_FMT_RGB444LE:
9b75ae05
DB
1005 c->chrToYV12 = rgb12leToUV_half_c;
1006 break;
716d413c 1007 case AV_PIX_FMT_RGB444BE:
9b75ae05
DB
1008 c->chrToYV12 = rgb12beToUV_half_c;
1009 break;
2dd7a1c0
RB
1010 }
1011 } else {
9b75ae05 1012 switch (srcFormat) {
716d413c 1013 case AV_PIX_FMT_RGB48BE:
9b75ae05
DB
1014 c->chrToYV12 = rgb48BEToUV_c;
1015 break;
716d413c 1016 case AV_PIX_FMT_RGB48LE:
9b75ae05
DB
1017 c->chrToYV12 = rgb48LEToUV_c;
1018 break;
716d413c 1019 case AV_PIX_FMT_BGR48BE:
9b75ae05
DB
1020 c->chrToYV12 = bgr48BEToUV_c;
1021 break;
716d413c 1022 case AV_PIX_FMT_BGR48LE:
9b75ae05
DB
1023 c->chrToYV12 = bgr48LEToUV_c;
1024 break;
716d413c 1025 case AV_PIX_FMT_RGB32:
9b75ae05
DB
1026 c->chrToYV12 = bgr32ToUV_c;
1027 break;
716d413c 1028 case AV_PIX_FMT_RGB32_1:
9b75ae05
DB
1029 c->chrToYV12 = bgr321ToUV_c;
1030 break;
716d413c 1031 case AV_PIX_FMT_BGR24:
9b75ae05
DB
1032 c->chrToYV12 = bgr24ToUV_c;
1033 break;
716d413c 1034 case AV_PIX_FMT_BGR565LE:
9b75ae05
DB
1035 c->chrToYV12 = bgr16leToUV_c;
1036 break;
716d413c 1037 case AV_PIX_FMT_BGR565BE:
9b75ae05
DB
1038 c->chrToYV12 = bgr16beToUV_c;
1039 break;
716d413c 1040 case AV_PIX_FMT_BGR555LE:
9b75ae05
DB
1041 c->chrToYV12 = bgr15leToUV_c;
1042 break;
716d413c 1043 case AV_PIX_FMT_BGR555BE:
9b75ae05
DB
1044 c->chrToYV12 = bgr15beToUV_c;
1045 break;
716d413c 1046 case AV_PIX_FMT_BGR444LE:
9b75ae05
DB
1047 c->chrToYV12 = bgr12leToUV_c;
1048 break;
716d413c 1049 case AV_PIX_FMT_BGR444BE:
9b75ae05
DB
1050 c->chrToYV12 = bgr12beToUV_c;
1051 break;
716d413c 1052 case AV_PIX_FMT_BGR32:
9b75ae05
DB
1053 c->chrToYV12 = rgb32ToUV_c;
1054 break;
716d413c 1055 case AV_PIX_FMT_BGR32_1:
9b75ae05
DB
1056 c->chrToYV12 = rgb321ToUV_c;
1057 break;
716d413c 1058 case AV_PIX_FMT_RGB24:
9b75ae05
DB
1059 c->chrToYV12 = rgb24ToUV_c;
1060 break;
716d413c 1061 case AV_PIX_FMT_RGB565LE:
9b75ae05
DB
1062 c->chrToYV12 = rgb16leToUV_c;
1063 break;
716d413c 1064 case AV_PIX_FMT_RGB565BE:
9b75ae05
DB
1065 c->chrToYV12 = rgb16beToUV_c;
1066 break;
716d413c 1067 case AV_PIX_FMT_RGB555LE:
9b75ae05
DB
1068 c->chrToYV12 = rgb15leToUV_c;
1069 break;
716d413c 1070 case AV_PIX_FMT_RGB555BE:
9b75ae05
DB
1071 c->chrToYV12 = rgb15beToUV_c;
1072 break;
716d413c 1073 case AV_PIX_FMT_RGB444LE:
9b75ae05
DB
1074 c->chrToYV12 = rgb12leToUV_c;
1075 break;
716d413c 1076 case AV_PIX_FMT_RGB444BE:
9b75ae05
DB
1077 c->chrToYV12 = rgb12beToUV_c;
1078 break;
2dd7a1c0
RB
1079 }
1080 }
1081
1082 c->lumToYV12 = NULL;
1083 c->alpToYV12 = NULL;
1084 switch (srcFormat) {
716d413c 1085 case AV_PIX_FMT_GBRP9LE:
404410a5
RB
1086 c->readLumPlanar = planar_rgb9le_to_y;
1087 break;
f6a9c20a
PM
1088 case AV_PIX_FMT_GBRAP10LE:
1089 c->readAlpPlanar = planar_rgb10le_to_a;
716d413c 1090 case AV_PIX_FMT_GBRP10LE:
404410a5
RB
1091 c->readLumPlanar = planar_rgb10le_to_y;
1092 break;
81f1f6c3 1093 case AV_PIX_FMT_GBRAP12LE:
be9dba5c 1094 c->readAlpPlanar = planar_rgb12le_to_a;
328ea6a9
MN
1095 case AV_PIX_FMT_GBRP12LE:
1096 c->readLumPlanar = planar_rgb12le_to_y;
1097 break;
92806167 1098 case AV_PIX_FMT_GBRAP16LE:
be9dba5c 1099 c->readAlpPlanar = planar_rgb16le_to_a;
716d413c 1100 case AV_PIX_FMT_GBRP16LE:
9b75ae05
DB
1101 c->readLumPlanar = planar_rgb16le_to_y;
1102 break;
716d413c 1103 case AV_PIX_FMT_GBRP9BE:
404410a5
RB
1104 c->readLumPlanar = planar_rgb9be_to_y;
1105 break;
f6a9c20a
PM
1106 case AV_PIX_FMT_GBRAP10BE:
1107 c->readAlpPlanar = planar_rgb10be_to_a;
716d413c 1108 case AV_PIX_FMT_GBRP10BE:
404410a5
RB
1109 c->readLumPlanar = planar_rgb10be_to_y;
1110 break;
81f1f6c3 1111 case AV_PIX_FMT_GBRAP12BE:
be9dba5c 1112 c->readAlpPlanar = planar_rgb12be_to_a;
328ea6a9
MN
1113 case AV_PIX_FMT_GBRP12BE:
1114 c->readLumPlanar = planar_rgb12be_to_y;
1115 break;
92806167 1116 case AV_PIX_FMT_GBRAP16BE:
be9dba5c 1117 c->readAlpPlanar = planar_rgb16be_to_a;
716d413c 1118 case AV_PIX_FMT_GBRP16BE:
9b75ae05
DB
1119 c->readLumPlanar = planar_rgb16be_to_y;
1120 break;
92806167
PM
1121 case AV_PIX_FMT_GBRAP:
1122 c->readAlpPlanar = planar_rgb_to_a;
716d413c 1123 case AV_PIX_FMT_GBRP:
9b75ae05
DB
1124 c->readLumPlanar = planar_rgb_to_y;
1125 break;
2dd7a1c0 1126#if HAVE_BIGENDIAN
716d413c 1127 case AV_PIX_FMT_YUV420P9LE:
de8e096c
VG
1128 case AV_PIX_FMT_YUV422P9LE:
1129 case AV_PIX_FMT_YUV444P9LE:
716d413c 1130 case AV_PIX_FMT_YUV420P10LE:
de8e096c
VG
1131 case AV_PIX_FMT_YUV422P10LE:
1132 case AV_PIX_FMT_YUV444P10LE:
85406e7a 1133 case AV_PIX_FMT_YUV420P12LE:
0aebbbd0 1134 case AV_PIX_FMT_YUV422P12LE:
eb542106 1135 case AV_PIX_FMT_YUV444P12LE:
716d413c
AK
1136 case AV_PIX_FMT_YUV420P16LE:
1137 case AV_PIX_FMT_YUV422P16LE:
1138 case AV_PIX_FMT_YUV444P16LE:
f149a4a5 1139 case AV_PIX_FMT_GRAY10LE:
ab839054 1140 case AV_PIX_FMT_GRAY12LE:
716d413c 1141 case AV_PIX_FMT_GRAY16LE:
9b75ae05
DB
1142 c->lumToYV12 = bswap16Y_c;
1143 break;
38fdf725 1144 case AV_PIX_FMT_YUVA420P9LE:
de8e096c
VG
1145 case AV_PIX_FMT_YUVA422P9LE:
1146 case AV_PIX_FMT_YUVA444P9LE:
38fdf725 1147 case AV_PIX_FMT_YUVA420P10LE:
de8e096c
VG
1148 case AV_PIX_FMT_YUVA422P10LE:
1149 case AV_PIX_FMT_YUVA444P10LE:
38fdf725
KS
1150 case AV_PIX_FMT_YUVA420P16LE:
1151 case AV_PIX_FMT_YUVA422P16LE:
1152 case AV_PIX_FMT_YUVA444P16LE:
1153 c->lumToYV12 = bswap16Y_c;
1154 c->alpToYV12 = bswap16Y_c;
1155 break;
2dd7a1c0 1156#else
716d413c 1157 case AV_PIX_FMT_YUV420P9BE:
de8e096c
VG
1158 case AV_PIX_FMT_YUV422P9BE:
1159 case AV_PIX_FMT_YUV444P9BE:
716d413c 1160 case AV_PIX_FMT_YUV420P10BE:
de8e096c
VG
1161 case AV_PIX_FMT_YUV422P10BE:
1162 case AV_PIX_FMT_YUV444P10BE:
85406e7a 1163 case AV_PIX_FMT_YUV420P12BE:
0aebbbd0 1164 case AV_PIX_FMT_YUV422P12BE:
eb542106 1165 case AV_PIX_FMT_YUV444P12BE:
716d413c
AK
1166 case AV_PIX_FMT_YUV420P16BE:
1167 case AV_PIX_FMT_YUV422P16BE:
1168 case AV_PIX_FMT_YUV444P16BE:
f149a4a5 1169 case AV_PIX_FMT_GRAY10BE:
ab839054 1170 case AV_PIX_FMT_GRAY12BE:
716d413c 1171 case AV_PIX_FMT_GRAY16BE:
9b75ae05
DB
1172 c->lumToYV12 = bswap16Y_c;
1173 break;
38fdf725 1174 case AV_PIX_FMT_YUVA420P9BE:
de8e096c
VG
1175 case AV_PIX_FMT_YUVA422P9BE:
1176 case AV_PIX_FMT_YUVA444P9BE:
38fdf725 1177 case AV_PIX_FMT_YUVA420P10BE:
de8e096c
VG
1178 case AV_PIX_FMT_YUVA422P10BE:
1179 case AV_PIX_FMT_YUVA444P10BE:
38fdf725
KS
1180 case AV_PIX_FMT_YUVA420P16BE:
1181 case AV_PIX_FMT_YUVA422P16BE:
1182 case AV_PIX_FMT_YUVA444P16BE:
1183 c->lumToYV12 = bswap16Y_c;
1184 c->alpToYV12 = bswap16Y_c;
1185 break;
2dd7a1c0 1186#endif
f84a1b59
VG
1187 case AV_PIX_FMT_YA16LE:
1188 c->lumToYV12 = read_ya16le_gray_c;
1189 c->alpToYV12 = read_ya16le_alpha_c;
1190 break;
1191 case AV_PIX_FMT_YA16BE:
1192 c->lumToYV12 = read_ya16be_gray_c;
1193 c->alpToYV12 = read_ya16be_alpha_c;
1194 break;
716d413c 1195 case AV_PIX_FMT_YUYV422:
92b099da 1196 case AV_PIX_FMT_YVYU422:
e96c3b81 1197 case AV_PIX_FMT_YA8:
9b75ae05
DB
1198 c->lumToYV12 = yuy2ToY_c;
1199 break;
716d413c 1200 case AV_PIX_FMT_UYVY422:
9b75ae05
DB
1201 c->lumToYV12 = uyvyToY_c;
1202 break;
716d413c 1203 case AV_PIX_FMT_BGR24:
9b75ae05
DB
1204 c->lumToYV12 = bgr24ToY_c;
1205 break;
716d413c 1206 case AV_PIX_FMT_BGR565LE:
9b75ae05
DB
1207 c->lumToYV12 = bgr16leToY_c;
1208 break;
716d413c 1209 case AV_PIX_FMT_BGR565BE:
9b75ae05
DB
1210 c->lumToYV12 = bgr16beToY_c;
1211 break;
716d413c 1212 case AV_PIX_FMT_BGR555LE:
9b75ae05
DB
1213 c->lumToYV12 = bgr15leToY_c;
1214 break;
716d413c 1215 case AV_PIX_FMT_BGR555BE:
9b75ae05
DB
1216 c->lumToYV12 = bgr15beToY_c;
1217 break;
716d413c 1218 case AV_PIX_FMT_BGR444LE:
9b75ae05
DB
1219 c->lumToYV12 = bgr12leToY_c;
1220 break;
716d413c 1221 case AV_PIX_FMT_BGR444BE:
9b75ae05
DB
1222 c->lumToYV12 = bgr12beToY_c;
1223 break;
716d413c 1224 case AV_PIX_FMT_RGB24:
9b75ae05
DB
1225 c->lumToYV12 = rgb24ToY_c;
1226 break;
716d413c 1227 case AV_PIX_FMT_RGB565LE:
9b75ae05
DB
1228 c->lumToYV12 = rgb16leToY_c;
1229 break;
716d413c 1230 case AV_PIX_FMT_RGB565BE:
9b75ae05
DB
1231 c->lumToYV12 = rgb16beToY_c;
1232 break;
716d413c 1233 case AV_PIX_FMT_RGB555LE:
9b75ae05
DB
1234 c->lumToYV12 = rgb15leToY_c;
1235 break;
716d413c 1236 case AV_PIX_FMT_RGB555BE:
9b75ae05
DB
1237 c->lumToYV12 = rgb15beToY_c;
1238 break;
716d413c 1239 case AV_PIX_FMT_RGB444LE:
9b75ae05
DB
1240 c->lumToYV12 = rgb12leToY_c;
1241 break;
716d413c 1242 case AV_PIX_FMT_RGB444BE:
9b75ae05
DB
1243 c->lumToYV12 = rgb12beToY_c;
1244 break;
716d413c
AK
1245 case AV_PIX_FMT_RGB8:
1246 case AV_PIX_FMT_BGR8:
1247 case AV_PIX_FMT_PAL8:
1248 case AV_PIX_FMT_BGR4_BYTE:
1249 case AV_PIX_FMT_RGB4_BYTE:
9b75ae05
DB
1250 c->lumToYV12 = palToY_c;
1251 break;
716d413c 1252 case AV_PIX_FMT_MONOBLACK:
9b75ae05
DB
1253 c->lumToYV12 = monoblack2Y_c;
1254 break;
716d413c 1255 case AV_PIX_FMT_MONOWHITE:
9b75ae05
DB
1256 c->lumToYV12 = monowhite2Y_c;
1257 break;
716d413c 1258 case AV_PIX_FMT_RGB32:
9b75ae05
DB
1259 c->lumToYV12 = bgr32ToY_c;
1260 break;
716d413c 1261 case AV_PIX_FMT_RGB32_1:
9b75ae05
DB
1262 c->lumToYV12 = bgr321ToY_c;
1263 break;
716d413c 1264 case AV_PIX_FMT_BGR32:
9b75ae05
DB
1265 c->lumToYV12 = rgb32ToY_c;
1266 break;
716d413c 1267 case AV_PIX_FMT_BGR32_1:
9b75ae05
DB
1268 c->lumToYV12 = rgb321ToY_c;
1269 break;
716d413c 1270 case AV_PIX_FMT_RGB48BE:
9b75ae05
DB
1271 c->lumToYV12 = rgb48BEToY_c;
1272 break;
716d413c 1273 case AV_PIX_FMT_RGB48LE:
9b75ae05
DB
1274 c->lumToYV12 = rgb48LEToY_c;
1275 break;
716d413c 1276 case AV_PIX_FMT_BGR48BE:
9b75ae05
DB
1277 c->lumToYV12 = bgr48BEToY_c;
1278 break;
716d413c 1279 case AV_PIX_FMT_BGR48LE:
9b75ae05
DB
1280 c->lumToYV12 = bgr48LEToY_c;
1281 break;
e78e5b73
HL
1282 case AV_PIX_FMT_P010LE:
1283 c->lumToYV12 = p010LEToY_c;
1284 break;
1285 case AV_PIX_FMT_P010BE:
1286 c->lumToYV12 = p010BEToY_c;
1287 break;
2dd7a1c0
RB
1288 }
1289 if (c->alpPixBuf) {
1290 switch (srcFormat) {
716d413c
AK
1291 case AV_PIX_FMT_BGRA:
1292 case AV_PIX_FMT_RGBA:
9b75ae05
DB
1293 c->alpToYV12 = rgbaToA_c;
1294 break;
716d413c
AK
1295 case AV_PIX_FMT_ABGR:
1296 case AV_PIX_FMT_ARGB:
9b75ae05
DB
1297 c->alpToYV12 = abgrToA_c;
1298 break;
e96c3b81 1299 case AV_PIX_FMT_YA8:
9b75ae05
DB
1300 c->alpToYV12 = uyvyToY_c;
1301 break;
2dd7a1c0
RB
1302 }
1303 }
1304}