Mercurial > mplayer.hg
annotate postproc/swscale.c @ 17588:79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
once when the scaler is initialized, instead of building them and freeing
them over and over. This gives massive performance improvements.
patch by Alan Curry, pacman*at*TheWorld*dot*com
author | diego |
---|---|
date | Sat, 11 Feb 2006 14:16:10 +0000 |
parents | f580a7755ac5 |
children | 3a67b7ce8b3b |
rev | line source |
---|---|
4295 | 1 /* |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
2 Copyright (C) 2001-2003 Michael Niedermayer <michaelni@gmx.at> |
2216 | 3 |
4295 | 4 This program is free software; you can redistribute it and/or modify |
5 it under the terms of the GNU General Public License as published by | |
6 the Free Software Foundation; either version 2 of the License, or | |
7 (at your option) any later version. | |
2216 | 8 |
4295 | 9 This program is distributed in the hope that it will be useful, |
10 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 GNU General Public License for more details. | |
13 | |
14 You should have received a copy of the GNU General Public License | |
15 along with this program; if not, write to the Free Software | |
17367
401b440a6d76
Update licensing information: The FSF changed postal address.
diego
parents:
16985
diff
changeset
|
16 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
4295 | 17 */ |
2264
7851375ea156
increased precission of s_xinc s_xinc2 (needed for the mmx2 bugfix)
michael
parents:
2237
diff
changeset
|
18 |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
19 /* |
9071 | 20 supported Input formats: YV12, I420/IYUV, YUY2, UYVY, BGR32, BGR24, BGR16, BGR15, RGB32, RGB24, Y8/Y800, YVU9/IF09 |
11068 | 21 supported output formats: YV12, I420/IYUV, YUY2, UYVY, {BGR,RGB}{1,4,8,15,16,24,32}, Y8/Y800, YVU9/IF09 |
6616
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
22 {BGR,RGB}{1,4,8,15,16} support dithering |
4558 | 23 |
6616
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
24 unscaled special converters (YV12=I420=IYUV, Y800=Y8) |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
25 YV12 -> {BGR,RGB}{1,4,8,15,16,24,32} |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
26 x -> x |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
27 YUV9 -> YV12 |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
28 YUV9/YV12 -> Y800 |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
29 Y800 -> YUV9/YV12 |
4567 | 30 BGR24 -> BGR32 & RGB24 -> RGB32 |
31 BGR32 -> BGR24 & RGB32 -> RGB24 | |
4581 | 32 BGR15 -> BGR16 |
4567 | 33 */ |
34 | |
35 /* | |
6616
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
36 tested special converters (most are tested actually but i didnt write it down ...) |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
37 YV12 -> BGR16 |
4567 | 38 YV12 -> YV12 |
4581 | 39 BGR15 -> BGR16 |
4791 | 40 BGR16 -> BGR16 |
6616
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
41 YVU9 -> YV12 |
4567 | 42 |
43 untested special converters | |
4791 | 44 YV12/I420 -> BGR15/BGR24/BGR32 (its the yuv2rgb stuff, so it should be ok) |
45 YV12/I420 -> YV12/I420 | |
46 YUY2/BGR15/BGR24/BGR32/RGB24/RGB32 -> same format | |
4567 | 47 BGR24 -> BGR32 & RGB24 -> RGB32 |
48 BGR32 -> BGR24 & RGB32 -> RGB24 | |
4623 | 49 BGR24 -> YV12 |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
50 */ |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
51 |
2232
65996b3467d7
MMX & MMX2 optimizations (MMX2 is buggy and commented out)
michael
parents:
2230
diff
changeset
|
52 #include <inttypes.h> |
2476 | 53 #include <string.h> |
3272 | 54 #include <math.h> |
3344 | 55 #include <stdio.h> |
14698 | 56 #include <unistd.h> |
16985 | 57 #include "config.h" |
58 #include "mangle.h" | |
4806 | 59 #include <assert.h> |
3344 | 60 #ifdef HAVE_MALLOC_H |
61 #include <malloc.h> | |
6057
31e465fda59c
various openbsd and general warning fixes - patch by Bj«Órn Sandell <biorn@dce.chalmers.se>
arpi
parents:
5937
diff
changeset
|
62 #else |
31e465fda59c
various openbsd and general warning fixes - patch by Bj«Órn Sandell <biorn@dce.chalmers.se>
arpi
parents:
5937
diff
changeset
|
63 #include <stdlib.h> |
3344 | 64 #endif |
14625
e85e3894520f
makes funnyCode pages executable (for CPU with NX bit)
aurel
parents:
14556
diff
changeset
|
65 #ifdef HAVE_SYS_MMAN_H |
e85e3894520f
makes funnyCode pages executable (for CPU with NX bit)
aurel
parents:
14556
diff
changeset
|
66 #include <sys/mman.h> |
14761 | 67 #if defined(MAP_ANON) && !defined(MAP_ANONYMOUS) |
68 #define MAP_ANONYMOUS MAP_ANON | |
69 #endif | |
14625
e85e3894520f
makes funnyCode pages executable (for CPU with NX bit)
aurel
parents:
14556
diff
changeset
|
70 #endif |
2316
bcb229557e9b
fixed alignment (static variables where sometimes not 8-byte aligned)
michael
parents:
2297
diff
changeset
|
71 #include "swscale.h" |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
72 #include "swscale_internal.h" |
16985 | 73 #include "cpudetect.h" |
74 #include "bswap.h" | |
75 #include "libvo/img_format.h" | |
4554 | 76 #include "rgb2rgb.h" |
16985 | 77 #include "libvo/fastmemcpy.h" |
6492 | 78 |
2540 | 79 #undef MOVNTQ |
2680 | 80 #undef PAVGB |
2232
65996b3467d7
MMX & MMX2 optimizations (MMX2 is buggy and commented out)
michael
parents:
2230
diff
changeset
|
81 |
2264
7851375ea156
increased precission of s_xinc s_xinc2 (needed for the mmx2 bugfix)
michael
parents:
2237
diff
changeset
|
82 //#undef HAVE_MMX2 |
4281 | 83 //#define HAVE_3DNOW |
2232
65996b3467d7
MMX & MMX2 optimizations (MMX2 is buggy and commented out)
michael
parents:
2230
diff
changeset
|
84 //#undef HAVE_MMX |
2264
7851375ea156
increased precission of s_xinc s_xinc2 (needed for the mmx2 bugfix)
michael
parents:
2237
diff
changeset
|
85 //#undef ARCH_X86 |
4794 | 86 //#define WORDS_BIGENDIAN |
2316
bcb229557e9b
fixed alignment (static variables where sometimes not 8-byte aligned)
michael
parents:
2297
diff
changeset
|
87 #define DITHER1XBPP |
2232
65996b3467d7
MMX & MMX2 optimizations (MMX2 is buggy and commented out)
michael
parents:
2230
diff
changeset
|
88 |
4612 | 89 #define FAST_BGR2YV12 // use 7 bit coeffs instead of 15bit |
90 | |
4467 | 91 #define RET 0xC3 //near return opcode for X86 |
3344 | 92 |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
93 #ifdef MP_DEBUG |
4806 | 94 #define ASSERT(x) assert(x); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
95 #else |
3344 | 96 #define ASSERT(x) ; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
97 #endif |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
98 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
99 #ifdef M_PI |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
100 #define PI M_PI |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
101 #else |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
102 #define PI 3.14159265358979323846 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
103 #endif |
3344 | 104 |
4419 | 105 //FIXME replace this with something faster |
9697 | 106 #define isPlanarYUV(x) ((x)==IMGFMT_YV12 || (x)==IMGFMT_YVU9 \ |
14715 | 107 || (x)==IMGFMT_NV12 || (x)==IMGFMT_NV21 \ |
6863 | 108 || (x)==IMGFMT_444P || (x)==IMGFMT_422P || (x)==IMGFMT_411P) |
9071 | 109 #define isYUV(x) ((x)==IMGFMT_UYVY || (x)==IMGFMT_YUY2 || isPlanarYUV(x)) |
6503 | 110 #define isGray(x) ((x)==IMGFMT_Y800) |
6578 | 111 #define isRGB(x) (((x)&IMGFMT_RGB_MASK)==IMGFMT_RGB) |
112 #define isBGR(x) (((x)&IMGFMT_BGR_MASK)==IMGFMT_BGR) | |
9697 | 113 #define isSupportedIn(x) ((x)==IMGFMT_YV12 || (x)==IMGFMT_YUY2 || (x)==IMGFMT_UYVY\ |
4580 | 114 || (x)==IMGFMT_BGR32|| (x)==IMGFMT_BGR24|| (x)==IMGFMT_BGR16|| (x)==IMGFMT_BGR15\ |
4558 | 115 || (x)==IMGFMT_RGB32|| (x)==IMGFMT_RGB24\ |
6863 | 116 || (x)==IMGFMT_Y800 || (x)==IMGFMT_YVU9\ |
117 || (x)==IMGFMT_444P || (x)==IMGFMT_422P || (x)==IMGFMT_411P) | |
11068 | 118 #define isSupportedOut(x) ((x)==IMGFMT_YV12 || (x)==IMGFMT_YUY2 || (x)==IMGFMT_UYVY\ |
6863 | 119 || (x)==IMGFMT_444P || (x)==IMGFMT_422P || (x)==IMGFMT_411P\ |
6578 | 120 || isRGB(x) || isBGR(x)\ |
14715 | 121 || (x)==IMGFMT_NV12 || (x)==IMGFMT_NV21\ |
6532
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
122 || (x)==IMGFMT_Y800 || (x)==IMGFMT_YVU9) |
9071 | 123 #define isPacked(x) ((x)==IMGFMT_YUY2 || (x)==IMGFMT_UYVY ||isRGB(x) || isBGR(x)) |
4467 | 124 |
4481 | 125 #define RGB2YUV_SHIFT 16 |
4467 | 126 #define BY ((int)( 0.098*(1<<RGB2YUV_SHIFT)+0.5)) |
127 #define BV ((int)(-0.071*(1<<RGB2YUV_SHIFT)+0.5)) | |
128 #define BU ((int)( 0.439*(1<<RGB2YUV_SHIFT)+0.5)) | |
129 #define GY ((int)( 0.504*(1<<RGB2YUV_SHIFT)+0.5)) | |
130 #define GV ((int)(-0.368*(1<<RGB2YUV_SHIFT)+0.5)) | |
131 #define GU ((int)(-0.291*(1<<RGB2YUV_SHIFT)+0.5)) | |
132 #define RY ((int)( 0.257*(1<<RGB2YUV_SHIFT)+0.5)) | |
133 #define RV ((int)( 0.439*(1<<RGB2YUV_SHIFT)+0.5)) | |
134 #define RU ((int)(-0.148*(1<<RGB2YUV_SHIFT)+0.5)) | |
4419 | 135 |
9416
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
136 extern const int32_t Inverse_Table_6_9[8][4]; |
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
137 |
2264
7851375ea156
increased precission of s_xinc s_xinc2 (needed for the mmx2 bugfix)
michael
parents:
2237
diff
changeset
|
138 /* |
7851375ea156
increased precission of s_xinc s_xinc2 (needed for the mmx2 bugfix)
michael
parents:
2237
diff
changeset
|
139 NOTES |
2316
bcb229557e9b
fixed alignment (static variables where sometimes not 8-byte aligned)
michael
parents:
2297
diff
changeset
|
140 Special versions: fast Y 1:1 scaling (no interpolation in y direction) |
2216 | 141 |
2264
7851375ea156
increased precission of s_xinc s_xinc2 (needed for the mmx2 bugfix)
michael
parents:
2237
diff
changeset
|
142 TODO |
2316
bcb229557e9b
fixed alignment (static variables where sometimes not 8-byte aligned)
michael
parents:
2297
diff
changeset
|
143 more intelligent missalignment avoidance for the horizontal scaler |
3344 | 144 write special vertical cubic upscale version |
145 Optimize C code (yv12 / minmax) | |
4401
8d00348d0d6b
nearest neighbor / sdl emulation ;) scaling (-sws 4)
michael
parents:
4304
diff
changeset
|
146 add support for packed pixel yuv input & output |
4481 | 147 add support for Y8 output |
148 optimize bgr24 & bgr32 | |
4401
8d00348d0d6b
nearest neighbor / sdl emulation ;) scaling (-sws 4)
michael
parents:
4304
diff
changeset
|
149 add BGR4 output support |
4467 | 150 write special BGR->BGR scaler |
2264
7851375ea156
increased precission of s_xinc s_xinc2 (needed for the mmx2 bugfix)
michael
parents:
2237
diff
changeset
|
151 */ |
2216 | 152 |
2316
bcb229557e9b
fixed alignment (static variables where sometimes not 8-byte aligned)
michael
parents:
2297
diff
changeset
|
153 #define ABS(a) ((a) > 0 ? (a) : (-(a))) |
2469 | 154 #define MIN(a,b) ((a) > (b) ? (b) : (a)) |
155 #define MAX(a,b) ((a) < (b) ? (b) : (a)) | |
2316
bcb229557e9b
fixed alignment (static variables where sometimes not 8-byte aligned)
michael
parents:
2297
diff
changeset
|
156 |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
157 #if defined(ARCH_X86) || defined(ARCH_X86_64) |
12301
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
158 static uint64_t attribute_used __attribute__((aligned(8))) bF8= 0xF8F8F8F8F8F8F8F8LL; |
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
159 static uint64_t attribute_used __attribute__((aligned(8))) bFC= 0xFCFCFCFCFCFCFCFCLL; |
2316
bcb229557e9b
fixed alignment (static variables where sometimes not 8-byte aligned)
michael
parents:
2297
diff
changeset
|
160 static uint64_t __attribute__((aligned(8))) w10= 0x0010001000100010LL; |
12301
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
161 static uint64_t attribute_used __attribute__((aligned(8))) w02= 0x0002000200020002LL; |
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
162 static uint64_t attribute_used __attribute__((aligned(8))) bm00001111=0x00000000FFFFFFFFLL; |
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
163 static uint64_t attribute_used __attribute__((aligned(8))) bm00000111=0x0000000000FFFFFFLL; |
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
164 static uint64_t attribute_used __attribute__((aligned(8))) bm11111000=0xFFFFFFFFFF000000LL; |
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
165 static uint64_t attribute_used __attribute__((aligned(8))) bm01010101=0x00FF00FF00FF00FFLL; |
2232
65996b3467d7
MMX & MMX2 optimizations (MMX2 is buggy and commented out)
michael
parents:
2230
diff
changeset
|
166 |
12301
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
167 static volatile uint64_t attribute_used __attribute__((aligned(8))) b5Dither; |
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
168 static volatile uint64_t attribute_used __attribute__((aligned(8))) g5Dither; |
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
169 static volatile uint64_t attribute_used __attribute__((aligned(8))) g6Dither; |
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
170 static volatile uint64_t attribute_used __attribute__((aligned(8))) r5Dither; |
2748 | 171 |
172 static uint64_t __attribute__((aligned(8))) dither4[2]={ | |
173 0x0103010301030103LL, | |
174 0x0200020002000200LL,}; | |
175 | |
176 static uint64_t __attribute__((aligned(8))) dither8[2]={ | |
177 0x0602060206020602LL, | |
178 0x0004000400040004LL,}; | |
2232
65996b3467d7
MMX & MMX2 optimizations (MMX2 is buggy and commented out)
michael
parents:
2230
diff
changeset
|
179 |
2316
bcb229557e9b
fixed alignment (static variables where sometimes not 8-byte aligned)
michael
parents:
2297
diff
changeset
|
180 static uint64_t __attribute__((aligned(8))) b16Mask= 0x001F001F001F001FLL; |
12301
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
181 static uint64_t attribute_used __attribute__((aligned(8))) g16Mask= 0x07E007E007E007E0LL; |
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
182 static uint64_t attribute_used __attribute__((aligned(8))) r16Mask= 0xF800F800F800F800LL; |
2316
bcb229557e9b
fixed alignment (static variables where sometimes not 8-byte aligned)
michael
parents:
2297
diff
changeset
|
183 static uint64_t __attribute__((aligned(8))) b15Mask= 0x001F001F001F001FLL; |
12301
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
184 static uint64_t attribute_used __attribute__((aligned(8))) g15Mask= 0x03E003E003E003E0LL; |
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
185 static uint64_t attribute_used __attribute__((aligned(8))) r15Mask= 0x7C007C007C007C00LL; |
2316
bcb229557e9b
fixed alignment (static variables where sometimes not 8-byte aligned)
michael
parents:
2297
diff
changeset
|
186 |
12301
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
187 static uint64_t attribute_used __attribute__((aligned(8))) M24A= 0x00FF0000FF0000FFLL; |
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
188 static uint64_t attribute_used __attribute__((aligned(8))) M24B= 0xFF0000FF0000FF00LL; |
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
189 static uint64_t attribute_used __attribute__((aligned(8))) M24C= 0x0000FF0000FF0000LL; |
2730 | 190 |
4612 | 191 #ifdef FAST_BGR2YV12 |
12301
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
192 static const uint64_t bgr2YCoeff attribute_used __attribute__((aligned(8))) = 0x000000210041000DULL; |
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
193 static const uint64_t bgr2UCoeff attribute_used __attribute__((aligned(8))) = 0x0000FFEEFFDC0038ULL; |
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
194 static const uint64_t bgr2VCoeff attribute_used __attribute__((aligned(8))) = 0x00000038FFD2FFF8ULL; |
4612 | 195 #else |
12301
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
196 static const uint64_t bgr2YCoeff attribute_used __attribute__((aligned(8))) = 0x000020E540830C8BULL; |
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
197 static const uint64_t bgr2UCoeff attribute_used __attribute__((aligned(8))) = 0x0000ED0FDAC23831ULL; |
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
198 static const uint64_t bgr2VCoeff attribute_used __attribute__((aligned(8))) = 0x00003831D0E6F6EAULL; |
4612 | 199 #endif |
12301
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
200 static const uint64_t bgr2YOffset attribute_used __attribute__((aligned(8))) = 0x1010101010101010ULL; |
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
201 static const uint64_t bgr2UVOffset attribute_used __attribute__((aligned(8)))= 0x8080808080808080ULL; |
b80f95e24c96
attribute_used patch by (matthieu castet <castet.matthieu at free dot fr>)
michael
parents:
12130
diff
changeset
|
202 static const uint64_t w1111 attribute_used __attribute__((aligned(8))) = 0x0001000100010001ULL; |
2316
bcb229557e9b
fixed alignment (static variables where sometimes not 8-byte aligned)
michael
parents:
2297
diff
changeset
|
203 #endif |
2264
7851375ea156
increased precission of s_xinc s_xinc2 (needed for the mmx2 bugfix)
michael
parents:
2237
diff
changeset
|
204 |
7851375ea156
increased precission of s_xinc s_xinc2 (needed for the mmx2 bugfix)
michael
parents:
2237
diff
changeset
|
205 // clipping helper table for C implementations: |
7851375ea156
increased precission of s_xinc s_xinc2 (needed for the mmx2 bugfix)
michael
parents:
2237
diff
changeset
|
206 static unsigned char clip_table[768]; |
7851375ea156
increased precission of s_xinc s_xinc2 (needed for the mmx2 bugfix)
michael
parents:
2237
diff
changeset
|
207 |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
208 static SwsVector *sws_getConvVec(SwsVector *a, SwsVector *b); |
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
209 |
6578 | 210 extern const uint8_t dither_2x2_4[2][8]; |
211 extern const uint8_t dither_2x2_8[2][8]; | |
212 extern const uint8_t dither_8x8_32[8][8]; | |
213 extern const uint8_t dither_8x8_73[8][8]; | |
214 extern const uint8_t dither_8x8_220[8][8]; | |
4294
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
215 |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
216 #if defined(ARCH_X86) || defined(ARCH_X86_64) |
2671 | 217 void in_asm_used_var_warning_killer() |
218 { | |
9455 | 219 volatile int i= bF8+bFC+w10+ |
6554 | 220 bm00001111+bm00000111+bm11111000+b16Mask+g16Mask+r16Mask+b15Mask+g15Mask+r15Mask+ |
4481 | 221 M24A+M24B+M24C+w02 + b5Dither+g5Dither+r5Dither+g6Dither+dither4[0]+dither8[0]+bm01010101; |
2671 | 222 if(i) i=0; |
223 } | |
224 #endif | |
2316
bcb229557e9b
fixed alignment (static variables where sometimes not 8-byte aligned)
michael
parents:
2297
diff
changeset
|
225 |
6540 | 226 static inline void yuv2yuvXinC(int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize, |
3352 | 227 int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize, |
6540 | 228 uint8_t *dest, uint8_t *uDest, uint8_t *vDest, int dstW, int chrDstW) |
3352 | 229 { |
230 //FIXME Optimize (just quickly writen not opti..) | |
231 int i; | |
6540 | 232 for(i=0; i<dstW; i++) |
3352 | 233 { |
11122 | 234 int val=1<<18; |
3352 | 235 int j; |
236 for(j=0; j<lumFilterSize; j++) | |
237 val += lumSrc[j][i] * lumFilter[j]; | |
238 | |
239 dest[i]= MIN(MAX(val>>19, 0), 255); | |
240 } | |
241 | |
242 if(uDest != NULL) | |
6540 | 243 for(i=0; i<chrDstW; i++) |
3352 | 244 { |
11122 | 245 int u=1<<18; |
246 int v=1<<18; | |
3352 | 247 int j; |
3641 | 248 for(j=0; j<chrFilterSize; j++) |
3352 | 249 { |
250 u += chrSrc[j][i] * chrFilter[j]; | |
251 v += chrSrc[j][i + 2048] * chrFilter[j]; | |
252 } | |
253 | |
254 uDest[i]= MIN(MAX(u>>19, 0), 255); | |
255 vDest[i]= MIN(MAX(v>>19, 0), 255); | |
256 } | |
257 } | |
258 | |
14715 | 259 static inline void yuv2nv12XinC(int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize, |
260 int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize, | |
261 uint8_t *dest, uint8_t *uDest, int dstW, int chrDstW, int dstFormat) | |
262 { | |
263 //FIXME Optimize (just quickly writen not opti..) | |
264 int i; | |
265 for(i=0; i<dstW; i++) | |
266 { | |
267 int val=1<<18; | |
268 int j; | |
269 for(j=0; j<lumFilterSize; j++) | |
270 val += lumSrc[j][i] * lumFilter[j]; | |
271 | |
272 dest[i]= MIN(MAX(val>>19, 0), 255); | |
273 } | |
274 | |
275 if(uDest == NULL) | |
276 return; | |
277 | |
278 if(dstFormat == IMGFMT_NV12) | |
279 for(i=0; i<chrDstW; i++) | |
280 { | |
281 int u=1<<18; | |
282 int v=1<<18; | |
283 int j; | |
284 for(j=0; j<chrFilterSize; j++) | |
285 { | |
286 u += chrSrc[j][i] * chrFilter[j]; | |
287 v += chrSrc[j][i + 2048] * chrFilter[j]; | |
288 } | |
289 | |
290 uDest[2*i]= MIN(MAX(u>>19, 0), 255); | |
291 uDest[2*i+1]= MIN(MAX(v>>19, 0), 255); | |
292 } | |
293 else | |
294 for(i=0; i<chrDstW; i++) | |
295 { | |
296 int u=1<<18; | |
297 int v=1<<18; | |
298 int j; | |
299 for(j=0; j<chrFilterSize; j++) | |
300 { | |
301 u += chrSrc[j][i] * chrFilter[j]; | |
302 v += chrSrc[j][i + 2048] * chrFilter[j]; | |
303 } | |
304 | |
305 uDest[2*i]= MIN(MAX(v>>19, 0), 255); | |
306 uDest[2*i+1]= MIN(MAX(u>>19, 0), 255); | |
307 } | |
308 } | |
7720 | 309 |
7723 | 310 #define YSCALE_YUV_2_PACKEDX_C(type) \ |
6578 | 311 for(i=0; i<(dstW>>1); i++){\ |
312 int j;\ | |
11122 | 313 int Y1=1<<18;\ |
314 int Y2=1<<18;\ | |
315 int U=1<<18;\ | |
316 int V=1<<18;\ | |
6578 | 317 type *r, *b, *g;\ |
318 const int i2= 2*i;\ | |
319 \ | |
320 for(j=0; j<lumFilterSize; j++)\ | |
321 {\ | |
322 Y1 += lumSrc[j][i2] * lumFilter[j];\ | |
323 Y2 += lumSrc[j][i2+1] * lumFilter[j];\ | |
324 }\ | |
325 for(j=0; j<chrFilterSize; j++)\ | |
326 {\ | |
327 U += chrSrc[j][i] * chrFilter[j];\ | |
328 V += chrSrc[j][i+2048] * chrFilter[j];\ | |
329 }\ | |
330 Y1>>=19;\ | |
331 Y2>>=19;\ | |
332 U >>=19;\ | |
333 V >>=19;\ | |
334 if((Y1|Y2|U|V)&256)\ | |
335 {\ | |
336 if(Y1>255) Y1=255;\ | |
337 else if(Y1<0)Y1=0;\ | |
338 if(Y2>255) Y2=255;\ | |
339 else if(Y2<0)Y2=0;\ | |
340 if(U>255) U=255;\ | |
341 else if(U<0) U=0;\ | |
342 if(V>255) V=255;\ | |
343 else if(V<0) V=0;\ | |
7720 | 344 } |
345 | |
346 #define YSCALE_YUV_2_RGBX_C(type) \ | |
7723 | 347 YSCALE_YUV_2_PACKEDX_C(type)\ |
6578 | 348 r = c->table_rV[V];\ |
349 g = c->table_gU[U] + c->table_gV[V];\ | |
350 b = c->table_bU[U];\ | |
3352 | 351 |
7723 | 352 #define YSCALE_YUV_2_PACKED2_C \ |
6578 | 353 for(i=0; i<(dstW>>1); i++){\ |
354 const int i2= 2*i;\ | |
355 int Y1= (buf0[i2 ]*yalpha1+buf1[i2 ]*yalpha)>>19;\ | |
356 int Y2= (buf0[i2+1]*yalpha1+buf1[i2+1]*yalpha)>>19;\ | |
357 int U= (uvbuf0[i ]*uvalpha1+uvbuf1[i ]*uvalpha)>>19;\ | |
358 int V= (uvbuf0[i+2048]*uvalpha1+uvbuf1[i+2048]*uvalpha)>>19;\ | |
7720 | 359 |
360 #define YSCALE_YUV_2_RGB2_C(type) \ | |
7723 | 361 YSCALE_YUV_2_PACKED2_C\ |
6578 | 362 type *r, *b, *g;\ |
363 r = c->table_rV[V];\ | |
364 g = c->table_gU[U] + c->table_gV[V];\ | |
365 b = c->table_bU[U];\ | |
3352 | 366 |
7723 | 367 #define YSCALE_YUV_2_PACKED1_C \ |
6578 | 368 for(i=0; i<(dstW>>1); i++){\ |
369 const int i2= 2*i;\ | |
370 int Y1= buf0[i2 ]>>7;\ | |
371 int Y2= buf0[i2+1]>>7;\ | |
372 int U= (uvbuf1[i ])>>7;\ | |
373 int V= (uvbuf1[i+2048])>>7;\ | |
7720 | 374 |
375 #define YSCALE_YUV_2_RGB1_C(type) \ | |
7723 | 376 YSCALE_YUV_2_PACKED1_C\ |
6578 | 377 type *r, *b, *g;\ |
378 r = c->table_rV[V];\ | |
379 g = c->table_gU[U] + c->table_gV[V];\ | |
380 b = c->table_bU[U];\ | |
3352 | 381 |
7723 | 382 #define YSCALE_YUV_2_PACKED1B_C \ |
6578 | 383 for(i=0; i<(dstW>>1); i++){\ |
384 const int i2= 2*i;\ | |
385 int Y1= buf0[i2 ]>>7;\ | |
386 int Y2= buf0[i2+1]>>7;\ | |
387 int U= (uvbuf0[i ] + uvbuf1[i ])>>8;\ | |
388 int V= (uvbuf0[i+2048] + uvbuf1[i+2048])>>8;\ | |
7720 | 389 |
390 #define YSCALE_YUV_2_RGB1B_C(type) \ | |
7723 | 391 YSCALE_YUV_2_PACKED1B_C\ |
6578 | 392 type *r, *b, *g;\ |
393 r = c->table_rV[V];\ | |
394 g = c->table_gU[U] + c->table_gV[V];\ | |
395 b = c->table_bU[U];\ | |
4297
29fef3982238
15/16 bit dithering in C (5% slower, can be disabled by comenting #define DITHER1XBPP out)
michael
parents:
4295
diff
changeset
|
396 |
7720 | 397 #define YSCALE_YUV_2_ANYRGB_C(func, func2)\ |
6578 | 398 switch(c->dstFormat)\ |
399 {\ | |
400 case IMGFMT_BGR32:\ | |
401 case IMGFMT_RGB32:\ | |
402 func(uint32_t)\ | |
403 ((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1];\ | |
404 ((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2];\ | |
405 } \ | |
406 break;\ | |
407 case IMGFMT_RGB24:\ | |
408 func(uint8_t)\ | |
409 ((uint8_t*)dest)[0]= r[Y1];\ | |
410 ((uint8_t*)dest)[1]= g[Y1];\ | |
411 ((uint8_t*)dest)[2]= b[Y1];\ | |
412 ((uint8_t*)dest)[3]= r[Y2];\ | |
413 ((uint8_t*)dest)[4]= g[Y2];\ | |
414 ((uint8_t*)dest)[5]= b[Y2];\ | |
12385
b5c106b694e4
this isn't actually stupid, but it's not valid C and gcc 3.5 rejects it as such
rfelker
parents:
12301
diff
changeset
|
415 dest+=6;\ |
6578 | 416 }\ |
417 break;\ | |
418 case IMGFMT_BGR24:\ | |
419 func(uint8_t)\ | |
420 ((uint8_t*)dest)[0]= b[Y1];\ | |
421 ((uint8_t*)dest)[1]= g[Y1];\ | |
422 ((uint8_t*)dest)[2]= r[Y1];\ | |
423 ((uint8_t*)dest)[3]= b[Y2];\ | |
424 ((uint8_t*)dest)[4]= g[Y2];\ | |
425 ((uint8_t*)dest)[5]= r[Y2];\ | |
12385
b5c106b694e4
this isn't actually stupid, but it's not valid C and gcc 3.5 rejects it as such
rfelker
parents:
12301
diff
changeset
|
426 dest+=6;\ |
6578 | 427 }\ |
428 break;\ | |
429 case IMGFMT_RGB16:\ | |
430 case IMGFMT_BGR16:\ | |
431 {\ | |
432 const int dr1= dither_2x2_8[y&1 ][0];\ | |
433 const int dg1= dither_2x2_4[y&1 ][0];\ | |
434 const int db1= dither_2x2_8[(y&1)^1][0];\ | |
435 const int dr2= dither_2x2_8[y&1 ][1];\ | |
436 const int dg2= dither_2x2_4[y&1 ][1];\ | |
437 const int db2= dither_2x2_8[(y&1)^1][1];\ | |
438 func(uint16_t)\ | |
439 ((uint16_t*)dest)[i2+0]= r[Y1+dr1] + g[Y1+dg1] + b[Y1+db1];\ | |
440 ((uint16_t*)dest)[i2+1]= r[Y2+dr2] + g[Y2+dg2] + b[Y2+db2];\ | |
441 }\ | |
442 }\ | |
443 break;\ | |
444 case IMGFMT_RGB15:\ | |
445 case IMGFMT_BGR15:\ | |
446 {\ | |
447 const int dr1= dither_2x2_8[y&1 ][0];\ | |
448 const int dg1= dither_2x2_8[y&1 ][1];\ | |
449 const int db1= dither_2x2_8[(y&1)^1][0];\ | |
450 const int dr2= dither_2x2_8[y&1 ][1];\ | |
451 const int dg2= dither_2x2_8[y&1 ][0];\ | |
452 const int db2= dither_2x2_8[(y&1)^1][1];\ | |
453 func(uint16_t)\ | |
454 ((uint16_t*)dest)[i2+0]= r[Y1+dr1] + g[Y1+dg1] + b[Y1+db1];\ | |
455 ((uint16_t*)dest)[i2+1]= r[Y2+dr2] + g[Y2+dg2] + b[Y2+db2];\ | |
456 }\ | |
457 }\ | |
458 break;\ | |
459 case IMGFMT_RGB8:\ | |
460 case IMGFMT_BGR8:\ | |
461 {\ | |
462 const uint8_t * const d64= dither_8x8_73[y&7];\ | |
463 const uint8_t * const d32= dither_8x8_32[y&7];\ | |
464 func(uint8_t)\ | |
465 ((uint8_t*)dest)[i2+0]= r[Y1+d32[(i2+0)&7]] + g[Y1+d32[(i2+0)&7]] + b[Y1+d64[(i2+0)&7]];\ | |
466 ((uint8_t*)dest)[i2+1]= r[Y2+d32[(i2+1)&7]] + g[Y2+d32[(i2+1)&7]] + b[Y2+d64[(i2+1)&7]];\ | |
467 }\ | |
468 }\ | |
469 break;\ | |
470 case IMGFMT_RGB4:\ | |
471 case IMGFMT_BGR4:\ | |
472 {\ | |
473 const uint8_t * const d64= dither_8x8_73 [y&7];\ | |
474 const uint8_t * const d128=dither_8x8_220[y&7];\ | |
475 func(uint8_t)\ | |
9188
da162a0d9ae9
10l found by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michael
parents:
9171
diff
changeset
|
476 ((uint8_t*)dest)[i]= r[Y1+d128[(i2+0)&7]] + g[Y1+d64[(i2+0)&7]] + b[Y1+d128[(i2+0)&7]]\ |
9171 | 477 + ((r[Y2+d128[(i2+1)&7]] + g[Y2+d64[(i2+1)&7]] + b[Y2+d128[(i2+1)&7]])<<4);\ |
478 }\ | |
479 }\ | |
480 break;\ | |
481 case IMGFMT_RG4B:\ | |
482 case IMGFMT_BG4B:\ | |
483 {\ | |
484 const uint8_t * const d64= dither_8x8_73 [y&7];\ | |
485 const uint8_t * const d128=dither_8x8_220[y&7];\ | |
486 func(uint8_t)\ | |
6578 | 487 ((uint8_t*)dest)[i2+0]= r[Y1+d128[(i2+0)&7]] + g[Y1+d64[(i2+0)&7]] + b[Y1+d128[(i2+0)&7]];\ |
488 ((uint8_t*)dest)[i2+1]= r[Y2+d128[(i2+1)&7]] + g[Y2+d64[(i2+1)&7]] + b[Y2+d128[(i2+1)&7]];\ | |
489 }\ | |
490 }\ | |
491 break;\ | |
492 case IMGFMT_RGB1:\ | |
493 case IMGFMT_BGR1:\ | |
494 {\ | |
495 const uint8_t * const d128=dither_8x8_220[y&7];\ | |
496 uint8_t *g= c->table_gU[128] + c->table_gV[128];\ | |
497 for(i=0; i<dstW-7; i+=8){\ | |
498 int acc;\ | |
499 acc = g[((buf0[i ]*yalpha1+buf1[i ]*yalpha)>>19) + d128[0]];\ | |
500 acc+= acc + g[((buf0[i+1]*yalpha1+buf1[i+1]*yalpha)>>19) + d128[1]];\ | |
501 acc+= acc + g[((buf0[i+2]*yalpha1+buf1[i+2]*yalpha)>>19) + d128[2]];\ | |
502 acc+= acc + g[((buf0[i+3]*yalpha1+buf1[i+3]*yalpha)>>19) + d128[3]];\ | |
503 acc+= acc + g[((buf0[i+4]*yalpha1+buf1[i+4]*yalpha)>>19) + d128[4]];\ | |
504 acc+= acc + g[((buf0[i+5]*yalpha1+buf1[i+5]*yalpha)>>19) + d128[5]];\ | |
505 acc+= acc + g[((buf0[i+6]*yalpha1+buf1[i+6]*yalpha)>>19) + d128[6]];\ | |
506 acc+= acc + g[((buf0[i+7]*yalpha1+buf1[i+7]*yalpha)>>19) + d128[7]];\ | |
507 ((uint8_t*)dest)[0]= acc;\ | |
12385
b5c106b694e4
this isn't actually stupid, but it's not valid C and gcc 3.5 rejects it as such
rfelker
parents:
12301
diff
changeset
|
508 dest++;\ |
6578 | 509 }\ |
510 \ | |
511 /*\ | |
512 ((uint8_t*)dest)-= dstW>>4;\ | |
513 {\ | |
514 int acc=0;\ | |
515 int left=0;\ | |
516 static int top[1024];\ | |
517 static int last_new[1024][1024];\ | |
518 static int last_in3[1024][1024];\ | |
519 static int drift[1024][1024];\ | |
520 int topLeft=0;\ | |
521 int shift=0;\ | |
522 int count=0;\ | |
523 const uint8_t * const d128=dither_8x8_220[y&7];\ | |
524 int error_new=0;\ | |
525 int error_in3=0;\ | |
526 int f=0;\ | |
527 \ | |
528 for(i=dstW>>1; i<dstW; i++){\ | |
529 int in= ((buf0[i ]*yalpha1+buf1[i ]*yalpha)>>19);\ | |
530 int in2 = (76309 * (in - 16) + 32768) >> 16;\ | |
531 int in3 = (in2 < 0) ? 0 : ((in2 > 255) ? 255 : in2);\ | |
532 int old= (left*7 + topLeft + top[i]*5 + top[i+1]*3)/20 + in3\ | |
533 + (last_new[y][i] - in3)*f/256;\ | |
534 int new= old> 128 ? 255 : 0;\ | |
535 \ | |
536 error_new+= ABS(last_new[y][i] - new);\ | |
537 error_in3+= ABS(last_in3[y][i] - in3);\ | |
538 f= error_new - error_in3*4;\ | |
539 if(f<0) f=0;\ | |
540 if(f>256) f=256;\ | |
541 \ | |
542 topLeft= top[i];\ | |
543 left= top[i]= old - new;\ | |
544 last_new[y][i]= new;\ | |
545 last_in3[y][i]= in3;\ | |
546 \ | |
547 acc+= acc + (new&1);\ | |
548 if((i&7)==6){\ | |
549 ((uint8_t*)dest)[0]= acc;\ | |
550 ((uint8_t*)dest)++;\ | |
551 }\ | |
552 }\ | |
553 }\ | |
554 */\ | |
555 }\ | |
556 break;\ | |
7720 | 557 case IMGFMT_YUY2:\ |
558 func2\ | |
559 ((uint8_t*)dest)[2*i2+0]= Y1;\ | |
560 ((uint8_t*)dest)[2*i2+1]= U;\ | |
561 ((uint8_t*)dest)[2*i2+2]= Y2;\ | |
562 ((uint8_t*)dest)[2*i2+3]= V;\ | |
563 } \ | |
564 break;\ | |
11068 | 565 case IMGFMT_UYVY:\ |
566 func2\ | |
567 ((uint8_t*)dest)[2*i2+0]= U;\ | |
568 ((uint8_t*)dest)[2*i2+1]= Y1;\ | |
569 ((uint8_t*)dest)[2*i2+2]= V;\ | |
570 ((uint8_t*)dest)[2*i2+3]= Y2;\ | |
571 } \ | |
572 break;\ | |
6578 | 573 }\ |
3352 | 574 |
575 | |
7723 | 576 static inline void yuv2packedXinC(SwsContext *c, int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize, |
6578 | 577 int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize, |
578 uint8_t *dest, int dstW, int y) | |
579 { | |
580 int i; | |
581 switch(c->dstFormat) | |
3352 | 582 { |
6578 | 583 case IMGFMT_RGB32: |
584 case IMGFMT_BGR32: | |
585 YSCALE_YUV_2_RGBX_C(uint32_t) | |
586 ((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1]; | |
587 ((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2]; | |
588 } | |
589 break; | |
590 case IMGFMT_RGB24: | |
591 YSCALE_YUV_2_RGBX_C(uint8_t) | |
592 ((uint8_t*)dest)[0]= r[Y1]; | |
593 ((uint8_t*)dest)[1]= g[Y1]; | |
594 ((uint8_t*)dest)[2]= b[Y1]; | |
595 ((uint8_t*)dest)[3]= r[Y2]; | |
596 ((uint8_t*)dest)[4]= g[Y2]; | |
597 ((uint8_t*)dest)[5]= b[Y2]; | |
12385
b5c106b694e4
this isn't actually stupid, but it's not valid C and gcc 3.5 rejects it as such
rfelker
parents:
12301
diff
changeset
|
598 dest+=6; |
6578 | 599 } |
600 break; | |
601 case IMGFMT_BGR24: | |
602 YSCALE_YUV_2_RGBX_C(uint8_t) | |
603 ((uint8_t*)dest)[0]= b[Y1]; | |
604 ((uint8_t*)dest)[1]= g[Y1]; | |
605 ((uint8_t*)dest)[2]= r[Y1]; | |
606 ((uint8_t*)dest)[3]= b[Y2]; | |
607 ((uint8_t*)dest)[4]= g[Y2]; | |
608 ((uint8_t*)dest)[5]= r[Y2]; | |
12385
b5c106b694e4
this isn't actually stupid, but it's not valid C and gcc 3.5 rejects it as such
rfelker
parents:
12301
diff
changeset
|
609 dest+=6; |
6578 | 610 } |
611 break; | |
612 case IMGFMT_RGB16: | |
613 case IMGFMT_BGR16: | |
614 { | |
615 const int dr1= dither_2x2_8[y&1 ][0]; | |
616 const int dg1= dither_2x2_4[y&1 ][0]; | |
617 const int db1= dither_2x2_8[(y&1)^1][0]; | |
618 const int dr2= dither_2x2_8[y&1 ][1]; | |
619 const int dg2= dither_2x2_4[y&1 ][1]; | |
620 const int db2= dither_2x2_8[(y&1)^1][1]; | |
621 YSCALE_YUV_2_RGBX_C(uint16_t) | |
622 ((uint16_t*)dest)[i2+0]= r[Y1+dr1] + g[Y1+dg1] + b[Y1+db1]; | |
623 ((uint16_t*)dest)[i2+1]= r[Y2+dr2] + g[Y2+dg2] + b[Y2+db2]; | |
624 } | |
625 } | |
626 break; | |
627 case IMGFMT_RGB15: | |
628 case IMGFMT_BGR15: | |
629 { | |
630 const int dr1= dither_2x2_8[y&1 ][0]; | |
631 const int dg1= dither_2x2_8[y&1 ][1]; | |
632 const int db1= dither_2x2_8[(y&1)^1][0]; | |
633 const int dr2= dither_2x2_8[y&1 ][1]; | |
634 const int dg2= dither_2x2_8[y&1 ][0]; | |
635 const int db2= dither_2x2_8[(y&1)^1][1]; | |
636 YSCALE_YUV_2_RGBX_C(uint16_t) | |
637 ((uint16_t*)dest)[i2+0]= r[Y1+dr1] + g[Y1+dg1] + b[Y1+db1]; | |
638 ((uint16_t*)dest)[i2+1]= r[Y2+dr2] + g[Y2+dg2] + b[Y2+db2]; | |
639 } | |
640 } | |
641 break; | |
642 case IMGFMT_RGB8: | |
643 case IMGFMT_BGR8: | |
644 { | |
645 const uint8_t * const d64= dither_8x8_73[y&7]; | |
646 const uint8_t * const d32= dither_8x8_32[y&7]; | |
647 YSCALE_YUV_2_RGBX_C(uint8_t) | |
648 ((uint8_t*)dest)[i2+0]= r[Y1+d32[(i2+0)&7]] + g[Y1+d32[(i2+0)&7]] + b[Y1+d64[(i2+0)&7]]; | |
649 ((uint8_t*)dest)[i2+1]= r[Y2+d32[(i2+1)&7]] + g[Y2+d32[(i2+1)&7]] + b[Y2+d64[(i2+1)&7]]; | |
650 } | |
651 } | |
652 break; | |
653 case IMGFMT_RGB4: | |
654 case IMGFMT_BGR4: | |
655 { | |
656 const uint8_t * const d64= dither_8x8_73 [y&7]; | |
657 const uint8_t * const d128=dither_8x8_220[y&7]; | |
658 YSCALE_YUV_2_RGBX_C(uint8_t) | |
9188
da162a0d9ae9
10l found by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michael
parents:
9171
diff
changeset
|
659 ((uint8_t*)dest)[i]= r[Y1+d128[(i2+0)&7]] + g[Y1+d64[(i2+0)&7]] + b[Y1+d128[(i2+0)&7]] |
9171 | 660 +((r[Y2+d128[(i2+1)&7]] + g[Y2+d64[(i2+1)&7]] + b[Y2+d128[(i2+1)&7]])<<4); |
661 } | |
662 } | |
663 break; | |
664 case IMGFMT_RG4B: | |
665 case IMGFMT_BG4B: | |
666 { | |
667 const uint8_t * const d64= dither_8x8_73 [y&7]; | |
668 const uint8_t * const d128=dither_8x8_220[y&7]; | |
669 YSCALE_YUV_2_RGBX_C(uint8_t) | |
6578 | 670 ((uint8_t*)dest)[i2+0]= r[Y1+d128[(i2+0)&7]] + g[Y1+d64[(i2+0)&7]] + b[Y1+d128[(i2+0)&7]]; |
671 ((uint8_t*)dest)[i2+1]= r[Y2+d128[(i2+1)&7]] + g[Y2+d64[(i2+1)&7]] + b[Y2+d128[(i2+1)&7]]; | |
672 } | |
673 } | |
674 break; | |
675 case IMGFMT_RGB1: | |
676 case IMGFMT_BGR1: | |
677 { | |
678 const uint8_t * const d128=dither_8x8_220[y&7]; | |
679 uint8_t *g= c->table_gU[128] + c->table_gV[128]; | |
680 int acc=0; | |
681 for(i=0; i<dstW-1; i+=2){ | |
682 int j; | |
11122 | 683 int Y1=1<<18; |
684 int Y2=1<<18; | |
4297
29fef3982238
15/16 bit dithering in C (5% slower, can be disabled by comenting #define DITHER1XBPP out)
michael
parents:
4295
diff
changeset
|
685 |
6578 | 686 for(j=0; j<lumFilterSize; j++) |
687 { | |
688 Y1 += lumSrc[j][i] * lumFilter[j]; | |
689 Y2 += lumSrc[j][i+1] * lumFilter[j]; | |
690 } | |
691 Y1>>=19; | |
692 Y2>>=19; | |
693 if((Y1|Y2)&256) | |
694 { | |
695 if(Y1>255) Y1=255; | |
696 else if(Y1<0)Y1=0; | |
697 if(Y2>255) Y2=255; | |
698 else if(Y2<0)Y2=0; | |
699 } | |
700 acc+= acc + g[Y1+d128[(i+0)&7]]; | |
701 acc+= acc + g[Y2+d128[(i+1)&7]]; | |
702 if((i&7)==6){ | |
703 ((uint8_t*)dest)[0]= acc; | |
12385
b5c106b694e4
this isn't actually stupid, but it's not valid C and gcc 3.5 rejects it as such
rfelker
parents:
12301
diff
changeset
|
704 dest++; |
6578 | 705 } |
3352 | 706 } |
707 } | |
6578 | 708 break; |
7720 | 709 case IMGFMT_YUY2: |
7723 | 710 YSCALE_YUV_2_PACKEDX_C(void) |
7720 | 711 ((uint8_t*)dest)[2*i2+0]= Y1; |
712 ((uint8_t*)dest)[2*i2+1]= U; | |
713 ((uint8_t*)dest)[2*i2+2]= Y2; | |
714 ((uint8_t*)dest)[2*i2+3]= V; | |
715 } | |
716 break; | |
11068 | 717 case IMGFMT_UYVY: |
718 YSCALE_YUV_2_PACKEDX_C(void) | |
719 ((uint8_t*)dest)[2*i2+0]= U; | |
720 ((uint8_t*)dest)[2*i2+1]= Y1; | |
721 ((uint8_t*)dest)[2*i2+2]= V; | |
722 ((uint8_t*)dest)[2*i2+3]= Y2; | |
723 } | |
724 break; | |
3352 | 725 } |
726 } | |
727 | |
728 | |
3126 | 729 //Note: we have C, X86, MMX, MMX2, 3DNOW version therse no 3DNOW+MMX2 one |
730 //Plain C versions | |
3152 | 731 #if !defined (HAVE_MMX) || defined (RUNTIME_CPUDETECT) |
732 #define COMPILE_C | |
733 #endif | |
734 | |
12017
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
735 #ifdef ARCH_POWERPC |
15523 | 736 #if defined (HAVE_ALTIVEC) || defined (RUNTIME_CPUDETECT) |
12017
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
737 #define COMPILE_ALTIVEC |
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
738 #endif //HAVE_ALTIVEC |
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
739 #endif //ARCH_POWERPC |
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
740 |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
741 #if defined(ARCH_X86) || defined(ARCH_X86_64) |
3152 | 742 |
743 #if (defined (HAVE_MMX) && !defined (HAVE_3DNOW) && !defined (HAVE_MMX2)) || defined (RUNTIME_CPUDETECT) | |
744 #define COMPILE_MMX | |
745 #endif | |
746 | |
747 #if defined (HAVE_MMX2) || defined (RUNTIME_CPUDETECT) | |
748 #define COMPILE_MMX2 | |
749 #endif | |
750 | |
751 #if (defined (HAVE_3DNOW) && !defined (HAVE_MMX2)) || defined (RUNTIME_CPUDETECT) | |
752 #define COMPILE_3DNOW | |
753 #endif | |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
754 #endif //ARCH_X86 || ARCH_X86_64 |
3152 | 755 |
756 #undef HAVE_MMX | |
757 #undef HAVE_MMX2 | |
758 #undef HAVE_3DNOW | |
759 | |
760 #ifdef COMPILE_C | |
3126 | 761 #undef HAVE_MMX |
762 #undef HAVE_MMX2 | |
763 #undef HAVE_3DNOW | |
12017
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
764 #undef HAVE_ALTIVEC |
3126 | 765 #define RENAME(a) a ## _C |
766 #include "swscale_template.c" | |
3152 | 767 #endif |
2316
bcb229557e9b
fixed alignment (static variables where sometimes not 8-byte aligned)
michael
parents:
2297
diff
changeset
|
768 |
12017
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
769 #ifdef ARCH_POWERPC |
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
770 #ifdef COMPILE_ALTIVEC |
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
771 #undef RENAME |
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
772 #define HAVE_ALTIVEC |
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
773 #define RENAME(a) a ## _altivec |
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
774 #include "swscale_template.c" |
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
775 #endif |
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
776 #endif //ARCH_POWERPC |
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
777 |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
778 #if defined(ARCH_X86) || defined(ARCH_X86_64) |
2576 | 779 |
3126 | 780 //X86 versions |
781 /* | |
782 #undef RENAME | |
783 #undef HAVE_MMX | |
784 #undef HAVE_MMX2 | |
785 #undef HAVE_3DNOW | |
786 #define ARCH_X86 | |
787 #define RENAME(a) a ## _X86 | |
788 #include "swscale_template.c" | |
789 */ | |
790 //MMX versions | |
3152 | 791 #ifdef COMPILE_MMX |
3126 | 792 #undef RENAME |
793 #define HAVE_MMX | |
794 #undef HAVE_MMX2 | |
795 #undef HAVE_3DNOW | |
796 #define RENAME(a) a ## _MMX | |
797 #include "swscale_template.c" | |
3152 | 798 #endif |
2316
bcb229557e9b
fixed alignment (static variables where sometimes not 8-byte aligned)
michael
parents:
2297
diff
changeset
|
799 |
3126 | 800 //MMX2 versions |
3152 | 801 #ifdef COMPILE_MMX2 |
3126 | 802 #undef RENAME |
803 #define HAVE_MMX | |
804 #define HAVE_MMX2 | |
805 #undef HAVE_3DNOW | |
806 #define RENAME(a) a ## _MMX2 | |
807 #include "swscale_template.c" | |
3152 | 808 #endif |
2469 | 809 |
3126 | 810 //3DNOW versions |
3152 | 811 #ifdef COMPILE_3DNOW |
3126 | 812 #undef RENAME |
813 #define HAVE_MMX | |
814 #undef HAVE_MMX2 | |
815 #define HAVE_3DNOW | |
816 #define RENAME(a) a ## _3DNow | |
817 #include "swscale_template.c" | |
3152 | 818 #endif |
2469 | 819 |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
820 #endif //ARCH_X86 || ARCH_X86_64 |
2469 | 821 |
11000 | 822 // minor note: the HAVE_xyz is messed up after that line so don't use it |
2316
bcb229557e9b
fixed alignment (static variables where sometimes not 8-byte aligned)
michael
parents:
2297
diff
changeset
|
823 |
6637 | 824 static double getSplineCoeff(double a, double b, double c, double d, double dist) |
825 { | |
826 // printf("%f %f %f %f %f\n", a,b,c,d,dist); | |
827 if(dist<=1.0) return ((d*dist + c)*dist + b)*dist +a; | |
828 else return getSplineCoeff( 0.0, | |
829 b+ 2.0*c + 3.0*d, | |
830 c + 3.0*d, | |
831 -b- 3.0*c - 6.0*d, | |
832 dist-1.0); | |
833 } | |
2216 | 834 |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
835 static inline void initFilter(int16_t **outFilter, int16_t **filterPos, int *outFilterSize, int xInc, |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
836 int srcW, int dstW, int filterAlign, int one, int flags, |
13373
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
837 SwsVector *srcFilter, SwsVector *dstFilter, double param[2]) |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
838 { |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
839 int i; |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
840 int filterSize; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
841 int filter2Size; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
842 int minFilterSize; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
843 double *filter=NULL; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
844 double *filter2=NULL; |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
845 #if defined(ARCH_X86) || defined(ARCH_X86_64) |
9975 | 846 if(flags & SWS_CPU_CAPS_MMX) |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
847 asm volatile("emms\n\t"::: "memory"); //FIXME this shouldnt be required but it IS (even for non mmx versions) |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
848 #endif |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
849 |
4563
835d4fce67d5
fixing green line at right side bug (reported by Nick Kurshev <nickols_k@mail.ru>)
michael
parents:
4558
diff
changeset
|
850 // Note the +1 is for the MMXscaler which reads over the end |
4419 | 851 *filterPos = (int16_t*)memalign(8, (dstW+1)*sizeof(int16_t)); |
852 | |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
853 if(ABS(xInc - 0x10000) <10) // unscaled |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
854 { |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
855 int i; |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
856 filterSize= 1; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
857 filter= (double*)memalign(8, dstW*sizeof(double)*filterSize); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
858 for(i=0; i<dstW*filterSize; i++) filter[i]=0; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
859 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
860 for(i=0; i<dstW; i++) |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
861 { |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
862 filter[i*filterSize]=1; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
863 (*filterPos)[i]=i; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
864 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
865 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
866 } |
4401
8d00348d0d6b
nearest neighbor / sdl emulation ;) scaling (-sws 4)
michael
parents:
4304
diff
changeset
|
867 else if(flags&SWS_POINT) // lame looking point sampling mode |
8d00348d0d6b
nearest neighbor / sdl emulation ;) scaling (-sws 4)
michael
parents:
4304
diff
changeset
|
868 { |
8d00348d0d6b
nearest neighbor / sdl emulation ;) scaling (-sws 4)
michael
parents:
4304
diff
changeset
|
869 int i; |
8d00348d0d6b
nearest neighbor / sdl emulation ;) scaling (-sws 4)
michael
parents:
4304
diff
changeset
|
870 int xDstInSrc; |
8d00348d0d6b
nearest neighbor / sdl emulation ;) scaling (-sws 4)
michael
parents:
4304
diff
changeset
|
871 filterSize= 1; |
8d00348d0d6b
nearest neighbor / sdl emulation ;) scaling (-sws 4)
michael
parents:
4304
diff
changeset
|
872 filter= (double*)memalign(8, dstW*sizeof(double)*filterSize); |
8d00348d0d6b
nearest neighbor / sdl emulation ;) scaling (-sws 4)
michael
parents:
4304
diff
changeset
|
873 |
8d00348d0d6b
nearest neighbor / sdl emulation ;) scaling (-sws 4)
michael
parents:
4304
diff
changeset
|
874 xDstInSrc= xInc/2 - 0x8000; |
8d00348d0d6b
nearest neighbor / sdl emulation ;) scaling (-sws 4)
michael
parents:
4304
diff
changeset
|
875 for(i=0; i<dstW; i++) |
8d00348d0d6b
nearest neighbor / sdl emulation ;) scaling (-sws 4)
michael
parents:
4304
diff
changeset
|
876 { |
4492
8303419cc60f
filterPos bugfix (only nearest neighbor scaling was affected)
michael
parents:
4481
diff
changeset
|
877 int xx= (xDstInSrc - ((filterSize-1)<<15) + (1<<15))>>16; |
4401
8d00348d0d6b
nearest neighbor / sdl emulation ;) scaling (-sws 4)
michael
parents:
4304
diff
changeset
|
878 |
8d00348d0d6b
nearest neighbor / sdl emulation ;) scaling (-sws 4)
michael
parents:
4304
diff
changeset
|
879 (*filterPos)[i]= xx; |
8d00348d0d6b
nearest neighbor / sdl emulation ;) scaling (-sws 4)
michael
parents:
4304
diff
changeset
|
880 filter[i]= 1.0; |
8d00348d0d6b
nearest neighbor / sdl emulation ;) scaling (-sws 4)
michael
parents:
4304
diff
changeset
|
881 xDstInSrc+= xInc; |
8d00348d0d6b
nearest neighbor / sdl emulation ;) scaling (-sws 4)
michael
parents:
4304
diff
changeset
|
882 } |
8d00348d0d6b
nearest neighbor / sdl emulation ;) scaling (-sws 4)
michael
parents:
4304
diff
changeset
|
883 } |
6637 | 884 else if((xInc <= (1<<16) && (flags&SWS_AREA)) || (flags&SWS_FAST_BILINEAR)) // bilinear upscale |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
885 { |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
886 int i; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
887 int xDstInSrc; |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
888 if (flags&SWS_BICUBIC) filterSize= 4; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
889 else if(flags&SWS_X ) filterSize= 4; |
4402
67abbf501b02
area averageing scaling support (-sws 5) (is identical to bilinear for upscale)
michael
parents:
4401
diff
changeset
|
890 else filterSize= 2; // SWS_BILINEAR / SWS_AREA |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
891 filter= (double*)memalign(8, dstW*sizeof(double)*filterSize); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
892 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
893 xDstInSrc= xInc/2 - 0x8000; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
894 for(i=0; i<dstW; i++) |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
895 { |
4492
8303419cc60f
filterPos bugfix (only nearest neighbor scaling was affected)
michael
parents:
4481
diff
changeset
|
896 int xx= (xDstInSrc - ((filterSize-1)<<15) + (1<<15))>>16; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
897 int j; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
898 |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
899 (*filterPos)[i]= xx; |
4402
67abbf501b02
area averageing scaling support (-sws 5) (is identical to bilinear for upscale)
michael
parents:
4401
diff
changeset
|
900 //Bilinear upscale / linear interpolate / Area averaging |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
901 for(j=0; j<filterSize; j++) |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
902 { |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
903 double d= ABS((xx<<16) - xDstInSrc)/(double)(1<<16); |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
904 double coeff= 1.0 - d; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
905 if(coeff<0) coeff=0; |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
906 filter[i*filterSize + j]= coeff; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
907 xx++; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
908 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
909 xDstInSrc+= xInc; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
910 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
911 } |
6637 | 912 else |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
913 { |
6637 | 914 double xDstInSrc; |
915 double sizeFactor, filterSizeInSrc; | |
916 const double xInc1= (double)xInc / (double)(1<<16); | |
4806 | 917 |
6637 | 918 if (flags&SWS_BICUBIC) sizeFactor= 4.0; |
919 else if(flags&SWS_X) sizeFactor= 8.0; | |
920 else if(flags&SWS_AREA) sizeFactor= 1.0; //downscale only, for upscale it is bilinear | |
921 else if(flags&SWS_GAUSS) sizeFactor= 8.0; // infinite ;) | |
13373
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
922 else if(flags&SWS_LANCZOS) sizeFactor= param[0] != SWS_PARAM_DEFAULT ? 2.0*param[0] : 6.0; |
6679
5c4beb993674
fixing sinc filter (seems the problem was caused by rounding in pmulhw -> solution use shorter filter, its long and slow enough anyway)
michael
parents:
6637
diff
changeset
|
923 else if(flags&SWS_SINC) sizeFactor= 20.0; // infinite ;) |
6637 | 924 else if(flags&SWS_SPLINE) sizeFactor= 20.0; // infinite ;) |
925 else if(flags&SWS_BILINEAR) sizeFactor= 2.0; | |
6679
5c4beb993674
fixing sinc filter (seems the problem was caused by rounding in pmulhw -> solution use shorter filter, its long and slow enough anyway)
michael
parents:
6637
diff
changeset
|
926 else { |
5c4beb993674
fixing sinc filter (seems the problem was caused by rounding in pmulhw -> solution use shorter filter, its long and slow enough anyway)
michael
parents:
6637
diff
changeset
|
927 sizeFactor= 0.0; //GCC warning killer |
5c4beb993674
fixing sinc filter (seems the problem was caused by rounding in pmulhw -> solution use shorter filter, its long and slow enough anyway)
michael
parents:
6637
diff
changeset
|
928 ASSERT(0) |
5c4beb993674
fixing sinc filter (seems the problem was caused by rounding in pmulhw -> solution use shorter filter, its long and slow enough anyway)
michael
parents:
6637
diff
changeset
|
929 } |
6637 | 930 |
931 if(xInc1 <= 1.0) filterSizeInSrc= sizeFactor; // upscale | |
932 else filterSizeInSrc= sizeFactor*srcW / (double)dstW; | |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
933 |
6637 | 934 filterSize= (int)ceil(1 + filterSizeInSrc); // will be reduced later if possible |
935 if(filterSize > srcW-2) filterSize=srcW-2; | |
936 | |
937 filter= (double*)memalign(16, dstW*sizeof(double)*filterSize); | |
938 | |
939 xDstInSrc= xInc1 / 2.0 - 0.5; | |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
940 for(i=0; i<dstW; i++) |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
941 { |
6637 | 942 int xx= (int)(xDstInSrc - (filterSize-1)*0.5 + 0.5); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
943 int j; |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
944 (*filterPos)[i]= xx; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
945 for(j=0; j<filterSize; j++) |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
946 { |
6637 | 947 double d= ABS(xx - xDstInSrc)/filterSizeInSrc*sizeFactor; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
948 double coeff; |
6637 | 949 if(flags & SWS_BICUBIC) |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
950 { |
13373
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
951 double B= param[0] != SWS_PARAM_DEFAULT ? param[0] : 0.0; |
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
952 double C= param[1] != SWS_PARAM_DEFAULT ? param[1] : 0.6; |
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
953 |
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
954 if(d<1.0) |
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
955 coeff = (12-9*B-6*C)*d*d*d + (-18+12*B+6*C)*d*d + 6-2*B; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
956 else if(d<2.0) |
13373
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
957 coeff = (-B-6*C)*d*d*d + (6*B+30*C)*d*d + (-12*B-48*C)*d +8*B+24*C; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
958 else |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
959 coeff=0.0; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
960 } |
6637 | 961 /* else if(flags & SWS_X) |
962 { | |
963 double p= param ? param*0.01 : 0.3; | |
964 coeff = d ? sin(d*PI)/(d*PI) : 1.0; | |
965 coeff*= pow(2.0, - p*d*d); | |
966 }*/ | |
967 else if(flags & SWS_X) | |
968 { | |
13373
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
969 double A= param[0] != SWS_PARAM_DEFAULT ? param[0] : 1.0; |
6637 | 970 |
971 if(d<1.0) | |
972 coeff = cos(d*PI); | |
973 else | |
974 coeff=-1.0; | |
975 if(coeff<0.0) coeff= -pow(-coeff, A); | |
976 else coeff= pow( coeff, A); | |
977 coeff= coeff*0.5 + 0.5; | |
978 } | |
4402
67abbf501b02
area averageing scaling support (-sws 5) (is identical to bilinear for upscale)
michael
parents:
4401
diff
changeset
|
979 else if(flags & SWS_AREA) |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
980 { |
6637 | 981 double srcPixelSize= 1.0/xInc1; |
4402
67abbf501b02
area averageing scaling support (-sws 5) (is identical to bilinear for upscale)
michael
parents:
4401
diff
changeset
|
982 if(d + srcPixelSize/2 < 0.5) coeff= 1.0; |
67abbf501b02
area averageing scaling support (-sws 5) (is identical to bilinear for upscale)
michael
parents:
4401
diff
changeset
|
983 else if(d - srcPixelSize/2 < 0.5) coeff= (0.5-d)/srcPixelSize + 0.5; |
67abbf501b02
area averageing scaling support (-sws 5) (is identical to bilinear for upscale)
michael
parents:
4401
diff
changeset
|
984 else coeff=0.0; |
67abbf501b02
area averageing scaling support (-sws 5) (is identical to bilinear for upscale)
michael
parents:
4401
diff
changeset
|
985 } |
6637 | 986 else if(flags & SWS_GAUSS) |
987 { | |
13373
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
988 double p= param[0] != SWS_PARAM_DEFAULT ? param[0] : 3.0; |
6637 | 989 coeff = pow(2.0, - p*d*d); |
990 } | |
991 else if(flags & SWS_SINC) | |
992 { | |
993 coeff = d ? sin(d*PI)/(d*PI) : 1.0; | |
994 } | |
995 else if(flags & SWS_LANCZOS) | |
996 { | |
13373
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
997 double p= param[0] != SWS_PARAM_DEFAULT ? param[0] : 3.0; |
6637 | 998 coeff = d ? sin(d*PI)*sin(d*PI/p)/(d*d*PI*PI/p) : 1.0; |
999 if(d>p) coeff=0; | |
1000 } | |
1001 else if(flags & SWS_BILINEAR) | |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1002 { |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1003 coeff= 1.0 - d; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1004 if(coeff<0) coeff=0; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1005 } |
6637 | 1006 else if(flags & SWS_SPLINE) |
1007 { | |
1008 double p=-2.196152422706632; | |
1009 coeff = getSplineCoeff(1.0, 0.0, p, -p-1.0, d); | |
1010 } | |
6679
5c4beb993674
fixing sinc filter (seems the problem was caused by rounding in pmulhw -> solution use shorter filter, its long and slow enough anyway)
michael
parents:
6637
diff
changeset
|
1011 else { |
5c4beb993674
fixing sinc filter (seems the problem was caused by rounding in pmulhw -> solution use shorter filter, its long and slow enough anyway)
michael
parents:
6637
diff
changeset
|
1012 coeff= 0.0; //GCC warning killer |
5c4beb993674
fixing sinc filter (seems the problem was caused by rounding in pmulhw -> solution use shorter filter, its long and slow enough anyway)
michael
parents:
6637
diff
changeset
|
1013 ASSERT(0) |
5c4beb993674
fixing sinc filter (seems the problem was caused by rounding in pmulhw -> solution use shorter filter, its long and slow enough anyway)
michael
parents:
6637
diff
changeset
|
1014 } |
6637 | 1015 |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1016 filter[i*filterSize + j]= coeff; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1017 xx++; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1018 } |
6637 | 1019 xDstInSrc+= xInc1; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1020 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1021 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1022 |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1023 /* apply src & dst Filter to filter -> filter2 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1024 free(filter); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1025 */ |
4806 | 1026 ASSERT(filterSize>0) |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1027 filter2Size= filterSize; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1028 if(srcFilter) filter2Size+= srcFilter->length - 1; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1029 if(dstFilter) filter2Size+= dstFilter->length - 1; |
4806 | 1030 ASSERT(filter2Size>0) |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1031 filter2= (double*)memalign(8, filter2Size*dstW*sizeof(double)); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1032 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1033 for(i=0; i<dstW; i++) |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1034 { |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1035 int j; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1036 SwsVector scaleFilter; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1037 SwsVector *outVec; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1038 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1039 scaleFilter.coeff= filter + i*filterSize; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1040 scaleFilter.length= filterSize; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1041 |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
1042 if(srcFilter) outVec= sws_getConvVec(srcFilter, &scaleFilter); |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1043 else outVec= &scaleFilter; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1044 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1045 ASSERT(outVec->length == filter2Size) |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1046 //FIXME dstFilter |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1047 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1048 for(j=0; j<outVec->length; j++) |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1049 { |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1050 filter2[i*filter2Size + j]= outVec->coeff[j]; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1051 } |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1052 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1053 (*filterPos)[i]+= (filterSize-1)/2 - (filter2Size-1)/2; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1054 |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
1055 if(outVec != &scaleFilter) sws_freeVec(outVec); |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1056 } |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1057 free(filter); filter=NULL; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1058 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1059 /* try to reduce the filter-size (step1 find size and shift left) */ |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1060 // Assume its near normalized (*0.5 or *2.0 is ok but * 0.001 is not) |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1061 minFilterSize= 0; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1062 for(i=dstW-1; i>=0; i--) |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1063 { |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1064 int min= filter2Size; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1065 int j; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1066 double cutOff=0.0; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1067 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1068 /* get rid off near zero elements on the left by shifting left */ |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1069 for(j=0; j<filter2Size; j++) |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1070 { |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1071 int k; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1072 cutOff += ABS(filter2[i*filter2Size]); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1073 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1074 if(cutOff > SWS_MAX_REDUCE_CUTOFF) break; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1075 |
11000 | 1076 /* preserve Monotonicity because the core can't handle the filter otherwise */ |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1077 if(i<dstW-1 && (*filterPos)[i] >= (*filterPos)[i+1]) break; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1078 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1079 // Move filter coeffs left |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1080 for(k=1; k<filter2Size; k++) |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1081 filter2[i*filter2Size + k - 1]= filter2[i*filter2Size + k]; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1082 filter2[i*filter2Size + k - 1]= 0.0; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1083 (*filterPos)[i]++; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1084 } |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1085 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1086 cutOff=0.0; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1087 /* count near zeros on the right */ |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1088 for(j=filter2Size-1; j>0; j--) |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1089 { |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1090 cutOff += ABS(filter2[i*filter2Size + j]); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1091 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1092 if(cutOff > SWS_MAX_REDUCE_CUTOFF) break; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1093 min--; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1094 } |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1095 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1096 if(min>minFilterSize) minFilterSize= min; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1097 } |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1098 |
12130
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
1099 if (flags & SWS_CPU_CAPS_ALTIVEC) { |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
1100 // we can handle the special case 4, |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
1101 // so we don't want to go to the full 8 |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
1102 if (minFilterSize < 5) |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
1103 filterAlign = 4; |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
1104 |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
1105 // we really don't want to waste our time |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
1106 // doing useless computation, so fall-back on |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
1107 // the scalar C code for very small filter. |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
1108 // vectorizing is worth it only if you have |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
1109 // decent-sized vector. |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
1110 if (minFilterSize < 3) |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
1111 filterAlign = 1; |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
1112 } |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
1113 |
4806 | 1114 ASSERT(minFilterSize > 0) |
4419 | 1115 filterSize= (minFilterSize +(filterAlign-1)) & (~(filterAlign-1)); |
4806 | 1116 ASSERT(filterSize > 0) |
4419 | 1117 filter= (double*)memalign(8, filterSize*dstW*sizeof(double)); |
1118 *outFilterSize= filterSize; | |
1119 | |
5937 | 1120 if(flags&SWS_PRINT_INFO) |
16404 | 1121 MSG_V("SwScaler: reducing / aligning filtersize %d -> %d\n", filter2Size, filterSize); |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1122 /* try to reduce the filter-size (step2 reduce it) */ |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1123 for(i=0; i<dstW; i++) |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1124 { |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1125 int j; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1126 |
4419 | 1127 for(j=0; j<filterSize; j++) |
1128 { | |
1129 if(j>=filter2Size) filter[i*filterSize + j]= 0.0; | |
1130 else filter[i*filterSize + j]= filter2[i*filter2Size + j]; | |
1131 } | |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1132 } |
4419 | 1133 free(filter2); filter2=NULL; |
1134 | |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1135 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1136 //FIXME try to align filterpos if possible |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1137 |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1138 //fix borders |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1139 for(i=0; i<dstW; i++) |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1140 { |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1141 int j; |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1142 if((*filterPos)[i] < 0) |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1143 { |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1144 // Move filter coeffs left to compensate for filterPos |
4419 | 1145 for(j=1; j<filterSize; j++) |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1146 { |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1147 int left= MAX(j + (*filterPos)[i], 0); |
4419 | 1148 filter[i*filterSize + left] += filter[i*filterSize + j]; |
1149 filter[i*filterSize + j]=0; | |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1150 } |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1151 (*filterPos)[i]= 0; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1152 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1153 |
4419 | 1154 if((*filterPos)[i] + filterSize > srcW) |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1155 { |
4419 | 1156 int shift= (*filterPos)[i] + filterSize - srcW; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1157 // Move filter coeffs right to compensate for filterPos |
4419 | 1158 for(j=filterSize-2; j>=0; j--) |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1159 { |
4419 | 1160 int right= MIN(j + shift, filterSize-1); |
1161 filter[i*filterSize +right] += filter[i*filterSize +j]; | |
1162 filter[i*filterSize +j]=0; | |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1163 } |
4419 | 1164 (*filterPos)[i]= srcW - filterSize; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1165 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1166 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1167 |
4419 | 1168 // Note the +1 is for the MMXscaler which reads over the end |
17558
ad90899eeee6
AltiVec operations need to have memory aligned on 16-byte boundaries.
diego
parents:
17530
diff
changeset
|
1169 /* align at 16 for AltiVec (needed by hScale_altivec_real) */ |
ad90899eeee6
AltiVec operations need to have memory aligned on 16-byte boundaries.
diego
parents:
17530
diff
changeset
|
1170 *outFilter= (int16_t*)memalign(16, *outFilterSize*(dstW+1)*sizeof(int16_t)); |
4419 | 1171 memset(*outFilter, 0, *outFilterSize*(dstW+1)*sizeof(int16_t)); |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1172 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1173 /* Normalize & Store in outFilter */ |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1174 for(i=0; i<dstW; i++) |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1175 { |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1176 int j; |
11123
b41af00e8c17
dither scaling coefficients so they add up to 1.0
michael
parents:
11122
diff
changeset
|
1177 double error=0; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1178 double sum=0; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1179 double scale= one; |
11123
b41af00e8c17
dither scaling coefficients so they add up to 1.0
michael
parents:
11122
diff
changeset
|
1180 |
4419 | 1181 for(j=0; j<filterSize; j++) |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1182 { |
4419 | 1183 sum+= filter[i*filterSize + j]; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1184 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1185 scale/= sum; |
6679
5c4beb993674
fixing sinc filter (seems the problem was caused by rounding in pmulhw -> solution use shorter filter, its long and slow enough anyway)
michael
parents:
6637
diff
changeset
|
1186 for(j=0; j<*outFilterSize; j++) |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1187 { |
11123
b41af00e8c17
dither scaling coefficients so they add up to 1.0
michael
parents:
11122
diff
changeset
|
1188 double v= filter[i*filterSize + j]*scale + error; |
b41af00e8c17
dither scaling coefficients so they add up to 1.0
michael
parents:
11122
diff
changeset
|
1189 int intV= floor(v + 0.5); |
b41af00e8c17
dither scaling coefficients so they add up to 1.0
michael
parents:
11122
diff
changeset
|
1190 (*outFilter)[i*(*outFilterSize) + j]= intV; |
b41af00e8c17
dither scaling coefficients so they add up to 1.0
michael
parents:
11122
diff
changeset
|
1191 error = v - intV; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1192 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1193 } |
4563
835d4fce67d5
fixing green line at right side bug (reported by Nick Kurshev <nickols_k@mail.ru>)
michael
parents:
4558
diff
changeset
|
1194 |
835d4fce67d5
fixing green line at right side bug (reported by Nick Kurshev <nickols_k@mail.ru>)
michael
parents:
4558
diff
changeset
|
1195 (*filterPos)[dstW]= (*filterPos)[dstW-1]; // the MMX scaler will read over the end |
835d4fce67d5
fixing green line at right side bug (reported by Nick Kurshev <nickols_k@mail.ru>)
michael
parents:
4558
diff
changeset
|
1196 for(i=0; i<*outFilterSize; i++) |
835d4fce67d5
fixing green line at right side bug (reported by Nick Kurshev <nickols_k@mail.ru>)
michael
parents:
4558
diff
changeset
|
1197 { |
835d4fce67d5
fixing green line at right side bug (reported by Nick Kurshev <nickols_k@mail.ru>)
michael
parents:
4558
diff
changeset
|
1198 int j= dstW*(*outFilterSize); |
835d4fce67d5
fixing green line at right side bug (reported by Nick Kurshev <nickols_k@mail.ru>)
michael
parents:
4558
diff
changeset
|
1199 (*outFilter)[j + i]= (*outFilter)[j + i - (*outFilterSize)]; |
835d4fce67d5
fixing green line at right side bug (reported by Nick Kurshev <nickols_k@mail.ru>)
michael
parents:
4558
diff
changeset
|
1200 } |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1201 |
4419 | 1202 free(filter); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1203 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1204 |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1205 #if defined(ARCH_X86) || defined(ARCH_X86_64) |
5452 | 1206 static void initMMX2HScaler(int dstW, int xInc, uint8_t *funnyCode, int16_t *filter, int32_t *filterPos, int numSplits) |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1207 { |
5452 | 1208 uint8_t *fragmentA; |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1209 long imm8OfPShufW1A; |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1210 long imm8OfPShufW2A; |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1211 long fragmentLengthA; |
5452 | 1212 uint8_t *fragmentB; |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1213 long imm8OfPShufW1B; |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1214 long imm8OfPShufW2B; |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1215 long fragmentLengthB; |
5452 | 1216 int fragmentPos; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1217 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1218 int xpos, i; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1219 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1220 // create an optimized horizontal scaling routine |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1221 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1222 //code fragment |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1223 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1224 asm volatile( |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1225 "jmp 9f \n\t" |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1226 // Begin |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1227 "0: \n\t" |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1228 "movq (%%"REG_d", %%"REG_a"), %%mm3\n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1229 "movd (%%"REG_c", %%"REG_S"), %%mm0\n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1230 "movd 1(%%"REG_c", %%"REG_S"), %%mm1\n\t" |
5452 | 1231 "punpcklbw %%mm7, %%mm1 \n\t" |
1232 "punpcklbw %%mm7, %%mm0 \n\t" | |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1233 "pshufw $0xFF, %%mm1, %%mm1 \n\t" |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1234 "1: \n\t" |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1235 "pshufw $0xFF, %%mm0, %%mm0 \n\t" |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1236 "2: \n\t" |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1237 "psubw %%mm1, %%mm0 \n\t" |
14556 | 1238 "movl 8(%%"REG_b", %%"REG_a"), %%esi\n\t" |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1239 "pmullw %%mm3, %%mm0 \n\t" |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1240 "psllw $7, %%mm1 \n\t" |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1241 "paddw %%mm1, %%mm0 \n\t" |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1242 |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1243 "movq %%mm0, (%%"REG_D", %%"REG_a")\n\t" |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1244 |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1245 "add $8, %%"REG_a" \n\t" |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1246 // End |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1247 "9: \n\t" |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1248 // "int $3\n\t" |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1249 "lea 0b, %0 \n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1250 "lea 1b, %1 \n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1251 "lea 2b, %2 \n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1252 "dec %1 \n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1253 "dec %2 \n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1254 "sub %0, %1 \n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1255 "sub %0, %2 \n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1256 "lea 9b, %3 \n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1257 "sub %0, %3 \n\t" |
5452 | 1258 |
1259 | |
1260 :"=r" (fragmentA), "=r" (imm8OfPShufW1A), "=r" (imm8OfPShufW2A), | |
1261 "=r" (fragmentLengthA) | |
1262 ); | |
1263 | |
1264 asm volatile( | |
1265 "jmp 9f \n\t" | |
1266 // Begin | |
1267 "0: \n\t" | |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1268 "movq (%%"REG_d", %%"REG_a"), %%mm3\n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1269 "movd (%%"REG_c", %%"REG_S"), %%mm0\n\t" |
5452 | 1270 "punpcklbw %%mm7, %%mm0 \n\t" |
1271 "pshufw $0xFF, %%mm0, %%mm1 \n\t" | |
1272 "1: \n\t" | |
1273 "pshufw $0xFF, %%mm0, %%mm0 \n\t" | |
1274 "2: \n\t" | |
1275 "psubw %%mm1, %%mm0 \n\t" | |
14556 | 1276 "movl 8(%%"REG_b", %%"REG_a"), %%esi\n\t" |
5452 | 1277 "pmullw %%mm3, %%mm0 \n\t" |
1278 "psllw $7, %%mm1 \n\t" | |
1279 "paddw %%mm1, %%mm0 \n\t" | |
1280 | |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1281 "movq %%mm0, (%%"REG_D", %%"REG_a")\n\t" |
5452 | 1282 |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1283 "add $8, %%"REG_a" \n\t" |
5452 | 1284 // End |
1285 "9: \n\t" | |
1286 // "int $3\n\t" | |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1287 "lea 0b, %0 \n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1288 "lea 1b, %1 \n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1289 "lea 2b, %2 \n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1290 "dec %1 \n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1291 "dec %2 \n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1292 "sub %0, %1 \n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1293 "sub %0, %2 \n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1294 "lea 9b, %3 \n\t" |
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1295 "sub %0, %3 \n\t" |
5452 | 1296 |
1297 | |
1298 :"=r" (fragmentB), "=r" (imm8OfPShufW1B), "=r" (imm8OfPShufW2B), | |
1299 "=r" (fragmentLengthB) | |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1300 ); |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1301 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1302 xpos= 0; //lumXInc/2 - 0x8000; // difference between pixel centers |
5452 | 1303 fragmentPos=0; |
1304 | |
1305 for(i=0; i<dstW/numSplits; i++) | |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1306 { |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1307 int xx=xpos>>16; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1308 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1309 if((i&3) == 0) |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1310 { |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1311 int a=0; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1312 int b=((xpos+xInc)>>16) - xx; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1313 int c=((xpos+xInc*2)>>16) - xx; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1314 int d=((xpos+xInc*3)>>16) - xx; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1315 |
5452 | 1316 filter[i ] = (( xpos & 0xFFFF) ^ 0xFFFF)>>9; |
1317 filter[i+1] = (((xpos+xInc ) & 0xFFFF) ^ 0xFFFF)>>9; | |
1318 filter[i+2] = (((xpos+xInc*2) & 0xFFFF) ^ 0xFFFF)>>9; | |
1319 filter[i+3] = (((xpos+xInc*3) & 0xFFFF) ^ 0xFFFF)>>9; | |
1320 filterPos[i/2]= xx; | |
1321 | |
1322 if(d+1<4) | |
1323 { | |
1324 int maxShift= 3-(d+1); | |
1325 int shift=0; | |
1326 | |
1327 memcpy(funnyCode + fragmentPos, fragmentB, fragmentLengthB); | |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1328 |
5452 | 1329 funnyCode[fragmentPos + imm8OfPShufW1B]= |
1330 (a+1) | ((b+1)<<2) | ((c+1)<<4) | ((d+1)<<6); | |
1331 funnyCode[fragmentPos + imm8OfPShufW2B]= | |
1332 a | (b<<2) | (c<<4) | (d<<6); | |
1333 | |
1334 if(i+3>=dstW) shift=maxShift; //avoid overread | |
1335 else if((filterPos[i/2]&3) <= maxShift) shift=filterPos[i/2]&3; //Align | |
1336 | |
1337 if(shift && i>=shift) | |
1338 { | |
1339 funnyCode[fragmentPos + imm8OfPShufW1B]+= 0x55*shift; | |
1340 funnyCode[fragmentPos + imm8OfPShufW2B]+= 0x55*shift; | |
1341 filterPos[i/2]-=shift; | |
1342 } | |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1343 |
5452 | 1344 fragmentPos+= fragmentLengthB; |
1345 } | |
1346 else | |
1347 { | |
1348 int maxShift= 3-d; | |
1349 int shift=0; | |
1350 | |
1351 memcpy(funnyCode + fragmentPos, fragmentA, fragmentLengthA); | |
1352 | |
1353 funnyCode[fragmentPos + imm8OfPShufW1A]= | |
1354 funnyCode[fragmentPos + imm8OfPShufW2A]= | |
1355 a | (b<<2) | (c<<4) | (d<<6); | |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1356 |
5452 | 1357 if(i+4>=dstW) shift=maxShift; //avoid overread |
1358 else if((filterPos[i/2]&3) <= maxShift) shift=filterPos[i/2]&3; //partial align | |
1359 | |
1360 if(shift && i>=shift) | |
1361 { | |
1362 funnyCode[fragmentPos + imm8OfPShufW1A]+= 0x55*shift; | |
1363 funnyCode[fragmentPos + imm8OfPShufW2A]+= 0x55*shift; | |
1364 filterPos[i/2]-=shift; | |
1365 } | |
1366 | |
1367 fragmentPos+= fragmentLengthA; | |
1368 } | |
1369 | |
1370 funnyCode[fragmentPos]= RET; | |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1371 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1372 xpos+=xInc; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1373 } |
5452 | 1374 filterPos[i/2]= xpos>>16; // needed to jump to the next part |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1375 } |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1376 #endif // ARCH_X86 || ARCH_X86_64 |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1377 |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17558
diff
changeset
|
1378 static void globalInit(void){ |
2216 | 1379 // generating tables: |
1380 int i; | |
3344 | 1381 for(i=0; i<768; i++){ |
1382 int c= MIN(MAX(i-256, 0), 255); | |
1383 clip_table[i]=c; | |
2584 | 1384 } |
9975 | 1385 } |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1386 |
9975 | 1387 static SwsFunc getSwsFunc(int flags){ |
1388 | |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1389 #ifdef RUNTIME_CPUDETECT |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1390 #if defined(ARCH_X86) || defined(ARCH_X86_64) |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1391 // ordered per speed fasterst first |
9975 | 1392 if(flags & SWS_CPU_CAPS_MMX2) |
1393 return swScale_MMX2; | |
1394 else if(flags & SWS_CPU_CAPS_3DNOW) | |
1395 return swScale_3DNow; | |
1396 else if(flags & SWS_CPU_CAPS_MMX) | |
1397 return swScale_MMX; | |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1398 else |
9975 | 1399 return swScale_C; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1400 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1401 #else |
12017
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
1402 #ifdef ARCH_POWERPC |
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
1403 if(flags & SWS_CPU_CAPS_ALTIVEC) |
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
1404 return swScale_altivec; |
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
1405 else |
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
1406 return swScale_C; |
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
1407 #endif |
9975 | 1408 return swScale_C; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1409 #endif |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1410 #else //RUNTIME_CPUDETECT |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1411 #ifdef HAVE_MMX2 |
9975 | 1412 return swScale_MMX2; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1413 #elif defined (HAVE_3DNOW) |
9975 | 1414 return swScale_3DNow; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1415 #elif defined (HAVE_MMX) |
9975 | 1416 return swScale_MMX; |
12017
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
1417 #elif defined (HAVE_ALTIVEC) |
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
1418 return swScale_altivec; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1419 #else |
9975 | 1420 return swScale_C; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1421 #endif |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1422 #endif //!RUNTIME_CPUDETECT |
3126 | 1423 } |
2584 | 1424 |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
1425 static int PlanarToNV12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, |
6492 | 1426 int srcSliceH, uint8_t* dstParam[], int dstStride[]){ |
1427 uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY; | |
1428 /* Copy Y plane */ | |
15249 | 1429 if(dstStride[0]==srcStride[0] && srcStride[0] > 0) |
6492 | 1430 memcpy(dst, src[0], srcSliceH*dstStride[0]); |
1431 else | |
1432 { | |
1433 int i; | |
1434 uint8_t *srcPtr= src[0]; | |
1435 uint8_t *dstPtr= dst; | |
1436 for(i=0; i<srcSliceH; i++) | |
1437 { | |
14715 | 1438 memcpy(dstPtr, srcPtr, c->srcW); |
6492 | 1439 srcPtr+= srcStride[0]; |
1440 dstPtr+= dstStride[0]; | |
1441 } | |
1442 } | |
14715 | 1443 dst = dstParam[1] + dstStride[1]*srcSliceY/2; |
1444 if (c->dstFormat == IMGFMT_NV12) | |
1445 interleaveBytes( src[1],src[2],dst,c->srcW/2,srcSliceH/2,srcStride[1],srcStride[2],dstStride[0] ); | |
1446 else | |
1447 interleaveBytes( src[2],src[1],dst,c->srcW/2,srcSliceH/2,srcStride[2],srcStride[1],dstStride[0] ); | |
9697 | 1448 |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
1449 return srcSliceH; |
6492 | 1450 } |
1451 | |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
1452 static int PlanarToYuy2Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, |
6492 | 1453 int srcSliceH, uint8_t* dstParam[], int dstStride[]){ |
1454 uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY; | |
1455 | |
9697 | 1456 yv12toyuy2( src[0],src[1],src[2],dst,c->srcW,srcSliceH,srcStride[0],srcStride[1],dstStride[0] ); |
1457 | |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
1458 return srcSliceH; |
6492 | 1459 } |
1460 | |
11068 | 1461 static int PlanarToUyvyWrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, |
1462 int srcSliceH, uint8_t* dstParam[], int dstStride[]){ | |
1463 uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY; | |
1464 | |
1465 yv12touyvy( src[0],src[1],src[2],dst,c->srcW,srcSliceH,srcStride[0],srcStride[1],dstStride[0] ); | |
1466 | |
1467 return srcSliceH; | |
1468 } | |
1469 | |
6616
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1470 /* {RGB,BGR}{15,16,24,32} -> {RGB,BGR}{15,16,24,32} */ |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
1471 static int rgb2rgbWrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, |
6616
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1472 int srcSliceH, uint8_t* dst[], int dstStride[]){ |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1473 const int srcFormat= c->srcFormat; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1474 const int dstFormat= c->dstFormat; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1475 const int srcBpp= ((srcFormat&0xFF) + 7)>>3; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1476 const int dstBpp= ((dstFormat&0xFF) + 7)>>3; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1477 const int srcId= (srcFormat&0xFF)>>2; // 1:0, 4:1, 8:2, 15:3, 16:4, 24:6, 32:8 |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1478 const int dstId= (dstFormat&0xFF)>>2; |
16783
3ea7f6ab11b1
100l -- mismatched type after changing sizes to type long!
rfelker
parents:
16404
diff
changeset
|
1479 void (*conv)(const uint8_t *src, uint8_t *dst, long src_size)=NULL; |
6492 | 1480 |
6616
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1481 /* BGR -> BGR */ |
9455 | 1482 if( (isBGR(srcFormat) && isBGR(dstFormat)) |
1483 || (isRGB(srcFormat) && isRGB(dstFormat))){ | |
6616
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1484 switch(srcId | (dstId<<4)){ |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1485 case 0x34: conv= rgb16to15; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1486 case 0x36: conv= rgb24to15; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1487 case 0x38: conv= rgb32to15; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1488 case 0x43: conv= rgb15to16; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1489 case 0x46: conv= rgb24to16; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1490 case 0x48: conv= rgb32to16; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1491 case 0x63: conv= rgb15to24; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1492 case 0x64: conv= rgb16to24; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1493 case 0x68: conv= rgb32to24; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1494 case 0x83: conv= rgb15to32; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1495 case 0x84: conv= rgb16to32; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1496 case 0x86: conv= rgb24to32; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1497 default: MSG_ERR("swScaler: internal error %s -> %s converter\n", |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1498 vo_format_name(srcFormat), vo_format_name(dstFormat)); break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1499 } |
9455 | 1500 }else if( (isBGR(srcFormat) && isRGB(dstFormat)) |
1501 || (isRGB(srcFormat) && isBGR(dstFormat))){ | |
6616
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1502 switch(srcId | (dstId<<4)){ |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1503 case 0x33: conv= rgb15tobgr15; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1504 case 0x34: conv= rgb16tobgr15; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1505 case 0x36: conv= rgb24tobgr15; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1506 case 0x38: conv= rgb32tobgr15; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1507 case 0x43: conv= rgb15tobgr16; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1508 case 0x44: conv= rgb16tobgr16; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1509 case 0x46: conv= rgb24tobgr16; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1510 case 0x48: conv= rgb32tobgr16; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1511 case 0x63: conv= rgb15tobgr24; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1512 case 0x64: conv= rgb16tobgr24; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1513 case 0x66: conv= rgb24tobgr24; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1514 case 0x68: conv= rgb32tobgr24; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1515 case 0x83: conv= rgb15tobgr32; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1516 case 0x84: conv= rgb16tobgr32; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1517 case 0x86: conv= rgb24tobgr32; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1518 case 0x88: conv= rgb32tobgr32; break; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1519 default: MSG_ERR("swScaler: internal error %s -> %s converter\n", |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1520 vo_format_name(srcFormat), vo_format_name(dstFormat)); break; |
6492 | 1521 } |
9455 | 1522 }else{ |
1523 MSG_ERR("swScaler: internal error %s -> %s converter\n", | |
1524 vo_format_name(srcFormat), vo_format_name(dstFormat)); | |
6616
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1525 } |
9455 | 1526 |
6616
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1527 if(dstStride[0]*srcBpp == srcStride[0]*dstBpp) |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1528 conv(src[0], dst[0] + dstStride[0]*srcSliceY, srcSliceH*srcStride[0]); |
6492 | 1529 else |
1530 { | |
1531 int i; | |
1532 uint8_t *srcPtr= src[0]; | |
1533 uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY; | |
1534 | |
1535 for(i=0; i<srcSliceH; i++) | |
1536 { | |
6616
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1537 conv(srcPtr, dstPtr, c->srcW*srcBpp); |
6492 | 1538 srcPtr+= srcStride[0]; |
1539 dstPtr+= dstStride[0]; | |
1540 } | |
1541 } | |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
1542 return srcSliceH; |
6492 | 1543 } |
1544 | |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
1545 static int bgr24toyv12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, |
4623 | 1546 int srcSliceH, uint8_t* dst[], int dstStride[]){ |
1547 | |
1548 rgb24toyv12( | |
1549 src[0], | |
1550 dst[0]+ srcSliceY *dstStride[0], | |
1551 dst[1]+(srcSliceY>>1)*dstStride[1], | |
1552 dst[2]+(srcSliceY>>1)*dstStride[2], | |
1553 c->srcW, srcSliceH, | |
1554 dstStride[0], dstStride[1], srcStride[0]); | |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
1555 return srcSliceH; |
4623 | 1556 } |
1557 | |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
1558 static int yvu9toyv12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, |
6582
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1559 int srcSliceH, uint8_t* dst[], int dstStride[]){ |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1560 int i; |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1561 |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1562 /* copy Y */ |
15249 | 1563 if(srcStride[0]==dstStride[0] && srcStride[0] > 0) |
6582
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1564 memcpy(dst[0]+ srcSliceY*dstStride[0], src[0], srcStride[0]*srcSliceH); |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1565 else{ |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1566 uint8_t *srcPtr= src[0]; |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1567 uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY; |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1568 |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1569 for(i=0; i<srcSliceH; i++) |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1570 { |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1571 memcpy(dstPtr, srcPtr, c->srcW); |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1572 srcPtr+= srcStride[0]; |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1573 dstPtr+= dstStride[0]; |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1574 } |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1575 } |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1576 |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1577 if(c->dstFormat==IMGFMT_YV12){ |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1578 planar2x(src[1], dst[1], c->chrSrcW, c->chrSrcH, srcStride[1], dstStride[1]); |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1579 planar2x(src[2], dst[2], c->chrSrcW, c->chrSrcH, srcStride[2], dstStride[2]); |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1580 }else{ |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1581 planar2x(src[1], dst[2], c->chrSrcW, c->chrSrcH, srcStride[1], dstStride[2]); |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1582 planar2x(src[2], dst[1], c->chrSrcW, c->chrSrcH, srcStride[2], dstStride[1]); |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1583 } |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
1584 return srcSliceH; |
6582
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1585 } |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1586 |
6503 | 1587 /** |
1588 * bring pointers in YUV order instead of YVU | |
1589 */ | |
9697 | 1590 static inline void sws_orderYUV(int format, uint8_t * sortedP[], int sortedStride[], uint8_t * p[], int stride[]){ |
1591 if(format == IMGFMT_YV12 || format == IMGFMT_YVU9 | |
6863 | 1592 || format == IMGFMT_444P || format == IMGFMT_422P || format == IMGFMT_411P){ |
6503 | 1593 sortedP[0]= p[0]; |
9697 | 1594 sortedP[1]= p[2]; |
1595 sortedP[2]= p[1]; | |
6517 | 1596 sortedStride[0]= stride[0]; |
9697 | 1597 sortedStride[1]= stride[2]; |
1598 sortedStride[2]= stride[1]; | |
6503 | 1599 } |
10312 | 1600 else if(isPacked(format) || isGray(format) || format == IMGFMT_Y8) |
6503 | 1601 { |
1602 sortedP[0]= p[0]; | |
1603 sortedP[1]= | |
1604 sortedP[2]= NULL; | |
6517 | 1605 sortedStride[0]= stride[0]; |
6503 | 1606 sortedStride[1]= |
1607 sortedStride[2]= 0; | |
1608 } | |
9697 | 1609 else if(format == IMGFMT_I420 || format == IMGFMT_IYUV) |
6503 | 1610 { |
1611 sortedP[0]= p[0]; | |
9697 | 1612 sortedP[1]= p[1]; |
1613 sortedP[2]= p[2]; | |
6517 | 1614 sortedStride[0]= stride[0]; |
9697 | 1615 sortedStride[1]= stride[1]; |
1616 sortedStride[2]= stride[2]; | |
14715 | 1617 } |
1618 else if(format == IMGFMT_NV12 || format == IMGFMT_NV21) | |
1619 { | |
1620 sortedP[0]= p[0]; | |
1621 sortedP[1]= p[1]; | |
1622 sortedP[2]= NULL; | |
1623 sortedStride[0]= stride[0]; | |
1624 sortedStride[1]= stride[1]; | |
1625 sortedStride[2]= 0; | |
6616
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1626 }else{ |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1627 MSG_ERR("internal error in orderYUV\n"); |
6503 | 1628 } |
1629 } | |
4567 | 1630 |
4555 | 1631 /* unscaled copy like stuff (assumes nearly identical formats) */ |
9499 | 1632 static int simpleCopy(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, |
1633 int srcSliceH, uint8_t* dst[], int dstStride[]){ | |
4555 | 1634 |
1635 if(isPacked(c->srcFormat)) | |
1636 { | |
15249 | 1637 if(dstStride[0]==srcStride[0] && srcStride[0] > 0) |
4555 | 1638 memcpy(dst[0] + dstStride[0]*srcSliceY, src[0], srcSliceH*dstStride[0]); |
1639 else | |
1640 { | |
1641 int i; | |
1642 uint8_t *srcPtr= src[0]; | |
1643 uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY; | |
4558 | 1644 int length=0; |
1645 | |
1646 /* universal length finder */ | |
4649 | 1647 while(length+c->srcW <= ABS(dstStride[0]) |
1648 && length+c->srcW <= ABS(srcStride[0])) length+= c->srcW; | |
4558 | 1649 ASSERT(length!=0); |
4555 | 1650 |
1651 for(i=0; i<srcSliceH; i++) | |
1652 { | |
1653 memcpy(dstPtr, srcPtr, length); | |
1654 srcPtr+= srcStride[0]; | |
1655 dstPtr+= dstStride[0]; | |
1656 } | |
1657 } | |
1658 } | |
1659 else | |
6503 | 1660 { /* Planar YUV or gray */ |
4555 | 1661 int plane; |
1662 for(plane=0; plane<3; plane++) | |
1663 { | |
6532
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
1664 int length= plane==0 ? c->srcW : -((-c->srcW )>>c->chrDstHSubSample); |
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
1665 int y= plane==0 ? srcSliceY: -((-srcSliceY)>>c->chrDstVSubSample); |
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
1666 int height= plane==0 ? srcSliceH: -((-srcSliceH)>>c->chrDstVSubSample); |
6503 | 1667 |
1668 if((isGray(c->srcFormat) || isGray(c->dstFormat)) && plane>0) | |
6492 | 1669 { |
6503 | 1670 if(!isGray(c->dstFormat)) |
6532
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
1671 memset(dst[plane], 128, dstStride[plane]*height); |
6492 | 1672 } |
1673 else | |
1674 { | |
15249 | 1675 if(dstStride[plane]==srcStride[plane] && srcStride[plane] > 0) |
6503 | 1676 memcpy(dst[plane] + dstStride[plane]*y, src[plane], height*dstStride[plane]); |
1677 else | |
4555 | 1678 { |
6503 | 1679 int i; |
1680 uint8_t *srcPtr= src[plane]; | |
1681 uint8_t *dstPtr= dst[plane] + dstStride[plane]*y; | |
1682 for(i=0; i<height; i++) | |
1683 { | |
1684 memcpy(dstPtr, srcPtr, length); | |
1685 srcPtr+= srcStride[plane]; | |
1686 dstPtr+= dstStride[plane]; | |
1687 } | |
4555 | 1688 } |
1689 } | |
1690 } | |
1691 } | |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
1692 return srcSliceH; |
4554 | 1693 } |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1694 |
6503 | 1695 static int remove_dup_fourcc(int fourcc) |
6492 | 1696 { |
1697 switch(fourcc) | |
1698 { | |
9697 | 1699 case IMGFMT_I420: |
1700 case IMGFMT_IYUV: return IMGFMT_YV12; | |
6492 | 1701 case IMGFMT_Y8 : return IMGFMT_Y800; |
6535
29f94210a67f
IF09 is alias for YVU9 (actually it has extra 4th plane containing MC change
arpi
parents:
6532
diff
changeset
|
1702 case IMGFMT_IF09: return IMGFMT_YVU9; |
6492 | 1703 default: return fourcc; |
1704 } | |
1705 } | |
1706 | |
6517 | 1707 static void getSubSampleFactors(int *h, int *v, int format){ |
1708 switch(format){ | |
9071 | 1709 case IMGFMT_UYVY: |
6517 | 1710 case IMGFMT_YUY2: |
1711 *h=1; | |
1712 *v=0; | |
1713 break; | |
1714 case IMGFMT_YV12: | |
6532
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
1715 case IMGFMT_Y800: //FIXME remove after different subsamplings are fully implemented |
14715 | 1716 case IMGFMT_NV12: |
1717 case IMGFMT_NV21: | |
6517 | 1718 *h=1; |
1719 *v=1; | |
1720 break; | |
1721 case IMGFMT_YVU9: | |
1722 *h=2; | |
1723 *v=2; | |
1724 break; | |
6863 | 1725 case IMGFMT_444P: |
1726 *h=0; | |
1727 *v=0; | |
1728 break; | |
1729 case IMGFMT_422P: | |
1730 *h=1; | |
1731 *v=0; | |
1732 break; | |
1733 case IMGFMT_411P: | |
1734 *h=2; | |
1735 *v=0; | |
1736 break; | |
6517 | 1737 default: |
1738 *h=0; | |
1739 *v=0; | |
1740 break; | |
1741 } | |
1742 } | |
1743 | |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1744 static uint16_t roundToInt16(int64_t f){ |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1745 int r= (f + (1<<15))>>16; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1746 if(r<-0x7FFF) return 0x8000; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1747 else if(r> 0x7FFF) return 0x7FFF; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1748 else return r; |
9416
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
1749 } |
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
1750 |
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
1751 /** |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1752 * @param inv_table the yuv2rgb coeffs, normally Inverse_Table_6_9[x] |
9416
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
1753 * @param fullRange if 1 then the luma range is 0..255 if 0 its 16..235 |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1754 * @return -1 if not supported |
9416
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
1755 */ |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1756 int sws_setColorspaceDetails(SwsContext *c, const int inv_table[4], int srcRange, const int table[4], int dstRange, int brightness, int contrast, int saturation){ |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1757 int64_t crv = inv_table[0]; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1758 int64_t cbu = inv_table[1]; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1759 int64_t cgu = -inv_table[2]; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1760 int64_t cgv = -inv_table[3]; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1761 int64_t cy = 1<<16; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1762 int64_t oy = 0; |
9416
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
1763 |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1764 if(isYUV(c->dstFormat) || isGray(c->dstFormat)) return -1; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1765 memcpy(c->srcColorspaceTable, inv_table, sizeof(int)*4); |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1766 memcpy(c->dstColorspaceTable, table, sizeof(int)*4); |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1767 |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1768 c->brightness= brightness; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1769 c->contrast = contrast; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1770 c->saturation= saturation; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1771 c->srcRange = srcRange; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1772 c->dstRange = dstRange; |
9416
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
1773 |
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
1774 c->uOffset= 0x0400040004000400LL; |
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
1775 c->vOffset= 0x0400040004000400LL; |
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
1776 |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1777 if(!srcRange){ |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1778 cy= (cy*255) / 219; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1779 oy= 16<<16; |
9416
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
1780 } |
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
1781 |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1782 cy = (cy *contrast )>>16; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1783 crv= (crv*contrast * saturation)>>32; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1784 cbu= (cbu*contrast * saturation)>>32; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1785 cgu= (cgu*contrast * saturation)>>32; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1786 cgv= (cgv*contrast * saturation)>>32; |
9416
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
1787 |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1788 oy -= 256*brightness; |
9416
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
1789 |
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
1790 c->yCoeff= roundToInt16(cy *8192) * 0x0001000100010001ULL; |
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
1791 c->vrCoeff= roundToInt16(crv*8192) * 0x0001000100010001ULL; |
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
1792 c->ubCoeff= roundToInt16(cbu*8192) * 0x0001000100010001ULL; |
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
1793 c->vgCoeff= roundToInt16(cgv*8192) * 0x0001000100010001ULL; |
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
1794 c->ugCoeff= roundToInt16(cgu*8192) * 0x0001000100010001ULL; |
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
1795 c->yOffset= roundToInt16(oy * 8) * 0x0001000100010001ULL; |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1796 |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1797 yuv2rgb_c_init_tables(c, inv_table, srcRange, brightness, contrast, saturation); |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1798 //FIXME factorize |
12698 | 1799 |
15523 | 1800 #ifdef COMPILE_ALTIVEC |
1801 if (c->flags & SWS_CPU_CAPS_ALTIVEC) | |
1802 yuv2rgb_altivec_init_tables (c, inv_table, brightness, contrast, saturation); | |
12698 | 1803 #endif |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1804 return 0; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1805 } |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1806 |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1807 /** |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1808 * @return -1 if not supported |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1809 */ |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1810 int sws_getColorspaceDetails(SwsContext *c, int **inv_table, int *srcRange, int **table, int *dstRange, int *brightness, int *contrast, int *saturation){ |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1811 if(isYUV(c->dstFormat) || isGray(c->dstFormat)) return -1; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1812 |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1813 *inv_table = c->srcColorspaceTable; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1814 *table = c->dstColorspaceTable; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1815 *srcRange = c->srcRange; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1816 *dstRange = c->dstRange; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1817 *brightness= c->brightness; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1818 *contrast = c->contrast; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1819 *saturation= c->saturation; |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1820 |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1821 return 0; |
9416
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
1822 } |
83fe90af3e16
brightness / saturation / contrast / different yuv colorspace support for some yuv2rgb converters (many converters still ignore it)
michael
parents:
9413
diff
changeset
|
1823 |
9697 | 1824 SwsContext *sws_getContext(int srcW, int srcH, int origSrcFormat, int dstW, int dstH, int origDstFormat, int flags, |
13373
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
1825 SwsFilter *srcFilter, SwsFilter *dstFilter, double *param){ |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1826 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1827 SwsContext *c; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1828 int i; |
11379 | 1829 int usesVFilter, usesHFilter; |
6616
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1830 int unscaled, needsDither; |
9697 | 1831 int srcFormat, dstFormat; |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1832 SwsFilter dummyFilter= {NULL, NULL, NULL, NULL}; |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
1833 #if defined(ARCH_X86) || defined(ARCH_X86_64) |
9975 | 1834 if(flags & SWS_CPU_CAPS_MMX) |
4294
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
1835 asm volatile("emms\n\t"::: "memory"); |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
1836 #endif |
9975 | 1837 |
1838 #ifndef RUNTIME_CPUDETECT //ensure that the flags match the compiled variant if cpudetect is off | |
12017
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
1839 flags &= ~(SWS_CPU_CAPS_MMX|SWS_CPU_CAPS_MMX2|SWS_CPU_CAPS_3DNOW|SWS_CPU_CAPS_ALTIVEC); |
9975 | 1840 #ifdef HAVE_MMX2 |
1841 flags |= SWS_CPU_CAPS_MMX|SWS_CPU_CAPS_MMX2; | |
1842 #elif defined (HAVE_3DNOW) | |
1843 flags |= SWS_CPU_CAPS_MMX|SWS_CPU_CAPS_3DNOW; | |
1844 #elif defined (HAVE_MMX) | |
1845 flags |= SWS_CPU_CAPS_MMX; | |
12017
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
1846 #elif defined (HAVE_ALTIVEC) |
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
1847 flags |= SWS_CPU_CAPS_ALTIVEC; |
9975 | 1848 #endif |
1849 #endif | |
1850 if(clip_table[512] != 255) globalInit(); | |
9987 | 1851 if(rgb15to16 == NULL) sws_rgb2rgb_init(flags); |
9697 | 1852 |
11000 | 1853 /* avoid duplicate Formats, so we don't need to check to much */ |
9697 | 1854 srcFormat = remove_dup_fourcc(origSrcFormat); |
1855 dstFormat = remove_dup_fourcc(origDstFormat); | |
6503 | 1856 |
1857 unscaled = (srcW == dstW && srcH == dstH); | |
6616
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1858 needsDither= (isBGR(dstFormat) || isRGB(dstFormat)) |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1859 && (dstFormat&0xFF)<24 |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1860 && ((dstFormat&0xFF)<(srcFormat&0xFF) || (!(isRGB(srcFormat) || isBGR(srcFormat)))); |
6503 | 1861 |
1862 if(!isSupportedIn(srcFormat)) | |
4529
8f982d17c479
printing error messages if something is wrong instead of just return NULL;
michael
parents:
4492
diff
changeset
|
1863 { |
6503 | 1864 MSG_ERR("swScaler: %s is not supported as input format\n", vo_format_name(srcFormat)); |
1865 return NULL; | |
4529
8f982d17c479
printing error messages if something is wrong instead of just return NULL;
michael
parents:
4492
diff
changeset
|
1866 } |
6503 | 1867 if(!isSupportedOut(dstFormat)) |
1868 { | |
1869 MSG_ERR("swScaler: %s is not supported as output format\n", vo_format_name(dstFormat)); | |
1870 return NULL; | |
1871 } | |
1872 | |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1873 /* sanity check */ |
4529
8f982d17c479
printing error messages if something is wrong instead of just return NULL;
michael
parents:
4492
diff
changeset
|
1874 if(srcW<4 || srcH<1 || dstW<8 || dstH<1) //FIXME check if these are enough and try to lowwer them after fixing the relevant parts of the code |
8f982d17c479
printing error messages if something is wrong instead of just return NULL;
michael
parents:
4492
diff
changeset
|
1875 { |
6492 | 1876 MSG_ERR("swScaler: %dx%d -> %dx%d is invalid scaling dimension\n", |
4529
8f982d17c479
printing error messages if something is wrong instead of just return NULL;
michael
parents:
4492
diff
changeset
|
1877 srcW, srcH, dstW, dstH); |
8f982d17c479
printing error messages if something is wrong instead of just return NULL;
michael
parents:
4492
diff
changeset
|
1878 return NULL; |
8f982d17c479
printing error messages if something is wrong instead of just return NULL;
michael
parents:
4492
diff
changeset
|
1879 } |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1880 |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1881 if(!dstFilter) dstFilter= &dummyFilter; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1882 if(!srcFilter) srcFilter= &dummyFilter; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1883 |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1884 c= memalign(64, sizeof(SwsContext)); |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
1885 memset(c, 0, sizeof(SwsContext)); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1886 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1887 c->srcW= srcW; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1888 c->srcH= srcH; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1889 c->dstW= dstW; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1890 c->dstH= dstH; |
4297
29fef3982238
15/16 bit dithering in C (5% slower, can be disabled by comenting #define DITHER1XBPP out)
michael
parents:
4295
diff
changeset
|
1891 c->lumXInc= ((srcW<<16) + (dstW>>1))/dstW; |
29fef3982238
15/16 bit dithering in C (5% slower, can be disabled by comenting #define DITHER1XBPP out)
michael
parents:
4295
diff
changeset
|
1892 c->lumYInc= ((srcH<<16) + (dstH>>1))/dstH; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1893 c->flags= flags; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1894 c->dstFormat= dstFormat; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1895 c->srcFormat= srcFormat; |
9697 | 1896 c->origDstFormat= origDstFormat; |
1897 c->origSrcFormat= origSrcFormat; | |
11122 | 1898 c->vRounder= 4* 0x0001000100010001ULL; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
1899 |
11379 | 1900 usesHFilter= usesVFilter= 0; |
1901 if(dstFilter->lumV!=NULL && dstFilter->lumV->length>1) usesVFilter=1; | |
1902 if(dstFilter->lumH!=NULL && dstFilter->lumH->length>1) usesHFilter=1; | |
1903 if(dstFilter->chrV!=NULL && dstFilter->chrV->length>1) usesVFilter=1; | |
1904 if(dstFilter->chrH!=NULL && dstFilter->chrH->length>1) usesHFilter=1; | |
1905 if(srcFilter->lumV!=NULL && srcFilter->lumV->length>1) usesVFilter=1; | |
1906 if(srcFilter->lumH!=NULL && srcFilter->lumH->length>1) usesHFilter=1; | |
1907 if(srcFilter->chrV!=NULL && srcFilter->chrV->length>1) usesVFilter=1; | |
1908 if(srcFilter->chrH!=NULL && srcFilter->chrH->length>1) usesHFilter=1; | |
6532
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
1909 |
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
1910 getSubSampleFactors(&c->chrSrcHSubSample, &c->chrSrcVSubSample, srcFormat); |
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
1911 getSubSampleFactors(&c->chrDstHSubSample, &c->chrDstVSubSample, dstFormat); |
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
1912 |
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
1913 // reuse chroma for 2 pixles rgb/bgr unless user wants full chroma interpolation |
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
1914 if((isBGR(dstFormat) || isRGB(dstFormat)) && !(flags&SWS_FULL_CHR_H_INT)) c->chrDstHSubSample=1; |
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
1915 |
6540 | 1916 // drop some chroma lines if the user wants it |
1917 c->vChrDrop= (flags&SWS_SRC_V_CHR_DROP_MASK)>>SWS_SRC_V_CHR_DROP_SHIFT; | |
1918 c->chrSrcVSubSample+= c->vChrDrop; | |
6532
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
1919 |
6540 | 1920 // drop every 2. pixel for chroma calculation unless user wants full chroma |
6532
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
1921 if((isBGR(srcFormat) || isRGB(srcFormat)) && !(flags&SWS_FULL_CHR_H_INP)) |
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
1922 c->chrSrcHSubSample=1; |
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
1923 |
13373
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
1924 if(param){ |
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
1925 c->param[0] = param[0]; |
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
1926 c->param[1] = param[1]; |
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
1927 }else{ |
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
1928 c->param[0] = |
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
1929 c->param[1] = SWS_PARAM_DEFAULT; |
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
1930 } |
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
1931 |
6532
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
1932 c->chrIntHSubSample= c->chrDstHSubSample; |
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
1933 c->chrIntVSubSample= c->chrSrcVSubSample; |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1934 |
6532
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
1935 // note the -((-x)>>y) is so that we allways round toward +inf |
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
1936 c->chrSrcW= -((-srcW) >> c->chrSrcHSubSample); |
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
1937 c->chrSrcH= -((-srcH) >> c->chrSrcVSubSample); |
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
1938 c->chrDstW= -((-dstW) >> c->chrDstHSubSample); |
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
1939 c->chrDstH= -((-dstH) >> c->chrDstVSubSample); |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1940 |
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1941 sws_setColorspaceDetails(c, Inverse_Table_6_9[SWS_CS_DEFAULT], 0, Inverse_Table_6_9[SWS_CS_DEFAULT] /* FIXME*/, 0, 0, 1<<16, 1<<16); |
6578 | 1942 |
4567 | 1943 /* unscaled special Cases */ |
11379 | 1944 if(unscaled && !usesHFilter && !usesVFilter) |
4554 | 1945 { |
6492 | 1946 /* yv12_to_nv12 */ |
14715 | 1947 if(srcFormat == IMGFMT_YV12 && (dstFormat == IMGFMT_NV12 || dstFormat == IMGFMT_NV21)) |
6492 | 1948 { |
1949 c->swScale= PlanarToNV12Wrapper; | |
1950 } | |
4554 | 1951 /* yuv2bgr */ |
9697 | 1952 if((srcFormat==IMGFMT_YV12 || srcFormat==IMGFMT_422P) && (isBGR(dstFormat) || isRGB(dstFormat))) |
4554 | 1953 { |
9476
eff727517e6b
yuv2rgb brightness/contrast/saturation/different colorspaces support finished
michael
parents:
9455
diff
changeset
|
1954 c->swScale= yuv2rgb_get_func_ptr(c); |
4554 | 1955 } |
6582
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1956 |
9697 | 1957 if( srcFormat==IMGFMT_YVU9 && dstFormat==IMGFMT_YV12 ) |
6582
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1958 { |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1959 c->swScale= yvu9toyv12Wrapper; |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1960 } |
f98313dcd428
yvu9 -> yv12 unscaled converter with linear chroma scaling
michael
parents:
6580
diff
changeset
|
1961 |
6616
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1962 /* bgr24toYV12 */ |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1963 if(srcFormat==IMGFMT_BGR24 && dstFormat==IMGFMT_YV12) |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1964 c->swScale= bgr24toyv12Wrapper; |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1965 |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1966 /* rgb/bgr -> rgb/bgr (no dither needed forms) */ |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1967 if( (isBGR(srcFormat) || isRGB(srcFormat)) |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1968 && (isBGR(dstFormat) || isRGB(dstFormat)) |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1969 && !needsDither) |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1970 c->swScale= rgb2rgbWrapper; |
6492 | 1971 |
6616
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1972 /* LQ converters if -sws 0 or -sws 4*/ |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1973 if(c->flags&(SWS_FAST_BILINEAR|SWS_POINT)){ |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1974 /* rgb/bgr -> rgb/bgr (dither needed forms) */ |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1975 if( (isBGR(srcFormat) || isRGB(srcFormat)) |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1976 && (isBGR(dstFormat) || isRGB(dstFormat)) |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1977 && needsDither) |
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
1978 c->swScale= rgb2rgbWrapper; |
7725
f2c843e36dc9
fixing yuy2 upscaling (use -sws 0 for the faster but uglier variant)
michael
parents:
7723
diff
changeset
|
1979 |
f2c843e36dc9
fixing yuy2 upscaling (use -sws 0 for the faster but uglier variant)
michael
parents:
7723
diff
changeset
|
1980 /* yv12_to_yuy2 */ |
11068 | 1981 if(srcFormat == IMGFMT_YV12 && |
1982 (dstFormat == IMGFMT_YUY2 || dstFormat == IMGFMT_UYVY)) | |
7725
f2c843e36dc9
fixing yuy2 upscaling (use -sws 0 for the faster but uglier variant)
michael
parents:
7723
diff
changeset
|
1983 { |
11068 | 1984 if (dstFormat == IMGFMT_YUY2) |
1985 c->swScale= PlanarToYuy2Wrapper; | |
1986 else | |
1987 c->swScale= PlanarToUyvyWrapper; | |
9455 | 1988 } |
1989 } | |
7725
f2c843e36dc9
fixing yuy2 upscaling (use -sws 0 for the faster but uglier variant)
michael
parents:
7723
diff
changeset
|
1990 |
15523 | 1991 #ifdef COMPILE_ALTIVEC |
12768
931eee818c52
Altivec unscaled YV12 -> packed YUV patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
12698
diff
changeset
|
1992 if ((c->flags & SWS_CPU_CAPS_ALTIVEC) && |
931eee818c52
Altivec unscaled YV12 -> packed YUV patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
12698
diff
changeset
|
1993 ((srcFormat == IMGFMT_YV12 && |
931eee818c52
Altivec unscaled YV12 -> packed YUV patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
12698
diff
changeset
|
1994 (dstFormat == IMGFMT_YUY2 || dstFormat == IMGFMT_UYVY)))) { |
931eee818c52
Altivec unscaled YV12 -> packed YUV patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
12698
diff
changeset
|
1995 // unscaled YV12 -> packed YUV, we want speed |
931eee818c52
Altivec unscaled YV12 -> packed YUV patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
12698
diff
changeset
|
1996 if (dstFormat == IMGFMT_YUY2) |
931eee818c52
Altivec unscaled YV12 -> packed YUV patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
12698
diff
changeset
|
1997 c->swScale= yv12toyuy2_unscaled_altivec; |
931eee818c52
Altivec unscaled YV12 -> packed YUV patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
12698
diff
changeset
|
1998 else |
931eee818c52
Altivec unscaled YV12 -> packed YUV patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
12698
diff
changeset
|
1999 c->swScale= yv12touyvy_unscaled_altivec; |
931eee818c52
Altivec unscaled YV12 -> packed YUV patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
12698
diff
changeset
|
2000 } |
931eee818c52
Altivec unscaled YV12 -> packed YUV patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
12698
diff
changeset
|
2001 #endif |
931eee818c52
Altivec unscaled YV12 -> packed YUV patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
12698
diff
changeset
|
2002 |
9455 | 2003 /* simple copy */ |
2004 if( srcFormat == dstFormat | |
2005 || (isPlanarYUV(srcFormat) && isGray(dstFormat)) | |
2006 || (isPlanarYUV(dstFormat) && isGray(srcFormat)) | |
2007 ) | |
2008 { | |
2009 c->swScale= simpleCopy; | |
6492 | 2010 } |
2011 | |
6616
0b5a789d7fab
using the new rgb2rgb converters (the LQ ones are only used if -sws 0 or -sws 4)
michael
parents:
6582
diff
changeset
|
2012 if(c->swScale){ |
4623 | 2013 if(flags&SWS_PRINT_INFO) |
6492 | 2014 MSG_INFO("SwScaler: using unscaled %s -> %s special converter\n", |
4623 | 2015 vo_format_name(srcFormat), vo_format_name(dstFormat)); |
2016 return c; | |
2017 } | |
4554 | 2018 } |
2019 | |
9975 | 2020 if(flags & SWS_CPU_CAPS_MMX2) |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2021 { |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2022 c->canMMX2BeUsed= (dstW >=srcW && (dstW&31)==0 && (srcW&15)==0) ? 1 : 0; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2023 if(!c->canMMX2BeUsed && dstW >=srcW && (srcW&15)==0 && (flags&SWS_FAST_BILINEAR)) |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2024 { |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2025 if(flags&SWS_PRINT_INFO) |
6492 | 2026 MSG_INFO("SwScaler: output Width is not a multiple of 32 -> no MMX2 scaler\n"); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2027 } |
11379 | 2028 if(usesHFilter) c->canMMX2BeUsed=0; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2029 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2030 else |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2031 c->canMMX2BeUsed=0; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2032 |
4467 | 2033 c->chrXInc= ((c->chrSrcW<<16) + (c->chrDstW>>1))/c->chrDstW; |
2034 c->chrYInc= ((c->chrSrcH<<16) + (c->chrDstH>>1))/c->chrDstH; | |
2035 | |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2036 // match pixel 0 of the src to pixel 0 of dst and match pixel n-2 of src to pixel n-2 of dst |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2037 // but only for the FAST_BILINEAR mode otherwise do correct scaling |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2038 // n-2 is the last chrominance sample available |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2039 // this is not perfect, but noone shuld notice the difference, the more correct variant |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2040 // would be like the vertical one, but that would require some special code for the |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2041 // first and last pixel |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2042 if(flags&SWS_FAST_BILINEAR) |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2043 { |
4467 | 2044 if(c->canMMX2BeUsed) |
2045 { | |
2046 c->lumXInc+= 20; | |
2047 c->chrXInc+= 20; | |
2048 } | |
11000 | 2049 //we don't use the x86asm scaler if mmx is available |
9975 | 2050 else if(flags & SWS_CPU_CAPS_MMX) |
4467 | 2051 { |
2052 c->lumXInc = ((srcW-2)<<16)/(dstW-2) - 20; | |
2053 c->chrXInc = ((c->chrSrcW-2)<<16)/(c->chrDstW-2) - 20; | |
2054 } | |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2055 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2056 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2057 /* precalculate horizontal scaler filter coefficients */ |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2058 { |
12130
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
2059 const int filterAlign= |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
2060 (flags & SWS_CPU_CAPS_MMX) ? 4 : |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
2061 (flags & SWS_CPU_CAPS_ALTIVEC) ? 8 : |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
2062 1; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2063 |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2064 initFilter(&c->hLumFilter, &c->hLumFilterPos, &c->hLumFilterSize, c->lumXInc, |
6580 | 2065 srcW , dstW, filterAlign, 1<<14, |
2066 (flags&SWS_BICUBLIN) ? (flags|SWS_BICUBIC) : flags, | |
13373
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
2067 srcFilter->lumH, dstFilter->lumH, c->param); |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2068 initFilter(&c->hChrFilter, &c->hChrFilterPos, &c->hChrFilterSize, c->chrXInc, |
6580 | 2069 c->chrSrcW, c->chrDstW, filterAlign, 1<<14, |
2070 (flags&SWS_BICUBLIN) ? (flags|SWS_BILINEAR) : flags, | |
13373
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
2071 srcFilter->chrH, dstFilter->chrH, c->param); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2072 |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
2073 #if defined(ARCH_X86) || defined(ARCH_X86_64) |
11000 | 2074 // can't downscale !!! |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2075 if(c->canMMX2BeUsed && (flags & SWS_FAST_BILINEAR)) |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2076 { |
14625
e85e3894520f
makes funnyCode pages executable (for CPU with NX bit)
aurel
parents:
14556
diff
changeset
|
2077 #define MAX_FUNNY_CODE_SIZE 10000 |
14761 | 2078 #ifdef MAP_ANONYMOUS |
14625
e85e3894520f
makes funnyCode pages executable (for CPU with NX bit)
aurel
parents:
14556
diff
changeset
|
2079 c->funnyYCode = (uint8_t*)mmap(NULL, MAX_FUNNY_CODE_SIZE, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); |
e85e3894520f
makes funnyCode pages executable (for CPU with NX bit)
aurel
parents:
14556
diff
changeset
|
2080 c->funnyUVCode = (uint8_t*)mmap(NULL, MAX_FUNNY_CODE_SIZE, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); |
e85e3894520f
makes funnyCode pages executable (for CPU with NX bit)
aurel
parents:
14556
diff
changeset
|
2081 #else |
e85e3894520f
makes funnyCode pages executable (for CPU with NX bit)
aurel
parents:
14556
diff
changeset
|
2082 c->funnyYCode = (uint8_t*)memalign(32, MAX_FUNNY_CODE_SIZE); |
e85e3894520f
makes funnyCode pages executable (for CPU with NX bit)
aurel
parents:
14556
diff
changeset
|
2083 c->funnyUVCode = (uint8_t*)memalign(32, MAX_FUNNY_CODE_SIZE); |
e85e3894520f
makes funnyCode pages executable (for CPU with NX bit)
aurel
parents:
14556
diff
changeset
|
2084 #endif |
e85e3894520f
makes funnyCode pages executable (for CPU with NX bit)
aurel
parents:
14556
diff
changeset
|
2085 |
5452 | 2086 c->lumMmx2Filter = (int16_t*)memalign(8, (dstW /8+8)*sizeof(int16_t)); |
2087 c->chrMmx2Filter = (int16_t*)memalign(8, (c->chrDstW /4+8)*sizeof(int16_t)); | |
2088 c->lumMmx2FilterPos= (int32_t*)memalign(8, (dstW /2/8+8)*sizeof(int32_t)); | |
2089 c->chrMmx2FilterPos= (int32_t*)memalign(8, (c->chrDstW/2/4+8)*sizeof(int32_t)); | |
2090 | |
2091 initMMX2HScaler( dstW, c->lumXInc, c->funnyYCode , c->lumMmx2Filter, c->lumMmx2FilterPos, 8); | |
2092 initMMX2HScaler(c->chrDstW, c->chrXInc, c->funnyUVCode, c->chrMmx2Filter, c->chrMmx2FilterPos, 4); | |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2093 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2094 #endif |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2095 } // Init Horizontal stuff |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2096 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2097 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2098 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2099 /* precalculate vertical scaler filter coefficients */ |
12130
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
2100 { |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
2101 const int filterAlign= |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
2102 (flags & SWS_CPU_CAPS_ALTIVEC) ? 8 : |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
2103 1; |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
2104 |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
2105 initFilter(&c->vLumFilter, &c->vLumFilterPos, &c->vLumFilterSize, c->lumYInc, |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
2106 srcH , dstH, filterAlign, (1<<12)-4, |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
2107 (flags&SWS_BICUBLIN) ? (flags|SWS_BICUBIC) : flags, |
13373
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
2108 srcFilter->lumV, dstFilter->lumV, c->param); |
12130
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
2109 initFilter(&c->vChrFilter, &c->vChrFilterPos, &c->vChrFilterSize, c->chrYInc, |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
2110 c->chrSrcH, c->chrDstH, filterAlign, (1<<12)-4, |
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
2111 (flags&SWS_BICUBLIN) ? (flags|SWS_BILINEAR) : flags, |
13373
6bd869a18d2c
passing an array or double precission parameters for the scaling function, instead of missusing a few bits of the flags
michael
parents:
12838
diff
changeset
|
2112 srcFilter->chrV, dstFilter->chrV, c->param); |
17588
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2113 |
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2114 #ifdef HAVE_ALTIVEC |
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2115 c->vYCoeffsBank = memalign (16, sizeof (vector signed short)*c->vLumFilterSize*c->dstH); |
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2116 c->vCCoeffsBank = memalign (16, sizeof (vector signed short)*c->vChrFilterSize*c->dstH); |
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2117 |
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2118 for (i=0;i<c->vLumFilterSize*c->dstH;i++) { |
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2119 int j; |
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2120 short *p = (short *)&c->vYCoeffsBank[i]; |
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2121 for (j=0;j<8;j++) |
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2122 p[j] = c->vLumFilter[i]; |
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2123 } |
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2124 |
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2125 for (i=0;i<c->vChrFilterSize*c->dstH;i++) { |
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2126 int j; |
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2127 short *p = (short *)&c->vCCoeffsBank[i]; |
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2128 for (j=0;j<8;j++) |
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2129 p[j] = c->vChrFilter[i]; |
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2130 } |
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2131 #endif |
12130
2ef24558b732
AltiVec hScale, all size patch by (Romain Dolbeau <dolbeaur at club-internet dot fr>)
michael
parents:
12023
diff
changeset
|
2132 } |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2133 |
11000 | 2134 // Calculate Buffer Sizes so that they won't run out while handling these damn slices |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2135 c->vLumBufSize= c->vLumFilterSize; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2136 c->vChrBufSize= c->vChrFilterSize; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2137 for(i=0; i<dstH; i++) |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2138 { |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2139 int chrI= i*c->chrDstH / dstH; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2140 int nextSlice= MAX(c->vLumFilterPos[i ] + c->vLumFilterSize - 1, |
6532
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
2141 ((c->vChrFilterPos[chrI] + c->vChrFilterSize - 1)<<c->chrSrcVSubSample)); |
11213
b45214b33cb7
minimum slice size fix (fixes 422P 1 line per slice, used by huffyuv)
michael
parents:
11123
diff
changeset
|
2142 |
b45214b33cb7
minimum slice size fix (fixes 422P 1 line per slice, used by huffyuv)
michael
parents:
11123
diff
changeset
|
2143 nextSlice>>= c->chrSrcVSubSample; |
b45214b33cb7
minimum slice size fix (fixes 422P 1 line per slice, used by huffyuv)
michael
parents:
11123
diff
changeset
|
2144 nextSlice<<= c->chrSrcVSubSample; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2145 if(c->vLumFilterPos[i ] + c->vLumBufSize < nextSlice) |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2146 c->vLumBufSize= nextSlice - c->vLumFilterPos[i ]; |
6532
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
2147 if(c->vChrFilterPos[chrI] + c->vChrBufSize < (nextSlice>>c->chrSrcVSubSample)) |
9834d9980c45
yvu9 support (other planar yuv formats with other chroma subsamplings should be trivial to add, if they had a IMGFMT)
michael
parents:
6520
diff
changeset
|
2148 c->vChrBufSize= (nextSlice>>c->chrSrcVSubSample) - c->vChrFilterPos[chrI]; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2149 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2150 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2151 // allocate pixbufs (we use dynamic allocation because otherwise we would need to |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2152 c->lumPixBuf= (int16_t**)memalign(4, c->vLumBufSize*2*sizeof(int16_t*)); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2153 c->chrPixBuf= (int16_t**)memalign(4, c->vChrBufSize*2*sizeof(int16_t*)); |
4419 | 2154 //Note we need at least one pixel more at the end because of the mmx code (just in case someone wanna replace the 4000/8000) |
17558
ad90899eeee6
AltiVec operations need to have memory aligned on 16-byte boundaries.
diego
parents:
17530
diff
changeset
|
2155 /* align at 16 bytes for AltiVec */ |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2156 for(i=0; i<c->vLumBufSize; i++) |
17558
ad90899eeee6
AltiVec operations need to have memory aligned on 16-byte boundaries.
diego
parents:
17530
diff
changeset
|
2157 c->lumPixBuf[i]= c->lumPixBuf[i+c->vLumBufSize]= (uint16_t*)memalign(16, 4000); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2158 for(i=0; i<c->vChrBufSize; i++) |
17558
ad90899eeee6
AltiVec operations need to have memory aligned on 16-byte boundaries.
diego
parents:
17530
diff
changeset
|
2159 c->chrPixBuf[i]= c->chrPixBuf[i+c->vChrBufSize]= (uint16_t*)memalign(16, 8000); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2160 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2161 //try to avoid drawing green stuff between the right end and the stride end |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2162 for(i=0; i<c->vLumBufSize; i++) memset(c->lumPixBuf[i], 0, 4000); |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2163 for(i=0; i<c->vChrBufSize; i++) memset(c->chrPixBuf[i], 64, 8000); |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2164 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2165 ASSERT(c->chrDstH <= dstH) |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2166 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2167 if(flags&SWS_PRINT_INFO) |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2168 { |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2169 #ifdef DITHER1XBPP |
4297
29fef3982238
15/16 bit dithering in C (5% slower, can be disabled by comenting #define DITHER1XBPP out)
michael
parents:
4295
diff
changeset
|
2170 char *dither= " dithered"; |
29fef3982238
15/16 bit dithering in C (5% slower, can be disabled by comenting #define DITHER1XBPP out)
michael
parents:
4295
diff
changeset
|
2171 #else |
29fef3982238
15/16 bit dithering in C (5% slower, can be disabled by comenting #define DITHER1XBPP out)
michael
parents:
4295
diff
changeset
|
2172 char *dither= ""; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2173 #endif |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2174 if(flags&SWS_FAST_BILINEAR) |
6492 | 2175 MSG_INFO("\nSwScaler: FAST_BILINEAR scaler, "); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2176 else if(flags&SWS_BILINEAR) |
6492 | 2177 MSG_INFO("\nSwScaler: BILINEAR scaler, "); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2178 else if(flags&SWS_BICUBIC) |
6492 | 2179 MSG_INFO("\nSwScaler: BICUBIC scaler, "); |
4467 | 2180 else if(flags&SWS_X) |
6492 | 2181 MSG_INFO("\nSwScaler: Experimental scaler, "); |
4401
8d00348d0d6b
nearest neighbor / sdl emulation ;) scaling (-sws 4)
michael
parents:
4304
diff
changeset
|
2182 else if(flags&SWS_POINT) |
6492 | 2183 MSG_INFO("\nSwScaler: Nearest Neighbor / POINT scaler, "); |
4402
67abbf501b02
area averageing scaling support (-sws 5) (is identical to bilinear for upscale)
michael
parents:
4401
diff
changeset
|
2184 else if(flags&SWS_AREA) |
6492 | 2185 MSG_INFO("\nSwScaler: Area Averageing scaler, "); |
6580 | 2186 else if(flags&SWS_BICUBLIN) |
6637 | 2187 MSG_INFO("\nSwScaler: luma BICUBIC / chroma BILINEAR scaler, "); |
2188 else if(flags&SWS_GAUSS) | |
2189 MSG_INFO("\nSwScaler: Gaussian scaler, "); | |
2190 else if(flags&SWS_SINC) | |
2191 MSG_INFO("\nSwScaler: Sinc scaler, "); | |
2192 else if(flags&SWS_LANCZOS) | |
2193 MSG_INFO("\nSwScaler: Lanczos scaler, "); | |
2194 else if(flags&SWS_SPLINE) | |
2195 MSG_INFO("\nSwScaler: Bicubic spline scaler, "); | |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2196 else |
6492 | 2197 MSG_INFO("\nSwScaler: ehh flags invalid?! "); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2198 |
6492 | 2199 if(dstFormat==IMGFMT_BGR15 || dstFormat==IMGFMT_BGR16) |
2200 MSG_INFO("from %s to%s %s ", | |
2201 vo_format_name(srcFormat), dither, vo_format_name(dstFormat)); | |
2202 else | |
2203 MSG_INFO("from %s to %s ", | |
2204 vo_format_name(srcFormat), vo_format_name(dstFormat)); | |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2205 |
9975 | 2206 if(flags & SWS_CPU_CAPS_MMX2) |
6492 | 2207 MSG_INFO("using MMX2\n"); |
9975 | 2208 else if(flags & SWS_CPU_CAPS_3DNOW) |
6492 | 2209 MSG_INFO("using 3DNOW\n"); |
9975 | 2210 else if(flags & SWS_CPU_CAPS_MMX) |
6492 | 2211 MSG_INFO("using MMX\n"); |
12017
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
2212 else if(flags & SWS_CPU_CAPS_ALTIVEC) |
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
2213 MSG_INFO("using AltiVec\n"); |
21e5cb258a95
AltiVec support in postproc/ + altivec optimizations for yuv2yuvX patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
michael
parents:
11406
diff
changeset
|
2214 else |
6492 | 2215 MSG_INFO("using C\n"); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2216 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2217 |
9975 | 2218 if(flags & SWS_PRINT_INFO) |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2219 { |
9975 | 2220 if(flags & SWS_CPU_CAPS_MMX) |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2221 { |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2222 if(c->canMMX2BeUsed && (flags&SWS_FAST_BILINEAR)) |
6492 | 2223 MSG_V("SwScaler: using FAST_BILINEAR MMX2 scaler for horizontal scaling\n"); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2224 else |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2225 { |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2226 if(c->hLumFilterSize==4) |
6492 | 2227 MSG_V("SwScaler: using 4-tap MMX scaler for horizontal luminance scaling\n"); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2228 else if(c->hLumFilterSize==8) |
6492 | 2229 MSG_V("SwScaler: using 8-tap MMX scaler for horizontal luminance scaling\n"); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2230 else |
6492 | 2231 MSG_V("SwScaler: using n-tap MMX scaler for horizontal luminance scaling\n"); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2232 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2233 if(c->hChrFilterSize==4) |
6492 | 2234 MSG_V("SwScaler: using 4-tap MMX scaler for horizontal chrominance scaling\n"); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2235 else if(c->hChrFilterSize==8) |
6492 | 2236 MSG_V("SwScaler: using 8-tap MMX scaler for horizontal chrominance scaling\n"); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2237 else |
6492 | 2238 MSG_V("SwScaler: using n-tap MMX scaler for horizontal chrominance scaling\n"); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2239 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2240 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2241 else |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2242 { |
13720
821f464b4d90
adapting existing mmx/mmx2/sse/3dnow optimizations so they work on x86_64
aurel
parents:
13564
diff
changeset
|
2243 #if defined(ARCH_X86) || defined(ARCH_X86_64) |
6492 | 2244 MSG_V("SwScaler: using X86-Asm scaler for horizontal scaling\n"); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2245 #else |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2246 if(flags & SWS_FAST_BILINEAR) |
6492 | 2247 MSG_V("SwScaler: using FAST_BILINEAR C scaler for horizontal scaling\n"); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2248 else |
6492 | 2249 MSG_V("SwScaler: using C scaler for horizontal scaling\n"); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2250 #endif |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2251 } |
4419 | 2252 if(isPlanarYUV(dstFormat)) |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2253 { |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2254 if(c->vLumFilterSize==1) |
9975 | 2255 MSG_V("SwScaler: using 1-tap %s \"scaler\" for vertical scaling (YV12 like)\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C"); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2256 else |
9975 | 2257 MSG_V("SwScaler: using n-tap %s scaler for vertical scaling (YV12 like)\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C"); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2258 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2259 else |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2260 { |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2261 if(c->vLumFilterSize==1 && c->vChrFilterSize==2) |
6492 | 2262 MSG_V("SwScaler: using 1-tap %s \"scaler\" for vertical luminance scaling (BGR)\n" |
9975 | 2263 "SwScaler: 2-tap scaler for vertical chrominance scaling (BGR)\n",(flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C"); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2264 else if(c->vLumFilterSize==2 && c->vChrFilterSize==2) |
9975 | 2265 MSG_V("SwScaler: using 2-tap linear %s scaler for vertical scaling (BGR)\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C"); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2266 else |
9975 | 2267 MSG_V("SwScaler: using n-tap %s scaler for vertical scaling (BGR)\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C"); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2268 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2269 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2270 if(dstFormat==IMGFMT_BGR24) |
6492 | 2271 MSG_V("SwScaler: using %s YV12->BGR24 Converter\n", |
9975 | 2272 (flags & SWS_CPU_CAPS_MMX2) ? "MMX2" : ((flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C")); |
4304 | 2273 else if(dstFormat==IMGFMT_BGR32) |
9975 | 2274 MSG_V("SwScaler: using %s YV12->BGR32 Converter\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C"); |
4304 | 2275 else if(dstFormat==IMGFMT_BGR16) |
9975 | 2276 MSG_V("SwScaler: using %s YV12->BGR16 Converter\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C"); |
4304 | 2277 else if(dstFormat==IMGFMT_BGR15) |
9975 | 2278 MSG_V("SwScaler: using %s YV12->BGR15 Converter\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C"); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2279 |
6492 | 2280 MSG_V("SwScaler: %dx%d -> %dx%d\n", srcW, srcH, dstW, dstH); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2281 } |
9975 | 2282 if(flags & SWS_PRINT_INFO) |
4467 | 2283 { |
6492 | 2284 MSG_DBG2("SwScaler:Lum srcW=%d srcH=%d dstW=%d dstH=%d xInc=%d yInc=%d\n", |
4467 | 2285 c->srcW, c->srcH, c->dstW, c->dstH, c->lumXInc, c->lumYInc); |
6492 | 2286 MSG_DBG2("SwScaler:Chr srcW=%d srcH=%d dstW=%d dstH=%d xInc=%d yInc=%d\n", |
4467 | 2287 c->chrSrcW, c->chrSrcH, c->chrDstW, c->chrDstH, c->chrXInc, c->chrYInc); |
2288 } | |
4554 | 2289 |
9975 | 2290 c->swScale= getSwsFunc(flags); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2291 return c; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2292 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2293 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2294 /** |
11000 | 2295 * swscale warper, so we don't need to export the SwsContext. |
9697 | 2296 * assumes planar YUV to be in YUV order instead of YVU |
2297 */ | |
2298 int sws_scale_ordered(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, | |
2299 int srcSliceH, uint8_t* dst[], int dstStride[]){ | |
15248
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2300 if (c->sliceDir == 0 && srcSliceY != 0 && srcSliceY + srcSliceH != c->srcH) { |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2301 MSG_ERR("swScaler: slices start in the middle!\n"); |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2302 return 0; |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2303 } |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2304 if (c->sliceDir == 0) { |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2305 if (srcSliceY == 0) c->sliceDir = 1; else c->sliceDir = -1; |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2306 } |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2307 |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2308 // copy strides, so they can safely be modified |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2309 if (c->sliceDir == 1) { |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2310 // slices go from top to bottom |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2311 int srcStride2[3]= {srcStride[0], srcStride[1], srcStride[2]}; |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2312 int dstStride2[3]= {dstStride[0], dstStride[1], dstStride[2]}; |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2313 return c->swScale(c, src, srcStride2, srcSliceY, srcSliceH, dst, dstStride2); |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2314 } else { |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2315 // slices go from bottom to top => we flip the image internally |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2316 uint8_t* src2[3]= {src[0] + (srcSliceH-1)*srcStride[0], |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2317 src[1] + ((srcSliceH>>c->chrSrcVSubSample)-1)*srcStride[1], |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2318 src[2] + ((srcSliceH>>c->chrSrcVSubSample)-1)*srcStride[2] |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2319 }; |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2320 uint8_t* dst2[3]= {dst[0] + (c->dstH-1)*dstStride[0], |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2321 dst[1] + ((c->dstH>>c->chrDstVSubSample)-1)*dstStride[1], |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2322 dst[2] + ((c->dstH>>c->chrDstVSubSample)-1)*dstStride[2]}; |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2323 int srcStride2[3]= {-srcStride[0], -srcStride[1], -srcStride[2]}; |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2324 int dstStride2[3]= {-dstStride[0], -dstStride[1], -dstStride[2]}; |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2325 |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2326 return c->swScale(c, src2, srcStride2, c->srcH-srcSliceY-srcSliceH, srcSliceH, dst2, dstStride2); |
43e55b3d1af0
support for both orderings of the slices (top->down / bottom->up)
henry
parents:
14783
diff
changeset
|
2327 } |
9697 | 2328 } |
2329 | |
2330 /** | |
11000 | 2331 * swscale warper, so we don't need to export the SwsContext |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2332 */ |
9499 | 2333 int sws_scale(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, |
2334 int srcSliceH, uint8_t* dstParam[], int dstStrideParam[]){ | |
2335 int srcStride[3]; | |
2336 int dstStride[3]; | |
2337 uint8_t *src[3]; | |
2338 uint8_t *dst[3]; | |
9697 | 2339 sws_orderYUV(c->origSrcFormat, src, srcStride, srcParam, srcStrideParam); |
2340 sws_orderYUV(c->origDstFormat, dst, dstStride, dstParam, dstStrideParam); | |
9499 | 2341 //printf("sws: slice %d %d\n", srcSliceY, srcSliceH); |
10312 | 2342 |
9698 | 2343 return c->swScale(c, src, srcStride, srcSliceY, srcSliceH, dst, dstStride); |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2344 } |
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2345 |
9985
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2346 SwsFilter *sws_getDefaultFilter(float lumaGBlur, float chromaGBlur, |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2347 float lumaSharpen, float chromaSharpen, |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2348 float chromaHShift, float chromaVShift, |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2349 int verbose) |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2350 { |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2351 SwsFilter *filter= malloc(sizeof(SwsFilter)); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2352 |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2353 if(lumaGBlur!=0.0){ |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2354 filter->lumH= sws_getGaussianVec(lumaGBlur, 3.0); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2355 filter->lumV= sws_getGaussianVec(lumaGBlur, 3.0); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2356 }else{ |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2357 filter->lumH= sws_getIdentityVec(); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2358 filter->lumV= sws_getIdentityVec(); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2359 } |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2360 |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2361 if(chromaGBlur!=0.0){ |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2362 filter->chrH= sws_getGaussianVec(chromaGBlur, 3.0); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2363 filter->chrV= sws_getGaussianVec(chromaGBlur, 3.0); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2364 }else{ |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2365 filter->chrH= sws_getIdentityVec(); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2366 filter->chrV= sws_getIdentityVec(); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2367 } |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2368 |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2369 if(chromaSharpen!=0.0){ |
17530 | 2370 SwsVector *id= sws_getIdentityVec(); |
2371 sws_scaleVec(filter->chrH, -chromaSharpen); | |
2372 sws_scaleVec(filter->chrV, -chromaSharpen); | |
2373 sws_addVec(filter->chrH, id); | |
2374 sws_addVec(filter->chrV, id); | |
9985
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2375 sws_freeVec(id); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2376 } |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2377 |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2378 if(lumaSharpen!=0.0){ |
17530 | 2379 SwsVector *id= sws_getIdentityVec(); |
2380 sws_scaleVec(filter->lumH, -lumaSharpen); | |
2381 sws_scaleVec(filter->lumV, -lumaSharpen); | |
2382 sws_addVec(filter->lumH, id); | |
2383 sws_addVec(filter->lumV, id); | |
9985
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2384 sws_freeVec(id); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2385 } |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2386 |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2387 if(chromaHShift != 0.0) |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2388 sws_shiftVec(filter->chrH, (int)(chromaHShift+0.5)); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2389 |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2390 if(chromaVShift != 0.0) |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2391 sws_shiftVec(filter->chrV, (int)(chromaVShift+0.5)); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2392 |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2393 sws_normalizeVec(filter->chrH, 1.0); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2394 sws_normalizeVec(filter->chrV, 1.0); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2395 sws_normalizeVec(filter->lumH, 1.0); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2396 sws_normalizeVec(filter->lumV, 1.0); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2397 |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2398 if(verbose) sws_printVec(filter->chrH); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2399 if(verbose) sws_printVec(filter->lumH); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2400 |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2401 return filter; |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2402 } |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2403 |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2404 /** |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2405 * returns a normalized gaussian curve used to filter stuff |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2406 * quality=3 is high quality, lowwer is lowwer quality |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2407 */ |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2408 SwsVector *sws_getGaussianVec(double variance, double quality){ |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2409 const int length= (int)(variance*quality + 0.5) | 1; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2410 int i; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2411 double *coeff= memalign(sizeof(double), length*sizeof(double)); |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2412 double middle= (length-1)*0.5; |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2413 SwsVector *vec= malloc(sizeof(SwsVector)); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2414 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2415 vec->coeff= coeff; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2416 vec->length= length; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2417 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2418 for(i=0; i<length; i++) |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2419 { |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2420 double dist= i-middle; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2421 coeff[i]= exp( -dist*dist/(2*variance*variance) ) / sqrt(2*variance*PI); |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2422 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2423 |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2424 sws_normalizeVec(vec, 1.0); |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2425 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2426 return vec; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2427 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2428 |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2429 SwsVector *sws_getConstVec(double c, int length){ |
4297
29fef3982238
15/16 bit dithering in C (5% slower, can be disabled by comenting #define DITHER1XBPP out)
michael
parents:
4295
diff
changeset
|
2430 int i; |
29fef3982238
15/16 bit dithering in C (5% slower, can be disabled by comenting #define DITHER1XBPP out)
michael
parents:
4295
diff
changeset
|
2431 double *coeff= memalign(sizeof(double), length*sizeof(double)); |
29fef3982238
15/16 bit dithering in C (5% slower, can be disabled by comenting #define DITHER1XBPP out)
michael
parents:
4295
diff
changeset
|
2432 SwsVector *vec= malloc(sizeof(SwsVector)); |
29fef3982238
15/16 bit dithering in C (5% slower, can be disabled by comenting #define DITHER1XBPP out)
michael
parents:
4295
diff
changeset
|
2433 |
29fef3982238
15/16 bit dithering in C (5% slower, can be disabled by comenting #define DITHER1XBPP out)
michael
parents:
4295
diff
changeset
|
2434 vec->coeff= coeff; |
29fef3982238
15/16 bit dithering in C (5% slower, can be disabled by comenting #define DITHER1XBPP out)
michael
parents:
4295
diff
changeset
|
2435 vec->length= length; |
29fef3982238
15/16 bit dithering in C (5% slower, can be disabled by comenting #define DITHER1XBPP out)
michael
parents:
4295
diff
changeset
|
2436 |
29fef3982238
15/16 bit dithering in C (5% slower, can be disabled by comenting #define DITHER1XBPP out)
michael
parents:
4295
diff
changeset
|
2437 for(i=0; i<length; i++) |
29fef3982238
15/16 bit dithering in C (5% slower, can be disabled by comenting #define DITHER1XBPP out)
michael
parents:
4295
diff
changeset
|
2438 coeff[i]= c; |
29fef3982238
15/16 bit dithering in C (5% slower, can be disabled by comenting #define DITHER1XBPP out)
michael
parents:
4295
diff
changeset
|
2439 |
29fef3982238
15/16 bit dithering in C (5% slower, can be disabled by comenting #define DITHER1XBPP out)
michael
parents:
4295
diff
changeset
|
2440 return vec; |
29fef3982238
15/16 bit dithering in C (5% slower, can be disabled by comenting #define DITHER1XBPP out)
michael
parents:
4295
diff
changeset
|
2441 } |
29fef3982238
15/16 bit dithering in C (5% slower, can be disabled by comenting #define DITHER1XBPP out)
michael
parents:
4295
diff
changeset
|
2442 |
29fef3982238
15/16 bit dithering in C (5% slower, can be disabled by comenting #define DITHER1XBPP out)
michael
parents:
4295
diff
changeset
|
2443 |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2444 SwsVector *sws_getIdentityVec(void){ |
17530 | 2445 return sws_getConstVec(1.0, 1); |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2446 } |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2447 |
17530 | 2448 double sws_dcVec(SwsVector *a){ |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2449 int i; |
17530 | 2450 double sum=0; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2451 |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2452 for(i=0; i<a->length; i++) |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2453 sum+= a->coeff[i]; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2454 |
17530 | 2455 return sum; |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2456 } |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2457 |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2458 void sws_scaleVec(SwsVector *a, double scalar){ |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2459 int i; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2460 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2461 for(i=0; i<a->length; i++) |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2462 a->coeff[i]*= scalar; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2463 } |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2464 |
17530 | 2465 void sws_normalizeVec(SwsVector *a, double height){ |
2466 sws_scaleVec(a, height/sws_dcVec(a)); | |
2467 } | |
2468 | |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2469 static SwsVector *sws_getConvVec(SwsVector *a, SwsVector *b){ |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2470 int length= a->length + b->length - 1; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2471 double *coeff= memalign(sizeof(double), length*sizeof(double)); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2472 int i, j; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2473 SwsVector *vec= malloc(sizeof(SwsVector)); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2474 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2475 vec->coeff= coeff; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2476 vec->length= length; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2477 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2478 for(i=0; i<length; i++) coeff[i]= 0.0; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2479 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2480 for(i=0; i<a->length; i++) |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2481 { |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2482 for(j=0; j<b->length; j++) |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2483 { |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2484 coeff[i+j]+= a->coeff[i]*b->coeff[j]; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2485 } |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2486 } |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2487 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2488 return vec; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2489 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2490 |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2491 static SwsVector *sws_sumVec(SwsVector *a, SwsVector *b){ |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2492 int length= MAX(a->length, b->length); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2493 double *coeff= memalign(sizeof(double), length*sizeof(double)); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2494 int i; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2495 SwsVector *vec= malloc(sizeof(SwsVector)); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2496 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2497 vec->coeff= coeff; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2498 vec->length= length; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2499 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2500 for(i=0; i<length; i++) coeff[i]= 0.0; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2501 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2502 for(i=0; i<a->length; i++) coeff[i + (length-1)/2 - (a->length-1)/2]+= a->coeff[i]; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2503 for(i=0; i<b->length; i++) coeff[i + (length-1)/2 - (b->length-1)/2]+= b->coeff[i]; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2504 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2505 return vec; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2506 } |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2507 |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2508 static SwsVector *sws_diffVec(SwsVector *a, SwsVector *b){ |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2509 int length= MAX(a->length, b->length); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2510 double *coeff= memalign(sizeof(double), length*sizeof(double)); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2511 int i; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2512 SwsVector *vec= malloc(sizeof(SwsVector)); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2513 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2514 vec->coeff= coeff; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2515 vec->length= length; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2516 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2517 for(i=0; i<length; i++) coeff[i]= 0.0; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2518 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2519 for(i=0; i<a->length; i++) coeff[i + (length-1)/2 - (a->length-1)/2]+= a->coeff[i]; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2520 for(i=0; i<b->length; i++) coeff[i + (length-1)/2 - (b->length-1)/2]-= b->coeff[i]; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2521 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2522 return vec; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2523 } |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2524 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2525 /* shift left / or right if "shift" is negative */ |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2526 static SwsVector *sws_getShiftedVec(SwsVector *a, int shift){ |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2527 int length= a->length + ABS(shift)*2; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2528 double *coeff= memalign(sizeof(double), length*sizeof(double)); |
4401
8d00348d0d6b
nearest neighbor / sdl emulation ;) scaling (-sws 4)
michael
parents:
4304
diff
changeset
|
2529 int i; |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2530 SwsVector *vec= malloc(sizeof(SwsVector)); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2531 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2532 vec->coeff= coeff; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2533 vec->length= length; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2534 |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2535 for(i=0; i<length; i++) coeff[i]= 0.0; |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2536 |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2537 for(i=0; i<a->length; i++) |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2538 { |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2539 coeff[i + (length-1)/2 - (a->length-1)/2 - shift]= a->coeff[i]; |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2540 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2541 |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2542 return vec; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2543 } |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2544 |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2545 void sws_shiftVec(SwsVector *a, int shift){ |
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2546 SwsVector *shifted= sws_getShiftedVec(a, shift); |
4294
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2547 free(a->coeff); |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2548 a->coeff= shifted->coeff; |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2549 a->length= shifted->length; |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2550 free(shifted); |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2551 } |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2552 |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2553 void sws_addVec(SwsVector *a, SwsVector *b){ |
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2554 SwsVector *sum= sws_sumVec(a, b); |
4294
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2555 free(a->coeff); |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2556 a->coeff= sum->coeff; |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2557 a->length= sum->length; |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2558 free(sum); |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2559 } |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2560 |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2561 void sws_subVec(SwsVector *a, SwsVector *b){ |
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2562 SwsVector *diff= sws_diffVec(a, b); |
4294
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2563 free(a->coeff); |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2564 a->coeff= diff->coeff; |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2565 a->length= diff->length; |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2566 free(diff); |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2567 } |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2568 |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2569 void sws_convVec(SwsVector *a, SwsVector *b){ |
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2570 SwsVector *conv= sws_getConvVec(a, b); |
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2571 free(a->coeff); |
4294
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2572 a->coeff= conv->coeff; |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2573 a->length= conv->length; |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2574 free(conv); |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2575 } |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2576 |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2577 SwsVector *sws_cloneVec(SwsVector *a){ |
4294
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2578 double *coeff= memalign(sizeof(double), a->length*sizeof(double)); |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2579 int i; |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2580 SwsVector *vec= malloc(sizeof(SwsVector)); |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2581 |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2582 vec->coeff= coeff; |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2583 vec->length= a->length; |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2584 |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2585 for(i=0; i<a->length; i++) coeff[i]= a->coeff[i]; |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2586 |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2587 return vec; |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2588 } |
21dbbbbd5479
a few filters (should be removed/merged when arpis videofilter stuff is finished)
michael
parents:
4290
diff
changeset
|
2589 |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2590 void sws_printVec(SwsVector *a){ |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2591 int i; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2592 double max=0; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2593 double min=0; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2594 double range; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2595 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2596 for(i=0; i<a->length; i++) |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2597 if(a->coeff[i]>max) max= a->coeff[i]; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2598 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2599 for(i=0; i<a->length; i++) |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2600 if(a->coeff[i]<min) min= a->coeff[i]; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2601 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2602 range= max - min; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2603 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2604 for(i=0; i<a->length; i++) |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2605 { |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2606 int x= (int)((a->coeff[i]-min)*60.0/range +0.5); |
6492 | 2607 MSG_DBG2("%1.3f ", a->coeff[i]); |
2608 for(;x>0; x--) MSG_DBG2(" "); | |
2609 MSG_DBG2("|\n"); | |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2610 } |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2611 } |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2612 |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2613 void sws_freeVec(SwsVector *a){ |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2614 if(!a) return; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2615 if(a->coeff) free(a->coeff); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2616 a->coeff=NULL; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2617 a->length=0; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2618 free(a); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2619 } |
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2620 |
9985
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2621 void sws_freeFilter(SwsFilter *filter){ |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2622 if(!filter) return; |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2623 |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2624 if(filter->lumH) sws_freeVec(filter->lumH); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2625 if(filter->lumV) sws_freeVec(filter->lumV); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2626 if(filter->chrH) sws_freeVec(filter->chrH); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2627 if(filter->chrV) sws_freeVec(filter->chrV); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2628 free(filter); |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2629 } |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2630 |
3d8b145a5470
moving getFilter stuff back (vf_scale.c -> swscale.c)
michael
parents:
9975
diff
changeset
|
2631 |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9476
diff
changeset
|
2632 void sws_freeContext(SwsContext *c){ |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2633 int i; |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2634 if(!c) return; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2635 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2636 if(c->lumPixBuf) |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2637 { |
4419 | 2638 for(i=0; i<c->vLumBufSize; i++) |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2639 { |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2640 if(c->lumPixBuf[i]) free(c->lumPixBuf[i]); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2641 c->lumPixBuf[i]=NULL; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2642 } |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2643 free(c->lumPixBuf); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2644 c->lumPixBuf=NULL; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2645 } |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2646 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2647 if(c->chrPixBuf) |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2648 { |
4419 | 2649 for(i=0; i<c->vChrBufSize; i++) |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2650 { |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2651 if(c->chrPixBuf[i]) free(c->chrPixBuf[i]); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2652 c->chrPixBuf[i]=NULL; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2653 } |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2654 free(c->chrPixBuf); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2655 c->chrPixBuf=NULL; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2656 } |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2657 |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2658 if(c->vLumFilter) free(c->vLumFilter); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2659 c->vLumFilter = NULL; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2660 if(c->vChrFilter) free(c->vChrFilter); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2661 c->vChrFilter = NULL; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2662 if(c->hLumFilter) free(c->hLumFilter); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2663 c->hLumFilter = NULL; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2664 if(c->hChrFilter) free(c->hChrFilter); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2665 c->hChrFilter = NULL; |
17588
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2666 #ifdef HAVE_ALTIVEC |
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2667 if(c->vYCoeffsBank) free(c->vYCoeffsBank); |
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2668 c->vYCoeffsBank = NULL; |
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2669 if(c->vCCoeffsBank) free(c->vCCoeffsBank); |
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2670 c->vCCoeffsBank = NULL; |
79081ba52e00
Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents:
17566
diff
changeset
|
2671 #endif |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2672 |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2673 if(c->vLumFilterPos) free(c->vLumFilterPos); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2674 c->vLumFilterPos = NULL; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2675 if(c->vChrFilterPos) free(c->vChrFilterPos); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2676 c->vChrFilterPos = NULL; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2677 if(c->hLumFilterPos) free(c->hLumFilterPos); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2678 c->hLumFilterPos = NULL; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2679 if(c->hChrFilterPos) free(c->hChrFilterPos); |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2680 c->hChrFilterPos = NULL; |
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2681 |
14630 | 2682 #if defined(ARCH_X86) || defined(ARCH_X86_64) |
14783 | 2683 #ifdef MAP_ANONYMOUS |
14625
e85e3894520f
makes funnyCode pages executable (for CPU with NX bit)
aurel
parents:
14556
diff
changeset
|
2684 if(c->funnyYCode) munmap(c->funnyYCode, MAX_FUNNY_CODE_SIZE); |
e85e3894520f
makes funnyCode pages executable (for CPU with NX bit)
aurel
parents:
14556
diff
changeset
|
2685 if(c->funnyUVCode) munmap(c->funnyUVCode, MAX_FUNNY_CODE_SIZE); |
e85e3894520f
makes funnyCode pages executable (for CPU with NX bit)
aurel
parents:
14556
diff
changeset
|
2686 #else |
e85e3894520f
makes funnyCode pages executable (for CPU with NX bit)
aurel
parents:
14556
diff
changeset
|
2687 if(c->funnyYCode) free(c->funnyYCode); |
e85e3894520f
makes funnyCode pages executable (for CPU with NX bit)
aurel
parents:
14556
diff
changeset
|
2688 if(c->funnyUVCode) free(c->funnyUVCode); |
e85e3894520f
makes funnyCode pages executable (for CPU with NX bit)
aurel
parents:
14556
diff
changeset
|
2689 #endif |
e85e3894520f
makes funnyCode pages executable (for CPU with NX bit)
aurel
parents:
14556
diff
changeset
|
2690 c->funnyYCode=NULL; |
e85e3894520f
makes funnyCode pages executable (for CPU with NX bit)
aurel
parents:
14556
diff
changeset
|
2691 c->funnyUVCode=NULL; |
14630 | 2692 #endif |
14625
e85e3894520f
makes funnyCode pages executable (for CPU with NX bit)
aurel
parents:
14556
diff
changeset
|
2693 |
5452 | 2694 if(c->lumMmx2Filter) free(c->lumMmx2Filter); |
2695 c->lumMmx2Filter=NULL; | |
2696 if(c->chrMmx2Filter) free(c->chrMmx2Filter); | |
2697 c->chrMmx2Filter=NULL; | |
2698 if(c->lumMmx2FilterPos) free(c->lumMmx2FilterPos); | |
2699 c->lumMmx2FilterPos=NULL; | |
2700 if(c->chrMmx2FilterPos) free(c->chrMmx2FilterPos); | |
2701 c->chrMmx2FilterPos=NULL; | |
6578 | 2702 if(c->yuvTable) free(c->yuvTable); |
2703 c->yuvTable=NULL; | |
5452 | 2704 |
4290
1f8ceb12284d
general convolution filtering of the source picture
michael
parents:
4281
diff
changeset
|
2705 free(c); |
4276
9199d15cb4e0
removed global vars so that multiple swscalers can be used
michael
parents:
4248
diff
changeset
|
2706 } |
4281 | 2707 |