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