swscale_internal.h
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 #ifndef SWSCALE_SWSCALE_INTERNAL_H
22 #define SWSCALE_SWSCALE_INTERNAL_H
23 
24 #include "config.h"
25 
26 #if HAVE_ALTIVEC_H
27 #include <altivec.h>
28 #endif
29 
30 #include "libavutil/avassert.h"
31 #include "libavutil/avutil.h"
32 #include "libavutil/common.h"
33 #include "libavutil/intreadwrite.h"
34 #include "libavutil/log.h"
35 #include "libavutil/pixfmt.h"
36 #include "libavutil/pixdesc.h"
37 
38 #define STR(s) AV_TOSTRING(s) // AV_STRINGIFY is too long
39 
40 #define YUVRGB_TABLE_HEADROOM 128
41 
42 #define MAX_FILTER_SIZE 256
43 
44 #define DITHER1XBPP
45 
46 #if HAVE_BIGENDIAN
47 #define ALT32_CORR (-1)
48 #else
49 #define ALT32_CORR 1
50 #endif
51 
52 #if ARCH_X86_64
53 # define APCK_PTR2 8
54 # define APCK_COEF 16
55 # define APCK_SIZE 24
56 #else
57 # define APCK_PTR2 4
58 # define APCK_COEF 8
59 # define APCK_SIZE 16
60 #endif
61 
62 struct SwsContext;
63 
64 typedef int (*SwsFunc)(struct SwsContext *context, const uint8_t *src[],
65  int srcStride[], int srcSliceY, int srcSliceH,
66  uint8_t *dst[], int dstStride[]);
67 
68 /**
69  * Write one line of horizontally scaled data to planar output
70  * without any additional vertical scaling (or point-scaling).
71  *
72  * @param src scaled source data, 15bit for 8-10bit output,
73  * 19-bit for 16bit output (in int32_t)
74  * @param dest pointer to the output plane. For >8bit
75  * output, this is in uint16_t
76  * @param dstW width of destination in pixels
77  * @param dither ordered dither array of type int16_t and size 8
78  * @param offset Dither offset
79  */
80 typedef void (*yuv2planar1_fn)(const int16_t *src, uint8_t *dest, int dstW,
81  const uint8_t *dither, int offset);
82 
83 /**
84  * Write one line of horizontally scaled data to planar output
85  * with multi-point vertical scaling between input pixels.
86  *
87  * @param filter vertical luma/alpha scaling coefficients, 12bit [0,4096]
88  * @param src scaled luma (Y) or alpha (A) source data, 15bit for 8-10bit output,
89  * 19-bit for 16bit output (in int32_t)
90  * @param filterSize number of vertical input lines to scale
91  * @param dest pointer to output plane. For >8bit
92  * output, this is in uint16_t
93  * @param dstW width of destination pixels
94  * @param offset Dither offset
95  */
96 typedef void (*yuv2planarX_fn)(const int16_t *filter, int filterSize,
97  const int16_t **src, uint8_t *dest, int dstW,
98  const uint8_t *dither, int offset);
99 
100 /**
101  * Write one line of horizontally scaled chroma to interleaved output
102  * with multi-point vertical scaling between input pixels.
103  *
104  * @param c SWS scaling context
105  * @param chrFilter vertical chroma scaling coefficients, 12bit [0,4096]
106  * @param chrUSrc scaled chroma (U) source data, 15bit for 8-10bit output,
107  * 19-bit for 16bit output (in int32_t)
108  * @param chrVSrc scaled chroma (V) source data, 15bit for 8-10bit output,
109  * 19-bit for 16bit output (in int32_t)
110  * @param chrFilterSize number of vertical chroma input lines to scale
111  * @param dest pointer to the output plane. For >8bit
112  * output, this is in uint16_t
113  * @param dstW width of chroma planes
114  */
116  const int16_t *chrFilter,
117  int chrFilterSize,
118  const int16_t **chrUSrc,
119  const int16_t **chrVSrc,
120  uint8_t *dest, int dstW);
121 
122 /**
123  * Write one line of horizontally scaled Y/U/V/A to packed-pixel YUV/RGB
124  * output without any additional vertical scaling (or point-scaling). Note
125  * that this function may do chroma scaling, see the "uvalpha" argument.
126  *
127  * @param c SWS scaling context
128  * @param lumSrc scaled luma (Y) source data, 15bit for 8-10bit output,
129  * 19-bit for 16bit output (in int32_t)
130  * @param chrUSrc scaled chroma (U) source data, 15bit for 8-10bit output,
131  * 19-bit for 16bit output (in int32_t)
132  * @param chrVSrc scaled chroma (V) source data, 15bit for 8-10bit output,
133  * 19-bit for 16bit output (in int32_t)
134  * @param alpSrc scaled alpha (A) source data, 15bit for 8-10bit output,
135  * 19-bit for 16bit output (in int32_t)
136  * @param dest pointer to the output plane. For 16bit output, this is
137  * uint16_t
138  * @param dstW width of lumSrc and alpSrc in pixels, number of pixels
139  * to write into dest[]
140  * @param uvalpha chroma scaling coefficient for the second line of chroma
141  * pixels, either 2048 or 0. If 0, one chroma input is used
142  * for 2 output pixels (or if the SWS_FLAG_FULL_CHR_INT flag
143  * is set, it generates 1 output pixel). If 2048, two chroma
144  * input pixels should be averaged for 2 output pixels (this
145  * only happens if SWS_FLAG_FULL_CHR_INT is not set)
146  * @param y vertical line number for this output. This does not need
147  * to be used to calculate the offset in the destination,
148  * but can be used to generate comfort noise using dithering
149  * for some output formats.
150  */
151 typedef void (*yuv2packed1_fn)(struct SwsContext *c, const int16_t *lumSrc,
152  const int16_t *chrUSrc[2],
153  const int16_t *chrVSrc[2],
154  const int16_t *alpSrc, uint8_t *dest,
155  int dstW, int uvalpha, int y);
156 /**
157  * Write one line of horizontally scaled Y/U/V/A to packed-pixel YUV/RGB
158  * output by doing bilinear scaling between two input lines.
159  *
160  * @param c SWS scaling context
161  * @param lumSrc scaled luma (Y) source data, 15bit for 8-10bit output,
162  * 19-bit for 16bit output (in int32_t)
163  * @param chrUSrc scaled chroma (U) source data, 15bit for 8-10bit output,
164  * 19-bit for 16bit output (in int32_t)
165  * @param chrVSrc scaled chroma (V) source data, 15bit for 8-10bit output,
166  * 19-bit for 16bit output (in int32_t)
167  * @param alpSrc scaled alpha (A) source data, 15bit for 8-10bit output,
168  * 19-bit for 16bit output (in int32_t)
169  * @param dest pointer to the output plane. For 16bit output, this is
170  * uint16_t
171  * @param dstW width of lumSrc and alpSrc in pixels, number of pixels
172  * to write into dest[]
173  * @param yalpha luma/alpha scaling coefficients for the second input line.
174  * The first line's coefficients can be calculated by using
175  * 4096 - yalpha
176  * @param uvalpha chroma scaling coefficient for the second input line. The
177  * first line's coefficients can be calculated by using
178  * 4096 - uvalpha
179  * @param y vertical line number for this output. This does not need
180  * to be used to calculate the offset in the destination,
181  * but can be used to generate comfort noise using dithering
182  * for some output formats.
183  */
184 typedef void (*yuv2packed2_fn)(struct SwsContext *c, const int16_t *lumSrc[2],
185  const int16_t *chrUSrc[2],
186  const int16_t *chrVSrc[2],
187  const int16_t *alpSrc[2],
188  uint8_t *dest,
189  int dstW, int yalpha, int uvalpha, int y);
190 /**
191  * Write one line of horizontally scaled Y/U/V/A to packed-pixel YUV/RGB
192  * output by doing multi-point vertical scaling between input pixels.
193  *
194  * @param c SWS scaling context
195  * @param lumFilter vertical luma/alpha scaling coefficients, 12bit [0,4096]
196  * @param lumSrc scaled luma (Y) source data, 15bit for 8-10bit output,
197  * 19-bit for 16bit output (in int32_t)
198  * @param lumFilterSize number of vertical luma/alpha input lines to scale
199  * @param chrFilter vertical chroma scaling coefficients, 12bit [0,4096]
200  * @param chrUSrc scaled chroma (U) source data, 15bit for 8-10bit output,
201  * 19-bit for 16bit output (in int32_t)
202  * @param chrVSrc scaled chroma (V) source data, 15bit for 8-10bit output,
203  * 19-bit for 16bit output (in int32_t)
204  * @param chrFilterSize number of vertical chroma input lines to scale
205  * @param alpSrc scaled alpha (A) source data, 15bit for 8-10bit output,
206  * 19-bit for 16bit output (in int32_t)
207  * @param dest pointer to the output plane. For 16bit output, this is
208  * uint16_t
209  * @param dstW width of lumSrc and alpSrc in pixels, number of pixels
210  * to write into dest[]
211  * @param y vertical line number for this output. This does not need
212  * to be used to calculate the offset in the destination,
213  * but can be used to generate comfort noise using dithering
214  * or some output formats.
215  */
216 typedef void (*yuv2packedX_fn)(struct SwsContext *c, const int16_t *lumFilter,
217  const int16_t **lumSrc, int lumFilterSize,
218  const int16_t *chrFilter,
219  const int16_t **chrUSrc,
220  const int16_t **chrVSrc, int chrFilterSize,
221  const int16_t **alpSrc, uint8_t *dest,
222  int dstW, int y);
223 
224 /**
225  * Write one line of horizontally scaled Y/U/V/A to YUV/RGB
226  * output by doing multi-point vertical scaling between input pixels.
227  *
228  * @param c SWS scaling context
229  * @param lumFilter vertical luma/alpha scaling coefficients, 12bit [0,4096]
230  * @param lumSrc scaled luma (Y) source data, 15bit for 8-10bit output,
231  * 19-bit for 16bit output (in int32_t)
232  * @param lumFilterSize number of vertical luma/alpha input lines to scale
233  * @param chrFilter vertical chroma scaling coefficients, 12bit [0,4096]
234  * @param chrUSrc scaled chroma (U) source data, 15bit for 8-10bit output,
235  * 19-bit for 16bit output (in int32_t)
236  * @param chrVSrc scaled chroma (V) source data, 15bit for 8-10bit output,
237  * 19-bit for 16bit output (in int32_t)
238  * @param chrFilterSize number of vertical chroma input lines to scale
239  * @param alpSrc scaled alpha (A) source data, 15bit for 8-10bit output,
240  * 19-bit for 16bit output (in int32_t)
241  * @param dest pointer to the output planes. For 16bit output, this is
242  * uint16_t
243  * @param dstW width of lumSrc and alpSrc in pixels, number of pixels
244  * to write into dest[]
245  * @param y vertical line number for this output. This does not need
246  * to be used to calculate the offset in the destination,
247  * but can be used to generate comfort noise using dithering
248  * or some output formats.
249  */
250 typedef void (*yuv2anyX_fn)(struct SwsContext *c, const int16_t *lumFilter,
251  const int16_t **lumSrc, int lumFilterSize,
252  const int16_t *chrFilter,
253  const int16_t **chrUSrc,
254  const int16_t **chrVSrc, int chrFilterSize,
255  const int16_t **alpSrc, uint8_t **dest,
256  int dstW, int y);
257 
258 /* This struct should be aligned on at least a 32-byte boundary. */
259 typedef struct SwsContext {
260  /**
261  * info on struct for av_log
262  */
264 
265  /**
266  * Note that src, dst, srcStride, dstStride will be copied in the
267  * sws_scale() wrapper so they can be freely modified here.
268  */
270  int srcW; ///< Width of source luma/alpha planes.
271  int srcH; ///< Height of source luma/alpha planes.
272  int dstH; ///< Height of destination luma/alpha planes.
273  int chrSrcW; ///< Width of source chroma planes.
274  int chrSrcH; ///< Height of source chroma planes.
275  int chrDstW; ///< Width of destination chroma planes.
276  int chrDstH; ///< Height of destination chroma planes.
279  enum AVPixelFormat dstFormat; ///< Destination pixel format.
280  enum AVPixelFormat srcFormat; ///< Source pixel format.
281  int dstFormatBpp; ///< Number of bits per pixel of the destination pixel format.
282  int srcFormatBpp; ///< Number of bits per pixel of the source pixel format.
284  int chrSrcHSubSample; ///< Binary logarithm of horizontal subsampling factor between luma/alpha and chroma planes in source image.
285  int chrSrcVSubSample; ///< Binary logarithm of vertical subsampling factor between luma/alpha and chroma planes in source image.
286  int chrDstHSubSample; ///< Binary logarithm of horizontal subsampling factor between luma/alpha and chroma planes in destination image.
287  int chrDstVSubSample; ///< Binary logarithm of vertical subsampling factor between luma/alpha and chroma planes in destination image.
288  int vChrDrop; ///< Binary logarithm of extra vertical subsampling factor in source image chroma planes specified by user.
289  int sliceDir; ///< Direction that slices are fed to the scaler (1 = top-to-bottom, -1 = bottom-to-top).
290  double param[2]; ///< Input parameters for scaling algorithms that need them.
291 
292  uint32_t pal_yuv[256];
293  uint32_t pal_rgb[256];
294 
295  /**
296  * @name Scaled horizontal lines ring buffer.
297  * The horizontal scaler keeps just enough scaled lines in a ring buffer
298  * so they may be passed to the vertical scaler. The pointers to the
299  * allocated buffers for each line are duplicated in sequence in the ring
300  * buffer to simplify indexing and avoid wrapping around between lines
301  * inside the vertical scaler code. The wrapping is done before the
302  * vertical scaler is called.
303  */
304  //@{
305  int16_t **lumPixBuf; ///< Ring buffer for scaled horizontal luma plane lines to be fed to the vertical scaler.
306  int16_t **chrUPixBuf; ///< Ring buffer for scaled horizontal chroma plane lines to be fed to the vertical scaler.
307  int16_t **chrVPixBuf; ///< Ring buffer for scaled horizontal chroma plane lines to be fed to the vertical scaler.
308  int16_t **alpPixBuf; ///< Ring buffer for scaled horizontal alpha plane lines to be fed to the vertical scaler.
309  int vLumBufSize; ///< Number of vertical luma/alpha lines allocated in the ring buffer.
310  int vChrBufSize; ///< Number of vertical chroma lines allocated in the ring buffer.
311  int lastInLumBuf; ///< Last scaled horizontal luma/alpha line from source in the ring buffer.
312  int lastInChrBuf; ///< Last scaled horizontal chroma line from source in the ring buffer.
313  int lumBufIndex; ///< Index in ring buffer of the last scaled horizontal luma/alpha line from source.
314  int chrBufIndex; ///< Index in ring buffer of the last scaled horizontal chroma line from source.
315  //@}
316 
318 
319  /**
320  * @name Horizontal and vertical filters.
321  * To better understand the following fields, here is a pseudo-code of
322  * their usage in filtering a horizontal line:
323  * @code
324  * for (i = 0; i < width; i++) {
325  * dst[i] = 0;
326  * for (j = 0; j < filterSize; j++)
327  * dst[i] += src[ filterPos[i] + j ] * filter[ filterSize * i + j ];
328  * dst[i] >>= FRAC_BITS; // The actual implementation is fixed-point.
329  * }
330  * @endcode
331  */
332  //@{
333  int16_t *hLumFilter; ///< Array of horizontal filter coefficients for luma/alpha planes.
334  int16_t *hChrFilter; ///< Array of horizontal filter coefficients for chroma planes.
335  int16_t *vLumFilter; ///< Array of vertical filter coefficients for luma/alpha planes.
336  int16_t *vChrFilter; ///< Array of vertical filter coefficients for chroma planes.
337  int32_t *hLumFilterPos; ///< Array of horizontal filter starting positions for each dst[i] for luma/alpha planes.
338  int32_t *hChrFilterPos; ///< Array of horizontal filter starting positions for each dst[i] for chroma planes.
339  int32_t *vLumFilterPos; ///< Array of vertical filter starting positions for each dst[i] for luma/alpha planes.
340  int32_t *vChrFilterPos; ///< Array of vertical filter starting positions for each dst[i] for chroma planes.
341  int hLumFilterSize; ///< Horizontal filter size for luma/alpha pixels.
342  int hChrFilterSize; ///< Horizontal filter size for chroma pixels.
343  int vLumFilterSize; ///< Vertical filter size for luma/alpha pixels.
344  int vChrFilterSize; ///< Vertical filter size for chroma pixels.
345  //@}
346 
347  int lumMmxextFilterCodeSize; ///< Runtime-generated MMXEXT horizontal fast bilinear scaler code size for luma/alpha planes.
348  int chrMmxextFilterCodeSize; ///< Runtime-generated MMXEXT horizontal fast bilinear scaler code size for chroma planes.
349  uint8_t *lumMmxextFilterCode; ///< Runtime-generated MMXEXT horizontal fast bilinear scaler code for luma/alpha planes.
350  uint8_t *chrMmxextFilterCode; ///< Runtime-generated MMXEXT horizontal fast bilinear scaler code for chroma planes.
351 
353 
354  int dstY; ///< Last destination vertical line output from last slice.
355  int flags; ///< Flags passed by the user to select scaler algorithm, optimizations, subsampling, etc...
356  void *yuvTable; // pointer to the yuv->rgb table start so it can be freed()
361  DECLARE_ALIGNED(16, int32_t, input_rgb2yuv_table)[16+40*4]; // This table can contain both C and SIMD formatted values, teh C vales are always at the XY_IDX points
362 #define RY_IDX 0
363 #define GY_IDX 1
364 #define BY_IDX 2
365 #define RU_IDX 3
366 #define GU_IDX 4
367 #define BU_IDX 5
368 #define RV_IDX 6
369 #define GV_IDX 7
370 #define BV_IDX 8
371 #define RGB2YUV_SHIFT 15
372 
373  int *dither_error[4];
374 
375  //Colorspace stuff
376  int contrast, brightness, saturation; // for sws_getColorspaceDetails
379  int srcRange; ///< 0 = MPG YUV range, 1 = JPG YUV range (source image).
380  int dstRange; ///< 0 = MPG YUV range, 1 = JPG YUV range (destination image).
389 
390 #define RED_DITHER "0*8"
391 #define GREEN_DITHER "1*8"
392 #define BLUE_DITHER "2*8"
393 #define Y_COEFF "3*8"
394 #define VR_COEFF "4*8"
395 #define UB_COEFF "5*8"
396 #define VG_COEFF "6*8"
397 #define UG_COEFF "7*8"
398 #define Y_OFFSET "8*8"
399 #define U_OFFSET "9*8"
400 #define V_OFFSET "10*8"
401 #define LUM_MMX_FILTER_OFFSET "11*8"
402 #define CHR_MMX_FILTER_OFFSET "11*8+4*4*256"
403 #define DSTW_OFFSET "11*8+4*4*256*2" //do not change, it is hardcoded in the ASM
404 #define ESP_OFFSET "11*8+4*4*256*2+8"
405 #define VROUNDER_OFFSET "11*8+4*4*256*2+16"
406 #define U_TEMP "11*8+4*4*256*2+24"
407 #define V_TEMP "11*8+4*4*256*2+32"
408 #define Y_TEMP "11*8+4*4*256*2+40"
409 #define ALP_MMX_FILTER_OFFSET "11*8+4*4*256*2+48"
410 #define UV_OFF_PX "11*8+4*4*256*3+48"
411 #define UV_OFF_BYTE "11*8+4*4*256*3+56"
412 #define DITHER16 "11*8+4*4*256*3+64"
413 #define DITHER32 "11*8+4*4*256*3+80"
414 
415  DECLARE_ALIGNED(8, uint64_t, redDither);
416  DECLARE_ALIGNED(8, uint64_t, greenDither);
417  DECLARE_ALIGNED(8, uint64_t, blueDither);
418 
419  DECLARE_ALIGNED(8, uint64_t, yCoeff);
420  DECLARE_ALIGNED(8, uint64_t, vrCoeff);
421  DECLARE_ALIGNED(8, uint64_t, ubCoeff);
422  DECLARE_ALIGNED(8, uint64_t, vgCoeff);
423  DECLARE_ALIGNED(8, uint64_t, ugCoeff);
424  DECLARE_ALIGNED(8, uint64_t, yOffset);
425  DECLARE_ALIGNED(8, uint64_t, uOffset);
426  DECLARE_ALIGNED(8, uint64_t, vOffset);
429  int dstW; ///< Width of destination luma/alpha planes.
430  DECLARE_ALIGNED(8, uint64_t, esp);
431  DECLARE_ALIGNED(8, uint64_t, vRounder);
432  DECLARE_ALIGNED(8, uint64_t, u_temp);
433  DECLARE_ALIGNED(8, uint64_t, v_temp);
434  DECLARE_ALIGNED(8, uint64_t, y_temp);
436  // alignment of these values is not necessary, but merely here
437  // to maintain the same offset across x8632 and x86-64. Once we
438  // use proper offset macros in the asm, they can be removed.
439  DECLARE_ALIGNED(8, ptrdiff_t, uv_off); ///< offset (in pixels) between u and v planes
440  DECLARE_ALIGNED(8, ptrdiff_t, uv_offx2); ///< offset (in bytes) between u and v planes
441  DECLARE_ALIGNED(8, uint16_t, dither16)[8];
442  DECLARE_ALIGNED(8, uint32_t, dither32)[8];
443 
445 
446 #if HAVE_ALTIVEC
447  vector signed short CY;
448  vector signed short CRV;
449  vector signed short CBU;
450  vector signed short CGU;
451  vector signed short CGV;
452  vector signed short OY;
453  vector unsigned short CSHIFT;
454  vector signed short *vYCoeffsBank, *vCCoeffsBank;
455 #endif
456 
457 #if ARCH_BFIN
458  DECLARE_ALIGNED(4, uint32_t, oy);
459  DECLARE_ALIGNED(4, uint32_t, oc);
460  DECLARE_ALIGNED(4, uint32_t, zero);
461  DECLARE_ALIGNED(4, uint32_t, cy);
462  DECLARE_ALIGNED(4, uint32_t, crv);
463  DECLARE_ALIGNED(4, uint32_t, rmask);
464  DECLARE_ALIGNED(4, uint32_t, cbu);
465  DECLARE_ALIGNED(4, uint32_t, bmask);
466  DECLARE_ALIGNED(4, uint32_t, cgu);
467  DECLARE_ALIGNED(4, uint32_t, cgv);
468  DECLARE_ALIGNED(4, uint32_t, gmask);
469 #endif
470 
471 #if HAVE_VIS
472  DECLARE_ALIGNED(8, uint64_t, sparc_coeffs)[10];
473 #endif
475 
476  /* function pointers for swScale() */
484 
485  /// Unscaled conversion of luma plane to YV12 for horizontal scaler.
486  void (*lumToYV12)(uint8_t *dst, const uint8_t *src, const uint8_t *src2, const uint8_t *src3,
487  int width, uint32_t *pal);
488  /// Unscaled conversion of alpha plane to YV12 for horizontal scaler.
489  void (*alpToYV12)(uint8_t *dst, const uint8_t *src, const uint8_t *src2, const uint8_t *src3,
490  int width, uint32_t *pal);
491  /// Unscaled conversion of chroma planes to YV12 for horizontal scaler.
492  void (*chrToYV12)(uint8_t *dstU, uint8_t *dstV,
493  const uint8_t *src1, const uint8_t *src2, const uint8_t *src3,
494  int width, uint32_t *pal);
495 
496  /**
497  * Functions to read planar input, such as planar RGB, and convert
498  * internally to Y/UV.
499  */
500  /** @{ */
501  void (*readLumPlanar)(uint8_t *dst, const uint8_t *src[4], int width, int32_t *rgb2yuv);
502  void (*readChrPlanar)(uint8_t *dstU, uint8_t *dstV, const uint8_t *src[4],
503  int width, int32_t *rgb2yuv);
504  /** @} */
505 
506  /**
507  * Scale one horizontal line of input data using a bilinear filter
508  * to produce one line of output data. Compared to SwsContext->hScale(),
509  * please take note of the following caveats when using these:
510  * - Scaling is done using only 7bit instead of 14bit coefficients.
511  * - You can use no more than 5 input pixels to produce 4 output
512  * pixels. Therefore, this filter should not be used for downscaling
513  * by more than ~20% in width (because that equals more than 5/4th
514  * downscaling and thus more than 5 pixels input per 4 pixels output).
515  * - In general, bilinear filters create artifacts during downscaling
516  * (even when <20%), because one output pixel will span more than one
517  * input pixel, and thus some pixels will need edges of both neighbor
518  * pixels to interpolate the output pixel. Since you can use at most
519  * two input pixels per output pixel in bilinear scaling, this is
520  * impossible and thus downscaling by any size will create artifacts.
521  * To enable this type of scaling, set SWS_FLAG_FAST_BILINEAR
522  * in SwsContext->flags.
523  */
524  /** @{ */
526  int16_t *dst, int dstWidth,
527  const uint8_t *src, int srcW, int xInc);
529  int16_t *dst1, int16_t *dst2, int dstWidth,
530  const uint8_t *src1, const uint8_t *src2,
531  int srcW, int xInc);
532  /** @} */
533 
534  /**
535  * Scale one horizontal line of input data using a filter over the input
536  * lines, to produce one (differently sized) line of output data.
537  *
538  * @param dst pointer to destination buffer for horizontally scaled
539  * data. If the number of bits per component of one
540  * destination pixel (SwsContext->dstBpc) is <= 10, data
541  * will be 15bpc in 16bits (int16_t) width. Else (i.e.
542  * SwsContext->dstBpc == 16), data will be 19bpc in
543  * 32bits (int32_t) width.
544  * @param dstW width of destination image
545  * @param src pointer to source data to be scaled. If the number of
546  * bits per component of a source pixel (SwsContext->srcBpc)
547  * is 8, this is 8bpc in 8bits (uint8_t) width. Else
548  * (i.e. SwsContext->dstBpc > 8), this is native depth
549  * in 16bits (uint16_t) width. In other words, for 9-bit
550  * YUV input, this is 9bpc, for 10-bit YUV input, this is
551  * 10bpc, and for 16-bit RGB or YUV, this is 16bpc.
552  * @param filter filter coefficients to be used per output pixel for
553  * scaling. This contains 14bpp filtering coefficients.
554  * Guaranteed to contain dstW * filterSize entries.
555  * @param filterPos position of the first input pixel to be used for
556  * each output pixel during scaling. Guaranteed to
557  * contain dstW entries.
558  * @param filterSize the number of input coefficients to be used (and
559  * thus the number of input pixels to be used) for
560  * creating a single output pixel. Is aligned to 4
561  * (and input coefficients thus padded with zeroes)
562  * to simplify creating SIMD code.
563  */
564  /** @{ */
565  void (*hyScale)(struct SwsContext *c, int16_t *dst, int dstW,
566  const uint8_t *src, const int16_t *filter,
567  const int32_t *filterPos, int filterSize);
568  void (*hcScale)(struct SwsContext *c, int16_t *dst, int dstW,
569  const uint8_t *src, const int16_t *filter,
570  const int32_t *filterPos, int filterSize);
571  /** @} */
572 
573  /// Color range conversion function for luma plane if needed.
574  void (*lumConvertRange)(int16_t *dst, int width);
575  /// Color range conversion function for chroma planes if needed.
576  void (*chrConvertRange)(int16_t *dst1, int16_t *dst2, int width);
577 
578  int needs_hcscale; ///< Set if there are chroma planes to be converted.
579 } SwsContext;
580 //FIXME check init (where 0)
581 
583 int ff_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4],
584  int fullRange, int brightness,
585  int contrast, int saturation);
586 
587 void ff_yuv2rgb_init_tables_altivec(SwsContext *c, const int inv_table[4],
588  int brightness, int contrast, int saturation);
590  int lastInLumBuf, int lastInChrBuf);
591 
597 
598 #if FF_API_SWS_FORMAT_NAME
599 /**
600  * @deprecated Use av_get_pix_fmt_name() instead.
601  */
603 const char *sws_format_name(enum AVPixelFormat format);
604 #endif
605 
607 {
608  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
609  av_assert0(desc);
610  return desc->comp[0].depth_minus1 == 15;
611 }
612 
614 {
615  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
616  av_assert0(desc);
617  return desc->comp[0].depth_minus1 >= 8 && desc->comp[0].depth_minus1 <= 13;
618 }
619 
620 #define isNBPS(x) is9_OR_10BPS(x)
621 
623 {
624  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
625  av_assert0(desc);
626  return desc->flags & PIX_FMT_BE;
627 }
628 
630 {
631  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
632  av_assert0(desc);
633  return !(desc->flags & PIX_FMT_RGB) && desc->nb_components >= 2;
634 }
635 
637 {
638  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
639  av_assert0(desc);
640  return ((desc->flags & PIX_FMT_PLANAR) && isYUV(pix_fmt));
641 }
642 
644 {
645  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
646  av_assert0(desc);
647  return (desc->flags & PIX_FMT_RGB);
648 }
649 
650 #if 0 // FIXME
651 #define isGray(x) \
652  (!(av_pix_fmt_desc_get(x)->flags & PIX_FMT_PAL) && \
653  av_pix_fmt_desc_get(x)->nb_components <= 2)
654 #else
655 #define isGray(x) \
656  ((x) == AV_PIX_FMT_GRAY8 || \
657  (x) == AV_PIX_FMT_Y400A || \
658  (x) == AV_PIX_FMT_GRAY16BE || \
659  (x) == AV_PIX_FMT_GRAY16LE)
660 #endif
661 
662 #define isRGBinInt(x) \
663  ( \
664  (x) == AV_PIX_FMT_RGB48BE || \
665  (x) == AV_PIX_FMT_RGB48LE || \
666  (x) == AV_PIX_FMT_RGBA64BE || \
667  (x) == AV_PIX_FMT_RGBA64LE || \
668  (x) == AV_PIX_FMT_RGB32 || \
669  (x) == AV_PIX_FMT_RGB32_1 || \
670  (x) == AV_PIX_FMT_RGB24 || \
671  (x) == AV_PIX_FMT_RGB565BE || \
672  (x) == AV_PIX_FMT_RGB565LE || \
673  (x) == AV_PIX_FMT_RGB555BE || \
674  (x) == AV_PIX_FMT_RGB555LE || \
675  (x) == AV_PIX_FMT_RGB444BE || \
676  (x) == AV_PIX_FMT_RGB444LE || \
677  (x) == AV_PIX_FMT_RGB8 || \
678  (x) == AV_PIX_FMT_RGB4 || \
679  (x) == AV_PIX_FMT_RGB4_BYTE || \
680  (x) == AV_PIX_FMT_MONOBLACK || \
681  (x) == AV_PIX_FMT_MONOWHITE \
682  )
683 #define isBGRinInt(x) \
684  ( \
685  (x) == AV_PIX_FMT_BGR48BE || \
686  (x) == AV_PIX_FMT_BGR48LE || \
687  (x) == AV_PIX_FMT_BGRA64BE || \
688  (x) == AV_PIX_FMT_BGRA64LE || \
689  (x) == AV_PIX_FMT_BGR32 || \
690  (x) == AV_PIX_FMT_BGR32_1 || \
691  (x) == AV_PIX_FMT_BGR24 || \
692  (x) == AV_PIX_FMT_BGR565BE || \
693  (x) == AV_PIX_FMT_BGR565LE || \
694  (x) == AV_PIX_FMT_BGR555BE || \
695  (x) == AV_PIX_FMT_BGR555LE || \
696  (x) == AV_PIX_FMT_BGR444BE || \
697  (x) == AV_PIX_FMT_BGR444LE || \
698  (x) == AV_PIX_FMT_BGR8 || \
699  (x) == AV_PIX_FMT_BGR4 || \
700  (x) == AV_PIX_FMT_BGR4_BYTE || \
701  (x) == AV_PIX_FMT_MONOBLACK || \
702  (x) == AV_PIX_FMT_MONOWHITE \
703  )
704 
705 #define isRGBinBytes(x) ( \
706  (x) == AV_PIX_FMT_RGB48BE \
707  || (x) == AV_PIX_FMT_RGB48LE \
708  || (x) == AV_PIX_FMT_RGBA64BE \
709  || (x) == AV_PIX_FMT_RGBA64LE \
710  || (x) == AV_PIX_FMT_RGBA \
711  || (x) == AV_PIX_FMT_ARGB \
712  || (x) == AV_PIX_FMT_RGB24 \
713  )
714 #define isBGRinBytes(x) ( \
715  (x) == AV_PIX_FMT_BGR48BE \
716  || (x) == AV_PIX_FMT_BGR48LE \
717  || (x) == AV_PIX_FMT_BGRA64BE \
718  || (x) == AV_PIX_FMT_BGRA64LE \
719  || (x) == AV_PIX_FMT_BGRA \
720  || (x) == AV_PIX_FMT_ABGR \
721  || (x) == AV_PIX_FMT_BGR24 \
722  )
723 
724 #define isAnyRGB(x) \
725  ( \
726  isRGBinInt(x) || \
727  isBGRinInt(x) || \
728  isRGB(x) || \
729  (x)==AV_PIX_FMT_GBRP9LE || \
730  (x)==AV_PIX_FMT_GBRP9BE || \
731  (x)==AV_PIX_FMT_GBRP10LE || \
732  (x)==AV_PIX_FMT_GBRP10BE || \
733  (x)==AV_PIX_FMT_GBRP12LE || \
734  (x)==AV_PIX_FMT_GBRP12BE || \
735  (x)==AV_PIX_FMT_GBRP14LE || \
736  (x)==AV_PIX_FMT_GBRP14BE || \
737  (x)==AV_PIX_FMT_GBR24P \
738  )
739 
741 {
742  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
743  av_assert0(desc);
744  return desc->flags & PIX_FMT_ALPHA;
745 }
746 
747 #if 1
748 #define isPacked(x) ( \
749  (x)==AV_PIX_FMT_PAL8 \
750  || (x)==AV_PIX_FMT_YUYV422 \
751  || (x)==AV_PIX_FMT_UYVY422 \
752  || (x)==AV_PIX_FMT_Y400A \
753  || isRGBinInt(x) \
754  || isBGRinInt(x) \
755  )
756 #else
758 {
759  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
760  av_assert0(desc);
761  return ((desc->nb_components >= 2 && !(desc->flags & PIX_FMT_PLANAR)) ||
762  pix_fmt == AV_PIX_FMT_PAL8);
763 }
764 
765 #endif
767 {
768  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
769  av_assert0(desc);
770  return (desc->nb_components >= 2 && (desc->flags & PIX_FMT_PLANAR));
771 }
772 
774 {
775  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
776  av_assert0(desc);
777  return ((desc->flags & (PIX_FMT_PLANAR | PIX_FMT_RGB)) == PIX_FMT_RGB);
778 }
779 
781 {
782  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
783  av_assert0(desc);
784  return ((desc->flags & (PIX_FMT_PLANAR | PIX_FMT_RGB)) ==
786 }
787 
789 {
790  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
791  av_assert0(desc);
792  return (desc->flags & PIX_FMT_PAL) || (desc->flags & PIX_FMT_PSEUDOPAL);
793 }
794 
795 extern const uint64_t ff_dither4[2];
796 extern const uint64_t ff_dither8[2];
797 extern const uint8_t dithers[8][8][8];
798 extern const uint16_t dither_scale[15][16];
799 
800 
801 extern const AVClass sws_context_class;
802 
803 /**
804  * Set c->swScale to an unscaled converter if one exists for the specific
805  * source and destination formats, bit depths, flags, etc.
806  */
808 
810 
811 /**
812  * Return function pointer to fastest main scaler path function depending
813  * on architecture and available optimizations.
814  */
816 
828 
829 static inline void fillPlane16(uint8_t *plane, int stride, int width, int height, int y,
830  int alpha, int bits, const int big_endian)
831 {
832  int i, j;
833  uint8_t *ptr = plane + stride * y;
834  int v = alpha ? 0xFFFF>>(15-bits) : (1<<bits);
835  for (i = 0; i < height; i++) {
836 #define FILL(wfunc) \
837  for (j = 0; j < width; j++) {\
838  wfunc(ptr+2*j, v);\
839  }
840  if (big_endian) {
841  FILL(AV_WB16);
842  } else {
843  FILL(AV_WL16);
844  }
845  ptr += stride;
846  }
847 }
848 
849 #endif /* SWSCALE_SWSCALE_INTERNAL_H */
void ff_sws_init_output_funcs(SwsContext *c, yuv2planar1_fn *yuv2plane1, yuv2planarX_fn *yuv2planeX, yuv2interleavedX_fn *yuv2nv12cX, yuv2packed1_fn *yuv2packed1, yuv2packed2_fn *yuv2packed2, yuv2packedX_fn *yuv2packedX, yuv2anyX_fn *yuv2anyX)
Definition: output.c:1565
int16_t ** alpPixBuf
Ring buffer for scaled horizontal alpha plane lines to be fed to the vertical scaler.
void(* hcScale)(struct SwsContext *c, int16_t *dst, int dstW, const uint8_t *src, const int16_t *filter, const int32_t *filterPos, int filterSize)
const uint64_t ff_dither8[2]
int chrBufIndex
Index in ring buffer of the last scaled horizontal chroma line from source.
float v
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:1778
int chrSrcH
Height of source chroma planes.
static av_always_inline int isPlanarRGB(enum AVPixelFormat pix_fmt)
void(* chrConvertRange)(int16_t *dst1, int16_t *dst2, int width)
Color range conversion function for chroma planes if needed.
#define YUVRGB_TABLE_HEADROOM
uint8_t * chrMmxextFilterCode
Runtime-generated MMXEXT horizontal fast bilinear scaler code for chroma planes.
const char * sws_format_name(enum AVPixelFormat format)
uint8_t * lumMmxextFilterCode
Runtime-generated MMXEXT horizontal fast bilinear scaler code for luma/alpha planes.
uint32_t pal_rgb[256]
void updateMMXDitherTables(SwsContext *c, int dstY, int lumBufIndex, int chrBufIndex, int lastInLumBuf, int lastInChrBuf)
int vChrDrop
Binary logarithm of extra vertical subsampling factor in source image chroma planes specified by user...
int ff_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4], int fullRange, int brightness, int contrast, int saturation)
Definition: yuv2rgb.c:706
void(* chrToYV12)(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1, const uint8_t *src2, const uint8_t *src3, int width, uint32_t *pal)
Unscaled conversion of chroma planes to YV12 for horizontal scaler.
uint8_t * table_bU[256+2 *YUVRGB_TABLE_HEADROOM]
int dstFormatBpp
Number of bits per pixel of the destination pixel format.
void(* alpToYV12)(uint8_t *dst, const uint8_t *src, const uint8_t *src2, const uint8_t *src3, int width, uint32_t *pal)
Unscaled conversion of alpha plane to YV12 for horizontal scaler.
static av_always_inline int is16BPS(enum AVPixelFormat pix_fmt)
external API header
void(* hyScale)(struct SwsContext *c, int16_t *dst, int dstW, const uint8_t *src, const int16_t *filter, const int32_t *filterPos, int filterSize)
Scale one horizontal line of input data using a filter over the input lines, to produce one (differen...
int srcRange
0 = MPG YUV range, 1 = JPG YUV range (source image).
const uint8_t * lumDither8
void(* hyscale_fast)(struct SwsContext *c, int16_t *dst, int dstWidth, const uint8_t *src, int srcW, int xInc)
Scale one horizontal line of input data using a bilinear filter to produce one line of output data...
int dstY
Last destination vertical line output from last slice.
SwsFunc swScale
Note that src, dst, srcStride, dstStride will be copied in the sws_scale() wrapper so they can be fre...
int stride
Definition: mace.c:144
void ff_sws_init_input_funcs(SwsContext *c)
Definition: input.c:889
int srcH
Height of source luma/alpha planes.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
int chrDstVSubSample
Binary logarithm of vertical subsampling factor between luma/alpha and chroma planes in destination i...
uint8_t bits
Definition: crc.c:216
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition: pixdesc.h:86
uint8_t
8 bit with PIX_FMT_RGB32 palette
Definition: pixfmt.h:79
int vChrFilterSize
Vertical filter size for chroma pixels.
int16_t ** lumPixBuf
Ring buffer for scaled horizontal luma plane lines to be fed to the vertical scaler.
the mask is usually to keep the same permissions Filters should remove permissions on reference they give to output whenever necessary It can be automatically done by setting the rej_perms field on the output pad Here are a few guidelines corresponding to common then the filter should push the output frames on the output link immediately As an exception to the previous rule if the input frame is enough to produce several output frames then the filter needs output only at least one per link The additional frames can be left buffered in the filter
int lastInLumBuf
Last scaled horizontal luma/alpha line from source in the ring buffer.
void(* yuv2planar1_fn)(const int16_t *src, uint8_t *dest, int dstW, const uint8_t *dither, int offset)
Write one line of horizontally scaled data to planar output without any additional vertical scaling (...
enum AVPixelFormat pix_fmt
Definition: v4l.c:63
enum AVPixelFormat dstFormat
Destination pixel format.
uint8_t * table_gU[256+2 *YUVRGB_TABLE_HEADROOM]
int chrSrcHSubSample
Binary logarithm of horizontal subsampling factor between luma/alpha and chroma planes in source imag...
static av_always_inline int isYUV(enum AVPixelFormat pix_fmt)
yuv2packedX_fn yuv2packedX
int32_t * vChrFilterPos
Array of vertical filter starting positions for each dst[i] for chroma planes.
int dstH
Height of destination luma/alpha planes.
int * dither_error[4]
struct SwsContext SwsContext
void ff_yuv2rgb_init_tables_altivec(SwsContext *c, const int inv_table[4], int brightness, int contrast, int saturation)
yuv2anyX_fn yuv2anyX
uint16_t depth_minus1
number of bits in the component minus 1
Definition: pixdesc.h:43
static double alpha(void *priv, double x, double y)
Definition: vf_geq.c:86
const uint64_t ff_dither4[2]
int16_t ** chrVPixBuf
Ring buffer for scaled horizontal chroma plane lines to be fed to the vertical scaler.
int32_t * hChrFilterPos
Array of horizontal filter starting positions for each dst[i] for chroma planes.
int hLumFilterSize
Horizontal filter size for luma/alpha pixels.
#define AV_WL16(p, darg)
Definition: intreadwrite.h:250
#define zero
Definition: regdef.h:64
yuv2packed1_fn yuv2packed1
simple assert() macros that are a bit more flexible than ISO C assert().
#define PIX_FMT_PAL
Pixel format has a palette in data[1], values are indexes in this palette.
Definition: pixdesc.h:90
int vChrBufSize
Number of vertical chroma lines allocated in the ring buffer.
void ff_bfin_get_unscaled_swscale(SwsContext *c)
Definition: swscale_bfin.c:74
static const uint8_t offset[127][2]
Definition: vf_spp.c:70
void(* hcscale_fast)(struct SwsContext *c, int16_t *dst1, int16_t *dst2, int dstWidth, const uint8_t *src1, const uint8_t *src2, int srcW, int xInc)
int chrDstW
Width of destination chroma planes.
int32_t alpMmxFilter[4 *MAX_FILTER_SIZE]
int32_t * hLumFilterPos
Array of horizontal filter starting positions for each dst[i] for luma/alpha planes.
int hChrFilterSize
Horizontal filter size for chroma pixels.
int dstRange
0 = MPG YUV range, 1 = JPG YUV range (destination image).
uint8_t nb_components
The number of components each pixel has, (1-4)
Definition: pixdesc.h:57
#define CSHIFT
Definition: audiogen.c:72
uint8_t * formatConvBuffer
static av_always_inline int is9_OR_10BPS(enum AVPixelFormat pix_fmt)
yuv2planar1_fn yuv2plane1
int vLumBufSize
Number of vertical luma/alpha lines allocated in the ring buffer.
void(* readChrPlanar)(uint8_t *dstU, uint8_t *dstV, const uint8_t *src[4], int width, int32_t *rgb2yuv)
int16_t ** chrUPixBuf
Ring buffer for scaled horizontal chroma plane lines to be fed to the vertical scaler.
yuv2interleavedX_fn yuv2nv12cX
int32_t
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample format(the sample packing is implied by the sample format) and sample rate.The lists are not just lists
SwsFunc ff_yuv2rgb_init_mmx(SwsContext *c)
Definition: x86/yuv2rgb.c:72
int table_gV[256+2 *YUVRGB_TABLE_HEADROOM]
void(* lumConvertRange)(int16_t *dst, int width)
Color range conversion function for luma plane if needed.
uint8_t * table_rV[256+2 *YUVRGB_TABLE_HEADROOM]
int srcColorspaceTable[4]
int dstW
Width of destination luma/alpha planes.
void ff_swscale_get_unscaled_altivec(SwsContext *c)
int sliceDir
Direction that slices are fed to the scaler (1 = top-to-bottom, -1 = bottom-to-top).
int(* SwsFunc)(struct SwsContext *context, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
int needs_hcscale
Set if there are chroma planes to be converted.
int32_t * vLumFilterPos
Array of vertical filter starting positions for each dst[i] for luma/alpha planes.
static av_always_inline int isBE(enum AVPixelFormat pix_fmt)
int32_t lumMmxFilter[4 *MAX_FILTER_SIZE]
static int width
Definition: tests/utils.c:158
SwsFunc ff_getSwsFunc(SwsContext *c)
Return function pointer to fastest main scaler path function depending on architecture and available ...
Definition: swscale.c:755
dest
Definition: start.py:60
AVS_Value src
Definition: avisynth_c.h:523
int dstColorspaceTable[4]
typedef void(RENAME(mix_any_func_type))
const AVClass * av_class
info on struct for av_log
#define PIX_FMT_PLANAR
At least one pixel component is not in the first data plane.
Definition: pixdesc.h:93
void(* yuv2packedX_fn)(struct SwsContext *c, const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize, const int16_t *chrFilter, const int16_t **chrUSrc, const int16_t **chrVSrc, int chrFilterSize, const int16_t **alpSrc, uint8_t *dest, int dstW, int y)
Write one line of horizontally scaled Y/U/V/A to packed-pixel YUV/RGB output by doing multi-point ver...
static av_always_inline int isPlanar(enum AVPixelFormat pix_fmt)
uint8_t flags
Definition: pixdesc.h:76
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:55
yuv2planarX_fn yuv2planeX
void(* yuv2packed1_fn)(struct SwsContext *c, const int16_t *lumSrc, const int16_t *chrUSrc[2], const int16_t *chrVSrc[2], const int16_t *alpSrc, uint8_t *dest, int dstW, int uvalpha, int y)
Write one line of horizontally scaled Y/U/V/A to packed-pixel YUV/RGB output without any additional v...
int chrDstH
Height of destination chroma planes.
static av_always_inline int isRGB(enum AVPixelFormat pix_fmt)
BYTE int const BYTE int int int height
Definition: avisynth_c.h:713
SwsFunc ff_yuv2rgb_init_altivec(SwsContext *c)
int lumMmxextFilterCodeSize
Runtime-generated MMXEXT horizontal fast bilinear scaler code size for luma/alpha planes...
Describe the class of an AVClass context structure.
Definition: log.h:50
synthesis window for stochastic i
#define AV_WB16(p, darg)
Definition: intreadwrite.h:237
SwsFunc ff_yuv2rgb_init_vis(SwsContext *c)
Definition: yuv2rgb_vis.c:188
void(* yuv2planarX_fn)(const int16_t *filter, int filterSize, const int16_t **src, uint8_t *dest, int dstW, const uint8_t *dither, int offset)
Write one line of horizontally scaled data to planar output with multi-point vertical scaling between...
int vLumFilterSize
Vertical filter size for luma/alpha pixels.
SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c)
Definition: yuv2rgb.c:607
SwsFunc ff_yuv2rgb_get_func_ptr_bfin(SwsContext *c)
Definition: yuv2rgb_bfin.c:171
int chrMmxextFilterCodeSize
Runtime-generated MMXEXT horizontal fast bilinear scaler code size for chroma planes.
static av_always_inline int isPlanarYUV(enum AVPixelFormat pix_fmt)
static av_always_inline int isALPHA(enum AVPixelFormat pix_fmt)
int16_t * vChrFilter
Array of vertical filter coefficients for chroma planes.
int16_t * hLumFilter
Array of horizontal filter coefficients for luma/alpha planes.
static void fillPlane16(uint8_t *plane, int stride, int width, int height, int y, int alpha, int bits, const int big_endian)
const uint8_t * chrDither8
#define PIX_FMT_RGB
The pixel format contains RGB-like data (as opposed to YUV/grayscale)
Definition: pixdesc.h:94
#define attribute_deprecated
Definition: attributes.h:90
int lumBufIndex
Index in ring buffer of the last scaled horizontal luma/alpha line from source.
const uint8_t dithers[8][8][8]
int lastInChrBuf
Last scaled horizontal chroma line from source in the ring buffer.
yuv2packed2_fn yuv2packed2
double param[2]
Input parameters for scaling algorithms that need them.
common internal and external API header
static double c[64]
void(* yuv2packed2_fn)(struct SwsContext *c, const int16_t *lumSrc[2], const int16_t *chrUSrc[2], const int16_t *chrVSrc[2], const int16_t *alpSrc[2], uint8_t *dest, int dstW, int yalpha, int uvalpha, int y)
Write one line of horizontally scaled Y/U/V/A to packed-pixel YUV/RGB output by doing bilinear scalin...
enum AVPixelFormat srcFormat
Source pixel format.
#define PIX_FMT_ALPHA
The pixel format has an alpha channel.
Definition: pixdesc.h:102
int32_t chrMmxFilter[4 *MAX_FILTER_SIZE]
function y
Definition: D.m:1
void(* readLumPlanar)(uint8_t *dst, const uint8_t *src[4], int width, int32_t *rgb2yuv)
Functions to read planar input, such as planar RGB, and convert internally to Y/UV.
#define MAX_FILTER_SIZE
pixel format definitions
const AVClass sws_context_class
#define PIX_FMT_PSEUDOPAL
The pixel format is "pseudo-paletted".
Definition: pixdesc.h:100
void(* yuv2interleavedX_fn)(struct SwsContext *c, const int16_t *chrFilter, int chrFilterSize, const int16_t **chrUSrc, const int16_t **chrVSrc, uint8_t *dest, int dstW)
Write one line of horizontally scaled chroma to interleaved output with multi-point vertical scaling ...
else dst[i][x+y *dst_stride[i]]
Definition: vf_mcdeint.c:160
int srcFormatBpp
Number of bits per pixel of the source pixel format.
void(* lumToYV12)(uint8_t *dst, const uint8_t *src, const uint8_t *src2, const uint8_t *src3, int width, uint32_t *pal)
Unscaled conversion of luma plane to YV12 for horizontal scaler.
void(* yuv2anyX_fn)(struct SwsContext *c, const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize, const int16_t *chrFilter, const int16_t **chrUSrc, const int16_t **chrVSrc, int chrFilterSize, const int16_t **alpSrc, uint8_t **dest, int dstW, int y)
Write one line of horizontally scaled Y/U/V/A to YUV/RGB output by doing multi-point vertical scaling...
static av_always_inline int isPackedRGB(enum AVPixelFormat pix_fmt)
int16_t * vLumFilter
Array of vertical filter coefficients for luma/alpha planes.
void ff_sws_init_swScale_altivec(SwsContext *c)
#define av_always_inline
Definition: attributes.h:41
DECLARE_ALIGNED(16, int32_t, input_rgb2yuv_table)[16+40 *4]
void ff_sws_init_swScale_mmx(SwsContext *c)
Definition: x86/swscale.c:380
static av_always_inline int usePal(enum AVPixelFormat pix_fmt)
int16_t * hChrFilter
Array of horizontal filter coefficients for chroma planes.
int chrDstHSubSample
Binary logarithm of horizontal subsampling factor between luma/alpha and chroma planes in destination...
int chrSrcW
Width of source chroma planes.
#define isPacked(x)
void ff_get_unscaled_swscale(SwsContext *c)
Set c->swScale to an unscaled converter if one exists for the specific source and destination formats...
int srcW
Width of source luma/alpha planes.
int chrSrcVSubSample
Binary logarithm of vertical subsampling factor between luma/alpha and chroma planes in source image...
int flags
Flags passed by the user to select scaler algorithm, optimizations, subsampling, etc...
#define FILL(wfunc)
AVPixelFormat
Pixel format.
Definition: pixfmt.h:66
uint32_t pal_yuv[256]
const uint16_t dither_scale[15][16]
#define PIX_FMT_BE
Pixel format is big-endian.
Definition: pixdesc.h:89