ffmpeg / libswscale / swscale_internal.h @ bae76dc3
History | View | Annotate | Download (14.7 KB)
1 |
/*
|
---|---|
2 |
* Copyright (C) 2001-2003 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/avutil.h" |
31 |
|
32 |
#define STR(s) AV_TOSTRING(s) //AV_STRINGIFY is too long |
33 |
|
34 |
#define MAX_FILTER_SIZE 256 |
35 |
|
36 |
#if ARCH_X86
|
37 |
#define VOFW 5120 |
38 |
#else
|
39 |
#define VOFW 2048 // faster on PPC and not tested on others |
40 |
#endif
|
41 |
|
42 |
#define VOF (VOFW*2) |
43 |
|
44 |
#if HAVE_BIGENDIAN
|
45 |
#define ALT32_CORR (-1) |
46 |
#else
|
47 |
#define ALT32_CORR 1 |
48 |
#endif
|
49 |
|
50 |
#if ARCH_X86_64
|
51 |
# define APCK_PTR2 8 |
52 |
# define APCK_COEF 16 |
53 |
# define APCK_SIZE 24 |
54 |
#else
|
55 |
# define APCK_PTR2 4 |
56 |
# define APCK_COEF 8 |
57 |
# define APCK_SIZE 16 |
58 |
#endif
|
59 |
|
60 |
struct SwsContext;
|
61 |
|
62 |
typedef int (*SwsFunc)(struct SwsContext *context, uint8_t* src[], |
63 |
int srcStride[], int srcSliceY, int srcSliceH, |
64 |
uint8_t* dst[], int dstStride[]);
|
65 |
|
66 |
/* This struct should be aligned on at least a 32-byte boundary. */
|
67 |
typedef struct SwsContext { |
68 |
/**
|
69 |
* info on struct for av_log
|
70 |
*/
|
71 |
const AVClass *av_class;
|
72 |
|
73 |
/**
|
74 |
* Note that src, dst, srcStride, dstStride will be copied in the
|
75 |
* sws_scale() wrapper so they can be freely modified here.
|
76 |
*/
|
77 |
SwsFunc swScale; |
78 |
int srcW, srcH, dstH;
|
79 |
int chrSrcW, chrSrcH, chrDstW, chrDstH;
|
80 |
int lumXInc, chrXInc;
|
81 |
int lumYInc, chrYInc;
|
82 |
enum PixelFormat dstFormat, srcFormat; ///< format 4:2:0 type is always YV12 |
83 |
int origDstFormat, origSrcFormat; ///< format |
84 |
int chrSrcHSubSample, chrSrcVSubSample;
|
85 |
int chrDstHSubSample, chrDstVSubSample;
|
86 |
int vChrDrop;
|
87 |
int sliceDir;
|
88 |
double param[2]; |
89 |
|
90 |
uint32_t pal_yuv[256];
|
91 |
uint32_t pal_rgb[256];
|
92 |
|
93 |
int16_t **lumPixBuf; |
94 |
int16_t **chrPixBuf; |
95 |
int16_t **alpPixBuf; |
96 |
int16_t *hLumFilter; |
97 |
int16_t *hLumFilterPos; |
98 |
int16_t *hChrFilter; |
99 |
int16_t *hChrFilterPos; |
100 |
int16_t *vLumFilter; |
101 |
int16_t *vLumFilterPos; |
102 |
int16_t *vChrFilter; |
103 |
int16_t *vChrFilterPos; |
104 |
|
105 |
uint8_t formatConvBuffer[VOF]; //FIXME dynamic allocation, but we have to change a lot of code for this to be useful
|
106 |
|
107 |
int hLumFilterSize;
|
108 |
int hChrFilterSize;
|
109 |
int vLumFilterSize;
|
110 |
int vChrFilterSize;
|
111 |
int vLumBufSize;
|
112 |
int vChrBufSize;
|
113 |
|
114 |
int lumMmx2FilterCodeSize;
|
115 |
int chrMmx2FilterCodeSize;
|
116 |
uint8_t *lumMmx2FilterCode; |
117 |
uint8_t *chrMmx2FilterCode; |
118 |
int32_t *lumMmx2FilterPos; |
119 |
int32_t *chrMmx2FilterPos; |
120 |
int16_t *lumMmx2Filter; |
121 |
int16_t *chrMmx2Filter; |
122 |
|
123 |
int canMMX2BeUsed;
|
124 |
|
125 |
int lastInLumBuf;
|
126 |
int lastInChrBuf;
|
127 |
int lumBufIndex;
|
128 |
int chrBufIndex;
|
129 |
int dstY;
|
130 |
int flags;
|
131 |
void * yuvTable; // pointer to the yuv->rgb table start so it can be freed() |
132 |
uint8_t * table_rV[256];
|
133 |
uint8_t * table_gU[256];
|
134 |
int table_gV[256]; |
135 |
uint8_t * table_bU[256];
|
136 |
|
137 |
//Colorspace stuff
|
138 |
int contrast, brightness, saturation; // for sws_getColorspaceDetails |
139 |
int srcColorspaceTable[4]; |
140 |
int dstColorspaceTable[4]; |
141 |
int srcRange, dstRange;
|
142 |
int yuv2rgb_y_offset;
|
143 |
int yuv2rgb_y_coeff;
|
144 |
int yuv2rgb_v2r_coeff;
|
145 |
int yuv2rgb_v2g_coeff;
|
146 |
int yuv2rgb_u2g_coeff;
|
147 |
int yuv2rgb_u2b_coeff;
|
148 |
|
149 |
#define RED_DITHER "0*8" |
150 |
#define GREEN_DITHER "1*8" |
151 |
#define BLUE_DITHER "2*8" |
152 |
#define Y_COEFF "3*8" |
153 |
#define VR_COEFF "4*8" |
154 |
#define UB_COEFF "5*8" |
155 |
#define VG_COEFF "6*8" |
156 |
#define UG_COEFF "7*8" |
157 |
#define Y_OFFSET "8*8" |
158 |
#define U_OFFSET "9*8" |
159 |
#define V_OFFSET "10*8" |
160 |
#define LUM_MMX_FILTER_OFFSET "11*8" |
161 |
#define CHR_MMX_FILTER_OFFSET "11*8+4*4*256" |
162 |
#define DSTW_OFFSET "11*8+4*4*256*2" //do not change, it is hardcoded in the ASM |
163 |
#define ESP_OFFSET "11*8+4*4*256*2+8" |
164 |
#define VROUNDER_OFFSET "11*8+4*4*256*2+16" |
165 |
#define U_TEMP "11*8+4*4*256*2+24" |
166 |
#define V_TEMP "11*8+4*4*256*2+32" |
167 |
#define Y_TEMP "11*8+4*4*256*2+40" |
168 |
#define ALP_MMX_FILTER_OFFSET "11*8+4*4*256*2+48" |
169 |
|
170 |
DECLARE_ALIGNED(8, uint64_t, redDither);
|
171 |
DECLARE_ALIGNED(8, uint64_t, greenDither);
|
172 |
DECLARE_ALIGNED(8, uint64_t, blueDither);
|
173 |
|
174 |
DECLARE_ALIGNED(8, uint64_t, yCoeff);
|
175 |
DECLARE_ALIGNED(8, uint64_t, vrCoeff);
|
176 |
DECLARE_ALIGNED(8, uint64_t, ubCoeff);
|
177 |
DECLARE_ALIGNED(8, uint64_t, vgCoeff);
|
178 |
DECLARE_ALIGNED(8, uint64_t, ugCoeff);
|
179 |
DECLARE_ALIGNED(8, uint64_t, yOffset);
|
180 |
DECLARE_ALIGNED(8, uint64_t, uOffset);
|
181 |
DECLARE_ALIGNED(8, uint64_t, vOffset);
|
182 |
int32_t lumMmxFilter[4*MAX_FILTER_SIZE];
|
183 |
int32_t chrMmxFilter[4*MAX_FILTER_SIZE];
|
184 |
int dstW;
|
185 |
DECLARE_ALIGNED(8, uint64_t, esp);
|
186 |
DECLARE_ALIGNED(8, uint64_t, vRounder);
|
187 |
DECLARE_ALIGNED(8, uint64_t, u_temp);
|
188 |
DECLARE_ALIGNED(8, uint64_t, v_temp);
|
189 |
DECLARE_ALIGNED(8, uint64_t, y_temp);
|
190 |
int32_t alpMmxFilter[4*MAX_FILTER_SIZE];
|
191 |
|
192 |
#if HAVE_ALTIVEC
|
193 |
vector signed short CY; |
194 |
vector signed short CRV; |
195 |
vector signed short CBU; |
196 |
vector signed short CGU; |
197 |
vector signed short CGV; |
198 |
vector signed short OY; |
199 |
vector unsigned short CSHIFT; |
200 |
vector signed short *vYCoeffsBank, *vCCoeffsBank; |
201 |
#endif
|
202 |
|
203 |
#if ARCH_BFIN
|
204 |
DECLARE_ALIGNED(4, uint32_t, oy);
|
205 |
DECLARE_ALIGNED(4, uint32_t, oc);
|
206 |
DECLARE_ALIGNED(4, uint32_t, zero);
|
207 |
DECLARE_ALIGNED(4, uint32_t, cy);
|
208 |
DECLARE_ALIGNED(4, uint32_t, crv);
|
209 |
DECLARE_ALIGNED(4, uint32_t, rmask);
|
210 |
DECLARE_ALIGNED(4, uint32_t, cbu);
|
211 |
DECLARE_ALIGNED(4, uint32_t, bmask);
|
212 |
DECLARE_ALIGNED(4, uint32_t, cgu);
|
213 |
DECLARE_ALIGNED(4, uint32_t, cgv);
|
214 |
DECLARE_ALIGNED(4, uint32_t, gmask);
|
215 |
#endif
|
216 |
|
217 |
#if HAVE_VIS
|
218 |
DECLARE_ALIGNED(8, uint64_t, sparc_coeffs[10]); |
219 |
#endif
|
220 |
|
221 |
/* function pointers for swScale() */
|
222 |
void (*yuv2nv12X )(struct SwsContext *c, |
223 |
const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize, |
224 |
const int16_t *chrFilter, const int16_t **chrSrc, int chrFilterSize, |
225 |
uint8_t *dest, uint8_t *uDest, |
226 |
int dstW, int chrDstW, int dstFormat); |
227 |
void (*yuv2yuv1 )(struct SwsContext *c, |
228 |
const int16_t *lumSrc, const int16_t *chrSrc, const int16_t *alpSrc, |
229 |
uint8_t *dest, |
230 |
uint8_t *uDest, uint8_t *vDest, uint8_t *aDest, |
231 |
long dstW, long chrDstW); |
232 |
void (*yuv2yuvX )(struct SwsContext *c, |
233 |
const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize, |
234 |
const int16_t *chrFilter, const int16_t **chrSrc, int chrFilterSize, |
235 |
const int16_t **alpSrc,
|
236 |
uint8_t *dest, |
237 |
uint8_t *uDest, uint8_t *vDest, uint8_t *aDest, |
238 |
long dstW, long chrDstW); |
239 |
void (*yuv2packed1)(struct SwsContext *c, |
240 |
const uint16_t *buf0,
|
241 |
const uint16_t *uvbuf0, const uint16_t *uvbuf1, |
242 |
const uint16_t *abuf0,
|
243 |
uint8_t *dest, |
244 |
int dstW, int uvalpha, int dstFormat, int flags, int y); |
245 |
void (*yuv2packed2)(struct SwsContext *c, |
246 |
const uint16_t *buf0, const uint16_t *buf1, |
247 |
const uint16_t *uvbuf0, const uint16_t *uvbuf1, |
248 |
const uint16_t *abuf0, const uint16_t *abuf1, |
249 |
uint8_t *dest, |
250 |
int dstW, int yalpha, int uvalpha, int y); |
251 |
void (*yuv2packedX)(struct SwsContext *c, |
252 |
const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize, |
253 |
const int16_t *chrFilter, const int16_t **chrSrc, int chrFilterSize, |
254 |
const int16_t **alpSrc, uint8_t *dest,
|
255 |
long dstW, long dstY); |
256 |
|
257 |
void (*hyscale_internal)(uint8_t *dst, const uint8_t *src, |
258 |
long width, uint32_t *pal);
|
259 |
void (*hascale_internal)(uint8_t *dst, const uint8_t *src, |
260 |
long width, uint32_t *pal);
|
261 |
void (*hcscale_internal)(uint8_t *dstU, uint8_t *dstV,
|
262 |
const uint8_t *src1, const uint8_t *src2, |
263 |
long width, uint32_t *pal);
|
264 |
void (*hyscale_fast)(struct SwsContext *c, |
265 |
int16_t *dst, int dstWidth,
|
266 |
const uint8_t *src, int srcW, int xInc); |
267 |
void (*hcscale_fast)(struct SwsContext *c, |
268 |
int16_t *dst, int dstWidth,
|
269 |
const uint8_t *src1, const uint8_t *src2, |
270 |
int srcW, int xInc); |
271 |
|
272 |
void (*hScale)(int16_t *dst, int dstW, const uint8_t *src, int srcW, |
273 |
int xInc, const int16_t *filter, const int16_t *filterPos, |
274 |
long filterSize);
|
275 |
|
276 |
void (*lumConvertRange)(uint16_t *dst, int width); ///< Color range conversion function for luma plane if needed. |
277 |
void (*chrConvertRange)(uint16_t *dst, int width); ///< Color range conversion function for chroma planes if needed. |
278 |
|
279 |
int lumSrcOffset; ///< Offset given to luma src pointers passed to horizontal input functions. |
280 |
int chrSrcOffset; ///< Offset given to chroma src pointers passed to horizontal input functions. |
281 |
int alpSrcOffset; ///< Offset given to alpha src pointers passed to horizontal input functions. |
282 |
|
283 |
} SwsContext; |
284 |
//FIXME check init (where 0)
|
285 |
|
286 |
SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c); |
287 |
int ff_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4], |
288 |
int fullRange, int brightness, |
289 |
int contrast, int saturation); |
290 |
|
291 |
void ff_yuv2rgb_init_tables_altivec(SwsContext *c, const int inv_table[4], |
292 |
int brightness, int contrast, int saturation); |
293 |
SwsFunc ff_yuv2rgb_init_mmx(SwsContext *c); |
294 |
SwsFunc ff_yuv2rgb_init_vis(SwsContext *c); |
295 |
SwsFunc ff_yuv2rgb_init_mlib(SwsContext *c); |
296 |
SwsFunc ff_yuv2rgb_init_altivec(SwsContext *c); |
297 |
SwsFunc ff_yuv2rgb_get_func_ptr_bfin(SwsContext *c); |
298 |
void ff_bfin_get_unscaled_swscale(SwsContext *c);
|
299 |
void ff_yuv2packedX_altivec(SwsContext *c,
|
300 |
const int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize, |
301 |
const int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize, |
302 |
uint8_t *dest, int dstW, int dstY); |
303 |
|
304 |
const char *sws_format_name(enum PixelFormat format); |
305 |
|
306 |
//FIXME replace this with something faster
|
307 |
#define is16BPS(x) ( \
|
308 |
(x)==PIX_FMT_GRAY16BE \ |
309 |
|| (x)==PIX_FMT_GRAY16LE \ |
310 |
|| (x)==PIX_FMT_RGB48BE \ |
311 |
|| (x)==PIX_FMT_RGB48LE \ |
312 |
|| (x)==PIX_FMT_YUV420P16LE \ |
313 |
|| (x)==PIX_FMT_YUV422P16LE \ |
314 |
|| (x)==PIX_FMT_YUV444P16LE \ |
315 |
|| (x)==PIX_FMT_YUV420P16BE \ |
316 |
|| (x)==PIX_FMT_YUV422P16BE \ |
317 |
|| (x)==PIX_FMT_YUV444P16BE \ |
318 |
) |
319 |
#define isBE(x) ((x)&1) |
320 |
#define isPlanar8YUV(x) ( \
|
321 |
(x)==PIX_FMT_YUV410P \ |
322 |
|| (x)==PIX_FMT_YUV420P \ |
323 |
|| (x)==PIX_FMT_YUVA420P \ |
324 |
|| (x)==PIX_FMT_YUV411P \ |
325 |
|| (x)==PIX_FMT_YUV422P \ |
326 |
|| (x)==PIX_FMT_YUV444P \ |
327 |
|| (x)==PIX_FMT_YUV440P \ |
328 |
|| (x)==PIX_FMT_NV12 \ |
329 |
|| (x)==PIX_FMT_NV21 \ |
330 |
) |
331 |
#define isPlanarYUV(x) ( \
|
332 |
isPlanar8YUV(x) \ |
333 |
|| (x)==PIX_FMT_YUV420P16LE \ |
334 |
|| (x)==PIX_FMT_YUV422P16LE \ |
335 |
|| (x)==PIX_FMT_YUV444P16LE \ |
336 |
|| (x)==PIX_FMT_YUV420P16BE \ |
337 |
|| (x)==PIX_FMT_YUV422P16BE \ |
338 |
|| (x)==PIX_FMT_YUV444P16BE \ |
339 |
) |
340 |
#define isYUV(x) ( \
|
341 |
(x)==PIX_FMT_UYVY422 \ |
342 |
|| (x)==PIX_FMT_YUYV422 \ |
343 |
|| isPlanarYUV(x) \ |
344 |
) |
345 |
#define isGray(x) ( \
|
346 |
(x)==PIX_FMT_GRAY8 \ |
347 |
|| (x)==PIX_FMT_GRAY16BE \ |
348 |
|| (x)==PIX_FMT_GRAY16LE \ |
349 |
) |
350 |
#define isGray16(x) ( \
|
351 |
(x)==PIX_FMT_GRAY16BE \ |
352 |
|| (x)==PIX_FMT_GRAY16LE \ |
353 |
) |
354 |
#define isRGB(x) ( \
|
355 |
(x)==PIX_FMT_RGB48BE \ |
356 |
|| (x)==PIX_FMT_RGB48LE \ |
357 |
|| (x)==PIX_FMT_RGB32 \ |
358 |
|| (x)==PIX_FMT_RGB32_1 \ |
359 |
|| (x)==PIX_FMT_RGB24 \ |
360 |
|| (x)==PIX_FMT_RGB565 \ |
361 |
|| (x)==PIX_FMT_RGB555 \ |
362 |
|| (x)==PIX_FMT_RGB8 \ |
363 |
|| (x)==PIX_FMT_RGB4 \ |
364 |
|| (x)==PIX_FMT_RGB4_BYTE \ |
365 |
|| (x)==PIX_FMT_MONOBLACK \ |
366 |
|| (x)==PIX_FMT_MONOWHITE \ |
367 |
) |
368 |
#define isBGR(x) ( \
|
369 |
(x)==PIX_FMT_BGR32 \ |
370 |
|| (x)==PIX_FMT_BGR32_1 \ |
371 |
|| (x)==PIX_FMT_BGR24 \ |
372 |
|| (x)==PIX_FMT_BGR565 \ |
373 |
|| (x)==PIX_FMT_BGR555 \ |
374 |
|| (x)==PIX_FMT_BGR8 \ |
375 |
|| (x)==PIX_FMT_BGR4 \ |
376 |
|| (x)==PIX_FMT_BGR4_BYTE \ |
377 |
|| (x)==PIX_FMT_MONOBLACK \ |
378 |
|| (x)==PIX_FMT_MONOWHITE \ |
379 |
) |
380 |
#define isALPHA(x) ( \
|
381 |
(x)==PIX_FMT_BGR32 \ |
382 |
|| (x)==PIX_FMT_BGR32_1 \ |
383 |
|| (x)==PIX_FMT_RGB32 \ |
384 |
|| (x)==PIX_FMT_RGB32_1 \ |
385 |
|| (x)==PIX_FMT_YUVA420P \ |
386 |
) |
387 |
|
388 |
static inline int fmt_depth(int fmt) |
389 |
{ |
390 |
switch(fmt) {
|
391 |
case PIX_FMT_RGB48BE:
|
392 |
case PIX_FMT_RGB48LE:
|
393 |
return 48; |
394 |
case PIX_FMT_BGRA:
|
395 |
case PIX_FMT_ABGR:
|
396 |
case PIX_FMT_RGBA:
|
397 |
case PIX_FMT_ARGB:
|
398 |
return 32; |
399 |
case PIX_FMT_BGR24:
|
400 |
case PIX_FMT_RGB24:
|
401 |
return 24; |
402 |
case PIX_FMT_BGR565:
|
403 |
case PIX_FMT_RGB565:
|
404 |
case PIX_FMT_GRAY16BE:
|
405 |
case PIX_FMT_GRAY16LE:
|
406 |
return 16; |
407 |
case PIX_FMT_BGR555:
|
408 |
case PIX_FMT_RGB555:
|
409 |
return 15; |
410 |
case PIX_FMT_BGR8:
|
411 |
case PIX_FMT_RGB8:
|
412 |
return 8; |
413 |
case PIX_FMT_BGR4:
|
414 |
case PIX_FMT_RGB4:
|
415 |
case PIX_FMT_BGR4_BYTE:
|
416 |
case PIX_FMT_RGB4_BYTE:
|
417 |
return 4; |
418 |
case PIX_FMT_MONOBLACK:
|
419 |
case PIX_FMT_MONOWHITE:
|
420 |
return 1; |
421 |
default:
|
422 |
return 0; |
423 |
} |
424 |
} |
425 |
|
426 |
extern const uint64_t ff_dither4[2]; |
427 |
extern const uint64_t ff_dither8[2]; |
428 |
|
429 |
extern const AVClass sws_context_class; |
430 |
|
431 |
#endif /* SWSCALE_SWSCALE_INTERNAL_H */ |