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