swscale: Add GRAY10
[libav.git] / libswscale / swscale_internal.h
CommitLineData
5427e242 1/*
d026b45e
DB
2 * Copyright (C) 2001-2003 Michael Niedermayer <michaelni@gmx.at>
3 *
2912e87a 4 * This file is part of Libav.
d026b45e 5 *
2912e87a 6 * Libav is free software; you can redistribute it and/or
807e0c66
LA
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.
d026b45e 10 *
2912e87a 11 * Libav is distributed in the hope that it will be useful,
d026b45e 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
807e0c66
LA
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
d026b45e 15 *
807e0c66 16 * You should have received a copy of the GNU Lesser General Public
2912e87a 17 * License along with Libav; if not, write to the Free Software
b19bcbaa 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
d026b45e 19 */
5427e242 20
0eaf5235
SS
21#ifndef SWSCALE_SWSCALE_INTERNAL_H
22#define SWSCALE_SWSCALE_INTERNAL_H
5427e242 23
4706949c
DB
24#include "config.h"
25
0a7068fa 26#include "libavutil/avassert.h"
83da2c6f 27#include "libavutil/avutil.h"
1d9c2dc8 28#include "libavutil/common.h"
abc78a5a 29#include "libavutil/log.h"
d49ea4af 30#include "libavutil/pixfmt.h"
6b0768e2 31#include "libavutil/pixdesc.h"
ea7ee4b4 32#include "libavutil/ppc/util_altivec.h"
94c4def2 33
83890c66 34#define STR(s) AV_TOSTRING(s) // AV_STRINGIFY is too long
1625216e 35
83890c66 36#define FAST_BGR2YV12 // use 7-bit instead of 15-bit coefficients
0e1a5434 37
5427e242
MN
38#define MAX_FILTER_SIZE 256
39
a898cdc9 40#if HAVE_BIGENDIAN
9990e426
MN
41#define ALT32_CORR (-1)
42#else
43#define ALT32_CORR 1
1625216e
MN
44#endif
45
b63f641e 46#if ARCH_X86_64
83890c66 47# define APCK_PTR2 8
1625216e
MN
48# define APCK_COEF 16
49# define APCK_SIZE 24
50#else
83890c66
DB
51# define APCK_PTR2 4
52# define APCK_COEF 8
1625216e 53# define APCK_SIZE 16
9990e426
MN
54#endif
55
1615fb91
DB
56struct SwsContext;
57
83890c66 58typedef int (*SwsFunc)(struct SwsContext *context, const uint8_t *src[],
457eed72 59 int srcStride[], int srcSliceY, int srcSliceH,
83890c66 60 uint8_t *dst[], int dstStride[]);
34e8d147 61
d6cc6ac6 62/**
34e8d147 63 * Write one line of horizontally scaled data to planar output
d6cc6ac6
RB
64 * without any additional vertical scaling (or point-scaling).
65 *
41ed7ab4
VG
66 * @param src scaled source data, 15 bits for 8-10-bit output,
67 * 19 bits for 16-bit output (in int32_t)
68 * @param dest pointer to the output plane. For >8-bit
28c1115a 69 * output, this is in uint16_t
34e8d147
KK
70 * @param dstW width of destination in pixels
71 * @param dither ordered dither array of type int16_t and size 8
72 * @param offset Dither offset
d6cc6ac6 73 */
83890c66
DB
74typedef void (*yuv2planar1_fn)(const int16_t *src, uint8_t *dest, int dstW,
75 const uint8_t *dither, int offset);
34e8d147 76
d6cc6ac6 77/**
ff7913ae 78 * Write one line of horizontally scaled data to planar output
d6cc6ac6
RB
79 * with multi-point vertical scaling between input pixels.
80 *
41ed7ab4
VG
81 * @param filter vertical luma/alpha scaling coefficients, 12 bits [0,4096]
82 * @param src scaled luma (Y) or alpha (A) source data, 15 bits for
83 * 8-10-bit output, 19 bits for 16-bit output (in int32_t)
ff7913ae 84 * @param filterSize number of vertical input lines to scale
41ed7ab4 85 * @param dest pointer to output plane. For >8-bit
ff7913ae
KK
86 * output, this is in uint16_t
87 * @param dstW width of destination pixels
88 * @param offset Dither offset
89 */
83890c66
DB
90typedef void (*yuv2planarX_fn)(const int16_t *filter, int filterSize,
91 const int16_t **src, uint8_t *dest, int dstW,
92 const uint8_t *dither, int offset);
ff7913ae
KK
93
94/**
95 * Write one line of horizontally scaled chroma to interleaved output
96 * with multi-point vertical scaling between input pixels.
97 *
98 * @param c SWS scaling context
41ed7ab4
VG
99 * @param chrFilter vertical chroma scaling coefficients, 12 bits [0,4096]
100 * @param chrUSrc scaled chroma (U) source data, 15 bits for 8-10-bit
101 * output, 19 bits for 16-bit output (in int32_t)
102 * @param chrVSrc scaled chroma (V) source data, 15 bits for 8-10-bit
103 * output, 19 bits for 16-bit output (in int32_t)
d6cc6ac6 104 * @param chrFilterSize number of vertical chroma input lines to scale
41ed7ab4 105 * @param dest pointer to the output plane. For >8-bit
28c1115a 106 * output, this is in uint16_t
ff7913ae 107 * @param dstW width of chroma planes
d6cc6ac6 108 */
83890c66
DB
109typedef void (*yuv2interleavedX_fn)(struct SwsContext *c,
110 const int16_t *chrFilter,
111 int chrFilterSize,
112 const int16_t **chrUSrc,
113 const int16_t **chrVSrc,
114 uint8_t *dest, int dstW);
ff7913ae 115
d6cc6ac6
RB
116/**
117 * Write one line of horizontally scaled Y/U/V/A to packed-pixel YUV/RGB
118 * output without any additional vertical scaling (or point-scaling). Note
119 * that this function may do chroma scaling, see the "uvalpha" argument.
120 *
121 * @param c SWS scaling context
41ed7ab4
VG
122 * @param lumSrc scaled luma (Y) source data, 15 bits for 8-10-bit output,
123 * 19 bits for 16-bit output (in int32_t)
124 * @param chrUSrc scaled chroma (U) source data, 15 bits for 8-10-bit output,
125 * 19 bits for 16-bit output (in int32_t)
126 * @param chrVSrc scaled chroma (V) source data, 15 bits for 8-10-bit output,
127 * 19 bits for 16-bit output (in int32_t)
128 * @param alpSrc scaled alpha (A) source data, 15 bits for 8-10-bit output,
129 * 19 bits for 16-bit output (in int32_t)
130 * @param dest pointer to the output plane. For 16-bit output, this is
28c1115a 131 * uint16_t
d6cc6ac6
RB
132 * @param dstW width of lumSrc and alpSrc in pixels, number of pixels
133 * to write into dest[]
134 * @param uvalpha chroma scaling coefficient for the second line of chroma
135 * pixels, either 2048 or 0. If 0, one chroma input is used
136 * for 2 output pixels (or if the SWS_FLAG_FULL_CHR_INT flag
137 * is set, it generates 1 output pixel). If 2048, two chroma
138 * input pixels should be averaged for 2 output pixels (this
139 * only happens if SWS_FLAG_FULL_CHR_INT is not set)
140 * @param y vertical line number for this output. This does not need
141 * to be used to calculate the offset in the destination,
142 * but can be used to generate comfort noise using dithering
143 * for some output formats.
144 */
83890c66
DB
145typedef void (*yuv2packed1_fn)(struct SwsContext *c, const int16_t *lumSrc,
146 const int16_t *chrUSrc[2],
147 const int16_t *chrVSrc[2],
148 const int16_t *alpSrc, uint8_t *dest,
149 int dstW, int uvalpha, int y);
d6cc6ac6
RB
150/**
151 * Write one line of horizontally scaled Y/U/V/A to packed-pixel YUV/RGB
152 * output by doing bilinear scaling between two input lines.
153 *
154 * @param c SWS scaling context
41ed7ab4
VG
155 * @param lumSrc scaled luma (Y) source data, 15 bits for 8-10-bit output,
156 * 19 bits for 16-bit output (in int32_t)
157 * @param chrUSrc scaled chroma (U) source data, 15 bits for 8-10-bit output,
158 * 19 bits for 16-bit output (in int32_t)
159 * @param chrVSrc scaled chroma (V) source data, 15 bits for 8-10-bit output,
160 * 19 bits for 16-bit output (in int32_t)
161 * @param alpSrc scaled alpha (A) source data, 15 bits for 8-10-bit output,
162 * 19 bits for 16-bit output (in int32_t)
163 * @param dest pointer to the output plane. For 16-bit output, this is
28c1115a 164 * uint16_t
d6cc6ac6
RB
165 * @param dstW width of lumSrc and alpSrc in pixels, number of pixels
166 * to write into dest[]
167 * @param yalpha luma/alpha scaling coefficients for the second input line.
168 * The first line's coefficients can be calculated by using
169 * 4096 - yalpha
170 * @param uvalpha chroma scaling coefficient for the second input line. The
171 * first line's coefficients can be calculated by using
172 * 4096 - uvalpha
173 * @param y vertical line number for this output. This does not need
174 * to be used to calculate the offset in the destination,
175 * but can be used to generate comfort noise using dithering
176 * for some output formats.
177 */
83890c66
DB
178typedef void (*yuv2packed2_fn)(struct SwsContext *c, const int16_t *lumSrc[2],
179 const int16_t *chrUSrc[2],
180 const int16_t *chrVSrc[2],
181 const int16_t *alpSrc[2],
182 uint8_t *dest,
183 int dstW, int yalpha, int uvalpha, int y);
d6cc6ac6
RB
184/**
185 * Write one line of horizontally scaled Y/U/V/A to packed-pixel YUV/RGB
186 * output by doing multi-point vertical scaling between input pixels.
187 *
188 * @param c SWS scaling context
41ed7ab4
VG
189 * @param lumFilter vertical luma/alpha scaling coefficients, 12 bits [0,4096]
190 * @param lumSrc scaled luma (Y) source data, 15 bits for 8-10-bit output,
191 * 19 bits for 16-bit output (in int32_t)
d6cc6ac6 192 * @param lumFilterSize number of vertical luma/alpha input lines to scale
41ed7ab4
VG
193 * @param chrFilter vertical chroma scaling coefficients, 12 bits [0,4096]
194 * @param chrUSrc scaled chroma (U) source data, 15 bits for 8-10-bit output,
195 * 19 bits for 16-bit output (in int32_t)
196 * @param chrVSrc scaled chroma (V) source data, 15 bits for 8-10-bit output,
197 * 19 bits for 16-bit output (in int32_t)
d6cc6ac6 198 * @param chrFilterSize number of vertical chroma input lines to scale
41ed7ab4
VG
199 * @param alpSrc scaled alpha (A) source data, 15 bits for 8-10-bit output,
200 * 19 bits for 16-bit output (in int32_t)
201 * @param dest pointer to the output plane. For 16-bit output, this is
28c1115a 202 * uint16_t
d6cc6ac6
RB
203 * @param dstW width of lumSrc and alpSrc in pixels, number of pixels
204 * to write into dest[]
205 * @param y vertical line number for this output. This does not need
206 * to be used to calculate the offset in the destination,
207 * but can be used to generate comfort noise using dithering
208 * or some output formats.
209 */
83890c66
DB
210typedef void (*yuv2packedX_fn)(struct SwsContext *c, const int16_t *lumFilter,
211 const int16_t **lumSrc, int lumFilterSize,
212 const int16_t *chrFilter,
213 const int16_t **chrUSrc,
214 const int16_t **chrVSrc, int chrFilterSize,
215 const int16_t **alpSrc, uint8_t *dest,
216 int dstW, int y);
b73fe700 217
4eb93bed
MN
218/**
219 * Write one line of horizontally scaled Y/U/V/A to YUV/RGB
220 * output by doing multi-point vertical scaling between input pixels.
221 *
222 * @param c SWS scaling context
41ed7ab4
VG
223 * @param lumFilter vertical luma/alpha scaling coefficients, 12 bits [0,4096]
224 * @param lumSrc scaled luma (Y) source data, 15 bits for 8-10-bit output,
225 * 19 bits for 16-bit output (in int32_t)
4eb93bed 226 * @param lumFilterSize number of vertical luma/alpha input lines to scale
41ed7ab4
VG
227 * @param chrFilter vertical chroma scaling coefficients, 12 bits [0,4096]
228 * @param chrUSrc scaled chroma (U) source data, 15 bits for 8-10-bit output,
229 * 19 bits for 16-bit output (in int32_t)
230 * @param chrVSrc scaled chroma (V) source data, 15 bits for 8-10-bit output,
231 * 19 bits for 16-bit output (in int32_t)
4eb93bed 232 * @param chrFilterSize number of vertical chroma input lines to scale
41ed7ab4
VG
233 * @param alpSrc scaled alpha (A) source data, 15 bits for 8-10-bit output,
234 * 19 bits for 16-bit output (in int32_t)
235 * @param dest pointer to the output planes. For 16-bit output, this is
4eb93bed
MN
236 * uint16_t
237 * @param dstW width of lumSrc and alpSrc in pixels, number of pixels
238 * to write into dest[]
239 * @param y vertical line number for this output. This does not need
240 * to be used to calculate the offset in the destination,
241 * but can be used to generate comfort noise using dithering
242 * or some output formats.
243 */
244typedef void (*yuv2anyX_fn)(struct SwsContext *c, const int16_t *lumFilter,
245 const int16_t **lumSrc, int lumFilterSize,
246 const int16_t *chrFilter,
247 const int16_t **chrUSrc,
248 const int16_t **chrVSrc, int chrFilterSize,
249 const int16_t **alpSrc, uint8_t **dest,
250 int dstW, int y);
251
8a322796 252/* This struct should be aligned on at least a 32-byte boundary. */
dd68318c 253typedef struct SwsContext {
221b804f
DB
254 /**
255 * info on struct for av_log
256 */
635a8cd2 257 const AVClass *av_class;
221b804f
DB
258
259 /**
56b69633
DB
260 * Note that src, dst, srcStride, dstStride will be copied in the
261 * sws_scale() wrapper so they can be freely modified here.
221b804f 262 */
1909f6b1 263 SwsFunc swscale;
9556124c
RP
264 int srcW; ///< Width of source luma/alpha planes.
265 int srcH; ///< Height of source luma/alpha planes.
266 int dstH; ///< Height of destination luma/alpha planes.
267 int chrSrcW; ///< Width of source chroma planes.
268 int chrSrcH; ///< Height of source chroma planes.
269 int chrDstW; ///< Width of destination chroma planes.
270 int chrDstH; ///< Height of destination chroma planes.
221b804f
DB
271 int lumXInc, chrXInc;
272 int lumYInc, chrYInc;
716d413c
AK
273 enum AVPixelFormat dstFormat; ///< Destination pixel format.
274 enum AVPixelFormat srcFormat; ///< Source pixel format.
30b61475
SS
275 int dstFormatBpp; ///< Number of bits per pixel of the destination pixel format.
276 int srcFormatBpp; ///< Number of bits per pixel of the source pixel format.
28c1115a 277 int dstBpc, srcBpc;
5d4d503f
RP
278 int chrSrcHSubSample; ///< Binary logarithm of horizontal subsampling factor between luma/alpha and chroma planes in source image.
279 int chrSrcVSubSample; ///< Binary logarithm of vertical subsampling factor between luma/alpha and chroma planes in source image.
280 int chrDstHSubSample; ///< Binary logarithm of horizontal subsampling factor between luma/alpha and chroma planes in destination image.
281 int chrDstVSubSample; ///< Binary logarithm of vertical subsampling factor between luma/alpha and chroma planes in destination image.
282 int vChrDrop; ///< Binary logarithm of extra vertical subsampling factor in source image chroma planes specified by user.
283 int sliceDir; ///< Direction that slices are fed to the scaler (1 = top-to-bottom, -1 = bottom-to-top).
9556124c 284 double param[2]; ///< Input parameters for scaling algorithms that need them.
221b804f 285
49004617
VS
286 uint32_t pal_yuv[256];
287 uint32_t pal_rgb[256];
288
5d4d503f
RP
289 /**
290 * @name Scaled horizontal lines ring buffer.
291 * The horizontal scaler keeps just enough scaled lines in a ring buffer
292 * so they may be passed to the vertical scaler. The pointers to the
293 * allocated buffers for each line are duplicated in sequence in the ring
294 * buffer to simplify indexing and avoid wrapping around between lines
295 * inside the vertical scaler code. The wrapping is done before the
296 * vertical scaler is called.
297 */
298 //@{
299 int16_t **lumPixBuf; ///< Ring buffer for scaled horizontal luma plane lines to be fed to the vertical scaler.
b4a224c5
RB
300 int16_t **chrUPixBuf; ///< Ring buffer for scaled horizontal chroma plane lines to be fed to the vertical scaler.
301 int16_t **chrVPixBuf; ///< Ring buffer for scaled horizontal chroma plane lines to be fed to the vertical scaler.
5d4d503f 302 int16_t **alpPixBuf; ///< Ring buffer for scaled horizontal alpha plane lines to be fed to the vertical scaler.
83890c66
DB
303 int vLumBufSize; ///< Number of vertical luma/alpha lines allocated in the ring buffer.
304 int vChrBufSize; ///< Number of vertical chroma lines allocated in the ring buffer.
305 int lastInLumBuf; ///< Last scaled horizontal luma/alpha line from source in the ring buffer.
306 int lastInChrBuf; ///< Last scaled horizontal chroma line from source in the ring buffer.
307 int lumBufIndex; ///< Index in ring buffer of the last scaled horizontal luma/alpha line from source.
308 int chrBufIndex; ///< Index in ring buffer of the last scaled horizontal chroma line from source.
5d4d503f 309 //@}
221b804f 310
69645c02 311 uint8_t *formatConvBuffer;
221b804f 312
5d4d503f
RP
313 /**
314 * @name Horizontal and vertical filters.
315 * To better understand the following fields, here is a pseudo-code of
316 * their usage in filtering a horizontal line:
317 * @code
318 * for (i = 0; i < width; i++) {
319 * dst[i] = 0;
320 * for (j = 0; j < filterSize; j++)
321 * dst[i] += src[ filterPos[i] + j ] * filter[ filterSize * i + j ];
322 * dst[i] >>= FRAC_BITS; // The actual implementation is fixed-point.
323 * }
324 * @endcode
325 */
326 //@{
327 int16_t *hLumFilter; ///< Array of horizontal filter coefficients for luma/alpha planes.
328 int16_t *hChrFilter; ///< Array of horizontal filter coefficients for chroma planes.
329 int16_t *vLumFilter; ///< Array of vertical filter coefficients for luma/alpha planes.
330 int16_t *vChrFilter; ///< Array of vertical filter coefficients for chroma planes.
2254b559
RB
331 int32_t *hLumFilterPos; ///< Array of horizontal filter starting positions for each dst[i] for luma/alpha planes.
332 int32_t *hChrFilterPos; ///< Array of horizontal filter starting positions for each dst[i] for chroma planes.
333 int32_t *vLumFilterPos; ///< Array of vertical filter starting positions for each dst[i] for luma/alpha planes.
334 int32_t *vChrFilterPos; ///< Array of vertical filter starting positions for each dst[i] for chroma planes.
83890c66
DB
335 int hLumFilterSize; ///< Horizontal filter size for luma/alpha pixels.
336 int hChrFilterSize; ///< Horizontal filter size for chroma pixels.
337 int vLumFilterSize; ///< Vertical filter size for luma/alpha pixels.
338 int vChrFilterSize; ///< Vertical filter size for chroma pixels.
5d4d503f 339 //@}
221b804f 340
a65bdceb
DB
341 int lumMmxextFilterCodeSize; ///< Runtime-generated MMXEXT horizontal fast bilinear scaler code size for luma/alpha planes.
342 int chrMmxextFilterCodeSize; ///< Runtime-generated MMXEXT horizontal fast bilinear scaler code size for chroma planes.
343 uint8_t *lumMmxextFilterCode; ///< Runtime-generated MMXEXT horizontal fast bilinear scaler code for luma/alpha planes.
344 uint8_t *chrMmxextFilterCode; ///< Runtime-generated MMXEXT horizontal fast bilinear scaler code for chroma planes.
221b804f 345
a65bdceb 346 int canMMXEXTBeUsed;
221b804f 347
9556124c
RP
348 int dstY; ///< Last destination vertical line output from last slice.
349 int flags; ///< Flags passed by the user to select scaler algorithm, optimizations, subsampling, etc...
83890c66
DB
350 void *yuvTable; // pointer to the yuv->rgb table start so it can be freed()
351 uint8_t *table_rV[256];
352 uint8_t *table_gU[256];
353 int table_gV[256];
354 uint8_t *table_bU[256];
221b804f
DB
355
356 //Colorspace stuff
357 int contrast, brightness, saturation; // for sws_getColorspaceDetails
358 int srcColorspaceTable[4];
359 int dstColorspaceTable[4];
9556124c
RP
360 int srcRange; ///< 0 = MPG YUV range, 1 = JPG YUV range (source image).
361 int dstRange; ///< 0 = MPG YUV range, 1 = JPG YUV range (destination image).
43c16478
MN
362 int yuv2rgb_y_offset;
363 int yuv2rgb_y_coeff;
364 int yuv2rgb_v2r_coeff;
365 int yuv2rgb_v2g_coeff;
366 int yuv2rgb_u2g_coeff;
367 int yuv2rgb_u2b_coeff;
221b804f
DB
368
369#define RED_DITHER "0*8"
370#define GREEN_DITHER "1*8"
371#define BLUE_DITHER "2*8"
372#define Y_COEFF "3*8"
373#define VR_COEFF "4*8"
374#define UB_COEFF "5*8"
375#define VG_COEFF "6*8"
376#define UG_COEFF "7*8"
377#define Y_OFFSET "8*8"
378#define U_OFFSET "9*8"
379#define V_OFFSET "10*8"
8bae9ddc
MN
380#define LUM_MMX_FILTER_OFFSET "11*8"
381#define CHR_MMX_FILTER_OFFSET "11*8+4*4*256"
8a322796 382#define DSTW_OFFSET "11*8+4*4*256*2" //do not change, it is hardcoded in the ASM
221b804f
DB
383#define ESP_OFFSET "11*8+4*4*256*2+8"
384#define VROUNDER_OFFSET "11*8+4*4*256*2+16"
385#define U_TEMP "11*8+4*4*256*2+24"
386#define V_TEMP "11*8+4*4*256*2+32"
6858492e 387#define Y_TEMP "11*8+4*4*256*2+40"
b18f8cbf
RB
388#define ALP_MMX_FILTER_OFFSET "11*8+4*4*256*2+48"
389#define UV_OFF_PX "11*8+4*4*256*3+48"
390#define UV_OFF_BYTE "11*8+4*4*256*3+56"
391#define DITHER16 "11*8+4*4*256*3+64"
392#define DITHER32 "11*8+4*4*256*3+80"
221b804f 393
92db6235
PP
394 DECLARE_ALIGNED(8, uint64_t, redDither);
395 DECLARE_ALIGNED(8, uint64_t, greenDither);
396 DECLARE_ALIGNED(8, uint64_t, blueDither);
397
398 DECLARE_ALIGNED(8, uint64_t, yCoeff);
399 DECLARE_ALIGNED(8, uint64_t, vrCoeff);
400 DECLARE_ALIGNED(8, uint64_t, ubCoeff);
401 DECLARE_ALIGNED(8, uint64_t, vgCoeff);
402 DECLARE_ALIGNED(8, uint64_t, ugCoeff);
403 DECLARE_ALIGNED(8, uint64_t, yOffset);
404 DECLARE_ALIGNED(8, uint64_t, uOffset);
405 DECLARE_ALIGNED(8, uint64_t, vOffset);
83890c66
DB
406 int32_t lumMmxFilter[4 * MAX_FILTER_SIZE];
407 int32_t chrMmxFilter[4 * MAX_FILTER_SIZE];
5d4d503f 408 int dstW; ///< Width of destination luma/alpha planes.
92db6235
PP
409 DECLARE_ALIGNED(8, uint64_t, esp);
410 DECLARE_ALIGNED(8, uint64_t, vRounder);
411 DECLARE_ALIGNED(8, uint64_t, u_temp);
412 DECLARE_ALIGNED(8, uint64_t, v_temp);
413 DECLARE_ALIGNED(8, uint64_t, y_temp);
b18f8cbf 414 int32_t alpMmxFilter[4 * MAX_FILTER_SIZE];
142e76f1
AM
415 // alignment of these values is not necessary, but merely here
416 // to maintain the same offset across x8632 and x86-64. Once we
417 // use proper offset macros in the asm, they can be removed.
5c391a16
RB
418 DECLARE_ALIGNED(8, ptrdiff_t, uv_off_px); ///< offset (in pixels) between u and v planes
419 DECLARE_ALIGNED(8, ptrdiff_t, uv_off_byte); ///< offset (in bytes) between u and v planes
142e76f1
AM
420 DECLARE_ALIGNED(8, uint16_t, dither16)[8];
421 DECLARE_ALIGNED(8, uint32_t, dither32)[8];
4e3e333a
RB
422
423 const uint8_t *chrDither8, *lumDither8;
a31de956 424
b63f641e 425#if HAVE_ALTIVEC
d3243d14
RP
426 vector signed short CY;
427 vector signed short CRV;
428 vector signed short CBU;
429 vector signed short CGU;
430 vector signed short CGV;
431 vector signed short OY;
432 vector unsigned short CSHIFT;
83890c66 433 vector signed short *vYCoeffsBank, *vCCoeffsBank;
a31de956
MN
434#endif
435
1909f6b1 436 /* function pointers for swscale() */
109f62e8
RB
437 yuv2planar1_fn yuv2plane1;
438 yuv2planarX_fn yuv2planeX;
439 yuv2interleavedX_fn yuv2nv12cX;
b73fe700
RB
440 yuv2packed1_fn yuv2packed1;
441 yuv2packed2_fn yuv2packed2;
442 yuv2packedX_fn yuv2packedX;
4eb93bed 443 yuv2anyX_fn yuv2anyX;
40fa5140 444
83890c66 445 /// Unscaled conversion of luma plane to YV12 for horizontal scaler.
bb53e1d1 446 void (*lumToYV12)(uint8_t *dst, const uint8_t *src,
83890c66
DB
447 int width, uint32_t *pal);
448 /// Unscaled conversion of alpha plane to YV12 for horizontal scaler.
bb53e1d1 449 void (*alpToYV12)(uint8_t *dst, const uint8_t *src,
83890c66
DB
450 int width, uint32_t *pal);
451 /// Unscaled conversion of chroma planes to YV12 for horizontal scaler.
bb53e1d1
RP
452 void (*chrToYV12)(uint8_t *dstU, uint8_t *dstV,
453 const uint8_t *src1, const uint8_t *src2,
83890c66 454 int width, uint32_t *pal);
185655c6
RB
455
456 /**
83890c66 457 * Functions to read planar input, such as planar RGB, and convert
92806167 458 * internally to Y/UV/A.
83890c66 459 */
185655c6
RB
460 /** @{ */
461 void (*readLumPlanar)(uint8_t *dst, const uint8_t *src[4], int width);
83890c66
DB
462 void (*readChrPlanar)(uint8_t *dstU, uint8_t *dstV, const uint8_t *src[4],
463 int width);
92806167 464 void (*readAlpPlanar)(uint8_t *dst, const uint8_t *src[4], int width);
185655c6
RB
465 /** @} */
466
4578435f
RB
467 /**
468 * Scale one horizontal line of input data using a bilinear filter
469 * to produce one line of output data. Compared to SwsContext->hScale(),
470 * please take note of the following caveats when using these:
41ed7ab4 471 * - Scaling is done using only 7 bits instead of 14-bit coefficients.
4578435f
RB
472 * - You can use no more than 5 input pixels to produce 4 output
473 * pixels. Therefore, this filter should not be used for downscaling
474 * by more than ~20% in width (because that equals more than 5/4th
475 * downscaling and thus more than 5 pixels input per 4 pixels output).
476 * - In general, bilinear filters create artifacts during downscaling
477 * (even when <20%), because one output pixel will span more than one
478 * input pixel, and thus some pixels will need edges of both neighbor
479 * pixels to interpolate the output pixel. Since you can use at most
480 * two input pixels per output pixel in bilinear scaling, this is
481 * impossible and thus downscaling by any size will create artifacts.
482 * To enable this type of scaling, set SWS_FLAG_FAST_BILINEAR
483 * in SwsContext->flags.
484 */
485 /** @{ */
40fa5140 486 void (*hyscale_fast)(struct SwsContext *c,
b8e89339 487 int16_t *dst, int dstWidth,
40fa5140
RP
488 const uint8_t *src, int srcW, int xInc);
489 void (*hcscale_fast)(struct SwsContext *c,
b8e89339 490 int16_t *dst1, int16_t *dst2, int dstWidth,
457eed72
DB
491 const uint8_t *src1, const uint8_t *src2,
492 int srcW, int xInc);
4578435f 493 /** @} */
40fa5140 494
4578435f
RB
495 /**
496 * Scale one horizontal line of input data using a filter over the input
497 * lines, to produce one (differently sized) line of output data.
498 *
499 * @param dst pointer to destination buffer for horizontally scaled
28c1115a
RB
500 * data. If the number of bits per component of one
501 * destination pixel (SwsContext->dstBpc) is <= 10, data
41ed7ab4 502 * will be 15 bpc in 16 bits (int16_t) width. Else (i.e.
28c1115a 503 * SwsContext->dstBpc == 16), data will be 19bpc in
41ed7ab4 504 * 32 bits (int32_t) width.
4578435f 505 * @param dstW width of destination image
28c1115a
RB
506 * @param src pointer to source data to be scaled. If the number of
507 * bits per component of a source pixel (SwsContext->srcBpc)
41ed7ab4 508 * is 8, this is 8bpc in 8 bits (uint8_t) width. Else
28c1115a 509 * (i.e. SwsContext->dstBpc > 8), this is native depth
41ed7ab4 510 * in 16 bits (uint16_t) width. In other words, for 9-bit
28c1115a
RB
511 * YUV input, this is 9bpc, for 10-bit YUV input, this is
512 * 10bpc, and for 16-bit RGB or YUV, this is 16bpc.
4578435f
RB
513 * @param filter filter coefficients to be used per output pixel for
514 * scaling. This contains 14bpp filtering coefficients.
515 * Guaranteed to contain dstW * filterSize entries.
516 * @param filterPos position of the first input pixel to be used for
517 * each output pixel during scaling. Guaranteed to
518 * contain dstW entries.
519 * @param filterSize the number of input coefficients to be used (and
520 * thus the number of input pixels to be used) for
521 * creating a single output pixel. Is aligned to 4
522 * (and input coefficients thus padded with zeroes)
523 * to simplify creating SIMD code.
524 */
3f04ab4f 525 /** @{ */
83890c66
DB
526 void (*hyScale)(struct SwsContext *c, int16_t *dst, int dstW,
527 const uint8_t *src, const int16_t *filter,
2254b559 528 const int32_t *filterPos, int filterSize);
83890c66
DB
529 void (*hcScale)(struct SwsContext *c, int16_t *dst, int dstW,
530 const uint8_t *src, const int16_t *filter,
2254b559 531 const int32_t *filterPos, int filterSize);
3f04ab4f 532 /** @} */
40fa5140 533
83890c66
DB
534 /// Color range conversion function for luma plane if needed.
535 void (*lumConvertRange)(int16_t *dst, int width);
536 /// Color range conversion function for chroma planes if needed.
537 void (*chrConvertRange)(int16_t *dst1, int16_t *dst2, int width);
bae76dc3 538
e7a47515 539 int needs_hcscale; ///< Set if there are chroma planes to be converted.
5427e242
MN
540} SwsContext;
541//FIXME check init (where 0)
5427e242 542
780daf2b 543SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c);
457eed72
DB
544int ff_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4],
545 int fullRange, int brightness,
546 int contrast, int saturation);
c2503d9c
DB
547void ff_yuv2rgb_init_tables_ppc(SwsContext *c, const int inv_table[4],
548 int brightness, int contrast, int saturation);
5427e242 549
983260b0
RB
550void updateMMXDitherTables(SwsContext *c, int dstY, int lumBufIndex, int chrBufIndex,
551 int lastInLumBuf, int lastInChrBuf);
552
a5195839 553SwsFunc ff_yuv2rgb_init_x86(SwsContext *c);
c2503d9c 554SwsFunc ff_yuv2rgb_init_ppc(SwsContext *c);
c95a3a9f 555
716d413c 556const char *sws_format_name(enum AVPixelFormat format);
94c4def2 557
0a7068fa
AK
558static av_always_inline int is16BPS(enum AVPixelFormat pix_fmt)
559{
560 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
561 av_assert0(desc);
2268db2c 562 return desc->comp[0].depth == 16;
0a7068fa
AK
563}
564
2b5b1e1e 565static av_always_inline int is9_15BPS(enum AVPixelFormat pix_fmt)
0a7068fa
AK
566{
567 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
568 av_assert0(desc);
e87a501e 569 return desc->comp[0].depth >= 9 && desc->comp[0].depth <= 15;
0a7068fa
AK
570}
571
572static av_always_inline int isBE(enum AVPixelFormat pix_fmt)
573{
574 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
575 av_assert0(desc);
e6c4ac7b 576 return desc->flags & AV_PIX_FMT_FLAG_BE;
0a7068fa
AK
577}
578
579static av_always_inline int isYUV(enum AVPixelFormat pix_fmt)
580{
581 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
582 av_assert0(desc);
e6c4ac7b 583 return !(desc->flags & AV_PIX_FMT_FLAG_RGB) && desc->nb_components >= 2;
0a7068fa
AK
584}
585
586static av_always_inline int isPlanarYUV(enum AVPixelFormat pix_fmt)
587{
588 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
589 av_assert0(desc);
e6c4ac7b 590 return ((desc->flags & AV_PIX_FMT_FLAG_PLANAR) && isYUV(pix_fmt));
0a7068fa
AK
591}
592
593static av_always_inline int isRGB(enum AVPixelFormat pix_fmt)
594{
595 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
596 av_assert0(desc);
e6c4ac7b 597 return (desc->flags & AV_PIX_FMT_FLAG_RGB);
0a7068fa 598}
6b0768e2 599
83890c66 600#define isGray(x) \
716d413c 601 ((x) == AV_PIX_FMT_GRAY8 || \
e96c3b81 602 (x) == AV_PIX_FMT_YA8 || \
f149a4a5
CEH
603 (x) == AV_PIX_FMT_GRAY10BE || \
604 (x) == AV_PIX_FMT_GRAY10LE || \
ab839054
LB
605 (x) == AV_PIX_FMT_GRAY12BE || \
606 (x) == AV_PIX_FMT_GRAY12LE || \
716d413c 607 (x) == AV_PIX_FMT_GRAY16BE || \
f84a1b59
VG
608 (x) == AV_PIX_FMT_GRAY16LE || \
609 (x) == AV_PIX_FMT_YA16BE || \
610 (x) == AV_PIX_FMT_YA16LE)
6b0768e2 611
83890c66 612#define isRGBinInt(x) \
716d413c
AK
613 ((x) == AV_PIX_FMT_RGB48BE || \
614 (x) == AV_PIX_FMT_RGB48LE || \
615 (x) == AV_PIX_FMT_RGB32 || \
616 (x) == AV_PIX_FMT_RGB32_1 || \
617 (x) == AV_PIX_FMT_RGB24 || \
618 (x) == AV_PIX_FMT_RGB565BE || \
619 (x) == AV_PIX_FMT_RGB565LE || \
620 (x) == AV_PIX_FMT_RGB555BE || \
621 (x) == AV_PIX_FMT_RGB555LE || \
622 (x) == AV_PIX_FMT_RGB444BE || \
623 (x) == AV_PIX_FMT_RGB444LE || \
624 (x) == AV_PIX_FMT_RGB8 || \
625 (x) == AV_PIX_FMT_RGB4 || \
626 (x) == AV_PIX_FMT_RGB4_BYTE || \
1481d24c
JF
627 (x) == AV_PIX_FMT_RGBA64BE || \
628 (x) == AV_PIX_FMT_RGBA64LE || \
716d413c
AK
629 (x) == AV_PIX_FMT_MONOBLACK || \
630 (x) == AV_PIX_FMT_MONOWHITE)
83890c66
DB
631
632#define isBGRinInt(x) \
716d413c
AK
633 ((x) == AV_PIX_FMT_BGR48BE || \
634 (x) == AV_PIX_FMT_BGR48LE || \
635 (x) == AV_PIX_FMT_BGR32 || \
636 (x) == AV_PIX_FMT_BGR32_1 || \
637 (x) == AV_PIX_FMT_BGR24 || \
638 (x) == AV_PIX_FMT_BGR565BE || \
639 (x) == AV_PIX_FMT_BGR565LE || \
640 (x) == AV_PIX_FMT_BGR555BE || \
641 (x) == AV_PIX_FMT_BGR555LE || \
642 (x) == AV_PIX_FMT_BGR444BE || \
643 (x) == AV_PIX_FMT_BGR444LE || \
644 (x) == AV_PIX_FMT_BGR8 || \
645 (x) == AV_PIX_FMT_BGR4 || \
646 (x) == AV_PIX_FMT_BGR4_BYTE || \
1481d24c
JF
647 (x) == AV_PIX_FMT_BGRA64BE || \
648 (x) == AV_PIX_FMT_BGRA64LE || \
716d413c
AK
649 (x) == AV_PIX_FMT_MONOBLACK || \
650 (x) == AV_PIX_FMT_MONOWHITE)
83890c66
DB
651
652#define isAnyRGB(x) \
653 (isRGBinInt(x) || \
654 isBGRinInt(x))
655
0a7068fa
AK
656static av_always_inline int isALPHA(enum AVPixelFormat pix_fmt)
657{
658 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
659 av_assert0(desc);
660 return desc->nb_components == 2 || desc->nb_components == 4;
661}
662
663static av_always_inline int isPacked(enum AVPixelFormat pix_fmt)
664{
665 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
666 av_assert0(desc);
e6c4ac7b 667 return ((desc->nb_components >= 2 && !(desc->flags & AV_PIX_FMT_FLAG_PLANAR)) ||
0a7068fa
AK
668 pix_fmt == AV_PIX_FMT_PAL8);
669}
670
671static av_always_inline int isPlanar(enum AVPixelFormat pix_fmt)
672{
673 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
674 av_assert0(desc);
e6c4ac7b 675 return (desc->nb_components >= 2 && (desc->flags & AV_PIX_FMT_FLAG_PLANAR));
0a7068fa
AK
676}
677
678static av_always_inline int isPackedRGB(enum AVPixelFormat pix_fmt)
679{
680 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
681 av_assert0(desc);
e6c4ac7b 682 return ((desc->flags & (AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB)) == AV_PIX_FMT_FLAG_RGB);
0a7068fa
AK
683}
684
685static av_always_inline int isPlanarRGB(enum AVPixelFormat pix_fmt)
686{
687 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
688 av_assert0(desc);
e6c4ac7b
AK
689 return ((desc->flags & (AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB)) ==
690 (AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB));
0a7068fa
AK
691}
692
693static av_always_inline int usePal(enum AVPixelFormat pix_fmt)
694{
695 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
696 av_assert0(desc);
e6c4ac7b 697 return ((desc->flags & AV_PIX_FMT_FLAG_PAL) || (desc->flags & AV_PIX_FMT_FLAG_PSEUDOPAL) ||
e96c3b81 698 pix_fmt == AV_PIX_FMT_YA8);
0a7068fa 699}
e9e12f0e 700
43175f50
DB
701extern const uint64_t ff_dither4[2];
702extern const uint64_t ff_dither8[2];
0cb25594 703
aa2ba8c9
DB
704extern const uint8_t ff_dither_4x4_16[4][8];
705extern const uint8_t ff_dither_8x8_32[8][8];
706extern const uint8_t ff_dither_8x8_73[8][8];
707extern const uint8_t ff_dither_8x8_128[8][8];
708extern const uint8_t ff_dither_8x8_220[8][8];
709
710extern const int32_t ff_yuv2rgb_coeffs[8][4];
711
c0fd2fb2 712extern const AVClass ff_sws_context_class;
e40b183d 713
a4388ebd 714/**
1909f6b1 715 * Set c->swscale to an unscaled converter if one exists for the specific
a4388ebd
RP
716 * source and destination formats, bit depths, flags, etc.
717 */
718void ff_get_unscaled_swscale(SwsContext *c);
3aa682f2 719void ff_get_unscaled_swscale_ppc(SwsContext *c);
0e5d31b1 720
a4388ebd 721/**
58c42af7 722 * Return function pointer to fastest main scaler path function depending
a4388ebd
RP
723 * on architecture and available optimizations.
724 */
725SwsFunc ff_getSwsFunc(SwsContext *c);
726
2dd7a1c0 727void ff_sws_init_input_funcs(SwsContext *c);
21449410
RB
728void ff_sws_init_output_funcs(SwsContext *c,
729 yuv2planar1_fn *yuv2plane1,
730 yuv2planarX_fn *yuv2planeX,
731 yuv2interleavedX_fn *yuv2nv12cX,
732 yuv2packed1_fn *yuv2packed1,
733 yuv2packed2_fn *yuv2packed2,
4eb93bed
MN
734 yuv2packedX_fn *yuv2packedX,
735 yuv2anyX_fn *yuv2anyX);
c2503d9c 736void ff_sws_init_swscale_ppc(SwsContext *c);
a5195839 737void ff_sws_init_swscale_x86(SwsContext *c);
67d80a54 738
0eaf5235 739#endif /* SWSCALE_SWSCALE_INTERNAL_H */