FFmpeg
swscale_unscaled.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2001-2011 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 <inttypes.h>
22 #include <string.h>
23 #include <math.h>
24 #include <stdio.h>
25 #include "config.h"
26 #include "swscale.h"
27 #include "swscale_internal.h"
28 #include "rgb2rgb.h"
29 #include "libavutil/intreadwrite.h"
30 #include "libavutil/avutil.h"
31 #include "libavutil/mathematics.h"
32 #include "libavutil/mem_internal.h"
33 #include "libavutil/bswap.h"
34 #include "libavutil/pixdesc.h"
35 #include "libavutil/avassert.h"
36 #include "libavutil/avconfig.h"
37 
38 DECLARE_ALIGNED(8, static const uint8_t, dithers)[8][8][8]={
39 {
40  { 0, 1, 0, 1, 0, 1, 0, 1,},
41  { 1, 0, 1, 0, 1, 0, 1, 0,},
42  { 0, 1, 0, 1, 0, 1, 0, 1,},
43  { 1, 0, 1, 0, 1, 0, 1, 0,},
44  { 0, 1, 0, 1, 0, 1, 0, 1,},
45  { 1, 0, 1, 0, 1, 0, 1, 0,},
46  { 0, 1, 0, 1, 0, 1, 0, 1,},
47  { 1, 0, 1, 0, 1, 0, 1, 0,},
48 },{
49  { 1, 2, 1, 2, 1, 2, 1, 2,},
50  { 3, 0, 3, 0, 3, 0, 3, 0,},
51  { 1, 2, 1, 2, 1, 2, 1, 2,},
52  { 3, 0, 3, 0, 3, 0, 3, 0,},
53  { 1, 2, 1, 2, 1, 2, 1, 2,},
54  { 3, 0, 3, 0, 3, 0, 3, 0,},
55  { 1, 2, 1, 2, 1, 2, 1, 2,},
56  { 3, 0, 3, 0, 3, 0, 3, 0,},
57 },{
58  { 2, 4, 3, 5, 2, 4, 3, 5,},
59  { 6, 0, 7, 1, 6, 0, 7, 1,},
60  { 3, 5, 2, 4, 3, 5, 2, 4,},
61  { 7, 1, 6, 0, 7, 1, 6, 0,},
62  { 2, 4, 3, 5, 2, 4, 3, 5,},
63  { 6, 0, 7, 1, 6, 0, 7, 1,},
64  { 3, 5, 2, 4, 3, 5, 2, 4,},
65  { 7, 1, 6, 0, 7, 1, 6, 0,},
66 },{
67  { 4, 8, 7, 11, 4, 8, 7, 11,},
68  { 12, 0, 15, 3, 12, 0, 15, 3,},
69  { 6, 10, 5, 9, 6, 10, 5, 9,},
70  { 14, 2, 13, 1, 14, 2, 13, 1,},
71  { 4, 8, 7, 11, 4, 8, 7, 11,},
72  { 12, 0, 15, 3, 12, 0, 15, 3,},
73  { 6, 10, 5, 9, 6, 10, 5, 9,},
74  { 14, 2, 13, 1, 14, 2, 13, 1,},
75 },{
76  { 9, 17, 15, 23, 8, 16, 14, 22,},
77  { 25, 1, 31, 7, 24, 0, 30, 6,},
78  { 13, 21, 11, 19, 12, 20, 10, 18,},
79  { 29, 5, 27, 3, 28, 4, 26, 2,},
80  { 8, 16, 14, 22, 9, 17, 15, 23,},
81  { 24, 0, 30, 6, 25, 1, 31, 7,},
82  { 12, 20, 10, 18, 13, 21, 11, 19,},
83  { 28, 4, 26, 2, 29, 5, 27, 3,},
84 },{
85  { 18, 34, 30, 46, 17, 33, 29, 45,},
86  { 50, 2, 62, 14, 49, 1, 61, 13,},
87  { 26, 42, 22, 38, 25, 41, 21, 37,},
88  { 58, 10, 54, 6, 57, 9, 53, 5,},
89  { 16, 32, 28, 44, 19, 35, 31, 47,},
90  { 48, 0, 60, 12, 51, 3, 63, 15,},
91  { 24, 40, 20, 36, 27, 43, 23, 39,},
92  { 56, 8, 52, 4, 59, 11, 55, 7,},
93 },{
94  { 18, 34, 30, 46, 17, 33, 29, 45,},
95  { 50, 2, 62, 14, 49, 1, 61, 13,},
96  { 26, 42, 22, 38, 25, 41, 21, 37,},
97  { 58, 10, 54, 6, 57, 9, 53, 5,},
98  { 16, 32, 28, 44, 19, 35, 31, 47,},
99  { 48, 0, 60, 12, 51, 3, 63, 15,},
100  { 24, 40, 20, 36, 27, 43, 23, 39,},
101  { 56, 8, 52, 4, 59, 11, 55, 7,},
102 },{
103  { 36, 68, 60, 92, 34, 66, 58, 90,},
104  { 100, 4,124, 28, 98, 2,122, 26,},
105  { 52, 84, 44, 76, 50, 82, 42, 74,},
106  { 116, 20,108, 12,114, 18,106, 10,},
107  { 32, 64, 56, 88, 38, 70, 62, 94,},
108  { 96, 0,120, 24,102, 6,126, 30,},
109  { 48, 80, 40, 72, 54, 86, 46, 78,},
110  { 112, 16,104, 8,118, 22,110, 14,},
111 }};
112 
113 
114 static void fillPlane(uint8_t *plane, int stride, int width, int height, int y,
115  uint8_t val)
116 {
117  int i;
118  uint8_t *ptr = plane + stride * y;
119  for (i = 0; i < height; i++) {
120  memset(ptr, val, width);
121  ptr += stride;
122  }
123 }
124 
125 void ff_copyPlane(const uint8_t *src, int srcStride,
126  int srcSliceY, int srcSliceH, int width,
127  uint8_t *dst, int dstStride)
128 {
129  dst += dstStride * srcSliceY;
130  if (dstStride == srcStride && srcStride > 0) {
131  memcpy(dst, src, srcSliceH * dstStride);
132  } else {
133  int i;
134  for (i = 0; i < srcSliceH; i++) {
135  memcpy(dst, src, width);
136  src += srcStride;
137  dst += dstStride;
138  }
139  }
140 }
141 
142 static int planarToNv12Wrapper(SwsInternal *c, const uint8_t *const src[],
143  const int srcStride[], int srcSliceY,
144  int srcSliceH, uint8_t *const dstParam[],
145  const int dstStride[])
146 {
147  uint8_t *dst = dstParam[1] + dstStride[1] * srcSliceY / 2;
148 
149  ff_copyPlane(src[0], srcStride[0], srcSliceY, srcSliceH, c->opts.src_w,
150  dstParam[0], dstStride[0]);
151 
152  if (c->opts.dst_format == AV_PIX_FMT_NV12)
153  interleaveBytes(src[1], src[2], dst, c->chrSrcW, (srcSliceH + 1) / 2,
154  srcStride[1], srcStride[2], dstStride[1]);
155  else
156  interleaveBytes(src[2], src[1], dst, c->chrSrcW, (srcSliceH + 1) / 2,
157  srcStride[2], srcStride[1], dstStride[1]);
158 
159  return srcSliceH;
160 }
161 
162 static int nv12ToPlanarWrapper(SwsInternal *c, const uint8_t *const src[],
163  const int srcStride[], int srcSliceY,
164  int srcSliceH, uint8_t *const dstParam[],
165  const int dstStride[])
166 {
167  uint8_t *dst1 = dstParam[1] + dstStride[1] * srcSliceY / 2;
168  uint8_t *dst2 = dstParam[2] + dstStride[2] * srcSliceY / 2;
169 
170  ff_copyPlane(src[0], srcStride[0], srcSliceY, srcSliceH, c->opts.src_w,
171  dstParam[0], dstStride[0]);
172 
173  if (c->opts.src_format == AV_PIX_FMT_NV12)
174  deinterleaveBytes(src[1], dst1, dst2, c->chrSrcW, (srcSliceH + 1) / 2,
175  srcStride[1], dstStride[1], dstStride[2]);
176  else
177  deinterleaveBytes(src[1], dst2, dst1, c->chrSrcW, (srcSliceH + 1) / 2,
178  srcStride[1], dstStride[2], dstStride[1]);
179 
180  return srcSliceH;
181 }
182 
183 static int planarToNv24Wrapper(SwsInternal *c, const uint8_t *const src[],
184  const int srcStride[], int srcSliceY,
185  int srcSliceH, uint8_t *const dstParam[],
186  const int dstStride[])
187 {
188  uint8_t *dst = dstParam[1] + dstStride[1] * srcSliceY;
189 
190  ff_copyPlane(src[0], srcStride[0], srcSliceY, srcSliceH, c->opts.src_w,
191  dstParam[0], dstStride[0]);
192 
193  if (c->opts.dst_format == AV_PIX_FMT_NV24)
194  interleaveBytes(src[1], src[2], dst, c->chrSrcW, srcSliceH,
195  srcStride[1], srcStride[2], dstStride[1]);
196  else
197  interleaveBytes(src[2], src[1], dst, c->chrSrcW, srcSliceH,
198  srcStride[2], srcStride[1], dstStride[1]);
199 
200  return srcSliceH;
201 }
202 
203 static int nv24ToPlanarWrapper(SwsInternal *c, const uint8_t *const src[],
204  const int srcStride[], int srcSliceY,
205  int srcSliceH, uint8_t *const dstParam[],
206  const int dstStride[])
207 {
208  uint8_t *dst1 = dstParam[1] + dstStride[1] * srcSliceY;
209  uint8_t *dst2 = dstParam[2] + dstStride[2] * srcSliceY;
210 
211  ff_copyPlane(src[0], srcStride[0], srcSliceY, srcSliceH, c->opts.src_w,
212  dstParam[0], dstStride[0]);
213 
214  if (c->opts.src_format == AV_PIX_FMT_NV24)
215  deinterleaveBytes(src[1], dst1, dst2, c->chrSrcW, srcSliceH,
216  srcStride[1], dstStride[1], dstStride[2]);
217  else
218  deinterleaveBytes(src[1], dst2, dst1, c->chrSrcW, srcSliceH,
219  srcStride[1], dstStride[2], dstStride[1]);
220 
221  return srcSliceH;
222 }
223 
224 static void nv24_to_yuv420p_chroma(uint8_t *dst1, int dstStride1,
225  uint8_t *dst2, int dstStride2,
226  const uint8_t *src, int srcStride,
227  int w, int h)
228 {
229  const uint8_t *src1 = src;
230  const uint8_t *src2 = src + srcStride;
231  // average 4 pixels into 1 (interleaved U and V)
232  for (int y = 0; y < h; y += 2) {
233  if (y + 1 == h)
234  src2 = src1;
235  for (int x = 0; x < w; x++) {
236  dst1[x] = (src1[4 * x + 0] + src1[4 * x + 2] +
237  src2[4 * x + 0] + src2[4 * x + 2]) >> 2;
238  dst2[x] = (src1[4 * x + 1] + src1[4 * x + 3] +
239  src2[4 * x + 1] + src2[4 * x + 3]) >> 2;
240  }
241  src1 += srcStride * 2;
242  src2 += srcStride * 2;
243  dst1 += dstStride1;
244  dst2 += dstStride2;
245  }
246 }
247 
248 static int nv24ToYuv420Wrapper(SwsInternal *c, const uint8_t *const src[],
249  const int srcStride[], int srcSliceY, int srcSliceH,
250  uint8_t *const dstParam[], const int dstStride[])
251 {
252  uint8_t *dst1 = dstParam[1] + dstStride[1] * srcSliceY / 2;
253  uint8_t *dst2 = dstParam[2] + dstStride[2] * srcSliceY / 2;
254 
255  ff_copyPlane(src[0], srcStride[0], srcSliceY, srcSliceH, c->opts.src_w,
256  dstParam[0], dstStride[0]);
257 
258  if (c->opts.src_format == AV_PIX_FMT_NV24)
259  nv24_to_yuv420p_chroma(dst1, dstStride[1], dst2, dstStride[2],
260  src[1], srcStride[1], c->opts.src_w / 2, srcSliceH);
261  else
262  nv24_to_yuv420p_chroma(dst2, dstStride[2], dst1, dstStride[1],
263  src[1], srcStride[1], c->opts.src_w / 2, srcSliceH);
264 
265  return srcSliceH;
266 }
267 
268 static int planarToP01xWrapper(SwsInternal *c, const uint8_t *const src8[],
269  const int srcStride[], int srcSliceY,
270  int srcSliceH, uint8_t *const dstParam8[],
271  const int dstStride[])
272 {
273  const AVPixFmtDescriptor *src_format = av_pix_fmt_desc_get(c->opts.src_format);
274  const AVPixFmtDescriptor *dst_format = av_pix_fmt_desc_get(c->opts.dst_format);
275  const uint16_t **src = (const uint16_t**)src8;
276  uint16_t *dstY = (uint16_t*)(dstParam8[0] + dstStride[0] * srcSliceY);
277  uint16_t *dstUV = (uint16_t*)(dstParam8[1] + dstStride[1] * srcSliceY / 2);
278  int x, y;
279 
280  /* Calculate net shift required for values. */
281  const int shift[3] = {
282  dst_format->comp[0].depth + dst_format->comp[0].shift -
283  src_format->comp[0].depth - src_format->comp[0].shift,
284  dst_format->comp[1].depth + dst_format->comp[1].shift -
285  src_format->comp[1].depth - src_format->comp[1].shift,
286  dst_format->comp[2].depth + dst_format->comp[2].shift -
287  src_format->comp[2].depth - src_format->comp[2].shift,
288  };
289 
290  av_assert0(!(srcStride[0] % 2 || srcStride[1] % 2 || srcStride[2] % 2 ||
291  dstStride[0] % 2 || dstStride[1] % 2));
292 
293  for (y = 0; y < srcSliceH; y++) {
294  uint16_t *tdstY = dstY;
295  const uint16_t *tsrc0 = src[0];
296  for (x = c->opts.src_w; x > 0; x--) {
297  *tdstY++ = *tsrc0++ << shift[0];
298  }
299  src[0] += srcStride[0] / 2;
300  dstY += dstStride[0] / 2;
301 
302  if (!(y & 1)) {
303  uint16_t *tdstUV = dstUV;
304  const uint16_t *tsrc1 = src[1];
305  const uint16_t *tsrc2 = src[2];
306  for (x = c->opts.src_w / 2; x > 0; x--) {
307  *tdstUV++ = *tsrc1++ << shift[1];
308  *tdstUV++ = *tsrc2++ << shift[2];
309  }
310  src[1] += srcStride[1] / 2;
311  src[2] += srcStride[2] / 2;
312  dstUV += dstStride[1] / 2;
313  }
314  }
315 
316  return srcSliceH;
317 }
318 
319 #if AV_HAVE_BIGENDIAN
320 #define output_pixel(p, v) do { \
321  uint16_t *pp = (p); \
322  AV_WL16(pp, (v)); \
323  } while(0)
324 #else
325 #define output_pixel(p, v) (*p) = (v)
326 #endif
327 
328 static int planar8ToP01xleWrapper(SwsInternal *c, const uint8_t *const src[],
329  const int srcStride[], int srcSliceY,
330  int srcSliceH, uint8_t *const dstParam8[],
331  const int dstStride[])
332 {
333  const uint8_t *src0 = src[0], *src1 = src[1], *src2 = src[2];
334  uint16_t *dstY = (uint16_t*)(dstParam8[0] + dstStride[0] * srcSliceY);
335  uint16_t *dstUV = (uint16_t*)(dstParam8[1] + dstStride[1] * srcSliceY / 2);
336  int x, y, t;
337 
338  av_assert0(!(dstStride[0] % 2 || dstStride[1] % 2));
339 
340  for (y = 0; y < srcSliceH; y++) {
341  uint16_t *tdstY = dstY;
342  const uint8_t *tsrc0 = src0;
343  for (x = c->opts.src_w; x > 0; x--) {
344  t = *tsrc0++;
345  output_pixel(tdstY++, t << 8);
346  }
347  src0 += srcStride[0];
348  dstY += dstStride[0] / 2;
349 
350  if (!(y & 1)) {
351  uint16_t *tdstUV = dstUV;
352  const uint8_t *tsrc1 = src1;
353  const uint8_t *tsrc2 = src2;
354  for (x = c->opts.src_w / 2; x > 0; x--) {
355  t = *tsrc1++;
356  output_pixel(tdstUV++, t << 8);
357  t = *tsrc2++;
358  output_pixel(tdstUV++, t << 8);
359  }
360  src1 += srcStride[1];
361  src2 += srcStride[2];
362  dstUV += dstStride[1] / 2;
363  }
364  }
365 
366  return srcSliceH;
367 }
368 
369 #undef output_pixel
370 
371 static int planarToYuy2Wrapper(SwsInternal *c, const uint8_t *const src[],
372  const int srcStride[], int srcSliceY, int srcSliceH,
373  uint8_t *const dstParam[], const int dstStride[])
374 {
375  uint8_t *dst = dstParam[0] + dstStride[0] * srcSliceY;
376 
377  yv12toyuy2(src[0], src[1], src[2], dst, c->opts.src_w, srcSliceH, srcStride[0],
378  srcStride[1], dstStride[0]);
379 
380  return srcSliceH;
381 }
382 
383 static int planarToUyvyWrapper(SwsInternal *c, const uint8_t *const src[],
384  const int srcStride[], int srcSliceY, int srcSliceH,
385  uint8_t *const dstParam[], const int dstStride[])
386 {
387  uint8_t *dst = dstParam[0] + dstStride[0] * srcSliceY;
388 
389  yv12touyvy(src[0], src[1], src[2], dst, c->opts.src_w, srcSliceH, srcStride[0],
390  srcStride[1], dstStride[0]);
391 
392  return srcSliceH;
393 }
394 
395 static int yuv422pToYuy2Wrapper(SwsInternal *c, const uint8_t *const src[],
396  const int srcStride[], int srcSliceY, int srcSliceH,
397  uint8_t *const dstParam[], const int dstStride[])
398 {
399  uint8_t *dst = dstParam[0] + dstStride[0] * srcSliceY;
400 
401  yuv422ptoyuy2(src[0], src[1], src[2], dst, c->opts.src_w, srcSliceH, srcStride[0],
402  srcStride[1], dstStride[0]);
403 
404  return srcSliceH;
405 }
406 
407 static int yuv422pToUyvyWrapper(SwsInternal *c, const uint8_t *const src[],
408  const int srcStride[], int srcSliceY, int srcSliceH,
409  uint8_t *const dstParam[], const int dstStride[])
410 {
411  uint8_t *dst = dstParam[0] + dstStride[0] * srcSliceY;
412 
413  yuv422ptouyvy(src[0], src[1], src[2], dst, c->opts.src_w, srcSliceH, srcStride[0],
414  srcStride[1], dstStride[0]);
415 
416  return srcSliceH;
417 }
418 
419 static int yuyvToYuv420Wrapper(SwsInternal *c, const uint8_t *const src[],
420  const int srcStride[], int srcSliceY, int srcSliceH,
421  uint8_t *const dstParam[], const int dstStride[])
422 {
423  uint8_t *ydst = dstParam[0] + dstStride[0] * srcSliceY;
424  uint8_t *udst = dstParam[1] + dstStride[1] * srcSliceY / 2;
425  uint8_t *vdst = dstParam[2] + dstStride[2] * srcSliceY / 2;
426 
427  yuyvtoyuv420(ydst, udst, vdst, src[0], c->opts.src_w, srcSliceH, dstStride[0],
428  dstStride[1], srcStride[0]);
429 
430  if (dstParam[3])
431  fillPlane(dstParam[3], dstStride[3], c->opts.src_w, srcSliceH, srcSliceY, 255);
432 
433  return srcSliceH;
434 }
435 
436 static int yuyvToYuv422Wrapper(SwsInternal *c, const uint8_t *const src[],
437  const int srcStride[], int srcSliceY, int srcSliceH,
438  uint8_t *const dstParam[], const int dstStride[])
439 {
440  uint8_t *ydst = dstParam[0] + dstStride[0] * srcSliceY;
441  uint8_t *udst = dstParam[1] + dstStride[1] * srcSliceY;
442  uint8_t *vdst = dstParam[2] + dstStride[2] * srcSliceY;
443 
444  yuyvtoyuv422(ydst, udst, vdst, src[0], c->opts.src_w, srcSliceH, dstStride[0],
445  dstStride[1], srcStride[0]);
446 
447  return srcSliceH;
448 }
449 
450 static int uyvyToYuv420Wrapper(SwsInternal *c, const uint8_t *const src[],
451  const int srcStride[], int srcSliceY, int srcSliceH,
452  uint8_t *const dstParam[], const int dstStride[])
453 {
454  uint8_t *ydst = dstParam[0] + dstStride[0] * srcSliceY;
455  uint8_t *udst = dstParam[1] + dstStride[1] * srcSliceY / 2;
456  uint8_t *vdst = dstParam[2] + dstStride[2] * srcSliceY / 2;
457 
458  uyvytoyuv420(ydst, udst, vdst, src[0], c->opts.src_w, srcSliceH, dstStride[0],
459  dstStride[1], srcStride[0]);
460 
461  if (dstParam[3])
462  fillPlane(dstParam[3], dstStride[3], c->opts.src_w, srcSliceH, srcSliceY, 255);
463 
464  return srcSliceH;
465 }
466 
467 static int uyvyToYuv422Wrapper(SwsInternal *c, const uint8_t *const src[],
468  const int srcStride[], int srcSliceY, int srcSliceH,
469  uint8_t *const dstParam[], const int dstStride[])
470 {
471  uint8_t *ydst = dstParam[0] + dstStride[0] * srcSliceY;
472  uint8_t *udst = dstParam[1] + dstStride[1] * srcSliceY;
473  uint8_t *vdst = dstParam[2] + dstStride[2] * srcSliceY;
474 
475  uyvytoyuv422(ydst, udst, vdst, src[0], c->opts.src_w, srcSliceH, dstStride[0],
476  dstStride[1], srcStride[0]);
477 
478  return srcSliceH;
479 }
480 
481 static void gray8aToPacked32(const uint8_t *src, uint8_t *dst, int num_pixels,
482  const uint8_t *palette)
483 {
484  int i;
485  for (i = 0; i < num_pixels; i++)
486  ((uint32_t *) dst)[i] = ((const uint32_t *) palette)[src[i << 1]] | (src[(i << 1) + 1] << 24);
487 }
488 
489 static void gray8aToPacked32_1(const uint8_t *src, uint8_t *dst, int num_pixels,
490  const uint8_t *palette)
491 {
492  int i;
493 
494  for (i = 0; i < num_pixels; i++)
495  ((uint32_t *) dst)[i] = ((const uint32_t *) palette)[src[i << 1]] | src[(i << 1) + 1];
496 }
497 
498 static void gray8aToPacked24(const uint8_t *src, uint8_t *dst, int num_pixels,
499  const uint8_t *palette)
500 {
501  int i;
502 
503  for (i = 0; i < num_pixels; i++) {
504  //FIXME slow?
505  dst[0] = palette[src[i << 1] * 4 + 0];
506  dst[1] = palette[src[i << 1] * 4 + 1];
507  dst[2] = palette[src[i << 1] * 4 + 2];
508  dst += 3;
509  }
510 }
511 
512 static void gray8aToPlanar8(const uint8_t *src, uint8_t *dst0, uint8_t *dst1,
513  uint8_t *dst2, uint8_t *dstA, int num_pixels,
514  const uint8_t *palette)
515 {
516  for (int i = 0; i < num_pixels; i++) {
517  const uint8_t *rgb = &palette[src[i << 1] * 4];
518  dst0[i] = rgb[0];
519  dst1[i] = rgb[1];
520  dst2[i] = rgb[2];
521  if (dstA)
522  dstA[i] = src[(i << 1) + 1];
523  }
524 }
525 
526 static void pal8ToPlanar8(const uint8_t *src, uint8_t *dst0, uint8_t *dst1,
527  uint8_t *dst2, uint8_t *dstA, int num_pixels,
528  const uint8_t *palette)
529 {
530  for (int i = 0; i < num_pixels; i++) {
531  const uint8_t *rgba = &palette[src[i] * 4];
532  dst0[i] = rgba[0];
533  dst1[i] = rgba[1];
534  dst2[i] = rgba[2];
535  if (dstA)
536  dstA[i] = rgba[3];
537  }
538 }
539 
540 static int bswap_16bpc(SwsInternal *c, const uint8_t *const src[],
541  const int srcStride[], int srcSliceY, int srcSliceH,
542  uint8_t *const dst[], const int dstStride[])
543 {
544  int i, j, p;
545 
546  for (p = 0; p < 4; p++) {
547  int srcstr = srcStride[p] / 2;
548  int dststr = dstStride[p] / 2;
549  uint16_t *dstPtr = (uint16_t *) dst[p];
550  const uint16_t *srcPtr = (const uint16_t *) src[p];
551  int min_stride = FFMIN(FFABS(srcstr), FFABS(dststr));
552  if(!dstPtr || !srcPtr)
553  continue;
554  dstPtr += (srcSliceY >> c->chrDstVSubSample) * dststr;
555  for (i = 0; i < (srcSliceH >> c->chrDstVSubSample); i++) {
556  for (j = 0; j < min_stride; j++) {
557  dstPtr[j] = av_bswap16(srcPtr[j]);
558  }
559  srcPtr += srcstr;
560  dstPtr += dststr;
561  }
562  }
563 
564  return srcSliceH;
565 }
566 
567 static int bswap_32bpc(SwsInternal *c, const uint8_t *const src[],
568  const int srcStride[], int srcSliceY, int srcSliceH,
569  uint8_t *const dst[], const int dstStride[])
570 {
571  int i, j, p;
572 
573  for (p = 0; p < 4; p++) {
574  int srcstr = srcStride[p] / 4;
575  int dststr = dstStride[p] / 4;
576  uint32_t *dstPtr = (uint32_t *) dst[p];
577  const uint32_t *srcPtr = (const uint32_t *) src[p];
578  int min_stride = FFMIN(FFABS(srcstr), FFABS(dststr));
579  if(!dstPtr || !srcPtr)
580  continue;
581  dstPtr += (srcSliceY >> c->chrDstVSubSample) * dststr;
582  for (i = 0; i < (srcSliceH >> c->chrDstVSubSample); i++) {
583  for (j = 0; j < min_stride; j++) {
584  dstPtr[j] = av_bswap32(srcPtr[j]);
585  }
586  srcPtr += srcstr;
587  dstPtr += dststr;
588  }
589  }
590 
591  return srcSliceH;
592 }
593 
594 
595 static int palToRgbWrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[],
596  int srcSliceY, int srcSliceH, uint8_t *const dst[],
597  const int dstStride[])
598 {
599  const enum AVPixelFormat srcFormat = c->opts.src_format;
600  const enum AVPixelFormat dstFormat = c->opts.dst_format;
601  void (*conv)(const uint8_t *src, uint8_t *dst, int num_pixels,
602  const uint8_t *palette) = NULL;
603  int i;
604  uint8_t *dstPtr = dst[0] + dstStride[0] * srcSliceY;
605  const uint8_t *srcPtr = src[0];
606 
607  if (srcFormat == AV_PIX_FMT_YA8) {
608  switch (dstFormat) {
609  case AV_PIX_FMT_RGB32 : conv = gray8aToPacked32; break;
610  case AV_PIX_FMT_BGR32 : conv = gray8aToPacked32; break;
613  case AV_PIX_FMT_RGB24 : conv = gray8aToPacked24; break;
614  case AV_PIX_FMT_BGR24 : conv = gray8aToPacked24; break;
615  }
616  } else if (usePal(srcFormat)) {
617  switch (dstFormat) {
624  }
625  }
626 
627  if (!conv)
628  av_log(c, AV_LOG_ERROR, "internal error %s -> %s converter\n",
629  av_get_pix_fmt_name(srcFormat), av_get_pix_fmt_name(dstFormat));
630  else {
631  for (i = 0; i < srcSliceH; i++) {
632  conv(srcPtr, dstPtr, c->opts.src_w, (uint8_t *) c->pal_rgb);
633  srcPtr += srcStride[0];
634  dstPtr += dstStride[0];
635  }
636  }
637 
638  return srcSliceH;
639 }
640 
641 static int palToGbrpWrapper(SwsInternal *c, const uint8_t *const src[],
642  const int srcStride[], int srcSliceY, int srcSliceH,
643  uint8_t *const dst[], const int dstStride[])
644 {
645  const enum AVPixelFormat srcFormat = c->opts.src_format;
646  const enum AVPixelFormat dstFormat = c->opts.dst_format;
647  void (*conv)(const uint8_t *src, uint8_t *dstG, uint8_t *dstB, uint8_t *dstR,
648  uint8_t *dstA, int num_pixels, const uint8_t *palette) = NULL;
649 
650  const int num_planes = isALPHA(dstFormat) ? 4 : 3;
651  const uint8_t *srcPtr = src[0];
652  uint8_t *dstPtr[4] = {0};
653  for (int i = 0; i < num_planes; i++)
654  dstPtr[i] = dst[i] + dstStride[i] * srcSliceY;
655 
656  if (srcFormat == AV_PIX_FMT_YA8) {
657  switch (dstFormat) {
658  case AV_PIX_FMT_GBRP: conv = gray8aToPlanar8; break;
659  case AV_PIX_FMT_GBRAP: conv = gray8aToPlanar8; break;
660  }
661  } else if (usePal(srcFormat)) {
662  switch (dstFormat) {
663  case AV_PIX_FMT_GBRP: conv = pal8ToPlanar8; break;
664  case AV_PIX_FMT_GBRAP: conv = pal8ToPlanar8; break;
665  }
666  }
667 
668  av_assert1(conv);
669  for (int y = 0; y < srcSliceH; y++) {
670  conv(srcPtr, dstPtr[0], dstPtr[1], dstPtr[2], dstPtr[3], c->opts.src_w,
671  (uint8_t *) c->pal_rgb);
672  srcPtr += srcStride[0];
673  for (int i = 0; i < num_planes; i++)
674  dstPtr[i] += dstStride[i];
675  }
676 
677  return srcSliceH;
678 }
679 
680 static void packed16togbra16(const uint8_t *src, int srcStride,
681  uint16_t *dst[], const int dstStride[], int srcSliceH,
682  int src_alpha, int swap, int shift, int width)
683 {
684  int x, h, i;
685  int dst_alpha = dst[3] != NULL;
686  for (h = 0; h < srcSliceH; h++) {
687  uint16_t *src_line = (uint16_t *)(src + srcStride * h);
688  switch (swap) {
689  case 3:
690  if (src_alpha && dst_alpha) {
691  for (x = 0; x < width; x++) {
692  dst[0][x] = av_bswap16(av_bswap16(*src_line++) >> shift);
693  dst[1][x] = av_bswap16(av_bswap16(*src_line++) >> shift);
694  dst[2][x] = av_bswap16(av_bswap16(*src_line++) >> shift);
695  dst[3][x] = av_bswap16(av_bswap16(*src_line++) >> shift);
696  }
697  } else if (dst_alpha) {
698  for (x = 0; x < width; x++) {
699  dst[0][x] = av_bswap16(av_bswap16(*src_line++) >> shift);
700  dst[1][x] = av_bswap16(av_bswap16(*src_line++) >> shift);
701  dst[2][x] = av_bswap16(av_bswap16(*src_line++) >> shift);
702  dst[3][x] = 0xFFFF;
703  }
704  } else if (src_alpha) {
705  for (x = 0; x < width; x++) {
706  dst[0][x] = av_bswap16(av_bswap16(*src_line++) >> shift);
707  dst[1][x] = av_bswap16(av_bswap16(*src_line++) >> shift);
708  dst[2][x] = av_bswap16(av_bswap16(*src_line++) >> shift);
709  src_line++;
710  }
711  } else {
712  for (x = 0; x < width; x++) {
713  dst[0][x] = av_bswap16(av_bswap16(*src_line++) >> shift);
714  dst[1][x] = av_bswap16(av_bswap16(*src_line++) >> shift);
715  dst[2][x] = av_bswap16(av_bswap16(*src_line++) >> shift);
716  }
717  }
718  break;
719  case 2:
720  if (src_alpha && dst_alpha) {
721  for (x = 0; x < width; x++) {
722  dst[0][x] = av_bswap16(*src_line++ >> shift);
723  dst[1][x] = av_bswap16(*src_line++ >> shift);
724  dst[2][x] = av_bswap16(*src_line++ >> shift);
725  dst[3][x] = av_bswap16(*src_line++ >> shift);
726  }
727  } else if (dst_alpha) {
728  for (x = 0; x < width; x++) {
729  dst[0][x] = av_bswap16(*src_line++ >> shift);
730  dst[1][x] = av_bswap16(*src_line++ >> shift);
731  dst[2][x] = av_bswap16(*src_line++ >> shift);
732  dst[3][x] = 0xFFFF;
733  }
734  } else if (src_alpha) {
735  for (x = 0; x < width; x++) {
736  dst[0][x] = av_bswap16(*src_line++ >> shift);
737  dst[1][x] = av_bswap16(*src_line++ >> shift);
738  dst[2][x] = av_bswap16(*src_line++ >> shift);
739  src_line++;
740  }
741  } else {
742  for (x = 0; x < width; x++) {
743  dst[0][x] = av_bswap16(*src_line++ >> shift);
744  dst[1][x] = av_bswap16(*src_line++ >> shift);
745  dst[2][x] = av_bswap16(*src_line++ >> shift);
746  }
747  }
748  break;
749  case 1:
750  if (src_alpha && dst_alpha) {
751  for (x = 0; x < width; x++) {
752  dst[0][x] = av_bswap16(*src_line++) >> shift;
753  dst[1][x] = av_bswap16(*src_line++) >> shift;
754  dst[2][x] = av_bswap16(*src_line++) >> shift;
755  dst[3][x] = av_bswap16(*src_line++) >> shift;
756  }
757  } else if (dst_alpha) {
758  for (x = 0; x < width; x++) {
759  dst[0][x] = av_bswap16(*src_line++) >> shift;
760  dst[1][x] = av_bswap16(*src_line++) >> shift;
761  dst[2][x] = av_bswap16(*src_line++) >> shift;
762  dst[3][x] = 0xFFFF;
763  }
764  } else if (src_alpha) {
765  for (x = 0; x < width; x++) {
766  dst[0][x] = av_bswap16(*src_line++) >> shift;
767  dst[1][x] = av_bswap16(*src_line++) >> shift;
768  dst[2][x] = av_bswap16(*src_line++) >> shift;
769  src_line++;
770  }
771  } else {
772  for (x = 0; x < width; x++) {
773  dst[0][x] = av_bswap16(*src_line++) >> shift;
774  dst[1][x] = av_bswap16(*src_line++) >> shift;
775  dst[2][x] = av_bswap16(*src_line++) >> shift;
776  }
777  }
778  break;
779  default:
780  if (src_alpha && dst_alpha) {
781  for (x = 0; x < width; x++) {
782  dst[0][x] = *src_line++ >> shift;
783  dst[1][x] = *src_line++ >> shift;
784  dst[2][x] = *src_line++ >> shift;
785  dst[3][x] = *src_line++ >> shift;
786  }
787  } else if (dst_alpha) {
788  for (x = 0; x < width; x++) {
789  dst[0][x] = *src_line++ >> shift;
790  dst[1][x] = *src_line++ >> shift;
791  dst[2][x] = *src_line++ >> shift;
792  dst[3][x] = 0xFFFF;
793  }
794  } else if (src_alpha) {
795  for (x = 0; x < width; x++) {
796  dst[0][x] = *src_line++ >> shift;
797  dst[1][x] = *src_line++ >> shift;
798  dst[2][x] = *src_line++ >> shift;
799  src_line++;
800  }
801  } else {
802  for (x = 0; x < width; x++) {
803  dst[0][x] = *src_line++ >> shift;
804  dst[1][x] = *src_line++ >> shift;
805  dst[2][x] = *src_line++ >> shift;
806  }
807  }
808  }
809  for (i = 0; i < 4; i++)
810  dst[i] += dstStride[i] >> 1;
811  }
812 }
813 
814 static void packed30togbra10(const uint8_t *src, int srcStride,
815  uint16_t *dst[], const int dstStride[], int srcSliceH,
816  int swap, int bpc, int width)
817 {
818  int x, h, i;
819  int dst_alpha = dst[3] != NULL;
820  int scale_high = bpc - 10, scale_low = 10 - scale_high;
821  for (h = 0; h < srcSliceH; h++) {
822  uint32_t *src_line = (uint32_t *)(src + srcStride * h);
823  unsigned component;
824 
825  switch (swap) {
826  case 3:
827  case 2:
828  if (dst_alpha) {
829  for (x = 0; x < width; x++) {
830  unsigned p = AV_RL32(src_line);
831  component = (p >> 20) & 0x3FF;
832  dst[0][x] = av_bswap16(component << scale_high | component >> scale_low);
833  component = (p >> 10) & 0x3FF;
834  dst[1][x] = av_bswap16(component << scale_high | component >> scale_low);
835  component = p & 0x3FF;
836  dst[2][x] = av_bswap16(component << scale_high | component >> scale_low);
837  dst[3][x] = 0xFFFF;
838  src_line++;
839  }
840  } else {
841  for (x = 0; x < width; x++) {
842  unsigned p = AV_RL32(src_line);
843  component = (p >> 20) & 0x3FF;
844  dst[0][x] = av_bswap16(component << scale_high | component >> scale_low);
845  component = (p >> 10) & 0x3FF;
846  dst[1][x] = av_bswap16(component << scale_high | component >> scale_low);
847  component = p & 0x3FF;
848  dst[2][x] = av_bswap16(component << scale_high | component >> scale_low);
849  src_line++;
850  }
851  }
852  break;
853  default:
854  if (dst_alpha) {
855  for (x = 0; x < width; x++) {
856  unsigned p = AV_RL32(src_line);
857  component = (p >> 20) & 0x3FF;
858  dst[0][x] = component << scale_high | component >> scale_low;
859  component = (p >> 10) & 0x3FF;
860  dst[1][x] = component << scale_high | component >> scale_low;
861  component = p & 0x3FF;
862  dst[2][x] = component << scale_high | component >> scale_low;
863  dst[3][x] = 0xFFFF;
864  src_line++;
865  }
866  } else {
867  for (x = 0; x < width; x++) {
868  unsigned p = AV_RL32(src_line);
869  component = (p >> 20) & 0x3FF;
870  dst[0][x] = component << scale_high | component >> scale_low;
871  component = (p >> 10) & 0x3FF;
872  dst[1][x] = component << scale_high | component >> scale_low;
873  component = p & 0x3FF;
874  dst[2][x] = component << scale_high | component >> scale_low;
875  src_line++;
876  }
877  }
878  break;
879  }
880  for (i = 0; i < 4; i++)
881  dst[i] += dstStride[i] >> 1;
882  }
883 }
884 
885 static int Rgb16ToPlanarRgb16Wrapper(SwsInternal *c, const uint8_t *const src[],
886  const int srcStride[], int srcSliceY, int srcSliceH,
887  uint8_t *const dst[], const int dstStride[])
888 {
889  uint16_t *dst2013[] = { (uint16_t *)dst[2], (uint16_t *)dst[0], (uint16_t *)dst[1], (uint16_t *)dst[3] };
890  uint16_t *dst1023[] = { (uint16_t *)dst[1], (uint16_t *)dst[0], (uint16_t *)dst[2], (uint16_t *)dst[3] };
891  int stride2013[] = { dstStride[2], dstStride[0], dstStride[1], dstStride[3] };
892  int stride1023[] = { dstStride[1], dstStride[0], dstStride[2], dstStride[3] };
893  const AVPixFmtDescriptor *src_format = av_pix_fmt_desc_get(c->opts.src_format);
894  const AVPixFmtDescriptor *dst_format = av_pix_fmt_desc_get(c->opts.dst_format);
895  int bpc = dst_format->comp[0].depth;
896  int alpha = src_format->flags & AV_PIX_FMT_FLAG_ALPHA;
897  int swap = 0;
898  int i;
899 
900  if ( HAVE_BIGENDIAN && !(src_format->flags & AV_PIX_FMT_FLAG_BE) ||
901  !HAVE_BIGENDIAN && src_format->flags & AV_PIX_FMT_FLAG_BE)
902  swap++;
903  if ( HAVE_BIGENDIAN && !(dst_format->flags & AV_PIX_FMT_FLAG_BE) ||
904  !HAVE_BIGENDIAN && dst_format->flags & AV_PIX_FMT_FLAG_BE)
905  swap += 2;
906 
907  if ((dst_format->flags & (AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB)) !=
909  av_log(c, AV_LOG_ERROR, "unsupported conversion to planar RGB %s -> %s\n",
910  src_format->name, dst_format->name);
911  return srcSliceH;
912  }
913 
914  for(i=0; i<4; i++) {
915  dst2013[i] += stride2013[i] * srcSliceY / 2;
916  dst1023[i] += stride1023[i] * srcSliceY / 2;
917  }
918 
919  switch (c->opts.src_format) {
920  case AV_PIX_FMT_RGB48LE:
921  case AV_PIX_FMT_RGB48BE:
922  case AV_PIX_FMT_RGBA64LE:
923  case AV_PIX_FMT_RGBA64BE:
924  packed16togbra16(src[0], srcStride[0],
925  dst2013, stride2013, srcSliceH, alpha, swap,
926  16 - bpc, c->opts.src_w);
927  break;
929  av_assert0(bpc >= 10);
930  packed30togbra10(src[0], srcStride[0],
931  dst2013, stride2013, srcSliceH, swap,
932  bpc, c->opts.src_w);
933  break;
934  case AV_PIX_FMT_BGR48LE:
935  case AV_PIX_FMT_BGR48BE:
936  case AV_PIX_FMT_BGRA64LE:
937  case AV_PIX_FMT_BGRA64BE:
938  packed16togbra16(src[0], srcStride[0],
939  dst1023, stride1023, srcSliceH, alpha, swap,
940  16 - bpc, c->opts.src_w);
941  break;
943  av_assert0(bpc >= 10);
944  packed30togbra10(src[0], srcStride[0],
945  dst1023, stride1023, srcSliceH, swap,
946  bpc, c->opts.src_w);
947  break;
948  default:
950  "unsupported conversion to planar RGB %s -> %s\n",
951  src_format->name, dst_format->name);
952  }
953 
954  return srcSliceH;
955 }
956 
957 static void gbr16ptopacked16(const uint16_t *src[], const int srcStride[],
958  uint8_t *dst, int dstStride, int srcSliceH,
959  int alpha, int swap, int bpp, int width)
960 {
961  int x, h, i;
962  int src_alpha = src[3] != NULL;
963  int scale_high = 16 - bpp, scale_low = (bpp - 8) * 2;
964  for (h = 0; h < srcSliceH; h++) {
965  uint16_t *dest = (uint16_t *)(dst + dstStride * h);
966  uint16_t component;
967 
968  switch(swap) {
969  case 3:
970  if (alpha && !src_alpha) {
971  for (x = 0; x < width; x++) {
972  component = av_bswap16(src[0][x]);
973  *dest++ = av_bswap16(component << scale_high | component >> scale_low);
974  component = av_bswap16(src[1][x]);
975  *dest++ = av_bswap16(component << scale_high | component >> scale_low);
976  component = av_bswap16(src[2][x]);
977  *dest++ = av_bswap16(component << scale_high | component >> scale_low);
978  *dest++ = 0xffff;
979  }
980  } else if (alpha && src_alpha) {
981  for (x = 0; x < width; x++) {
982  component = av_bswap16(src[0][x]);
983  *dest++ = av_bswap16(component << scale_high | component >> scale_low);
984  component = av_bswap16(src[1][x]);
985  *dest++ = av_bswap16(component << scale_high | component >> scale_low);
986  component = av_bswap16(src[2][x]);
987  *dest++ = av_bswap16(component << scale_high | component >> scale_low);
988  component = av_bswap16(src[3][x]);
989  *dest++ = av_bswap16(component << scale_high | component >> scale_low);
990  }
991  } else {
992  for (x = 0; x < width; x++) {
993  component = av_bswap16(src[0][x]);
994  *dest++ = av_bswap16(component << scale_high | component >> scale_low);
995  component = av_bswap16(src[1][x]);
996  *dest++ = av_bswap16(component << scale_high | component >> scale_low);
997  component = av_bswap16(src[2][x]);
998  *dest++ = av_bswap16(component << scale_high | component >> scale_low);
999  }
1000  }
1001  break;
1002  case 2:
1003  if (alpha && !src_alpha) {
1004  for (x = 0; x < width; x++) {
1005  *dest++ = av_bswap16(src[0][x] << scale_high | src[0][x] >> scale_low);
1006  *dest++ = av_bswap16(src[1][x] << scale_high | src[1][x] >> scale_low);
1007  *dest++ = av_bswap16(src[2][x] << scale_high | src[2][x] >> scale_low);
1008  *dest++ = 0xffff;
1009  }
1010  } else if (alpha && src_alpha) {
1011  for (x = 0; x < width; x++) {
1012  *dest++ = av_bswap16(src[0][x] << scale_high | src[0][x] >> scale_low);
1013  *dest++ = av_bswap16(src[1][x] << scale_high | src[1][x] >> scale_low);
1014  *dest++ = av_bswap16(src[2][x] << scale_high | src[2][x] >> scale_low);
1015  *dest++ = av_bswap16(src[3][x] << scale_high | src[3][x] >> scale_low);
1016  }
1017  } else {
1018  for (x = 0; x < width; x++) {
1019  *dest++ = av_bswap16(src[0][x] << scale_high | src[0][x] >> scale_low);
1020  *dest++ = av_bswap16(src[1][x] << scale_high | src[1][x] >> scale_low);
1021  *dest++ = av_bswap16(src[2][x] << scale_high | src[2][x] >> scale_low);
1022  }
1023  }
1024  break;
1025  case 1:
1026  if (alpha && !src_alpha) {
1027  for (x = 0; x < width; x++) {
1028  *dest++ = av_bswap16(src[0][x]) << scale_high | av_bswap16(src[0][x]) >> scale_low;
1029  *dest++ = av_bswap16(src[1][x]) << scale_high | av_bswap16(src[1][x]) >> scale_low;
1030  *dest++ = av_bswap16(src[2][x]) << scale_high | av_bswap16(src[2][x]) >> scale_low;
1031  *dest++ = 0xffff;
1032  }
1033  } else if (alpha && src_alpha) {
1034  for (x = 0; x < width; x++) {
1035  *dest++ = av_bswap16(src[0][x]) << scale_high | av_bswap16(src[0][x]) >> scale_low;
1036  *dest++ = av_bswap16(src[1][x]) << scale_high | av_bswap16(src[1][x]) >> scale_low;
1037  *dest++ = av_bswap16(src[2][x]) << scale_high | av_bswap16(src[2][x]) >> scale_low;
1038  *dest++ = av_bswap16(src[3][x]) << scale_high | av_bswap16(src[3][x]) >> scale_low;
1039  }
1040  } else {
1041  for (x = 0; x < width; x++) {
1042  *dest++ = av_bswap16(src[0][x]) << scale_high | av_bswap16(src[0][x]) >> scale_low;
1043  *dest++ = av_bswap16(src[1][x]) << scale_high | av_bswap16(src[1][x]) >> scale_low;
1044  *dest++ = av_bswap16(src[2][x]) << scale_high | av_bswap16(src[2][x]) >> scale_low;
1045  }
1046  }
1047  break;
1048  default:
1049  if (alpha && !src_alpha) {
1050  for (x = 0; x < width; x++) {
1051  *dest++ = src[0][x] << scale_high | src[0][x] >> scale_low;
1052  *dest++ = src[1][x] << scale_high | src[1][x] >> scale_low;
1053  *dest++ = src[2][x] << scale_high | src[2][x] >> scale_low;
1054  *dest++ = 0xffff;
1055  }
1056  } else if (alpha && src_alpha) {
1057  for (x = 0; x < width; x++) {
1058  *dest++ = src[0][x] << scale_high | src[0][x] >> scale_low;
1059  *dest++ = src[1][x] << scale_high | src[1][x] >> scale_low;
1060  *dest++ = src[2][x] << scale_high | src[2][x] >> scale_low;
1061  *dest++ = src[3][x] << scale_high | src[3][x] >> scale_low;
1062  }
1063  } else {
1064  for (x = 0; x < width; x++) {
1065  *dest++ = src[0][x] << scale_high | src[0][x] >> scale_low;
1066  *dest++ = src[1][x] << scale_high | src[1][x] >> scale_low;
1067  *dest++ = src[2][x] << scale_high | src[2][x] >> scale_low;
1068  }
1069  }
1070  }
1071  for (i = 0; i < 3 + src_alpha; i++)
1072  src[i] += srcStride[i] >> 1;
1073  }
1074 }
1075 
1076 static void gbr16ptopacked30(const uint16_t *src[], const int srcStride[],
1077  uint8_t *dst, int dstStride, int srcSliceH,
1078  int swap, int bpp, int width)
1079 {
1080  int x, h, i;
1081  int shift = bpp - 10;
1082  av_assert0(bpp >= 0);
1083  for (h = 0; h < srcSliceH; h++) {
1084  uint8_t *dest = dst + dstStride * h;
1085 
1086  switch(swap) {
1087  case 3:
1088  case 1:
1089  for (x = 0; x < width; x++) {
1090  unsigned C0 = av_bswap16(src[0][x]) >> shift;
1091  unsigned C1 = av_bswap16(src[1][x]) >> shift;
1092  unsigned C2 = av_bswap16(src[2][x]) >> shift;
1093  AV_WL32(dest + 4 * x, (3U << 30) + (C0 << 20) + (C1 << 10) + C2);
1094  }
1095  break;
1096  default:
1097  for (x = 0; x < width; x++) {
1098  unsigned C0 = src[0][x] >> shift;
1099  unsigned C1 = src[1][x] >> shift;
1100  unsigned C2 = src[2][x] >> shift;
1101  AV_WL32(dest + 4 * x, (3U << 30) + (C0 << 20) + (C1 << 10) + C2);
1102  }
1103  break;
1104  }
1105  for (i = 0; i < 3; i++)
1106  src[i] += srcStride[i] >> 1;
1107  }
1108 }
1109 
1110 
1111 static int planarRgb16ToRgb16Wrapper(SwsInternal *c, const uint8_t *const src[],
1112  const int srcStride[], int srcSliceY, int srcSliceH,
1113  uint8_t *const dst[], const int dstStride[])
1114 {
1115  const uint16_t *src102[] = { (uint16_t *)src[1], (uint16_t *)src[0], (uint16_t *)src[2], (uint16_t *)src[3] };
1116  const uint16_t *src201[] = { (uint16_t *)src[2], (uint16_t *)src[0], (uint16_t *)src[1], (uint16_t *)src[3] };
1117  int stride102[] = { srcStride[1], srcStride[0], srcStride[2], srcStride[3] };
1118  int stride201[] = { srcStride[2], srcStride[0], srcStride[1], srcStride[3] };
1119  const AVPixFmtDescriptor *src_format = av_pix_fmt_desc_get(c->opts.src_format);
1120  const AVPixFmtDescriptor *dst_format = av_pix_fmt_desc_get(c->opts.dst_format);
1121  int bits_per_sample = src_format->comp[0].depth;
1122  int swap = 0;
1123  if ( HAVE_BIGENDIAN && !(src_format->flags & AV_PIX_FMT_FLAG_BE) ||
1124  !HAVE_BIGENDIAN && src_format->flags & AV_PIX_FMT_FLAG_BE)
1125  swap++;
1126  if ( HAVE_BIGENDIAN && !(dst_format->flags & AV_PIX_FMT_FLAG_BE) ||
1127  !HAVE_BIGENDIAN && dst_format->flags & AV_PIX_FMT_FLAG_BE)
1128  swap += 2;
1129 
1130  if ((src_format->flags & (AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB)) !=
1132  bits_per_sample <= 8) {
1133  av_log(c, AV_LOG_ERROR, "unsupported planar RGB conversion %s -> %s\n",
1134  src_format->name, dst_format->name);
1135  return srcSliceH;
1136  }
1137  switch (c->opts.dst_format) {
1138  case AV_PIX_FMT_BGR48LE:
1139  case AV_PIX_FMT_BGR48BE:
1140  gbr16ptopacked16(src102, stride102,
1141  dst[0] + srcSliceY * dstStride[0], dstStride[0],
1142  srcSliceH, 0, swap, bits_per_sample, c->opts.src_w);
1143  break;
1144  case AV_PIX_FMT_RGB48LE:
1145  case AV_PIX_FMT_RGB48BE:
1146  gbr16ptopacked16(src201, stride201,
1147  dst[0] + srcSliceY * dstStride[0], dstStride[0],
1148  srcSliceH, 0, swap, bits_per_sample, c->opts.src_w);
1149  break;
1150  case AV_PIX_FMT_RGBA64LE:
1151  case AV_PIX_FMT_RGBA64BE:
1152  gbr16ptopacked16(src201, stride201,
1153  dst[0] + srcSliceY * dstStride[0], dstStride[0],
1154  srcSliceH, 1, swap, bits_per_sample, c->opts.src_w);
1155  break;
1156  case AV_PIX_FMT_BGRA64LE:
1157  case AV_PIX_FMT_BGRA64BE:
1158  gbr16ptopacked16(src102, stride102,
1159  dst[0] + srcSliceY * dstStride[0], dstStride[0],
1160  srcSliceH, 1, swap, bits_per_sample, c->opts.src_w);
1161  break;
1162  case AV_PIX_FMT_X2RGB10LE:
1163  gbr16ptopacked30(src201, stride201,
1164  dst[0] + srcSliceY * dstStride[0], dstStride[0],
1165  srcSliceH, swap, bits_per_sample, c->opts.src_w);
1166  break;
1167  case AV_PIX_FMT_X2BGR10LE:
1168  gbr16ptopacked30(src102, stride102,
1169  dst[0] + srcSliceY * dstStride[0], dstStride[0],
1170  srcSliceH, swap, bits_per_sample, c->opts.src_w);
1171  break;
1172  default:
1174  "unsupported planar RGB conversion %s -> %s\n",
1175  src_format->name, dst_format->name);
1176  }
1177 
1178  return srcSliceH;
1179 }
1180 
1181 static void gbr24ptopacked24(const uint8_t *src[], const int srcStride[],
1182  uint8_t *dst, int dstStride, int srcSliceH,
1183  int width)
1184 {
1185  int x, h, i;
1186  for (h = 0; h < srcSliceH; h++) {
1187  uint8_t *dest = dst + dstStride * h;
1188  for (x = 0; x < width; x++) {
1189  *dest++ = src[0][x];
1190  *dest++ = src[1][x];
1191  *dest++ = src[2][x];
1192  }
1193 
1194  for (i = 0; i < 3; i++)
1195  src[i] += srcStride[i];
1196  }
1197 }
1198 
1199 static void gbr24ptopacked32(const uint8_t *src[], const int srcStride[],
1200  uint8_t *dst, int dstStride, int srcSliceH,
1201  int alpha_first, int width)
1202 {
1203  int x, h, i;
1204  for (h = 0; h < srcSliceH; h++) {
1205  uint8_t *dest = dst + dstStride * h;
1206 
1207  if (alpha_first) {
1208  for (x = 0; x < width; x++) {
1209  *dest++ = 0xff;
1210  *dest++ = src[0][x];
1211  *dest++ = src[1][x];
1212  *dest++ = src[2][x];
1213  }
1214  } else {
1215  for (x = 0; x < width; x++) {
1216  *dest++ = src[0][x];
1217  *dest++ = src[1][x];
1218  *dest++ = src[2][x];
1219  *dest++ = 0xff;
1220  }
1221  }
1222 
1223  for (i = 0; i < 3; i++)
1224  src[i] += srcStride[i];
1225  }
1226 }
1227 
1228 static void gbraptopacked32(const uint8_t *src[], const int srcStride[],
1229  uint8_t *dst, int dstStride, int srcSliceH,
1230  int alpha_first, int width)
1231 {
1232  int x, h, i;
1233  for (h = 0; h < srcSliceH; h++) {
1234  uint8_t *dest = dst + dstStride * h;
1235 
1236  if (alpha_first) {
1237  for (x = 0; x < width; x++) {
1238  *dest++ = src[3][x];
1239  *dest++ = src[0][x];
1240  *dest++ = src[1][x];
1241  *dest++ = src[2][x];
1242  }
1243  } else {
1244  for (x = 0; x < width; x++) {
1245  *dest++ = src[0][x];
1246  *dest++ = src[1][x];
1247  *dest++ = src[2][x];
1248  *dest++ = src[3][x];
1249  }
1250  }
1251 
1252  for (i = 0; i < 4; i++)
1253  src[i] += srcStride[i];
1254  }
1255 }
1256 
1257 static int planarRgbaToRgbWrapper(SwsInternal *c, const uint8_t *const src[],
1258  const int srcStride[], int srcSliceY, int srcSliceH,
1259  uint8_t *const dst[], const int dstStride[])
1260 {
1261  int alpha_first = 0;
1262  const uint8_t *src102[] = { src[1], src[0], src[2], src[3] };
1263  const uint8_t *src201[] = { src[2], src[0], src[1], src[3] };
1264  int stride102[] = { srcStride[1], srcStride[0], srcStride[2], srcStride[3] };
1265  int stride201[] = { srcStride[2], srcStride[0], srcStride[1], srcStride[3] };
1266 
1267  if (c->opts.src_format != AV_PIX_FMT_GBRAP) {
1268  av_log(c, AV_LOG_ERROR, "unsupported planar RGB conversion %s -> %s\n",
1269  av_get_pix_fmt_name(c->opts.src_format),
1270  av_get_pix_fmt_name(c->opts.dst_format));
1271  return srcSliceH;
1272  }
1273 
1274  switch (c->opts.dst_format) {
1275  case AV_PIX_FMT_BGR24:
1276  gbr24ptopacked24(src102, stride102,
1277  dst[0] + srcSliceY * dstStride[0], dstStride[0],
1278  srcSliceH, c->opts.src_w);
1279  break;
1280 
1281  case AV_PIX_FMT_RGB24:
1282  gbr24ptopacked24(src201, stride201,
1283  dst[0] + srcSliceY * dstStride[0], dstStride[0],
1284  srcSliceH, c->opts.src_w);
1285  break;
1286 
1287  case AV_PIX_FMT_ARGB:
1288  alpha_first = 1;
1289  case AV_PIX_FMT_RGBA:
1290  gbraptopacked32(src201, stride201,
1291  dst[0] + srcSliceY * dstStride[0], dstStride[0],
1292  srcSliceH, alpha_first, c->opts.src_w);
1293  break;
1294 
1295  case AV_PIX_FMT_ABGR:
1296  alpha_first = 1;
1297  case AV_PIX_FMT_BGRA:
1298  gbraptopacked32(src102, stride102,
1299  dst[0] + srcSliceY * dstStride[0], dstStride[0],
1300  srcSliceH, alpha_first, c->opts.src_w);
1301  break;
1302 
1303  default:
1305  "unsupported planar RGB conversion %s -> %s\n",
1306  av_get_pix_fmt_name(c->opts.src_format),
1307  av_get_pix_fmt_name(c->opts.dst_format));
1308  }
1309 
1310  return srcSliceH;
1311 }
1312 
1313 static int planarRgbToRgbWrapper(SwsInternal *c, const uint8_t *const src[],
1314  const int srcStride[], int srcSliceY, int srcSliceH,
1315  uint8_t *const dst[], const int dstStride[])
1316 {
1317  int alpha_first = 0;
1318  const uint8_t *src102[] = { src[1], src[0], src[2] };
1319  const uint8_t *src201[] = { src[2], src[0], src[1] };
1320  int stride102[] = { srcStride[1], srcStride[0], srcStride[2] };
1321  int stride201[] = { srcStride[2], srcStride[0], srcStride[1] };
1322 
1323  if (c->opts.src_format != AV_PIX_FMT_GBRP) {
1324  av_log(c, AV_LOG_ERROR, "unsupported planar RGB conversion %s -> %s\n",
1325  av_get_pix_fmt_name(c->opts.src_format),
1326  av_get_pix_fmt_name(c->opts.dst_format));
1327  return srcSliceH;
1328  }
1329 
1330  switch (c->opts.dst_format) {
1331  case AV_PIX_FMT_BGR24:
1332  gbr24ptopacked24(src102, stride102,
1333  dst[0] + srcSliceY * dstStride[0], dstStride[0],
1334  srcSliceH, c->opts.src_w);
1335  break;
1336 
1337  case AV_PIX_FMT_RGB24:
1338  gbr24ptopacked24(src201, stride201,
1339  dst[0] + srcSliceY * dstStride[0], dstStride[0],
1340  srcSliceH, c->opts.src_w);
1341  break;
1342 
1343  case AV_PIX_FMT_ARGB:
1344  alpha_first = 1;
1345  case AV_PIX_FMT_RGBA:
1346  gbr24ptopacked32(src201, stride201,
1347  dst[0] + srcSliceY * dstStride[0], dstStride[0],
1348  srcSliceH, alpha_first, c->opts.src_w);
1349  break;
1350 
1351  case AV_PIX_FMT_ABGR:
1352  alpha_first = 1;
1353  case AV_PIX_FMT_BGRA:
1354  gbr24ptopacked32(src102, stride102,
1355  dst[0] + srcSliceY * dstStride[0], dstStride[0],
1356  srcSliceH, alpha_first, c->opts.src_w);
1357  break;
1358 
1359  default:
1361  "unsupported planar RGB conversion %s -> %s\n",
1362  av_get_pix_fmt_name(c->opts.src_format),
1363  av_get_pix_fmt_name(c->opts.dst_format));
1364  }
1365 
1366  return srcSliceH;
1367 }
1368 
1370  const uint8_t *const src[], const int srcStride[],
1371  int srcSliceY, int srcSliceH,
1372  uint8_t *const dst[], const int dstStride[])
1373 {
1374  ff_copyPlane(src[0], srcStride[0], srcSliceY, srcSliceH, c->opts.src_w,
1375  dst[0], dstStride[0]);
1376  ff_copyPlane(src[1], srcStride[1], srcSliceY, srcSliceH, c->opts.src_w,
1377  dst[1], dstStride[1]);
1378  ff_copyPlane(src[2], srcStride[2], srcSliceY, srcSliceH, c->opts.src_w,
1379  dst[2], dstStride[2]);
1380  if (dst[3])
1381  fillPlane(dst[3], dstStride[3], c->opts.src_w, srcSliceH, srcSliceY, 255);
1382 
1383  return srcSliceH;
1384 }
1385 
1386 static void packedtogbr24p(const uint8_t *src, int srcStride,
1387  uint8_t *const dst[], const int dstStride[], int srcSliceH,
1388  int alpha_first, int inc_size, int width)
1389 {
1390  uint8_t *dest[3];
1391  int x, h;
1392 
1393  dest[0] = dst[0];
1394  dest[1] = dst[1];
1395  dest[2] = dst[2];
1396 
1397  if (alpha_first)
1398  src++;
1399 
1400  for (h = 0; h < srcSliceH; h++) {
1401  for (x = 0; x < width; x++) {
1402  dest[0][x] = src[0];
1403  dest[1][x] = src[1];
1404  dest[2][x] = src[2];
1405 
1406  src += inc_size;
1407  }
1408  src += srcStride - width * inc_size;
1409  dest[0] += dstStride[0];
1410  dest[1] += dstStride[1];
1411  dest[2] += dstStride[2];
1412  }
1413 }
1414 
1415 static int rgbToPlanarRgbWrapper(SwsInternal *c, const uint8_t *const src[],
1416  const int srcStride[], int srcSliceY, int srcSliceH,
1417  uint8_t *const dst[], const int dstStride[])
1418 {
1419  int alpha_first = 0;
1420  int stride102[] = { dstStride[1], dstStride[0], dstStride[2] };
1421  int stride201[] = { dstStride[2], dstStride[0], dstStride[1] };
1422  uint8_t *dst102[] = { dst[1] + srcSliceY * dstStride[1],
1423  dst[0] + srcSliceY * dstStride[0],
1424  dst[2] + srcSliceY * dstStride[2] };
1425  uint8_t *dst201[] = { dst[2] + srcSliceY * dstStride[2],
1426  dst[0] + srcSliceY * dstStride[0],
1427  dst[1] + srcSliceY * dstStride[1] };
1428 
1429  switch (c->opts.src_format) {
1430  case AV_PIX_FMT_RGB24:
1431  packedtogbr24p((const uint8_t *) src[0], srcStride[0], dst201,
1432  stride201, srcSliceH, alpha_first, 3, c->opts.src_w);
1433  break;
1434  case AV_PIX_FMT_BGR24:
1435  packedtogbr24p((const uint8_t *) src[0], srcStride[0], dst102,
1436  stride102, srcSliceH, alpha_first, 3, c->opts.src_w);
1437  break;
1438  case AV_PIX_FMT_ARGB:
1439  alpha_first = 1;
1440  case AV_PIX_FMT_RGBA:
1441  packedtogbr24p((const uint8_t *) src[0], srcStride[0], dst201,
1442  stride201, srcSliceH, alpha_first, 4, c->opts.src_w);
1443  break;
1444  case AV_PIX_FMT_ABGR:
1445  alpha_first = 1;
1446  case AV_PIX_FMT_BGRA:
1447  packedtogbr24p((const uint8_t *) src[0], srcStride[0], dst102,
1448  stride102, srcSliceH, alpha_first, 4, c->opts.src_w);
1449  break;
1450  default:
1452  "unsupported planar RGB conversion %s -> %s\n",
1453  av_get_pix_fmt_name(c->opts.src_format),
1454  av_get_pix_fmt_name(c->opts.dst_format));
1455  }
1456 
1457  return srcSliceH;
1458 }
1459 
1460 static void packed24togbrap(const uint8_t *src, int srcStride,
1461  uint8_t *const dst[], const int dstStride[],
1462  int srcSliceH, int width)
1463 {
1464  uint8_t *dest[4];
1465  int x, h;
1466 
1467  dest[0] = dst[0];
1468  dest[1] = dst[1];
1469  dest[2] = dst[2];
1470  dest[3] = dst[3];
1471 
1472  for (h = 0; h < srcSliceH; h++) {
1473  for (x = 0; x < width; x++) {
1474  dest[0][x] = src[x * 3 + 0];
1475  dest[1][x] = src[x * 3 + 1];
1476  dest[2][x] = src[x * 3 + 2];
1477  dest[3][x] = 0xff;
1478  }
1479  src += srcStride;
1480  dest[0] += dstStride[0];
1481  dest[1] += dstStride[1];
1482  dest[2] += dstStride[2];
1483  dest[3] += dstStride[3];
1484  }
1485 }
1486 
1487 static void packed32togbrap(const uint8_t *src, int srcStride,
1488  uint8_t *const dst[], const int dstStride[],
1489  int srcSliceH, int alpha_first, int width)
1490 {
1491  uint8_t *dest[4];
1492  int x, h;
1493 
1494  dest[0] = dst[0];
1495  dest[1] = dst[1];
1496  dest[2] = dst[2];
1497  dest[3] = dst[3];
1498 
1499  for (h = 0; h < srcSliceH; h++) {
1500  if (alpha_first) {
1501  for (x = 0; x < width; x++) {
1502  dest[0][x] = src[x * 4 + 1];
1503  dest[1][x] = src[x * 4 + 2];
1504  dest[2][x] = src[x * 4 + 3];
1505  dest[3][x] = src[x * 4 + 0];
1506  }
1507  } else {
1508  for (x = 0; x < width; x++) {
1509  dest[0][x] = src[x * 4 + 0];
1510  dest[1][x] = src[x * 4 + 1];
1511  dest[2][x] = src[x * 4 + 2];
1512  dest[3][x] = src[x * 4 + 3];
1513  }
1514  }
1515  src += srcStride;
1516  dest[0] += dstStride[0];
1517  dest[1] += dstStride[1];
1518  dest[2] += dstStride[2];
1519  dest[3] += dstStride[3];
1520  }
1521 }
1522 
1523 static int rgbToPlanarRgbaWrapper(SwsInternal *c, const uint8_t *const src[],
1524  const int srcStride[], int srcSliceY, int srcSliceH,
1525  uint8_t *const dst[], const int dstStride[])
1526 {
1527  int alpha_first = 0;
1528  int stride102[] = { dstStride[1], dstStride[0], dstStride[2], dstStride[3] };
1529  int stride201[] = { dstStride[2], dstStride[0], dstStride[1], dstStride[3] };
1530  uint8_t *dst102[] = { dst[1] + srcSliceY * dstStride[1],
1531  dst[0] + srcSliceY * dstStride[0],
1532  dst[2] + srcSliceY * dstStride[2],
1533  dst[3] + srcSliceY * dstStride[3] };
1534  uint8_t *dst201[] = { dst[2] + srcSliceY * dstStride[2],
1535  dst[0] + srcSliceY * dstStride[0],
1536  dst[1] + srcSliceY * dstStride[1],
1537  dst[3] + srcSliceY * dstStride[3] };
1538 
1539  switch (c->opts.src_format) {
1540  case AV_PIX_FMT_RGB24:
1541  packed24togbrap((const uint8_t *) src[0], srcStride[0], dst201,
1542  stride201, srcSliceH, c->opts.src_w);
1543  break;
1544  case AV_PIX_FMT_BGR24:
1545  packed24togbrap((const uint8_t *) src[0], srcStride[0], dst102,
1546  stride102, srcSliceH, c->opts.src_w);
1547  break;
1548  case AV_PIX_FMT_ARGB:
1549  alpha_first = 1;
1550  case AV_PIX_FMT_RGBA:
1551  packed32togbrap((const uint8_t *) src[0], srcStride[0], dst201,
1552  stride201, srcSliceH, alpha_first, c->opts.src_w);
1553  break;
1554  case AV_PIX_FMT_ABGR:
1555  alpha_first = 1;
1556  case AV_PIX_FMT_BGRA:
1557  packed32togbrap((const uint8_t *) src[0], srcStride[0], dst102,
1558  stride102, srcSliceH, alpha_first, c->opts.src_w);
1559  break;
1560  default:
1562  "unsupported planar RGB conversion %s -> %s\n",
1563  av_get_pix_fmt_name(c->opts.src_format),
1564  av_get_pix_fmt_name(c->opts.dst_format));
1565  }
1566 
1567  return srcSliceH;
1568 }
1569 
1570 #define BAYER_GBRG
1571 #define BAYER_8
1572 #define BAYER_RENAME(x) bayer_gbrg8_to_##x
1573 #include "bayer_template.c"
1574 
1575 #define BAYER_GBRG
1576 #define BAYER_16LE
1577 #define BAYER_RENAME(x) bayer_gbrg16le_to_##x
1578 #include "bayer_template.c"
1579 
1580 #define BAYER_GBRG
1581 #define BAYER_16BE
1582 #define BAYER_RENAME(x) bayer_gbrg16be_to_##x
1583 #include "bayer_template.c"
1584 
1585 #define BAYER_GRBG
1586 #define BAYER_8
1587 #define BAYER_RENAME(x) bayer_grbg8_to_##x
1588 #include "bayer_template.c"
1589 
1590 #define BAYER_GRBG
1591 #define BAYER_16LE
1592 #define BAYER_RENAME(x) bayer_grbg16le_to_##x
1593 #include "bayer_template.c"
1594 
1595 #define BAYER_GRBG
1596 #define BAYER_16BE
1597 #define BAYER_RENAME(x) bayer_grbg16be_to_##x
1598 #include "bayer_template.c"
1599 
1600 #define BAYER_BGGR
1601 #define BAYER_8
1602 #define BAYER_RENAME(x) bayer_bggr8_to_##x
1603 #include "bayer_template.c"
1604 
1605 #define BAYER_BGGR
1606 #define BAYER_16LE
1607 #define BAYER_RENAME(x) bayer_bggr16le_to_##x
1608 #include "bayer_template.c"
1609 
1610 #define BAYER_BGGR
1611 #define BAYER_16BE
1612 #define BAYER_RENAME(x) bayer_bggr16be_to_##x
1613 #include "bayer_template.c"
1614 
1615 #define BAYER_RGGB
1616 #define BAYER_8
1617 #define BAYER_RENAME(x) bayer_rggb8_to_##x
1618 #include "bayer_template.c"
1619 
1620 #define BAYER_RGGB
1621 #define BAYER_16LE
1622 #define BAYER_RENAME(x) bayer_rggb16le_to_##x
1623 #include "bayer_template.c"
1624 
1625 #define BAYER_RGGB
1626 #define BAYER_16BE
1627 #define BAYER_RENAME(x) bayer_rggb16be_to_##x
1628 #include "bayer_template.c"
1629 
1630 static int bayer_to_rgb24_wrapper(SwsInternal *c, const uint8_t *const src[],
1631  const int srcStride[], int srcSliceY, int srcSliceH,
1632  uint8_t *const dst[], const int dstStride[])
1633 {
1634  uint8_t *dstPtr= dst[0] + srcSliceY * dstStride[0];
1635  const uint8_t *srcPtr= src[0];
1636  int i;
1637  void (*copy) (const uint8_t *src, int src_stride, uint8_t *dst, int dst_stride, int width);
1638  void (*interpolate)(const uint8_t *src, int src_stride, uint8_t *dst, int dst_stride, int width);
1639 
1640  switch(c->opts.src_format) {
1641 #define CASE(pixfmt, prefix) \
1642  case pixfmt: copy = bayer_##prefix##_to_rgb24_copy; \
1643  interpolate = bayer_##prefix##_to_rgb24_interpolate; \
1644  break;
1646  CASE(AV_PIX_FMT_BAYER_BGGR16LE, bggr16le)
1647  CASE(AV_PIX_FMT_BAYER_BGGR16BE, bggr16be)
1649  CASE(AV_PIX_FMT_BAYER_RGGB16LE, rggb16le)
1650  CASE(AV_PIX_FMT_BAYER_RGGB16BE, rggb16be)
1652  CASE(AV_PIX_FMT_BAYER_GBRG16LE, gbrg16le)
1653  CASE(AV_PIX_FMT_BAYER_GBRG16BE, gbrg16be)
1655  CASE(AV_PIX_FMT_BAYER_GRBG16LE, grbg16le)
1656  CASE(AV_PIX_FMT_BAYER_GRBG16BE, grbg16be)
1657 #undef CASE
1658  default: return 0;
1659  }
1660 
1661  av_assert0(srcSliceH > 1);
1662 
1663  copy(srcPtr, srcStride[0], dstPtr, dstStride[0], c->opts.src_w);
1664  srcPtr += 2 * srcStride[0];
1665  dstPtr += 2 * dstStride[0];
1666 
1667  for (i = 2; i < srcSliceH - 2; i += 2) {
1668  interpolate(srcPtr, srcStride[0], dstPtr, dstStride[0], c->opts.src_w);
1669  srcPtr += 2 * srcStride[0];
1670  dstPtr += 2 * dstStride[0];
1671  }
1672 
1673  if (i + 1 == srcSliceH) {
1674  copy(srcPtr, -srcStride[0], dstPtr, -dstStride[0], c->opts.src_w);
1675  } else if (i < srcSliceH)
1676  copy(srcPtr, srcStride[0], dstPtr, dstStride[0], c->opts.src_w);
1677  return srcSliceH;
1678 }
1679 
1680 static int bayer_to_rgb48_wrapper(SwsInternal *c, const uint8_t *const src[],
1681  const int srcStride[], int srcSliceY, int srcSliceH,
1682  uint8_t *const dst[], const int dstStride[])
1683 {
1684  uint8_t *dstPtr= dst[0] + srcSliceY * dstStride[0];
1685  const uint8_t *srcPtr= src[0];
1686  int i;
1687  void (*copy) (const uint8_t *src, int src_stride, uint8_t *dst, int dst_stride, int width);
1688  void (*interpolate)(const uint8_t *src, int src_stride, uint8_t *dst, int dst_stride, int width);
1689 
1690  switch(c->opts.src_format) {
1691 #define CASE(pixfmt, prefix) \
1692  case pixfmt: copy = bayer_##prefix##_to_rgb48_copy; \
1693  interpolate = bayer_##prefix##_to_rgb48_interpolate; \
1694  break;
1696  CASE(AV_PIX_FMT_BAYER_BGGR16LE, bggr16le)
1697  CASE(AV_PIX_FMT_BAYER_BGGR16BE, bggr16be)
1699  CASE(AV_PIX_FMT_BAYER_RGGB16LE, rggb16le)
1700  CASE(AV_PIX_FMT_BAYER_RGGB16BE, rggb16be)
1702  CASE(AV_PIX_FMT_BAYER_GBRG16LE, gbrg16le)
1703  CASE(AV_PIX_FMT_BAYER_GBRG16BE, gbrg16be)
1705  CASE(AV_PIX_FMT_BAYER_GRBG16LE, grbg16le)
1706  CASE(AV_PIX_FMT_BAYER_GRBG16BE, grbg16be)
1707 #undef CASE
1708  default: return 0;
1709  }
1710 
1711  av_assert0(srcSliceH > 1);
1712 
1713  copy(srcPtr, srcStride[0], dstPtr, dstStride[0], c->opts.src_w);
1714  srcPtr += 2 * srcStride[0];
1715  dstPtr += 2 * dstStride[0];
1716 
1717  for (i = 2; i < srcSliceH - 2; i += 2) {
1718  interpolate(srcPtr, srcStride[0], dstPtr, dstStride[0], c->opts.src_w);
1719  srcPtr += 2 * srcStride[0];
1720  dstPtr += 2 * dstStride[0];
1721  }
1722 
1723  if (i + 1 == srcSliceH) {
1724  copy(srcPtr, -srcStride[0], dstPtr, -dstStride[0], c->opts.src_w);
1725  } else if (i < srcSliceH)
1726  copy(srcPtr, srcStride[0], dstPtr, dstStride[0], c->opts.src_w);
1727  return srcSliceH;
1728 }
1729 
1730 static int bayer_to_yv12_wrapper(SwsInternal *c, const uint8_t *const src[],
1731  const int srcStride[], int srcSliceY, int srcSliceH,
1732  uint8_t *const dst[], const int dstStride[])
1733 {
1734  const uint8_t *srcPtr= src[0];
1735  uint8_t *dstY= dst[0] + srcSliceY * dstStride[0];
1736  uint8_t *dstU= dst[1] + srcSliceY * dstStride[1] / 2;
1737  uint8_t *dstV= dst[2] + srcSliceY * dstStride[2] / 2;
1738  int i;
1739  void (*copy) (const uint8_t *src, int src_stride, uint8_t *dstY, uint8_t *dstU, uint8_t *dstV, int luma_stride, int width, const int32_t *rgb2yuv);
1740  void (*interpolate)(const uint8_t *src, int src_stride, uint8_t *dstY, uint8_t *dstU, uint8_t *dstV, int luma_stride, int width, const int32_t *rgb2yuv);
1741 
1742  switch(c->opts.src_format) {
1743 #define CASE(pixfmt, prefix) \
1744  case pixfmt: copy = bayer_##prefix##_to_yv12_copy; \
1745  interpolate = bayer_##prefix##_to_yv12_interpolate; \
1746  break;
1748  CASE(AV_PIX_FMT_BAYER_BGGR16LE, bggr16le)
1749  CASE(AV_PIX_FMT_BAYER_BGGR16BE, bggr16be)
1751  CASE(AV_PIX_FMT_BAYER_RGGB16LE, rggb16le)
1752  CASE(AV_PIX_FMT_BAYER_RGGB16BE, rggb16be)
1754  CASE(AV_PIX_FMT_BAYER_GBRG16LE, gbrg16le)
1755  CASE(AV_PIX_FMT_BAYER_GBRG16BE, gbrg16be)
1757  CASE(AV_PIX_FMT_BAYER_GRBG16LE, grbg16le)
1758  CASE(AV_PIX_FMT_BAYER_GRBG16BE, grbg16be)
1759 #undef CASE
1760  default: return 0;
1761  }
1762 
1763  av_assert0(srcSliceH > 1);
1764 
1765  copy(srcPtr, srcStride[0], dstY, dstU, dstV, dstStride[0], c->opts.src_w, c->input_rgb2yuv_table);
1766  srcPtr += 2 * srcStride[0];
1767  dstY += 2 * dstStride[0];
1768  dstU += dstStride[1];
1769  dstV += dstStride[1];
1770 
1771  for (i = 2; i < srcSliceH - 2; i += 2) {
1772  interpolate(srcPtr, srcStride[0], dstY, dstU, dstV, dstStride[0], c->opts.src_w, c->input_rgb2yuv_table);
1773  srcPtr += 2 * srcStride[0];
1774  dstY += 2 * dstStride[0];
1775  dstU += dstStride[1];
1776  dstV += dstStride[1];
1777  }
1778 
1779  if (i + 1 == srcSliceH) {
1780  copy(srcPtr, -srcStride[0], dstY, dstU, dstV, -dstStride[0], c->opts.src_w, c->input_rgb2yuv_table);
1781  } else if (i < srcSliceH)
1782  copy(srcPtr, srcStride[0], dstY, dstU, dstV, dstStride[0], c->opts.src_w, c->input_rgb2yuv_table);
1783  return srcSliceH;
1784 }
1785 
1786 #define isRGBA32(x) ( \
1787  (x) == AV_PIX_FMT_ARGB \
1788  || (x) == AV_PIX_FMT_RGBA \
1789  || (x) == AV_PIX_FMT_BGRA \
1790  || (x) == AV_PIX_FMT_ABGR \
1791  )
1792 
1793 #define isRGBA64(x) ( \
1794  (x) == AV_PIX_FMT_RGBA64LE \
1795  || (x) == AV_PIX_FMT_RGBA64BE \
1796  || (x) == AV_PIX_FMT_BGRA64LE \
1797  || (x) == AV_PIX_FMT_BGRA64BE \
1798  )
1799 
1800 #define isRGB48(x) ( \
1801  (x) == AV_PIX_FMT_RGB48LE \
1802  || (x) == AV_PIX_FMT_RGB48BE \
1803  || (x) == AV_PIX_FMT_BGR48LE \
1804  || (x) == AV_PIX_FMT_BGR48BE \
1805  )
1806 
1807 #define isAYUV(x) ( \
1808  (x) == AV_PIX_FMT_AYUV \
1809  || (x) == AV_PIX_FMT_VUYA \
1810  || (x) == AV_PIX_FMT_VUYX \
1811  || (x) == AV_PIX_FMT_UYVA \
1812  )
1813 
1814 #define isX2RGB(x) ( \
1815  (x) == AV_PIX_FMT_X2RGB10LE \
1816  || (x) == AV_PIX_FMT_X2BGR10LE \
1817  )
1818 
1819 /* {RGB,BGR}{15,16,24,32,32_1} -> {RGB,BGR}{15,16,24,32} */
1820 typedef void (* rgbConvFn) (const uint8_t *, uint8_t *, int);
1822 {
1823  const enum AVPixelFormat srcFormat = c->opts.src_format;
1824  const enum AVPixelFormat dstFormat = c->opts.dst_format;
1825  const int srcId = c->srcFormatBpp;
1826  const int dstId = c->dstFormatBpp;
1827  rgbConvFn conv = NULL;
1828 
1829 #define IS_NOT_NE(bpp, desc) \
1830  (((bpp + 7) >> 3) == 2 && \
1831  (!(desc->flags & AV_PIX_FMT_FLAG_BE) != !HAVE_BIGENDIAN))
1832 
1833 #define CONV_IS(src, dst) (srcFormat == AV_PIX_FMT_##src && dstFormat == AV_PIX_FMT_##dst)
1834 
1835  if (isRGBA32(srcFormat) && isRGBA32(dstFormat)) {
1836  if ( CONV_IS(ABGR, RGBA)
1837  || CONV_IS(ARGB, BGRA)
1838  || CONV_IS(BGRA, ARGB)
1839  || CONV_IS(RGBA, ABGR)) conv = shuffle_bytes_3210;
1840  else if (CONV_IS(ABGR, ARGB)
1841  || CONV_IS(ARGB, ABGR)) conv = shuffle_bytes_0321;
1842  else if (CONV_IS(ABGR, BGRA)
1843  || CONV_IS(ARGB, RGBA)) conv = shuffle_bytes_1230;
1844  else if (CONV_IS(BGRA, RGBA)
1845  || CONV_IS(RGBA, BGRA)) conv = shuffle_bytes_2103;
1846  else if (CONV_IS(BGRA, ABGR)
1847  || CONV_IS(RGBA, ARGB)) conv = shuffle_bytes_3012;
1848  } else if (isRGB48(srcFormat) && isRGB48(dstFormat)) {
1849  if (CONV_IS(RGB48LE, BGR48LE)
1850  || CONV_IS(BGR48LE, RGB48LE)
1851  || CONV_IS(RGB48BE, BGR48BE)
1852  || CONV_IS(BGR48BE, RGB48BE)) conv = rgb48tobgr48_nobswap;
1853  else if (CONV_IS(RGB48LE, BGR48BE)
1854  || CONV_IS(BGR48LE, RGB48BE)
1855  || CONV_IS(RGB48BE, BGR48LE)
1856  || CONV_IS(BGR48BE, RGB48LE)) conv = rgb48tobgr48_bswap;
1857  } else if (isRGB48(srcFormat) && isRGBA64(dstFormat)) {
1858  if (CONV_IS(RGB48LE, BGRA64LE)
1859  || CONV_IS(BGR48LE, RGBA64LE)
1860  || CONV_IS(RGB48BE, BGRA64BE)
1861  || CONV_IS(BGR48BE, RGBA64BE)) conv = rgb48tobgr64_nobswap;
1862  else if (CONV_IS(RGB48LE, BGRA64BE)
1863  || CONV_IS(BGR48LE, RGBA64BE)
1864  || CONV_IS(RGB48BE, BGRA64LE)
1865  || CONV_IS(BGR48BE, RGBA64LE)) conv = rgb48tobgr64_bswap;
1866  if (CONV_IS(RGB48LE, RGBA64LE)
1867  || CONV_IS(BGR48LE, BGRA64LE)
1868  || CONV_IS(RGB48BE, RGBA64BE)
1869  || CONV_IS(BGR48BE, BGRA64BE)) conv = rgb48to64_nobswap;
1870  else if (CONV_IS(RGB48LE, RGBA64BE)
1871  || CONV_IS(BGR48LE, BGRA64BE)
1872  || CONV_IS(RGB48BE, RGBA64LE)
1873  || CONV_IS(BGR48BE, BGRA64LE)) conv = rgb48to64_bswap;
1874  } else if (isRGBA64(srcFormat) && isRGB48(dstFormat)) {
1875  if (CONV_IS(RGBA64LE, BGR48LE)
1876  || CONV_IS(BGRA64LE, RGB48LE)
1877  || CONV_IS(RGBA64BE, BGR48BE)
1878  || CONV_IS(BGRA64BE, RGB48BE)) conv = rgb64tobgr48_nobswap;
1879  else if (CONV_IS(RGBA64LE, BGR48BE)
1880  || CONV_IS(BGRA64LE, RGB48BE)
1881  || CONV_IS(RGBA64BE, BGR48LE)
1882  || CONV_IS(BGRA64BE, RGB48LE)) conv = rgb64tobgr48_bswap;
1883  else if (CONV_IS(RGBA64LE, RGB48LE)
1884  || CONV_IS(BGRA64LE, BGR48LE)
1885  || CONV_IS(RGBA64BE, RGB48BE)
1886  || CONV_IS(BGRA64BE, BGR48BE)) conv = rgb64to48_nobswap;
1887  else if (CONV_IS(RGBA64LE, RGB48BE)
1888  || CONV_IS(BGRA64LE, BGR48BE)
1889  || CONV_IS(RGBA64BE, RGB48LE)
1890  || CONV_IS(BGRA64BE, BGR48LE)) conv = rgb64to48_bswap;
1891  } else if (isX2RGB(srcFormat) && isRGB48(dstFormat)) {
1892  if (CONV_IS(X2RGB10LE, RGB48LE)
1893  || CONV_IS(X2BGR10LE, BGR48LE)) conv = HAVE_BIGENDIAN ? x2rgb10to48_bswap
1895  else if (CONV_IS(X2RGB10LE, RGB48BE)
1896  || CONV_IS(X2BGR10LE, BGR48BE)) conv = HAVE_BIGENDIAN ? x2rgb10to48_nobswap
1898  else if (CONV_IS(X2RGB10LE, BGR48LE)
1899  || CONV_IS(X2BGR10LE, RGB48LE)) conv = HAVE_BIGENDIAN ? x2rgb10tobgr48_bswap
1901  else if (CONV_IS(X2RGB10LE, BGR48BE)
1902  || CONV_IS(X2BGR10LE, RGB48BE)) conv = HAVE_BIGENDIAN ? x2rgb10tobgr48_nobswap
1904  else if (CONV_IS(X2RGB10LE, RGBA64LE)
1905  || CONV_IS(X2BGR10LE, BGRA64LE)) conv = HAVE_BIGENDIAN ? x2rgb10to64_bswap
1907  else if (CONV_IS(X2RGB10LE, RGBA64BE)
1908  || CONV_IS(X2BGR10LE, BGRA64BE)) conv = HAVE_BIGENDIAN ? x2rgb10to64_nobswap
1910  else if (CONV_IS(X2RGB10LE, BGRA64LE)
1911  || CONV_IS(X2BGR10LE, RGBA64LE)) conv = HAVE_BIGENDIAN ? x2rgb10tobgr64_bswap
1913  else if (CONV_IS(X2RGB10LE, BGRA64BE)
1914  || CONV_IS(X2BGR10LE, RGBA64BE)) conv = HAVE_BIGENDIAN ? x2rgb10tobgr64_nobswap
1916  } else if (isAYUV(srcFormat) && isAYUV(dstFormat)) {
1917  /* VUYX only for dst, to avoid copying undefined bytes */
1918  if ( CONV_IS(AYUV, VUYA)
1919  || CONV_IS(AYUV, VUYX)
1920  || CONV_IS(VUYA, AYUV)) conv = shuffle_bytes_3210;
1921  else if (CONV_IS(AYUV, UYVA)) conv = shuffle_bytes_2130;
1922  else if (CONV_IS(VUYA, UYVA)) conv = shuffle_bytes_1203;
1923  else if (CONV_IS(UYVA, AYUV)) conv = shuffle_bytes_3102;
1924  else if (CONV_IS(UYVA, VUYA)
1925  || CONV_IS(UYVA, VUYX)) conv = shuffle_bytes_2013;
1926  } else
1927  /* BGR -> BGR */
1928  if ((isBGRinInt(srcFormat) && isBGRinInt(dstFormat)) ||
1929  (isRGBinInt(srcFormat) && isRGBinInt(dstFormat))) {
1930  switch (srcId | (dstId << 16)) {
1931  case 0x000F000C: conv = rgb12to15; break;
1932  case 0x000F0010: conv = rgb16to15; break;
1933  case 0x000F0018: conv = rgb24to15; break;
1934  case 0x000F0020: conv = rgb32to15; break;
1935  case 0x0010000F: conv = rgb15to16; break;
1936  case 0x00100018: conv = rgb24to16; break;
1937  case 0x00100020: conv = rgb32to16; break;
1938  case 0x0018000F: conv = rgb15to24; break;
1939  case 0x00180010: conv = rgb16to24; break;
1940  case 0x00180020: conv = rgb32to24; break;
1941  case 0x0020000F: conv = rgb15to32; break;
1942  case 0x00200010: conv = rgb16to32; break;
1943  case 0x00200018: conv = rgb24to32; break;
1944  }
1945  } else if ((isBGRinInt(srcFormat) && isRGBinInt(dstFormat)) ||
1946  (isRGBinInt(srcFormat) && isBGRinInt(dstFormat))) {
1947  switch (srcId | (dstId << 16)) {
1948  case 0x000C000C: conv = rgb12tobgr12; break;
1949  case 0x000F000F: conv = rgb15tobgr15; break;
1950  case 0x000F0010: conv = rgb16tobgr15; break;
1951  case 0x000F0018: conv = rgb24tobgr15; break;
1952  case 0x000F0020: conv = rgb32tobgr15; break;
1953  case 0x0010000F: conv = rgb15tobgr16; break;
1954  case 0x00100010: conv = rgb16tobgr16; break;
1955  case 0x00100018: conv = rgb24tobgr16; break;
1956  case 0x00100020: conv = rgb32tobgr16; break;
1957  case 0x0018000F: conv = rgb15tobgr24; break;
1958  case 0x00180010: conv = rgb16tobgr24; break;
1959  case 0x00180018: conv = rgb24tobgr24; break;
1960  case 0x00180020: conv = rgb32tobgr24; break;
1961  case 0x0020000F: conv = rgb15tobgr32; break;
1962  case 0x00200010: conv = rgb16tobgr32; break;
1963  case 0x00200018: conv = rgb24tobgr32; break;
1964  }
1965  }
1966 
1967  if ((dstFormat == AV_PIX_FMT_RGB32_1 || dstFormat == AV_PIX_FMT_BGR32_1) && !isRGBA32(srcFormat) && ALT32_CORR<0)
1968  return NULL;
1969 
1970  // Maintain symmetry between endianness
1971  if (c->opts.flags & SWS_BITEXACT)
1972  if ((dstFormat == AV_PIX_FMT_RGB32 || dstFormat == AV_PIX_FMT_BGR32 ) && !isRGBA32(srcFormat) && ALT32_CORR>0)
1973  return NULL;
1974 
1975  return conv;
1976 }
1977 
1978 /* {RGB,BGR}{15,16,24,32,32_1} -> {RGB,BGR}{15,16,24,32} */
1979 static int rgbToRgbWrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[],
1980  int srcSliceY, int srcSliceH, uint8_t *const dst[],
1981  const int dstStride[])
1982 
1983 {
1984  const enum AVPixelFormat srcFormat = c->opts.src_format;
1985  const enum AVPixelFormat dstFormat = c->opts.dst_format;
1986  const AVPixFmtDescriptor *desc_src = av_pix_fmt_desc_get(c->opts.src_format);
1987  const AVPixFmtDescriptor *desc_dst = av_pix_fmt_desc_get(c->opts.dst_format);
1988  const int srcBpp = (c->srcFormatBpp + 7) >> 3;
1989  const int dstBpp = (c->dstFormatBpp + 7) >> 3;
1991 
1992  if (!conv) {
1993  av_log(c, AV_LOG_ERROR, "internal error %s -> %s converter\n",
1994  av_get_pix_fmt_name(srcFormat), av_get_pix_fmt_name(dstFormat));
1995  } else {
1996  const uint8_t *srcPtr = src[0];
1997  uint8_t *dstPtr = dst[0];
1998  int src_bswap = IS_NOT_NE(c->srcFormatBpp, desc_src);
1999  int dst_bswap = IS_NOT_NE(c->dstFormatBpp, desc_dst);
2000 
2001  if ((srcFormat == AV_PIX_FMT_RGB32_1 || srcFormat == AV_PIX_FMT_BGR32_1) &&
2002  !isRGBA32(dstFormat))
2003  srcPtr += ALT32_CORR;
2004 
2005  if ((dstFormat == AV_PIX_FMT_RGB32_1 || dstFormat == AV_PIX_FMT_BGR32_1) &&
2006  !isRGBA32(srcFormat)) {
2007  int i;
2008  av_assert0(ALT32_CORR == 1);
2009  for (i = 0; i < srcSliceH; i++)
2010  dstPtr[dstStride[0] * (srcSliceY + i)] = 255;
2011  dstPtr += ALT32_CORR;
2012  }
2013 
2014  if (dstStride[0] * srcBpp == srcStride[0] * dstBpp && srcStride[0] > 0 &&
2015  !(srcStride[0] % srcBpp) && !dst_bswap && !src_bswap)
2016  conv(srcPtr, dstPtr + dstStride[0] * srcSliceY,
2017  (srcSliceH - 1) * srcStride[0] + c->opts.src_w * srcBpp);
2018  else {
2019  int i, j;
2020  dstPtr += dstStride[0] * srcSliceY;
2021 
2022  for (i = 0; i < srcSliceH; i++) {
2023  if(src_bswap) {
2024  for(j=0; j<c->opts.src_w; j++)
2025  ((uint16_t*)c->formatConvBuffer)[j] = av_bswap16(((uint16_t*)srcPtr)[j]);
2026  conv(c->formatConvBuffer, dstPtr, c->opts.src_w * srcBpp);
2027  }else
2028  conv(srcPtr, dstPtr, c->opts.src_w * srcBpp);
2029  if(dst_bswap)
2030  for(j=0; j<c->opts.src_w; j++)
2031  ((uint16_t*)dstPtr)[j] = av_bswap16(((uint16_t*)dstPtr)[j]);
2032  srcPtr += srcStride[0];
2033  dstPtr += dstStride[0];
2034  }
2035  }
2036  }
2037  return srcSliceH;
2038 }
2039 
2040 static int bgr24ToYv12Wrapper(SwsInternal *c, const uint8_t *const src[],
2041  const int srcStride[], int srcSliceY, int srcSliceH,
2042  uint8_t *const dst[], const int dstStride[])
2043 {
2045  src[0],
2046  dst[0] + srcSliceY * dstStride[0],
2047  dst[1] + (srcSliceY >> 1) * dstStride[1],
2048  dst[2] + (srcSliceY >> 1) * dstStride[2],
2049  c->opts.src_w, srcSliceH,
2050  dstStride[0], dstStride[1], srcStride[0],
2051  c->input_rgb2yuv_table);
2052  if (dst[3])
2053  fillPlane(dst[3], dstStride[3], c->opts.src_w, srcSliceH, srcSliceY, 255);
2054  return srcSliceH;
2055 }
2056 
2057 static int yvu9ToYv12Wrapper(SwsInternal *c, const uint8_t *const src[],
2058  const int srcStride[], int srcSliceY, int srcSliceH,
2059  uint8_t *const dst[], const int dstStride[])
2060 {
2061  ff_copyPlane(src[0], srcStride[0], srcSliceY, srcSliceH, c->opts.src_w,
2062  dst[0], dstStride[0]);
2063 
2064  planar2x(src[1], dst[1] + dstStride[1] * (srcSliceY >> 1), c->chrSrcW,
2065  srcSliceH >> 2, srcStride[1], dstStride[1]);
2066  planar2x(src[2], dst[2] + dstStride[2] * (srcSliceY >> 1), c->chrSrcW,
2067  srcSliceH >> 2, srcStride[2], dstStride[2]);
2068  if (dst[3])
2069  fillPlane(dst[3], dstStride[3], c->opts.src_w, srcSliceH, srcSliceY, 255);
2070  return srcSliceH;
2071 }
2072 
2073 static int uint_y_to_float_y_wrapper(SwsInternal *c, const uint8_t *const src[],
2074  const int srcStride[], int srcSliceY,
2075  int srcSliceH, uint8_t *const dst[], const int dstStride[])
2076 {
2077  int y, x;
2078  ptrdiff_t dstStrideFloat = dstStride[0] >> 2;
2079  const uint8_t *srcPtr = src[0];
2080  float *dstPtr = (float *)(dst[0] + dstStride[0] * srcSliceY);
2081 
2082  for (y = 0; y < srcSliceH; ++y){
2083  for (x = 0; x < c->opts.src_w; ++x){
2084  dstPtr[x] = c->uint2float_lut[srcPtr[x]];
2085  }
2086  srcPtr += srcStride[0];
2087  dstPtr += dstStrideFloat;
2088  }
2089 
2090  return srcSliceH;
2091 }
2092 
2094  const uint8_t *const src[],
2095  const int srcStride[], int srcSliceY,
2096  int srcSliceH, uint8_t *const dst[],
2097  const int dstStride[])
2098 {
2099  int y, x;
2100  ptrdiff_t srcStrideFloat = srcStride[0] >> 2;
2101  const float *srcPtr = (const float *)src[0];
2102  uint8_t *dstPtr = dst[0] + dstStride[0] * srcSliceY;
2103 
2104  for (y = 0; y < srcSliceH; ++y){
2105  for (x = 0; x < c->opts.src_w; ++x){
2106  dstPtr[x] = av_clip_uint8(lrintf(255.0f * srcPtr[x]));
2107  }
2108  srcPtr += srcStrideFloat;
2109  dstPtr += dstStride[0];
2110  }
2111 
2112  return srcSliceH;
2113 }
2114 
2115 /* unscaled copy like stuff (assumes nearly identical formats) */
2116 static int packedCopyWrapper(SwsInternal *c, const uint8_t *const src[],
2117  const int srcStride[], int srcSliceY, int srcSliceH,
2118  uint8_t *const dst[], const int dstStride[])
2119 {
2120  if (dstStride[0] == srcStride[0] && srcStride[0] > 0)
2121  memcpy(dst[0] + dstStride[0] * srcSliceY, src[0], srcSliceH * dstStride[0]);
2122  else {
2123  int i;
2124  const uint8_t *srcPtr = src[0];
2125  uint8_t *dstPtr = dst[0] + dstStride[0] * srcSliceY;
2126  int length = 0;
2127 
2128  /* universal length finder */
2129  while (length + c->opts.src_w <= FFABS(dstStride[0]) &&
2130  length + c->opts.src_w <= FFABS(srcStride[0]))
2131  length += c->opts.src_w;
2132  av_assert1(length != 0);
2133 
2134  for (i = 0; i < srcSliceH; i++) {
2135  memcpy(dstPtr, srcPtr, length);
2136  srcPtr += srcStride[0];
2137  dstPtr += dstStride[0];
2138  }
2139  }
2140  return srcSliceH;
2141 }
2142 
2143 #define DITHER_COPY(dst, dstStride, src, srcStride, bswap, dbswap)\
2144  unsigned shift= src_depth-dst_depth, tmp;\
2145  unsigned bias = 1 << (shift - 1);\
2146  if (c->opts.dither == SWS_DITHER_NONE) {\
2147  for (i = 0; i < height; i++) {\
2148  for (j = 0; j < length-7; j+=8) {\
2149  tmp = (bswap(src[j+0]) + bias)>>shift; dst[j+0] = dbswap(tmp - (tmp>>dst_depth));\
2150  tmp = (bswap(src[j+1]) + bias)>>shift; dst[j+1] = dbswap(tmp - (tmp>>dst_depth));\
2151  tmp = (bswap(src[j+2]) + bias)>>shift; dst[j+2] = dbswap(tmp - (tmp>>dst_depth));\
2152  tmp = (bswap(src[j+3]) + bias)>>shift; dst[j+3] = dbswap(tmp - (tmp>>dst_depth));\
2153  tmp = (bswap(src[j+4]) + bias)>>shift; dst[j+4] = dbswap(tmp - (tmp>>dst_depth));\
2154  tmp = (bswap(src[j+5]) + bias)>>shift; dst[j+5] = dbswap(tmp - (tmp>>dst_depth));\
2155  tmp = (bswap(src[j+6]) + bias)>>shift; dst[j+6] = dbswap(tmp - (tmp>>dst_depth));\
2156  tmp = (bswap(src[j+7]) + bias)>>shift; dst[j+7] = dbswap(tmp - (tmp>>dst_depth));\
2157  }\
2158  for (; j < length; j++) {\
2159  tmp = (bswap(src[j]) + bias)>>shift; dst[j] = dbswap(tmp - (tmp>>dst_depth));\
2160  }\
2161  dst += dstStride;\
2162  src += srcStride;\
2163  }\
2164  } else if (shiftonly) {\
2165  for (i = 0; i < height; i++) {\
2166  const uint8_t *dither= dithers[shift-1][i&7];\
2167  for (j = 0; j < length-7; j+=8) {\
2168  tmp = (bswap(src[j+0]) + dither[0])>>shift; dst[j+0] = dbswap(tmp - (tmp>>dst_depth));\
2169  tmp = (bswap(src[j+1]) + dither[1])>>shift; dst[j+1] = dbswap(tmp - (tmp>>dst_depth));\
2170  tmp = (bswap(src[j+2]) + dither[2])>>shift; dst[j+2] = dbswap(tmp - (tmp>>dst_depth));\
2171  tmp = (bswap(src[j+3]) + dither[3])>>shift; dst[j+3] = dbswap(tmp - (tmp>>dst_depth));\
2172  tmp = (bswap(src[j+4]) + dither[4])>>shift; dst[j+4] = dbswap(tmp - (tmp>>dst_depth));\
2173  tmp = (bswap(src[j+5]) + dither[5])>>shift; dst[j+5] = dbswap(tmp - (tmp>>dst_depth));\
2174  tmp = (bswap(src[j+6]) + dither[6])>>shift; dst[j+6] = dbswap(tmp - (tmp>>dst_depth));\
2175  tmp = (bswap(src[j+7]) + dither[7])>>shift; dst[j+7] = dbswap(tmp - (tmp>>dst_depth));\
2176  }\
2177  for (; j < length; j++) {\
2178  tmp = (bswap(src[j]) + dither[j&7])>>shift; dst[j] = dbswap(tmp - (tmp>>dst_depth));\
2179  }\
2180  dst += dstStride;\
2181  src += srcStride;\
2182  }\
2183  } else {\
2184  for (i = 0; i < height; i++) {\
2185  const uint8_t *dither= dithers[shift-1][i&7];\
2186  for (j = 0; j < length-7; j+=8) {\
2187  tmp = bswap(src[j+0]); dst[j+0] = dbswap((tmp - (tmp>>dst_depth) + dither[0])>>shift);\
2188  tmp = bswap(src[j+1]); dst[j+1] = dbswap((tmp - (tmp>>dst_depth) + dither[1])>>shift);\
2189  tmp = bswap(src[j+2]); dst[j+2] = dbswap((tmp - (tmp>>dst_depth) + dither[2])>>shift);\
2190  tmp = bswap(src[j+3]); dst[j+3] = dbswap((tmp - (tmp>>dst_depth) + dither[3])>>shift);\
2191  tmp = bswap(src[j+4]); dst[j+4] = dbswap((tmp - (tmp>>dst_depth) + dither[4])>>shift);\
2192  tmp = bswap(src[j+5]); dst[j+5] = dbswap((tmp - (tmp>>dst_depth) + dither[5])>>shift);\
2193  tmp = bswap(src[j+6]); dst[j+6] = dbswap((tmp - (tmp>>dst_depth) + dither[6])>>shift);\
2194  tmp = bswap(src[j+7]); dst[j+7] = dbswap((tmp - (tmp>>dst_depth) + dither[7])>>shift);\
2195  }\
2196  for (; j < length; j++) {\
2197  tmp = bswap(src[j]); dst[j] = dbswap((tmp - (tmp>>dst_depth) + dither[j&7])>>shift);\
2198  }\
2199  dst += dstStride;\
2200  src += srcStride;\
2201  }\
2202  }
2203 
2204 static int planarCopyWrapper(SwsInternal *c, const uint8_t *const src[],
2205  const int srcStride[], int srcSliceY, int srcSliceH,
2206  uint8_t *const dst[], const int dstStride[])
2207 {
2208  const AVPixFmtDescriptor *desc_src = av_pix_fmt_desc_get(c->opts.src_format);
2209  const AVPixFmtDescriptor *desc_dst = av_pix_fmt_desc_get(c->opts.dst_format);
2210  int plane, i, j;
2211  for (plane = 0; plane < 4 && dst[plane] != NULL; plane++) {
2212  int length = (plane == 0 || plane == 3) ? c->opts.src_w : AV_CEIL_RSHIFT(c->opts.src_w, c->chrDstHSubSample);
2213  int y = (plane == 0 || plane == 3) ? srcSliceY: AV_CEIL_RSHIFT(srcSliceY, c->chrDstVSubSample);
2214  int height = (plane == 0 || plane == 3) ? srcSliceH: AV_CEIL_RSHIFT(srcSliceH, c->chrDstVSubSample);
2215  const uint8_t *srcPtr = src[plane];
2216  uint8_t *dstPtr = dst[plane] + dstStride[plane] * y;
2217  int shiftonly = plane == 1 || plane == 2 || (!c->opts.src_range && plane == 0);
2218  if (plane == 1 && isSemiPlanarYUV(c->opts.dst_format))
2219  length *= 2;
2220 
2221  // ignore palette for GRAY8
2222  if (plane == 1 && desc_dst->nb_components < 3) continue;
2223  if (!src[plane] || (plane == 1 && desc_src->nb_components < 3)) {
2224  if (is16BPS(c->opts.dst_format) || isNBPS(c->opts.dst_format)) {
2225  fillPlane16(dst[plane], dstStride[plane], length, height, y,
2226  plane == 3, desc_dst->comp[plane].depth,
2227  isBE(c->opts.dst_format));
2228  } else {
2229  fillPlane(dst[plane], dstStride[plane], length, height, y,
2230  (plane == 3) ? 255 : 128);
2231  }
2232  } else {
2233  if(isNBPS(c->opts.src_format) || isNBPS(c->opts.dst_format)
2234  || (is16BPS(c->opts.src_format) != is16BPS(c->opts.dst_format))
2235  ) {
2236  const int src_depth = desc_src->comp[plane].depth;
2237  const int dst_depth = desc_dst->comp[plane].depth;
2238  const uint16_t *srcPtr2 = (const uint16_t *) srcPtr;
2239  uint16_t *dstPtr2 = (uint16_t*)dstPtr;
2240 
2241  if (dst_depth == 8) {
2242  av_assert1(src_depth > 8);
2243  if(isBE(c->opts.src_format) == HAVE_BIGENDIAN){
2244  DITHER_COPY(dstPtr, dstStride[plane], srcPtr2, srcStride[plane]/2, , )
2245  } else {
2246  DITHER_COPY(dstPtr, dstStride[plane], srcPtr2, srcStride[plane]/2, av_bswap16, )
2247  }
2248  } else if (src_depth == 8) {
2249  for (i = 0; i < height; i++) {
2250  #define COPY816(w)\
2251  if (shiftonly) {\
2252  for (j = 0; j < length; j++)\
2253  w(&dstPtr2[j], srcPtr[j]<<(dst_depth-8));\
2254  } else {\
2255  for (j = 0; j < length; j++)\
2256  w(&dstPtr2[j], (srcPtr[j]<<(dst_depth-8)) |\
2257  (srcPtr[j]>>(2*8-dst_depth)));\
2258  }
2259  if(isBE(c->opts.dst_format)){
2260  COPY816(AV_WB16)
2261  } else {
2262  COPY816(AV_WL16)
2263  }
2264  dstPtr2 += dstStride[plane]/2;
2265  srcPtr += srcStride[plane];
2266  }
2267  } else if (src_depth <= dst_depth) {
2268  for (i = 0; i < height; i++) {
2269  j = 0;
2270  if(isBE(c->opts.src_format) == HAVE_BIGENDIAN &&
2271  isBE(c->opts.dst_format) == HAVE_BIGENDIAN &&
2272  shiftonly) {
2273  unsigned shift = dst_depth - src_depth;
2274 #if HAVE_FAST_64BIT
2275 #define FAST_COPY_UP(shift) \
2276  for (; j < length - 3; j += 4) { \
2277  uint64_t v = AV_RN64A(srcPtr2 + j); \
2278  AV_WN64A(dstPtr2 + j, v << shift); \
2279  }
2280 #else
2281 #define FAST_COPY_UP(shift) \
2282  for (; j < length - 1; j += 2) { \
2283  uint32_t v = AV_RN32A(srcPtr2 + j); \
2284  AV_WN32A(dstPtr2 + j, v << shift); \
2285  }
2286 #endif
2287  switch (shift)
2288  {
2289  case 6: FAST_COPY_UP(6); break;
2290  case 7: FAST_COPY_UP(7); break;
2291  }
2292  }
2293 #define COPY_UP(r,w) \
2294  if(shiftonly){\
2295  for (; j < length; j++){ \
2296  unsigned int v= r(&srcPtr2[j]);\
2297  w(&dstPtr2[j], v<<(dst_depth-src_depth));\
2298  }\
2299  }else{\
2300  for (; j < length; j++){ \
2301  unsigned int v= r(&srcPtr2[j]);\
2302  w(&dstPtr2[j], (v<<(dst_depth-src_depth)) | \
2303  (v>>(2*src_depth-dst_depth)));\
2304  }\
2305  }
2306  if(isBE(c->opts.src_format)){
2307  if(isBE(c->opts.dst_format)){
2309  } else {
2311  }
2312  } else {
2313  if(isBE(c->opts.dst_format)){
2315  } else {
2317  }
2318  }
2319  dstPtr2 += dstStride[plane]/2;
2320  srcPtr2 += srcStride[plane]/2;
2321  }
2322  } else { /* src_depth > dst_depth */
2323  if(isBE(c->opts.src_format) == HAVE_BIGENDIAN){
2324  if(isBE(c->opts.dst_format) == HAVE_BIGENDIAN){
2325  DITHER_COPY(dstPtr2, dstStride[plane]/2, srcPtr2, srcStride[plane]/2, , )
2326  } else {
2327  DITHER_COPY(dstPtr2, dstStride[plane]/2, srcPtr2, srcStride[plane]/2, , av_bswap16)
2328  }
2329  }else{
2330  if(isBE(c->opts.dst_format) == HAVE_BIGENDIAN){
2331  DITHER_COPY(dstPtr2, dstStride[plane]/2, srcPtr2, srcStride[plane]/2, av_bswap16, )
2332  } else {
2333  DITHER_COPY(dstPtr2, dstStride[plane]/2, srcPtr2, srcStride[plane]/2, av_bswap16, av_bswap16)
2334  }
2335  }
2336  }
2337  } else if (is16BPS(c->opts.src_format) && is16BPS(c->opts.dst_format) &&
2338  isBE(c->opts.src_format) != isBE(c->opts.dst_format)) {
2339 
2340  for (i = 0; i < height; i++) {
2341  for (j = 0; j < length; j++)
2342  ((uint16_t *) dstPtr)[j] = av_bswap16(((const uint16_t *) srcPtr)[j]);
2343  srcPtr += srcStride[plane];
2344  dstPtr += dstStride[plane];
2345  }
2346  } else if (isFloat(c->opts.src_format) && isFloat(c->opts.dst_format) &&
2347  isBE(c->opts.src_format) != isBE(c->opts.dst_format)) { /* swap float plane */
2348  for (i = 0; i < height; i++) {
2349  for (j = 0; j < length; j++)
2350  ((uint32_t *) dstPtr)[j] = av_bswap32(((const uint32_t *) srcPtr)[j]);
2351  srcPtr += srcStride[plane];
2352  dstPtr += dstStride[plane];
2353  }
2354  } else if (dstStride[plane] == srcStride[plane] &&
2355  srcStride[plane] > 0 && srcStride[plane] == length) {
2356  memcpy(dst[plane] + dstStride[plane] * y, src[plane],
2357  height * dstStride[plane]);
2358  } else {
2359  if (is16BPS(c->opts.src_format) && is16BPS(c->opts.dst_format))
2360  length *= 2;
2361  else if (desc_src->comp[0].depth == 1)
2362  length >>= 3; // monowhite/black
2363  for (i = 0; i < height; i++) {
2364  memcpy(dstPtr, srcPtr, length);
2365  srcPtr += srcStride[plane];
2366  dstPtr += dstStride[plane];
2367  }
2368  }
2369  }
2370  }
2371  return srcSliceH;
2372 }
2373 
2374 
2375 #define IS_DIFFERENT_ENDIANESS(src_fmt, dst_fmt, pix_fmt) \
2376  ((src_fmt == pix_fmt ## BE && dst_fmt == pix_fmt ## LE) || \
2377  (src_fmt == pix_fmt ## LE && dst_fmt == pix_fmt ## BE))
2378 
2379 
2381 {
2382  const enum AVPixelFormat srcFormat = c->opts.src_format;
2383  const enum AVPixelFormat dstFormat = c->opts.dst_format;
2384  const int flags = c->opts.flags;
2385  const int dstH = c->opts.dst_h;
2386  const int dstW = c->opts.dst_w;
2387  int needsDither;
2388 
2389  needsDither = isAnyRGB(dstFormat) &&
2390  c->dstFormatBpp < 24 &&
2391  (c->dstFormatBpp < c->srcFormatBpp || (!isAnyRGB(srcFormat)));
2392 
2393  /* yv12_to_nv12 */
2394  if ((srcFormat == AV_PIX_FMT_YUV420P || srcFormat == AV_PIX_FMT_YUVA420P) &&
2395  (dstFormat == AV_PIX_FMT_NV12 || dstFormat == AV_PIX_FMT_NV21)) {
2396  c->convert_unscaled = planarToNv12Wrapper;
2397  }
2398  /* yv24_to_nv24 */
2399  if ((srcFormat == AV_PIX_FMT_YUV444P || srcFormat == AV_PIX_FMT_YUVA444P) &&
2400  (dstFormat == AV_PIX_FMT_NV24 || dstFormat == AV_PIX_FMT_NV42)) {
2401  c->convert_unscaled = planarToNv24Wrapper;
2402  }
2403  /* nv12_to_yv12 */
2404  if (dstFormat == AV_PIX_FMT_YUV420P &&
2405  (srcFormat == AV_PIX_FMT_NV12 || srcFormat == AV_PIX_FMT_NV21)) {
2406  c->convert_unscaled = nv12ToPlanarWrapper;
2407  }
2408  /* nv24_to_yv24 */
2409  if (dstFormat == AV_PIX_FMT_YUV444P &&
2410  (srcFormat == AV_PIX_FMT_NV24 || srcFormat == AV_PIX_FMT_NV42)) {
2411  c->convert_unscaled = nv24ToPlanarWrapper;
2412  }
2413  /* yuv2bgr */
2414  if ((srcFormat == AV_PIX_FMT_YUV420P || srcFormat == AV_PIX_FMT_YUV422P ||
2415  srcFormat == AV_PIX_FMT_YUVA420P) && isAnyRGB(dstFormat) &&
2416  !(flags & SWS_ACCURATE_RND) && (c->opts.dither == SWS_DITHER_BAYER || c->opts.dither == SWS_DITHER_AUTO) && !(dstH & 1)) {
2417  c->convert_unscaled = ff_yuv2rgb_get_func_ptr(c);
2418  c->dst_slice_align = 2;
2419  }
2420  /* yuv420p1x_to_p01x */
2421  if ((srcFormat == AV_PIX_FMT_YUV420P10 || srcFormat == AV_PIX_FMT_YUVA420P10 ||
2422  srcFormat == AV_PIX_FMT_YUV420P12 ||
2423  srcFormat == AV_PIX_FMT_YUV420P14 ||
2424  srcFormat == AV_PIX_FMT_YUV420P16 || srcFormat == AV_PIX_FMT_YUVA420P16) &&
2425  (dstFormat == AV_PIX_FMT_P010 || dstFormat == AV_PIX_FMT_P016)) {
2426  c->convert_unscaled = planarToP01xWrapper;
2427  }
2428  /* yuv420p_to_p01xle */
2429  if ((srcFormat == AV_PIX_FMT_YUV420P || srcFormat == AV_PIX_FMT_YUVA420P) &&
2430  (dstFormat == AV_PIX_FMT_P010LE || dstFormat == AV_PIX_FMT_P016LE)) {
2431  c->convert_unscaled = planar8ToP01xleWrapper;
2432  }
2433 
2434  if (srcFormat == AV_PIX_FMT_YUV410P && !(dstH & 3) &&
2435  (dstFormat == AV_PIX_FMT_YUV420P || dstFormat == AV_PIX_FMT_YUVA420P) &&
2436  !(flags & SWS_BITEXACT)) {
2437  c->convert_unscaled = yvu9ToYv12Wrapper;
2438  c->dst_slice_align = 4;
2439  }
2440 
2441  /* bgr24toYV12 */
2442  if (srcFormat == AV_PIX_FMT_BGR24 &&
2443  (dstFormat == AV_PIX_FMT_YUV420P || dstFormat == AV_PIX_FMT_YUVA420P) &&
2444  !(flags & SWS_ACCURATE_RND) && !(dstW&1))
2445  c->convert_unscaled = bgr24ToYv12Wrapper;
2446 
2447  /* AYUV/VUYA/UYVA -> AYUV/VUYA/UYVA */
2448  if (isAYUV(srcFormat) && isAYUV(dstFormat) && findRgbConvFn(c))
2449  c->convert_unscaled = rgbToRgbWrapper;
2450 
2451  /* RGB/BGR -> RGB/BGR (no dither needed forms) */
2452  if (isAnyRGB(srcFormat) && isAnyRGB(dstFormat) && findRgbConvFn(c)
2453  && (!needsDither || (c->opts.flags&(SWS_FAST_BILINEAR|SWS_POINT))))
2454  c->convert_unscaled = rgbToRgbWrapper;
2455 
2456  /* RGB to planar RGB */
2457  if ((srcFormat == AV_PIX_FMT_GBRP && dstFormat == AV_PIX_FMT_GBRAP) ||
2458  (srcFormat == AV_PIX_FMT_GBRP10 && dstFormat == AV_PIX_FMT_GBRAP10) ||
2459  (srcFormat == AV_PIX_FMT_GBRP12 && dstFormat == AV_PIX_FMT_GBRAP12) ||
2460  (srcFormat == AV_PIX_FMT_GBRP14 && dstFormat == AV_PIX_FMT_GBRAP14) ||
2461  (srcFormat == AV_PIX_FMT_GBRP16 && dstFormat == AV_PIX_FMT_GBRAP16) ||
2462  (srcFormat == AV_PIX_FMT_GBRAP && dstFormat == AV_PIX_FMT_GBRP) ||
2463  (srcFormat == AV_PIX_FMT_GBRAP10 && dstFormat == AV_PIX_FMT_GBRP10) ||
2464  (srcFormat == AV_PIX_FMT_GBRAP12 && dstFormat == AV_PIX_FMT_GBRP12) ||
2465  (srcFormat == AV_PIX_FMT_GBRAP14 && dstFormat == AV_PIX_FMT_GBRP14) ||
2466  (srcFormat == AV_PIX_FMT_GBRAP16 && dstFormat == AV_PIX_FMT_GBRP16))
2467  c->convert_unscaled = planarRgbToplanarRgbWrapper;
2468 
2469 #define isByteRGB(f) ( \
2470  f == AV_PIX_FMT_RGB32 || \
2471  f == AV_PIX_FMT_RGB32_1 || \
2472  f == AV_PIX_FMT_RGB24 || \
2473  f == AV_PIX_FMT_BGR32 || \
2474  f == AV_PIX_FMT_BGR32_1 || \
2475  f == AV_PIX_FMT_BGR24)
2476 
2477  if (srcFormat == AV_PIX_FMT_GBRP && isPlanar(srcFormat) && isByteRGB(dstFormat))
2478  c->convert_unscaled = planarRgbToRgbWrapper;
2479 
2480  if (srcFormat == AV_PIX_FMT_GBRAP && isByteRGB(dstFormat))
2481  c->convert_unscaled = planarRgbaToRgbWrapper;
2482 
2483  if ((srcFormat == AV_PIX_FMT_RGB48LE || srcFormat == AV_PIX_FMT_RGB48BE ||
2484  srcFormat == AV_PIX_FMT_BGR48LE || srcFormat == AV_PIX_FMT_BGR48BE ||
2485  srcFormat == AV_PIX_FMT_RGBA64LE || srcFormat == AV_PIX_FMT_RGBA64BE ||
2486  srcFormat == AV_PIX_FMT_BGRA64LE || srcFormat == AV_PIX_FMT_BGRA64BE) &&
2487  (dstFormat == AV_PIX_FMT_GBRP9LE || dstFormat == AV_PIX_FMT_GBRP9BE ||
2488  dstFormat == AV_PIX_FMT_GBRP10LE || dstFormat == AV_PIX_FMT_GBRP10BE ||
2489  dstFormat == AV_PIX_FMT_GBRP12LE || dstFormat == AV_PIX_FMT_GBRP12BE ||
2490  dstFormat == AV_PIX_FMT_GBRP14LE || dstFormat == AV_PIX_FMT_GBRP14BE ||
2491  dstFormat == AV_PIX_FMT_GBRP16LE || dstFormat == AV_PIX_FMT_GBRP16BE ||
2492  dstFormat == AV_PIX_FMT_GBRAP10LE || dstFormat == AV_PIX_FMT_GBRAP10BE ||
2493  dstFormat == AV_PIX_FMT_GBRAP12LE || dstFormat == AV_PIX_FMT_GBRAP12BE ||
2494  dstFormat == AV_PIX_FMT_GBRAP14LE || dstFormat == AV_PIX_FMT_GBRAP14BE ||
2495  dstFormat == AV_PIX_FMT_GBRAP16LE || dstFormat == AV_PIX_FMT_GBRAP16BE ))
2496  c->convert_unscaled = Rgb16ToPlanarRgb16Wrapper;
2497 
2498  if (av_pix_fmt_desc_get(dstFormat)->comp[0].depth >= 10 &&
2499  isPlanarRGB(dstFormat) && !isFloat(dstFormat) &&
2500  (srcFormat == AV_PIX_FMT_X2RGB10LE || srcFormat == AV_PIX_FMT_X2BGR10LE))
2501  c->convert_unscaled = Rgb16ToPlanarRgb16Wrapper;
2502 
2503  if ((srcFormat == AV_PIX_FMT_GBRP9LE || srcFormat == AV_PIX_FMT_GBRP9BE ||
2504  srcFormat == AV_PIX_FMT_GBRP16LE || srcFormat == AV_PIX_FMT_GBRP16BE ||
2505  srcFormat == AV_PIX_FMT_GBRP10LE || srcFormat == AV_PIX_FMT_GBRP10BE ||
2506  srcFormat == AV_PIX_FMT_GBRP12LE || srcFormat == AV_PIX_FMT_GBRP12BE ||
2507  srcFormat == AV_PIX_FMT_GBRP14LE || srcFormat == AV_PIX_FMT_GBRP14BE ||
2508  srcFormat == AV_PIX_FMT_GBRAP10LE || srcFormat == AV_PIX_FMT_GBRAP10BE ||
2509  srcFormat == AV_PIX_FMT_GBRAP12LE || srcFormat == AV_PIX_FMT_GBRAP12BE ||
2510  srcFormat == AV_PIX_FMT_GBRAP14LE || srcFormat == AV_PIX_FMT_GBRAP14BE ||
2511  srcFormat == AV_PIX_FMT_GBRAP16LE || srcFormat == AV_PIX_FMT_GBRAP16BE) &&
2512  (dstFormat == AV_PIX_FMT_RGB48LE || dstFormat == AV_PIX_FMT_RGB48BE ||
2513  dstFormat == AV_PIX_FMT_BGR48LE || dstFormat == AV_PIX_FMT_BGR48BE ||
2514  dstFormat == AV_PIX_FMT_RGBA64LE || dstFormat == AV_PIX_FMT_RGBA64BE ||
2515  dstFormat == AV_PIX_FMT_BGRA64LE || dstFormat == AV_PIX_FMT_BGRA64BE))
2516  c->convert_unscaled = planarRgb16ToRgb16Wrapper;
2517 
2518  if (av_pix_fmt_desc_get(srcFormat)->comp[0].depth >= 10 &&
2519  isPlanarRGB(srcFormat) && !isFloat(srcFormat) &&
2520  (dstFormat == AV_PIX_FMT_X2RGB10LE || dstFormat == AV_PIX_FMT_X2BGR10LE))
2521  c->convert_unscaled = planarRgb16ToRgb16Wrapper;
2522 
2523  if (av_pix_fmt_desc_get(srcFormat)->comp[0].depth == 8 &&
2524  isPackedRGB(srcFormat) && dstFormat == AV_PIX_FMT_GBRP)
2525  c->convert_unscaled = rgbToPlanarRgbWrapper;
2526 
2527  if (av_pix_fmt_desc_get(srcFormat)->comp[0].depth == 8 &&
2528  isPackedRGB(srcFormat) && dstFormat == AV_PIX_FMT_GBRAP)
2529  c->convert_unscaled = rgbToPlanarRgbaWrapper;
2530 
2531  if (isBayer(srcFormat)) {
2532  c->dst_slice_align = 2;
2533  if (dstFormat == AV_PIX_FMT_RGB24)
2534  c->convert_unscaled = bayer_to_rgb24_wrapper;
2535  else if (dstFormat == AV_PIX_FMT_RGB48)
2536  c->convert_unscaled = bayer_to_rgb48_wrapper;
2537  else if (dstFormat == AV_PIX_FMT_YUV420P)
2538  c->convert_unscaled = bayer_to_yv12_wrapper;
2539  else if (!isBayer(dstFormat)) {
2540  av_log(c, AV_LOG_ERROR, "unsupported bayer conversion\n");
2541  av_assert0(0);
2542  }
2543  }
2544 
2545  /* bswap 16 bits per pixel/component packed formats */
2546  if (IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_BAYER_BGGR16) ||
2547  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_BAYER_RGGB16) ||
2548  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_BAYER_GBRG16) ||
2549  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_BAYER_GRBG16) ||
2550  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_BGR444) ||
2551  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_BGR48) ||
2552  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_BGR555) ||
2553  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_BGR565) ||
2554  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_BGRA64) ||
2555  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GRAY9) ||
2556  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GRAY10) ||
2557  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GRAY12) ||
2558  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GRAY14) ||
2559  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GRAY16) ||
2560  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YA16) ||
2561  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_AYUV64) ||
2562  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRP9) ||
2563  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRP10) ||
2564  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRP12) ||
2565  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRP14) ||
2566  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRP16) ||
2567  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRAP10) ||
2568  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRAP12) ||
2569  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRAP14) ||
2570  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRAP16) ||
2571  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_RGB444) ||
2572  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_RGB48) ||
2573  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_RGB555) ||
2574  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_RGB565) ||
2575  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_RGBA64) ||
2576  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_XV36) ||
2577  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_XV48) ||
2578  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_XYZ12) ||
2579  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV420P9) ||
2580  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV420P10) ||
2581  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV420P12) ||
2582  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV420P14) ||
2583  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV420P16) ||
2584  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV422P9) ||
2585  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV422P10) ||
2586  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV422P12) ||
2587  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV422P14) ||
2588  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV422P16) ||
2589  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV440P10) ||
2590  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV440P12) ||
2591  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV444P9) ||
2592  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV444P10) ||
2593  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV444P12) ||
2594  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV444P14) ||
2595  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV444P16))
2596  c->convert_unscaled = bswap_16bpc;
2597 
2598  /* bswap 32 bits per pixel/component formats */
2599  if (IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRPF32) ||
2600  IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRAPF32))
2601  c->convert_unscaled = bswap_32bpc;
2602 
2603  if (usePal(srcFormat)) {
2604  switch (dstFormat) {
2605  case AV_PIX_FMT_GBRP:
2606  case AV_PIX_FMT_GBRAP:
2607  c->convert_unscaled = palToGbrpWrapper;
2608  break;
2609  default:
2610  if (isByteRGB(dstFormat))
2611  c->convert_unscaled = palToRgbWrapper;
2612  break;
2613  }
2614  }
2615 
2616  if (srcFormat == AV_PIX_FMT_YUV422P) {
2617  if (dstFormat == AV_PIX_FMT_YUYV422)
2618  c->convert_unscaled = yuv422pToYuy2Wrapper;
2619  else if (dstFormat == AV_PIX_FMT_UYVY422)
2620  c->convert_unscaled = yuv422pToUyvyWrapper;
2621  }
2622 
2623  /* uint Y to float Y */
2624  if (srcFormat == AV_PIX_FMT_GRAY8 && dstFormat == AV_PIX_FMT_GRAYF32){
2625  c->convert_unscaled = uint_y_to_float_y_wrapper;
2626  }
2627 
2628  /* float Y to uint Y */
2629  if (srcFormat == AV_PIX_FMT_GRAYF32 && dstFormat == AV_PIX_FMT_GRAY8){
2630  c->convert_unscaled = float_y_to_uint_y_wrapper;
2631  }
2632 
2633  /* LQ converters if -sws 0 or -sws 4*/
2634  if (c->opts.flags&(SWS_FAST_BILINEAR|SWS_POINT)) {
2635  /* yv12_to_yuy2 */
2636  if (srcFormat == AV_PIX_FMT_YUV420P || srcFormat == AV_PIX_FMT_YUVA420P) {
2637  if (dstFormat == AV_PIX_FMT_YUYV422)
2638  c->convert_unscaled = planarToYuy2Wrapper;
2639  else if (dstFormat == AV_PIX_FMT_UYVY422)
2640  c->convert_unscaled = planarToUyvyWrapper;
2641  }
2642  }
2643  if (srcFormat == AV_PIX_FMT_YUYV422 &&
2644  (dstFormat == AV_PIX_FMT_YUV420P || dstFormat == AV_PIX_FMT_YUVA420P))
2645  c->convert_unscaled = yuyvToYuv420Wrapper;
2646  if (srcFormat == AV_PIX_FMT_UYVY422 &&
2647  (dstFormat == AV_PIX_FMT_YUV420P || dstFormat == AV_PIX_FMT_YUVA420P))
2648  c->convert_unscaled = uyvyToYuv420Wrapper;
2649  if (srcFormat == AV_PIX_FMT_YUYV422 && dstFormat == AV_PIX_FMT_YUV422P)
2650  c->convert_unscaled = yuyvToYuv422Wrapper;
2651  if (srcFormat == AV_PIX_FMT_UYVY422 && dstFormat == AV_PIX_FMT_YUV422P)
2652  c->convert_unscaled = uyvyToYuv422Wrapper;
2653  if (dstFormat == AV_PIX_FMT_YUV420P &&
2654  (srcFormat == AV_PIX_FMT_NV24 || srcFormat == AV_PIX_FMT_NV42))
2655  c->convert_unscaled = nv24ToYuv420Wrapper;
2656 
2657 #define isPlanarGray(x) (isGray(x) && (x) != AV_PIX_FMT_YA8 && (x) != AV_PIX_FMT_YA16LE && (x) != AV_PIX_FMT_YA16BE)
2658 
2659  /* simple copy */
2660  if ( srcFormat == dstFormat ||
2661  (srcFormat == AV_PIX_FMT_YUVA420P && dstFormat == AV_PIX_FMT_YUV420P) ||
2662  (srcFormat == AV_PIX_FMT_YUV420P && dstFormat == AV_PIX_FMT_YUVA420P) ||
2663  (isFloat(srcFormat) == isFloat(dstFormat) && isFloat16(srcFormat) == isFloat16(dstFormat)) && ((isPlanarYUV(srcFormat) && isPlanarGray(dstFormat)) ||
2664  (isPlanarYUV(dstFormat) && isPlanarGray(srcFormat)) ||
2665  (isPlanarGray(dstFormat) && isPlanarGray(srcFormat)) ||
2666  (isPlanarYUV(srcFormat) && isPlanarYUV(dstFormat) &&
2667  c->chrDstHSubSample == c->chrSrcHSubSample &&
2668  c->chrDstVSubSample == c->chrSrcVSubSample &&
2669  isSemiPlanarYUV(srcFormat) == isSemiPlanarYUV(dstFormat))))
2670  {
2671  if (isPacked(c->opts.src_format))
2672  c->convert_unscaled = packedCopyWrapper;
2673  else /* Planar YUV or gray */
2674  c->convert_unscaled = planarCopyWrapper;
2675  }
2676 
2677 #if ARCH_PPC
2679 #elif ARCH_ARM
2681 #elif ARCH_AARCH64
2683 #endif
2684 }
2685 
2686 /* Convert the palette to the same packed 32-bit format as the palette */
2687 void sws_convertPalette8ToPacked32(const uint8_t *src, uint8_t *dst,
2688  int num_pixels, const uint8_t *palette)
2689 {
2690  int i;
2691 
2692  for (i = 0; i < num_pixels; i++)
2693  ((uint32_t *) dst)[i] = ((const uint32_t *) palette)[src[i]];
2694 }
2695 
2696 /* Palette format: ABCD -> dst format: ABC */
2697 void sws_convertPalette8ToPacked24(const uint8_t *src, uint8_t *dst,
2698  int num_pixels, const uint8_t *palette)
2699 {
2700  int i;
2701 
2702  for (i = 0; i < num_pixels; i++) {
2703  //FIXME slow?
2704  dst[0] = palette[src[i] * 4 + 0];
2705  dst[1] = palette[src[i] * 4 + 1];
2706  dst[2] = palette[src[i] * 4 + 2];
2707  dst += 3;
2708  }
2709 }
isBayer
static av_always_inline int isBayer(enum AVPixelFormat pix_fmt)
Definition: swscale_internal.h:842
rgbToPlanarRgbaWrapper
static int rgbToPlanarRgbaWrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
Definition: swscale_unscaled.c:1523
AV_PIX_FMT_GBRAP16
#define AV_PIX_FMT_GBRAP16
Definition: pixfmt.h:533
nv24ToPlanarWrapper
static int nv24ToPlanarWrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dstParam[], const int dstStride[])
Definition: swscale_unscaled.c:203
rgb12tobgr12
void rgb12tobgr12(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:325
isX2RGB
#define isX2RGB(x)
Definition: swscale_unscaled.c:1814
gray8aToPlanar8
static void gray8aToPlanar8(const uint8_t *src, uint8_t *dst0, uint8_t *dst1, uint8_t *dst2, uint8_t *dstA, int num_pixels, const uint8_t *palette)
Definition: swscale_unscaled.c:512
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
AV_PIX_FMT_BAYER_GBRG16LE
@ AV_PIX_FMT_BAYER_GBRG16LE
bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, little-endian
Definition: pixfmt.h:293
AV_PIX_FMT_BGR48LE
@ AV_PIX_FMT_BGR48LE
packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as lit...
Definition: pixfmt.h:146
isPlanarRGB
static av_always_inline int isPlanarRGB(enum AVPixelFormat pix_fmt)
Definition: swscale_internal.h:910
rgb32tobgr24
void(* rgb32tobgr24)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:35
shuffle_bytes_3012
void(* shuffle_bytes_3012)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:57
SWS_DITHER_AUTO
@ SWS_DITHER_AUTO
Definition: swscale.h:81
isPacked
static av_always_inline int isPacked(enum AVPixelFormat pix_fmt)
Definition: swscale_internal.h:887
AV_PIX_FMT_YA8
@ AV_PIX_FMT_YA8
8 bits gray, 8 bits alpha
Definition: pixfmt.h:140
ff_get_unscaled_swscale_ppc
av_cold void ff_get_unscaled_swscale_ppc(SwsInternal *c)
Definition: yuv2yuv_altivec.c:187
AV_PIX_FMT_BGRA64BE
@ AV_PIX_FMT_BGRA64BE
packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is st...
Definition: pixfmt.h:204
AV_WL32
#define AV_WL32(p, v)
Definition: intreadwrite.h:422
C2
#define C2
Definition: mpegaudiodsp_template.c:239
mem_internal.h
packedtogbr24p
static void packedtogbr24p(const uint8_t *src, int srcStride, uint8_t *const dst[], const int dstStride[], int srcSliceH, int alpha_first, int inc_size, int width)
Definition: swscale_unscaled.c:1386
gbr24ptopacked24
static void gbr24ptopacked24(const uint8_t *src[], const int srcStride[], uint8_t *dst, int dstStride, int srcSliceH, int width)
Definition: swscale_unscaled.c:1181
comp
static void comp(unsigned char *dst, ptrdiff_t dst_stride, unsigned char *src, ptrdiff_t src_stride, int add)
Definition: eamad.c:81
AV_PIX_FMT_BGR32
#define AV_PIX_FMT_BGR32
Definition: pixfmt.h:485
yv12toyuy2
void(* yv12toyuy2)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst, int width, int height, int lumStride, int chromStride, int dstStride)
Height should be a multiple of 2 and width should be a multiple of 16.
Definition: rgb2rgb.c:65
AV_PIX_FMT_GBRP16BE
@ AV_PIX_FMT_GBRP16BE
planar GBR 4:4:4 48bpp, big-endian
Definition: pixfmt.h:171
rgb15to24
void rgb15to24(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:290
AV_PIX_FMT_GBRP10BE
@ AV_PIX_FMT_GBRP10BE
planar GBR 4:4:4 30bpp, big-endian
Definition: pixfmt.h:169
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3244
nv24ToYuv420Wrapper
static int nv24ToYuv420Wrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dstParam[], const int dstStride[])
Definition: swscale_unscaled.c:248
src1
const pixel * src1
Definition: h264pred_template.c:420
C0
#define C0
planarRgbaToRgbWrapper
static int planarRgbaToRgbWrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
Definition: swscale_unscaled.c:1257
pixdesc.h
AV_PIX_FMT_RGBA64BE
@ AV_PIX_FMT_RGBA64BE
packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is st...
Definition: pixfmt.h:202
AV_PIX_FMT_YUVA420P16
#define AV_PIX_FMT_YUVA420P16
Definition: pixfmt.h:556
w
uint8_t w
Definition: llviddspenc.c:38
planarToNv12Wrapper
static int planarToNv12Wrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dstParam[], const int dstStride[])
Definition: swscale_unscaled.c:142
rgb16tobgr32
void rgb16tobgr32(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:193
AVComponentDescriptor::depth
int depth
Number of bits in the component.
Definition: pixdesc.h:57
AV_PIX_FMT_YUVA420P10
#define AV_PIX_FMT_YUVA420P10
Definition: pixfmt.h:551
AVPixFmtDescriptor::name
const char * name
Definition: pixdesc.h:70
SWS_BITEXACT
@ SWS_BITEXACT
Definition: swscale.h:156
CONV_IS
#define CONV_IS(src, dst)
planar8ToP01xleWrapper
static int planar8ToP01xleWrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dstParam8[], const int dstStride[])
Definition: swscale_unscaled.c:328
x2rgb10tobgr64_bswap
void x2rgb10tobgr64_bswap(const uint8_t *src, uint8_t *dst, int src_size)
shuffle_bytes_3210
void(* shuffle_bytes_3210)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:58
pal8ToPlanar8
static void pal8ToPlanar8(const uint8_t *src, uint8_t *dst0, uint8_t *dst1, uint8_t *dst2, uint8_t *dstA, int num_pixels, const uint8_t *palette)
Definition: swscale_unscaled.c:526
rgb2yuv
static const char rgb2yuv[]
Definition: vf_scale_vulkan.c:73
rgb48tobgr48_nobswap
void rgb48tobgr48_nobswap(const uint8_t *src, uint8_t *dst, int src_size)
AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_YUV420P10
Definition: pixfmt.h:510
AV_PIX_FMT_RGB32_1
#define AV_PIX_FMT_RGB32_1
Definition: pixfmt.h:484
rgb32tobgr16
void(* rgb32tobgr16)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:36
yuyvtoyuv422
void(* yuyvtoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, int width, int height, int lumStride, int chromStride, int srcStride)
Definition: rgb2rgb.c:117
rgbToPlanarRgbWrapper
static int rgbToPlanarRgbWrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
Definition: swscale_unscaled.c:1415
AV_PIX_FMT_GBRP14BE
@ AV_PIX_FMT_GBRP14BE
planar GBR 4:4:4 42bpp, big-endian
Definition: pixfmt.h:281
rgb24tobgr16
void(* rgb24tobgr16)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:40
planarToP01xWrapper
static int planarToP01xWrapper(SwsInternal *c, const uint8_t *const src8[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dstParam8[], const int dstStride[])
Definition: swscale_unscaled.c:268
AV_PIX_FMT_BGR24
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
Definition: pixfmt.h:76
AV_PIX_FMT_BGRA
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
Definition: pixfmt.h:102
rgb15to32
void(* rgb15to32)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:52
mathematics.h
sws_convertPalette8ToPacked24
void sws_convertPalette8ToPacked24(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette)
Convert an 8-bit paletted frame into a frame with a color depth of 24 bits.
Definition: swscale_unscaled.c:2697
AV_PIX_FMT_BAYER_GRBG16BE
@ AV_PIX_FMT_BAYER_GRBG16BE
bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, big-endian
Definition: pixfmt.h:296
AV_PIX_FMT_BAYER_GRBG16
#define AV_PIX_FMT_BAYER_GRBG16
Definition: pixfmt.h:538
AV_PIX_FMT_GBRAP14BE
@ AV_PIX_FMT_GBRAP14BE
planar GBR 4:4:4:4 56bpp, big-endian
Definition: pixfmt.h:432
yv12touyvy
void(* yv12touyvy)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst, int width, int height, int lumStride, int chromStride, int dstStride)
Height should be a multiple of 2 and width should be a multiple of 16.
Definition: rgb2rgb.c:69
bayer_template.c
AV_PIX_FMT_GRAY9
#define AV_PIX_FMT_GRAY9
Definition: pixfmt.h:490
rgb32to16
void(* rgb32to16)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:45
AV_PIX_FMT_BAYER_GBRG16BE
@ AV_PIX_FMT_BAYER_GBRG16BE
bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, big-endian
Definition: pixfmt.h:294
x2rgb10tobgr48_nobswap
void x2rgb10tobgr48_nobswap(const uint8_t *src, uint8_t *dst, int src_size)
AV_PIX_FMT_GBRAP12LE
@ AV_PIX_FMT_GBRAP12LE
planar GBR 4:4:4:4 48bpp, little-endian
Definition: pixfmt.h:311
yuyvToYuv420Wrapper
static int yuyvToYuv420Wrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dstParam[], const int dstStride[])
Definition: swscale_unscaled.c:419
SWS_FAST_BILINEAR
@ SWS_FAST_BILINEAR
Scaler selection options.
Definition: swscale.h:98
isRGBA32
#define isRGBA32(x)
Definition: swscale_unscaled.c:1786
is16BPS
static av_always_inline int is16BPS(enum AVPixelFormat pix_fmt)
Definition: swscale_internal.h:727
rgb
Definition: rpzaenc.c:60
bswap_32bpc
static int bswap_32bpc(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
Definition: swscale_unscaled.c:567
planarToUyvyWrapper
static int planarToUyvyWrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dstParam[], const int dstStride[])
Definition: swscale_unscaled.c:383
AV_PIX_FMT_GBRP14
#define AV_PIX_FMT_GBRP14
Definition: pixfmt.h:528
shuffle_bytes_2130
void(* shuffle_bytes_2130)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:61
AV_PIX_FMT_GBRAP
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
Definition: pixfmt.h:212
isRGBA64
#define isRGBA64(x)
Definition: swscale_unscaled.c:1793
C1
#define C1
Definition: mpegaudiodsp_template.c:238
float_y_to_uint_y_wrapper
static int float_y_to_uint_y_wrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
Definition: swscale_unscaled.c:2093
AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_GBRP10
Definition: pixfmt.h:526
palToRgbWrapper
static int palToRgbWrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
Definition: swscale_unscaled.c:595
AV_PIX_FMT_YUV422P9
#define AV_PIX_FMT_YUV422P9
Definition: pixfmt.h:508
rgb16tobgr16
void rgb16tobgr16(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:248
yuv422pToYuy2Wrapper
static int yuv422pToYuy2Wrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dstParam[], const int dstStride[])
Definition: swscale_unscaled.c:395
x2rgb10tobgr48_bswap
void x2rgb10tobgr48_bswap(const uint8_t *src, uint8_t *dst, int src_size)
val
static double val(void *priv, double ch)
Definition: aeval.c:77
isNBPS
static av_always_inline int isNBPS(enum AVPixelFormat pix_fmt)
Definition: swscale_internal.h:741
AV_PIX_FMT_XV48
#define AV_PIX_FMT_XV48
Definition: pixfmt.h:572
AV_PIX_FMT_GRAY16
#define AV_PIX_FMT_GRAY16
Definition: pixfmt.h:494
rgb48tobgr64_bswap
void rgb48tobgr64_bswap(const uint8_t *src, uint8_t *dst, int src_size)
DITHER_COPY
#define DITHER_COPY(dst, dstStride, src, srcStride, bswap, dbswap)
Definition: swscale_unscaled.c:2143
bgr24ToYv12Wrapper
static int bgr24ToYv12Wrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
Definition: swscale_unscaled.c:2040
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:513
isRGB48
#define isRGB48(x)
Definition: swscale_unscaled.c:1800
avassert.h
packed32togbrap
static void packed32togbrap(const uint8_t *src, int srcStride, uint8_t *const dst[], const int dstStride[], int srcSliceH, int alpha_first, int width)
Definition: swscale_unscaled.c:1487
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:209
AV_PIX_FMT_BAYER_RGGB16BE
@ AV_PIX_FMT_BAYER_RGGB16BE
bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, big-endian
Definition: pixfmt.h:292
AV_PIX_FMT_YUV422P16
#define AV_PIX_FMT_YUV422P16
Definition: pixfmt.h:522
gbraptopacked32
static void gbraptopacked32(const uint8_t *src[], const int srcStride[], uint8_t *dst, int dstStride, int srcSliceH, int alpha_first, int width)
Definition: swscale_unscaled.c:1228
rgb16tobgr24
void(* rgb16tobgr24)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:42
AV_PIX_FMT_GBRAP10
#define AV_PIX_FMT_GBRAP10
Definition: pixfmt.h:530
AV_PIX_FMT_GBRAP16BE
@ AV_PIX_FMT_GBRAP16BE
planar GBRA 4:4:4:4 64bpp, big-endian
Definition: pixfmt.h:213
intreadwrite.h
AV_PIX_FMT_GBRP16LE
@ AV_PIX_FMT_GBRP16LE
planar GBR 4:4:4 48bpp, little-endian
Definition: pixfmt.h:172
AV_PIX_FMT_GBRAP14
#define AV_PIX_FMT_GBRAP14
Definition: pixfmt.h:532
AV_PIX_FMT_GBRAP12
#define AV_PIX_FMT_GBRAP12
Definition: pixfmt.h:531
AV_PIX_FMT_YUVA420P
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
Definition: pixfmt.h:108
AV_PIX_FMT_BAYER_RGGB16LE
@ AV_PIX_FMT_BAYER_RGGB16LE
bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, little-endian
Definition: pixfmt.h:291
AV_PIX_FMT_YUV444P16
#define AV_PIX_FMT_YUV444P16
Definition: pixfmt.h:523
AV_CEIL_RSHIFT
#define AV_CEIL_RSHIFT(a, b)
Definition: common.h:60
AV_PIX_FMT_BAYER_BGGR8
@ AV_PIX_FMT_BAYER_BGGR8
bayer, BGBG..(odd line), GRGR..(even line), 8-bit samples
Definition: pixfmt.h:285
nv24_to_yuv420p_chroma
static void nv24_to_yuv420p_chroma(uint8_t *dst1, int dstStride1, uint8_t *dst2, int dstStride2, const uint8_t *src, int srcStride, int w, int h)
Definition: swscale_unscaled.c:224
shuffle_bytes_1230
void(* shuffle_bytes_1230)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:56
Rgb16ToPlanarRgb16Wrapper
static int Rgb16ToPlanarRgb16Wrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
Definition: swscale_unscaled.c:885
SWS_DITHER_BAYER
@ SWS_DITHER_BAYER
Definition: swscale.h:82
AV_PIX_FMT_GBRP12LE
@ AV_PIX_FMT_GBRP12LE
planar GBR 4:4:4 36bpp, little-endian
Definition: pixfmt.h:280
rgb15tobgr24
void(* rgb15tobgr24)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:43
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
AV_PIX_FMT_YUV420P9
#define AV_PIX_FMT_YUV420P9
Definition: pixfmt.h:507
AV_PIX_FMT_YUV420P16
#define AV_PIX_FMT_YUV420P16
Definition: pixfmt.h:521
AV_PIX_FMT_FLAG_ALPHA
#define AV_PIX_FMT_FLAG_ALPHA
The pixel format has an alpha channel.
Definition: pixdesc.h:147
AV_RL16
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_RL16
Definition: bytestream.h:94
AV_PIX_FMT_GRAY14
#define AV_PIX_FMT_GRAY14
Definition: pixfmt.h:493
isAYUV
#define isAYUV(x)
Definition: swscale_unscaled.c:1807
yuv422ptoyuy2
void(* yuv422ptoyuy2)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst, int width, int height, int lumStride, int chromStride, int dstStride)
Width should be a multiple of 16.
Definition: rgb2rgb.c:73
shuffle_bytes_2103
void(* shuffle_bytes_2103)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:55
rgb32tobgr15
void(* rgb32tobgr15)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:37
bayer_to_yv12_wrapper
static int bayer_to_yv12_wrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
Definition: swscale_unscaled.c:1730
AV_PIX_FMT_GBRP10LE
@ AV_PIX_FMT_GBRP10LE
planar GBR 4:4:4 30bpp, little-endian
Definition: pixfmt.h:170
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:73
rgb48to64_bswap
void rgb48to64_bswap(const uint8_t *src, uint8_t *dst, int src_size)
AV_PIX_FMT_GRAYF32
#define AV_PIX_FMT_GRAYF32
Definition: pixfmt.h:546
AV_PIX_FMT_BGR32_1
#define AV_PIX_FMT_BGR32_1
Definition: pixfmt.h:486
uyvyToYuv420Wrapper
static int uyvyToYuv420Wrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dstParam[], const int dstStride[])
Definition: swscale_unscaled.c:450
AV_PIX_FMT_RGBA
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
Definition: pixfmt.h:100
conv
static int conv(int samples, float **pcm, char *buf, int channels)
Definition: libvorbisdec.c:134
AV_PIX_FMT_BAYER_RGGB8
@ AV_PIX_FMT_BAYER_RGGB8
bayer, RGRG..(odd line), GBGB..(even line), 8-bit samples
Definition: pixfmt.h:286
rgb16to24
void rgb16to24(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:234
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:74
AV_PIX_FMT_BAYER_BGGR16
#define AV_PIX_FMT_BAYER_BGGR16
Definition: pixfmt.h:535
AV_PIX_FMT_GRAY10
#define AV_PIX_FMT_GRAY10
Definition: pixfmt.h:491
rgb12to15
void rgb12to15(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:215
interleaveBytes
void(* interleaveBytes)(const uint8_t *src1, const uint8_t *src2, uint8_t *dst, int width, int height, int src1Stride, int src2Stride, int dstStride)
Definition: rgb2rgb.c:92
isSemiPlanarYUV
static av_always_inline int isSemiPlanarYUV(enum AVPixelFormat pix_fmt)
Definition: swscale_internal.h:773
AV_PIX_FMT_BAYER_GRBG16LE
@ AV_PIX_FMT_BAYER_GRBG16LE
bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, little-endian
Definition: pixfmt.h:295
AV_PIX_FMT_GBRP16
#define AV_PIX_FMT_GBRP16
Definition: pixfmt.h:529
AV_PIX_FMT_RGBA64
#define AV_PIX_FMT_RGBA64
Definition: pixfmt.h:500
shuffle_bytes_3102
void(* shuffle_bytes_3102)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:59
packed30togbra10
static void packed30togbra10(const uint8_t *src, int srcStride, uint16_t *dst[], const int dstStride[], int srcSliceH, int swap, int bpc, int width)
Definition: swscale_unscaled.c:814
AV_PIX_FMT_GBRAP12BE
@ AV_PIX_FMT_GBRAP12BE
planar GBR 4:4:4:4 48bpp, big-endian
Definition: pixfmt.h:310
AV_PIX_FMT_BGR48
#define AV_PIX_FMT_BGR48
Definition: pixfmt.h:501
NULL
#define NULL
Definition: coverity.c:32
rgb16to15
void(* rgb16to15)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:50
yvu9ToYv12Wrapper
static int yvu9ToYv12Wrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
Definition: swscale_unscaled.c:2057
AVPixFmtDescriptor::nb_components
uint8_t nb_components
The number of components each pixel has, (1-4)
Definition: pixdesc.h:71
isFloat16
static av_always_inline int isFloat16(enum AVPixelFormat pix_fmt)
Definition: swscale_internal.h:871
AV_WB16
#define AV_WB16(p, v)
Definition: intreadwrite.h:401
AV_PIX_FMT_YUYV422
@ AV_PIX_FMT_YUYV422
packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
Definition: pixfmt.h:74
uint_y_to_float_y_wrapper
static int uint_y_to_float_y_wrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
Definition: swscale_unscaled.c:2073
gray8aToPacked24
static void gray8aToPacked24(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette)
Definition: swscale_unscaled.c:498
ff_get_unscaled_swscale_aarch64
void ff_get_unscaled_swscale_aarch64(SwsInternal *c)
Definition: swscale_unscaled.c:218
AV_PIX_FMT_RGB48LE
@ AV_PIX_FMT_RGB48LE
packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as lit...
Definition: pixfmt.h:110
bayer_to_rgb48_wrapper
static int bayer_to_rgb48_wrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
Definition: swscale_unscaled.c:1680
AV_PIX_FMT_RGBA64LE
@ AV_PIX_FMT_RGBA64LE
packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is st...
Definition: pixfmt.h:203
AV_PIX_FMT_YUV440P10
#define AV_PIX_FMT_YUV440P10
Definition: pixfmt.h:512
AV_PIX_FMT_BAYER_GBRG16
#define AV_PIX_FMT_BAYER_GBRG16
Definition: pixfmt.h:537
AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:511
rgbConvFn
void(* rgbConvFn)(const uint8_t *, uint8_t *, int)
Definition: swscale_unscaled.c:1820
x2rgb10to64_nobswap
void x2rgb10to64_nobswap(const uint8_t *src, uint8_t *dst, int src_size)
ff_get_unscaled_swscale_arm
void ff_get_unscaled_swscale_arm(SwsInternal *c)
Definition: swscale_unscaled.c:185
COPY816
#define COPY816(w)
AV_PIX_FMT_GRAY8
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition: pixfmt.h:81
yuyvtoyuv420
void(* yuyvtoyuv420)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, int width, int height, int lumStride, int chromStride, int srcStride)
Definition: rgb2rgb.c:114
AV_PIX_FMT_GBRP9
#define AV_PIX_FMT_GBRP9
Definition: pixfmt.h:525
AVPixFmtDescriptor::flags
uint64_t flags
Combination of AV_PIX_FMT_FLAG_...
Definition: pixdesc.h:94
rgb15tobgr16
void rgb15tobgr16(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:304
AV_PIX_FMT_ABGR
@ AV_PIX_FMT_ABGR
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
Definition: pixfmt.h:101
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
rgb64tobgr48_bswap
void rgb64tobgr48_bswap(const uint8_t *src, uint8_t *dst, int src_size)
planarCopyWrapper
static int planarCopyWrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
Definition: swscale_unscaled.c:2204
dithers
static const uint8_t dithers[8][8][8]
Definition: swscale_unscaled.c:38
rgb24tobgr32
void(* rgb24tobgr32)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:38
AV_PIX_FMT_X2RGB10LE
@ AV_PIX_FMT_X2RGB10LE
packed RGB 10:10:10, 30bpp, (msb)2X 10R 10G 10B(lsb), little-endian, X=unused/undefined
Definition: pixfmt.h:384
rgb64to48_nobswap
void rgb64to48_nobswap(const uint8_t *src, uint8_t *dst, int src_size)
isBE
static av_always_inline int isBE(enum AVPixelFormat pix_fmt)
Definition: swscale_internal.h:748
f
f
Definition: af_crystalizer.c:122
AV_PIX_FMT_RGB24
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
Definition: pixfmt.h:75
copy
static void copy(const float *p1, float *p2, const int length)
Definition: vf_vaguedenoiser.c:186
height
#define height
Definition: dsp.h:85
DECLARE_ALIGNED
#define DECLARE_ALIGNED(n, t, v)
Definition: mem_internal.h:104
AV_PIX_FMT_FLAG_RGB
#define AV_PIX_FMT_FLAG_RGB
The pixel format contains RGB-like data (as opposed to YUV/grayscale).
Definition: pixdesc.h:136
fillPlane16
static void fillPlane16(uint8_t *plane, int stride, int width, int height, int y, int alpha, int bits, const int big_endian)
Definition: swscale_internal.h:1052
shift
static int shift(int a, int b)
Definition: bonk.c:261
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
AV_PIX_FMT_BAYER_BGGR16LE
@ AV_PIX_FMT_BAYER_BGGR16LE
bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, little-endian
Definition: pixfmt.h:289
usePal
static av_always_inline int usePal(enum AVPixelFormat pix_fmt)
Definition: swscale_internal.h:918
av_bswap32
#define av_bswap32
Definition: bswap.h:47
isAnyRGB
static av_always_inline int isAnyRGB(enum AVPixelFormat pix_fmt)
Definition: swscale_internal.h:856
AV_PIX_FMT_GBRPF32
#define AV_PIX_FMT_GBRPF32
Definition: pixfmt.h:542
AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_YUV422P12
Definition: pixfmt.h:515
AV_PIX_FMT_RGB48
#define AV_PIX_FMT_RGB48
Definition: pixfmt.h:496
SWS_POINT
@ SWS_POINT
nearest neighbor
Definition: swscale.h:102
AV_PIX_FMT_BGR555
#define AV_PIX_FMT_BGR555
Definition: pixfmt.h:503
x2rgb10tobgr64_nobswap
void x2rgb10tobgr64_nobswap(const uint8_t *src, uint8_t *dst, int src_size)
AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:517
gray8aToPacked32_1
static void gray8aToPacked32_1(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette)
Definition: swscale_unscaled.c:489
AV_PIX_FMT_GBRP9BE
@ AV_PIX_FMT_GBRP9BE
planar GBR 4:4:4 27bpp, big-endian
Definition: pixfmt.h:167
rgb64tobgr48_nobswap
void rgb64tobgr48_nobswap(const uint8_t *src, uint8_t *dst, int src_size)
AV_PIX_FMT_AYUV64
#define AV_PIX_FMT_AYUV64
Definition: pixfmt.h:562
shuffle_bytes_0321
void(* shuffle_bytes_0321)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:54
IS_DIFFERENT_ENDIANESS
#define IS_DIFFERENT_ENDIANESS(src_fmt, dst_fmt, pix_fmt)
Definition: swscale_unscaled.c:2375
rgb32to24
void rgb32to24(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:155
nv12ToPlanarWrapper
static int nv12ToPlanarWrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dstParam[], const int dstStride[])
Definition: swscale_unscaled.c:162
rgb15tobgr15
void rgb15tobgr15(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:314
findRgbConvFn
static rgbConvFn findRgbConvFn(SwsInternal *c)
Definition: swscale_unscaled.c:1821
AV_PIX_FMT_GBRP9LE
@ AV_PIX_FMT_GBRP9LE
planar GBR 4:4:4 27bpp, little-endian
Definition: pixfmt.h:168
AV_WL16
#define AV_WL16(p, v)
Definition: intreadwrite.h:408
AV_PIX_FMT_RGB32
#define AV_PIX_FMT_RGB32
Definition: pixfmt.h:483
isBGRinInt
static av_always_inline int isBGRinInt(enum AVPixelFormat pix_fmt)
Definition: swscale_internal.h:820
yuyvToYuv422Wrapper
static int yuyvToYuv422Wrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dstParam[], const int dstStride[])
Definition: swscale_unscaled.c:436
AV_PIX_FMT_YUVA444P
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
Definition: pixfmt.h:174
AV_PIX_FMT_GBRAP10LE
@ AV_PIX_FMT_GBRAP10LE
planar GBR 4:4:4:4 40bpp, little-endian
Definition: pixfmt.h:314
CASE
#define CASE(pixfmt, prefix)
rgb24to16
void(* rgb24to16)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:47
interpolate
static void interpolate(float *out, float v1, float v2, int size)
Definition: twinvq.c:85
bayer_to_rgb24_wrapper
static int bayer_to_rgb24_wrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
Definition: swscale_unscaled.c:1630
AV_PIX_FMT_ARGB
@ AV_PIX_FMT_ARGB
packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
Definition: pixfmt.h:99
AV_PIX_FMT_BGRA64LE
@ AV_PIX_FMT_BGRA64LE
packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is st...
Definition: pixfmt.h:205
uyvytoyuv422
void(* uyvytoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, int width, int height, int lumStride, int chromStride, int srcStride)
Definition: rgb2rgb.c:111
planarToYuy2Wrapper
static int planarToYuy2Wrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dstParam[], const int dstStride[])
Definition: swscale_unscaled.c:371
AV_PIX_FMT_XYZ12
#define AV_PIX_FMT_XYZ12
Definition: pixfmt.h:560
AV_PIX_FMT_BGRA64
#define AV_PIX_FMT_BGRA64
Definition: pixfmt.h:505
AVComponentDescriptor::shift
int shift
Number of least significant bits that must be shifted away to get the value.
Definition: pixdesc.h:52
ff_rgb24toyv12
void(* ff_rgb24toyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, int width, int height, int lumStride, int chromStride, int srcStride, const int32_t *rgb2yuv)
Height should be a multiple of 2 and width should be a multiple of 2.
Definition: rgb2rgb.c:85
FAST_COPY_UP
#define FAST_COPY_UP(shift)
AV_PIX_FMT_RGB48BE
@ AV_PIX_FMT_RGB48BE
packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big...
Definition: pixfmt.h:109
ff_copyPlane
void ff_copyPlane(const uint8_t *src, int srcStride, int srcSliceY, int srcSliceH, int width, uint8_t *dst, int dstStride)
Definition: swscale_unscaled.c:125
lrintf
#define lrintf(x)
Definition: libm_mips.h:72
AV_PIX_FMT_YA16
#define AV_PIX_FMT_YA16
Definition: pixfmt.h:495
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
gbr16ptopacked16
static void gbr16ptopacked16(const uint16_t *src[], const int srcStride[], uint8_t *dst, int dstStride, int srcSliceH, int alpha, int swap, int bpp, int width)
Definition: swscale_unscaled.c:957
rgb24to15
void(* rgb24to15)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:48
src2
const pixel * src2
Definition: h264pred_template.c:421
AV_PIX_FMT_GBRP12
#define AV_PIX_FMT_GBRP12
Definition: pixfmt.h:527
AV_PIX_FMT_NV24
@ AV_PIX_FMT_NV24
planar YUV 4:4:4, 24bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
Definition: pixfmt.h:371
AV_PIX_FMT_BGR444
#define AV_PIX_FMT_BGR444
Definition: pixfmt.h:504
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:56
AV_PIX_FMT_BAYER_GBRG8
@ AV_PIX_FMT_BAYER_GBRG8
bayer, GBGB..(odd line), RGRG..(even line), 8-bit samples
Definition: pixfmt.h:287
AV_PIX_FMT_RGB555
#define AV_PIX_FMT_RGB555
Definition: pixfmt.h:498
planarRgb16ToRgb16Wrapper
static int planarRgb16ToRgb16Wrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
Definition: swscale_unscaled.c:1111
rgb32to15
void(* rgb32to15)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:46
rgb48tobgr64_nobswap
void rgb48tobgr64_nobswap(const uint8_t *src, uint8_t *dst, int src_size)
swscale_internal.h
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
AV_PIX_FMT_FLAG_BE
#define AV_PIX_FMT_FLAG_BE
Pixel format is big-endian.
Definition: pixdesc.h:116
yuv422pToUyvyWrapper
static int yuv422pToUyvyWrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dstParam[], const int dstStride[])
Definition: swscale_unscaled.c:407
fillPlane
static void fillPlane(uint8_t *plane, int stride, int width, int height, int y, uint8_t val)
Definition: swscale_unscaled.c:114
AV_PIX_FMT_NV21
@ AV_PIX_FMT_NV21
as above, but U and V bytes are swapped
Definition: pixfmt.h:97
AV_PIX_FMT_BGR565
#define AV_PIX_FMT_BGR565
Definition: pixfmt.h:502
AV_PIX_FMT_NV42
@ AV_PIX_FMT_NV42
as above, but U and V bytes are swapped
Definition: pixfmt.h:372
AV_PIX_FMT_YUV444P9
#define AV_PIX_FMT_YUV444P9
Definition: pixfmt.h:509
isFloat
static av_always_inline int isFloat(enum AVPixelFormat pix_fmt)
Definition: swscale_internal.h:864
gbr16ptopacked30
static void gbr16ptopacked30(const uint16_t *src[], const int srcStride[], uint8_t *dst, int dstStride, int srcSliceH, int swap, int bpp, int width)
Definition: swscale_unscaled.c:1076
AV_PIX_FMT_P016
#define AV_PIX_FMT_P016
Definition: pixfmt.h:565
AV_PIX_FMT_RGB565
#define AV_PIX_FMT_RGB565
Definition: pixfmt.h:497
output_pixel
#define output_pixel(p, v)
Definition: swscale_unscaled.c:325
stride
#define stride
Definition: h264pred_template.c:536
AV_PIX_FMT_GBRAP16LE
@ AV_PIX_FMT_GBRAP16LE
planar GBRA 4:4:4:4 64bpp, little-endian
Definition: pixfmt.h:214
SwsInternal
Definition: swscale_internal.h:317
bswap.h
AV_PIX_FMT_NV12
@ AV_PIX_FMT_NV12
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
Definition: pixfmt.h:96
AV_PIX_FMT_BAYER_BGGR16BE
@ AV_PIX_FMT_BAYER_BGGR16BE
bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, big-endian
Definition: pixfmt.h:290
AV_PIX_FMT_P016LE
@ AV_PIX_FMT_P016LE
like NV12, with 16bpp per component, little-endian
Definition: pixfmt.h:323
deinterleaveBytes
void(* deinterleaveBytes)(const uint8_t *src, uint8_t *dst1, uint8_t *dst2, int width, int height, int srcStride, int dst1Stride, int dst2Stride)
Definition: rgb2rgb.c:95
isPlanarGray
#define isPlanarGray(x)
x2rgb10to48_bswap
void x2rgb10to48_bswap(const uint8_t *src, uint8_t *dst, int src_size)
rgb48to64_nobswap
void rgb48to64_nobswap(const uint8_t *src, uint8_t *dst, int src_size)
rgb48tobgr48_bswap
void rgb48tobgr48_bswap(const uint8_t *src, uint8_t *dst, int src_size)
AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUV420P12
Definition: pixfmt.h:514
AV_PIX_FMT_GBRP12BE
@ AV_PIX_FMT_GBRP12BE
planar GBR 4:4:4 36bpp, big-endian
Definition: pixfmt.h:279
AV_PIX_FMT_UYVY422
@ AV_PIX_FMT_UYVY422
packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
Definition: pixfmt.h:88
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
U
#define U(x)
Definition: vpx_arith.h:37
uyvytoyuv420
void(* uyvytoyuv420)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, int width, int height, int lumStride, int chromStride, int srcStride)
Definition: rgb2rgb.c:108
AV_PIX_FMT_YUV422P14
#define AV_PIX_FMT_YUV422P14
Definition: pixfmt.h:519
rgb16to32
void(* rgb16to32)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:49
gray8aToPacked32
static void gray8aToPacked32(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette)
Definition: swscale_unscaled.c:481
uyvyToYuv422Wrapper
static int uyvyToYuv422Wrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dstParam[], const int dstStride[])
Definition: swscale_unscaled.c:467
isPackedRGB
static av_always_inline int isPackedRGB(enum AVPixelFormat pix_fmt)
Definition: swscale_internal.h:903
rgb24to32
void rgb24to32(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:173
packed16togbra16
static void packed16togbra16(const uint8_t *src, int srcStride, uint16_t *dst[], const int dstStride[], int srcSliceH, int src_alpha, int swap, int shift, int width)
Definition: swscale_unscaled.c:680
rgb24tobgr15
void(* rgb24tobgr15)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:41
shuffle_bytes_2013
void(* shuffle_bytes_2013)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:60
AV_PIX_FMT_GBRAPF32
#define AV_PIX_FMT_GBRAPF32
Definition: pixfmt.h:543
rgb15tobgr32
void rgb15tobgr32(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:268
rgb15to16
void(* rgb15to16)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:51
shuffle_bytes_1203
void(* shuffle_bytes_1203)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:62
AVPixFmtDescriptor::comp
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition: pixdesc.h:105
COPY_UP
#define COPY_UP(r, w)
yuv422ptouyvy
void(* yuv422ptouyvy)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst, int width, int height, int lumStride, int chromStride, int dstStride)
Width should be a multiple of 16.
Definition: rgb2rgb.c:77
AV_PIX_FMT_FLAG_PLANAR
#define AV_PIX_FMT_FLAG_PLANAR
At least one pixel component is not in the first data plane.
Definition: pixdesc.h:132
x2rgb10to48_nobswap
void x2rgb10to48_nobswap(const uint8_t *src, uint8_t *dst, int src_size)
ALT32_CORR
#define ALT32_CORR
Definition: swscale_internal.h:57
av_clip_uint8
#define av_clip_uint8
Definition: common.h:106
AV_PIX_FMT_YUV444P
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:78
rgb24tobgr24
void(* rgb24tobgr24)(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:39
src0
const pixel *const src0
Definition: h264pred_template.c:419
isPlanarYUV
static av_always_inline int isPlanarYUV(enum AVPixelFormat pix_fmt)
Definition: vf_dnn_processing.c:162
AV_PIX_FMT_P010
#define AV_PIX_FMT_P010
Definition: pixfmt.h:563
ff_yuv2rgb_get_func_ptr
SwsFunc ff_yuv2rgb_get_func_ptr(SwsInternal *c)
rgb64to48_bswap
void rgb64to48_bswap(const uint8_t *src, uint8_t *dst, int src_size)
AV_PIX_FMT_GBRP
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
Definition: pixfmt.h:165
planarRgbToplanarRgbWrapper
static int planarRgbToplanarRgbWrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
Definition: swscale_unscaled.c:1369
avutil.h
AV_PIX_FMT_X2BGR10LE
@ AV_PIX_FMT_X2BGR10LE
packed BGR 10:10:10, 30bpp, (msb)2X 10B 10G 10R(lsb), little-endian, X=unused/undefined
Definition: pixfmt.h:386
AV_PIX_FMT_YUV422P
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:77
AV_PIX_FMT_P010LE
@ AV_PIX_FMT_P010LE
like NV12, with 10bpp per component, data in the high bits, zeros in the low bits,...
Definition: pixfmt.h:307
bswap_16bpc
static int bswap_16bpc(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
Definition: swscale_unscaled.c:540
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
alpha
static const int16_t alpha[]
Definition: ilbcdata.h:55
isRGBinInt
static av_always_inline int isRGBinInt(enum AVPixelFormat pix_fmt)
Definition: swscale_internal.h:798
x2rgb10to64_bswap
void x2rgb10to64_bswap(const uint8_t *src, uint8_t *dst, int src_size)
AV_PIX_FMT_GBRP14LE
@ AV_PIX_FMT_GBRP14LE
planar GBR 4:4:4 42bpp, little-endian
Definition: pixfmt.h:282
int32_t
int32_t
Definition: audioconvert.c:56
IS_NOT_NE
#define IS_NOT_NE(bpp, desc)
RGBA
#define RGBA(r, g, b, a)
Definition: dvbsubdec.c:42
ff_get_unscaled_swscale
void ff_get_unscaled_swscale(SwsInternal *c)
Set c->convert_unscaled to an unscaled converter if one exists for the specific source and destinatio...
Definition: swscale_unscaled.c:2380
planarToNv24Wrapper
static int planarToNv24Wrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dstParam[], const int dstStride[])
Definition: swscale_unscaled.c:183
AV_PIX_FMT_XV36
#define AV_PIX_FMT_XV36
Definition: pixfmt.h:571
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:482
planar2x
void(* planar2x)(const uint8_t *src, uint8_t *dst, int width, int height, int srcStride, int dstStride)
Definition: rgb2rgb.c:90
AV_PIX_FMT_YUV410P
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition: pixfmt.h:79
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
planarRgbToRgbWrapper
static int planarRgbToRgbWrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
Definition: swscale_unscaled.c:1313
AV_PIX_FMT_GBRAP10BE
@ AV_PIX_FMT_GBRAP10BE
planar GBR 4:4:4:4 40bpp, big-endian
Definition: pixfmt.h:313
SWS_ACCURATE_RND
@ SWS_ACCURATE_RND
Force bit-exact output.
Definition: swscale.h:155
AV_PIX_FMT_YUV440P12
#define AV_PIX_FMT_YUV440P12
Definition: pixfmt.h:516
h
h
Definition: vp9dsp_template.c:2070
AV_PIX_FMT_YUV444P14
#define AV_PIX_FMT_YUV444P14
Definition: pixfmt.h:520
isPlanar
static av_always_inline int isPlanar(enum AVPixelFormat pix_fmt)
Definition: swscale_internal.h:896
sws_convertPalette8ToPacked32
void sws_convertPalette8ToPacked32(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette)
Convert an 8-bit paletted frame into a frame with a color depth of 32 bits.
Definition: swscale_unscaled.c:2687
gbr24ptopacked32
static void gbr24ptopacked32(const uint8_t *src[], const int srcStride[], uint8_t *dst, int dstStride, int srcSliceH, int alpha_first, int width)
Definition: swscale_unscaled.c:1199
width
#define width
Definition: dsp.h:85
AV_PIX_FMT_GRAY12
#define AV_PIX_FMT_GRAY12
Definition: pixfmt.h:492
AV_PIX_FMT_BAYER_RGGB16
#define AV_PIX_FMT_BAYER_RGGB16
Definition: pixfmt.h:536
av_bswap16
#define av_bswap16
Definition: bswap.h:28
packed24togbrap
static void packed24togbrap(const uint8_t *src, int srcStride, uint8_t *const dst[], const int dstStride[], int srcSliceH, int width)
Definition: swscale_unscaled.c:1460
palToGbrpWrapper
static int palToGbrpWrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
Definition: swscale_unscaled.c:641
rgbToRgbWrapper
static int rgbToRgbWrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
Definition: swscale_unscaled.c:1979
AV_PIX_FMT_BAYER_GRBG8
@ AV_PIX_FMT_BAYER_GRBG8
bayer, GRGR..(odd line), BGBG..(even line), 8-bit samples
Definition: pixfmt.h:288
rgb2rgb.h
src
#define src
Definition: vp8dsp.c:248
AV_PIX_FMT_GBRAP14LE
@ AV_PIX_FMT_GBRAP14LE
planar GBR 4:4:4:4 56bpp, little-endian
Definition: pixfmt.h:433
swscale.h
AV_PIX_FMT_YUV420P14
#define AV_PIX_FMT_YUV420P14
Definition: pixfmt.h:518
isByteRGB
#define isByteRGB(f)
av_get_pix_fmt_name
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition: pixdesc.c:3164
AV_RB16
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
Definition: bytestream.h:98
isALPHA
static av_always_inline int isALPHA(enum AVPixelFormat pix_fmt)
Definition: swscale_internal.h:878
AV_PIX_FMT_BGR48BE
@ AV_PIX_FMT_BGR48BE
packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big...
Definition: pixfmt.h:145
rgb16tobgr15
void rgb16tobgr15(const uint8_t *src, uint8_t *dst, int src_size)
Definition: rgb2rgb.c:258
packedCopyWrapper
static int packedCopyWrapper(SwsInternal *c, const uint8_t *const src[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
Definition: swscale_unscaled.c:2116
AV_PIX_FMT_RGB444
#define AV_PIX_FMT_RGB444
Definition: pixfmt.h:499