annotate libswscale/utils.c @ 32329:597a570963fa

Set default values for the scale context in sws_alloc_context().
author stefano
date Wed, 29 Sep 2010 22:06:44 +0000
parents 9a91a876aab6
children 5572e926e027
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 *
30923
0be6ed163321 libswscale: Relicense almost all x86 assembler optimizations as LGPL.
diego
parents: 30912
diff changeset
6 * FFmpeg is free software; you can redistribute it and/or
0be6ed163321 libswscale: Relicense almost all x86 assembler optimizations as LGPL.
diego
parents: 30912
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
0be6ed163321 libswscale: Relicense almost all x86 assembler optimizations as LGPL.
diego
parents: 30912
diff changeset
8 * License as published by the Free Software Foundation; either
0be6ed163321 libswscale: Relicense almost all x86 assembler optimizations as LGPL.
diego
parents: 30912
diff changeset
9 * version 2.1 of the License, or (at your option) any later version.
20094
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
30923
0be6ed163321 libswscale: Relicense almost all x86 assembler optimizations as LGPL.
diego
parents: 30912
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
0be6ed163321 libswscale: Relicense almost all x86 assembler optimizations as LGPL.
diego
parents: 30912
diff changeset
14 * Lesser General Public License for more details.
20094
aca9e9783f67 Change license headers to say 'FFmpeg' instead of 'this program'.
diego
parents: 19987
diff changeset
15 *
30923
0be6ed163321 libswscale: Relicense almost all x86 assembler optimizations as LGPL.
diego
parents: 30912
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
0be6ed163321 libswscale: Relicense almost all x86 assembler optimizations as LGPL.
diego
parents: 30912
diff changeset
17 * License along with FFmpeg; if not, write to the Free Software
23702
5159b5f8784e license header consistency cosmetics
diego
parents: 23585
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20094
aca9e9783f67 Change license headers to say 'FFmpeg' instead of 'this program'.
diego
parents: 19987
diff changeset
19 */
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
20
27511
c9e8d182aa4b Make fast bilinear scaler work again.
michael
parents: 27496
diff changeset
21 #define _SVID_SOURCE //needed for MAP_ANONYMOUS
31694
e251996735b5 darwin: allow 64-bit darwin to allocate executable memory
ramiro
parents: 31234
diff changeset
22 #define _DARWIN_C_SOURCE // needed for MAP_ANON
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
23 #include <inttypes.h>
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
24 #include <string.h>
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
25 #include <math.h>
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
26 #include <stdio.h>
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
27 #include "config.h"
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
28 #include <assert.h>
28276
877336d3c598 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 28246
diff changeset
29 #if HAVE_SYS_MMAN_H
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
30 #include <sys/mman.h>
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
31 #if defined(MAP_ANON) && !defined(MAP_ANONYMOUS)
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
32 #define MAP_ANONYMOUS MAP_ANON
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
33 #endif
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
34 #endif
28971
b8e356a9dbb1 Allocate executable memory with VirtualAlloc() in Windows.
ramiro
parents: 28970
diff changeset
35 #if HAVE_VIRTUALALLOC
b8e356a9dbb1 Allocate executable memory with VirtualAlloc() in Windows.
ramiro
parents: 28970
diff changeset
36 #define WIN32_LEAN_AND_MEAN
b8e356a9dbb1 Allocate executable memory with VirtualAlloc() in Windows.
ramiro
parents: 28970
diff changeset
37 #include <windows.h>
b8e356a9dbb1 Allocate executable memory with VirtualAlloc() in Windows.
ramiro
parents: 28970
diff changeset
38 #endif
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
39 #include "swscale.h"
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
40 #include "swscale_internal.h"
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
41 #include "rgb2rgb.h"
29475
a697eafd804d Vertical yuv -> yuv16 scaler.
ramiro
parents: 29470
diff changeset
42 #include "libavutil/intreadwrite.h"
26670
e6774798e913 Use full path for #includes from another directory.
diego
parents: 26238
diff changeset
43 #include "libavutil/x86_cpu.h"
29542
3e7ffd70b12b swscale: Check for return values of malloc.
ramiro
parents: 29540
diff changeset
44 #include "libavutil/avutil.h"
26670
e6774798e913 Use full path for #includes from another directory.
diego
parents: 26238
diff changeset
45 #include "libavutil/bswap.h"
32329
597a570963fa Set default values for the scale context in sws_alloc_context().
stefano
parents: 32319
diff changeset
46 #include "libavutil/opt.h"
29926
916134a82d74 Make sws_format_name() use av_pix_fmt_descriptors.
stefano
parents: 29890
diff changeset
47 #include "libavutil/pixdesc.h"
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
48
27460
1b5516898adb Implement swscale_version().
stefano
parents: 27300
diff changeset
49 unsigned swscale_version(void)
1b5516898adb Implement swscale_version().
stefano
parents: 27300
diff changeset
50 {
1b5516898adb Implement swscale_version().
stefano
parents: 27300
diff changeset
51 return LIBSWSCALE_VERSION_INT;
1b5516898adb Implement swscale_version().
stefano
parents: 27300
diff changeset
52 }
1b5516898adb Implement swscale_version().
stefano
parents: 27300
diff changeset
53
30138
acc6ed68a385 Prefer "*FUNC_NAME(" over "* FUNC_NAME(" for the
stefano
parents: 30130
diff changeset
54 const char *swscale_configuration(void)
29890
e8e1f8cc7c5b Add functions to return library license and library configuration.
diego
parents: 29843
diff changeset
55 {
e8e1f8cc7c5b Add functions to return library license and library configuration.
diego
parents: 29843
diff changeset
56 return FFMPEG_CONFIGURATION;
e8e1f8cc7c5b Add functions to return library license and library configuration.
diego
parents: 29843
diff changeset
57 }
e8e1f8cc7c5b Add functions to return library license and library configuration.
diego
parents: 29843
diff changeset
58
30138
acc6ed68a385 Prefer "*FUNC_NAME(" over "* FUNC_NAME(" for the
stefano
parents: 30130
diff changeset
59 const char *swscale_license(void)
29890
e8e1f8cc7c5b Add functions to return library license and library configuration.
diego
parents: 29843
diff changeset
60 {
e8e1f8cc7c5b Add functions to return library license and library configuration.
diego
parents: 29843
diff changeset
61 #define LICENSE_PREFIX "libswscale license: "
e8e1f8cc7c5b Add functions to return library license and library configuration.
diego
parents: 29843
diff changeset
62 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
e8e1f8cc7c5b Add functions to return library license and library configuration.
diego
parents: 29843
diff changeset
63 }
e8e1f8cc7c5b Add functions to return library license and library configuration.
diego
parents: 29843
diff changeset
64
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
65 #define RET 0xC3 //near return opcode for x86
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
66
23278
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
67 #define isSupportedIn(x) ( \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
68 (x)==PIX_FMT_YUV420P \
24581
a7fe1ee84511 add support for yuva420p colorspace (yuv420p + alpha)
aurel
parents: 24289
diff changeset
69 || (x)==PIX_FMT_YUVA420P \
23278
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
70 || (x)==PIX_FMT_YUYV422 \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
71 || (x)==PIX_FMT_UYVY422 \
29299
24954ec81529 Partial (low bits ignored, no direct transcoding into other RGB formats) support
kostya
parents: 29278
diff changeset
72 || (x)==PIX_FMT_RGB48BE \
24954ec81529 Partial (low bits ignored, no direct transcoding into other RGB formats) support
kostya
parents: 29278
diff changeset
73 || (x)==PIX_FMT_RGB48LE \
23278
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
74 || (x)==PIX_FMT_RGB32 \
27490
651ebfa4b7db Support PIX_FMT_RGB32_1 and PIX_FMT_BGR32_1.
michael
parents: 27489
diff changeset
75 || (x)==PIX_FMT_RGB32_1 \
23278
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
76 || (x)==PIX_FMT_BGR24 \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
77 || (x)==PIX_FMT_BGR565 \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
78 || (x)==PIX_FMT_BGR555 \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
79 || (x)==PIX_FMT_BGR32 \
27490
651ebfa4b7db Support PIX_FMT_RGB32_1 and PIX_FMT_BGR32_1.
michael
parents: 27489
diff changeset
80 || (x)==PIX_FMT_BGR32_1 \
23278
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
81 || (x)==PIX_FMT_RGB24 \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
82 || (x)==PIX_FMT_RGB565 \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
83 || (x)==PIX_FMT_RGB555 \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
84 || (x)==PIX_FMT_GRAY8 \
32308
ecb8e52d4add Y400A (gray alpha) input support in libswscale
bcoudurier
parents: 32307
diff changeset
85 || (x)==PIX_FMT_Y400A \
23278
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
86 || (x)==PIX_FMT_YUV410P \
27557
a594051dc796 Add support for PIX_FMT_YUV440P.
michael
parents: 27555
diff changeset
87 || (x)==PIX_FMT_YUV440P \
29932
7c5fd4b35889 Add support for nv12/nv21 input.
ramiro
parents: 29926
diff changeset
88 || (x)==PIX_FMT_NV12 \
7c5fd4b35889 Add support for nv12/nv21 input.
ramiro
parents: 29926
diff changeset
89 || (x)==PIX_FMT_NV21 \
23278
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
90 || (x)==PIX_FMT_GRAY16BE \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
91 || (x)==PIX_FMT_GRAY16LE \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
92 || (x)==PIX_FMT_YUV444P \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
93 || (x)==PIX_FMT_YUV422P \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
94 || (x)==PIX_FMT_YUV411P \
30432
ebb651f9e2ab Declare support for the pixel formats:
stefano
parents: 30393
diff changeset
95 || (x)==PIX_FMT_YUVJ420P \
ebb651f9e2ab Declare support for the pixel formats:
stefano
parents: 30393
diff changeset
96 || (x)==PIX_FMT_YUVJ422P \
ebb651f9e2ab Declare support for the pixel formats:
stefano
parents: 30393
diff changeset
97 || (x)==PIX_FMT_YUVJ440P \
ebb651f9e2ab Declare support for the pixel formats:
stefano
parents: 30393
diff changeset
98 || (x)==PIX_FMT_YUVJ444P \
23278
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
99 || (x)==PIX_FMT_PAL8 \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
100 || (x)==PIX_FMT_BGR8 \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
101 || (x)==PIX_FMT_RGB8 \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
102 || (x)==PIX_FMT_BGR4_BYTE \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
103 || (x)==PIX_FMT_RGB4_BYTE \
23791
e4138d991107 use YUV440P in swscale
benoit
parents: 23702
diff changeset
104 || (x)==PIX_FMT_YUV440P \
27555
bf2638aa89b4 Support mono as input format.
michael
parents: 27554
diff changeset
105 || (x)==PIX_FMT_MONOWHITE \
bf2638aa89b4 Support mono as input format.
michael
parents: 27554
diff changeset
106 || (x)==PIX_FMT_MONOBLACK \
29608
ff34398b14b1 Make 16bit YUV formats compatible with NE avcodec_get_pix_fmt().
ramiro
parents: 29545
diff changeset
107 || (x)==PIX_FMT_YUV420P16LE \
ff34398b14b1 Make 16bit YUV formats compatible with NE avcodec_get_pix_fmt().
ramiro
parents: 29545
diff changeset
108 || (x)==PIX_FMT_YUV422P16LE \
ff34398b14b1 Make 16bit YUV formats compatible with NE avcodec_get_pix_fmt().
ramiro
parents: 29545
diff changeset
109 || (x)==PIX_FMT_YUV444P16LE \
ff34398b14b1 Make 16bit YUV formats compatible with NE avcodec_get_pix_fmt().
ramiro
parents: 29545
diff changeset
110 || (x)==PIX_FMT_YUV420P16BE \
ff34398b14b1 Make 16bit YUV formats compatible with NE avcodec_get_pix_fmt().
ramiro
parents: 29545
diff changeset
111 || (x)==PIX_FMT_YUV422P16BE \
ff34398b14b1 Make 16bit YUV formats compatible with NE avcodec_get_pix_fmt().
ramiro
parents: 29545
diff changeset
112 || (x)==PIX_FMT_YUV444P16BE \
23278
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
113 )
30194
bd9db1814611 Implement sws_isSupportedInput() and sws_isSupportedOutput().
stefano
parents: 30142
diff changeset
114
bd9db1814611 Implement sws_isSupportedInput() and sws_isSupportedOutput().
stefano
parents: 30142
diff changeset
115 int sws_isSupportedInput(enum PixelFormat pix_fmt)
bd9db1814611 Implement sws_isSupportedInput() and sws_isSupportedOutput().
stefano
parents: 30142
diff changeset
116 {
bd9db1814611 Implement sws_isSupportedInput() and sws_isSupportedOutput().
stefano
parents: 30142
diff changeset
117 return isSupportedIn(pix_fmt);
bd9db1814611 Implement sws_isSupportedInput() and sws_isSupportedOutput().
stefano
parents: 30142
diff changeset
118 }
bd9db1814611 Implement sws_isSupportedInput() and sws_isSupportedOutput().
stefano
parents: 30142
diff changeset
119
23278
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
120 #define isSupportedOut(x) ( \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
121 (x)==PIX_FMT_YUV420P \
28977
6601bf7365d5 YUVA420P is now supported as output format
sdrik
parents: 28976
diff changeset
122 || (x)==PIX_FMT_YUVA420P \
23278
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
123 || (x)==PIX_FMT_YUYV422 \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
124 || (x)==PIX_FMT_UYVY422 \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
125 || (x)==PIX_FMT_YUV444P \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
126 || (x)==PIX_FMT_YUV422P \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
127 || (x)==PIX_FMT_YUV411P \
30432
ebb651f9e2ab Declare support for the pixel formats:
stefano
parents: 30393
diff changeset
128 || (x)==PIX_FMT_YUVJ420P \
ebb651f9e2ab Declare support for the pixel formats:
stefano
parents: 30393
diff changeset
129 || (x)==PIX_FMT_YUVJ422P \
ebb651f9e2ab Declare support for the pixel formats:
stefano
parents: 30393
diff changeset
130 || (x)==PIX_FMT_YUVJ440P \
ebb651f9e2ab Declare support for the pixel formats:
stefano
parents: 30393
diff changeset
131 || (x)==PIX_FMT_YUVJ444P \
30393
db62840d27ae Use isAnyRGB() where possible
michael
parents: 30391
diff changeset
132 || isAnyRGB(x) \
23278
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
133 || (x)==PIX_FMT_NV12 \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
134 || (x)==PIX_FMT_NV21 \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
135 || (x)==PIX_FMT_GRAY16BE \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
136 || (x)==PIX_FMT_GRAY16LE \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
137 || (x)==PIX_FMT_GRAY8 \
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
138 || (x)==PIX_FMT_YUV410P \
27557
a594051dc796 Add support for PIX_FMT_YUV440P.
michael
parents: 27555
diff changeset
139 || (x)==PIX_FMT_YUV440P \
29608
ff34398b14b1 Make 16bit YUV formats compatible with NE avcodec_get_pix_fmt().
ramiro
parents: 29545
diff changeset
140 || (x)==PIX_FMT_YUV420P16LE \
ff34398b14b1 Make 16bit YUV formats compatible with NE avcodec_get_pix_fmt().
ramiro
parents: 29545
diff changeset
141 || (x)==PIX_FMT_YUV422P16LE \
ff34398b14b1 Make 16bit YUV formats compatible with NE avcodec_get_pix_fmt().
ramiro
parents: 29545
diff changeset
142 || (x)==PIX_FMT_YUV444P16LE \
ff34398b14b1 Make 16bit YUV formats compatible with NE avcodec_get_pix_fmt().
ramiro
parents: 29545
diff changeset
143 || (x)==PIX_FMT_YUV420P16BE \
ff34398b14b1 Make 16bit YUV formats compatible with NE avcodec_get_pix_fmt().
ramiro
parents: 29545
diff changeset
144 || (x)==PIX_FMT_YUV422P16BE \
ff34398b14b1 Make 16bit YUV formats compatible with NE avcodec_get_pix_fmt().
ramiro
parents: 29545
diff changeset
145 || (x)==PIX_FMT_YUV444P16BE \
23278
b745a8414f2c cosmetics; one test per line for all isXXX(x) macros
ivo
parents: 23189
diff changeset
146 )
30194
bd9db1814611 Implement sws_isSupportedInput() and sws_isSupportedOutput().
stefano
parents: 30142
diff changeset
147
bd9db1814611 Implement sws_isSupportedInput() and sws_isSupportedOutput().
stefano
parents: 30142
diff changeset
148 int sws_isSupportedOutput(enum PixelFormat pix_fmt)
bd9db1814611 Implement sws_isSupportedInput() and sws_isSupportedOutput().
stefano
parents: 30142
diff changeset
149 {
bd9db1814611 Implement sws_isSupportedInput() and sws_isSupportedOutput().
stefano
parents: 30142
diff changeset
150 return isSupportedOut(pix_fmt);
bd9db1814611 Implement sws_isSupportedInput() and sws_isSupportedOutput().
stefano
parents: 30142
diff changeset
151 }
bd9db1814611 Implement sws_isSupportedInput() and sws_isSupportedOutput().
stefano
parents: 30142
diff changeset
152
28460
12c0dfccf149 Give better name to Inverse_Table_6_9
kostya
parents: 28457
diff changeset
153 extern const int32_t ff_yuv2rgb_coeffs[8][4];
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
154
26151
5884743208b6 change sws_format_name to return const char*, supress many warnings
bcoudurier
parents: 26150
diff changeset
155 const 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
156 {
29926
916134a82d74 Make sws_format_name() use av_pix_fmt_descriptors.
stefano
parents: 29890
diff changeset
157 if ((unsigned)format < PIX_FMT_NB && av_pix_fmt_descriptors[format].name)
916134a82d74 Make sws_format_name() use av_pix_fmt_descriptors.
stefano
parents: 29890
diff changeset
158 return av_pix_fmt_descriptors[format].name;
916134a82d74 Make sws_format_name() use av_pix_fmt_descriptors.
stefano
parents: 29890
diff changeset
159 else
29480
a4d8dee13834 Indent libswscale:
ramiro
parents: 29475
diff changeset
160 return "Unknown format";
19143
c4dac777b44c Use libavutil in libswscale, and allow it to be built out of the mplayer tree
lucabe
parents: 18861
diff changeset
161 }
c4dac777b44c Use libavutil in libswscale, and allow it to be built out of the mplayer tree
lucabe
parents: 18861
diff changeset
162
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
163 static double getSplineCoeff(double a, double b, double c, double d, double dist)
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
164 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
165 // printf("%f %f %f %f %f\n", a,b,c,d,dist);
29480
a4d8dee13834 Indent libswscale:
ramiro
parents: 29475
diff changeset
166 if (dist<=1.0) return ((d*dist + c)*dist + b)*dist +a;
a4d8dee13834 Indent libswscale:
ramiro
parents: 29475
diff changeset
167 else return getSplineCoeff( 0.0,
a4d8dee13834 Indent libswscale:
ramiro
parents: 29475
diff changeset
168 b+ 2.0*c + 3.0*d,
a4d8dee13834 Indent libswscale:
ramiro
parents: 29475
diff changeset
169 c + 3.0*d,
a4d8dee13834 Indent libswscale:
ramiro
parents: 29475
diff changeset
170 -b- 3.0*c - 6.0*d,
a4d8dee13834 Indent libswscale:
ramiro
parents: 29475
diff changeset
171 dist-1.0);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
172 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
173
30307
63ff519cc9f1 Remove inline from initFilter()
mru
parents: 30299
diff changeset
174 static int initFilter(int16_t **outFilter, int16_t **filterPos, int *outFilterSize, int xInc,
30308
b33880a47b41 Reindent
mru
parents: 30307
diff changeset
175 int srcW, int dstW, int filterAlign, int one, int flags,
b33880a47b41 Reindent
mru
parents: 30307
diff changeset
176 SwsVector *srcFilter, SwsVector *dstFilter, double param[2])
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
177 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
178 int i;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
179 int filterSize;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
180 int filter2Size;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
181 int minFilterSize;
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
182 int64_t *filter=NULL;
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
183 int64_t *filter2=NULL;
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
184 const int64_t fone= 1LL<<54;
27300
181f489ead9d fix memleak
michael
parents: 27299
diff changeset
185 int ret= -1;
28276
877336d3c598 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 28246
diff changeset
186 #if ARCH_X86
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
187 if (flags & SWS_CPU_CAPS_MMX)
27744
7b83cbade239 Convert asm keyword into __asm__.
flameeyes
parents: 27705
diff changeset
188 __asm__ volatile("emms\n\t"::: "memory"); //FIXME this should not be required but it IS (even for non-MMX versions)
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
189 #endif
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
190
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
191 // NOTE: the +1 is for the MMX scaler which reads over the end
29610
c35359578f8d Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents: 29609
diff changeset
192 FF_ALLOC_OR_GOTO(NULL, *filterPos, (dstW+1)*sizeof(int16_t), fail);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
193
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
194 if (FFABS(xInc - 0x10000) <10) { // unscaled
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
195 int i;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
196 filterSize= 1;
29610
c35359578f8d Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents: 29609
diff changeset
197 FF_ALLOCZ_OR_GOTO(NULL, filter, dstW*sizeof(*filter)*filterSize, fail);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
198
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
199 for (i=0; i<dstW; i++) {
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
200 filter[i*filterSize]= fone;
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
201 (*filterPos)[i]=i;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
202 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
203
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
204 } else if (flags&SWS_POINT) { // lame looking point sampling mode
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
205 int i;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
206 int xDstInSrc;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
207 filterSize= 1;
29610
c35359578f8d Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents: 29609
diff changeset
208 FF_ALLOC_OR_GOTO(NULL, filter, dstW*sizeof(*filter)*filterSize, fail);
23129
9528d1ebe68f cosmetics: Remove trailing whitespace.
diego
parents: 22976
diff changeset
209
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
210 xDstInSrc= xInc/2 - 0x8000;
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
211 for (i=0; i<dstW; i++) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
212 int xx= (xDstInSrc - ((filterSize-1)<<15) + (1<<15))>>16;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
213
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
214 (*filterPos)[i]= xx;
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
215 filter[i]= fone;
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
216 xDstInSrc+= xInc;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
217 }
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
218 } else if ((xInc <= (1<<16) && (flags&SWS_AREA)) || (flags&SWS_FAST_BILINEAR)) { // bilinear upscale
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
219 int i;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
220 int xDstInSrc;
29407
9ad97332be79 Remove useless code.
ramiro
parents: 29404
diff changeset
221 filterSize= 2;
29610
c35359578f8d Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents: 29609
diff changeset
222 FF_ALLOC_OR_GOTO(NULL, filter, dstW*sizeof(*filter)*filterSize, fail);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
223
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
224 xDstInSrc= xInc/2 - 0x8000;
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
225 for (i=0; i<dstW; i++) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
226 int xx= (xDstInSrc - ((filterSize-1)<<15) + (1<<15))>>16;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
227 int j;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
228
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
229 (*filterPos)[i]= xx;
29480
a4d8dee13834 Indent libswscale:
ramiro
parents: 29475
diff changeset
230 //bilinear upscale / linear interpolate / area averaging
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
231 for (j=0; j<filterSize; j++) {
29480
a4d8dee13834 Indent libswscale:
ramiro
parents: 29475
diff changeset
232 int64_t coeff= fone - FFABS((xx<<16) - xDstInSrc)*(fone>>16);
a4d8dee13834 Indent libswscale:
ramiro
parents: 29475
diff changeset
233 if (coeff<0) coeff=0;
a4d8dee13834 Indent libswscale:
ramiro
parents: 29475
diff changeset
234 filter[i*filterSize + j]= coeff;
a4d8dee13834 Indent libswscale:
ramiro
parents: 29475
diff changeset
235 xx++;
a4d8dee13834 Indent libswscale:
ramiro
parents: 29475
diff changeset
236 }
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
237 xDstInSrc+= xInc;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
238 }
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
239 } else {
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
240 int xDstInSrc;
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
241 int sizeFactor;
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
242
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
243 if (flags&SWS_BICUBIC) sizeFactor= 4;
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
244 else if (flags&SWS_X) sizeFactor= 8;
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
245 else if (flags&SWS_AREA) sizeFactor= 1; //downscale only, for upscale it is bilinear
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
246 else if (flags&SWS_GAUSS) sizeFactor= 8; // infinite ;)
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
247 else if (flags&SWS_LANCZOS) sizeFactor= param[0] != SWS_PARAM_DEFAULT ? ceil(2*param[0]) : 6;
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
248 else if (flags&SWS_SINC) sizeFactor= 20; // infinite ;)
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
249 else if (flags&SWS_SPLINE) sizeFactor= 20; // infinite ;)
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
250 else if (flags&SWS_BILINEAR) sizeFactor= 2;
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
251 else {
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
252 sizeFactor= 0; //GCC warning killer
27182
f7b6d1014b6b Remove ASSERT() macro. SoC Patch from Keiji Costantini
lu_zero
parents: 27181
diff changeset
253 assert(0);
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
254 }
23129
9528d1ebe68f cosmetics: Remove trailing whitespace.
diego
parents: 22976
diff changeset
255
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
256 if (xInc <= 1<<16) filterSize= 1 + sizeFactor; // upscale
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
257 else filterSize= 1 + (sizeFactor*srcW + dstW - 1)/ dstW;
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
258
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
259 if (filterSize > srcW-2) filterSize=srcW-2;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
260
29610
c35359578f8d Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents: 29609
diff changeset
261 FF_ALLOC_OR_GOTO(NULL, filter, dstW*sizeof(*filter)*filterSize, fail);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
262
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
263 xDstInSrc= xInc - 0x10000;
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
264 for (i=0; i<dstW; i++) {
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
265 int xx= (xDstInSrc - ((filterSize-2)<<16)) / (1<<17);
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
266 int j;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
267 (*filterPos)[i]= xx;
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
268 for (j=0; j<filterSize; j++) {
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
269 int64_t d= ((int64_t)FFABS((xx<<17) - xDstInSrc))<<13;
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
270 double floatd;
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
271 int64_t coeff;
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
272
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
273 if (xInc > 1<<16)
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
274 d= d*dstW/srcW;
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
275 floatd= d * (1.0/(1<<30));
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
276
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
277 if (flags & SWS_BICUBIC) {
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
278 int64_t B= (param[0] != SWS_PARAM_DEFAULT ? param[0] : 0) * (1<<24);
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
279 int64_t C= (param[1] != SWS_PARAM_DEFAULT ? param[1] : 0.6) * (1<<24);
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
280 int64_t dd = ( d*d)>>30;
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
281 int64_t ddd= (dd*d)>>30;
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
282
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
283 if (d < 1LL<<30)
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
284 coeff = (12*(1<<24)-9*B-6*C)*ddd + (-18*(1<<24)+12*B+6*C)*dd + (6*(1<<24)-2*B)*(1<<30);
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
285 else if (d < 1LL<<31)
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
286 coeff = (-B-6*C)*ddd + (6*B+30*C)*dd + (-12*B-48*C)*d + (8*B+24*C)*(1<<30);
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
287 else
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
288 coeff=0.0;
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
289 coeff *= fone>>(30+24);
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
290 }
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
291 /* else if (flags & SWS_X) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
292 double p= param ? param*0.01 : 0.3;
31128
100a50819c58 Remove PI definition and use M_PI instead.
stefano
parents: 30923
diff changeset
293 coeff = d ? sin(d*M_PI)/(d*M_PI) : 1.0;
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
294 coeff*= pow(2.0, - p*d*d);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
295 }*/
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
296 else if (flags & SWS_X) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
297 double A= param[0] != SWS_PARAM_DEFAULT ? param[0] : 1.0;
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
298 double c;
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
299
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
300 if (floatd<1.0)
30370
a8c94e9dc653 Don't redefine M_PI. It is already defined from libavutil/mathematics.h.
ramiro
parents: 30369
diff changeset
301 c = cos(floatd*M_PI);
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
302 else
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
303 c=-1.0;
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
304 if (c<0.0) c= -pow(-c, A);
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
305 else c= pow( c, A);
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
306 coeff= (c*0.5 + 0.5)*fone;
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
307 } else if (flags & SWS_AREA) {
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
308 int64_t d2= d - (1<<29);
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
309 if (d2*xInc < -(1LL<<(29+16))) coeff= 1.0 * (1LL<<(30+16));
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
310 else if (d2*xInc < (1LL<<(29+16))) coeff= -d2*xInc + (1LL<<(29+16));
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
311 else coeff=0.0;
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
312 coeff *= fone>>(30+16);
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
313 } else if (flags & SWS_GAUSS) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
314 double p= param[0] != SWS_PARAM_DEFAULT ? param[0] : 3.0;
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
315 coeff = (pow(2.0, - p*floatd*floatd))*fone;
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
316 } else if (flags & SWS_SINC) {
30370
a8c94e9dc653 Don't redefine M_PI. It is already defined from libavutil/mathematics.h.
ramiro
parents: 30369
diff changeset
317 coeff = (d ? sin(floatd*M_PI)/(floatd*M_PI) : 1.0)*fone;
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
318 } else if (flags & SWS_LANCZOS) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
319 double p= param[0] != SWS_PARAM_DEFAULT ? param[0] : 3.0;
30370
a8c94e9dc653 Don't redefine M_PI. It is already defined from libavutil/mathematics.h.
ramiro
parents: 30369
diff changeset
320 coeff = (d ? sin(floatd*M_PI)*sin(floatd*M_PI/p)/(floatd*floatd*M_PI*M_PI/p) : 1.0)*fone;
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
321 if (floatd>p) coeff=0;
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
322 } else if (flags & SWS_BILINEAR) {
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
323 coeff= (1<<30) - d;
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
324 if (coeff<0) coeff=0;
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
325 coeff *= fone >> 30;
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
326 } else if (flags & SWS_SPLINE) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
327 double p=-2.196152422706632;
27637
5abf906c09c8 Fix infinite loop with spline, bug was introduced in r27612 by me.
michael
parents: 27596
diff changeset
328 coeff = getSplineCoeff(1.0, 0.0, p, -p-1.0, floatd) * fone;
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
329 } else {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
330 coeff= 0.0; //GCC warning killer
27182
f7b6d1014b6b Remove ASSERT() macro. SoC Patch from Keiji Costantini
lu_zero
parents: 27181
diff changeset
331 assert(0);
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
332 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
333
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
334 filter[i*filterSize + j]= coeff;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
335 xx++;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
336 }
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
337 xDstInSrc+= 2*xInc;
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
338 }
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
339 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
340
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
341 /* apply src & dst Filter to filter -> filter2
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
342 av_free(filter);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
343 */
27182
f7b6d1014b6b Remove ASSERT() macro. SoC Patch from Keiji Costantini
lu_zero
parents: 27181
diff changeset
344 assert(filterSize>0);
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
345 filter2Size= filterSize;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
346 if (srcFilter) filter2Size+= srcFilter->length - 1;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
347 if (dstFilter) filter2Size+= dstFilter->length - 1;
27182
f7b6d1014b6b Remove ASSERT() macro. SoC Patch from Keiji Costantini
lu_zero
parents: 27181
diff changeset
348 assert(filter2Size>0);
29610
c35359578f8d Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents: 29609
diff changeset
349 FF_ALLOCZ_OR_GOTO(NULL, filter2, filter2Size*dstW*sizeof(*filter2), fail);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
350
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
351 for (i=0; i<dstW; i++) {
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
352 int j, k;
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
353
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
354 if(srcFilter) {
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
355 for (k=0; k<srcFilter->length; k++) {
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
356 for (j=0; j<filterSize; j++)
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
357 filter2[i*filter2Size + k + j] += srcFilter->coeff[k]*filter[i*filterSize + j];
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
358 }
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
359 } else {
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
360 for (j=0; j<filterSize; j++)
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
361 filter2[i*filter2Size + j]= filter[i*filterSize + j];
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
362 }
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
363 //FIXME dstFilter
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
364
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
365 (*filterPos)[i]+= (filterSize-1)/2 - (filter2Size-1)/2;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
366 }
27299
4e57d47ee5db Cleanup, use av_freep() instead of av_free(x); x=NULL
michael
parents: 27286
diff changeset
367 av_freep(&filter);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
368
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
369 /* try to reduce the filter-size (step1 find size and shift left) */
23536
ab4c0bba8f22 misc spelling fixes
diego
parents: 23400
diff changeset
370 // Assume it is near normalized (*0.5 or *2.0 is OK but * 0.001 is not).
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
371 minFilterSize= 0;
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
372 for (i=dstW-1; i>=0; i--) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
373 int min= filter2Size;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
374 int j;
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
375 int64_t cutOff=0.0;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
376
30296
826441351ad5 Fix typo, "get rid off" -> "get rid of".
stefano
parents: 30292
diff changeset
377 /* get rid of near zero elements on the left by shifting left */
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
378 for (j=0; j<filter2Size; j++) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
379 int k;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
380 cutOff += FFABS(filter2[i*filter2Size]);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
381
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
382 if (cutOff > SWS_MAX_REDUCE_CUTOFF*fone) break;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
383
23536
ab4c0bba8f22 misc spelling fixes
diego
parents: 23400
diff changeset
384 /* preserve monotonicity because the core can't handle the filter otherwise */
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
385 if (i<dstW-1 && (*filterPos)[i] >= (*filterPos)[i+1]) break;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
386
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
387 // move filter coefficients left
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
388 for (k=1; k<filter2Size; k++)
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
389 filter2[i*filter2Size + k - 1]= filter2[i*filter2Size + k];
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
390 filter2[i*filter2Size + k - 1]= 0;
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
391 (*filterPos)[i]++;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
392 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
393
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
394 cutOff=0;
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
395 /* count near zeros on the right */
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
396 for (j=filter2Size-1; j>0; j--) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
397 cutOff += FFABS(filter2[i*filter2Size + j]);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
398
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
399 if (cutOff > SWS_MAX_REDUCE_CUTOFF*fone) break;
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
400 min--;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
401 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
402
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
403 if (min>minFilterSize) minFilterSize= min;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
404 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
405
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
406 if (flags & SWS_CPU_CAPS_ALTIVEC) {
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
407 // we can handle the special case 4,
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
408 // so we don't want to go to the full 8
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
409 if (minFilterSize < 5)
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
410 filterAlign = 4;
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
411
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
412 // We really don't want to waste our time
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
413 // doing useless computation, so fall back on
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
414 // the scalar C code for very small filters.
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
415 // Vectorizing is worth it only if you have a
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
416 // decent-sized vector.
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
417 if (minFilterSize < 3)
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
418 filterAlign = 1;
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
419 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
420
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
421 if (flags & SWS_CPU_CAPS_MMX) {
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
422 // special case for unscaled vertical filtering
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
423 if (minFilterSize == 1 && filterAlign == 2)
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
424 filterAlign= 1;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
425 }
19172
bae6c99a99cc vertical scaler with accurate rounding, some people on doom9 can see +-1 errors
michael
parents: 19169
diff changeset
426
27182
f7b6d1014b6b Remove ASSERT() macro. SoC Patch from Keiji Costantini
lu_zero
parents: 27181
diff changeset
427 assert(minFilterSize > 0);
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
428 filterSize= (minFilterSize +(filterAlign-1)) & (~(filterAlign-1));
27182
f7b6d1014b6b Remove ASSERT() macro. SoC Patch from Keiji Costantini
lu_zero
parents: 27181
diff changeset
429 assert(filterSize > 0);
27579
cd952ef4ad31 Avoid some explicit types in sizeof().
michael
parents: 27578
diff changeset
430 filter= av_malloc(filterSize*dstW*sizeof(*filter));
27513
2550d0c5bcb6 Fix accurate rounding mode on x86_64.
michael
parents: 27511
diff changeset
431 if (filterSize >= MAX_FILTER_SIZE*16/((flags&SWS_ACCURATE_RND) ? APCK_SIZE : 16) || !filter)
29542
3e7ffd70b12b swscale: Check for return values of malloc.
ramiro
parents: 29540
diff changeset
432 goto fail;
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
433 *outFilterSize= filterSize;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
434
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
435 if (flags&SWS_PRINT_INFO)
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
436 av_log(NULL, AV_LOG_VERBOSE, "SwScaler: reducing / aligning filtersize %d -> %d\n", filter2Size, filterSize);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
437 /* try to reduce the filter-size (step2 reduce it) */
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
438 for (i=0; i<dstW; i++) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
439 int j;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
440
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
441 for (j=0; j<filterSize; j++) {
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
442 if (j>=filter2Size) filter[i*filterSize + j]= 0;
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
443 else filter[i*filterSize + j]= filter2[i*filter2Size + j];
27563
39c8d234b98e Ensure that additional filter coeffs that exist due to alignment
michael
parents: 27562
diff changeset
444 if((flags & SWS_BITEXACT) && j>=minFilterSize)
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
445 filter[i*filterSize + j]= 0;
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
446 }
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
447 }
23129
9528d1ebe68f cosmetics: Remove trailing whitespace.
diego
parents: 22976
diff changeset
448
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
449 //FIXME try to align filterPos if possible
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
450
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
451 //fix borders
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
452 for (i=0; i<dstW; i++) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
453 int j;
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
454 if ((*filterPos)[i] < 0) {
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
455 // move filter coefficients left to compensate for filterPos
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
456 for (j=1; j<filterSize; j++) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
457 int left= FFMAX(j + (*filterPos)[i], 0);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
458 filter[i*filterSize + left] += filter[i*filterSize + j];
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
459 filter[i*filterSize + j]=0;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
460 }
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
461 (*filterPos)[i]= 0;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
462 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
463
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
464 if ((*filterPos)[i] + filterSize > srcW) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
465 int shift= (*filterPos)[i] + filterSize - srcW;
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
466 // move filter coefficients right to compensate for filterPos
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
467 for (j=filterSize-2; j>=0; j--) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
468 int right= FFMIN(j + shift, filterSize-1);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
469 filter[i*filterSize +right] += filter[i*filterSize +j];
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
470 filter[i*filterSize +j]=0;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
471 }
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
472 (*filterPos)[i]= srcW - filterSize;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
473 }
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
474 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
475
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
476 // Note the +1 is for the MMX scaler which reads over the end
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
477 /* align at 16 for AltiVec (needed by hScale_altivec_real) */
29610
c35359578f8d Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents: 29609
diff changeset
478 FF_ALLOCZ_OR_GOTO(NULL, *outFilter, *outFilterSize*(dstW+1)*sizeof(int16_t), fail);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
479
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
480 /* normalize & store in outFilter */
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
481 for (i=0; i<dstW; i++) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
482 int j;
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
483 int64_t error=0;
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
484 int64_t sum=0;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
485
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
486 for (j=0; j<filterSize; j++) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
487 sum+= filter[i*filterSize + j];
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
488 }
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
489 sum= (sum + one/2)/ one;
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
490 for (j=0; j<*outFilterSize; j++) {
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
491 int64_t v= filter[i*filterSize + j] + error;
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
492 int intV= ROUNDED_DIV(v, sum);
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
493 (*outFilter)[i*(*outFilterSize) + j]= intV;
27580
9ff7a64a51fa Avoid using floating point for calculating filter coefficients.
michael
parents: 27579
diff changeset
494 error= v - intV*sum;
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
495 }
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
496 }
23129
9528d1ebe68f cosmetics: Remove trailing whitespace.
diego
parents: 22976
diff changeset
497
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
498 (*filterPos)[dstW]= (*filterPos)[dstW-1]; // the MMX scaler will read over the end
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
499 for (i=0; i<*outFilterSize; i++) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
500 int j= dstW*(*outFilterSize);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
501 (*outFilter)[j + i]= (*outFilter)[j + i - (*outFilterSize)];
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
502 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
503
27300
181f489ead9d fix memleak
michael
parents: 27299
diff changeset
504 ret=0;
29542
3e7ffd70b12b swscale: Check for return values of malloc.
ramiro
parents: 29540
diff changeset
505 fail:
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
506 av_free(filter);
27300
181f489ead9d fix memleak
michael
parents: 27299
diff changeset
507 av_free(filter2);
181f489ead9d fix memleak
michael
parents: 27299
diff changeset
508 return ret;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
509 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
510
30923
0be6ed163321 libswscale: Relicense almost all x86 assembler optimizations as LGPL.
diego
parents: 30912
diff changeset
511 #if ARCH_X86 && (HAVE_MMX2 || CONFIG_RUNTIME_CPUDETECT)
29468
947a942221c4 MMX2 horizontal scaler: Determine code size at runtime.
ramiro
parents: 29467
diff changeset
512 static int initMMX2HScaler(int dstW, int xInc, uint8_t *filterCode, int16_t *filter, int32_t *filterPos, int numSplits)
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
513 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
514 uint8_t *fragmentA;
28957
e538af2c69c1 Do not assume long is same width as x86 register.
ramiro
parents: 28953
diff changeset
515 x86_reg imm8OfPShufW1A;
e538af2c69c1 Do not assume long is same width as x86 register.
ramiro
parents: 28953
diff changeset
516 x86_reg imm8OfPShufW2A;
e538af2c69c1 Do not assume long is same width as x86 register.
ramiro
parents: 28953
diff changeset
517 x86_reg fragmentLengthA;
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
518 uint8_t *fragmentB;
28957
e538af2c69c1 Do not assume long is same width as x86 register.
ramiro
parents: 28953
diff changeset
519 x86_reg imm8OfPShufW1B;
e538af2c69c1 Do not assume long is same width as x86 register.
ramiro
parents: 28953
diff changeset
520 x86_reg imm8OfPShufW2B;
e538af2c69c1 Do not assume long is same width as x86 register.
ramiro
parents: 28953
diff changeset
521 x86_reg fragmentLengthB;
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
522 int fragmentPos;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
523
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
524 int xpos, i;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
525
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
526 // create an optimized horizontal scaling routine
29936
f43f03c00402 Document the differences between the two asm fragments in initMMX2HScaler().
ramiro
parents: 29932
diff changeset
527 /* This scaler is made of runtime-generated MMX2 code using specially
f43f03c00402 Document the differences between the two asm fragments in initMMX2HScaler().
ramiro
parents: 29932
diff changeset
528 * tuned pshufw instructions. For every four output pixels, if four
f43f03c00402 Document the differences between the two asm fragments in initMMX2HScaler().
ramiro
parents: 29932
diff changeset
529 * input pixels are enough for the fast bilinear scaling, then a chunk
f43f03c00402 Document the differences between the two asm fragments in initMMX2HScaler().
ramiro
parents: 29932
diff changeset
530 * of fragmentB is used. If five input pixels are needed, then a chunk
f43f03c00402 Document the differences between the two asm fragments in initMMX2HScaler().
ramiro
parents: 29932
diff changeset
531 * of fragmentA is used.
f43f03c00402 Document the differences between the two asm fragments in initMMX2HScaler().
ramiro
parents: 29932
diff changeset
532 */
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
533
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
534 //code fragment
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
535
27744
7b83cbade239 Convert asm keyword into __asm__.
flameeyes
parents: 27705
diff changeset
536 __asm__ volatile(
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
537 "jmp 9f \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
538 // Begin
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
539 "0: \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
540 "movq (%%"REG_d", %%"REG_a"), %%mm3 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
541 "movd (%%"REG_c", %%"REG_S"), %%mm0 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
542 "movd 1(%%"REG_c", %%"REG_S"), %%mm1 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
543 "punpcklbw %%mm7, %%mm1 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
544 "punpcklbw %%mm7, %%mm0 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
545 "pshufw $0xFF, %%mm1, %%mm1 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
546 "1: \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
547 "pshufw $0xFF, %%mm0, %%mm0 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
548 "2: \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
549 "psubw %%mm1, %%mm0 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
550 "movl 8(%%"REG_b", %%"REG_a"), %%esi \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
551 "pmullw %%mm3, %%mm0 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
552 "psllw $7, %%mm1 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
553 "paddw %%mm1, %%mm0 \n\t"
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
554
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
555 "movq %%mm0, (%%"REG_D", %%"REG_a") \n\t"
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
556
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
557 "add $8, %%"REG_a" \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
558 // End
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
559 "9: \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
560 // "int $3 \n\t"
26238
726b915c2b45 Fix 64 bit shared library compilation with MMX2 by properly using PIC mangling.
diego
parents: 26232
diff changeset
561 "lea " LOCAL_MANGLE(0b) ", %0 \n\t"
726b915c2b45 Fix 64 bit shared library compilation with MMX2 by properly using PIC mangling.
diego
parents: 26232
diff changeset
562 "lea " LOCAL_MANGLE(1b) ", %1 \n\t"
726b915c2b45 Fix 64 bit shared library compilation with MMX2 by properly using PIC mangling.
diego
parents: 26232
diff changeset
563 "lea " LOCAL_MANGLE(2b) ", %2 \n\t"
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
564 "dec %1 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
565 "dec %2 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
566 "sub %0, %1 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
567 "sub %0, %2 \n\t"
26238
726b915c2b45 Fix 64 bit shared library compilation with MMX2 by properly using PIC mangling.
diego
parents: 26232
diff changeset
568 "lea " LOCAL_MANGLE(9b) ", %3 \n\t"
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
569 "sub %0, %3 \n\t"
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
570
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
571
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
572 :"=r" (fragmentA), "=r" (imm8OfPShufW1A), "=r" (imm8OfPShufW2A),
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
573 "=r" (fragmentLengthA)
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
574 );
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
575
27744
7b83cbade239 Convert asm keyword into __asm__.
flameeyes
parents: 27705
diff changeset
576 __asm__ volatile(
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
577 "jmp 9f \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
578 // Begin
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
579 "0: \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
580 "movq (%%"REG_d", %%"REG_a"), %%mm3 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
581 "movd (%%"REG_c", %%"REG_S"), %%mm0 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
582 "punpcklbw %%mm7, %%mm0 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
583 "pshufw $0xFF, %%mm0, %%mm1 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
584 "1: \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
585 "pshufw $0xFF, %%mm0, %%mm0 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
586 "2: \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
587 "psubw %%mm1, %%mm0 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
588 "movl 8(%%"REG_b", %%"REG_a"), %%esi \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
589 "pmullw %%mm3, %%mm0 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
590 "psllw $7, %%mm1 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
591 "paddw %%mm1, %%mm0 \n\t"
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
592
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
593 "movq %%mm0, (%%"REG_D", %%"REG_a") \n\t"
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
594
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
595 "add $8, %%"REG_a" \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
596 // End
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
597 "9: \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
598 // "int $3 \n\t"
26238
726b915c2b45 Fix 64 bit shared library compilation with MMX2 by properly using PIC mangling.
diego
parents: 26232
diff changeset
599 "lea " LOCAL_MANGLE(0b) ", %0 \n\t"
726b915c2b45 Fix 64 bit shared library compilation with MMX2 by properly using PIC mangling.
diego
parents: 26232
diff changeset
600 "lea " LOCAL_MANGLE(1b) ", %1 \n\t"
726b915c2b45 Fix 64 bit shared library compilation with MMX2 by properly using PIC mangling.
diego
parents: 26232
diff changeset
601 "lea " LOCAL_MANGLE(2b) ", %2 \n\t"
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
602 "dec %1 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
603 "dec %2 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
604 "sub %0, %1 \n\t"
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
605 "sub %0, %2 \n\t"
26238
726b915c2b45 Fix 64 bit shared library compilation with MMX2 by properly using PIC mangling.
diego
parents: 26232
diff changeset
606 "lea " LOCAL_MANGLE(9b) ", %3 \n\t"
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
607 "sub %0, %3 \n\t"
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
608
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
609
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
610 :"=r" (fragmentB), "=r" (imm8OfPShufW1B), "=r" (imm8OfPShufW2B),
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
611 "=r" (fragmentLengthB)
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
612 );
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
613
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
614 xpos= 0; //lumXInc/2 - 0x8000; // difference between pixel centers
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
615 fragmentPos=0;
23129
9528d1ebe68f cosmetics: Remove trailing whitespace.
diego
parents: 22976
diff changeset
616
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
617 for (i=0; i<dstW/numSplits; i++) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
618 int xx=xpos>>16;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
619
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
620 if ((i&3) == 0) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
621 int a=0;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
622 int b=((xpos+xInc)>>16) - xx;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
623 int c=((xpos+xInc*2)>>16) - xx;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
624 int d=((xpos+xInc*3)>>16) - xx;
29410
fd9b0bd6c908 MMX2 scaler: add variable to ease factorization of initMMX2Scaler().
ramiro
parents: 29407
diff changeset
625 int inc = (d+1<4);
29411
0192dbbb3121 MMX2 scaler: factorize initMMX2Scaler().
ramiro
parents: 29410
diff changeset
626 uint8_t *fragment = (d+1<4) ? fragmentB : fragmentA;
0192dbbb3121 MMX2 scaler: factorize initMMX2Scaler().
ramiro
parents: 29410
diff changeset
627 x86_reg imm8OfPShufW1 = (d+1<4) ? imm8OfPShufW1B : imm8OfPShufW1A;
0192dbbb3121 MMX2 scaler: factorize initMMX2Scaler().
ramiro
parents: 29410
diff changeset
628 x86_reg imm8OfPShufW2 = (d+1<4) ? imm8OfPShufW2B : imm8OfPShufW2A;
0192dbbb3121 MMX2 scaler: factorize initMMX2Scaler().
ramiro
parents: 29410
diff changeset
629 x86_reg fragmentLength = (d+1<4) ? fragmentLengthB : fragmentLengthA;
29412
139af822b6ce MMX2 scaler: Remove {} block leftover from factorization in initMMX2Scaler().
ramiro
parents: 29411
diff changeset
630 int maxShift= 3-(d+inc);
139af822b6ce MMX2 scaler: Remove {} block leftover from factorization in initMMX2Scaler().
ramiro
parents: 29411
diff changeset
631 int shift=0;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
632
29468
947a942221c4 MMX2 horizontal scaler: Determine code size at runtime.
ramiro
parents: 29467
diff changeset
633 if (filterCode) {
29470
6b8f383679ea Indent.
ramiro
parents: 29468
diff changeset
634 filter[i ] = (( xpos & 0xFFFF) ^ 0xFFFF)>>9;
6b8f383679ea Indent.
ramiro
parents: 29468
diff changeset
635 filter[i+1] = (((xpos+xInc ) & 0xFFFF) ^ 0xFFFF)>>9;
6b8f383679ea Indent.
ramiro
parents: 29468
diff changeset
636 filter[i+2] = (((xpos+xInc*2) & 0xFFFF) ^ 0xFFFF)>>9;
6b8f383679ea Indent.
ramiro
parents: 29468
diff changeset
637 filter[i+3] = (((xpos+xInc*3) & 0xFFFF) ^ 0xFFFF)>>9;
6b8f383679ea Indent.
ramiro
parents: 29468
diff changeset
638 filterPos[i/2]= xx;
6b8f383679ea Indent.
ramiro
parents: 29468
diff changeset
639
6b8f383679ea Indent.
ramiro
parents: 29468
diff changeset
640 memcpy(filterCode + fragmentPos, fragment, fragmentLength);
6b8f383679ea Indent.
ramiro
parents: 29468
diff changeset
641
6b8f383679ea Indent.
ramiro
parents: 29468
diff changeset
642 filterCode[fragmentPos + imm8OfPShufW1]=
6b8f383679ea Indent.
ramiro
parents: 29468
diff changeset
643 (a+inc) | ((b+inc)<<2) | ((c+inc)<<4) | ((d+inc)<<6);
6b8f383679ea Indent.
ramiro
parents: 29468
diff changeset
644 filterCode[fragmentPos + imm8OfPShufW2]=
6b8f383679ea Indent.
ramiro
parents: 29468
diff changeset
645 a | (b<<2) | (c<<4) | (d<<6);
6b8f383679ea Indent.
ramiro
parents: 29468
diff changeset
646
6b8f383679ea Indent.
ramiro
parents: 29468
diff changeset
647 if (i+4-inc>=dstW) shift=maxShift; //avoid overread
6b8f383679ea Indent.
ramiro
parents: 29468
diff changeset
648 else if ((filterPos[i/2]&3) <= maxShift) shift=filterPos[i/2]&3; //Align
6b8f383679ea Indent.
ramiro
parents: 29468
diff changeset
649
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
650 if (shift && i>=shift) {
29470
6b8f383679ea Indent.
ramiro
parents: 29468
diff changeset
651 filterCode[fragmentPos + imm8OfPShufW1]+= 0x55*shift;
6b8f383679ea Indent.
ramiro
parents: 29468
diff changeset
652 filterCode[fragmentPos + imm8OfPShufW2]+= 0x55*shift;
6b8f383679ea Indent.
ramiro
parents: 29468
diff changeset
653 filterPos[i/2]-=shift;
6b8f383679ea Indent.
ramiro
parents: 29468
diff changeset
654 }
29468
947a942221c4 MMX2 horizontal scaler: Determine code size at runtime.
ramiro
parents: 29467
diff changeset
655 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
656
29412
139af822b6ce MMX2 scaler: Remove {} block leftover from factorization in initMMX2Scaler().
ramiro
parents: 29411
diff changeset
657 fragmentPos+= fragmentLength;
139af822b6ce MMX2 scaler: Remove {} block leftover from factorization in initMMX2Scaler().
ramiro
parents: 29411
diff changeset
658
29468
947a942221c4 MMX2 horizontal scaler: Determine code size at runtime.
ramiro
parents: 29467
diff changeset
659 if (filterCode)
29470
6b8f383679ea Indent.
ramiro
parents: 29468
diff changeset
660 filterCode[fragmentPos]= RET;
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
661 }
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
662 xpos+=xInc;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
663 }
29468
947a942221c4 MMX2 horizontal scaler: Determine code size at runtime.
ramiro
parents: 29467
diff changeset
664 if (filterCode)
29470
6b8f383679ea Indent.
ramiro
parents: 29468
diff changeset
665 filterPos[((i/2)+1)&(~1)]= xpos>>16; // needed to jump to the next part
29468
947a942221c4 MMX2 horizontal scaler: Determine code size at runtime.
ramiro
parents: 29467
diff changeset
666
947a942221c4 MMX2 horizontal scaler: Determine code size at runtime.
ramiro
parents: 29467
diff changeset
667 return fragmentPos + 1;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
668 }
30923
0be6ed163321 libswscale: Relicense almost all x86 assembler optimizations as LGPL.
diego
parents: 30912
diff changeset
669 #endif /* ARCH_X86 && (HAVE_MMX2 || CONFIG_RUNTIME_CPUDETECT) */
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
670
30142
bd5ab02f84f8 Prefer enum PixelFormat over int for the type of the format parameter
stefano
parents: 30138
diff changeset
671 static void getSubSampleFactors(int *h, int *v, enum PixelFormat format)
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
672 {
30129
a8283bcc8d2e Simplify getSubSampleFactors(), make it use the values provided by
stefano
parents: 30045
diff changeset
673 *h = av_pix_fmt_descriptors[format].log2_chroma_w;
a8283bcc8d2e Simplify getSubSampleFactors(), make it use the values provided by
stefano
parents: 30045
diff changeset
674 *v = av_pix_fmt_descriptors[format].log2_chroma_h;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
675 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
676
32282
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
677 static int update_flags_cpu(int flags);
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
678
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
679 int sws_setColorspaceDetails(SwsContext *c, const int inv_table[4], int srcRange, const int table[4], int dstRange, int brightness, int contrast, int saturation)
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
680 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
681 memcpy(c->srcColorspaceTable, inv_table, sizeof(int)*4);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
682 memcpy(c->dstColorspaceTable, table, sizeof(int)*4);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
683
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
684 c->brightness= brightness;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
685 c->contrast = contrast;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
686 c->saturation= saturation;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
687 c->srcRange = srcRange;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
688 c->dstRange = dstRange;
29146
d6d87abb137f Make sws_setColorspaceDetails() return -1 if the destination format is
stefano
parents: 29145
diff changeset
689 if (isYUV(c->dstFormat) || isGray(c->dstFormat)) return -1;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
690
32282
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
691 c->dstFormatBpp = av_get_bits_per_pixel(&av_pix_fmt_descriptors[c->dstFormat]);
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
692 c->srcFormatBpp = av_get_bits_per_pixel(&av_pix_fmt_descriptors[c->srcFormat]);
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
693 c->flags = update_flags_cpu(c->flags);
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
694
28953
1e56ea9937ce Consistently use ff_ prefixes for internal symbols.
diego
parents: 28951
diff changeset
695 ff_yuv2rgb_c_init_tables(c, inv_table, srcRange, brightness, contrast, saturation);
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
696 //FIXME factorize
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
697
30912
f91ad62a2281 AltiVec implies a PPC CPU, so there is no need to check for both.
diego
parents: 30910
diff changeset
698 #if HAVE_ALTIVEC
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
699 if (c->flags & SWS_CPU_CAPS_ALTIVEC)
28953
1e56ea9937ce Consistently use ff_ prefixes for internal symbols.
diego
parents: 28951
diff changeset
700 ff_yuv2rgb_init_tables_altivec(c, inv_table, brightness, contrast, saturation);
23129
9528d1ebe68f cosmetics: Remove trailing whitespace.
diego
parents: 22976
diff changeset
701 #endif
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
702 return 0;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
703 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
704
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
705 int sws_getColorspaceDetails(SwsContext *c, int **inv_table, int *srcRange, int **table, int *dstRange, int *brightness, int *contrast, int *saturation)
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
706 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
707 if (isYUV(c->dstFormat) || isGray(c->dstFormat)) return -1;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
708
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
709 *inv_table = c->srcColorspaceTable;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
710 *table = c->dstColorspaceTable;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
711 *srcRange = c->srcRange;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
712 *dstRange = c->dstRange;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
713 *brightness= c->brightness;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
714 *contrast = c->contrast;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
715 *saturation= c->saturation;
23129
9528d1ebe68f cosmetics: Remove trailing whitespace.
diego
parents: 22976
diff changeset
716
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
717 return 0;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
718 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
719
27696
0c2dc440984b Change one more variable type from int to enum PixelFormat.
aurel
parents: 27695
diff changeset
720 static int handle_jpeg(enum PixelFormat *format)
19987
f00912e9480b Add support for YUVJ formats
lucabe
parents: 19872
diff changeset
721 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
722 switch (*format) {
31129
8639a950e856 Cosmetics: make more compact the code for handle_jpeg(), this also allows
stefano
parents: 31128
diff changeset
723 case PIX_FMT_YUVJ420P: *format = PIX_FMT_YUV420P; return 1;
8639a950e856 Cosmetics: make more compact the code for handle_jpeg(), this also allows
stefano
parents: 31128
diff changeset
724 case PIX_FMT_YUVJ422P: *format = PIX_FMT_YUV422P; return 1;
8639a950e856 Cosmetics: make more compact the code for handle_jpeg(), this also allows
stefano
parents: 31128
diff changeset
725 case PIX_FMT_YUVJ444P: *format = PIX_FMT_YUV444P; return 1;
8639a950e856 Cosmetics: make more compact the code for handle_jpeg(), this also allows
stefano
parents: 31128
diff changeset
726 case PIX_FMT_YUVJ440P: *format = PIX_FMT_YUV440P; return 1;
8639a950e856 Cosmetics: make more compact the code for handle_jpeg(), this also allows
stefano
parents: 31128
diff changeset
727 default: return 0;
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
728 }
19987
f00912e9480b Add support for YUVJ formats
lucabe
parents: 19872
diff changeset
729 }
f00912e9480b Add support for YUVJ formats
lucabe
parents: 19872
diff changeset
730
31968
5c9310a4d2e9 swscale: also update flags on sws_getCachedContext()
ramiro
parents: 31903
diff changeset
731 static int update_flags_cpu(int flags)
5c9310a4d2e9 swscale: also update flags on sws_getCachedContext()
ramiro
parents: 31903
diff changeset
732 {
5c9310a4d2e9 swscale: also update flags on sws_getCachedContext()
ramiro
parents: 31903
diff changeset
733 #if !CONFIG_RUNTIME_CPUDETECT //ensure that the flags match the compiled variant if cpudetect is off
32306
5984fef34b14 cosmetics: break long line update_flags_cpu
janne
parents: 32282
diff changeset
734 flags &= ~( SWS_CPU_CAPS_MMX
5984fef34b14 cosmetics: break long line update_flags_cpu
janne
parents: 32282
diff changeset
735 |SWS_CPU_CAPS_MMX2
5984fef34b14 cosmetics: break long line update_flags_cpu
janne
parents: 32282
diff changeset
736 |SWS_CPU_CAPS_3DNOW
32307
7ba2369d71f7 swscale: clear SWS_CPU_CAPS_SSE2 in update_flags_cpu() missed in r32068
janne
parents: 32306
diff changeset
737 |SWS_CPU_CAPS_SSE2
32306
5984fef34b14 cosmetics: break long line update_flags_cpu
janne
parents: 32282
diff changeset
738 |SWS_CPU_CAPS_ALTIVEC
5984fef34b14 cosmetics: break long line update_flags_cpu
janne
parents: 32282
diff changeset
739 |SWS_CPU_CAPS_BFIN);
31968
5c9310a4d2e9 swscale: also update flags on sws_getCachedContext()
ramiro
parents: 31903
diff changeset
740 flags |= ff_hardcodedcpuflags();
5c9310a4d2e9 swscale: also update flags on sws_getCachedContext()
ramiro
parents: 31903
diff changeset
741 #endif /* CONFIG_RUNTIME_CPUDETECT */
5c9310a4d2e9 swscale: also update flags on sws_getCachedContext()
ramiro
parents: 31903
diff changeset
742 return flags;
5c9310a4d2e9 swscale: also update flags on sws_getCachedContext()
ramiro
parents: 31903
diff changeset
743 }
5c9310a4d2e9 swscale: also update flags on sws_getCachedContext()
ramiro
parents: 31903
diff changeset
744
32316
6f41498718cd Cosmetics: fix braces placement.
stefano
parents: 32315
diff changeset
745 SwsContext *sws_alloc_context(void)
6f41498718cd Cosmetics: fix braces placement.
stefano
parents: 32315
diff changeset
746 {
32282
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
747 SwsContext *c= av_mallocz(sizeof(SwsContext));
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
748
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
749 c->av_class = &sws_context_class;
32329
597a570963fa Set default values for the scale context in sws_alloc_context().
stefano
parents: 32319
diff changeset
750 av_opt_set_defaults(c);
32282
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
751
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
752 return c;
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
753 }
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
754
32316
6f41498718cd Cosmetics: fix braces placement.
stefano
parents: 32315
diff changeset
755 int sws_init_context(SwsContext *c, SwsFilter *srcFilter, SwsFilter *dstFilter)
6f41498718cd Cosmetics: fix braces placement.
stefano
parents: 32315
diff changeset
756 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
757 int i;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
758 int usesVFilter, usesHFilter;
30369
8c479cb29c7a Split swscale.c into scaler code (swscale.c) and utility code (utils.c).
ramiro
parents: 30343
diff changeset
759 int unscaled;
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
760 SwsFilter dummyFilter= {NULL, NULL, NULL, NULL};
32282
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
761 int srcW= c->srcW;
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
762 int srcH= c->srcH;
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
763 int dstW= c->dstW;
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
764 int dstH= c->dstH;
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
765 int flags;
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
766 enum PixelFormat srcFormat= c->srcFormat;
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
767 enum PixelFormat dstFormat= c->dstFormat;
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
768
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
769 flags= c->flags = update_flags_cpu(c->flags);
28276
877336d3c598 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 28246
diff changeset
770 #if ARCH_X86
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
771 if (flags & SWS_CPU_CAPS_MMX)
27744
7b83cbade239 Convert asm keyword into __asm__.
flameeyes
parents: 27705
diff changeset
772 __asm__ volatile("emms\n\t"::: "memory");
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
773 #endif
25752
559b0e9d47fb Change (a == NULL) condition to (!a) and (a != NULL) condition to (a).
benoit
parents: 25750
diff changeset
774 if (!rgb15to16) sws_rgb2rgb_init(flags);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
775
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
776 unscaled = (srcW == dstW && srcH == dstH);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
777
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
778 if (!isSupportedIn(srcFormat)) {
25967
87331ea89425 More explicit unsupported pixel format error messages.
benoit
parents: 25935
diff changeset
779 av_log(NULL, AV_LOG_ERROR, "swScaler: %s is not supported as input pixel format\n", sws_format_name(srcFormat));
32282
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
780 return AVERROR(EINVAL);
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
781 }
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
782 if (!isSupportedOut(dstFormat)) {
25967
87331ea89425 More explicit unsupported pixel format error messages.
benoit
parents: 25935
diff changeset
783 av_log(NULL, AV_LOG_ERROR, "swScaler: %s is not supported as output pixel format\n", sws_format_name(dstFormat));
32282
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
784 return AVERROR(EINVAL);
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
785 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
786
27285
99a489828840 Ensure that exactly one scaler algo is used.
michael
parents: 27212
diff changeset
787 i= flags & ( SWS_POINT
99a489828840 Ensure that exactly one scaler algo is used.
michael
parents: 27212
diff changeset
788 |SWS_AREA
27286
26d7759b977d 10l forgot SWS_BILINEAR
michael
parents: 27285
diff changeset
789 |SWS_BILINEAR
27285
99a489828840 Ensure that exactly one scaler algo is used.
michael
parents: 27212
diff changeset
790 |SWS_FAST_BILINEAR
99a489828840 Ensure that exactly one scaler algo is used.
michael
parents: 27212
diff changeset
791 |SWS_BICUBIC
99a489828840 Ensure that exactly one scaler algo is used.
michael
parents: 27212
diff changeset
792 |SWS_X
99a489828840 Ensure that exactly one scaler algo is used.
michael
parents: 27212
diff changeset
793 |SWS_GAUSS
99a489828840 Ensure that exactly one scaler algo is used.
michael
parents: 27212
diff changeset
794 |SWS_LANCZOS
99a489828840 Ensure that exactly one scaler algo is used.
michael
parents: 27212
diff changeset
795 |SWS_SINC
99a489828840 Ensure that exactly one scaler algo is used.
michael
parents: 27212
diff changeset
796 |SWS_SPLINE
99a489828840 Ensure that exactly one scaler algo is used.
michael
parents: 27212
diff changeset
797 |SWS_BICUBLIN);
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
798 if(!i || (i & (i-1))) {
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
799 av_log(NULL, AV_LOG_ERROR, "swScaler: Exactly one scaler algorithm must be chosen\n");
32282
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
800 return AVERROR(EINVAL);
27285
99a489828840 Ensure that exactly one scaler algo is used.
michael
parents: 27212
diff changeset
801 }
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
802 /* sanity check */
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
803 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
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
804 av_log(NULL, AV_LOG_ERROR, "swScaler: %dx%d -> %dx%d is invalid scaling dimension\n",
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
805 srcW, srcH, dstW, dstH);
32282
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
806 return AVERROR(EINVAL);
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
807 }
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
808 if(srcW > VOFW || dstW > VOFW) {
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
809 av_log(NULL, AV_LOG_ERROR, "swScaler: Compile-time maximum width is "AV_STRINGIFY(VOFW)" change VOF/VOFW and recompile\n");
32282
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
810 return AVERROR(EINVAL);
26133
94cc4bac8cd0 Turn ancient V offset numerical constants into named ones.
michael
parents: 26028
diff changeset
811 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
812
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
813 if (!dstFilter) dstFilter= &dummyFilter;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
814 if (!srcFilter) srcFilter= &dummyFilter;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
815
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
816 c->lumXInc= ((srcW<<16) + (dstW>>1))/dstW;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
817 c->lumYInc= ((srcH<<16) + (dstH>>1))/dstH;
30377
2eea1f09e2c5 Use av_get_bits_per_pixel() for computing the bits per pixel of the
stefano
parents: 30370
diff changeset
818 c->dstFormatBpp = av_get_bits_per_pixel(&av_pix_fmt_descriptors[dstFormat]);
2eea1f09e2c5 Use av_get_bits_per_pixel() for computing the bits per pixel of the
stefano
parents: 30370
diff changeset
819 c->srcFormatBpp = av_get_bits_per_pixel(&av_pix_fmt_descriptors[srcFormat]);
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
820 c->vRounder= 4* 0x0001000100010001ULL;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
821
30478
838bbf6bc6ff Simplify how usesVFilter and usesHFilter are set.
stefano
parents: 30432
diff changeset
822 usesVFilter = (srcFilter->lumV && srcFilter->lumV->length>1) ||
838bbf6bc6ff Simplify how usesVFilter and usesHFilter are set.
stefano
parents: 30432
diff changeset
823 (srcFilter->chrV && srcFilter->chrV->length>1) ||
838bbf6bc6ff Simplify how usesVFilter and usesHFilter are set.
stefano
parents: 30432
diff changeset
824 (dstFilter->lumV && dstFilter->lumV->length>1) ||
838bbf6bc6ff Simplify how usesVFilter and usesHFilter are set.
stefano
parents: 30432
diff changeset
825 (dstFilter->chrV && dstFilter->chrV->length>1);
838bbf6bc6ff Simplify how usesVFilter and usesHFilter are set.
stefano
parents: 30432
diff changeset
826 usesHFilter = (srcFilter->lumH && srcFilter->lumH->length>1) ||
838bbf6bc6ff Simplify how usesVFilter and usesHFilter are set.
stefano
parents: 30432
diff changeset
827 (srcFilter->chrH && srcFilter->chrH->length>1) ||
838bbf6bc6ff Simplify how usesVFilter and usesHFilter are set.
stefano
parents: 30432
diff changeset
828 (dstFilter->lumH && dstFilter->lumH->length>1) ||
838bbf6bc6ff Simplify how usesVFilter and usesHFilter are set.
stefano
parents: 30432
diff changeset
829 (dstFilter->chrH && dstFilter->chrH->length>1);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
830
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
831 getSubSampleFactors(&c->chrSrcHSubSample, &c->chrSrcVSubSample, srcFormat);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
832 getSubSampleFactors(&c->chrDstHSubSample, &c->chrDstVSubSample, dstFormat);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
833
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
834 // reuse chroma for 2 pixels RGB/BGR unless user wants full chroma interpolation
30393
db62840d27ae Use isAnyRGB() where possible
michael
parents: 30391
diff changeset
835 if (isAnyRGB(dstFormat) && !(flags&SWS_FULL_CHR_H_INT)) c->chrDstHSubSample=1;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
836
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
837 // drop some chroma lines if the user wants it
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
838 c->vChrDrop= (flags&SWS_SRC_V_CHR_DROP_MASK)>>SWS_SRC_V_CHR_DROP_SHIFT;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
839 c->chrSrcVSubSample+= c->vChrDrop;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
840
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
841 // drop every other pixel for chroma calculation unless user wants full chroma
30393
db62840d27ae Use isAnyRGB() where possible
michael
parents: 30391
diff changeset
842 if (isAnyRGB(srcFormat) && !(flags&SWS_FULL_CHR_H_INP)
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
843 && srcFormat!=PIX_FMT_RGB8 && srcFormat!=PIX_FMT_BGR8
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
844 && srcFormat!=PIX_FMT_RGB4 && srcFormat!=PIX_FMT_BGR4
27529
ffb573fae5e8 Rewrite bgr24->yuv mmx code, the new code is cleaner, more accurate,
michael
parents: 27526
diff changeset
845 && srcFormat!=PIX_FMT_RGB4_BYTE && srcFormat!=PIX_FMT_BGR4_BYTE
32274
c475ed274718 swscale: use full chroma input for point scaler
ramiro
parents: 31968
diff changeset
846 && ((dstW>>c->chrDstHSubSample) <= (srcW>>1) || (flags&SWS_FAST_BILINEAR)))
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
847 c->chrSrcHSubSample=1;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
848
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
849 // Note the -((-x)>>y) is so that we always round toward +inf.
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
850 c->chrSrcW= -((-srcW) >> c->chrSrcHSubSample);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
851 c->chrSrcH= -((-srcH) >> c->chrSrcVSubSample);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
852 c->chrDstW= -((-dstW) >> c->chrDstHSubSample);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
853 c->chrDstH= -((-dstH) >> c->chrDstVSubSample);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
854
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
855 /* unscaled special cases */
32282
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
856 if (unscaled && !usesHFilter && !usesVFilter && (c->srcRange == c->dstRange || isAnyRGB(dstFormat))) {
30369
8c479cb29c7a Split swscale.c into scaler code (swscale.c) and utility code (utils.c).
ramiro
parents: 30343
diff changeset
857 ff_get_unscaled_swscale(c);
23585
d3ae6979d3df integrating ff_bfin_get_unscaled_swscale into the system
mhoffman
parents: 23536
diff changeset
858
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
859 if (c->swScale) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
860 if (flags&SWS_PRINT_INFO)
26150
1df4a811aa9c remove redundant SwScaler text since av_log uses AVClass context
bcoudurier
parents: 26134
diff changeset
861 av_log(c, AV_LOG_INFO, "using unscaled %s -> %s special converter\n",
29480
a4d8dee13834 Indent libswscale:
ramiro
parents: 29475
diff changeset
862 sws_format_name(srcFormat), sws_format_name(dstFormat));
32282
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
863 return 0;
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
864 }
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
865 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
866
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
867 if (flags & SWS_CPU_CAPS_MMX2) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
868 c->canMMX2BeUsed= (dstW >=srcW && (dstW&31)==0 && (srcW&15)==0) ? 1 : 0;
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
869 if (!c->canMMX2BeUsed && dstW >=srcW && (srcW&15)==0 && (flags&SWS_FAST_BILINEAR)) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
870 if (flags&SWS_PRINT_INFO)
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
871 av_log(c, AV_LOG_INFO, "output width is not a multiple of 32 -> no MMX2 scaler\n");
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
872 }
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
873 if (usesHFilter) c->canMMX2BeUsed=0;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
874 }
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
875 else
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
876 c->canMMX2BeUsed=0;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
877
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
878 c->chrXInc= ((c->chrSrcW<<16) + (c->chrDstW>>1))/c->chrDstW;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
879 c->chrYInc= ((c->chrSrcH<<16) + (c->chrDstH>>1))/c->chrDstH;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
880
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
881 // match pixel 0 of the src to pixel 0 of dst and match pixel n-2 of src to pixel n-2 of dst
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
882 // but only for the FAST_BILINEAR mode otherwise do correct scaling
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
883 // n-2 is the last chrominance sample available
23536
ab4c0bba8f22 misc spelling fixes
diego
parents: 23400
diff changeset
884 // this is not perfect, but no one should notice the difference, the more correct variant
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
885 // would be like the vertical one, but that would require some special code for the
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
886 // first and last pixel
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
887 if (flags&SWS_FAST_BILINEAR) {
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
888 if (c->canMMX2BeUsed) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
889 c->lumXInc+= 20;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
890 c->chrXInc+= 20;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
891 }
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
892 //we don't use the x86 asm scaler if MMX is available
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
893 else if (flags & SWS_CPU_CAPS_MMX) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
894 c->lumXInc = ((srcW-2)<<16)/(dstW-2) - 20;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
895 c->chrXInc = ((c->chrSrcW-2)<<16)/(c->chrDstW-2) - 20;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
896 }
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
897 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
898
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
899 /* precalculate horizontal scaler filter coefficients */
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
900 {
30923
0be6ed163321 libswscale: Relicense almost all x86 assembler optimizations as LGPL.
diego
parents: 30912
diff changeset
901 #if ARCH_X86 && (HAVE_MMX2 || CONFIG_RUNTIME_CPUDETECT)
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
902 // can't downscale !!!
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
903 if (c->canMMX2BeUsed && (flags & SWS_FAST_BILINEAR)) {
29468
947a942221c4 MMX2 horizontal scaler: Determine code size at runtime.
ramiro
parents: 29467
diff changeset
904 c->lumMmx2FilterCodeSize = initMMX2HScaler( dstW, c->lumXInc, NULL, NULL, NULL, 8);
947a942221c4 MMX2 horizontal scaler: Determine code size at runtime.
ramiro
parents: 29467
diff changeset
905 c->chrMmx2FilterCodeSize = initMMX2HScaler(c->chrDstW, c->chrXInc, NULL, NULL, NULL, 4);
947a942221c4 MMX2 horizontal scaler: Determine code size at runtime.
ramiro
parents: 29467
diff changeset
906
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
907 #ifdef MAP_ANONYMOUS
31903
7f74671d003c fix anonymous memory mapping for NetBSD
ramiro
parents: 31694
diff changeset
908 c->lumMmx2FilterCode = mmap(NULL, c->lumMmx2FilterCodeSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
7f74671d003c fix anonymous memory mapping for NetBSD
ramiro
parents: 31694
diff changeset
909 c->chrMmx2FilterCode = mmap(NULL, c->chrMmx2FilterCodeSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
28971
b8e356a9dbb1 Allocate executable memory with VirtualAlloc() in Windows.
ramiro
parents: 28970
diff changeset
910 #elif HAVE_VIRTUALALLOC
29468
947a942221c4 MMX2 horizontal scaler: Determine code size at runtime.
ramiro
parents: 29467
diff changeset
911 c->lumMmx2FilterCode = VirtualAlloc(NULL, c->lumMmx2FilterCodeSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
947a942221c4 MMX2 horizontal scaler: Determine code size at runtime.
ramiro
parents: 29467
diff changeset
912 c->chrMmx2FilterCode = VirtualAlloc(NULL, c->chrMmx2FilterCodeSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
913 #else
29468
947a942221c4 MMX2 horizontal scaler: Determine code size at runtime.
ramiro
parents: 29467
diff changeset
914 c->lumMmx2FilterCode = av_malloc(c->lumMmx2FilterCodeSize);
947a942221c4 MMX2 horizontal scaler: Determine code size at runtime.
ramiro
parents: 29467
diff changeset
915 c->chrMmx2FilterCode = av_malloc(c->chrMmx2FilterCodeSize);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
916 #endif
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
917
30822
ed3b3682cdde Check for allocation failure for c->lumMmx2FilterCode and c->chrMmx2FilterCode.
reimar
parents: 30821
diff changeset
918 if (!c->lumMmx2FilterCode || !c->chrMmx2FilterCode)
32282
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
919 return AVERROR(ENOMEM);
30285
042ec58ab0e2 Reuse h{lum,chr}Filter{,Pos} variables for MMX2 fast_bilinear horizontal scaler.
ramiro
parents: 30284
diff changeset
920 FF_ALLOCZ_OR_GOTO(c, c->hLumFilter , (dstW /8+8)*sizeof(int16_t), fail);
042ec58ab0e2 Reuse h{lum,chr}Filter{,Pos} variables for MMX2 fast_bilinear horizontal scaler.
ramiro
parents: 30284
diff changeset
921 FF_ALLOCZ_OR_GOTO(c, c->hChrFilter , (c->chrDstW /4+8)*sizeof(int16_t), fail);
042ec58ab0e2 Reuse h{lum,chr}Filter{,Pos} variables for MMX2 fast_bilinear horizontal scaler.
ramiro
parents: 30284
diff changeset
922 FF_ALLOCZ_OR_GOTO(c, c->hLumFilterPos, (dstW /2/8+8)*sizeof(int32_t), fail);
042ec58ab0e2 Reuse h{lum,chr}Filter{,Pos} variables for MMX2 fast_bilinear horizontal scaler.
ramiro
parents: 30284
diff changeset
923 FF_ALLOCZ_OR_GOTO(c, c->hChrFilterPos, (c->chrDstW/2/4+8)*sizeof(int32_t), fail);
042ec58ab0e2 Reuse h{lum,chr}Filter{,Pos} variables for MMX2 fast_bilinear horizontal scaler.
ramiro
parents: 30284
diff changeset
924
042ec58ab0e2 Reuse h{lum,chr}Filter{,Pos} variables for MMX2 fast_bilinear horizontal scaler.
ramiro
parents: 30284
diff changeset
925 initMMX2HScaler( dstW, c->lumXInc, c->lumMmx2FilterCode, c->hLumFilter, c->hLumFilterPos, 8);
042ec58ab0e2 Reuse h{lum,chr}Filter{,Pos} variables for MMX2 fast_bilinear horizontal scaler.
ramiro
parents: 30284
diff changeset
926 initMMX2HScaler(c->chrDstW, c->chrXInc, c->chrMmx2FilterCode, c->hChrFilter, c->hChrFilterPos, 4);
29467
1acbe8b170ed Protect mmx2 filter code buffers so they are not executable and writeable at
ramiro
parents: 29465
diff changeset
927
1acbe8b170ed Protect mmx2 filter code buffers so they are not executable and writeable at
ramiro
parents: 29465
diff changeset
928 #ifdef MAP_ANONYMOUS
29468
947a942221c4 MMX2 horizontal scaler: Determine code size at runtime.
ramiro
parents: 29467
diff changeset
929 mprotect(c->lumMmx2FilterCode, c->lumMmx2FilterCodeSize, PROT_EXEC | PROT_READ);
947a942221c4 MMX2 horizontal scaler: Determine code size at runtime.
ramiro
parents: 29467
diff changeset
930 mprotect(c->chrMmx2FilterCode, c->chrMmx2FilterCodeSize, PROT_EXEC | PROT_READ);
29467
1acbe8b170ed Protect mmx2 filter code buffers so they are not executable and writeable at
ramiro
parents: 29465
diff changeset
931 #endif
30271
2fad32dd128c Don't initialize normal horizontal filter if MMX2 filter is used.
ramiro
parents: 30264
diff changeset
932 } else
30923
0be6ed163321 libswscale: Relicense almost all x86 assembler optimizations as LGPL.
diego
parents: 30912
diff changeset
933 #endif /* ARCH_X86 && (HAVE_MMX2 || CONFIG_RUNTIME_CPUDETECT) */
30271
2fad32dd128c Don't initialize normal horizontal filter if MMX2 filter is used.
ramiro
parents: 30264
diff changeset
934 {
2fad32dd128c Don't initialize normal horizontal filter if MMX2 filter is used.
ramiro
parents: 30264
diff changeset
935 const int filterAlign=
2fad32dd128c Don't initialize normal horizontal filter if MMX2 filter is used.
ramiro
parents: 30264
diff changeset
936 (flags & SWS_CPU_CAPS_MMX) ? 4 :
2fad32dd128c Don't initialize normal horizontal filter if MMX2 filter is used.
ramiro
parents: 30264
diff changeset
937 (flags & SWS_CPU_CAPS_ALTIVEC) ? 8 :
2fad32dd128c Don't initialize normal horizontal filter if MMX2 filter is used.
ramiro
parents: 30264
diff changeset
938 1;
2fad32dd128c Don't initialize normal horizontal filter if MMX2 filter is used.
ramiro
parents: 30264
diff changeset
939
2fad32dd128c Don't initialize normal horizontal filter if MMX2 filter is used.
ramiro
parents: 30264
diff changeset
940 if (initFilter(&c->hLumFilter, &c->hLumFilterPos, &c->hLumFilterSize, c->lumXInc,
2fad32dd128c Don't initialize normal horizontal filter if MMX2 filter is used.
ramiro
parents: 30264
diff changeset
941 srcW , dstW, filterAlign, 1<<14,
2fad32dd128c Don't initialize normal horizontal filter if MMX2 filter is used.
ramiro
parents: 30264
diff changeset
942 (flags&SWS_BICUBLIN) ? (flags|SWS_BICUBIC) : flags,
2fad32dd128c Don't initialize normal horizontal filter if MMX2 filter is used.
ramiro
parents: 30264
diff changeset
943 srcFilter->lumH, dstFilter->lumH, c->param) < 0)
2fad32dd128c Don't initialize normal horizontal filter if MMX2 filter is used.
ramiro
parents: 30264
diff changeset
944 goto fail;
2fad32dd128c Don't initialize normal horizontal filter if MMX2 filter is used.
ramiro
parents: 30264
diff changeset
945 if (initFilter(&c->hChrFilter, &c->hChrFilterPos, &c->hChrFilterSize, c->chrXInc,
2fad32dd128c Don't initialize normal horizontal filter if MMX2 filter is used.
ramiro
parents: 30264
diff changeset
946 c->chrSrcW, c->chrDstW, filterAlign, 1<<14,
2fad32dd128c Don't initialize normal horizontal filter if MMX2 filter is used.
ramiro
parents: 30264
diff changeset
947 (flags&SWS_BICUBLIN) ? (flags|SWS_BILINEAR) : flags,
2fad32dd128c Don't initialize normal horizontal filter if MMX2 filter is used.
ramiro
parents: 30264
diff changeset
948 srcFilter->chrH, dstFilter->chrH, c->param) < 0)
2fad32dd128c Don't initialize normal horizontal filter if MMX2 filter is used.
ramiro
parents: 30264
diff changeset
949 goto fail;
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
950 }
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
951 } // initialize horizontal stuff
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
952
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
953 /* precalculate vertical scaler filter coefficients */
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
954 {
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
955 const int filterAlign=
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
956 (flags & SWS_CPU_CAPS_MMX) && (flags & SWS_ACCURATE_RND) ? 2 :
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
957 (flags & SWS_CPU_CAPS_ALTIVEC) ? 8 :
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
958 1;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
959
29544
c7249524c681 Check for return value of initFilter().
ramiro
parents: 29542
diff changeset
960 if (initFilter(&c->vLumFilter, &c->vLumFilterPos, &c->vLumFilterSize, c->lumYInc,
30045
ddf16edcc048 Indentation.
ramiro
parents: 29936
diff changeset
961 srcH , dstH, filterAlign, (1<<12),
ddf16edcc048 Indentation.
ramiro
parents: 29936
diff changeset
962 (flags&SWS_BICUBLIN) ? (flags|SWS_BICUBIC) : flags,
ddf16edcc048 Indentation.
ramiro
parents: 29936
diff changeset
963 srcFilter->lumV, dstFilter->lumV, c->param) < 0)
29544
c7249524c681 Check for return value of initFilter().
ramiro
parents: 29542
diff changeset
964 goto fail;
c7249524c681 Check for return value of initFilter().
ramiro
parents: 29542
diff changeset
965 if (initFilter(&c->vChrFilter, &c->vChrFilterPos, &c->vChrFilterSize, c->chrYInc,
30045
ddf16edcc048 Indentation.
ramiro
parents: 29936
diff changeset
966 c->chrSrcH, c->chrDstH, filterAlign, (1<<12),
ddf16edcc048 Indentation.
ramiro
parents: 29936
diff changeset
967 (flags&SWS_BICUBLIN) ? (flags|SWS_BILINEAR) : flags,
ddf16edcc048 Indentation.
ramiro
parents: 29936
diff changeset
968 srcFilter->chrV, dstFilter->chrV, c->param) < 0)
29544
c7249524c681 Check for return value of initFilter().
ramiro
parents: 29542
diff changeset
969 goto fail;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
970
30912
f91ad62a2281 AltiVec implies a PPC CPU, so there is no need to check for both.
diego
parents: 30910
diff changeset
971 #if HAVE_ALTIVEC
29610
c35359578f8d Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents: 29609
diff changeset
972 FF_ALLOC_OR_GOTO(c, c->vYCoeffsBank, sizeof (vector signed short)*c->vLumFilterSize*c->dstH, fail);
c35359578f8d Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents: 29609
diff changeset
973 FF_ALLOC_OR_GOTO(c, c->vCCoeffsBank, sizeof (vector signed short)*c->vChrFilterSize*c->chrDstH, fail);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
974
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
975 for (i=0;i<c->vLumFilterSize*c->dstH;i++) {
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
976 int j;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
977 short *p = (short *)&c->vYCoeffsBank[i];
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
978 for (j=0;j<8;j++)
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
979 p[j] = c->vLumFilter[i];
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
980 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
981
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
982 for (i=0;i<c->vChrFilterSize*c->chrDstH;i++) {
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
983 int j;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
984 short *p = (short *)&c->vCCoeffsBank[i];
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
985 for (j=0;j<8;j++)
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
986 p[j] = c->vChrFilter[i];
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
987 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
988 #endif
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
989 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
990
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
991 // calculate buffer sizes so that they won't run out while handling these damn slices
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
992 c->vLumBufSize= c->vLumFilterSize;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
993 c->vChrBufSize= c->vChrFilterSize;
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
994 for (i=0; i<dstH; i++) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
995 int chrI= i*c->chrDstH / dstH;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
996 int nextSlice= FFMAX(c->vLumFilterPos[i ] + c->vLumFilterSize - 1,
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
997 ((c->vChrFilterPos[chrI] + c->vChrFilterSize - 1)<<c->chrSrcVSubSample));
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
998
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
999 nextSlice>>= c->chrSrcVSubSample;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1000 nextSlice<<= c->chrSrcVSubSample;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1001 if (c->vLumFilterPos[i ] + c->vLumBufSize < nextSlice)
25749
8d082a234a6d Remove non cosmetic spaces inside parentheses.
benoit
parents: 25748
diff changeset
1002 c->vLumBufSize= nextSlice - c->vLumFilterPos[i];
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1003 if (c->vChrFilterPos[chrI] + c->vChrBufSize < (nextSlice>>c->chrSrcVSubSample))
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1004 c->vChrBufSize= (nextSlice>>c->chrSrcVSubSample) - c->vChrFilterPos[chrI];
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1005 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1006
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1007 // allocate pixbufs (we use dynamic allocation because otherwise we would need to
29540
0f86c85da42a Restore comment that was partially removed.
ramiro
parents: 29501
diff changeset
1008 // allocate several megabytes to handle all possible cases)
29610
c35359578f8d Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents: 29609
diff changeset
1009 FF_ALLOC_OR_GOTO(c, c->lumPixBuf, c->vLumBufSize*2*sizeof(int16_t*), fail);
c35359578f8d Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents: 29609
diff changeset
1010 FF_ALLOC_OR_GOTO(c, c->chrPixBuf, c->vChrBufSize*2*sizeof(int16_t*), fail);
28976
602c77c53923 Add alpha channel scaling
sdrik
parents: 28974
diff changeset
1011 if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat) && isALPHA(c->dstFormat))
29610
c35359578f8d Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents: 29609
diff changeset
1012 FF_ALLOCZ_OR_GOTO(c, c->alpPixBuf, c->vLumBufSize*2*sizeof(int16_t*), fail);
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
1013 //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)
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1014 /* align at 16 bytes for AltiVec */
29545
647fc86d3463 Curly brackets cosmetics for previous commit.
ramiro
parents: 29544
diff changeset
1015 for (i=0; i<c->vLumBufSize; i++) {
29610
c35359578f8d Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents: 29609
diff changeset
1016 FF_ALLOCZ_OR_GOTO(c, c->lumPixBuf[i+c->vLumBufSize], VOF+1, fail);
29542
3e7ffd70b12b swscale: Check for return values of malloc.
ramiro
parents: 29540
diff changeset
1017 c->lumPixBuf[i] = c->lumPixBuf[i+c->vLumBufSize];
3e7ffd70b12b swscale: Check for return values of malloc.
ramiro
parents: 29540
diff changeset
1018 }
29545
647fc86d3463 Curly brackets cosmetics for previous commit.
ramiro
parents: 29544
diff changeset
1019 for (i=0; i<c->vChrBufSize; i++) {
29610
c35359578f8d Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents: 29609
diff changeset
1020 FF_ALLOC_OR_GOTO(c, c->chrPixBuf[i+c->vChrBufSize], (VOF+1)*2, fail);
29542
3e7ffd70b12b swscale: Check for return values of malloc.
ramiro
parents: 29540
diff changeset
1021 c->chrPixBuf[i] = c->chrPixBuf[i+c->vChrBufSize];
3e7ffd70b12b swscale: Check for return values of malloc.
ramiro
parents: 29540
diff changeset
1022 }
28976
602c77c53923 Add alpha channel scaling
sdrik
parents: 28974
diff changeset
1023 if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf)
29545
647fc86d3463 Curly brackets cosmetics for previous commit.
ramiro
parents: 29544
diff changeset
1024 for (i=0; i<c->vLumBufSize; i++) {
29610
c35359578f8d Rename CHECKED_ALLOC(Z) to FF_ALLOC(Z)_OR_GOTO and add context and label
ramiro
parents: 29609
diff changeset
1025 FF_ALLOCZ_OR_GOTO(c, c->alpPixBuf[i+c->vLumBufSize], VOF+1, fail);
29542
3e7ffd70b12b swscale: Check for return values of malloc.
ramiro
parents: 29540
diff changeset
1026 c->alpPixBuf[i] = c->alpPixBuf[i+c->vLumBufSize];
3e7ffd70b12b swscale: Check for return values of malloc.
ramiro
parents: 29540
diff changeset
1027 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1028
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1029 //try to avoid drawing green stuff between the right end and the stride end
26133
94cc4bac8cd0 Turn ancient V offset numerical constants into named ones.
michael
parents: 26028
diff changeset
1030 for (i=0; i<c->vChrBufSize; i++) memset(c->chrPixBuf[i], 64, (VOF+1)*2);
94cc4bac8cd0 Turn ancient V offset numerical constants into named ones.
michael
parents: 26028
diff changeset
1031
26225
aa1dee3df0c2 Fix a typo that causes an assertion to always fail.
zuxy
parents: 26196
diff changeset
1032 assert(2*VOFW == VOF);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1033
27182
f7b6d1014b6b Remove ASSERT() macro. SoC Patch from Keiji Costantini
lu_zero
parents: 27181
diff changeset
1034 assert(c->chrDstH <= dstH);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1035
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1036 if (flags&SWS_PRINT_INFO) {
32318
87260d853de6 Put if (...) av_log() in the same line, more compact and increase
stefano
parents: 32316
diff changeset
1037 if (flags&SWS_FAST_BILINEAR) av_log(c, AV_LOG_INFO, "FAST_BILINEAR scaler, ");
87260d853de6 Put if (...) av_log() in the same line, more compact and increase
stefano
parents: 32316
diff changeset
1038 else if (flags&SWS_BILINEAR) av_log(c, AV_LOG_INFO, "BILINEAR scaler, ");
87260d853de6 Put if (...) av_log() in the same line, more compact and increase
stefano
parents: 32316
diff changeset
1039 else if (flags&SWS_BICUBIC) av_log(c, AV_LOG_INFO, "BICUBIC scaler, ");
87260d853de6 Put if (...) av_log() in the same line, more compact and increase
stefano
parents: 32316
diff changeset
1040 else if (flags&SWS_X) av_log(c, AV_LOG_INFO, "Experimental scaler, ");
87260d853de6 Put if (...) av_log() in the same line, more compact and increase
stefano
parents: 32316
diff changeset
1041 else if (flags&SWS_POINT) av_log(c, AV_LOG_INFO, "Nearest Neighbor / POINT scaler, ");
87260d853de6 Put if (...) av_log() in the same line, more compact and increase
stefano
parents: 32316
diff changeset
1042 else if (flags&SWS_AREA) av_log(c, AV_LOG_INFO, "Area Averaging scaler, ");
87260d853de6 Put if (...) av_log() in the same line, more compact and increase
stefano
parents: 32316
diff changeset
1043 else if (flags&SWS_BICUBLIN) av_log(c, AV_LOG_INFO, "luma BICUBIC / chroma BILINEAR scaler, ");
87260d853de6 Put if (...) av_log() in the same line, more compact and increase
stefano
parents: 32316
diff changeset
1044 else if (flags&SWS_GAUSS) av_log(c, AV_LOG_INFO, "Gaussian scaler, ");
87260d853de6 Put if (...) av_log() in the same line, more compact and increase
stefano
parents: 32316
diff changeset
1045 else if (flags&SWS_SINC) av_log(c, AV_LOG_INFO, "Sinc scaler, ");
87260d853de6 Put if (...) av_log() in the same line, more compact and increase
stefano
parents: 32316
diff changeset
1046 else if (flags&SWS_LANCZOS) av_log(c, AV_LOG_INFO, "Lanczos scaler, ");
87260d853de6 Put if (...) av_log() in the same line, more compact and increase
stefano
parents: 32316
diff changeset
1047 else if (flags&SWS_SPLINE) av_log(c, AV_LOG_INFO, "Bicubic spline scaler, ");
87260d853de6 Put if (...) av_log() in the same line, more compact and increase
stefano
parents: 32316
diff changeset
1048 else av_log(c, AV_LOG_INFO, "ehh flags invalid?! ");
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1049
30288
4ee0cedb32f2 Prefer "to %s%s" over "to%s %s", slightly more readable.
stefano
parents: 30287
diff changeset
1050 av_log(c, AV_LOG_INFO, "from %s to %s%s ",
30284
03f99130b7c3 Factorize code which logs the source and destination formats in
stefano
parents: 30275
diff changeset
1051 sws_format_name(srcFormat),
30287
67cace3e3df7 Simplify code in sws_getContext() which logs if the destination format
stefano
parents: 30285
diff changeset
1052 #ifdef DITHER1XBPP
30892
e052716dcb5b Extend the generic path of the yuv2rgb converter with support for rgb444
cehoyos
parents: 30822
diff changeset
1053 dstFormat == PIX_FMT_BGR555 || dstFormat == PIX_FMT_BGR565 ||
e052716dcb5b Extend the generic path of the yuv2rgb converter with support for rgb444
cehoyos
parents: 30822
diff changeset
1054 dstFormat == PIX_FMT_RGB444BE || dstFormat == PIX_FMT_RGB444LE ||
e052716dcb5b Extend the generic path of the yuv2rgb converter with support for rgb444
cehoyos
parents: 30822
diff changeset
1055 dstFormat == PIX_FMT_BGR444BE || dstFormat == PIX_FMT_BGR444LE ? "dithered " : "",
30287
67cace3e3df7 Simplify code in sws_getContext() which logs if the destination format
stefano
parents: 30285
diff changeset
1056 #else
67cace3e3df7 Simplify code in sws_getContext() which logs if the destination format
stefano
parents: 30285
diff changeset
1057 "",
67cace3e3df7 Simplify code in sws_getContext() which logs if the destination format
stefano
parents: 30285
diff changeset
1058 #endif
30284
03f99130b7c3 Factorize code which logs the source and destination formats in
stefano
parents: 30275
diff changeset
1059 sws_format_name(dstFormat));
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1060
32319
9a91a876aab6 Cosmetics: put "if (...)" and "av_log(...)" in the same line for
stefano
parents: 32318
diff changeset
1061 if (flags & SWS_CPU_CAPS_MMX2) av_log(c, AV_LOG_INFO, "using MMX2\n");
9a91a876aab6 Cosmetics: put "if (...)" and "av_log(...)" in the same line for
stefano
parents: 32318
diff changeset
1062 else if (flags & SWS_CPU_CAPS_3DNOW) av_log(c, AV_LOG_INFO, "using 3DNOW\n");
9a91a876aab6 Cosmetics: put "if (...)" and "av_log(...)" in the same line for
stefano
parents: 32318
diff changeset
1063 else if (flags & SWS_CPU_CAPS_MMX) av_log(c, AV_LOG_INFO, "using MMX\n");
9a91a876aab6 Cosmetics: put "if (...)" and "av_log(...)" in the same line for
stefano
parents: 32318
diff changeset
1064 else if (flags & SWS_CPU_CAPS_ALTIVEC) av_log(c, AV_LOG_INFO, "using AltiVec\n");
9a91a876aab6 Cosmetics: put "if (...)" and "av_log(...)" in the same line for
stefano
parents: 32318
diff changeset
1065 else av_log(c, AV_LOG_INFO, "using C\n");
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1066
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1067 if (flags & SWS_CPU_CAPS_MMX) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1068 if (c->canMMX2BeUsed && (flags&SWS_FAST_BILINEAR))
26150
1df4a811aa9c remove redundant SwScaler text since av_log uses AVClass context
bcoudurier
parents: 26134
diff changeset
1069 av_log(c, AV_LOG_VERBOSE, "using FAST_BILINEAR MMX2 scaler for horizontal scaling\n");
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1070 else {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1071 if (c->hLumFilterSize==4)
26150
1df4a811aa9c remove redundant SwScaler text since av_log uses AVClass context
bcoudurier
parents: 26134
diff changeset
1072 av_log(c, AV_LOG_VERBOSE, "using 4-tap MMX scaler for horizontal luminance scaling\n");
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1073 else if (c->hLumFilterSize==8)
26150
1df4a811aa9c remove redundant SwScaler text since av_log uses AVClass context
bcoudurier
parents: 26134
diff changeset
1074 av_log(c, AV_LOG_VERBOSE, "using 8-tap MMX scaler for horizontal luminance scaling\n");
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1075 else
26150
1df4a811aa9c remove redundant SwScaler text since av_log uses AVClass context
bcoudurier
parents: 26134
diff changeset
1076 av_log(c, AV_LOG_VERBOSE, "using n-tap MMX scaler for horizontal luminance scaling\n");
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1077
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1078 if (c->hChrFilterSize==4)
26150
1df4a811aa9c remove redundant SwScaler text since av_log uses AVClass context
bcoudurier
parents: 26134
diff changeset
1079 av_log(c, AV_LOG_VERBOSE, "using 4-tap MMX scaler for horizontal chrominance scaling\n");
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1080 else if (c->hChrFilterSize==8)
26150
1df4a811aa9c remove redundant SwScaler text since av_log uses AVClass context
bcoudurier
parents: 26134
diff changeset
1081 av_log(c, AV_LOG_VERBOSE, "using 8-tap MMX scaler for horizontal chrominance scaling\n");
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1082 else
26150
1df4a811aa9c remove redundant SwScaler text since av_log uses AVClass context
bcoudurier
parents: 26134
diff changeset
1083 av_log(c, AV_LOG_VERBOSE, "using n-tap MMX scaler for horizontal chrominance scaling\n");
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1084 }
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1085 } else {
28276
877336d3c598 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 28246
diff changeset
1086 #if ARCH_X86
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
1087 av_log(c, AV_LOG_VERBOSE, "using x86 asm scaler for horizontal scaling\n");
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1088 #else
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1089 if (flags & SWS_FAST_BILINEAR)
26150
1df4a811aa9c remove redundant SwScaler text since av_log uses AVClass context
bcoudurier
parents: 26134
diff changeset
1090 av_log(c, AV_LOG_VERBOSE, "using FAST_BILINEAR C scaler for horizontal scaling\n");
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1091 else
26150
1df4a811aa9c remove redundant SwScaler text since av_log uses AVClass context
bcoudurier
parents: 26134
diff changeset
1092 av_log(c, AV_LOG_VERBOSE, "using C scaler for horizontal scaling\n");
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1093 #endif
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1094 }
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1095 if (isPlanarYUV(dstFormat)) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1096 if (c->vLumFilterSize==1)
26150
1df4a811aa9c remove redundant SwScaler text since av_log uses AVClass context
bcoudurier
parents: 26134
diff changeset
1097 av_log(c, AV_LOG_VERBOSE, "using 1-tap %s \"scaler\" for vertical scaling (YV12 like)\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C");
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1098 else
26150
1df4a811aa9c remove redundant SwScaler text since av_log uses AVClass context
bcoudurier
parents: 26134
diff changeset
1099 av_log(c, AV_LOG_VERBOSE, "using n-tap %s scaler for vertical scaling (YV12 like)\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C");
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1100 } else {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1101 if (c->vLumFilterSize==1 && c->vChrFilterSize==2)
26150
1df4a811aa9c remove redundant SwScaler text since av_log uses AVClass context
bcoudurier
parents: 26134
diff changeset
1102 av_log(c, AV_LOG_VERBOSE, "using 1-tap %s \"scaler\" for vertical luminance scaling (BGR)\n"
1df4a811aa9c remove redundant SwScaler text since av_log uses AVClass context
bcoudurier
parents: 26134
diff changeset
1103 " 2-tap scaler for vertical chrominance scaling (BGR)\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C");
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1104 else if (c->vLumFilterSize==2 && c->vChrFilterSize==2)
26150
1df4a811aa9c remove redundant SwScaler text since av_log uses AVClass context
bcoudurier
parents: 26134
diff changeset
1105 av_log(c, AV_LOG_VERBOSE, "using 2-tap linear %s scaler for vertical scaling (BGR)\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C");
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1106 else
26150
1df4a811aa9c remove redundant SwScaler text since av_log uses AVClass context
bcoudurier
parents: 26134
diff changeset
1107 av_log(c, AV_LOG_VERBOSE, "using n-tap %s scaler for vertical scaling (BGR)\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C");
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1108 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1109
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1110 if (dstFormat==PIX_FMT_BGR24)
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
1111 av_log(c, AV_LOG_VERBOSE, "using %s YV12->BGR24 converter\n",
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1112 (flags & SWS_CPU_CAPS_MMX2) ? "MMX2" : ((flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C"));
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1113 else if (dstFormat==PIX_FMT_RGB32)
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
1114 av_log(c, AV_LOG_VERBOSE, "using %s YV12->BGR32 converter\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C");
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1115 else if (dstFormat==PIX_FMT_BGR565)
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
1116 av_log(c, AV_LOG_VERBOSE, "using %s YV12->BGR16 converter\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C");
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1117 else if (dstFormat==PIX_FMT_BGR555)
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
1118 av_log(c, AV_LOG_VERBOSE, "using %s YV12->BGR15 converter\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C");
30892
e052716dcb5b Extend the generic path of the yuv2rgb converter with support for rgb444
cehoyos
parents: 30822
diff changeset
1119 else if (dstFormat == PIX_FMT_RGB444BE || dstFormat == PIX_FMT_RGB444LE ||
e052716dcb5b Extend the generic path of the yuv2rgb converter with support for rgb444
cehoyos
parents: 30822
diff changeset
1120 dstFormat == PIX_FMT_BGR444BE || dstFormat == PIX_FMT_BGR444LE)
e052716dcb5b Extend the generic path of the yuv2rgb converter with support for rgb444
cehoyos
parents: 30822
diff changeset
1121 av_log(c, AV_LOG_VERBOSE, "using %s YV12->BGR12 converter\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C");
26150
1df4a811aa9c remove redundant SwScaler text since av_log uses AVClass context
bcoudurier
parents: 26134
diff changeset
1122
1df4a811aa9c remove redundant SwScaler text since av_log uses AVClass context
bcoudurier
parents: 26134
diff changeset
1123 av_log(c, AV_LOG_VERBOSE, "%dx%d -> %dx%d\n", srcW, srcH, dstW, dstH);
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
1124 av_log(c, AV_LOG_DEBUG, "lum srcW=%d srcH=%d dstW=%d dstH=%d xInc=%d yInc=%d\n",
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1125 c->srcW, c->srcH, c->dstW, c->dstH, c->lumXInc, c->lumYInc);
28316
da307fb1c239 spelling/grammar cosmetics
diego
parents: 28315
diff changeset
1126 av_log(c, AV_LOG_DEBUG, "chr srcW=%d srcH=%d dstW=%d dstH=%d xInc=%d yInc=%d\n",
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1127 c->chrSrcW, c->chrSrcH, c->chrDstW, c->chrDstH, c->chrXInc, c->chrYInc);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1128 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1129
30369
8c479cb29c7a Split swscale.c into scaler code (swscale.c) and utility code (utils.c).
ramiro
parents: 30343
diff changeset
1130 c->swScale= ff_getSwsFunc(c);
32282
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1131 return 0;
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1132 fail: //FIXME replace things by appropriate error codes
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1133 return -1;
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1134 }
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1135
32315
549b1ad3f777 Deprecate sws_getContext(), use sws_alloc_context() and
stefano
parents: 32308
diff changeset
1136 #if FF_API_SWS_GETCONTEXT
32282
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1137 SwsContext *sws_getContext(int srcW, int srcH, enum PixelFormat srcFormat,
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1138 int dstW, int dstH, enum PixelFormat dstFormat, int flags,
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1139 SwsFilter *srcFilter, SwsFilter *dstFilter, const double *param)
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1140 {
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1141 SwsContext *c;
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1142
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1143 if(!(c=sws_alloc_context()))
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1144 return NULL;
29542
3e7ffd70b12b swscale: Check for return values of malloc.
ramiro
parents: 29540
diff changeset
1145
32282
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1146 c->flags= flags;
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1147 c->srcW= srcW;
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1148 c->srcH= srcH;
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1149 c->dstW= dstW;
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1150 c->dstH= dstH;
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1151 c->srcRange = handle_jpeg(&srcFormat);
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1152 c->dstRange = handle_jpeg(&dstFormat);
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1153 c->srcFormat= srcFormat;
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1154 c->dstFormat= dstFormat;
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1155
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1156 if (param) {
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1157 c->param[0] = param[0];
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1158 c->param[1] = param[1];
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1159 }
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1160 sws_setColorspaceDetails(c, ff_yuv2rgb_coeffs[SWS_CS_DEFAULT], c->srcRange, ff_yuv2rgb_coeffs[SWS_CS_DEFAULT] /* FIXME*/, c->dstRange, 0, 1<<16, 1<<16);
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1161
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1162 if(sws_init_context(c, srcFilter, dstFilter) < 0){
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1163 sws_freeContext(c);
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1164 return NULL;
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1165 }
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1166
606e4157cd4c Split alloc and init of context so that parameters can be set in the context
michael
parents: 32274
diff changeset
1167 return c;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1168 }
32315
549b1ad3f777 Deprecate sws_getContext(), use sws_alloc_context() and
stefano
parents: 32308
diff changeset
1169 #endif
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1170
23129
9528d1ebe68f cosmetics: Remove trailing whitespace.
diego
parents: 22976
diff changeset
1171 SwsFilter *sws_getDefaultFilter(float lumaGBlur, float chromaGBlur,
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1172 float lumaSharpen, float chromaSharpen,
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1173 float chromaHShift, float chromaVShift,
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1174 int verbose)
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1175 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1176 SwsFilter *filter= av_malloc(sizeof(SwsFilter));
29542
3e7ffd70b12b swscale: Check for return values of malloc.
ramiro
parents: 29540
diff changeset
1177 if (!filter)
3e7ffd70b12b swscale: Check for return values of malloc.
ramiro
parents: 29540
diff changeset
1178 return NULL;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1179
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1180 if (lumaGBlur!=0.0) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1181 filter->lumH= sws_getGaussianVec(lumaGBlur, 3.0);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1182 filter->lumV= sws_getGaussianVec(lumaGBlur, 3.0);
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1183 } else {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1184 filter->lumH= sws_getIdentityVec();
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1185 filter->lumV= sws_getIdentityVec();
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1186 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1187
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1188 if (chromaGBlur!=0.0) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1189 filter->chrH= sws_getGaussianVec(chromaGBlur, 3.0);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1190 filter->chrV= sws_getGaussianVec(chromaGBlur, 3.0);
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1191 } else {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1192 filter->chrH= sws_getIdentityVec();
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1193 filter->chrV= sws_getIdentityVec();
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1194 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1195
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1196 if (chromaSharpen!=0.0) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1197 SwsVector *id= sws_getIdentityVec();
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1198 sws_scaleVec(filter->chrH, -chromaSharpen);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1199 sws_scaleVec(filter->chrV, -chromaSharpen);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1200 sws_addVec(filter->chrH, id);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1201 sws_addVec(filter->chrV, id);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1202 sws_freeVec(id);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1203 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1204
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1205 if (lumaSharpen!=0.0) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1206 SwsVector *id= sws_getIdentityVec();
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1207 sws_scaleVec(filter->lumH, -lumaSharpen);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1208 sws_scaleVec(filter->lumV, -lumaSharpen);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1209 sws_addVec(filter->lumH, id);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1210 sws_addVec(filter->lumV, id);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1211 sws_freeVec(id);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1212 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1213
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1214 if (chromaHShift != 0.0)
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1215 sws_shiftVec(filter->chrH, (int)(chromaHShift+0.5));
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1216
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1217 if (chromaVShift != 0.0)
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1218 sws_shiftVec(filter->chrV, (int)(chromaVShift+0.5));
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1219
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1220 sws_normalizeVec(filter->chrH, 1.0);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1221 sws_normalizeVec(filter->chrV, 1.0);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1222 sws_normalizeVec(filter->lumH, 1.0);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1223 sws_normalizeVec(filter->lumV, 1.0);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1224
28532
e5a0c2f38f96 Use sws_printVec2() instead of the deprecated sws_printVec().
stefano
parents: 28531
diff changeset
1225 if (verbose) sws_printVec2(filter->chrH, NULL, AV_LOG_DEBUG);
e5a0c2f38f96 Use sws_printVec2() instead of the deprecated sws_printVec().
stefano
parents: 28531
diff changeset
1226 if (verbose) sws_printVec2(filter->lumH, NULL, AV_LOG_DEBUG);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1227
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1228 return filter;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1229 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1230
29494
86786d090e11 Introduce and use sws_allocVec().
ramiro
parents: 29493
diff changeset
1231 SwsVector *sws_allocVec(int length)
86786d090e11 Introduce and use sws_allocVec().
ramiro
parents: 29493
diff changeset
1232 {
86786d090e11 Introduce and use sws_allocVec().
ramiro
parents: 29493
diff changeset
1233 SwsVector *vec = av_malloc(sizeof(SwsVector));
86786d090e11 Introduce and use sws_allocVec().
ramiro
parents: 29493
diff changeset
1234 if (!vec)
86786d090e11 Introduce and use sws_allocVec().
ramiro
parents: 29493
diff changeset
1235 return NULL;
86786d090e11 Introduce and use sws_allocVec().
ramiro
parents: 29493
diff changeset
1236 vec->length = length;
86786d090e11 Introduce and use sws_allocVec().
ramiro
parents: 29493
diff changeset
1237 vec->coeff = av_malloc(sizeof(double) * length);
86786d090e11 Introduce and use sws_allocVec().
ramiro
parents: 29493
diff changeset
1238 if (!vec->coeff)
86786d090e11 Introduce and use sws_allocVec().
ramiro
parents: 29493
diff changeset
1239 av_freep(&vec);
86786d090e11 Introduce and use sws_allocVec().
ramiro
parents: 29493
diff changeset
1240 return vec;
86786d090e11 Introduce and use sws_allocVec().
ramiro
parents: 29493
diff changeset
1241 }
86786d090e11 Introduce and use sws_allocVec().
ramiro
parents: 29493
diff changeset
1242
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1243 SwsVector *sws_getGaussianVec(double variance, double quality)
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1244 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1245 const int length= (int)(variance*quality + 0.5) | 1;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1246 int i;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1247 double middle= (length-1)*0.5;
29494
86786d090e11 Introduce and use sws_allocVec().
ramiro
parents: 29493
diff changeset
1248 SwsVector *vec= sws_allocVec(length);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1249
29501
a0ba51e33912 Check return values of sws_allocVec() and sws_getConstVec().
ramiro
parents: 29494
diff changeset
1250 if (!vec)
a0ba51e33912 Check return values of sws_allocVec() and sws_getConstVec().
ramiro
parents: 29494
diff changeset
1251 return NULL;
a0ba51e33912 Check return values of sws_allocVec() and sws_getConstVec().
ramiro
parents: 29494
diff changeset
1252
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1253 for (i=0; i<length; i++) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1254 double dist= i-middle;
30370
a8c94e9dc653 Don't redefine M_PI. It is already defined from libavutil/mathematics.h.
ramiro
parents: 30369
diff changeset
1255 vec->coeff[i]= exp(-dist*dist/(2*variance*variance)) / sqrt(2*variance*M_PI);
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1256 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1257
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1258 sws_normalizeVec(vec, 1.0);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1259
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1260 return vec;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1261 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1262
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1263 SwsVector *sws_getConstVec(double c, int length)
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1264 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1265 int i;
29494
86786d090e11 Introduce and use sws_allocVec().
ramiro
parents: 29493
diff changeset
1266 SwsVector *vec= sws_allocVec(length);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1267
29501
a0ba51e33912 Check return values of sws_allocVec() and sws_getConstVec().
ramiro
parents: 29494
diff changeset
1268 if (!vec)
a0ba51e33912 Check return values of sws_allocVec() and sws_getConstVec().
ramiro
parents: 29494
diff changeset
1269 return NULL;
a0ba51e33912 Check return values of sws_allocVec() and sws_getConstVec().
ramiro
parents: 29494
diff changeset
1270
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1271 for (i=0; i<length; i++)
29494
86786d090e11 Introduce and use sws_allocVec().
ramiro
parents: 29493
diff changeset
1272 vec->coeff[i]= c;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1273
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1274 return vec;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1275 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1276
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1277 SwsVector *sws_getIdentityVec(void)
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1278 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1279 return sws_getConstVec(1.0, 1);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1280 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1281
30745
c5a49657b3e4 Make sws_dcVec static: It is only used inside libswscale/utils.c.
cehoyos
parents: 30688
diff changeset
1282 static double sws_dcVec(SwsVector *a)
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1283 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1284 int i;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1285 double sum=0;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1286
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1287 for (i=0; i<a->length; i++)
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1288 sum+= a->coeff[i];
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1289
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1290 return sum;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1291 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1292
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1293 void sws_scaleVec(SwsVector *a, double scalar)
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1294 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1295 int i;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1296
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1297 for (i=0; i<a->length; i++)
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1298 a->coeff[i]*= scalar;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1299 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1300
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1301 void sws_normalizeVec(SwsVector *a, double height)
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1302 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1303 sws_scaleVec(a, height/sws_dcVec(a));
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1304 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1305
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1306 static SwsVector *sws_getConvVec(SwsVector *a, SwsVector *b)
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1307 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1308 int length= a->length + b->length - 1;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1309 int i, j;
29493
335da85c454c Reuse sws_getConstVec() where possible.
ramiro
parents: 29481
diff changeset
1310 SwsVector *vec= sws_getConstVec(0.0, length);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1311
29501
a0ba51e33912 Check return values of sws_allocVec() and sws_getConstVec().
ramiro
parents: 29494
diff changeset
1312 if (!vec)
a0ba51e33912 Check return values of sws_allocVec() and sws_getConstVec().
ramiro
parents: 29494
diff changeset
1313 return NULL;
a0ba51e33912 Check return values of sws_allocVec() and sws_getConstVec().
ramiro
parents: 29494
diff changeset
1314
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1315 for (i=0; i<a->length; i++) {
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1316 for (j=0; j<b->length; j++) {
29493
335da85c454c Reuse sws_getConstVec() where possible.
ramiro
parents: 29481
diff changeset
1317 vec->coeff[i+j]+= a->coeff[i]*b->coeff[j];
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1318 }
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1319 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1320
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1321 return vec;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1322 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1323
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1324 static SwsVector *sws_sumVec(SwsVector *a, SwsVector *b)
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1325 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1326 int length= FFMAX(a->length, b->length);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1327 int i;
29493
335da85c454c Reuse sws_getConstVec() where possible.
ramiro
parents: 29481
diff changeset
1328 SwsVector *vec= sws_getConstVec(0.0, length);
335da85c454c Reuse sws_getConstVec() where possible.
ramiro
parents: 29481
diff changeset
1329
29501
a0ba51e33912 Check return values of sws_allocVec() and sws_getConstVec().
ramiro
parents: 29494
diff changeset
1330 if (!vec)
a0ba51e33912 Check return values of sws_allocVec() and sws_getConstVec().
ramiro
parents: 29494
diff changeset
1331 return NULL;
a0ba51e33912 Check return values of sws_allocVec() and sws_getConstVec().
ramiro
parents: 29494
diff changeset
1332
29493
335da85c454c Reuse sws_getConstVec() where possible.
ramiro
parents: 29481
diff changeset
1333 for (i=0; i<a->length; i++) vec->coeff[i + (length-1)/2 - (a->length-1)/2]+= a->coeff[i];
335da85c454c Reuse sws_getConstVec() where possible.
ramiro
parents: 29481
diff changeset
1334 for (i=0; i<b->length; i++) vec->coeff[i + (length-1)/2 - (b->length-1)/2]+= b->coeff[i];
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1335
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1336 return vec;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1337 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1338
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1339 static SwsVector *sws_diffVec(SwsVector *a, SwsVector *b)
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1340 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1341 int length= FFMAX(a->length, b->length);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1342 int i;
29493
335da85c454c Reuse sws_getConstVec() where possible.
ramiro
parents: 29481
diff changeset
1343 SwsVector *vec= sws_getConstVec(0.0, length);
335da85c454c Reuse sws_getConstVec() where possible.
ramiro
parents: 29481
diff changeset
1344
29501
a0ba51e33912 Check return values of sws_allocVec() and sws_getConstVec().
ramiro
parents: 29494
diff changeset
1345 if (!vec)
a0ba51e33912 Check return values of sws_allocVec() and sws_getConstVec().
ramiro
parents: 29494
diff changeset
1346 return NULL;
a0ba51e33912 Check return values of sws_allocVec() and sws_getConstVec().
ramiro
parents: 29494
diff changeset
1347
29493
335da85c454c Reuse sws_getConstVec() where possible.
ramiro
parents: 29481
diff changeset
1348 for (i=0; i<a->length; i++) vec->coeff[i + (length-1)/2 - (a->length-1)/2]+= a->coeff[i];
335da85c454c Reuse sws_getConstVec() where possible.
ramiro
parents: 29481
diff changeset
1349 for (i=0; i<b->length; i++) vec->coeff[i + (length-1)/2 - (b->length-1)/2]-= b->coeff[i];
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1350
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1351 return vec;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1352 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1353
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1354 /* shift left / or right if "shift" is negative */
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1355 static SwsVector *sws_getShiftedVec(SwsVector *a, int shift)
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1356 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1357 int length= a->length + FFABS(shift)*2;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1358 int i;
29493
335da85c454c Reuse sws_getConstVec() where possible.
ramiro
parents: 29481
diff changeset
1359 SwsVector *vec= sws_getConstVec(0.0, length);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1360
29501
a0ba51e33912 Check return values of sws_allocVec() and sws_getConstVec().
ramiro
parents: 29494
diff changeset
1361 if (!vec)
a0ba51e33912 Check return values of sws_allocVec() and sws_getConstVec().
ramiro
parents: 29494
diff changeset
1362 return NULL;
a0ba51e33912 Check return values of sws_allocVec() and sws_getConstVec().
ramiro
parents: 29494
diff changeset
1363
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1364 for (i=0; i<a->length; i++) {
29493
335da85c454c Reuse sws_getConstVec() where possible.
ramiro
parents: 29481
diff changeset
1365 vec->coeff[i + (length-1)/2 - (a->length-1)/2 - shift]= a->coeff[i];
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1366 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1367
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1368 return vec;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1369 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1370
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1371 void sws_shiftVec(SwsVector *a, int shift)
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1372 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1373 SwsVector *shifted= sws_getShiftedVec(a, shift);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1374 av_free(a->coeff);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1375 a->coeff= shifted->coeff;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1376 a->length= shifted->length;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1377 av_free(shifted);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1378 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1379
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1380 void sws_addVec(SwsVector *a, SwsVector *b)
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1381 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1382 SwsVector *sum= sws_sumVec(a, b);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1383 av_free(a->coeff);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1384 a->coeff= sum->coeff;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1385 a->length= sum->length;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1386 av_free(sum);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1387 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1388
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1389 void sws_subVec(SwsVector *a, SwsVector *b)
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1390 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1391 SwsVector *diff= sws_diffVec(a, b);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1392 av_free(a->coeff);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1393 a->coeff= diff->coeff;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1394 a->length= diff->length;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1395 av_free(diff);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1396 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1397
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1398 void sws_convVec(SwsVector *a, SwsVector *b)
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1399 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1400 SwsVector *conv= sws_getConvVec(a, b);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1401 av_free(a->coeff);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1402 a->coeff= conv->coeff;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1403 a->length= conv->length;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1404 av_free(conv);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1405 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1406
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1407 SwsVector *sws_cloneVec(SwsVector *a)
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1408 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1409 int i;
29494
86786d090e11 Introduce and use sws_allocVec().
ramiro
parents: 29493
diff changeset
1410 SwsVector *vec= sws_allocVec(a->length);
86786d090e11 Introduce and use sws_allocVec().
ramiro
parents: 29493
diff changeset
1411
29501
a0ba51e33912 Check return values of sws_allocVec() and sws_getConstVec().
ramiro
parents: 29494
diff changeset
1412 if (!vec)
a0ba51e33912 Check return values of sws_allocVec() and sws_getConstVec().
ramiro
parents: 29494
diff changeset
1413 return NULL;
a0ba51e33912 Check return values of sws_allocVec() and sws_getConstVec().
ramiro
parents: 29494
diff changeset
1414
29494
86786d090e11 Introduce and use sws_allocVec().
ramiro
parents: 29493
diff changeset
1415 for (i=0; i<a->length; i++) vec->coeff[i]= a->coeff[i];
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1416
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1417 return vec;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1418 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1419
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1420 void sws_printVec2(SwsVector *a, AVClass *log_ctx, int log_level)
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1421 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1422 int i;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1423 double max=0;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1424 double min=0;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1425 double range;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1426
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1427 for (i=0; i<a->length; i++)
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1428 if (a->coeff[i]>max) max= a->coeff[i];
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1429
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1430 for (i=0; i<a->length; i++)
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1431 if (a->coeff[i]<min) min= a->coeff[i];
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1432
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1433 range= max - min;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1434
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1435 for (i=0; i<a->length; i++) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1436 int x= (int)((a->coeff[i]-min)*60.0/range +0.5);
28531
a14b65e14dc9 Implement sws_printVec2() and deprecate sws_printVec().
stefano
parents: 28520
diff changeset
1437 av_log(log_ctx, log_level, "%1.3f ", a->coeff[i]);
a14b65e14dc9 Implement sws_printVec2() and deprecate sws_printVec().
stefano
parents: 28520
diff changeset
1438 for (;x>0; x--) av_log(log_ctx, log_level, " ");
a14b65e14dc9 Implement sws_printVec2() and deprecate sws_printVec().
stefano
parents: 28520
diff changeset
1439 av_log(log_ctx, log_level, "|\n");
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1440 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1441 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1442
28531
a14b65e14dc9 Implement sws_printVec2() and deprecate sws_printVec().
stefano
parents: 28520
diff changeset
1443 #if LIBSWSCALE_VERSION_MAJOR < 1
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1444 void sws_printVec(SwsVector *a)
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1445 {
28531
a14b65e14dc9 Implement sws_printVec2() and deprecate sws_printVec().
stefano
parents: 28520
diff changeset
1446 sws_printVec2(a, NULL, AV_LOG_DEBUG);
a14b65e14dc9 Implement sws_printVec2() and deprecate sws_printVec().
stefano
parents: 28520
diff changeset
1447 }
a14b65e14dc9 Implement sws_printVec2() and deprecate sws_printVec().
stefano
parents: 28520
diff changeset
1448 #endif
a14b65e14dc9 Implement sws_printVec2() and deprecate sws_printVec().
stefano
parents: 28520
diff changeset
1449
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1450 void sws_freeVec(SwsVector *a)
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1451 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1452 if (!a) return;
27299
4e57d47ee5db Cleanup, use av_freep() instead of av_free(x); x=NULL
michael
parents: 27286
diff changeset
1453 av_freep(&a->coeff);
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1454 a->length=0;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1455 av_free(a);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1456 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1457
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1458 void sws_freeFilter(SwsFilter *filter)
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1459 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1460 if (!filter) return;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1461
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1462 if (filter->lumH) sws_freeVec(filter->lumH);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1463 if (filter->lumV) sws_freeVec(filter->lumV);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1464 if (filter->chrH) sws_freeVec(filter->chrH);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1465 if (filter->chrV) sws_freeVec(filter->chrV);
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1466 av_free(filter);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1467 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1468
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1469 void sws_freeContext(SwsContext *c)
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1470 {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1471 int i;
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1472 if (!c) return;
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1473
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1474 if (c->lumPixBuf) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1475 for (i=0; i<c->vLumBufSize; i++)
27299
4e57d47ee5db Cleanup, use av_freep() instead of av_free(x); x=NULL
michael
parents: 27286
diff changeset
1476 av_freep(&c->lumPixBuf[i]);
4e57d47ee5db Cleanup, use av_freep() instead of av_free(x); x=NULL
michael
parents: 27286
diff changeset
1477 av_freep(&c->lumPixBuf);
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1478 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1479
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1480 if (c->chrPixBuf) {
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1481 for (i=0; i<c->vChrBufSize; i++)
27299
4e57d47ee5db Cleanup, use av_freep() instead of av_free(x); x=NULL
michael
parents: 27286
diff changeset
1482 av_freep(&c->chrPixBuf[i]);
4e57d47ee5db Cleanup, use av_freep() instead of av_free(x); x=NULL
michael
parents: 27286
diff changeset
1483 av_freep(&c->chrPixBuf);
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1484 }
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1485
29481
c080f1f5c07e Cosmetics:
ramiro
parents: 29480
diff changeset
1486 if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) {
28976
602c77c53923 Add alpha channel scaling
sdrik
parents: 28974
diff changeset
1487 for (i=0; i<c->vLumBufSize; i++)
602c77c53923 Add alpha channel scaling
sdrik
parents: 28974
diff changeset
1488 av_freep(&c->alpPixBuf[i]);
602c77c53923 Add alpha channel scaling
sdrik
parents: 28974
diff changeset
1489 av_freep(&c->alpPixBuf);
602c77c53923 Add alpha channel scaling
sdrik
parents: 28974
diff changeset
1490 }
602c77c53923 Add alpha channel scaling
sdrik
parents: 28974
diff changeset
1491
27299
4e57d47ee5db Cleanup, use av_freep() instead of av_free(x); x=NULL
michael
parents: 27286
diff changeset
1492 av_freep(&c->vLumFilter);
4e57d47ee5db Cleanup, use av_freep() instead of av_free(x); x=NULL
michael
parents: 27286
diff changeset
1493 av_freep(&c->vChrFilter);
4e57d47ee5db Cleanup, use av_freep() instead of av_free(x); x=NULL
michael
parents: 27286
diff changeset
1494 av_freep(&c->hLumFilter);
4e57d47ee5db Cleanup, use av_freep() instead of av_free(x); x=NULL
michael
parents: 27286
diff changeset
1495 av_freep(&c->hChrFilter);
30912
f91ad62a2281 AltiVec implies a PPC CPU, so there is no need to check for both.
diego
parents: 30910
diff changeset
1496 #if HAVE_ALTIVEC
27299
4e57d47ee5db Cleanup, use av_freep() instead of av_free(x); x=NULL
michael
parents: 27286
diff changeset
1497 av_freep(&c->vYCoeffsBank);
4e57d47ee5db Cleanup, use av_freep() instead of av_free(x); x=NULL
michael
parents: 27286
diff changeset
1498 av_freep(&c->vCCoeffsBank);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1499 #endif
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1500
27299
4e57d47ee5db Cleanup, use av_freep() instead of av_free(x); x=NULL
michael
parents: 27286
diff changeset
1501 av_freep(&c->vLumFilterPos);
4e57d47ee5db Cleanup, use av_freep() instead of av_free(x); x=NULL
michael
parents: 27286
diff changeset
1502 av_freep(&c->vChrFilterPos);
4e57d47ee5db Cleanup, use av_freep() instead of av_free(x); x=NULL
michael
parents: 27286
diff changeset
1503 av_freep(&c->hLumFilterPos);
4e57d47ee5db Cleanup, use av_freep() instead of av_free(x); x=NULL
michael
parents: 27286
diff changeset
1504 av_freep(&c->hChrFilterPos);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1505
30923
0be6ed163321 libswscale: Relicense almost all x86 assembler optimizations as LGPL.
diego
parents: 30912
diff changeset
1506 #if ARCH_X86
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1507 #ifdef MAP_ANONYMOUS
29468
947a942221c4 MMX2 horizontal scaler: Determine code size at runtime.
ramiro
parents: 29467
diff changeset
1508 if (c->lumMmx2FilterCode) munmap(c->lumMmx2FilterCode, c->lumMmx2FilterCodeSize);
947a942221c4 MMX2 horizontal scaler: Determine code size at runtime.
ramiro
parents: 29467
diff changeset
1509 if (c->chrMmx2FilterCode) munmap(c->chrMmx2FilterCode, c->chrMmx2FilterCodeSize);
28971
b8e356a9dbb1 Allocate executable memory with VirtualAlloc() in Windows.
ramiro
parents: 28970
diff changeset
1510 #elif HAVE_VIRTUALALLOC
30821
d59dfdf82fca Fix memleak due to incorrect VirtualFree arguments: size must be 0 for MEM_RELEASE.
reimar
parents: 30814
diff changeset
1511 if (c->lumMmx2FilterCode) VirtualFree(c->lumMmx2FilterCode, 0, MEM_RELEASE);
d59dfdf82fca Fix memleak due to incorrect VirtualFree arguments: size must be 0 for MEM_RELEASE.
reimar
parents: 30814
diff changeset
1512 if (c->chrMmx2FilterCode) VirtualFree(c->chrMmx2FilterCode, 0, MEM_RELEASE);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1513 #else
29465
45e78d49e493 Rename "funny" code to "mmx2 filter" code.
ramiro
parents: 29442
diff changeset
1514 av_free(c->lumMmx2FilterCode);
45e78d49e493 Rename "funny" code to "mmx2 filter" code.
ramiro
parents: 29442
diff changeset
1515 av_free(c->chrMmx2FilterCode);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1516 #endif
29465
45e78d49e493 Rename "funny" code to "mmx2 filter" code.
ramiro
parents: 29442
diff changeset
1517 c->lumMmx2FilterCode=NULL;
45e78d49e493 Rename "funny" code to "mmx2 filter" code.
ramiro
parents: 29442
diff changeset
1518 c->chrMmx2FilterCode=NULL;
30923
0be6ed163321 libswscale: Relicense almost all x86 assembler optimizations as LGPL.
diego
parents: 30912
diff changeset
1519 #endif /* ARCH_X86 */
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1520
27299
4e57d47ee5db Cleanup, use av_freep() instead of av_free(x); x=NULL
michael
parents: 27286
diff changeset
1521 av_freep(&c->yuvTable);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1522
23155
1befc8d767cd cosmetics attack, part II: Remove all tabs and prettyprint/reindent the code.
diego
parents: 23129
diff changeset
1523 av_free(c);
18861
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1524 }
8579acff875e Move postproc ---> libswscale
lucabe
parents:
diff changeset
1525
19661
7b24faac56fd Add sws_getCachedContext(), which checks if context is valid or reallocs a new one instead.
gpoirier
parents: 19594
diff changeset
1526 struct SwsContext *sws_getCachedContext(struct SwsContext *context,
27695
9cf6c7c5c7cd Change variable types from int to enum PixelFormat.
cehoyos
parents: 27686
diff changeset
1527 int srcW, int srcH, enum PixelFormat srcFormat,
9cf6c7c5c7cd Change variable types from int to enum PixelFormat.
cehoyos
parents: 27686
diff changeset
1528 int dstW, int dstH, enum PixelFormat dstFormat, int flags,
29246
8861e08033eb Add const qualifier to param argument of sws_getContext() and
diego
parents: 29245
diff changeset
1529 SwsFilter *srcFilter, SwsFilter *dstFilter, const double *param)
19661
7b24faac56fd Add sws_getCachedContext(), which checks if context is valid or reallocs a new one instead.
gpoirier
parents: 19594
diff changeset
1530 {
25747
12970064a271 Check param in sws_getCachedContext().
benoit
parents: 25457
diff changeset
1531 static const double default_param[2] = {SWS_PARAM_DEFAULT, SWS_PARAM_DEFAULT};
12970064a271 Check param in sws_getCachedContext().
benoit
parents: 25457
diff changeset
1532
12970064a271 Check param in sws_getCachedContext().
benoit
parents: 25457
diff changeset
1533 if (!param)
12970064a271 Check param in sws_getCachedContext().
benoit
parents: 25457
diff changeset
1534 param = default_param;
12970064a271 Check param in sws_getCachedContext().
benoit
parents: 25457
diff changeset
1535
31968
5c9310a4d2e9 swscale: also update flags on sws_getCachedContext()
ramiro
parents: 31903
diff changeset
1536 flags = update_flags_cpu(flags);
5c9310a4d2e9 swscale: also update flags on sws_getCachedContext()
ramiro
parents: 31903
diff changeset
1537
30599
7c1fea45bfc8 Merge two if conditions, allow to decrese the level of indentation of
stefano
parents: 30478
diff changeset
1538 if (context &&
30600
e2935c75f1aa Vertically align a list of comparisons in sws_getCachedContext().
stefano
parents: 30599
diff changeset
1539 (context->srcW != srcW ||
e2935c75f1aa Vertically align a list of comparisons in sws_getCachedContext().
stefano
parents: 30599
diff changeset
1540 context->srcH != srcH ||
e2935c75f1aa Vertically align a list of comparisons in sws_getCachedContext().
stefano
parents: 30599
diff changeset
1541 context->srcFormat != srcFormat ||
e2935c75f1aa Vertically align a list of comparisons in sws_getCachedContext().
stefano
parents: 30599
diff changeset
1542 context->dstW != dstW ||
e2935c75f1aa Vertically align a list of comparisons in sws_getCachedContext().
stefano
parents: 30599
diff changeset
1543 context->dstH != dstH ||
e2935c75f1aa Vertically align a list of comparisons in sws_getCachedContext().
stefano
parents: 30599
diff changeset
1544 context->dstFormat != dstFormat ||
e2935c75f1aa Vertically align a list of comparisons in sws_getCachedContext().
stefano
parents: 30599
diff changeset
1545 context->flags != flags ||
e2935c75f1aa Vertically align a list of comparisons in sws_getCachedContext().
stefano
parents: 30599
diff changeset
1546 context->param[0] != param[0] ||
30601
d568b8b857ca Reindent and fix brace placement.
stefano
parents: 30600
diff changeset
1547 context->param[1] != param[1])) {
d568b8b857ca Reindent and fix brace placement.
stefano
parents: 30600
diff changeset
1548 sws_freeContext(context);
d568b8b857ca Reindent and fix brace placement.
stefano
parents: 30600
diff changeset
1549 context = NULL;
d568b8b857ca Reindent and fix brace placement.
stefano
parents: 30600
diff changeset
1550 }
30599
7c1fea45bfc8 Merge two if conditions, allow to decrese the level of indentation of
stefano
parents: 30478
diff changeset
1551
25752
559b0e9d47fb Change (a == NULL) condition to (!a) and (a != NULL) condition to (a).
benoit
parents: 25750
diff changeset
1552 if (!context) {
32315
549b1ad3f777 Deprecate sws_getContext(), use sws_alloc_context() and
stefano
parents: 32308
diff changeset
1553 if (!(context = sws_alloc_context()))
549b1ad3f777 Deprecate sws_getContext(), use sws_alloc_context() and
stefano
parents: 32308
diff changeset
1554 return NULL;
549b1ad3f777 Deprecate sws_getContext(), use sws_alloc_context() and
stefano
parents: 32308
diff changeset
1555 context->srcW = srcW;
549b1ad3f777 Deprecate sws_getContext(), use sws_alloc_context() and
stefano
parents: 32308
diff changeset
1556 context->srcH = srcH;
549b1ad3f777 Deprecate sws_getContext(), use sws_alloc_context() and
stefano
parents: 32308
diff changeset
1557 context->srcFormat = srcFormat;
549b1ad3f777 Deprecate sws_getContext(), use sws_alloc_context() and
stefano
parents: 32308
diff changeset
1558 context->dstFormat = dstFormat;
549b1ad3f777 Deprecate sws_getContext(), use sws_alloc_context() and
stefano
parents: 32308
diff changeset
1559 context->flags = flags;
549b1ad3f777 Deprecate sws_getContext(), use sws_alloc_context() and
stefano
parents: 32308
diff changeset
1560 context->param[0] = param[0];
549b1ad3f777 Deprecate sws_getContext(), use sws_alloc_context() and
stefano
parents: 32308
diff changeset
1561 context->param[1] = param[1];
549b1ad3f777 Deprecate sws_getContext(), use sws_alloc_context() and
stefano
parents: 32308
diff changeset
1562 if (sws_init_context(context, srcFilter, dstFilter) < 0) {
549b1ad3f777 Deprecate sws_getContext(), use sws_alloc_context() and
stefano
parents: 32308
diff changeset
1563 sws_freeContext(context);
549b1ad3f777 Deprecate sws_getContext(), use sws_alloc_context() and
stefano
parents: 32308
diff changeset
1564 return NULL;
549b1ad3f777 Deprecate sws_getContext(), use sws_alloc_context() and
stefano
parents: 32308
diff changeset
1565 }
19661
7b24faac56fd Add sws_getCachedContext(), which checks if context is valid or reallocs a new one instead.
gpoirier
parents: 19594
diff changeset
1566 }
7b24faac56fd Add sws_getCachedContext(), which checks if context is valid or reallocs a new one instead.
gpoirier
parents: 19594
diff changeset
1567 return context;
7b24faac56fd Add sws_getCachedContext(), which checks if context is valid or reallocs a new one instead.
gpoirier
parents: 19594
diff changeset
1568 }
7b24faac56fd Add sws_getCachedContext(), which checks if context is valid or reallocs a new one instead.
gpoirier
parents: 19594
diff changeset
1569