FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
input.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2001-2012 Michael Niedermayer <michaelni@gmx.at>
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include <math.h>
22 #include <stdint.h>
23 #include <stdio.h>
24 #include <string.h>
25 
26 #include "libavutil/avutil.h"
27 #include "libavutil/bswap.h"
28 #include "libavutil/cpu.h"
29 #include "libavutil/intreadwrite.h"
30 #include "libavutil/mathematics.h"
31 #include "libavutil/pixdesc.h"
32 #include "libavutil/avassert.h"
33 #include "config.h"
34 #include "rgb2rgb.h"
35 #include "swscale.h"
36 #include "swscale_internal.h"
37 
38 #define input_pixel(pos) (isBE(origin) ? AV_RB16(pos) : AV_RL16(pos))
39 
40 #define r ((origin == AV_PIX_FMT_BGR48BE || origin == AV_PIX_FMT_BGR48LE || origin == AV_PIX_FMT_BGRA64BE || origin == AV_PIX_FMT_BGRA64LE) ? b_r : r_b)
41 #define b ((origin == AV_PIX_FMT_BGR48BE || origin == AV_PIX_FMT_BGR48LE || origin == AV_PIX_FMT_BGRA64BE || origin == AV_PIX_FMT_BGRA64LE) ? r_b : b_r)
42 
43 static av_always_inline void
44 rgb64ToY_c_template(uint16_t *dst, const uint16_t *src, int width,
45  enum AVPixelFormat origin, int32_t *rgb2yuv)
46 {
47  int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
48  int i;
49  for (i = 0; i < width; i++) {
50  unsigned int r_b = input_pixel(&src[i*4+0]);
51  unsigned int g = input_pixel(&src[i*4+1]);
52  unsigned int b_r = input_pixel(&src[i*4+2]);
53 
54  dst[i] = (ry*r + gy*g + by*b + (0x2001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
55  }
56 }
57 
58 static av_always_inline void
59 rgb64ToUV_c_template(uint16_t *dstU, uint16_t *dstV,
60  const uint16_t *src1, const uint16_t *src2,
61  int width, enum AVPixelFormat origin, int32_t *rgb2yuv)
62 {
63  int i;
64  int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
65  int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
66  av_assert1(src1==src2);
67  for (i = 0; i < width; i++) {
68  int r_b = input_pixel(&src1[i*4+0]);
69  int g = input_pixel(&src1[i*4+1]);
70  int b_r = input_pixel(&src1[i*4+2]);
71 
72  dstU[i] = (ru*r + gu*g + bu*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
73  dstV[i] = (rv*r + gv*g + bv*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
74  }
75 }
76 
77 static av_always_inline void
78 rgb64ToUV_half_c_template(uint16_t *dstU, uint16_t *dstV,
79  const uint16_t *src1, const uint16_t *src2,
80  int width, enum AVPixelFormat origin, int32_t *rgb2yuv)
81 {
82  int i;
83  int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
84  int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
85  av_assert1(src1==src2);
86  for (i = 0; i < width; i++) {
87  int r_b = (input_pixel(&src1[8 * i + 0]) + input_pixel(&src1[8 * i + 4]) + 1) >> 1;
88  int g = (input_pixel(&src1[8 * i + 1]) + input_pixel(&src1[8 * i + 5]) + 1) >> 1;
89  int b_r = (input_pixel(&src1[8 * i + 2]) + input_pixel(&src1[8 * i + 6]) + 1) >> 1;
90 
91  dstU[i]= (ru*r + gu*g + bu*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
92  dstV[i]= (rv*r + gv*g + bv*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
93  }
94 }
95 
96 #define rgb64funcs(pattern, BE_LE, origin) \
97 static void pattern ## 64 ## BE_LE ## ToY_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused0, const uint8_t *unused1,\
98  int width, uint32_t *rgb2yuv) \
99 { \
100  const uint16_t *src = (const uint16_t *) _src; \
101  uint16_t *dst = (uint16_t *) _dst; \
102  rgb64ToY_c_template(dst, src, width, origin, rgb2yuv); \
103 } \
104  \
105 static void pattern ## 64 ## BE_LE ## ToUV_c(uint8_t *_dstU, uint8_t *_dstV, \
106  const uint8_t *unused0, const uint8_t *_src1, const uint8_t *_src2, \
107  int width, uint32_t *rgb2yuv) \
108 { \
109  const uint16_t *src1 = (const uint16_t *) _src1, \
110  *src2 = (const uint16_t *) _src2; \
111  uint16_t *dstU = (uint16_t *) _dstU, *dstV = (uint16_t *) _dstV; \
112  rgb64ToUV_c_template(dstU, dstV, src1, src2, width, origin, rgb2yuv); \
113 } \
114  \
115 static void pattern ## 64 ## BE_LE ## ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, \
116  const uint8_t *unused0, const uint8_t *_src1, const uint8_t *_src2, \
117  int width, uint32_t *rgb2yuv) \
118 { \
119  const uint16_t *src1 = (const uint16_t *) _src1, \
120  *src2 = (const uint16_t *) _src2; \
121  uint16_t *dstU = (uint16_t *) _dstU, *dstV = (uint16_t *) _dstV; \
122  rgb64ToUV_half_c_template(dstU, dstV, src1, src2, width, origin, rgb2yuv); \
123 }
124 
129 
130 static av_always_inline void rgb48ToY_c_template(uint16_t *dst,
131  const uint16_t *src, int width,
132  enum AVPixelFormat origin,
133  int32_t *rgb2yuv)
134 {
135  int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
136  int i;
137  for (i = 0; i < width; i++) {
138  unsigned int r_b = input_pixel(&src[i * 3 + 0]);
139  unsigned int g = input_pixel(&src[i * 3 + 1]);
140  unsigned int b_r = input_pixel(&src[i * 3 + 2]);
141 
142  dst[i] = (ry*r + gy*g + by*b + (0x2001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
143  }
144 }
145 
146 static av_always_inline void rgb48ToUV_c_template(uint16_t *dstU,
147  uint16_t *dstV,
148  const uint16_t *src1,
149  const uint16_t *src2,
150  int width,
151  enum AVPixelFormat origin,
152  int32_t *rgb2yuv)
153 {
154  int i;
155  int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
156  int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
157  av_assert1(src1 == src2);
158  for (i = 0; i < width; i++) {
159  int r_b = input_pixel(&src1[i * 3 + 0]);
160  int g = input_pixel(&src1[i * 3 + 1]);
161  int b_r = input_pixel(&src1[i * 3 + 2]);
162 
163  dstU[i] = (ru*r + gu*g + bu*b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
164  dstV[i] = (rv*r + gv*g + bv*b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
165  }
166 }
167 
168 static av_always_inline void rgb48ToUV_half_c_template(uint16_t *dstU,
169  uint16_t *dstV,
170  const uint16_t *src1,
171  const uint16_t *src2,
172  int width,
173  enum AVPixelFormat origin,
174  int32_t *rgb2yuv)
175 {
176  int i;
177  int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
178  int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
179  av_assert1(src1 == src2);
180  for (i = 0; i < width; i++) {
181  int r_b = (input_pixel(&src1[6 * i + 0]) +
182  input_pixel(&src1[6 * i + 3]) + 1) >> 1;
183  int g = (input_pixel(&src1[6 * i + 1]) +
184  input_pixel(&src1[6 * i + 4]) + 1) >> 1;
185  int b_r = (input_pixel(&src1[6 * i + 2]) +
186  input_pixel(&src1[6 * i + 5]) + 1) >> 1;
187 
188  dstU[i] = (ru*r + gu*g + bu*b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
189  dstV[i] = (rv*r + gv*g + bv*b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
190  }
191 }
192 
193 #undef r
194 #undef b
195 #undef input_pixel
196 
197 #define rgb48funcs(pattern, BE_LE, origin) \
198 static void pattern ## 48 ## BE_LE ## ToY_c(uint8_t *_dst, \
199  const uint8_t *_src, \
200  const uint8_t *unused0, const uint8_t *unused1,\
201  int width, \
202  uint32_t *rgb2yuv) \
203 { \
204  const uint16_t *src = (const uint16_t *)_src; \
205  uint16_t *dst = (uint16_t *)_dst; \
206  rgb48ToY_c_template(dst, src, width, origin, rgb2yuv); \
207 } \
208  \
209 static void pattern ## 48 ## BE_LE ## ToUV_c(uint8_t *_dstU, \
210  uint8_t *_dstV, \
211  const uint8_t *unused0, \
212  const uint8_t *_src1, \
213  const uint8_t *_src2, \
214  int width, \
215  uint32_t *rgb2yuv) \
216 { \
217  const uint16_t *src1 = (const uint16_t *)_src1, \
218  *src2 = (const uint16_t *)_src2; \
219  uint16_t *dstU = (uint16_t *)_dstU, \
220  *dstV = (uint16_t *)_dstV; \
221  rgb48ToUV_c_template(dstU, dstV, src1, src2, width, origin, rgb2yuv); \
222 } \
223  \
224 static void pattern ## 48 ## BE_LE ## ToUV_half_c(uint8_t *_dstU, \
225  uint8_t *_dstV, \
226  const uint8_t *unused0, \
227  const uint8_t *_src1, \
228  const uint8_t *_src2, \
229  int width, \
230  uint32_t *rgb2yuv) \
231 { \
232  const uint16_t *src1 = (const uint16_t *)_src1, \
233  *src2 = (const uint16_t *)_src2; \
234  uint16_t *dstU = (uint16_t *)_dstU, \
235  *dstV = (uint16_t *)_dstV; \
236  rgb48ToUV_half_c_template(dstU, dstV, src1, src2, width, origin, rgb2yuv); \
237 }
238 
243 
244 #define input_pixel(i) ((origin == AV_PIX_FMT_RGBA || \
245  origin == AV_PIX_FMT_BGRA || \
246  origin == AV_PIX_FMT_ARGB || \
247  origin == AV_PIX_FMT_ABGR) \
248  ? AV_RN32A(&src[(i) * 4]) \
249  : (isBE(origin) ? AV_RB16(&src[(i) * 2]) \
250  : AV_RL16(&src[(i) * 2])))
251 
252 static av_always_inline void rgb16_32ToY_c_template(int16_t *dst,
253  const uint8_t *src,
254  int width,
255  enum AVPixelFormat origin,
256  int shr, int shg,
257  int shb, int shp,
258  int maskr, int maskg,
259  int maskb, int rsh,
260  int gsh, int bsh, int S,
261  int32_t *rgb2yuv)
262 {
263  const int ry = rgb2yuv[RY_IDX]<<rsh, gy = rgb2yuv[GY_IDX]<<gsh, by = rgb2yuv[BY_IDX]<<bsh;
264  const unsigned rnd = (32<<((S)-1)) + (1<<(S-7));
265  int i;
266 
267  for (i = 0; i < width; i++) {
268  int px = input_pixel(i) >> shp;
269  int b = (px & maskb) >> shb;
270  int g = (px & maskg) >> shg;
271  int r = (px & maskr) >> shr;
272 
273  dst[i] = (ry * r + gy * g + by * b + rnd) >> ((S)-6);
274  }
275 }
276 
277 static av_always_inline void rgb16_32ToUV_c_template(int16_t *dstU,
278  int16_t *dstV,
279  const uint8_t *src,
280  int width,
281  enum AVPixelFormat origin,
282  int shr, int shg,
283  int shb, int shp,
284  int maskr, int maskg,
285  int maskb, int rsh,
286  int gsh, int bsh, int S,
287  int32_t *rgb2yuv)
288 {
289  const int ru = rgb2yuv[RU_IDX] << rsh, gu = rgb2yuv[GU_IDX] << gsh, bu = rgb2yuv[BU_IDX] << bsh,
290  rv = rgb2yuv[RV_IDX] << rsh, gv = rgb2yuv[GV_IDX] << gsh, bv = rgb2yuv[BV_IDX] << bsh;
291  const unsigned rnd = (256u<<((S)-1)) + (1<<(S-7));
292  int i;
293 
294  for (i = 0; i < width; i++) {
295  int px = input_pixel(i) >> shp;
296  int b = (px & maskb) >> shb;
297  int g = (px & maskg) >> shg;
298  int r = (px & maskr) >> shr;
299 
300  dstU[i] = (ru * r + gu * g + bu * b + rnd) >> ((S)-6);
301  dstV[i] = (rv * r + gv * g + bv * b + rnd) >> ((S)-6);
302  }
303 }
304 
306  int16_t *dstV,
307  const uint8_t *src,
308  int width,
309  enum AVPixelFormat origin,
310  int shr, int shg,
311  int shb, int shp,
312  int maskr, int maskg,
313  int maskb, int rsh,
314  int gsh, int bsh, int S,
315  int32_t *rgb2yuv)
316 {
317  const int ru = rgb2yuv[RU_IDX] << rsh, gu = rgb2yuv[GU_IDX] << gsh, bu = rgb2yuv[BU_IDX] << bsh,
318  rv = rgb2yuv[RV_IDX] << rsh, gv = rgb2yuv[GV_IDX] << gsh, bv = rgb2yuv[BV_IDX] << bsh,
319  maskgx = ~(maskr | maskb);
320  const unsigned rnd = (256U<<(S)) + (1<<(S-6));
321  int i;
322 
323  maskr |= maskr << 1;
324  maskb |= maskb << 1;
325  maskg |= maskg << 1;
326  for (i = 0; i < width; i++) {
327  unsigned px0 = input_pixel(2 * i + 0) >> shp;
328  unsigned px1 = input_pixel(2 * i + 1) >> shp;
329  int b, r, g = (px0 & maskgx) + (px1 & maskgx);
330  int rb = px0 + px1 - g;
331 
332  b = (rb & maskb) >> shb;
333  if (shp ||
334  origin == AV_PIX_FMT_BGR565LE || origin == AV_PIX_FMT_BGR565BE ||
335  origin == AV_PIX_FMT_RGB565LE || origin == AV_PIX_FMT_RGB565BE) {
336  g >>= shg;
337  } else {
338  g = (g & maskg) >> shg;
339  }
340  r = (rb & maskr) >> shr;
341 
342  dstU[i] = (ru * r + gu * g + bu * b + (unsigned)rnd) >> ((S)-6+1);
343  dstV[i] = (rv * r + gv * g + bv * b + (unsigned)rnd) >> ((S)-6+1);
344  }
345 }
346 
347 #undef input_pixel
348 
349 #define rgb16_32_wrapper(fmt, name, shr, shg, shb, shp, maskr, \
350  maskg, maskb, rsh, gsh, bsh, S) \
351 static void name ## ToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, \
352  int width, uint32_t *tab) \
353 { \
354  rgb16_32ToY_c_template((int16_t*)dst, src, width, fmt, shr, shg, shb, shp, \
355  maskr, maskg, maskb, rsh, gsh, bsh, S, tab); \
356 } \
357  \
358 static void name ## ToUV_c(uint8_t *dstU, uint8_t *dstV, \
359  const uint8_t *unused0, const uint8_t *src, const uint8_t *dummy, \
360  int width, uint32_t *tab) \
361 { \
362  rgb16_32ToUV_c_template((int16_t*)dstU, (int16_t*)dstV, src, width, fmt, \
363  shr, shg, shb, shp, \
364  maskr, maskg, maskb, rsh, gsh, bsh, S, tab);\
365 } \
366  \
367 static void name ## ToUV_half_c(uint8_t *dstU, uint8_t *dstV, \
368  const uint8_t *unused0, const uint8_t *src, \
369  const uint8_t *dummy, \
370  int width, uint32_t *tab) \
371 { \
372  rgb16_32ToUV_half_c_template((int16_t*)dstU, (int16_t*)dstV, src, width, fmt, \
373  shr, shg, shb, shp, \
374  maskr, maskg, maskb, \
375  rsh, gsh, bsh, S, tab); \
376 }
377 
378 rgb16_32_wrapper(AV_PIX_FMT_BGR32, bgr32, 16, 0, 0, 0, 0xFF0000, 0xFF00, 0x00FF, 8, 0, 8, RGB2YUV_SHIFT + 8)
379 rgb16_32_wrapper(AV_PIX_FMT_BGR32_1, bgr321, 16, 0, 0, 8, 0xFF0000, 0xFF00, 0x00FF, 8, 0, 8, RGB2YUV_SHIFT + 8)
380 rgb16_32_wrapper(AV_PIX_FMT_RGB32, rgb32, 0, 0, 16, 0, 0x00FF, 0xFF00, 0xFF0000, 8, 0, 8, RGB2YUV_SHIFT + 8)
381 rgb16_32_wrapper(AV_PIX_FMT_RGB32_1, rgb321, 0, 0, 16, 8, 0x00FF, 0xFF00, 0xFF0000, 8, 0, 8, RGB2YUV_SHIFT + 8)
382 rgb16_32_wrapper(AV_PIX_FMT_BGR565LE, bgr16le, 0, 0, 0, 0, 0x001F, 0x07E0, 0xF800, 11, 5, 0, RGB2YUV_SHIFT + 8)
383 rgb16_32_wrapper(AV_PIX_FMT_BGR555LE, bgr15le, 0, 0, 0, 0, 0x001F, 0x03E0, 0x7C00, 10, 5, 0, RGB2YUV_SHIFT + 7)
384 rgb16_32_wrapper(AV_PIX_FMT_BGR444LE, bgr12le, 0, 0, 0, 0, 0x000F, 0x00F0, 0x0F00, 8, 4, 0, RGB2YUV_SHIFT + 4)
385 rgb16_32_wrapper(AV_PIX_FMT_RGB565LE, rgb16le, 0, 0, 0, 0, 0xF800, 0x07E0, 0x001F, 0, 5, 11, RGB2YUV_SHIFT + 8)
386 rgb16_32_wrapper(AV_PIX_FMT_RGB555LE, rgb15le, 0, 0, 0, 0, 0x7C00, 0x03E0, 0x001F, 0, 5, 10, RGB2YUV_SHIFT + 7)
387 rgb16_32_wrapper(AV_PIX_FMT_RGB444LE, rgb12le, 0, 0, 0, 0, 0x0F00, 0x00F0, 0x000F, 0, 4, 8, RGB2YUV_SHIFT + 4)
388 rgb16_32_wrapper(AV_PIX_FMT_BGR565BE, bgr16be, 0, 0, 0, 0, 0x001F, 0x07E0, 0xF800, 11, 5, 0, RGB2YUV_SHIFT + 8)
389 rgb16_32_wrapper(AV_PIX_FMT_BGR555BE, bgr15be, 0, 0, 0, 0, 0x001F, 0x03E0, 0x7C00, 10, 5, 0, RGB2YUV_SHIFT + 7)
390 rgb16_32_wrapper(AV_PIX_FMT_BGR444BE, bgr12be, 0, 0, 0, 0, 0x000F, 0x00F0, 0x0F00, 8, 4, 0, RGB2YUV_SHIFT + 4)
391 rgb16_32_wrapper(AV_PIX_FMT_RGB565BE, rgb16be, 0, 0, 0, 0, 0xF800, 0x07E0, 0x001F, 0, 5, 11, RGB2YUV_SHIFT + 8)
392 rgb16_32_wrapper(AV_PIX_FMT_RGB555BE, rgb15be, 0, 0, 0, 0, 0x7C00, 0x03E0, 0x001F, 0, 5, 10, RGB2YUV_SHIFT + 7)
393 rgb16_32_wrapper(AV_PIX_FMT_RGB444BE, rgb12be, 0, 0, 0, 0, 0x0F00, 0x00F0, 0x000F, 0, 4, 8, RGB2YUV_SHIFT + 4)
394 
395 static void gbr24pToUV_half_c(uint8_t *_dstU, uint8_t *_dstV,
396  const uint8_t *gsrc, const uint8_t *bsrc, const uint8_t *rsrc,
397  int width, uint32_t *rgb2yuv)
398 {
399  uint16_t *dstU = (uint16_t *)_dstU;
400  uint16_t *dstV = (uint16_t *)_dstV;
401  int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
402  int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
403 
404  int i;
405  for (i = 0; i < width; i++) {
406  unsigned int g = gsrc[2*i] + gsrc[2*i+1];
407  unsigned int b = bsrc[2*i] + bsrc[2*i+1];
408  unsigned int r = rsrc[2*i] + rsrc[2*i+1];
409 
410  dstU[i] = (ru*r + gu*g + bu*b + (0x4001<<(RGB2YUV_SHIFT-6))) >> (RGB2YUV_SHIFT-6+1);
411  dstV[i] = (rv*r + gv*g + bv*b + (0x4001<<(RGB2YUV_SHIFT-6))) >> (RGB2YUV_SHIFT-6+1);
412  }
413 }
414 
415 static void rgba64leToA_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1,
416  const uint8_t *unused2, int width, uint32_t *unused)
417 {
418  int16_t *dst = (int16_t *)_dst;
419  const uint16_t *src = (const uint16_t *)_src;
420  int i;
421  for (i = 0; i < width; i++)
422  dst[i] = AV_RL16(src + 4 * i + 3);
423 }
424 
425 static void rgba64beToA_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1,
426  const uint8_t *unused2, int width, uint32_t *unused)
427 {
428  int16_t *dst = (int16_t *)_dst;
429  const uint16_t *src = (const uint16_t *)_src;
430  int i;
431  for (i = 0; i < width; i++)
432  dst[i] = AV_RB16(src + 4 * i + 3);
433 }
434 
435 static void abgrToA_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused)
436 {
437  int16_t *dst = (int16_t *)_dst;
438  int i;
439  for (i=0; i<width; i++) {
440  dst[i]= src[4*i]<<6;
441  }
442 }
443 
444 static void rgbaToA_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused)
445 {
446  int16_t *dst = (int16_t *)_dst;
447  int i;
448  for (i=0; i<width; i++) {
449  dst[i]= src[4*i+3]<<6;
450  }
451 }
452 
453 static void palToA_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *pal)
454 {
455  int16_t *dst = (int16_t *)_dst;
456  int i;
457  for (i=0; i<width; i++) {
458  int d= src[i];
459 
460  dst[i]= (pal[d] >> 24)<<6;
461  }
462 }
463 
464 static void palToY_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *pal)
465 {
466  int16_t *dst = (int16_t *)_dst;
467  int i;
468  for (i = 0; i < width; i++) {
469  int d = src[i];
470 
471  dst[i] = (pal[d] & 0xFF)<<6;
472  }
473 }
474 
475 static void palToUV_c(uint8_t *_dstU, uint8_t *_dstV,
476  const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
477  int width, uint32_t *pal)
478 {
479  uint16_t *dstU = (uint16_t *)_dstU;
480  int16_t *dstV = (int16_t *)_dstV;
481  int i;
482  av_assert1(src1 == src2);
483  for (i = 0; i < width; i++) {
484  int p = pal[src1[i]];
485 
486  dstU[i] = (uint8_t)(p>> 8)<<6;
487  dstV[i] = (uint8_t)(p>>16)<<6;
488  }
489 }
490 
491 static void monowhite2Y_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused)
492 {
493  int16_t *dst = (int16_t *)_dst;
494  int i, j;
495  width = (width + 7) >> 3;
496  for (i = 0; i < width; i++) {
497  int d = ~src[i];
498  for (j = 0; j < 8; j++)
499  dst[8*i+j]= ((d>>(7-j))&1) * 16383;
500  }
501  if(width&7){
502  int d= ~src[i];
503  for (j = 0; j < (width&7); j++)
504  dst[8*i+j]= ((d>>(7-j))&1) * 16383;
505  }
506 }
507 
508 static void monoblack2Y_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused)
509 {
510  int16_t *dst = (int16_t *)_dst;
511  int i, j;
512  width = (width + 7) >> 3;
513  for (i = 0; i < width; i++) {
514  int d = src[i];
515  for (j = 0; j < 8; j++)
516  dst[8*i+j]= ((d>>(7-j))&1) * 16383;
517  }
518  if(width&7){
519  int d = src[i];
520  for (j = 0; j < (width&7); j++)
521  dst[8*i+j] = ((d>>(7-j))&1) * 16383;
522  }
523 }
524 
525 static void yuy2ToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
526  uint32_t *unused)
527 {
528  int i;
529  for (i = 0; i < width; i++)
530  dst[i] = src[2 * i];
531 }
532 
533 static void yuy2ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src1,
534  const uint8_t *src2, int width, uint32_t *unused)
535 {
536  int i;
537  for (i = 0; i < width; i++) {
538  dstU[i] = src1[4 * i + 1];
539  dstV[i] = src1[4 * i + 3];
540  }
541  av_assert1(src1 == src2);
542 }
543 
544 static void yvy2ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src1,
545  const uint8_t *src2, int width, uint32_t *unused)
546 {
547  int i;
548  for (i = 0; i < width; i++) {
549  dstV[i] = src1[4 * i + 1];
550  dstU[i] = src1[4 * i + 3];
551  }
552  av_assert1(src1 == src2);
553 }
554 
555 static void bswap16Y_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1, const uint8_t *unused2, int width,
556  uint32_t *unused)
557 {
558  int i;
559  const uint16_t *src = (const uint16_t *)_src;
560  uint16_t *dst = (uint16_t *)_dst;
561  for (i = 0; i < width; i++)
562  dst[i] = av_bswap16(src[i]);
563 }
564 
565 static void bswap16UV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *_src1,
566  const uint8_t *_src2, int width, uint32_t *unused)
567 {
568  int i;
569  const uint16_t *src1 = (const uint16_t *)_src1,
570  *src2 = (const uint16_t *)_src2;
571  uint16_t *dstU = (uint16_t *)_dstU, *dstV = (uint16_t *)_dstV;
572  for (i = 0; i < width; i++) {
573  dstU[i] = av_bswap16(src1[i]);
574  dstV[i] = av_bswap16(src2[i]);
575  }
576 }
577 
578 static void read_ya16le_gray_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
579  uint32_t *unused)
580 {
581  int i;
582  for (i = 0; i < width; i++)
583  AV_WN16(dst + i * 2, AV_RL16(src + i * 4));
584 }
585 
586 static void read_ya16le_alpha_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
587  uint32_t *unused)
588 {
589  int i;
590  for (i = 0; i < width; i++)
591  AV_WN16(dst + i * 2, AV_RL16(src + i * 4 + 2));
592 }
593 
594 static void read_ya16be_gray_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
595  uint32_t *unused)
596 {
597  int i;
598  for (i = 0; i < width; i++)
599  AV_WN16(dst + i * 2, AV_RB16(src + i * 4));
600 }
601 
602 static void read_ya16be_alpha_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
603  uint32_t *unused)
604 {
605  int i;
606  for (i = 0; i < width; i++)
607  AV_WN16(dst + i * 2, AV_RB16(src + i * 4 + 2));
608 }
609 
610 /* This is almost identical to the previous, end exists only because
611  * yuy2ToY/UV)(dst, src + 1, ...) would have 100% unaligned accesses. */
612 static void uyvyToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
613  uint32_t *unused)
614 {
615  int i;
616  for (i = 0; i < width; i++)
617  dst[i] = src[2 * i + 1];
618 }
619 
620 static void uyvyToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src1,
621  const uint8_t *src2, int width, uint32_t *unused)
622 {
623  int i;
624  for (i = 0; i < width; i++) {
625  dstU[i] = src1[4 * i + 0];
626  dstV[i] = src1[4 * i + 2];
627  }
628  av_assert1(src1 == src2);
629 }
630 
631 static av_always_inline void nvXXtoUV_c(uint8_t *dst1, uint8_t *dst2,
632  const uint8_t *src, int width)
633 {
634  int i;
635  for (i = 0; i < width; i++) {
636  dst1[i] = src[2 * i + 0];
637  dst2[i] = src[2 * i + 1];
638  }
639 }
640 
641 static void nv12ToUV_c(uint8_t *dstU, uint8_t *dstV,
642  const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
643  int width, uint32_t *unused)
644 {
645  nvXXtoUV_c(dstU, dstV, src1, width);
646 }
647 
648 static void nv21ToUV_c(uint8_t *dstU, uint8_t *dstV,
649  const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
650  int width, uint32_t *unused)
651 {
652  nvXXtoUV_c(dstV, dstU, src1, width);
653 }
654 
655 #define input_pixel(pos) (isBE(origin) ? AV_RB16(pos) : AV_RL16(pos))
656 
657 static void bgr24ToY_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2,
658  int width, uint32_t *rgb2yuv)
659 {
660  int16_t *dst = (int16_t *)_dst;
661  int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
662  int i;
663  for (i = 0; i < width; i++) {
664  int b = src[i * 3 + 0];
665  int g = src[i * 3 + 1];
666  int r = src[i * 3 + 2];
667 
668  dst[i] = ((ry*r + gy*g + by*b + (32<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6));
669  }
670 }
671 
672 static void bgr24ToUV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
673  const uint8_t *src2, int width, uint32_t *rgb2yuv)
674 {
675  int16_t *dstU = (int16_t *)_dstU;
676  int16_t *dstV = (int16_t *)_dstV;
677  int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
678  int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
679  int i;
680  for (i = 0; i < width; i++) {
681  int b = src1[3 * i + 0];
682  int g = src1[3 * i + 1];
683  int r = src1[3 * i + 2];
684 
685  dstU[i] = (ru*r + gu*g + bu*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
686  dstV[i] = (rv*r + gv*g + bv*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
687  }
688  av_assert1(src1 == src2);
689 }
690 
691 static void bgr24ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
692  const uint8_t *src2, int width, uint32_t *rgb2yuv)
693 {
694  int16_t *dstU = (int16_t *)_dstU;
695  int16_t *dstV = (int16_t *)_dstV;
696  int i;
697  int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
698  int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
699  for (i = 0; i < width; i++) {
700  int b = src1[6 * i + 0] + src1[6 * i + 3];
701  int g = src1[6 * i + 1] + src1[6 * i + 4];
702  int r = src1[6 * i + 2] + src1[6 * i + 5];
703 
704  dstU[i] = (ru*r + gu*g + bu*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
705  dstV[i] = (rv*r + gv*g + bv*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
706  }
707  av_assert1(src1 == src2);
708 }
709 
710 static void rgb24ToY_c(uint8_t *_dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
711  uint32_t *rgb2yuv)
712 {
713  int16_t *dst = (int16_t *)_dst;
714  int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
715  int i;
716  for (i = 0; i < width; i++) {
717  int r = src[i * 3 + 0];
718  int g = src[i * 3 + 1];
719  int b = src[i * 3 + 2];
720 
721  dst[i] = ((ry*r + gy*g + by*b + (32<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6));
722  }
723 }
724 
725 static void rgb24ToUV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
726  const uint8_t *src2, int width, uint32_t *rgb2yuv)
727 {
728  int16_t *dstU = (int16_t *)_dstU;
729  int16_t *dstV = (int16_t *)_dstV;
730  int i;
731  int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
732  int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
733  av_assert1(src1 == src2);
734  for (i = 0; i < width; i++) {
735  int r = src1[3 * i + 0];
736  int g = src1[3 * i + 1];
737  int b = src1[3 * i + 2];
738 
739  dstU[i] = (ru*r + gu*g + bu*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
740  dstV[i] = (rv*r + gv*g + bv*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
741  }
742 }
743 
744 static void rgb24ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *src1,
745  const uint8_t *src2, int width, uint32_t *rgb2yuv)
746 {
747  int16_t *dstU = (int16_t *)_dstU;
748  int16_t *dstV = (int16_t *)_dstV;
749  int i;
750  int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
751  int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
752  av_assert1(src1 == src2);
753  for (i = 0; i < width; i++) {
754  int r = src1[6 * i + 0] + src1[6 * i + 3];
755  int g = src1[6 * i + 1] + src1[6 * i + 4];
756  int b = src1[6 * i + 2] + src1[6 * i + 5];
757 
758  dstU[i] = (ru*r + gu*g + bu*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
759  dstV[i] = (rv*r + gv*g + bv*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
760  }
761 }
762 
763 static void planar_rgb_to_y(uint8_t *_dst, const uint8_t *src[4], int width, int32_t *rgb2yuv)
764 {
765  uint16_t *dst = (uint16_t *)_dst;
766  int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
767  int i;
768  for (i = 0; i < width; i++) {
769  int g = src[0][i];
770  int b = src[1][i];
771  int r = src[2][i];
772 
773  dst[i] = (ry*r + gy*g + by*b + (0x801<<(RGB2YUV_SHIFT-7))) >> (RGB2YUV_SHIFT-6);
774  }
775 }
776 
777 static void planar_rgb_to_a(uint8_t *_dst, const uint8_t *src[4], int width, int32_t *unused)
778 {
779  uint16_t *dst = (uint16_t *)_dst;
780  int i;
781  for (i = 0; i < width; i++)
782  dst[i] = src[3][i] << 6;
783 }
784 
785 static void planar_rgb_to_uv(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *src[4], int width, int32_t *rgb2yuv)
786 {
787  uint16_t *dstU = (uint16_t *)_dstU;
788  uint16_t *dstV = (uint16_t *)_dstV;
789  int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
790  int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
791  int i;
792  for (i = 0; i < width; i++) {
793  int g = src[0][i];
794  int b = src[1][i];
795  int r = src[2][i];
796 
797  dstU[i] = (ru*r + gu*g + bu*b + (0x4001<<(RGB2YUV_SHIFT-7))) >> (RGB2YUV_SHIFT-6);
798  dstV[i] = (rv*r + gv*g + bv*b + (0x4001<<(RGB2YUV_SHIFT-7))) >> (RGB2YUV_SHIFT-6);
799  }
800 }
801 
802 #define rdpx(src) \
803  is_be ? AV_RB16(src) : AV_RL16(src)
804 static av_always_inline void planar_rgb16_to_y(uint8_t *_dst, const uint8_t *_src[4],
805  int width, int bpc, int is_be, int32_t *rgb2yuv)
806 {
807  int i;
808  const uint16_t **src = (const uint16_t **)_src;
809  uint16_t *dst = (uint16_t *)_dst;
810  int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
811  int shift = bpc < 16 ? bpc : 14;
812  for (i = 0; i < width; i++) {
813  int g = rdpx(src[0] + i);
814  int b = rdpx(src[1] + i);
815  int r = rdpx(src[2] + i);
816 
817  dst[i] = ((ry*r + gy*g + by*b + (33 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + shift - 14));
818  }
819 }
820 
822  const uint8_t *_src[4], int width,
823  int bpc, int is_be, int32_t *rgb2yuv)
824 {
825  int i;
826  const uint16_t **src = (const uint16_t **)_src;
827  uint16_t *dstU = (uint16_t *)_dstU;
828  uint16_t *dstV = (uint16_t *)_dstV;
829  int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
830  int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
831  int shift = bpc < 16 ? bpc : 14;
832  for (i = 0; i < width; i++) {
833  int g = rdpx(src[0] + i);
834  int b = rdpx(src[1] + i);
835  int r = rdpx(src[2] + i);
836 
837  dstU[i] = (ru*r + gu*g + bu*b + (257 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + shift - 14);
838  dstV[i] = (rv*r + gv*g + bv*b + (257 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + shift - 14);
839  }
840 }
841 #undef rdpx
842 
843 #define rgb9plus_planar_funcs_endian(nbits, endian_name, endian) \
844 static void planar_rgb##nbits##endian_name##_to_y(uint8_t *dst, const uint8_t *src[4], \
845  int w, int32_t *rgb2yuv) \
846 { \
847  planar_rgb16_to_y(dst, src, w, nbits, endian, rgb2yuv); \
848 } \
849 static void planar_rgb##nbits##endian_name##_to_uv(uint8_t *dstU, uint8_t *dstV, \
850  const uint8_t *src[4], int w, int32_t *rgb2yuv) \
851 { \
852  planar_rgb16_to_uv(dstU, dstV, src, w, nbits, endian, rgb2yuv); \
853 } \
854 
855 #define rgb9plus_planar_funcs(nbits) \
856  rgb9plus_planar_funcs_endian(nbits, le, 0) \
857  rgb9plus_planar_funcs_endian(nbits, be, 1)
858 
864 
866 {
867  enum AVPixelFormat srcFormat = c->srcFormat;
868 
869  c->chrToYV12 = NULL;
870  switch (srcFormat) {
871  case AV_PIX_FMT_YUYV422:
872  c->chrToYV12 = yuy2ToUV_c;
873  break;
874  case AV_PIX_FMT_YVYU422:
875  c->chrToYV12 = yvy2ToUV_c;
876  break;
877  case AV_PIX_FMT_UYVY422:
878  c->chrToYV12 = uyvyToUV_c;
879  break;
880  case AV_PIX_FMT_NV12:
881  c->chrToYV12 = nv12ToUV_c;
882  break;
883  case AV_PIX_FMT_NV21:
884  c->chrToYV12 = nv21ToUV_c;
885  break;
886  case AV_PIX_FMT_RGB8:
887  case AV_PIX_FMT_BGR8:
888  case AV_PIX_FMT_PAL8:
891  c->chrToYV12 = palToUV_c;
892  break;
893  case AV_PIX_FMT_GBRP9LE:
894  c->readChrPlanar = planar_rgb9le_to_uv;
895  break;
896  case AV_PIX_FMT_GBRP10LE:
897  c->readChrPlanar = planar_rgb10le_to_uv;
898  break;
899  case AV_PIX_FMT_GBRP12LE:
900  c->readChrPlanar = planar_rgb12le_to_uv;
901  break;
902  case AV_PIX_FMT_GBRP14LE:
903  c->readChrPlanar = planar_rgb14le_to_uv;
904  break;
906  case AV_PIX_FMT_GBRP16LE:
907  c->readChrPlanar = planar_rgb16le_to_uv;
908  break;
909  case AV_PIX_FMT_GBRP9BE:
910  c->readChrPlanar = planar_rgb9be_to_uv;
911  break;
912  case AV_PIX_FMT_GBRP10BE:
913  c->readChrPlanar = planar_rgb10be_to_uv;
914  break;
915  case AV_PIX_FMT_GBRP12BE:
916  c->readChrPlanar = planar_rgb12be_to_uv;
917  break;
918  case AV_PIX_FMT_GBRP14BE:
919  c->readChrPlanar = planar_rgb14be_to_uv;
920  break;
922  case AV_PIX_FMT_GBRP16BE:
923  c->readChrPlanar = planar_rgb16be_to_uv;
924  break;
925  case AV_PIX_FMT_GBRAP:
926  case AV_PIX_FMT_GBRP:
927  c->readChrPlanar = planar_rgb_to_uv;
928  break;
929 #if HAVE_BIGENDIAN
945 
955  c->chrToYV12 = bswap16UV_c;
956  break;
957 #else
973 
983  c->chrToYV12 = bswap16UV_c;
984  break;
985 #endif
986  }
987  if (c->chrSrcHSubSample) {
988  switch (srcFormat) {
989  case AV_PIX_FMT_RGBA64BE:
990  c->chrToYV12 = rgb64BEToUV_half_c;
991  break;
992  case AV_PIX_FMT_RGBA64LE:
993  c->chrToYV12 = rgb64LEToUV_half_c;
994  break;
995  case AV_PIX_FMT_BGRA64BE:
996  c->chrToYV12 = bgr64BEToUV_half_c;
997  break;
998  case AV_PIX_FMT_BGRA64LE:
999  c->chrToYV12 = bgr64LEToUV_half_c;
1000  break;
1001  case AV_PIX_FMT_RGB48BE:
1002  c->chrToYV12 = rgb48BEToUV_half_c;
1003  break;
1004  case AV_PIX_FMT_RGB48LE:
1005  c->chrToYV12 = rgb48LEToUV_half_c;
1006  break;
1007  case AV_PIX_FMT_BGR48BE:
1008  c->chrToYV12 = bgr48BEToUV_half_c;
1009  break;
1010  case AV_PIX_FMT_BGR48LE:
1011  c->chrToYV12 = bgr48LEToUV_half_c;
1012  break;
1013  case AV_PIX_FMT_RGB32:
1014  c->chrToYV12 = bgr32ToUV_half_c;
1015  break;
1016  case AV_PIX_FMT_RGB32_1:
1017  c->chrToYV12 = bgr321ToUV_half_c;
1018  break;
1019  case AV_PIX_FMT_BGR24:
1020  c->chrToYV12 = bgr24ToUV_half_c;
1021  break;
1022  case AV_PIX_FMT_BGR565LE:
1023  c->chrToYV12 = bgr16leToUV_half_c;
1024  break;
1025  case AV_PIX_FMT_BGR565BE:
1026  c->chrToYV12 = bgr16beToUV_half_c;
1027  break;
1028  case AV_PIX_FMT_BGR555LE:
1029  c->chrToYV12 = bgr15leToUV_half_c;
1030  break;
1031  case AV_PIX_FMT_BGR555BE:
1032  c->chrToYV12 = bgr15beToUV_half_c;
1033  break;
1034  case AV_PIX_FMT_GBRAP:
1035  case AV_PIX_FMT_GBRP:
1036  c->chrToYV12 = gbr24pToUV_half_c;
1037  break;
1038  case AV_PIX_FMT_BGR444LE:
1039  c->chrToYV12 = bgr12leToUV_half_c;
1040  break;
1041  case AV_PIX_FMT_BGR444BE:
1042  c->chrToYV12 = bgr12beToUV_half_c;
1043  break;
1044  case AV_PIX_FMT_BGR32:
1045  c->chrToYV12 = rgb32ToUV_half_c;
1046  break;
1047  case AV_PIX_FMT_BGR32_1:
1048  c->chrToYV12 = rgb321ToUV_half_c;
1049  break;
1050  case AV_PIX_FMT_RGB24:
1051  c->chrToYV12 = rgb24ToUV_half_c;
1052  break;
1053  case AV_PIX_FMT_RGB565LE:
1054  c->chrToYV12 = rgb16leToUV_half_c;
1055  break;
1056  case AV_PIX_FMT_RGB565BE:
1057  c->chrToYV12 = rgb16beToUV_half_c;
1058  break;
1059  case AV_PIX_FMT_RGB555LE:
1060  c->chrToYV12 = rgb15leToUV_half_c;
1061  break;
1062  case AV_PIX_FMT_RGB555BE:
1063  c->chrToYV12 = rgb15beToUV_half_c;
1064  break;
1065  case AV_PIX_FMT_RGB444LE:
1066  c->chrToYV12 = rgb12leToUV_half_c;
1067  break;
1068  case AV_PIX_FMT_RGB444BE:
1069  c->chrToYV12 = rgb12beToUV_half_c;
1070  break;
1071  }
1072  } else {
1073  switch (srcFormat) {
1074  case AV_PIX_FMT_RGBA64BE:
1075  c->chrToYV12 = rgb64BEToUV_c;
1076  break;
1077  case AV_PIX_FMT_RGBA64LE:
1078  c->chrToYV12 = rgb64LEToUV_c;
1079  break;
1080  case AV_PIX_FMT_BGRA64BE:
1081  c->chrToYV12 = bgr64BEToUV_c;
1082  break;
1083  case AV_PIX_FMT_BGRA64LE:
1084  c->chrToYV12 = bgr64LEToUV_c;
1085  break;
1086  case AV_PIX_FMT_RGB48BE:
1087  c->chrToYV12 = rgb48BEToUV_c;
1088  break;
1089  case AV_PIX_FMT_RGB48LE:
1090  c->chrToYV12 = rgb48LEToUV_c;
1091  break;
1092  case AV_PIX_FMT_BGR48BE:
1093  c->chrToYV12 = bgr48BEToUV_c;
1094  break;
1095  case AV_PIX_FMT_BGR48LE:
1096  c->chrToYV12 = bgr48LEToUV_c;
1097  break;
1098  case AV_PIX_FMT_RGB32:
1099  c->chrToYV12 = bgr32ToUV_c;
1100  break;
1101  case AV_PIX_FMT_RGB32_1:
1102  c->chrToYV12 = bgr321ToUV_c;
1103  break;
1104  case AV_PIX_FMT_BGR24:
1105  c->chrToYV12 = bgr24ToUV_c;
1106  break;
1107  case AV_PIX_FMT_BGR565LE:
1108  c->chrToYV12 = bgr16leToUV_c;
1109  break;
1110  case AV_PIX_FMT_BGR565BE:
1111  c->chrToYV12 = bgr16beToUV_c;
1112  break;
1113  case AV_PIX_FMT_BGR555LE:
1114  c->chrToYV12 = bgr15leToUV_c;
1115  break;
1116  case AV_PIX_FMT_BGR555BE:
1117  c->chrToYV12 = bgr15beToUV_c;
1118  break;
1119  case AV_PIX_FMT_BGR444LE:
1120  c->chrToYV12 = bgr12leToUV_c;
1121  break;
1122  case AV_PIX_FMT_BGR444BE:
1123  c->chrToYV12 = bgr12beToUV_c;
1124  break;
1125  case AV_PIX_FMT_BGR32:
1126  c->chrToYV12 = rgb32ToUV_c;
1127  break;
1128  case AV_PIX_FMT_BGR32_1:
1129  c->chrToYV12 = rgb321ToUV_c;
1130  break;
1131  case AV_PIX_FMT_RGB24:
1132  c->chrToYV12 = rgb24ToUV_c;
1133  break;
1134  case AV_PIX_FMT_RGB565LE:
1135  c->chrToYV12 = rgb16leToUV_c;
1136  break;
1137  case AV_PIX_FMT_RGB565BE:
1138  c->chrToYV12 = rgb16beToUV_c;
1139  break;
1140  case AV_PIX_FMT_RGB555LE:
1141  c->chrToYV12 = rgb15leToUV_c;
1142  break;
1143  case AV_PIX_FMT_RGB555BE:
1144  c->chrToYV12 = rgb15beToUV_c;
1145  break;
1146  case AV_PIX_FMT_RGB444LE:
1147  c->chrToYV12 = rgb12leToUV_c;
1148  break;
1149  case AV_PIX_FMT_RGB444BE:
1150  c->chrToYV12 = rgb12beToUV_c;
1151  break;
1152  }
1153  }
1154 
1155  c->lumToYV12 = NULL;
1156  c->alpToYV12 = NULL;
1157  switch (srcFormat) {
1158  case AV_PIX_FMT_GBRP9LE:
1159  c->readLumPlanar = planar_rgb9le_to_y;
1160  break;
1161  case AV_PIX_FMT_GBRP10LE:
1162  c->readLumPlanar = planar_rgb10le_to_y;
1163  break;
1164  case AV_PIX_FMT_GBRP12LE:
1165  c->readLumPlanar = planar_rgb12le_to_y;
1166  break;
1167  case AV_PIX_FMT_GBRP14LE:
1168  c->readLumPlanar = planar_rgb14le_to_y;
1169  break;
1170  case AV_PIX_FMT_GBRAP16LE:
1171  case AV_PIX_FMT_GBRP16LE:
1172  c->readLumPlanar = planar_rgb16le_to_y;
1173  break;
1174  case AV_PIX_FMT_GBRP9BE:
1175  c->readLumPlanar = planar_rgb9be_to_y;
1176  break;
1177  case AV_PIX_FMT_GBRP10BE:
1178  c->readLumPlanar = planar_rgb10be_to_y;
1179  break;
1180  case AV_PIX_FMT_GBRP12BE:
1181  c->readLumPlanar = planar_rgb12be_to_y;
1182  break;
1183  case AV_PIX_FMT_GBRP14BE:
1184  c->readLumPlanar = planar_rgb14be_to_y;
1185  break;
1186  case AV_PIX_FMT_GBRAP16BE:
1187  case AV_PIX_FMT_GBRP16BE:
1188  c->readLumPlanar = planar_rgb16be_to_y;
1189  break;
1190  case AV_PIX_FMT_GBRAP:
1191  c->readAlpPlanar = planar_rgb_to_a;
1192  case AV_PIX_FMT_GBRP:
1193  c->readLumPlanar = planar_rgb_to_y;
1194  break;
1195 #if HAVE_BIGENDIAN
1196  case AV_PIX_FMT_YUV444P9LE:
1197  case AV_PIX_FMT_YUV422P9LE:
1198  case AV_PIX_FMT_YUV420P9LE:
1211 
1212  case AV_PIX_FMT_GRAY16LE:
1213  c->lumToYV12 = bswap16Y_c;
1214  break;
1224  c->lumToYV12 = bswap16Y_c;
1225  c->alpToYV12 = bswap16Y_c;
1226  break;
1227 #else
1228  case AV_PIX_FMT_YUV444P9BE:
1229  case AV_PIX_FMT_YUV422P9BE:
1230  case AV_PIX_FMT_YUV420P9BE:
1243 
1244  case AV_PIX_FMT_GRAY16BE:
1245  c->lumToYV12 = bswap16Y_c;
1246  break;
1256  c->lumToYV12 = bswap16Y_c;
1257  c->alpToYV12 = bswap16Y_c;
1258  break;
1259 #endif
1260  case AV_PIX_FMT_YA16LE:
1261  c->lumToYV12 = read_ya16le_gray_c;
1262  break;
1263  case AV_PIX_FMT_YA16BE:
1264  c->lumToYV12 = read_ya16be_gray_c;
1265  break;
1266  case AV_PIX_FMT_YUYV422:
1267  case AV_PIX_FMT_YVYU422:
1268  case AV_PIX_FMT_YA8:
1269  c->lumToYV12 = yuy2ToY_c;
1270  break;
1271  case AV_PIX_FMT_UYVY422:
1272  c->lumToYV12 = uyvyToY_c;
1273  break;
1274  case AV_PIX_FMT_BGR24:
1275  c->lumToYV12 = bgr24ToY_c;
1276  break;
1277  case AV_PIX_FMT_BGR565LE:
1278  c->lumToYV12 = bgr16leToY_c;
1279  break;
1280  case AV_PIX_FMT_BGR565BE:
1281  c->lumToYV12 = bgr16beToY_c;
1282  break;
1283  case AV_PIX_FMT_BGR555LE:
1284  c->lumToYV12 = bgr15leToY_c;
1285  break;
1286  case AV_PIX_FMT_BGR555BE:
1287  c->lumToYV12 = bgr15beToY_c;
1288  break;
1289  case AV_PIX_FMT_BGR444LE:
1290  c->lumToYV12 = bgr12leToY_c;
1291  break;
1292  case AV_PIX_FMT_BGR444BE:
1293  c->lumToYV12 = bgr12beToY_c;
1294  break;
1295  case AV_PIX_FMT_RGB24:
1296  c->lumToYV12 = rgb24ToY_c;
1297  break;
1298  case AV_PIX_FMT_RGB565LE:
1299  c->lumToYV12 = rgb16leToY_c;
1300  break;
1301  case AV_PIX_FMT_RGB565BE:
1302  c->lumToYV12 = rgb16beToY_c;
1303  break;
1304  case AV_PIX_FMT_RGB555LE:
1305  c->lumToYV12 = rgb15leToY_c;
1306  break;
1307  case AV_PIX_FMT_RGB555BE:
1308  c->lumToYV12 = rgb15beToY_c;
1309  break;
1310  case AV_PIX_FMT_RGB444LE:
1311  c->lumToYV12 = rgb12leToY_c;
1312  break;
1313  case AV_PIX_FMT_RGB444BE:
1314  c->lumToYV12 = rgb12beToY_c;
1315  break;
1316  case AV_PIX_FMT_RGB8:
1317  case AV_PIX_FMT_BGR8:
1318  case AV_PIX_FMT_PAL8:
1319  case AV_PIX_FMT_BGR4_BYTE:
1320  case AV_PIX_FMT_RGB4_BYTE:
1321  c->lumToYV12 = palToY_c;
1322  break;
1323  case AV_PIX_FMT_MONOBLACK:
1324  c->lumToYV12 = monoblack2Y_c;
1325  break;
1326  case AV_PIX_FMT_MONOWHITE:
1327  c->lumToYV12 = monowhite2Y_c;
1328  break;
1329  case AV_PIX_FMT_RGB32:
1330  c->lumToYV12 = bgr32ToY_c;
1331  break;
1332  case AV_PIX_FMT_RGB32_1:
1333  c->lumToYV12 = bgr321ToY_c;
1334  break;
1335  case AV_PIX_FMT_BGR32:
1336  c->lumToYV12 = rgb32ToY_c;
1337  break;
1338  case AV_PIX_FMT_BGR32_1:
1339  c->lumToYV12 = rgb321ToY_c;
1340  break;
1341  case AV_PIX_FMT_RGB48BE:
1342  c->lumToYV12 = rgb48BEToY_c;
1343  break;
1344  case AV_PIX_FMT_RGB48LE:
1345  c->lumToYV12 = rgb48LEToY_c;
1346  break;
1347  case AV_PIX_FMT_BGR48BE:
1348  c->lumToYV12 = bgr48BEToY_c;
1349  break;
1350  case AV_PIX_FMT_BGR48LE:
1351  c->lumToYV12 = bgr48LEToY_c;
1352  break;
1353  case AV_PIX_FMT_RGBA64BE:
1354  c->lumToYV12 = rgb64BEToY_c;
1355  break;
1356  case AV_PIX_FMT_RGBA64LE:
1357  c->lumToYV12 = rgb64LEToY_c;
1358  break;
1359  case AV_PIX_FMT_BGRA64BE:
1360  c->lumToYV12 = bgr64BEToY_c;
1361  break;
1362  case AV_PIX_FMT_BGRA64LE:
1363  c->lumToYV12 = bgr64LEToY_c;
1364  }
1365  if (c->alpPixBuf) {
1366  if (is16BPS(srcFormat) || isNBPS(srcFormat)) {
1367  if (HAVE_BIGENDIAN == !isBE(srcFormat))
1368  c->alpToYV12 = bswap16Y_c;
1369  }
1370  switch (srcFormat) {
1371  case AV_PIX_FMT_BGRA64LE:
1372  case AV_PIX_FMT_RGBA64LE: c->alpToYV12 = rgba64leToA_c; break;
1373  case AV_PIX_FMT_BGRA64BE:
1374  case AV_PIX_FMT_RGBA64BE: c->alpToYV12 = rgba64beToA_c; break;
1375  case AV_PIX_FMT_BGRA:
1376  case AV_PIX_FMT_RGBA:
1377  c->alpToYV12 = rgbaToA_c;
1378  break;
1379  case AV_PIX_FMT_ABGR:
1380  case AV_PIX_FMT_ARGB:
1381  c->alpToYV12 = abgrToA_c;
1382  break;
1383  case AV_PIX_FMT_YA8:
1384  c->alpToYV12 = uyvyToY_c;
1385  break;
1386  case AV_PIX_FMT_YA16LE:
1387  c->alpToYV12 = read_ya16le_alpha_c;
1388  break;
1389  case AV_PIX_FMT_YA16BE:
1390  c->alpToYV12 = read_ya16be_alpha_c;
1391  break;
1392  case AV_PIX_FMT_PAL8 :
1393  c->alpToYV12 = palToA_c;
1394  break;
1395  }
1396  }
1397 }