aacdec: Drop some unused function arguments
[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
9b75ae05
DB
388static void bswap16Y_c(uint8_t *_dst, const uint8_t *_src, int width,
389 uint32_t *unused)
2dd7a1c0
RB
390{
391 int i;
9b75ae05
DB
392 const uint16_t *src = (const uint16_t *)_src;
393 uint16_t *dst = (uint16_t *)_dst;
394 for (i = 0; i < width; i++)
2dd7a1c0 395 dst[i] = av_bswap16(src[i]);
2dd7a1c0
RB
396}
397
398static void bswap16UV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *_src1,
399 const uint8_t *_src2, int width, uint32_t *unused)
400{
401 int i;
9b75ae05
DB
402 const uint16_t *src1 = (const uint16_t *)_src1,
403 *src2 = (const uint16_t *)_src2;
404 uint16_t *dstU = (uint16_t *)_dstU, *dstV = (uint16_t *)_dstV;
405 for (i = 0; i < width; i++) {
2dd7a1c0
RB
406 dstU[i] = av_bswap16(src1[i]);
407 dstV[i] = av_bswap16(src2[i]);
408 }
409}
410
411/* This is almost identical to the previous, end exists only because
9b75ae05 412 * yuy2ToY/UV)(dst, src + 1, ...) would have 100% unaligned accesses. */
2dd7a1c0
RB
413static void uyvyToY_c(uint8_t *dst, const uint8_t *src, int width,
414 uint32_t *unused)
415{
416 int i;
9b75ae05
DB
417 for (i = 0; i < width; i++)
418 dst[i] = src[2 * i + 1];
2dd7a1c0
RB
419}
420
421static void uyvyToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
422 const uint8_t *src2, int width, uint32_t *unused)
423{
424 int i;
9b75ae05
DB
425 for (i = 0; i < width; i++) {
426 dstU[i] = src1[4 * i + 0];
427 dstV[i] = src1[4 * i + 2];
2dd7a1c0
RB
428 }
429 assert(src1 == src2);
430}
431
432static av_always_inline void nvXXtoUV_c(uint8_t *dst1, uint8_t *dst2,
433 const uint8_t *src, int width)
434{
435 int i;
436 for (i = 0; i < width; i++) {
9b75ae05
DB
437 dst1[i] = src[2 * i + 0];
438 dst2[i] = src[2 * i + 1];
2dd7a1c0
RB
439 }
440}
441
442static void nv12ToUV_c(uint8_t *dstU, uint8_t *dstV,
443 const uint8_t *src1, const uint8_t *src2,
444 int width, uint32_t *unused)
445{
446 nvXXtoUV_c(dstU, dstV, src1, width);
447}
448
449static void nv21ToUV_c(uint8_t *dstU, uint8_t *dstV,
450 const uint8_t *src1, const uint8_t *src2,
451 int width, uint32_t *unused)
452{
453 nvXXtoUV_c(dstV, dstU, src1, width);
454}
455
456#define input_pixel(pos) (isBE(origin) ? AV_RB16(pos) : AV_RL16(pos))
457
458static void bgr24ToY_c(uint8_t *dst, const uint8_t *src,
459 int width, uint32_t *unused)
460{
461 int i;
9b75ae05
DB
462 for (i = 0; i < width; i++) {
463 int b = src[i * 3 + 0];
464 int g = src[i * 3 + 1];
465 int r = src[i * 3 + 2];
2dd7a1c0 466
9b75ae05 467 dst[i] = ((RY * r + GY * g + BY * b + (33 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT);
2dd7a1c0
RB
468 }
469}
470
471static void bgr24ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
472 const uint8_t *src2, int width, uint32_t *unused)
473{
474 int i;
9b75ae05
DB
475 for (i = 0; i < width; i++) {
476 int b = src1[3 * i + 0];
477 int g = src1[3 * i + 1];
478 int r = src1[3 * i + 2];
2dd7a1c0 479
9b75ae05
DB
480 dstU[i] = (RU * r + GU * g + BU * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
481 dstV[i] = (RV * r + GV * g + BV * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
2dd7a1c0
RB
482 }
483 assert(src1 == src2);
484}
485
486static void bgr24ToUV_half_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
487 const uint8_t *src2, int width, uint32_t *unused)
488{
489 int i;
9b75ae05
DB
490 for (i = 0; i < width; i++) {
491 int b = src1[6 * i + 0] + src1[6 * i + 3];
492 int g = src1[6 * i + 1] + src1[6 * i + 4];
493 int r = src1[6 * i + 2] + src1[6 * i + 5];
2dd7a1c0 494
9b75ae05
DB
495 dstU[i] = (RU * r + GU * g + BU * b + (257 << RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT + 1);
496 dstV[i] = (RV * r + GV * g + BV * b + (257 << RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT + 1);
2dd7a1c0
RB
497 }
498 assert(src1 == src2);
499}
500
501static void rgb24ToY_c(uint8_t *dst, const uint8_t *src, int width,
502 uint32_t *unused)
503{
504 int i;
9b75ae05
DB
505 for (i = 0; i < width; i++) {
506 int r = src[i * 3 + 0];
507 int g = src[i * 3 + 1];
508 int b = src[i * 3 + 2];
2dd7a1c0 509
9b75ae05 510 dst[i] = ((RY * r + GY * g + BY * b + (33 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT);
2dd7a1c0
RB
511 }
512}
513
514static void rgb24ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
515 const uint8_t *src2, int width, uint32_t *unused)
516{
517 int i;
9b75ae05
DB
518 assert(src1 == src2);
519 for (i = 0; i < width; i++) {
520 int r = src1[3 * i + 0];
521 int g = src1[3 * i + 1];
522 int b = src1[3 * i + 2];
523
524 dstU[i] = (RU * r + GU * g + BU * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
525 dstV[i] = (RV * r + GV * g + BV * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
2dd7a1c0
RB
526 }
527}
528
529static void rgb24ToUV_half_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
530 const uint8_t *src2, int width, uint32_t *unused)
531{
532 int i;
9b75ae05
DB
533 assert(src1 == src2);
534 for (i = 0; i < width; i++) {
535 int r = src1[6 * i + 0] + src1[6 * i + 3];
536 int g = src1[6 * i + 1] + src1[6 * i + 4];
537 int b = src1[6 * i + 2] + src1[6 * i + 5];
538
539 dstU[i] = (RU * r + GU * g + BU * b + (257 << RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT + 1);
540 dstV[i] = (RV * r + GV * g + BV * b + (257 << RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT + 1);
2dd7a1c0
RB
541 }
542}
543
544static void planar_rgb_to_y(uint8_t *dst, const uint8_t *src[4], int width)
545{
546 int i;
547 for (i = 0; i < width; i++) {
548 int g = src[0][i];
549 int b = src[1][i];
550 int r = src[2][i];
551
552 dst[i] = ((RY * r + GY * g + BY * b + (33 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT);
553 }
554}
555
404410a5 556static void planar_rgb_to_uv(uint8_t *dstU, uint8_t *dstV, const uint8_t *src[4], int width)
2dd7a1c0
RB
557{
558 int i;
2dd7a1c0 559 for (i = 0; i < width; i++) {
404410a5
RB
560 int g = src[0][i];
561 int b = src[1][i];
562 int r = src[2][i];
2dd7a1c0 563
404410a5
RB
564 dstU[i] = (RU * r + GU * g + BU * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
565 dstV[i] = (RV * r + GV * g + BV * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
2dd7a1c0
RB
566 }
567}
568
404410a5
RB
569#define rdpx(src) \
570 is_be ? AV_RB16(src) : AV_RL16(src)
571static av_always_inline void planar_rgb16_to_y(uint8_t *_dst, const uint8_t *_src[4],
572 int width, int bpc, int is_be)
2dd7a1c0
RB
573{
574 int i;
9b75ae05
DB
575 const uint16_t **src = (const uint16_t **)_src;
576 uint16_t *dst = (uint16_t *)_dst;
2dd7a1c0 577 for (i = 0; i < width; i++) {
404410a5
RB
578 int g = rdpx(src[0] + i);
579 int b = rdpx(src[1] + i);
580 int r = rdpx(src[2] + i);
2dd7a1c0 581
404410a5 582 dst[i] = ((RY * r + GY * g + BY * b + (33 << (RGB2YUV_SHIFT + bpc - 9))) >> RGB2YUV_SHIFT);
2dd7a1c0
RB
583 }
584}
585
404410a5 586static void planar_rgb9le_to_y(uint8_t *dst, const uint8_t *src[4], int w)
2dd7a1c0 587{
404410a5
RB
588 planar_rgb16_to_y(dst, src, w, 9, 0);
589}
2dd7a1c0 590
404410a5
RB
591static void planar_rgb9be_to_y(uint8_t *dst, const uint8_t *src[4], int w)
592{
593 planar_rgb16_to_y(dst, src, w, 9, 1);
2dd7a1c0
RB
594}
595
404410a5 596static void planar_rgb10le_to_y(uint8_t *dst, const uint8_t *src[4], int w)
2dd7a1c0 597{
404410a5
RB
598 planar_rgb16_to_y(dst, src, w, 10, 0);
599}
2dd7a1c0 600
404410a5
RB
601static void planar_rgb10be_to_y(uint8_t *dst, const uint8_t *src[4], int w)
602{
603 planar_rgb16_to_y(dst, src, w, 10, 1);
2dd7a1c0
RB
604}
605
404410a5
RB
606static void planar_rgb16le_to_y(uint8_t *dst, const uint8_t *src[4], int w)
607{
608 planar_rgb16_to_y(dst, src, w, 16, 0);
609}
610
611static void planar_rgb16be_to_y(uint8_t *dst, const uint8_t *src[4], int w)
612{
613 planar_rgb16_to_y(dst, src, w, 16, 1);
614}
615
616static av_always_inline void planar_rgb16_to_uv(uint8_t *_dstU, uint8_t *_dstV,
617 const uint8_t *_src[4], int width,
618 int bpc, int is_be)
2dd7a1c0
RB
619{
620 int i;
9b75ae05
DB
621 const uint16_t **src = (const uint16_t **)_src;
622 uint16_t *dstU = (uint16_t *)_dstU;
623 uint16_t *dstV = (uint16_t *)_dstV;
2dd7a1c0 624 for (i = 0; i < width; i++) {
404410a5
RB
625 int g = rdpx(src[0] + i);
626 int b = rdpx(src[1] + i);
627 int r = rdpx(src[2] + i);
2dd7a1c0 628
404410a5
RB
629 dstU[i] = (RU * r + GU * g + BU * b + (257 << (RGB2YUV_SHIFT + bpc - 9))) >> RGB2YUV_SHIFT;
630 dstV[i] = (RV * r + GV * g + BV * b + (257 << (RGB2YUV_SHIFT + bpc - 9))) >> RGB2YUV_SHIFT;
2dd7a1c0
RB
631 }
632}
404410a5
RB
633#undef rdpx
634
635static void planar_rgb9le_to_uv(uint8_t *dstU, uint8_t *dstV,
636 const uint8_t *src[4], int w)
637{
638 planar_rgb16_to_uv(dstU, dstV, src, w, 9, 0);
639}
640
641static void planar_rgb9be_to_uv(uint8_t *dstU, uint8_t *dstV,
642 const uint8_t *src[4], int w)
643{
644 planar_rgb16_to_uv(dstU, dstV, src, w, 9, 1);
645}
646
647static void planar_rgb10le_to_uv(uint8_t *dstU, uint8_t *dstV,
648 const uint8_t *src[4], int w)
649{
650 planar_rgb16_to_uv(dstU, dstV, src, w, 10, 0);
651}
652
653static void planar_rgb10be_to_uv(uint8_t *dstU, uint8_t *dstV,
654 const uint8_t *src[4], int w)
655{
656 planar_rgb16_to_uv(dstU, dstV, src, w, 10, 1);
657}
658
659static void planar_rgb16le_to_uv(uint8_t *dstU, uint8_t *dstV,
660 const uint8_t *src[4], int w)
661{
662 planar_rgb16_to_uv(dstU, dstV, src, w, 16, 0);
663}
664
665static void planar_rgb16be_to_uv(uint8_t *dstU, uint8_t *dstV,
666 const uint8_t *src[4], int w)
667{
668 planar_rgb16_to_uv(dstU, dstV, src, w, 16, 1);
669}
2dd7a1c0
RB
670
671av_cold void ff_sws_init_input_funcs(SwsContext *c)
672{
716d413c 673 enum AVPixelFormat srcFormat = c->srcFormat;
2dd7a1c0
RB
674
675 c->chrToYV12 = NULL;
9b75ae05 676 switch (srcFormat) {
716d413c 677 case AV_PIX_FMT_YUYV422:
9b75ae05
DB
678 c->chrToYV12 = yuy2ToUV_c;
679 break;
716d413c 680 case AV_PIX_FMT_UYVY422:
9b75ae05
DB
681 c->chrToYV12 = uyvyToUV_c;
682 break;
716d413c 683 case AV_PIX_FMT_NV12:
9b75ae05
DB
684 c->chrToYV12 = nv12ToUV_c;
685 break;
716d413c 686 case AV_PIX_FMT_NV21:
9b75ae05
DB
687 c->chrToYV12 = nv21ToUV_c;
688 break;
716d413c
AK
689 case AV_PIX_FMT_RGB8:
690 case AV_PIX_FMT_BGR8:
691 case AV_PIX_FMT_PAL8:
692 case AV_PIX_FMT_BGR4_BYTE:
693 case AV_PIX_FMT_RGB4_BYTE:
9b75ae05
DB
694 c->chrToYV12 = palToUV_c;
695 break;
716d413c 696 case AV_PIX_FMT_GBRP9LE:
404410a5
RB
697 c->readChrPlanar = planar_rgb9le_to_uv;
698 break;
716d413c 699 case AV_PIX_FMT_GBRP10LE:
404410a5
RB
700 c->readChrPlanar = planar_rgb10le_to_uv;
701 break;
716d413c 702 case AV_PIX_FMT_GBRP16LE:
9b75ae05
DB
703 c->readChrPlanar = planar_rgb16le_to_uv;
704 break;
716d413c 705 case AV_PIX_FMT_GBRP9BE:
404410a5
RB
706 c->readChrPlanar = planar_rgb9be_to_uv;
707 break;
716d413c 708 case AV_PIX_FMT_GBRP10BE:
404410a5
RB
709 c->readChrPlanar = planar_rgb10be_to_uv;
710 break;
716d413c 711 case AV_PIX_FMT_GBRP16BE:
9b75ae05
DB
712 c->readChrPlanar = planar_rgb16be_to_uv;
713 break;
716d413c 714 case AV_PIX_FMT_GBRP:
9b75ae05
DB
715 c->readChrPlanar = planar_rgb_to_uv;
716 break;
2dd7a1c0 717#if HAVE_BIGENDIAN
716d413c
AK
718 case AV_PIX_FMT_YUV444P9LE:
719 case AV_PIX_FMT_YUV422P9LE:
720 case AV_PIX_FMT_YUV420P9LE:
721 case AV_PIX_FMT_YUV422P10LE:
722 case AV_PIX_FMT_YUV444P10LE:
723 case AV_PIX_FMT_YUV420P10LE:
724 case AV_PIX_FMT_YUV420P16LE:
725 case AV_PIX_FMT_YUV422P16LE:
726 case AV_PIX_FMT_YUV444P16LE:
9b75ae05
DB
727 c->chrToYV12 = bswap16UV_c;
728 break;
2dd7a1c0 729#else
716d413c
AK
730 case AV_PIX_FMT_YUV444P9BE:
731 case AV_PIX_FMT_YUV422P9BE:
732 case AV_PIX_FMT_YUV420P9BE:
733 case AV_PIX_FMT_YUV444P10BE:
734 case AV_PIX_FMT_YUV422P10BE:
735 case AV_PIX_FMT_YUV420P10BE:
736 case AV_PIX_FMT_YUV420P16BE:
737 case AV_PIX_FMT_YUV422P16BE:
738 case AV_PIX_FMT_YUV444P16BE:
9b75ae05
DB
739 c->chrToYV12 = bswap16UV_c;
740 break;
2dd7a1c0
RB
741#endif
742 }
743 if (c->chrSrcHSubSample) {
9b75ae05 744 switch (srcFormat) {
716d413c 745 case AV_PIX_FMT_RGB48BE:
9b75ae05
DB
746 c->chrToYV12 = rgb48BEToUV_half_c;
747 break;
716d413c 748 case AV_PIX_FMT_RGB48LE:
9b75ae05
DB
749 c->chrToYV12 = rgb48LEToUV_half_c;
750 break;
716d413c 751 case AV_PIX_FMT_BGR48BE:
9b75ae05
DB
752 c->chrToYV12 = bgr48BEToUV_half_c;
753 break;
716d413c 754 case AV_PIX_FMT_BGR48LE:
9b75ae05
DB
755 c->chrToYV12 = bgr48LEToUV_half_c;
756 break;
716d413c 757 case AV_PIX_FMT_RGB32:
9b75ae05
DB
758 c->chrToYV12 = bgr32ToUV_half_c;
759 break;
716d413c 760 case AV_PIX_FMT_RGB32_1:
9b75ae05
DB
761 c->chrToYV12 = bgr321ToUV_half_c;
762 break;
716d413c 763 case AV_PIX_FMT_BGR24:
9b75ae05
DB
764 c->chrToYV12 = bgr24ToUV_half_c;
765 break;
716d413c 766 case AV_PIX_FMT_BGR565LE:
9b75ae05
DB
767 c->chrToYV12 = bgr16leToUV_half_c;
768 break;
716d413c 769 case AV_PIX_FMT_BGR565BE:
9b75ae05
DB
770 c->chrToYV12 = bgr16beToUV_half_c;
771 break;
716d413c 772 case AV_PIX_FMT_BGR555LE:
9b75ae05
DB
773 c->chrToYV12 = bgr15leToUV_half_c;
774 break;
716d413c 775 case AV_PIX_FMT_BGR555BE:
9b75ae05
DB
776 c->chrToYV12 = bgr15beToUV_half_c;
777 break;
716d413c 778 case AV_PIX_FMT_BGR444LE:
9b75ae05
DB
779 c->chrToYV12 = bgr12leToUV_half_c;
780 break;
716d413c 781 case AV_PIX_FMT_BGR444BE:
9b75ae05
DB
782 c->chrToYV12 = bgr12beToUV_half_c;
783 break;
716d413c 784 case AV_PIX_FMT_BGR32:
9b75ae05
DB
785 c->chrToYV12 = rgb32ToUV_half_c;
786 break;
716d413c 787 case AV_PIX_FMT_BGR32_1:
9b75ae05
DB
788 c->chrToYV12 = rgb321ToUV_half_c;
789 break;
716d413c 790 case AV_PIX_FMT_RGB24:
9b75ae05
DB
791 c->chrToYV12 = rgb24ToUV_half_c;
792 break;
716d413c 793 case AV_PIX_FMT_RGB565LE:
9b75ae05
DB
794 c->chrToYV12 = rgb16leToUV_half_c;
795 break;
716d413c 796 case AV_PIX_FMT_RGB565BE:
9b75ae05
DB
797 c->chrToYV12 = rgb16beToUV_half_c;
798 break;
716d413c 799 case AV_PIX_FMT_RGB555LE:
9b75ae05
DB
800 c->chrToYV12 = rgb15leToUV_half_c;
801 break;
716d413c 802 case AV_PIX_FMT_RGB555BE:
9b75ae05
DB
803 c->chrToYV12 = rgb15beToUV_half_c;
804 break;
716d413c 805 case AV_PIX_FMT_RGB444LE:
9b75ae05
DB
806 c->chrToYV12 = rgb12leToUV_half_c;
807 break;
716d413c 808 case AV_PIX_FMT_RGB444BE:
9b75ae05
DB
809 c->chrToYV12 = rgb12beToUV_half_c;
810 break;
2dd7a1c0
RB
811 }
812 } else {
9b75ae05 813 switch (srcFormat) {
716d413c 814 case AV_PIX_FMT_RGB48BE:
9b75ae05
DB
815 c->chrToYV12 = rgb48BEToUV_c;
816 break;
716d413c 817 case AV_PIX_FMT_RGB48LE:
9b75ae05
DB
818 c->chrToYV12 = rgb48LEToUV_c;
819 break;
716d413c 820 case AV_PIX_FMT_BGR48BE:
9b75ae05
DB
821 c->chrToYV12 = bgr48BEToUV_c;
822 break;
716d413c 823 case AV_PIX_FMT_BGR48LE:
9b75ae05
DB
824 c->chrToYV12 = bgr48LEToUV_c;
825 break;
716d413c 826 case AV_PIX_FMT_RGB32:
9b75ae05
DB
827 c->chrToYV12 = bgr32ToUV_c;
828 break;
716d413c 829 case AV_PIX_FMT_RGB32_1:
9b75ae05
DB
830 c->chrToYV12 = bgr321ToUV_c;
831 break;
716d413c 832 case AV_PIX_FMT_BGR24:
9b75ae05
DB
833 c->chrToYV12 = bgr24ToUV_c;
834 break;
716d413c 835 case AV_PIX_FMT_BGR565LE:
9b75ae05
DB
836 c->chrToYV12 = bgr16leToUV_c;
837 break;
716d413c 838 case AV_PIX_FMT_BGR565BE:
9b75ae05
DB
839 c->chrToYV12 = bgr16beToUV_c;
840 break;
716d413c 841 case AV_PIX_FMT_BGR555LE:
9b75ae05
DB
842 c->chrToYV12 = bgr15leToUV_c;
843 break;
716d413c 844 case AV_PIX_FMT_BGR555BE:
9b75ae05
DB
845 c->chrToYV12 = bgr15beToUV_c;
846 break;
716d413c 847 case AV_PIX_FMT_BGR444LE:
9b75ae05
DB
848 c->chrToYV12 = bgr12leToUV_c;
849 break;
716d413c 850 case AV_PIX_FMT_BGR444BE:
9b75ae05
DB
851 c->chrToYV12 = bgr12beToUV_c;
852 break;
716d413c 853 case AV_PIX_FMT_BGR32:
9b75ae05
DB
854 c->chrToYV12 = rgb32ToUV_c;
855 break;
716d413c 856 case AV_PIX_FMT_BGR32_1:
9b75ae05
DB
857 c->chrToYV12 = rgb321ToUV_c;
858 break;
716d413c 859 case AV_PIX_FMT_RGB24:
9b75ae05
DB
860 c->chrToYV12 = rgb24ToUV_c;
861 break;
716d413c 862 case AV_PIX_FMT_RGB565LE:
9b75ae05
DB
863 c->chrToYV12 = rgb16leToUV_c;
864 break;
716d413c 865 case AV_PIX_FMT_RGB565BE:
9b75ae05
DB
866 c->chrToYV12 = rgb16beToUV_c;
867 break;
716d413c 868 case AV_PIX_FMT_RGB555LE:
9b75ae05
DB
869 c->chrToYV12 = rgb15leToUV_c;
870 break;
716d413c 871 case AV_PIX_FMT_RGB555BE:
9b75ae05
DB
872 c->chrToYV12 = rgb15beToUV_c;
873 break;
716d413c 874 case AV_PIX_FMT_RGB444LE:
9b75ae05
DB
875 c->chrToYV12 = rgb12leToUV_c;
876 break;
716d413c 877 case AV_PIX_FMT_RGB444BE:
9b75ae05
DB
878 c->chrToYV12 = rgb12beToUV_c;
879 break;
2dd7a1c0
RB
880 }
881 }
882
883 c->lumToYV12 = NULL;
884 c->alpToYV12 = NULL;
885 switch (srcFormat) {
716d413c 886 case AV_PIX_FMT_GBRP9LE:
404410a5
RB
887 c->readLumPlanar = planar_rgb9le_to_y;
888 break;
716d413c 889 case AV_PIX_FMT_GBRP10LE:
404410a5
RB
890 c->readLumPlanar = planar_rgb10le_to_y;
891 break;
716d413c 892 case AV_PIX_FMT_GBRP16LE:
9b75ae05
DB
893 c->readLumPlanar = planar_rgb16le_to_y;
894 break;
716d413c 895 case AV_PIX_FMT_GBRP9BE:
404410a5
RB
896 c->readLumPlanar = planar_rgb9be_to_y;
897 break;
716d413c 898 case AV_PIX_FMT_GBRP10BE:
404410a5
RB
899 c->readLumPlanar = planar_rgb10be_to_y;
900 break;
716d413c 901 case AV_PIX_FMT_GBRP16BE:
9b75ae05
DB
902 c->readLumPlanar = planar_rgb16be_to_y;
903 break;
716d413c 904 case AV_PIX_FMT_GBRP:
9b75ae05
DB
905 c->readLumPlanar = planar_rgb_to_y;
906 break;
2dd7a1c0 907#if HAVE_BIGENDIAN
716d413c
AK
908 case AV_PIX_FMT_YUV444P9LE:
909 case AV_PIX_FMT_YUV422P9LE:
910 case AV_PIX_FMT_YUV420P9LE:
911 case AV_PIX_FMT_YUV444P10LE:
912 case AV_PIX_FMT_YUV422P10LE:
913 case AV_PIX_FMT_YUV420P10LE:
914 case AV_PIX_FMT_YUV420P16LE:
915 case AV_PIX_FMT_YUV422P16LE:
916 case AV_PIX_FMT_YUV444P16LE:
917 case AV_PIX_FMT_GRAY16LE:
9b75ae05
DB
918 c->lumToYV12 = bswap16Y_c;
919 break;
2dd7a1c0 920#else
716d413c
AK
921 case AV_PIX_FMT_YUV444P9BE:
922 case AV_PIX_FMT_YUV422P9BE:
923 case AV_PIX_FMT_YUV420P9BE:
924 case AV_PIX_FMT_YUV444P10BE:
925 case AV_PIX_FMT_YUV422P10BE:
926 case AV_PIX_FMT_YUV420P10BE:
927 case AV_PIX_FMT_YUV420P16BE:
928 case AV_PIX_FMT_YUV422P16BE:
929 case AV_PIX_FMT_YUV444P16BE:
930 case AV_PIX_FMT_GRAY16BE:
9b75ae05
DB
931 c->lumToYV12 = bswap16Y_c;
932 break;
2dd7a1c0 933#endif
716d413c
AK
934 case AV_PIX_FMT_YUYV422:
935 case AV_PIX_FMT_Y400A:
9b75ae05
DB
936 c->lumToYV12 = yuy2ToY_c;
937 break;
716d413c 938 case AV_PIX_FMT_UYVY422:
9b75ae05
DB
939 c->lumToYV12 = uyvyToY_c;
940 break;
716d413c 941 case AV_PIX_FMT_BGR24:
9b75ae05
DB
942 c->lumToYV12 = bgr24ToY_c;
943 break;
716d413c 944 case AV_PIX_FMT_BGR565LE:
9b75ae05
DB
945 c->lumToYV12 = bgr16leToY_c;
946 break;
716d413c 947 case AV_PIX_FMT_BGR565BE:
9b75ae05
DB
948 c->lumToYV12 = bgr16beToY_c;
949 break;
716d413c 950 case AV_PIX_FMT_BGR555LE:
9b75ae05
DB
951 c->lumToYV12 = bgr15leToY_c;
952 break;
716d413c 953 case AV_PIX_FMT_BGR555BE:
9b75ae05
DB
954 c->lumToYV12 = bgr15beToY_c;
955 break;
716d413c 956 case AV_PIX_FMT_BGR444LE:
9b75ae05
DB
957 c->lumToYV12 = bgr12leToY_c;
958 break;
716d413c 959 case AV_PIX_FMT_BGR444BE:
9b75ae05
DB
960 c->lumToYV12 = bgr12beToY_c;
961 break;
716d413c 962 case AV_PIX_FMT_RGB24:
9b75ae05
DB
963 c->lumToYV12 = rgb24ToY_c;
964 break;
716d413c 965 case AV_PIX_FMT_RGB565LE:
9b75ae05
DB
966 c->lumToYV12 = rgb16leToY_c;
967 break;
716d413c 968 case AV_PIX_FMT_RGB565BE:
9b75ae05
DB
969 c->lumToYV12 = rgb16beToY_c;
970 break;
716d413c 971 case AV_PIX_FMT_RGB555LE:
9b75ae05
DB
972 c->lumToYV12 = rgb15leToY_c;
973 break;
716d413c 974 case AV_PIX_FMT_RGB555BE:
9b75ae05
DB
975 c->lumToYV12 = rgb15beToY_c;
976 break;
716d413c 977 case AV_PIX_FMT_RGB444LE:
9b75ae05
DB
978 c->lumToYV12 = rgb12leToY_c;
979 break;
716d413c 980 case AV_PIX_FMT_RGB444BE:
9b75ae05
DB
981 c->lumToYV12 = rgb12beToY_c;
982 break;
716d413c
AK
983 case AV_PIX_FMT_RGB8:
984 case AV_PIX_FMT_BGR8:
985 case AV_PIX_FMT_PAL8:
986 case AV_PIX_FMT_BGR4_BYTE:
987 case AV_PIX_FMT_RGB4_BYTE:
9b75ae05
DB
988 c->lumToYV12 = palToY_c;
989 break;
716d413c 990 case AV_PIX_FMT_MONOBLACK:
9b75ae05
DB
991 c->lumToYV12 = monoblack2Y_c;
992 break;
716d413c 993 case AV_PIX_FMT_MONOWHITE:
9b75ae05
DB
994 c->lumToYV12 = monowhite2Y_c;
995 break;
716d413c 996 case AV_PIX_FMT_RGB32:
9b75ae05
DB
997 c->lumToYV12 = bgr32ToY_c;
998 break;
716d413c 999 case AV_PIX_FMT_RGB32_1:
9b75ae05
DB
1000 c->lumToYV12 = bgr321ToY_c;
1001 break;
716d413c 1002 case AV_PIX_FMT_BGR32:
9b75ae05
DB
1003 c->lumToYV12 = rgb32ToY_c;
1004 break;
716d413c 1005 case AV_PIX_FMT_BGR32_1:
9b75ae05
DB
1006 c->lumToYV12 = rgb321ToY_c;
1007 break;
716d413c 1008 case AV_PIX_FMT_RGB48BE:
9b75ae05
DB
1009 c->lumToYV12 = rgb48BEToY_c;
1010 break;
716d413c 1011 case AV_PIX_FMT_RGB48LE:
9b75ae05
DB
1012 c->lumToYV12 = rgb48LEToY_c;
1013 break;
716d413c 1014 case AV_PIX_FMT_BGR48BE:
9b75ae05
DB
1015 c->lumToYV12 = bgr48BEToY_c;
1016 break;
716d413c 1017 case AV_PIX_FMT_BGR48LE:
9b75ae05
DB
1018 c->lumToYV12 = bgr48LEToY_c;
1019 break;
2dd7a1c0
RB
1020 }
1021 if (c->alpPixBuf) {
1022 switch (srcFormat) {
716d413c
AK
1023 case AV_PIX_FMT_BGRA:
1024 case AV_PIX_FMT_RGBA:
9b75ae05
DB
1025 c->alpToYV12 = rgbaToA_c;
1026 break;
716d413c
AK
1027 case AV_PIX_FMT_ABGR:
1028 case AV_PIX_FMT_ARGB:
9b75ae05
DB
1029 c->alpToYV12 = abgrToA_c;
1030 break;
716d413c 1031 case AV_PIX_FMT_Y400A:
9b75ae05
DB
1032 c->alpToYV12 = uyvyToY_c;
1033 break;
2dd7a1c0
RB
1034 }
1035 }
1036}