annotate libswscale/swscale.c @ 22218:ff7aa2aecb9d

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