Commit | Line | Data |
---|---|---|
5427e242 | 1 | /* |
d026b45e DB |
2 | * Copyright (C) 2001-2003 Michael Niedermayer <michaelni@gmx.at> |
3 | * | |
4 | * This file is part of FFmpeg. | |
5 | * | |
807e0c66 LA |
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. | |
d026b45e DB |
10 | * |
11 | * FFmpeg is distributed in the hope that it will be useful, | |
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 LA |
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 | |
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 | ||
b63f641e | 26 | #if HAVE_ALTIVEC_H |
f2015f0c AB |
27 | #include <altivec.h> |
28 | #endif | |
29 | ||
83da2c6f | 30 | #include "libavutil/avutil.h" |
94c4def2 | 31 | |
59ded10c | 32 | #define STR(s) AV_TOSTRING(s) //AV_STRINGIFY is too long |
1625216e | 33 | |
5427e242 MN |
34 | #define MAX_FILTER_SIZE 256 |
35 | ||
8b2fce0d | 36 | #define VOFW 2048 |
710af50e | 37 | #define VOF (VOFW*2) |
8b2fce0d | 38 | |
9990e426 MN |
39 | #ifdef WORDS_BIGENDIAN |
40 | #define ALT32_CORR (-1) | |
41 | #else | |
42 | #define ALT32_CORR 1 | |
1625216e MN |
43 | #endif |
44 | ||
b63f641e | 45 | #if ARCH_X86_64 |
1625216e MN |
46 | # define APCK_PTR2 8 |
47 | # define APCK_COEF 16 | |
48 | # define APCK_SIZE 24 | |
49 | #else | |
50 | # define APCK_PTR2 4 | |
51 | # define APCK_COEF 8 | |
52 | # define APCK_SIZE 16 | |
9990e426 MN |
53 | #endif |
54 | ||
1615fb91 DB |
55 | struct SwsContext; |
56 | ||
d4e24275 | 57 | typedef int (*SwsFunc)(struct SwsContext *context, uint8_t* src[], int srcStride[], int srcSliceY, |
5427e242 MN |
58 | int srcSliceH, uint8_t* dst[], int dstStride[]); |
59 | ||
8a322796 | 60 | /* This struct should be aligned on at least a 32-byte boundary. */ |
5427e242 | 61 | typedef struct SwsContext{ |
221b804f DB |
62 | /** |
63 | * info on struct for av_log | |
64 | */ | |
635a8cd2 | 65 | const AVClass *av_class; |
221b804f DB |
66 | |
67 | /** | |
56b69633 DB |
68 | * Note that src, dst, srcStride, dstStride will be copied in the |
69 | * sws_scale() wrapper so they can be freely modified here. | |
221b804f DB |
70 | */ |
71 | SwsFunc swScale; | |
72 | int srcW, srcH, dstH; | |
73 | int chrSrcW, chrSrcH, chrDstW, chrDstH; | |
74 | int lumXInc, chrXInc; | |
75 | int lumYInc, chrYInc; | |
58e4b706 | 76 | enum PixelFormat dstFormat, srcFormat; ///< format 4:2:0 type is always YV12 |
221b804f DB |
77 | int origDstFormat, origSrcFormat; ///< format |
78 | int chrSrcHSubSample, chrSrcVSubSample; | |
79 | int chrIntHSubSample, chrIntVSubSample; | |
80 | int chrDstHSubSample, chrDstVSubSample; | |
81 | int vChrDrop; | |
82 | int sliceDir; | |
83 | double param[2]; | |
84 | ||
49004617 VS |
85 | uint32_t pal_yuv[256]; |
86 | uint32_t pal_rgb[256]; | |
87 | ||
221b804f DB |
88 | int16_t **lumPixBuf; |
89 | int16_t **chrPixBuf; | |
6858492e | 90 | int16_t **alpPixBuf; |
221b804f DB |
91 | int16_t *hLumFilter; |
92 | int16_t *hLumFilterPos; | |
93 | int16_t *hChrFilter; | |
94 | int16_t *hChrFilterPos; | |
95 | int16_t *vLumFilter; | |
96 | int16_t *vLumFilterPos; | |
97 | int16_t *vChrFilter; | |
98 | int16_t *vChrFilterPos; | |
99 | ||
8a322796 | 100 | uint8_t formatConvBuffer[VOF]; //FIXME dynamic allocation, but we have to change a lot of code for this to be useful |
221b804f DB |
101 | |
102 | int hLumFilterSize; | |
103 | int hChrFilterSize; | |
104 | int vLumFilterSize; | |
105 | int vChrFilterSize; | |
106 | int vLumBufSize; | |
107 | int vChrBufSize; | |
108 | ||
109 | uint8_t *funnyYCode; | |
110 | uint8_t *funnyUVCode; | |
111 | int32_t *lumMmx2FilterPos; | |
112 | int32_t *chrMmx2FilterPos; | |
113 | int16_t *lumMmx2Filter; | |
114 | int16_t *chrMmx2Filter; | |
115 | ||
116 | int canMMX2BeUsed; | |
117 | ||
118 | int lastInLumBuf; | |
119 | int lastInChrBuf; | |
120 | int lumBufIndex; | |
121 | int chrBufIndex; | |
122 | int dstY; | |
123 | int flags; | |
124 | void * yuvTable; // pointer to the yuv->rgb table start so it can be freed() | |
125 | uint8_t * table_rV[256]; | |
126 | uint8_t * table_gU[256]; | |
127 | int table_gV[256]; | |
128 | uint8_t * table_bU[256]; | |
129 | ||
130 | //Colorspace stuff | |
131 | int contrast, brightness, saturation; // for sws_getColorspaceDetails | |
132 | int srcColorspaceTable[4]; | |
133 | int dstColorspaceTable[4]; | |
134 | int srcRange, dstRange; | |
43c16478 MN |
135 | int yuv2rgb_y_offset; |
136 | int yuv2rgb_y_coeff; | |
137 | int yuv2rgb_v2r_coeff; | |
138 | int yuv2rgb_v2g_coeff; | |
139 | int yuv2rgb_u2g_coeff; | |
140 | int yuv2rgb_u2b_coeff; | |
221b804f DB |
141 | |
142 | #define RED_DITHER "0*8" | |
143 | #define GREEN_DITHER "1*8" | |
144 | #define BLUE_DITHER "2*8" | |
145 | #define Y_COEFF "3*8" | |
146 | #define VR_COEFF "4*8" | |
147 | #define UB_COEFF "5*8" | |
148 | #define VG_COEFF "6*8" | |
149 | #define UG_COEFF "7*8" | |
150 | #define Y_OFFSET "8*8" | |
151 | #define U_OFFSET "9*8" | |
152 | #define V_OFFSET "10*8" | |
8bae9ddc MN |
153 | #define LUM_MMX_FILTER_OFFSET "11*8" |
154 | #define CHR_MMX_FILTER_OFFSET "11*8+4*4*256" | |
8a322796 | 155 | #define DSTW_OFFSET "11*8+4*4*256*2" //do not change, it is hardcoded in the ASM |
221b804f DB |
156 | #define ESP_OFFSET "11*8+4*4*256*2+8" |
157 | #define VROUNDER_OFFSET "11*8+4*4*256*2+16" | |
158 | #define U_TEMP "11*8+4*4*256*2+24" | |
159 | #define V_TEMP "11*8+4*4*256*2+32" | |
6858492e CS |
160 | #define Y_TEMP "11*8+4*4*256*2+40" |
161 | #define ALP_MMX_FILTER_OFFSET "11*8+4*4*256*2+48" | |
221b804f DB |
162 | |
163 | uint64_t redDither __attribute__((aligned(8))); | |
164 | uint64_t greenDither __attribute__((aligned(8))); | |
165 | uint64_t blueDither __attribute__((aligned(8))); | |
166 | ||
167 | uint64_t yCoeff __attribute__((aligned(8))); | |
168 | uint64_t vrCoeff __attribute__((aligned(8))); | |
169 | uint64_t ubCoeff __attribute__((aligned(8))); | |
170 | uint64_t vgCoeff __attribute__((aligned(8))); | |
171 | uint64_t ugCoeff __attribute__((aligned(8))); | |
172 | uint64_t yOffset __attribute__((aligned(8))); | |
173 | uint64_t uOffset __attribute__((aligned(8))); | |
174 | uint64_t vOffset __attribute__((aligned(8))); | |
175 | int32_t lumMmxFilter[4*MAX_FILTER_SIZE]; | |
176 | int32_t chrMmxFilter[4*MAX_FILTER_SIZE]; | |
177 | int dstW; | |
178 | uint64_t esp __attribute__((aligned(8))); | |
179 | uint64_t vRounder __attribute__((aligned(8))); | |
180 | uint64_t u_temp __attribute__((aligned(8))); | |
181 | uint64_t v_temp __attribute__((aligned(8))); | |
6858492e CS |
182 | uint64_t y_temp __attribute__((aligned(8))); |
183 | int32_t alpMmxFilter[4*MAX_FILTER_SIZE]; | |
a31de956 | 184 | |
b63f641e | 185 | #if HAVE_ALTIVEC |
a31de956 MN |
186 | |
187 | vector signed short CY; | |
188 | vector signed short CRV; | |
189 | vector signed short CBU; | |
190 | vector signed short CGU; | |
191 | vector signed short CGV; | |
192 | vector signed short OY; | |
193 | vector unsigned short CSHIFT; | |
221b804f | 194 | vector signed short *vYCoeffsBank, *vCCoeffsBank; |
a31de956 MN |
195 | |
196 | #endif | |
197 | ||
d3f3eea9 | 198 | |
b63f641e | 199 | #if ARCH_BFIN |
d3f3eea9 MH |
200 | uint32_t oy __attribute__((aligned(4))); |
201 | uint32_t oc __attribute__((aligned(4))); | |
202 | uint32_t zero __attribute__((aligned(4))); | |
203 | uint32_t cy __attribute__((aligned(4))); | |
204 | uint32_t crv __attribute__((aligned(4))); | |
205 | uint32_t rmask __attribute__((aligned(4))); | |
206 | uint32_t cbu __attribute__((aligned(4))); | |
207 | uint32_t bmask __attribute__((aligned(4))); | |
208 | uint32_t cgu __attribute__((aligned(4))); | |
209 | uint32_t cgv __attribute__((aligned(4))); | |
210 | uint32_t gmask __attribute__((aligned(4))); | |
211 | #endif | |
212 | ||
b63f641e | 213 | #if HAVE_VIS |
90c1d7b4 DB |
214 | uint64_t sparc_coeffs[10] __attribute__((aligned(8))); |
215 | #endif | |
d3f3eea9 | 216 | |
40fa5140 RP |
217 | /* function pointers for swScale() */ |
218 | void (*yuv2nv12X )(struct SwsContext *c, | |
219 | const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize, | |
220 | const int16_t *chrFilter, const int16_t **chrSrc, int chrFilterSize, | |
221 | uint8_t *dest, uint8_t *uDest, | |
222 | int dstW, int chrDstW, int dstFormat); | |
223 | void (*yuv2yuv1 )(struct SwsContext *c, | |
224 | const int16_t *lumSrc, const int16_t *chrSrc, const int16_t *alpSrc, | |
225 | uint8_t *dest, | |
226 | uint8_t *uDest, uint8_t *vDest, uint8_t *aDest, | |
227 | long dstW, long chrDstW); | |
228 | void (*yuv2yuvX )(struct SwsContext *c, | |
229 | const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize, | |
230 | const int16_t *chrFilter, const int16_t **chrSrc, int chrFilterSize, | |
231 | const int16_t **alpSrc, | |
232 | uint8_t *dest, | |
233 | uint8_t *uDest, uint8_t *vDest, uint8_t *aDest, | |
234 | long dstW, long chrDstW); | |
235 | void (*yuv2packed1)(struct SwsContext *c, | |
236 | const uint16_t *buf0, | |
237 | const uint16_t *uvbuf0, const uint16_t *uvbuf1, | |
238 | const uint16_t *abuf0, | |
239 | uint8_t *dest, | |
240 | int dstW, int uvalpha, int dstFormat, int flags, int y); | |
241 | void (*yuv2packed2)(struct SwsContext *c, | |
242 | const uint16_t *buf0, const uint16_t *buf1, | |
243 | const uint16_t *uvbuf0, const uint16_t *uvbuf1, | |
244 | const uint16_t *abuf0, const uint16_t *abuf1, | |
245 | uint8_t *dest, | |
246 | int dstW, int yalpha, int uvalpha, int y); | |
247 | void (*yuv2packedX)(struct SwsContext *c, | |
248 | const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize, | |
249 | const int16_t *chrFilter, const int16_t **chrSrc, int chrFilterSize, | |
250 | const int16_t **alpSrc, uint8_t *dest, | |
251 | long dstW, long dstY); | |
252 | ||
253 | void (*hyscale_internal)(uint8_t *dst, const uint8_t *src, | |
254 | long width, uint32_t *pal); | |
255 | void (*hcscale_internal)(uint8_t *dstU, uint8_t *dstV, | |
256 | const uint8_t *src1, const uint8_t *src2, | |
257 | long width, uint32_t *pal); | |
258 | void (*hyscale_fast)(struct SwsContext *c, | |
259 | int16_t *dst, int dstWidth, | |
260 | const uint8_t *src, int srcW, int xInc); | |
261 | void (*hcscale_fast)(struct SwsContext *c, | |
262 | int16_t *dst, int dstWidth, | |
263 | const uint8_t *src1, const uint8_t *src2, int srcW, int xInc); | |
264 | ||
265 | void (*hScale)(int16_t *dst, int dstW, const uint8_t *src, int srcW, | |
266 | int xInc, const int16_t *filter, const int16_t *filterPos, long filterSize); | |
267 | ||
5427e242 MN |
268 | } SwsContext; |
269 | //FIXME check init (where 0) | |
5427e242 | 270 | |
780daf2b DB |
271 | SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c); |
272 | int ff_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4], int fullRange, int brightness, int contrast, int saturation); | |
5427e242 | 273 | |
780daf2b | 274 | void ff_yuv2rgb_init_tables_altivec(SwsContext *c, const int inv_table[4], int brightness, int contrast, int saturation); |
befa8e66 RP |
275 | SwsFunc ff_yuv2rgb_init_mmx(SwsContext *c); |
276 | SwsFunc ff_yuv2rgb_init_vis(SwsContext *c); | |
277 | SwsFunc ff_yuv2rgb_init_mlib(SwsContext *c); | |
780daf2b | 278 | SwsFunc ff_yuv2rgb_init_altivec(SwsContext *c); |
befa8e66 | 279 | SwsFunc ff_yuv2rgb_get_func_ptr_bfin(SwsContext *c); |
d5e9bc06 | 280 | void ff_bfin_get_unscaled_swscale(SwsContext *c); |
780daf2b | 281 | void ff_yuv2packedX_altivec(SwsContext *c, |
c95a3a9f DB |
282 | int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize, |
283 | int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize, | |
284 | uint8_t *dest, int dstW, int dstY); | |
285 | ||
8055ede6 | 286 | const char *sws_format_name(int format); |
94c4def2 | 287 | |
e9e12f0e | 288 | //FIXME replace this with something faster |
9d9de37d IP |
289 | #define isPlanarYUV(x) ( \ |
290 | (x)==PIX_FMT_YUV410P \ | |
291 | || (x)==PIX_FMT_YUV420P \ | |
9621f2f5 | 292 | || (x)==PIX_FMT_YUVA420P \ |
9d9de37d IP |
293 | || (x)==PIX_FMT_YUV411P \ |
294 | || (x)==PIX_FMT_YUV422P \ | |
295 | || (x)==PIX_FMT_YUV444P \ | |
9ba7fe6d | 296 | || (x)==PIX_FMT_YUV440P \ |
9d9de37d IP |
297 | || (x)==PIX_FMT_NV12 \ |
298 | || (x)==PIX_FMT_NV21 \ | |
299 | ) | |
300 | #define isYUV(x) ( \ | |
301 | (x)==PIX_FMT_UYVY422 \ | |
302 | || (x)==PIX_FMT_YUYV422 \ | |
303 | || isPlanarYUV(x) \ | |
304 | ) | |
305 | #define isGray(x) ( \ | |
306 | (x)==PIX_FMT_GRAY8 \ | |
307 | || (x)==PIX_FMT_GRAY16BE \ | |
308 | || (x)==PIX_FMT_GRAY16LE \ | |
309 | ) | |
310 | #define isGray16(x) ( \ | |
311 | (x)==PIX_FMT_GRAY16BE \ | |
312 | || (x)==PIX_FMT_GRAY16LE \ | |
313 | ) | |
314 | #define isRGB(x) ( \ | |
d52337af | 315 | (x)==PIX_FMT_RGB32 \ |
9990e426 | 316 | || (x)==PIX_FMT_RGB32_1 \ |
9d9de37d IP |
317 | || (x)==PIX_FMT_RGB24 \ |
318 | || (x)==PIX_FMT_RGB565 \ | |
319 | || (x)==PIX_FMT_RGB555 \ | |
320 | || (x)==PIX_FMT_RGB8 \ | |
321 | || (x)==PIX_FMT_RGB4 \ | |
322 | || (x)==PIX_FMT_RGB4_BYTE \ | |
323 | || (x)==PIX_FMT_MONOBLACK \ | |
ec1bca2a | 324 | || (x)==PIX_FMT_MONOWHITE \ |
9d9de37d IP |
325 | ) |
326 | #define isBGR(x) ( \ | |
d52337af | 327 | (x)==PIX_FMT_BGR32 \ |
9990e426 | 328 | || (x)==PIX_FMT_BGR32_1 \ |
9d9de37d IP |
329 | || (x)==PIX_FMT_BGR24 \ |
330 | || (x)==PIX_FMT_BGR565 \ | |
331 | || (x)==PIX_FMT_BGR555 \ | |
332 | || (x)==PIX_FMT_BGR8 \ | |
333 | || (x)==PIX_FMT_BGR4 \ | |
334 | || (x)==PIX_FMT_BGR4_BYTE \ | |
335 | || (x)==PIX_FMT_MONOBLACK \ | |
ec1bca2a | 336 | || (x)==PIX_FMT_MONOWHITE \ |
9d9de37d | 337 | ) |
c2751600 CS |
338 | #define isALPHA(x) ( \ |
339 | (x)==PIX_FMT_BGR32 \ | |
340 | || (x)==PIX_FMT_BGR32_1 \ | |
341 | || (x)==PIX_FMT_RGB32 \ | |
342 | || (x)==PIX_FMT_RGB32_1 \ | |
343 | || (x)==PIX_FMT_YUVA420P \ | |
344 | ) | |
e9e12f0e LA |
345 | |
346 | static inline int fmt_depth(int fmt) | |
347 | { | |
348 | switch(fmt) { | |
349 | case PIX_FMT_BGRA: | |
350 | case PIX_FMT_ABGR: | |
351 | case PIX_FMT_RGBA: | |
352 | case PIX_FMT_ARGB: | |
353 | return 32; | |
354 | case PIX_FMT_BGR24: | |
355 | case PIX_FMT_RGB24: | |
356 | return 24; | |
357 | case PIX_FMT_BGR565: | |
358 | case PIX_FMT_RGB565: | |
4884b9e5 KS |
359 | case PIX_FMT_GRAY16BE: |
360 | case PIX_FMT_GRAY16LE: | |
e9e12f0e LA |
361 | return 16; |
362 | case PIX_FMT_BGR555: | |
363 | case PIX_FMT_RGB555: | |
364 | return 15; | |
365 | case PIX_FMT_BGR8: | |
366 | case PIX_FMT_RGB8: | |
367 | return 8; | |
368 | case PIX_FMT_BGR4: | |
369 | case PIX_FMT_RGB4: | |
370 | case PIX_FMT_BGR4_BYTE: | |
371 | case PIX_FMT_RGB4_BYTE: | |
372 | return 4; | |
373 | case PIX_FMT_MONOBLACK: | |
ec1bca2a | 374 | case PIX_FMT_MONOWHITE: |
e9e12f0e LA |
375 | return 1; |
376 | default: | |
377 | return 0; | |
378 | } | |
379 | } | |
380 | ||
43175f50 DB |
381 | extern const uint64_t ff_dither4[2]; |
382 | extern const uint64_t ff_dither8[2]; | |
0cb25594 | 383 | |
e40b183d LB |
384 | extern const AVClass sws_context_class; |
385 | ||
0eaf5235 | 386 | #endif /* SWSCALE_SWSCALE_INTERNAL_H */ |