FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libswscale
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
*/
115
typedef
void
(*
yuv2interleavedX_fn
)(
struct
SwsContext
*
c
,
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
*/
263
const
AVClass
*
av_class
;
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
*/
269
SwsFunc
swScale
;
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.
277
int
lumXInc
,
chrXInc
;
278
int
lumYInc
,
chrYInc
;
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.
283
int
dstBpc
,
srcBpc
;
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
317
uint8_t
*
formatConvBuffer
;
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
352
int
canMMXEXTBeUsed
;
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()
357
uint8_t
*
table_rV
[256 + 2*
YUVRGB_TABLE_HEADROOM
];
358
uint8_t
*
table_gU
[256 + 2*
YUVRGB_TABLE_HEADROOM
];
359
int
table_gV
[256 + 2*
YUVRGB_TABLE_HEADROOM
];
360
uint8_t
*
table_bU
[256 + 2*
YUVRGB_TABLE_HEADROOM
];
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
377
int
srcColorspaceTable
[4];
378
int
dstColorspaceTable
[4];
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).
381
int
src0Alpha
;
382
int
dst0Alpha
;
383
int
srcXYZ
;
384
int
dstXYZ
;
385
int
yuv2rgb_y_offset
;
386
int
yuv2rgb_y_coeff
;
387
int
yuv2rgb_v2r_coeff
;
388
int
yuv2rgb_v2g_coeff
;
389
int
yuv2rgb_u2g_coeff
;
390
int
yuv2rgb_u2b_coeff
;
391
392
#define RED_DITHER "0*8"
393
#define GREEN_DITHER "1*8"
394
#define BLUE_DITHER "2*8"
395
#define Y_COEFF "3*8"
396
#define VR_COEFF "4*8"
397
#define UB_COEFF "5*8"
398
#define VG_COEFF "6*8"
399
#define UG_COEFF "7*8"
400
#define Y_OFFSET "8*8"
401
#define U_OFFSET "9*8"
402
#define V_OFFSET "10*8"
403
#define LUM_MMX_FILTER_OFFSET "11*8"
404
#define CHR_MMX_FILTER_OFFSET "11*8+4*4*256"
405
#define DSTW_OFFSET "11*8+4*4*256*2" //do not change, it is hardcoded in the ASM
406
#define ESP_OFFSET "11*8+4*4*256*2+8"
407
#define VROUNDER_OFFSET "11*8+4*4*256*2+16"
408
#define U_TEMP "11*8+4*4*256*2+24"
409
#define V_TEMP "11*8+4*4*256*2+32"
410
#define Y_TEMP "11*8+4*4*256*2+40"
411
#define ALP_MMX_FILTER_OFFSET "11*8+4*4*256*2+48"
412
#define UV_OFF_PX "11*8+4*4*256*3+48"
413
#define UV_OFF_BYTE "11*8+4*4*256*3+56"
414
#define DITHER16 "11*8+4*4*256*3+64"
415
#define DITHER32 "11*8+4*4*256*3+80"
416
417
DECLARE_ALIGNED
(8, uint64_t,
redDither
);
418
DECLARE_ALIGNED
(8, uint64_t,
greenDither
);
419
DECLARE_ALIGNED
(8, uint64_t,
blueDither
);
420
421
DECLARE_ALIGNED
(8, uint64_t,
yCoeff
);
422
DECLARE_ALIGNED
(8, uint64_t,
vrCoeff
);
423
DECLARE_ALIGNED
(8, uint64_t,
ubCoeff
);
424
DECLARE_ALIGNED
(8, uint64_t,
vgCoeff
);
425
DECLARE_ALIGNED
(8, uint64_t,
ugCoeff
);
426
DECLARE_ALIGNED
(8, uint64_t,
yOffset
);
427
DECLARE_ALIGNED
(8, uint64_t,
uOffset
);
428
DECLARE_ALIGNED
(8, uint64_t,
vOffset
);
429
int32_t
lumMmxFilter
[4 *
MAX_FILTER_SIZE
];
430
int32_t
chrMmxFilter
[4 *
MAX_FILTER_SIZE
];
431
int
dstW
;
///< Width of destination luma/alpha planes.
432
DECLARE_ALIGNED
(8, uint64_t,
esp
);
433
DECLARE_ALIGNED
(8, uint64_t,
vRounder
);
434
DECLARE_ALIGNED
(8, uint64_t,
u_temp
);
435
DECLARE_ALIGNED
(8, uint64_t,
v_temp
);
436
DECLARE_ALIGNED
(8, uint64_t,
y_temp
);
437
int32_t
alpMmxFilter
[4 *
MAX_FILTER_SIZE
];
438
// alignment of these values is not necessary, but merely here
439
// to maintain the same offset across x8632 and x86-64. Once we
440
// use proper offset macros in the asm, they can be removed.
441
DECLARE_ALIGNED
(8, ptrdiff_t,
uv_off
);
///< offset (in pixels) between u and v planes
442
DECLARE_ALIGNED
(8, ptrdiff_t,
uv_offx2
);
///< offset (in bytes) between u and v planes
443
DECLARE_ALIGNED
(8, uint16_t,
dither16
)[8];
444
DECLARE_ALIGNED
(8, uint32_t,
dither32
)[8];
445
446
const
uint8_t
*
chrDither8
, *
lumDither8
;
447
448
#if HAVE_ALTIVEC
449
vector
signed
short
CY;
450
vector
signed
short
CRV;
451
vector
signed
short
CBU;
452
vector
signed
short
CGU;
453
vector
signed
short
CGV;
454
vector
signed
short
OY;
455
vector
unsigned
short
CSHIFT
;
456
vector
signed
short
*vYCoeffsBank, *vCCoeffsBank;
457
#endif
458
459
#if ARCH_BFIN
460
DECLARE_ALIGNED
(4, uint32_t, oy);
461
DECLARE_ALIGNED
(4, uint32_t, oc);
462
DECLARE_ALIGNED
(4, uint32_t,
zero
);
463
DECLARE_ALIGNED
(4, uint32_t, cy);
464
DECLARE_ALIGNED
(4, uint32_t, crv);
465
DECLARE_ALIGNED
(4, uint32_t, rmask);
466
DECLARE_ALIGNED
(4, uint32_t, cbu);
467
DECLARE_ALIGNED
(4, uint32_t, bmask);
468
DECLARE_ALIGNED
(4, uint32_t, cgu);
469
DECLARE_ALIGNED
(4, uint32_t, cgv);
470
DECLARE_ALIGNED
(4, uint32_t, gmask);
471
#endif
472
473
#if HAVE_VIS
474
DECLARE_ALIGNED
(8, uint64_t, sparc_coeffs)[10];
475
#endif
476
int
use_mmx_vfilter
;
477
478
/* pre defined color-spaces gamma */
479
#define XYZ_GAMMA (2.6f)
480
#define RGB_GAMMA (2.2f)
481
int16_t *
xyzgamma
;
482
int16_t *
rgbgamma
;
483
int16_t
xyz2rgb_matrix
[3][4];
484
485
/* function pointers for swScale() */
486
yuv2planar1_fn
yuv2plane1
;
487
yuv2planarX_fn
yuv2planeX
;
488
yuv2interleavedX_fn
yuv2nv12cX
;
489
yuv2packed1_fn
yuv2packed1
;
490
yuv2packed2_fn
yuv2packed2
;
491
yuv2packedX_fn
yuv2packedX
;
492
yuv2anyX_fn
yuv2anyX
;
493
494
/// Unscaled conversion of luma plane to YV12 for horizontal scaler.
495
void
(*
lumToYV12
)(
uint8_t
*dst,
const
uint8_t
*
src
,
const
uint8_t
*src2,
const
uint8_t
*src3,
496
int
width
, uint32_t *pal);
497
/// Unscaled conversion of alpha plane to YV12 for horizontal scaler.
498
void
(*
alpToYV12
)(
uint8_t
*dst,
const
uint8_t
*
src
,
const
uint8_t
*src2,
const
uint8_t
*src3,
499
int
width
, uint32_t *pal);
500
/// Unscaled conversion of chroma planes to YV12 for horizontal scaler.
501
void
(*
chrToYV12
)(
uint8_t
*dstU,
uint8_t
*dstV,
502
const
uint8_t
*src1,
const
uint8_t
*src2,
const
uint8_t
*src3,
503
int
width
, uint32_t *pal);
504
505
/**
506
* Functions to read planar input, such as planar RGB, and convert
507
* internally to Y/UV/A.
508
*/
509
/** @{ */
510
void
(*
readLumPlanar
)(
uint8_t
*dst,
const
uint8_t
*
src
[4],
int
width
,
int32_t
*rgb2yuv);
511
void
(*
readChrPlanar
)(
uint8_t
*dstU,
uint8_t
*dstV,
const
uint8_t
*
src
[4],
512
int
width
,
int32_t
*rgb2yuv);
513
void
(*
readAlpPlanar
)(
uint8_t
*dst,
const
uint8_t
*
src
[4],
int
width
,
int32_t
*rgb2yuv);
514
/** @} */
515
516
/**
517
* Scale one horizontal line of input data using a bilinear filter
518
* to produce one line of output data. Compared to SwsContext->hScale(),
519
* please take note of the following caveats when using these:
520
* - Scaling is done using only 7bit instead of 14bit coefficients.
521
* - You can use no more than 5 input pixels to produce 4 output
522
* pixels. Therefore, this filter should not be used for downscaling
523
* by more than ~20% in width (because that equals more than 5/4th
524
* downscaling and thus more than 5 pixels input per 4 pixels output).
525
* - In general, bilinear filters create artifacts during downscaling
526
* (even when <20%), because one output pixel will span more than one
527
* input pixel, and thus some pixels will need edges of both neighbor
528
* pixels to interpolate the output pixel. Since you can use at most
529
* two input pixels per output pixel in bilinear scaling, this is
530
* impossible and thus downscaling by any size will create artifacts.
531
* To enable this type of scaling, set SWS_FLAG_FAST_BILINEAR
532
* in SwsContext->flags.
533
*/
534
/** @{ */
535
void
(*
hyscale_fast
)(
struct
SwsContext
*
c
,
536
int16_t *dst,
int
dstWidth,
537
const
uint8_t
*
src
,
int
srcW
,
int
xInc);
538
void
(*
hcscale_fast
)(
struct
SwsContext
*
c
,
539
int16_t *dst1, int16_t *dst2,
int
dstWidth,
540
const
uint8_t
*src1,
const
uint8_t
*src2,
541
int
srcW
,
int
xInc);
542
/** @} */
543
544
/**
545
* Scale one horizontal line of input data using a filter over the input
546
* lines, to produce one (differently sized) line of output data.
547
*
548
* @param dst pointer to destination buffer for horizontally scaled
549
* data. If the number of bits per component of one
550
* destination pixel (SwsContext->dstBpc) is <= 10, data
551
* will be 15bpc in 16bits (int16_t) width. Else (i.e.
552
* SwsContext->dstBpc == 16), data will be 19bpc in
553
* 32bits (int32_t) width.
554
* @param dstW width of destination image
555
* @param src pointer to source data to be scaled. If the number of
556
* bits per component of a source pixel (SwsContext->srcBpc)
557
* is 8, this is 8bpc in 8bits (uint8_t) width. Else
558
* (i.e. SwsContext->dstBpc > 8), this is native depth
559
* in 16bits (uint16_t) width. In other words, for 9-bit
560
* YUV input, this is 9bpc, for 10-bit YUV input, this is
561
* 10bpc, and for 16-bit RGB or YUV, this is 16bpc.
562
* @param filter filter coefficients to be used per output pixel for
563
* scaling. This contains 14bpp filtering coefficients.
564
* Guaranteed to contain dstW * filterSize entries.
565
* @param filterPos position of the first input pixel to be used for
566
* each output pixel during scaling. Guaranteed to
567
* contain dstW entries.
568
* @param filterSize the number of input coefficients to be used (and
569
* thus the number of input pixels to be used) for
570
* creating a single output pixel. Is aligned to 4
571
* (and input coefficients thus padded with zeroes)
572
* to simplify creating SIMD code.
573
*/
574
/** @{ */
575
void
(*
hyScale
)(
struct
SwsContext
*
c
, int16_t *dst,
int
dstW
,
576
const
uint8_t
*
src
,
const
int16_t *
filter
,
577
const
int32_t
*filterPos,
int
filterSize);
578
void
(*
hcScale
)(
struct
SwsContext
*
c
, int16_t *dst,
int
dstW
,
579
const
uint8_t
*
src
,
const
int16_t *
filter
,
580
const
int32_t
*filterPos,
int
filterSize);
581
/** @} */
582
583
/// Color range conversion function for luma plane if needed.
584
void
(*
lumConvertRange
)(int16_t *dst,
int
width
);
585
/// Color range conversion function for chroma planes if needed.
586
void
(*
chrConvertRange
)(int16_t *dst1, int16_t *dst2,
int
width
);
587
588
int
needs_hcscale
;
///< Set if there are chroma planes to be converted.
589
}
SwsContext
;
590
//FIXME check init (where 0)
591
592
SwsFunc
ff_yuv2rgb_get_func_ptr
(
SwsContext
*c);
593
int
ff_yuv2rgb_c_init_tables
(
SwsContext
*c,
const
int
inv_table[4],
594
int
fullRange,
int
brightness
,
595
int
contrast
,
int
saturation
);
596
597
void
ff_yuv2rgb_init_tables_altivec
(
SwsContext
*c,
const
int
inv_table[4],
598
int
brightness
,
int
contrast
,
int
saturation
);
599
void
updateMMXDitherTables
(
SwsContext
*c,
int
dstY
,
int
lumBufIndex
,
int
chrBufIndex
,
600
int
lastInLumBuf
,
int
lastInChrBuf
);
601
602
SwsFunc
ff_yuv2rgb_init_mmx
(
SwsContext
*c);
603
SwsFunc
ff_yuv2rgb_init_vis
(
SwsContext
*c);
604
SwsFunc
ff_yuv2rgb_init_altivec
(
SwsContext
*c);
605
SwsFunc
ff_yuv2rgb_get_func_ptr_bfin
(
SwsContext
*c);
606
void
ff_bfin_get_unscaled_swscale
(
SwsContext
*c);
607
608
#if FF_API_SWS_FORMAT_NAME
609
/**
610
* @deprecated Use av_get_pix_fmt_name() instead.
611
*/
612
attribute_deprecated
613
const
char
*
sws_format_name
(
enum
AVPixelFormat
format);
614
#endif
615
616
static
av_always_inline
int
is16BPS
(
enum
AVPixelFormat
pix_fmt
)
617
{
618
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
619
av_assert0
(desc);
620
return
desc->
comp
[0].
depth_minus1
== 15;
621
}
622
623
static
av_always_inline
int
is9_OR_10BPS
(
enum
AVPixelFormat
pix_fmt
)
624
{
625
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
626
av_assert0
(desc);
627
return
desc->
comp
[0].
depth_minus1
>= 8 && desc->
comp
[0].
depth_minus1
<= 13;
628
}
629
630
#define isNBPS(x) is9_OR_10BPS(x)
631
632
static
av_always_inline
int
isBE
(
enum
AVPixelFormat
pix_fmt
)
633
{
634
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
635
av_assert0
(desc);
636
return
desc->
flags
&
AV_PIX_FMT_FLAG_BE
;
637
}
638
639
static
av_always_inline
int
isYUV
(
enum
AVPixelFormat
pix_fmt
)
640
{
641
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
642
av_assert0
(desc);
643
return
!(desc->
flags
&
AV_PIX_FMT_FLAG_RGB
) && desc->
nb_components
>= 2;
644
}
645
646
static
av_always_inline
int
isPlanarYUV
(
enum
AVPixelFormat
pix_fmt
)
647
{
648
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
649
av_assert0
(desc);
650
return
((desc->
flags
&
AV_PIX_FMT_FLAG_PLANAR
) &&
isYUV
(pix_fmt));
651
}
652
653
static
av_always_inline
int
isRGB
(
enum
AVPixelFormat
pix_fmt
)
654
{
655
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
656
av_assert0
(desc);
657
return
(desc->
flags
&
AV_PIX_FMT_FLAG_RGB
);
658
}
659
660
#if 0 // FIXME
661
#define isGray(x) \
662
(!(av_pix_fmt_desc_get(x)->flags & AV_PIX_FMT_FLAG_PAL) && \
663
av_pix_fmt_desc_get(x)->nb_components <= 2)
664
#else
665
#define isGray(x) \
666
((x) == AV_PIX_FMT_GRAY8 || \
667
(x) == AV_PIX_FMT_Y400A || \
668
(x) == AV_PIX_FMT_GRAY16BE || \
669
(x) == AV_PIX_FMT_GRAY16LE)
670
#endif
671
672
#define isRGBinInt(x) \
673
( \
674
(x) == AV_PIX_FMT_RGB48BE || \
675
(x) == AV_PIX_FMT_RGB48LE || \
676
(x) == AV_PIX_FMT_RGBA64BE || \
677
(x) == AV_PIX_FMT_RGBA64LE || \
678
(x) == AV_PIX_FMT_RGB32 || \
679
(x) == AV_PIX_FMT_RGB32_1 || \
680
(x) == AV_PIX_FMT_RGB24 || \
681
(x) == AV_PIX_FMT_RGB565BE || \
682
(x) == AV_PIX_FMT_RGB565LE || \
683
(x) == AV_PIX_FMT_RGB555BE || \
684
(x) == AV_PIX_FMT_RGB555LE || \
685
(x) == AV_PIX_FMT_RGB444BE || \
686
(x) == AV_PIX_FMT_RGB444LE || \
687
(x) == AV_PIX_FMT_RGB8 || \
688
(x) == AV_PIX_FMT_RGB4 || \
689
(x) == AV_PIX_FMT_RGB4_BYTE || \
690
(x) == AV_PIX_FMT_MONOBLACK || \
691
(x) == AV_PIX_FMT_MONOWHITE \
692
)
693
#define isBGRinInt(x) \
694
( \
695
(x) == AV_PIX_FMT_BGR48BE || \
696
(x) == AV_PIX_FMT_BGR48LE || \
697
(x) == AV_PIX_FMT_BGRA64BE || \
698
(x) == AV_PIX_FMT_BGRA64LE || \
699
(x) == AV_PIX_FMT_BGR32 || \
700
(x) == AV_PIX_FMT_BGR32_1 || \
701
(x) == AV_PIX_FMT_BGR24 || \
702
(x) == AV_PIX_FMT_BGR565BE || \
703
(x) == AV_PIX_FMT_BGR565LE || \
704
(x) == AV_PIX_FMT_BGR555BE || \
705
(x) == AV_PIX_FMT_BGR555LE || \
706
(x) == AV_PIX_FMT_BGR444BE || \
707
(x) == AV_PIX_FMT_BGR444LE || \
708
(x) == AV_PIX_FMT_BGR8 || \
709
(x) == AV_PIX_FMT_BGR4 || \
710
(x) == AV_PIX_FMT_BGR4_BYTE || \
711
(x) == AV_PIX_FMT_MONOBLACK || \
712
(x) == AV_PIX_FMT_MONOWHITE \
713
)
714
715
#define isRGBinBytes(x) ( \
716
(x) == AV_PIX_FMT_RGB48BE \
717
|| (x) == AV_PIX_FMT_RGB48LE \
718
|| (x) == AV_PIX_FMT_RGBA64BE \
719
|| (x) == AV_PIX_FMT_RGBA64LE \
720
|| (x) == AV_PIX_FMT_RGBA \
721
|| (x) == AV_PIX_FMT_ARGB \
722
|| (x) == AV_PIX_FMT_RGB24 \
723
)
724
#define isBGRinBytes(x) ( \
725
(x) == AV_PIX_FMT_BGR48BE \
726
|| (x) == AV_PIX_FMT_BGR48LE \
727
|| (x) == AV_PIX_FMT_BGRA64BE \
728
|| (x) == AV_PIX_FMT_BGRA64LE \
729
|| (x) == AV_PIX_FMT_BGRA \
730
|| (x) == AV_PIX_FMT_ABGR \
731
|| (x) == AV_PIX_FMT_BGR24 \
732
)
733
734
#define isAnyRGB(x) \
735
( \
736
isRGBinInt(x) || \
737
isBGRinInt(x) || \
738
isRGB(x) \
739
)
740
741
static
av_always_inline
int
isALPHA
(
enum
AVPixelFormat
pix_fmt
)
742
{
743
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
744
av_assert0
(desc);
745
if
(pix_fmt ==
AV_PIX_FMT_PAL8
)
746
return
1;
747
return
desc->
flags
&
AV_PIX_FMT_FLAG_ALPHA
;
748
}
749
750
#if 1
751
#define isPacked(x) ( \
752
(x)==AV_PIX_FMT_PAL8 \
753
|| (x)==AV_PIX_FMT_YUYV422 \
754
|| (x)==AV_PIX_FMT_UYVY422 \
755
|| (x)==AV_PIX_FMT_Y400A \
756
|| isRGBinInt(x) \
757
|| isBGRinInt(x) \
758
)
759
#else
760
static
av_always_inline
int
isPacked
(
enum
AVPixelFormat
pix_fmt
)
761
{
762
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
763
av_assert0
(desc);
764
return
((desc->
nb_components
>= 2 && !(desc->
flags
&
AV_PIX_FMT_FLAG_PLANAR
)) ||
765
pix_fmt ==
AV_PIX_FMT_PAL8
);
766
}
767
768
#endif
769
static
av_always_inline
int
isPlanar
(
enum
AVPixelFormat
pix_fmt
)
770
{
771
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
772
av_assert0
(desc);
773
return
(desc->
nb_components
>= 2 && (desc->
flags
&
AV_PIX_FMT_FLAG_PLANAR
));
774
}
775
776
static
av_always_inline
int
isPackedRGB
(
enum
AVPixelFormat
pix_fmt
)
777
{
778
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
779
av_assert0
(desc);
780
return
((desc->
flags
& (
AV_PIX_FMT_FLAG_PLANAR
|
AV_PIX_FMT_FLAG_RGB
)) ==
AV_PIX_FMT_FLAG_RGB
);
781
}
782
783
static
av_always_inline
int
isPlanarRGB
(
enum
AVPixelFormat
pix_fmt
)
784
{
785
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
786
av_assert0
(desc);
787
return
((desc->
flags
& (
AV_PIX_FMT_FLAG_PLANAR
|
AV_PIX_FMT_FLAG_RGB
)) ==
788
(
AV_PIX_FMT_FLAG_PLANAR
|
AV_PIX_FMT_FLAG_RGB
));
789
}
790
791
static
av_always_inline
int
usePal
(
enum
AVPixelFormat
pix_fmt
)
792
{
793
const
AVPixFmtDescriptor
*desc =
av_pix_fmt_desc_get
(pix_fmt);
794
av_assert0
(desc);
795
return
(desc->
flags
&
AV_PIX_FMT_FLAG_PAL
) || (desc->
flags
&
AV_PIX_FMT_FLAG_PSEUDOPAL
);
796
}
797
798
extern
const
uint64_t
ff_dither4
[2];
799
extern
const
uint64_t
ff_dither8
[2];
800
extern
const
uint8_t
dithers
[8][8][8];
801
extern
const
uint16_t
dither_scale
[15][16];
802
803
804
extern
const
AVClass
sws_context_class
;
805
806
/**
807
* Set c->swScale to an unscaled converter if one exists for the specific
808
* source and destination formats, bit depths, flags, etc.
809
*/
810
void
ff_get_unscaled_swscale
(
SwsContext
*c);
811
812
void
ff_swscale_get_unscaled_altivec
(
SwsContext
*c);
813
814
/**
815
* Return function pointer to fastest main scaler path function depending
816
* on architecture and available optimizations.
817
*/
818
SwsFunc
ff_getSwsFunc
(
SwsContext
*c);
819
820
void
ff_sws_init_input_funcs
(
SwsContext
*c);
821
void
ff_sws_init_output_funcs
(
SwsContext
*c,
822
yuv2planar1_fn
*
yuv2plane1
,
823
yuv2planarX_fn
*
yuv2planeX
,
824
yuv2interleavedX_fn
*
yuv2nv12cX
,
825
yuv2packed1_fn
*
yuv2packed1
,
826
yuv2packed2_fn
*
yuv2packed2
,
827
yuv2packedX_fn
*
yuv2packedX
,
828
yuv2anyX_fn
*
yuv2anyX
);
829
void
ff_sws_init_swScale_altivec
(
SwsContext
*c);
830
void
ff_sws_init_swScale_mmx
(
SwsContext
*c);
831
832
static
inline
void
fillPlane16
(
uint8_t
*plane,
int
stride
,
int
width
,
int
height
,
int
y
,
833
int
alpha
,
int
bits
,
const
int
big_endian)
834
{
835
int
i, j;
836
uint8_t
*ptr = plane + stride *
y
;
837
int
v
= alpha ? 0xFFFF>>(15-
bits
) : (1<<bits);
838
for
(i = 0; i <
height
; i++) {
839
#define FILL(wfunc) \
840
for (j = 0; j < width; j++) {\
841
wfunc(ptr+2*j, v);\
842
}
843
if
(big_endian) {
844
FILL
(
AV_WB16
);
845
}
else
{
846
FILL
(
AV_WL16
);
847
}
848
ptr +=
stride
;
849
}
850
}
851
852
#endif
/* SWSCALE_SWSCALE_INTERNAL_H */
Generated on Wed Jul 10 2013 23:48:17 for FFmpeg by
1.8.2