annotate imgresample.c @ 8631:2d7269e13a8d libavcodec

Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can be used by video players. Original patch by NVIDIA corporation.
author cehoyos
date Tue, 20 Jan 2009 09:28:36 +0000
parents 04423b2f6e0b
children e9d9d946f213
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1 /*
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
2 * High quality image resampling with polyphase filters
8629
04423b2f6e0b cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 8590
diff changeset
3 * Copyright (c) 2001 Fabrice Bellard
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3589
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3589
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3589
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
429
718a22dc121f license/copyright change
glantau
parents: 412
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
718a22dc121f license/copyright change
glantau
parents: 412
diff changeset
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3589
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3589
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
429
718a22dc121f license/copyright change
glantau
parents: 412
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
718a22dc121f license/copyright change
glantau
parents: 412
diff changeset
15 * Lesser General Public License for more details.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
16 *
429
718a22dc121f license/copyright change
glantau
parents: 412
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3589
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2979
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
20 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
21
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
22 /**
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
23 * @file imgresample.c
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
24 * High quality image resampling with polyphase filters .
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
25 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
26
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 18
diff changeset
27 #include "avcodec.h"
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
28 #include "dsputil.h"
8313
2eaafc02cd3d Add img_convert() to imgconvert.h and #include it from imgresample.c.
diego
parents: 8104
diff changeset
29 #include "imgconvert.h"
6764
7829c158c1c4 Add missing path to #include statement.
diego
parents: 6464
diff changeset
30 #include "libswscale/swscale.h"
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
31
8590
7a463923ecd1 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 8430
diff changeset
32 #if HAVE_ALTIVEC
5750
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents: 5187
diff changeset
33 #include "ppc/imgresample_altivec.h"
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents: 5187
diff changeset
34 #endif
09f99af1db40 Sanitize altivec code so it can be built with runtime check properly
lu_zero
parents: 5187
diff changeset
35
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
36 #define NB_COMPONENTS 3
986e461dc072 Initial revision
glantau
parents:
diff changeset
37
986e461dc072 Initial revision
glantau
parents:
diff changeset
38 #define PHASE_BITS 4
986e461dc072 Initial revision
glantau
parents:
diff changeset
39 #define NB_PHASES (1 << PHASE_BITS)
986e461dc072 Initial revision
glantau
parents:
diff changeset
40 #define NB_TAPS 4
986e461dc072 Initial revision
glantau
parents:
diff changeset
41 #define FCENTER 1 /* index of the center of the filter */
630
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
42 //#define TEST 1 /* Test it */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
43
986e461dc072 Initial revision
glantau
parents:
diff changeset
44 #define POS_FRAC_BITS 16
986e461dc072 Initial revision
glantau
parents:
diff changeset
45 #define POS_FRAC (1 << POS_FRAC_BITS)
986e461dc072 Initial revision
glantau
parents:
diff changeset
46 /* 6 bits precision is needed for MMX */
986e461dc072 Initial revision
glantau
parents:
diff changeset
47 #define FILTER_BITS 8
986e461dc072 Initial revision
glantau
parents:
diff changeset
48
986e461dc072 Initial revision
glantau
parents:
diff changeset
49 #define LINE_BUF_HEIGHT (NB_TAPS * 4)
986e461dc072 Initial revision
glantau
parents:
diff changeset
50
4065
93163e2a2398 Do not use a fake libavcodec/swscale.h, but always use the real one
lucabe
parents: 4036
diff changeset
51 struct SwsContext {
6464
0c3cc1d7a0b3 Make av_class a pointer to a const AVClass. Addresses one warning in
takis
parents: 6434
diff changeset
52 const AVClass *av_class;
4065
93163e2a2398 Do not use a fake libavcodec/swscale.h, but always use the real one
lucabe
parents: 4036
diff changeset
53 struct ImgReSampleContext *resampling_ctx;
93163e2a2398 Do not use a fake libavcodec/swscale.h, but always use the real one
lucabe
parents: 4036
diff changeset
54 enum PixelFormat src_pix_fmt, dst_pix_fmt;
93163e2a2398 Do not use a fake libavcodec/swscale.h, but always use the real one
lucabe
parents: 4036
diff changeset
55 };
93163e2a2398 Do not use a fake libavcodec/swscale.h, but always use the real one
lucabe
parents: 4036
diff changeset
56
7823
4525dcd81357 Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 6974
diff changeset
57 typedef struct ImgReSampleContext {
1928
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
58 int iwidth, iheight, owidth, oheight;
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
59 int topBand, bottomBand, leftBand, rightBand;
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
60 int padtop, padbottom, padleft, padright;
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
61 int pad_owidth, pad_oheight;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
62 int h_incr, v_incr;
3089
072dbc669253 MSVC-compatible __align8/__align16 declaration
diego
parents: 3036
diff changeset
63 DECLARE_ALIGNED_8(int16_t, h_filters[NB_PHASES][NB_TAPS]); /* horizontal filters */
072dbc669253 MSVC-compatible __align8/__align16 declaration
diego
parents: 3036
diff changeset
64 DECLARE_ALIGNED_8(int16_t, v_filters[NB_PHASES][NB_TAPS]); /* vertical filters */
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
65 uint8_t *line_buf;
7823
4525dcd81357 Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 6974
diff changeset
66 } ImgReSampleContext;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
67
2082
3dc9bbe1b152 polyphase kaiser windowed sinc and blackman nuttall windowed sinc audio resample filters
michael
parents: 2064
diff changeset
68 void av_build_filter(int16_t *filter, double factor, int tap_count, int phase_count, int scale, int type);
3dc9bbe1b152 polyphase kaiser windowed sinc and blackman nuttall windowed sinc audio resample filters
michael
parents: 2064
diff changeset
69
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
70 static inline int get_phase(int pos)
986e461dc072 Initial revision
glantau
parents:
diff changeset
71 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
72 return ((pos) >> (POS_FRAC_BITS - PHASE_BITS)) & ((1 << PHASE_BITS) - 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
73 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
74
986e461dc072 Initial revision
glantau
parents:
diff changeset
75 /* This function must be optimized */
1488
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
76 static void h_resample_fast(uint8_t *dst, int dst_width, const uint8_t *src,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
77 int src_width, int src_start, int src_incr,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
78 int16_t *filters)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
79 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
80 int src_pos, phase, sum, i;
1488
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
81 const uint8_t *s;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
82 int16_t *filter;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
83
986e461dc072 Initial revision
glantau
parents:
diff changeset
84 src_pos = src_start;
986e461dc072 Initial revision
glantau
parents:
diff changeset
85 for(i=0;i<dst_width;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
86 #ifdef TEST
986e461dc072 Initial revision
glantau
parents:
diff changeset
87 /* test */
986e461dc072 Initial revision
glantau
parents:
diff changeset
88 if ((src_pos >> POS_FRAC_BITS) < 0 ||
986e461dc072 Initial revision
glantau
parents:
diff changeset
89 (src_pos >> POS_FRAC_BITS) > (src_width - NB_TAPS))
653
714795876872 Change abort() calls to av_abort() calls.
philipjsg
parents: 644
diff changeset
90 av_abort();
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
91 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
92 s = src + (src_pos >> POS_FRAC_BITS);
986e461dc072 Initial revision
glantau
parents:
diff changeset
93 phase = get_phase(src_pos);
986e461dc072 Initial revision
glantau
parents:
diff changeset
94 filter = filters + phase * NB_TAPS;
986e461dc072 Initial revision
glantau
parents:
diff changeset
95 #if NB_TAPS == 4
986e461dc072 Initial revision
glantau
parents:
diff changeset
96 sum = s[0] * filter[0] +
986e461dc072 Initial revision
glantau
parents:
diff changeset
97 s[1] * filter[1] +
986e461dc072 Initial revision
glantau
parents:
diff changeset
98 s[2] * filter[2] +
986e461dc072 Initial revision
glantau
parents:
diff changeset
99 s[3] * filter[3];
986e461dc072 Initial revision
glantau
parents:
diff changeset
100 #else
986e461dc072 Initial revision
glantau
parents:
diff changeset
101 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
102 int j;
986e461dc072 Initial revision
glantau
parents:
diff changeset
103 sum = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
104 for(j=0;j<NB_TAPS;j++)
986e461dc072 Initial revision
glantau
parents:
diff changeset
105 sum += s[j] * filter[j];
986e461dc072 Initial revision
glantau
parents:
diff changeset
106 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
107 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
108 sum = sum >> FILTER_BITS;
986e461dc072 Initial revision
glantau
parents:
diff changeset
109 if (sum < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
110 sum = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
111 else if (sum > 255)
986e461dc072 Initial revision
glantau
parents:
diff changeset
112 sum = 255;
986e461dc072 Initial revision
glantau
parents:
diff changeset
113 dst[0] = sum;
986e461dc072 Initial revision
glantau
parents:
diff changeset
114 src_pos += src_incr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
115 dst++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
116 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
117 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
118
986e461dc072 Initial revision
glantau
parents:
diff changeset
119 /* This function must be optimized */
1488
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
120 static void v_resample(uint8_t *dst, int dst_width, const uint8_t *src,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
121 int wrap, int16_t *filter)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
122 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
123 int sum, i;
1488
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
124 const uint8_t *s;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
125
986e461dc072 Initial revision
glantau
parents:
diff changeset
126 s = src;
986e461dc072 Initial revision
glantau
parents:
diff changeset
127 for(i=0;i<dst_width;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
128 #if NB_TAPS == 4
986e461dc072 Initial revision
glantau
parents:
diff changeset
129 sum = s[0 * wrap] * filter[0] +
986e461dc072 Initial revision
glantau
parents:
diff changeset
130 s[1 * wrap] * filter[1] +
986e461dc072 Initial revision
glantau
parents:
diff changeset
131 s[2 * wrap] * filter[2] +
986e461dc072 Initial revision
glantau
parents:
diff changeset
132 s[3 * wrap] * filter[3];
986e461dc072 Initial revision
glantau
parents:
diff changeset
133 #else
986e461dc072 Initial revision
glantau
parents:
diff changeset
134 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
135 int j;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
136 uint8_t *s1 = s;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
137
986e461dc072 Initial revision
glantau
parents:
diff changeset
138 sum = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
139 for(j=0;j<NB_TAPS;j++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
140 sum += s1[0] * filter[j];
986e461dc072 Initial revision
glantau
parents:
diff changeset
141 s1 += wrap;
986e461dc072 Initial revision
glantau
parents:
diff changeset
142 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
143 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
144 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
145 sum = sum >> FILTER_BITS;
986e461dc072 Initial revision
glantau
parents:
diff changeset
146 if (sum < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
147 sum = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
148 else if (sum > 255)
986e461dc072 Initial revision
glantau
parents:
diff changeset
149 sum = 255;
986e461dc072 Initial revision
glantau
parents:
diff changeset
150 dst[0] = sum;
986e461dc072 Initial revision
glantau
parents:
diff changeset
151 dst++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
152 s++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
153 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
154 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
155
8590
7a463923ecd1 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 8430
diff changeset
156 #if HAVE_MMX
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
157
8430
7768bdfd4f7b Rename libavcodec/i386/ --> libavcodec/x86/.
diego
parents: 8316
diff changeset
158 #include "x86/mmx.h"
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
159
986e461dc072 Initial revision
glantau
parents:
diff changeset
160 #define FILTER4(reg) \
986e461dc072 Initial revision
glantau
parents:
diff changeset
161 {\
986e461dc072 Initial revision
glantau
parents:
diff changeset
162 s = src + (src_pos >> POS_FRAC_BITS);\
986e461dc072 Initial revision
glantau
parents:
diff changeset
163 phase = get_phase(src_pos);\
986e461dc072 Initial revision
glantau
parents:
diff changeset
164 filter = filters + phase * NB_TAPS;\
986e461dc072 Initial revision
glantau
parents:
diff changeset
165 movq_m2r(*s, reg);\
986e461dc072 Initial revision
glantau
parents:
diff changeset
166 punpcklbw_r2r(mm7, reg);\
986e461dc072 Initial revision
glantau
parents:
diff changeset
167 movq_m2r(*filter, mm6);\
986e461dc072 Initial revision
glantau
parents:
diff changeset
168 pmaddwd_r2r(reg, mm6);\
986e461dc072 Initial revision
glantau
parents:
diff changeset
169 movq_r2r(mm6, reg);\
986e461dc072 Initial revision
glantau
parents:
diff changeset
170 psrlq_i2r(32, reg);\
986e461dc072 Initial revision
glantau
parents:
diff changeset
171 paddd_r2r(mm6, reg);\
986e461dc072 Initial revision
glantau
parents:
diff changeset
172 psrad_i2r(FILTER_BITS, reg);\
986e461dc072 Initial revision
glantau
parents:
diff changeset
173 src_pos += src_incr;\
986e461dc072 Initial revision
glantau
parents:
diff changeset
174 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
175
4122
daae66c03857 Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents: 4105
diff changeset
176 #define DUMP(reg) movq_r2m(reg, tmp); printf(#reg "=%016"PRIx64"\n", tmp.uq);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
177
986e461dc072 Initial revision
glantau
parents:
diff changeset
178 /* XXX: do four pixels at a time */
1488
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
179 static void h_resample_fast4_mmx(uint8_t *dst, int dst_width,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
180 const uint8_t *src, int src_width,
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
181 int src_start, int src_incr, int16_t *filters)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
182 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
183 int src_pos, phase;
1488
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
184 const uint8_t *s;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
185 int16_t *filter;
8316
589f9a71df95 Get rid of mmx_t.
aurel
parents: 8313
diff changeset
186 uint64_t tmp;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
187
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
188 src_pos = src_start;
986e461dc072 Initial revision
glantau
parents:
diff changeset
189 pxor_r2r(mm7, mm7);
986e461dc072 Initial revision
glantau
parents:
diff changeset
190
986e461dc072 Initial revision
glantau
parents:
diff changeset
191 while (dst_width >= 4) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
192
986e461dc072 Initial revision
glantau
parents:
diff changeset
193 FILTER4(mm0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
194 FILTER4(mm1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
195 FILTER4(mm2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
196 FILTER4(mm3);
986e461dc072 Initial revision
glantau
parents:
diff changeset
197
986e461dc072 Initial revision
glantau
parents:
diff changeset
198 packuswb_r2r(mm7, mm0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
199 packuswb_r2r(mm7, mm1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
200 packuswb_r2r(mm7, mm3);
986e461dc072 Initial revision
glantau
parents:
diff changeset
201 packuswb_r2r(mm7, mm2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
202 movq_r2m(mm0, tmp);
8316
589f9a71df95 Get rid of mmx_t.
aurel
parents: 8313
diff changeset
203 dst[0] = tmp & 0xFF;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
204 movq_r2m(mm1, tmp);
8316
589f9a71df95 Get rid of mmx_t.
aurel
parents: 8313
diff changeset
205 dst[1] = tmp & 0xFF;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
206 movq_r2m(mm2, tmp);
8316
589f9a71df95 Get rid of mmx_t.
aurel
parents: 8313
diff changeset
207 dst[2] = tmp & 0xFF;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
208 movq_r2m(mm3, tmp);
8316
589f9a71df95 Get rid of mmx_t.
aurel
parents: 8313
diff changeset
209 dst[3] = tmp & 0xFF;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
210 dst += 4;
986e461dc072 Initial revision
glantau
parents:
diff changeset
211 dst_width -= 4;
986e461dc072 Initial revision
glantau
parents:
diff changeset
212 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
213 while (dst_width > 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
214 FILTER4(mm0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
215 packuswb_r2r(mm7, mm0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
216 movq_r2m(mm0, tmp);
8316
589f9a71df95 Get rid of mmx_t.
aurel
parents: 8313
diff changeset
217 dst[0] = tmp & 0xFF;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
218 dst++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
219 dst_width--;
986e461dc072 Initial revision
glantau
parents:
diff changeset
220 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
221 emms();
986e461dc072 Initial revision
glantau
parents:
diff changeset
222 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
223
1488
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
224 static void v_resample4_mmx(uint8_t *dst, int dst_width, const uint8_t *src,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
225 int wrap, int16_t *filter)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
226 {
8316
589f9a71df95 Get rid of mmx_t.
aurel
parents: 8313
diff changeset
227 int sum, i;
1488
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
228 const uint8_t *s;
8316
589f9a71df95 Get rid of mmx_t.
aurel
parents: 8313
diff changeset
229 uint64_t tmp;
589f9a71df95 Get rid of mmx_t.
aurel
parents: 8313
diff changeset
230 uint64_t coefs[4];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
231
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
232 for(i=0;i<4;i++) {
8316
589f9a71df95 Get rid of mmx_t.
aurel
parents: 8313
diff changeset
233 tmp = filter[i];
589f9a71df95 Get rid of mmx_t.
aurel
parents: 8313
diff changeset
234 coefs[i] = (tmp<<48) + (tmp<<32) + (tmp<<16) + tmp;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
235 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
236
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
237 pxor_r2r(mm7, mm7);
986e461dc072 Initial revision
glantau
parents:
diff changeset
238 s = src;
986e461dc072 Initial revision
glantau
parents:
diff changeset
239 while (dst_width >= 4) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
240 movq_m2r(s[0 * wrap], mm0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
241 punpcklbw_r2r(mm7, mm0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
242 movq_m2r(s[1 * wrap], mm1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
243 punpcklbw_r2r(mm7, mm1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
244 movq_m2r(s[2 * wrap], mm2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
245 punpcklbw_r2r(mm7, mm2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
246 movq_m2r(s[3 * wrap], mm3);
986e461dc072 Initial revision
glantau
parents:
diff changeset
247 punpcklbw_r2r(mm7, mm3);
986e461dc072 Initial revision
glantau
parents:
diff changeset
248
986e461dc072 Initial revision
glantau
parents:
diff changeset
249 pmullw_m2r(coefs[0], mm0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
250 pmullw_m2r(coefs[1], mm1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
251 pmullw_m2r(coefs[2], mm2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
252 pmullw_m2r(coefs[3], mm3);
986e461dc072 Initial revision
glantau
parents:
diff changeset
253
986e461dc072 Initial revision
glantau
parents:
diff changeset
254 paddw_r2r(mm1, mm0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
255 paddw_r2r(mm3, mm2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
256 paddw_r2r(mm2, mm0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
257 psraw_i2r(FILTER_BITS, mm0);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
258
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
259 packuswb_r2r(mm7, mm0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
260 movq_r2m(mm0, tmp);
986e461dc072 Initial revision
glantau
parents:
diff changeset
261
8316
589f9a71df95 Get rid of mmx_t.
aurel
parents: 8313
diff changeset
262 *(uint32_t *)dst = tmp & 0xFFFFFFFF;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
263 dst += 4;
986e461dc072 Initial revision
glantau
parents:
diff changeset
264 s += 4;
986e461dc072 Initial revision
glantau
parents:
diff changeset
265 dst_width -= 4;
986e461dc072 Initial revision
glantau
parents:
diff changeset
266 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
267 while (dst_width > 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
268 sum = s[0 * wrap] * filter[0] +
986e461dc072 Initial revision
glantau
parents:
diff changeset
269 s[1 * wrap] * filter[1] +
986e461dc072 Initial revision
glantau
parents:
diff changeset
270 s[2 * wrap] * filter[2] +
986e461dc072 Initial revision
glantau
parents:
diff changeset
271 s[3 * wrap] * filter[3];
986e461dc072 Initial revision
glantau
parents:
diff changeset
272 sum = sum >> FILTER_BITS;
986e461dc072 Initial revision
glantau
parents:
diff changeset
273 if (sum < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
274 sum = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
275 else if (sum > 255)
986e461dc072 Initial revision
glantau
parents:
diff changeset
276 sum = 255;
986e461dc072 Initial revision
glantau
parents:
diff changeset
277 dst[0] = sum;
986e461dc072 Initial revision
glantau
parents:
diff changeset
278 dst++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
279 s++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
280 dst_width--;
986e461dc072 Initial revision
glantau
parents:
diff changeset
281 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
282 emms();
986e461dc072 Initial revision
glantau
parents:
diff changeset
283 }
5054
6e7e23b6615d Add explanatory comments to some #endifs.
diego
parents: 4624
diff changeset
284 #endif /* HAVE_MMX */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
285
5963
80103098c797 spelling
vitor
parents: 5750
diff changeset
286 /* slow version to handle limit cases. Does not need optimization */
1488
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
287 static void h_resample_slow(uint8_t *dst, int dst_width,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
288 const uint8_t *src, int src_width,
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
289 int src_start, int src_incr, int16_t *filters)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
290 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
291 int src_pos, phase, sum, j, v, i;
1488
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
292 const uint8_t *s, *src_end;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
293 int16_t *filter;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
294
986e461dc072 Initial revision
glantau
parents:
diff changeset
295 src_end = src + src_width;
986e461dc072 Initial revision
glantau
parents:
diff changeset
296 src_pos = src_start;
986e461dc072 Initial revision
glantau
parents:
diff changeset
297 for(i=0;i<dst_width;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
298 s = src + (src_pos >> POS_FRAC_BITS);
986e461dc072 Initial revision
glantau
parents:
diff changeset
299 phase = get_phase(src_pos);
986e461dc072 Initial revision
glantau
parents:
diff changeset
300 filter = filters + phase * NB_TAPS;
986e461dc072 Initial revision
glantau
parents:
diff changeset
301 sum = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
302 for(j=0;j<NB_TAPS;j++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
303 if (s < src)
986e461dc072 Initial revision
glantau
parents:
diff changeset
304 v = src[0];
986e461dc072 Initial revision
glantau
parents:
diff changeset
305 else if (s >= src_end)
986e461dc072 Initial revision
glantau
parents:
diff changeset
306 v = src_end[-1];
986e461dc072 Initial revision
glantau
parents:
diff changeset
307 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
308 v = s[0];
986e461dc072 Initial revision
glantau
parents:
diff changeset
309 sum += v * filter[j];
986e461dc072 Initial revision
glantau
parents:
diff changeset
310 s++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
311 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
312 sum = sum >> FILTER_BITS;
986e461dc072 Initial revision
glantau
parents:
diff changeset
313 if (sum < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
314 sum = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
315 else if (sum > 255)
986e461dc072 Initial revision
glantau
parents:
diff changeset
316 sum = 255;
986e461dc072 Initial revision
glantau
parents:
diff changeset
317 dst[0] = sum;
986e461dc072 Initial revision
glantau
parents:
diff changeset
318 src_pos += src_incr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
319 dst++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
320 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
321 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
322
1488
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
323 static void h_resample(uint8_t *dst, int dst_width, const uint8_t *src,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
324 int src_width, int src_start, int src_incr,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
325 int16_t *filters)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
326 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
327 int n, src_end;
986e461dc072 Initial revision
glantau
parents:
diff changeset
328
986e461dc072 Initial revision
glantau
parents:
diff changeset
329 if (src_start < 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
330 n = (0 - src_start + src_incr - 1) / src_incr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
331 h_resample_slow(dst, n, src, src_width, src_start, src_incr, filters);
986e461dc072 Initial revision
glantau
parents:
diff changeset
332 dst += n;
986e461dc072 Initial revision
glantau
parents:
diff changeset
333 dst_width -= n;
986e461dc072 Initial revision
glantau
parents:
diff changeset
334 src_start += n * src_incr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
335 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
336 src_end = src_start + dst_width * src_incr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
337 if (src_end > ((src_width - NB_TAPS) << POS_FRAC_BITS)) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
338 n = (((src_width - NB_TAPS + 1) << POS_FRAC_BITS) - 1 - src_start) /
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
339 src_incr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
340 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
341 n = dst_width;
986e461dc072 Initial revision
glantau
parents:
diff changeset
342 }
8590
7a463923ecd1 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 8430
diff changeset
343 #if HAVE_MMX
8104
0d108ec85620 Remove duplicated MM_* macros for CPU capabilities from dsputil.h.
rathann
parents: 8042
diff changeset
344 if ((mm_flags & FF_MM_MMX) && NB_TAPS == 4)
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
345 h_resample_fast4_mmx(dst, n,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
346 src, src_width, src_start, src_incr, filters);
986e461dc072 Initial revision
glantau
parents:
diff changeset
347 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
348 #endif
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
349 h_resample_fast(dst, n,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
350 src, src_width, src_start, src_incr, filters);
986e461dc072 Initial revision
glantau
parents:
diff changeset
351 if (n < dst_width) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
352 dst += n;
986e461dc072 Initial revision
glantau
parents:
diff changeset
353 dst_width -= n;
986e461dc072 Initial revision
glantau
parents:
diff changeset
354 src_start += n * src_incr;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
355 h_resample_slow(dst, dst_width,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
356 src, src_width, src_start, src_incr, filters);
986e461dc072 Initial revision
glantau
parents:
diff changeset
357 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
358 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
359
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
360 static void component_resample(ImgReSampleContext *s,
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
361 uint8_t *output, int owrap, int owidth, int oheight,
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
362 uint8_t *input, int iwrap, int iwidth, int iheight)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
363 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
364 int src_y, src_y1, last_src_y, ring_y, phase_y, y1, y;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
365 uint8_t *new_line, *src_line;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
366
986e461dc072 Initial revision
glantau
parents:
diff changeset
367 last_src_y = - FCENTER - 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
368 /* position of the bottom of the filter in the source image */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
369 src_y = (last_src_y + NB_TAPS) * POS_FRAC;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
370 ring_y = NB_TAPS; /* position in ring buffer */
986e461dc072 Initial revision
glantau
parents:
diff changeset
371 for(y=0;y<oheight;y++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
372 /* apply horizontal filter on new lines from input if needed */
986e461dc072 Initial revision
glantau
parents:
diff changeset
373 src_y1 = src_y >> POS_FRAC_BITS;
986e461dc072 Initial revision
glantau
parents:
diff changeset
374 while (last_src_y < src_y1) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
375 if (++ring_y >= LINE_BUF_HEIGHT + NB_TAPS)
986e461dc072 Initial revision
glantau
parents:
diff changeset
376 ring_y = NB_TAPS;
986e461dc072 Initial revision
glantau
parents:
diff changeset
377 last_src_y++;
630
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
378 /* handle limit conditions : replicate line (slightly
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
379 inefficient because we filter multiple times) */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
380 y1 = last_src_y;
986e461dc072 Initial revision
glantau
parents:
diff changeset
381 if (y1 < 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
382 y1 = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
383 } else if (y1 >= iheight) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
384 y1 = iheight - 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
385 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
386 src_line = input + y1 * iwrap;
986e461dc072 Initial revision
glantau
parents:
diff changeset
387 new_line = s->line_buf + ring_y * owidth;
986e461dc072 Initial revision
glantau
parents:
diff changeset
388 /* apply filter and handle limit cases correctly */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
389 h_resample(new_line, owidth,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
390 src_line, iwidth, - FCENTER * POS_FRAC, s->h_incr,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
391 &s->h_filters[0][0]);
6055
bc22d052c6e5 comment typo fixes
diego
parents: 5963
diff changeset
392 /* handle ring buffer wrapping */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
393 if (ring_y >= LINE_BUF_HEIGHT) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
394 memcpy(s->line_buf + (ring_y - LINE_BUF_HEIGHT) * owidth,
986e461dc072 Initial revision
glantau
parents:
diff changeset
395 new_line, owidth);
986e461dc072 Initial revision
glantau
parents:
diff changeset
396 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
397 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
398 /* apply vertical filter */
986e461dc072 Initial revision
glantau
parents:
diff changeset
399 phase_y = get_phase(src_y);
8590
7a463923ecd1 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 8430
diff changeset
400 #if HAVE_MMX
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
401 /* desactivated MMX because loss of precision */
8104
0d108ec85620 Remove duplicated MM_* macros for CPU capabilities from dsputil.h.
rathann
parents: 8042
diff changeset
402 if ((mm_flags & FF_MM_MMX) && NB_TAPS == 4 && 0)
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
403 v_resample4_mmx(output, owidth,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
404 s->line_buf + (ring_y - NB_TAPS + 1) * owidth, owidth,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
405 &s->v_filters[phase_y][0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
406 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
407 #endif
8590
7a463923ecd1 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 8430
diff changeset
408 #if HAVE_ALTIVEC
8104
0d108ec85620 Remove duplicated MM_* macros for CPU capabilities from dsputil.h.
rathann
parents: 8042
diff changeset
409 if ((mm_flags & FF_MM_ALTIVEC) && NB_TAPS == 4 && FILTER_BITS <= 6)
7863
4ce4a18cae8e cosmetics: Fix indentation.
diego
parents: 7823
diff changeset
410 v_resample16_altivec(output, owidth,
4ce4a18cae8e cosmetics: Fix indentation.
diego
parents: 7823
diff changeset
411 s->line_buf + (ring_y - NB_TAPS + 1) * owidth,
4ce4a18cae8e cosmetics: Fix indentation.
diego
parents: 7823
diff changeset
412 owidth, &s->v_filters[phase_y][0]);
894
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
413 else
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
414 #endif
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
415 v_resample(output, owidth,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
416 s->line_buf + (ring_y - NB_TAPS + 1) * owidth, owidth,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
417 &s->v_filters[phase_y][0]);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
418
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
419 src_y += s->v_incr;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
420
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
421 output += owrap;
986e461dc072 Initial revision
glantau
parents:
diff changeset
422 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
423 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
424
630
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
425 ImgReSampleContext *img_resample_full_init(int owidth, int oheight,
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
426 int iwidth, int iheight,
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
427 int topBand, int bottomBand,
1928
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
428 int leftBand, int rightBand,
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
429 int padtop, int padbottom,
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
430 int padleft, int padright)
630
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
431 {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
432 ImgReSampleContext *s;
986e461dc072 Initial revision
glantau
parents:
diff changeset
433
2904
84404858c529 sanity check whether dimensions are non-null
alex
parents: 2846
diff changeset
434 if (!owidth || !oheight || !iwidth || !iheight)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
435 return NULL;
2904
84404858c529 sanity check whether dimensions are non-null
alex
parents: 2846
diff changeset
436
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
437 s = av_mallocz(sizeof(ImgReSampleContext));
986e461dc072 Initial revision
glantau
parents:
diff changeset
438 if (!s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
439 return NULL;
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2400
diff changeset
440 if((unsigned)owidth >= UINT_MAX / (LINE_BUF_HEIGHT + NB_TAPS))
6912
941a4e753961 memleak / fixes CID118
michael
parents: 6764
diff changeset
441 goto fail;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
442 s->line_buf = av_mallocz(owidth * (LINE_BUF_HEIGHT + NB_TAPS));
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
443 if (!s->line_buf)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
444 goto fail;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
445
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
446 s->owidth = owidth;
986e461dc072 Initial revision
glantau
parents:
diff changeset
447 s->oheight = oheight;
986e461dc072 Initial revision
glantau
parents:
diff changeset
448 s->iwidth = iwidth;
986e461dc072 Initial revision
glantau
parents:
diff changeset
449 s->iheight = iheight;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
450
630
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
451 s->topBand = topBand;
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
452 s->bottomBand = bottomBand;
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
453 s->leftBand = leftBand;
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
454 s->rightBand = rightBand;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
455
1928
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
456 s->padtop = padtop;
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
457 s->padbottom = padbottom;
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
458 s->padleft = padleft;
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
459 s->padright = padright;
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
460
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
461 s->pad_owidth = owidth - (padleft + padright);
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
462 s->pad_oheight = oheight - (padtop + padbottom);
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
463
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
464 s->h_incr = ((iwidth - leftBand - rightBand) * POS_FRAC) / s->pad_owidth;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
465 s->v_incr = ((iheight - topBand - bottomBand) * POS_FRAC) / s->pad_oheight;
1928
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
466
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
467 av_build_filter(&s->h_filters[0][0], (float) s->pad_owidth /
2082
3dc9bbe1b152 polyphase kaiser windowed sinc and blackman nuttall windowed sinc audio resample filters
michael
parents: 2064
diff changeset
468 (float) (iwidth - leftBand - rightBand), NB_TAPS, NB_PHASES, 1<<FILTER_BITS, 0);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
469 av_build_filter(&s->v_filters[0][0], (float) s->pad_oheight /
2082
3dc9bbe1b152 polyphase kaiser windowed sinc and blackman nuttall windowed sinc audio resample filters
michael
parents: 2064
diff changeset
470 (float) (iheight - topBand - bottomBand), NB_TAPS, NB_PHASES, 1<<FILTER_BITS, 0);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
471
986e461dc072 Initial revision
glantau
parents:
diff changeset
472 return s;
1928
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
473 fail:
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 18
diff changeset
474 av_free(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
475 return NULL;
986e461dc072 Initial revision
glantau
parents:
diff changeset
476 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
477
7823
4525dcd81357 Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 6974
diff changeset
478 ImgReSampleContext *img_resample_init(int owidth, int oheight,
4525dcd81357 Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 6974
diff changeset
479 int iwidth, int iheight)
4525dcd81357 Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 6974
diff changeset
480 {
4525dcd81357 Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 6974
diff changeset
481 return img_resample_full_init(owidth, oheight, iwidth, iheight,
4525dcd81357 Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 6974
diff changeset
482 0, 0, 0, 0, 0, 0, 0, 0);
4525dcd81357 Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 6974
diff changeset
483 }
4525dcd81357 Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 6974
diff changeset
484
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
485 void img_resample(ImgReSampleContext *s,
1488
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
486 AVPicture *output, const AVPicture *input)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
487 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
488 int i, shift;
1928
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
489 uint8_t* optr;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
490
1928
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
491 for (i=0;i<3;i++) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
492 shift = (i == 0) ? 0 : 1;
1928
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
493
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
494 optr = output->data[i] + (((output->linesize[i] *
1928
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
495 s->padtop) + s->padleft) >> shift);
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
496
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
497 component_resample(s, optr, output->linesize[i],
1928
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
498 s->pad_owidth >> shift, s->pad_oheight >> shift,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
499 input->data[i] + (input->linesize[i] *
1928
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
500 (s->topBand >> shift)) + (s->leftBand >> shift),
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
501 input->linesize[i], ((s->iwidth - s->leftBand -
1928
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
502 s->rightBand) >> shift),
630
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
503 (s->iheight - s->topBand - s->bottomBand) >> shift);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
504 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
505 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
506
986e461dc072 Initial revision
glantau
parents:
diff changeset
507 void img_resample_close(ImgReSampleContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
508 {
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 18
diff changeset
509 av_free(s->line_buf);
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 18
diff changeset
510 av_free(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
511 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
512
6974
ccb0813842ea add context_to_name func for logging
bcoudurier
parents: 6962
diff changeset
513 static const char *context_to_name(void* ptr)
ccb0813842ea add context_to_name func for logging
bcoudurier
parents: 6962
diff changeset
514 {
ccb0813842ea add context_to_name func for logging
bcoudurier
parents: 6962
diff changeset
515 return "imgconvert";
ccb0813842ea add context_to_name func for logging
bcoudurier
parents: 6962
diff changeset
516 }
ccb0813842ea add context_to_name func for logging
bcoudurier
parents: 6962
diff changeset
517
ccb0813842ea add context_to_name func for logging
bcoudurier
parents: 6962
diff changeset
518 static const AVClass context_class = { "imgresample", context_to_name, NULL };
6433
d42d5a90f7de Provide non null class name to avoid crash with ffmpeg -h.
michael
parents: 6055
diff changeset
519
3249
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
520 struct SwsContext *sws_getContext(int srcW, int srcH, int srcFormat,
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
521 int dstW, int dstH, int dstFormat,
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
522 int flags, SwsFilter *srcFilter,
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
523 SwsFilter *dstFilter, double *param)
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
524 {
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
525 struct SwsContext *ctx;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
526
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
527 ctx = av_malloc(sizeof(struct SwsContext));
6433
d42d5a90f7de Provide non null class name to avoid crash with ffmpeg -h.
michael
parents: 6055
diff changeset
528 if (!ctx) {
3249
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
529 av_log(NULL, AV_LOG_ERROR, "Cannot allocate a resampling context!\n");
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
530
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
531 return NULL;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
532 }
6433
d42d5a90f7de Provide non null class name to avoid crash with ffmpeg -h.
michael
parents: 6055
diff changeset
533 ctx->av_class = &context_class;
3249
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
534
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
535 if ((srcH != dstH) || (srcW != dstW)) {
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
536 if ((srcFormat != PIX_FMT_YUV420P) || (dstFormat != PIX_FMT_YUV420P)) {
6962
c4e281443310 give context to av_log
bcoudurier
parents: 6912
diff changeset
537 av_log(ctx, AV_LOG_INFO, "PIX_FMT_YUV420P will be used as an intermediate format for rescaling\n");
3249
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
538 }
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
539 ctx->resampling_ctx = img_resample_init(dstW, dstH, srcW, srcH);
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
540 } else {
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
541 ctx->resampling_ctx = av_malloc(sizeof(ImgReSampleContext));
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
542 ctx->resampling_ctx->iheight = srcH;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
543 ctx->resampling_ctx->iwidth = srcW;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
544 ctx->resampling_ctx->oheight = dstH;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
545 ctx->resampling_ctx->owidth = dstW;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
546 }
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
547 ctx->src_pix_fmt = srcFormat;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
548 ctx->dst_pix_fmt = dstFormat;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
549
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
550 return ctx;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
551 }
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
552
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
553 void sws_freeContext(struct SwsContext *ctx)
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
554 {
4357
1654075b205c fix segfault with http://sam.zoy.org/zzuf/lol-ffplay.ogm and
takis
parents: 4197
diff changeset
555 if (!ctx)
1654075b205c fix segfault with http://sam.zoy.org/zzuf/lol-ffplay.ogm and
takis
parents: 4197
diff changeset
556 return;
3249
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
557 if ((ctx->resampling_ctx->iwidth != ctx->resampling_ctx->owidth) ||
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
558 (ctx->resampling_ctx->iheight != ctx->resampling_ctx->oheight)) {
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
559 img_resample_close(ctx->resampling_ctx);
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
560 } else {
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
561 av_free(ctx->resampling_ctx);
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
562 }
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
563 av_free(ctx);
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
564 }
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
565
4036
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
566
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
567 /**
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
568 * Checks if context is valid or reallocs a new one instead.
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
569 * If context is NULL, just calls sws_getContext() to get a new one.
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
570 * Otherwise, checks if the parameters are the same already saved in context.
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
571 * If that is the case, returns the current context.
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
572 * Otherwise, frees context and gets a new one.
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
573 *
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
574 * Be warned that srcFilter, dstFilter are not checked, they are
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
575 * asumed to remain valid.
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
576 */
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
577 struct SwsContext *sws_getCachedContext(struct SwsContext *ctx,
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
578 int srcW, int srcH, int srcFormat,
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
579 int dstW, int dstH, int dstFormat, int flags,
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
580 SwsFilter *srcFilter, SwsFilter *dstFilter, double *param)
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
581 {
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
582 if (ctx != NULL) {
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
583 if ((ctx->resampling_ctx->iwidth != srcW) ||
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
584 (ctx->resampling_ctx->iheight != srcH) ||
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
585 (ctx->src_pix_fmt != srcFormat) ||
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
586 (ctx->resampling_ctx->owidth != dstW) ||
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
587 (ctx->resampling_ctx->oheight != dstH) ||
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
588 (ctx->dst_pix_fmt != dstFormat))
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
589 {
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
590 sws_freeContext(ctx);
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
591 ctx = NULL;
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
592 }
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
593 }
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
594 if (ctx == NULL) {
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
595 return sws_getContext(srcW, srcH, srcFormat,
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
596 dstW, dstH, dstFormat, flags,
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
597 srcFilter, dstFilter, param);
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
598 }
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
599 return ctx;
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
600 }
207c22206d53 Implement sws_getCachedContext() in swscale emulation
lucabe
parents: 3947
diff changeset
601
3249
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
602 int sws_scale(struct SwsContext *ctx, uint8_t* src[], int srcStride[],
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
603 int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[])
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
604 {
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
605 AVPicture src_pict, dst_pict;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
606 int i, res = 0;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
607 AVPicture picture_format_temp;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
608 AVPicture picture_resample_temp, *formatted_picture, *resampled_picture;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
609 uint8_t *buf1 = NULL, *buf2 = NULL;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
610 enum PixelFormat current_pix_fmt;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
611
4105
225d287b337f AVPicture has 4 planes, not 3
lucabe
parents: 4065
diff changeset
612 for (i = 0; i < 4; i++) {
3249
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
613 src_pict.data[i] = src[i];
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
614 src_pict.linesize[i] = srcStride[i];
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
615 dst_pict.data[i] = dst[i];
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
616 dst_pict.linesize[i] = dstStride[i];
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
617 }
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
618 if ((ctx->resampling_ctx->iwidth != ctx->resampling_ctx->owidth) ||
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
619 (ctx->resampling_ctx->iheight != ctx->resampling_ctx->oheight)) {
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
620 /* We have to rescale the picture, but only YUV420P rescaling is supported... */
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
621
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
622 if (ctx->src_pix_fmt != PIX_FMT_YUV420P) {
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
623 int size;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
624
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
625 /* create temporary picture for rescaling input*/
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
626 size = avpicture_get_size(PIX_FMT_YUV420P, ctx->resampling_ctx->iwidth, ctx->resampling_ctx->iheight);
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
627 buf1 = av_malloc(size);
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
628 if (!buf1) {
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
629 res = -1;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
630 goto the_end;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
631 }
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
632 formatted_picture = &picture_format_temp;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
633 avpicture_fill((AVPicture*)formatted_picture, buf1,
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
634 PIX_FMT_YUV420P, ctx->resampling_ctx->iwidth, ctx->resampling_ctx->iheight);
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
635
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
636 if (img_convert((AVPicture*)formatted_picture, PIX_FMT_YUV420P,
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
637 &src_pict, ctx->src_pix_fmt,
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
638 ctx->resampling_ctx->iwidth, ctx->resampling_ctx->iheight) < 0) {
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
639
6962
c4e281443310 give context to av_log
bcoudurier
parents: 6912
diff changeset
640 av_log(ctx, AV_LOG_ERROR, "pixel format conversion not handled\n");
3249
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
641 res = -1;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
642 goto the_end;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
643 }
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
644 } else {
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
645 formatted_picture = &src_pict;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
646 }
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
647
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
648 if (ctx->dst_pix_fmt != PIX_FMT_YUV420P) {
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
649 int size;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
650
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
651 /* create temporary picture for rescaling output*/
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
652 size = avpicture_get_size(PIX_FMT_YUV420P, ctx->resampling_ctx->owidth, ctx->resampling_ctx->oheight);
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
653 buf2 = av_malloc(size);
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
654 if (!buf2) {
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
655 res = -1;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
656 goto the_end;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
657 }
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
658 resampled_picture = &picture_resample_temp;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
659 avpicture_fill((AVPicture*)resampled_picture, buf2,
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
660 PIX_FMT_YUV420P, ctx->resampling_ctx->owidth, ctx->resampling_ctx->oheight);
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
661
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
662 } else {
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
663 resampled_picture = &dst_pict;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
664 }
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
665
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
666 /* ...and finally rescale!!! */
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
667 img_resample(ctx->resampling_ctx, resampled_picture, formatted_picture);
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
668 current_pix_fmt = PIX_FMT_YUV420P;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
669 } else {
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
670 resampled_picture = &src_pict;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
671 current_pix_fmt = ctx->src_pix_fmt;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
672 }
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
673
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
674 if (current_pix_fmt != ctx->dst_pix_fmt) {
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
675 if (img_convert(&dst_pict, ctx->dst_pix_fmt,
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
676 resampled_picture, current_pix_fmt,
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
677 ctx->resampling_ctx->owidth, ctx->resampling_ctx->oheight) < 0) {
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
678
6962
c4e281443310 give context to av_log
bcoudurier
parents: 6912
diff changeset
679 av_log(ctx, AV_LOG_ERROR, "pixel format conversion not handled\n");
3249
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
680
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
681 res = -1;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
682 goto the_end;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
683 }
3516
f60df50f50aa Fix a corner case in sws emulation
lucabe
parents: 3249
diff changeset
684 } else if (resampled_picture != &dst_pict) {
4624
6a900f539e2c Add the prefix "av_" to img_crop(), img_copy() and img_pad(), and rename "img"
takis
parents: 4357
diff changeset
685 av_picture_copy(&dst_pict, resampled_picture, current_pix_fmt,
3516
f60df50f50aa Fix a corner case in sws emulation
lucabe
parents: 3249
diff changeset
686 ctx->resampling_ctx->owidth, ctx->resampling_ctx->oheight);
3249
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
687 }
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
688
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
689 the_end:
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
690 av_free(buf1);
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
691 av_free(buf2);
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
692 return res;
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
693 }
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
694
ad3d12d04645 Introduce swscale interface in libavcodec
lucabe
parents: 3089
diff changeset
695
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
696 #ifdef TEST
2400
17ec73c65748 imgresample test cleanup patch by (Panagiotis Issaris <takis )( lumumba d0t luc d0t ac.be>)
michael
parents: 2082
diff changeset
697 #include <stdio.h>
5055
4ffb80ba1d2a Fix imgresample-test linking.
diego
parents: 5054
diff changeset
698 #undef exit
630
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
699
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
700 /* input */
986e461dc072 Initial revision
glantau
parents:
diff changeset
701 #define XSIZE 256
986e461dc072 Initial revision
glantau
parents:
diff changeset
702 #define YSIZE 256
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
703 uint8_t img[XSIZE * YSIZE];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
704
986e461dc072 Initial revision
glantau
parents:
diff changeset
705 /* output */
986e461dc072 Initial revision
glantau
parents:
diff changeset
706 #define XSIZE1 512
986e461dc072 Initial revision
glantau
parents:
diff changeset
707 #define YSIZE1 512
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
708 uint8_t img1[XSIZE1 * YSIZE1];
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
709 uint8_t img2[XSIZE1 * YSIZE1];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
710
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
711 void save_pgm(const char *filename, uint8_t *img, int xsize, int ysize)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
712 {
2846
40765c51a7a9 Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents: 2423
diff changeset
713 #undef fprintf
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
714 FILE *f;
986e461dc072 Initial revision
glantau
parents:
diff changeset
715 f=fopen(filename,"w");
986e461dc072 Initial revision
glantau
parents:
diff changeset
716 fprintf(f,"P5\n%d %d\n%d\n", xsize, ysize, 255);
986e461dc072 Initial revision
glantau
parents:
diff changeset
717 fwrite(img,1, xsize * ysize,f);
986e461dc072 Initial revision
glantau
parents:
diff changeset
718 fclose(f);
2846
40765c51a7a9 Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents: 2423
diff changeset
719 #define fprintf please_use_av_log
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
720 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
721
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
722 static void dump_filter(int16_t *filter)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
723 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
724 int i, ph;
986e461dc072 Initial revision
glantau
parents:
diff changeset
725
986e461dc072 Initial revision
glantau
parents:
diff changeset
726 for(ph=0;ph<NB_PHASES;ph++) {
2400
17ec73c65748 imgresample test cleanup patch by (Panagiotis Issaris <takis )( lumumba d0t luc d0t ac.be>)
michael
parents: 2082
diff changeset
727 av_log(NULL, AV_LOG_INFO, "%2d: ", ph);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
728 for(i=0;i<NB_TAPS;i++) {
2400
17ec73c65748 imgresample test cleanup patch by (Panagiotis Issaris <takis )( lumumba d0t luc d0t ac.be>)
michael
parents: 2082
diff changeset
729 av_log(NULL, AV_LOG_INFO, " %5.2f", filter[ph * NB_TAPS + i] / 256.0);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
730 }
2400
17ec73c65748 imgresample test cleanup patch by (Panagiotis Issaris <takis )( lumumba d0t luc d0t ac.be>)
michael
parents: 2082
diff changeset
731 av_log(NULL, AV_LOG_INFO, "\n");
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
732 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
733 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
734
8590
7a463923ecd1 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 8430
diff changeset
735 #if HAVE_MMX
644
641708b5c33c fixing tests
michaelni
parents: 630
diff changeset
736 int mm_flags;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
737 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
738
986e461dc072 Initial revision
glantau
parents:
diff changeset
739 int main(int argc, char **argv)
986e461dc072 Initial revision
glantau
parents:
diff changeset
740 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
741 int x, y, v, i, xsize, ysize;
986e461dc072 Initial revision
glantau
parents:
diff changeset
742 ImgReSampleContext *s;
986e461dc072 Initial revision
glantau
parents:
diff changeset
743 float fact, factors[] = { 1/2.0, 3.0/4.0, 1.0, 4.0/3.0, 16.0/9.0, 2.0 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
744 char buf[256];
986e461dc072 Initial revision
glantau
parents:
diff changeset
745
986e461dc072 Initial revision
glantau
parents:
diff changeset
746 /* build test image */
986e461dc072 Initial revision
glantau
parents:
diff changeset
747 for(y=0;y<YSIZE;y++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
748 for(x=0;x<XSIZE;x++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
749 if (x < XSIZE/2 && y < YSIZE/2) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
750 if (x < XSIZE/4 && y < YSIZE/4) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
751 if ((x % 10) <= 6 &&
986e461dc072 Initial revision
glantau
parents:
diff changeset
752 (y % 10) <= 6)
986e461dc072 Initial revision
glantau
parents:
diff changeset
753 v = 0xff;
986e461dc072 Initial revision
glantau
parents:
diff changeset
754 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
755 v = 0x00;
986e461dc072 Initial revision
glantau
parents:
diff changeset
756 } else if (x < XSIZE/4) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
757 if (x & 1)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
758 v = 0xff;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
759 else
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
760 v = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
761 } else if (y < XSIZE/4) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
762 if (y & 1)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
763 v = 0xff;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
764 else
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
765 v = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
766 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
767 if (y < YSIZE*3/8) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
768 if ((y+x) & 1)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
769 v = 0xff;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2904
diff changeset
770 else
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
771 v = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
772 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
773 if (((x+3) % 4) <= 1 &&
986e461dc072 Initial revision
glantau
parents:
diff changeset
774 ((y+3) % 4) <= 1)
986e461dc072 Initial revision
glantau
parents:
diff changeset
775 v = 0xff;
986e461dc072 Initial revision
glantau
parents:
diff changeset
776 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
777 v = 0x00;
986e461dc072 Initial revision
glantau
parents:
diff changeset
778 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
779 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
780 } else if (x < XSIZE/2) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
781 v = ((x - (XSIZE/2)) * 255) / (XSIZE/2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
782 } else if (y < XSIZE/2) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
783 v = ((y - (XSIZE/2)) * 255) / (XSIZE/2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
784 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
785 v = ((x + y - XSIZE) * 255) / XSIZE;
986e461dc072 Initial revision
glantau
parents:
diff changeset
786 }
630
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
787 img[(YSIZE - y) * XSIZE + (XSIZE - x)] = v;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
788 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
789 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
790 save_pgm("/tmp/in.pgm", img, XSIZE, YSIZE);
8042
e70975d5ff80 uses FF_ARRAY_ELEMS() where appropriate
aurel
parents: 7863
diff changeset
791 for(i=0;i<FF_ARRAY_ELEMS(factors);i++) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
792 fact = factors[i];
986e461dc072 Initial revision
glantau
parents:
diff changeset
793 xsize = (int)(XSIZE * fact);
630
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
794 ysize = (int)((YSIZE - 100) * fact);
2400
17ec73c65748 imgresample test cleanup patch by (Panagiotis Issaris <takis )( lumumba d0t luc d0t ac.be>)
michael
parents: 2082
diff changeset
795 s = img_resample_full_init(xsize, ysize, XSIZE, YSIZE, 50 ,50, 0, 0, 0, 0, 0, 0);
17ec73c65748 imgresample test cleanup patch by (Panagiotis Issaris <takis )( lumumba d0t luc d0t ac.be>)
michael
parents: 2082
diff changeset
796 av_log(NULL, AV_LOG_INFO, "Factor=%0.2f\n", fact);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
797 dump_filter(&s->h_filters[0][0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
798 component_resample(s, img1, xsize, xsize, ysize,
630
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
799 img + 50 * XSIZE, XSIZE, XSIZE, YSIZE - 100);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
800 img_resample_close(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
801
2423
87b7fbed8609 dissallow sprintf
michael
parents: 2422
diff changeset
802 snprintf(buf, sizeof(buf), "/tmp/out%d.pgm", i);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
803 save_pgm(buf, img1, xsize, ysize);
986e461dc072 Initial revision
glantau
parents:
diff changeset
804 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
805
986e461dc072 Initial revision
glantau
parents:
diff changeset
806 /* mmx test */
8590
7a463923ecd1 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 8430
diff changeset
807 #if HAVE_MMX
2400
17ec73c65748 imgresample test cleanup patch by (Panagiotis Issaris <takis )( lumumba d0t luc d0t ac.be>)
michael
parents: 2082
diff changeset
808 av_log(NULL, AV_LOG_INFO, "MMX test\n");
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
809 fact = 0.72;
986e461dc072 Initial revision
glantau
parents:
diff changeset
810 xsize = (int)(XSIZE * fact);
986e461dc072 Initial revision
glantau
parents:
diff changeset
811 ysize = (int)(YSIZE * fact);
8104
0d108ec85620 Remove duplicated MM_* macros for CPU capabilities from dsputil.h.
rathann
parents: 8042
diff changeset
812 mm_flags = FF_MM_MMX;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
813 s = img_resample_init(xsize, ysize, XSIZE, YSIZE);
986e461dc072 Initial revision
glantau
parents:
diff changeset
814 component_resample(s, img1, xsize, xsize, ysize,
986e461dc072 Initial revision
glantau
parents:
diff changeset
815 img, XSIZE, XSIZE, YSIZE);
986e461dc072 Initial revision
glantau
parents:
diff changeset
816
986e461dc072 Initial revision
glantau
parents:
diff changeset
817 mm_flags = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
818 s = img_resample_init(xsize, ysize, XSIZE, YSIZE);
986e461dc072 Initial revision
glantau
parents:
diff changeset
819 component_resample(s, img2, xsize, xsize, ysize,
986e461dc072 Initial revision
glantau
parents:
diff changeset
820 img, XSIZE, XSIZE, YSIZE);
986e461dc072 Initial revision
glantau
parents:
diff changeset
821 if (memcmp(img1, img2, xsize * ysize) != 0) {
2400
17ec73c65748 imgresample test cleanup patch by (Panagiotis Issaris <takis )( lumumba d0t luc d0t ac.be>)
michael
parents: 2082
diff changeset
822 av_log(NULL, AV_LOG_ERROR, "mmx error\n");
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
823 exit(1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
824 }
2400
17ec73c65748 imgresample test cleanup patch by (Panagiotis Issaris <takis )( lumumba d0t luc d0t ac.be>)
michael
parents: 2082
diff changeset
825 av_log(NULL, AV_LOG_INFO, "MMX OK\n");
5054
6e7e23b6615d Add explanatory comments to some #endifs.
diego
parents: 4624
diff changeset
826 #endif /* HAVE_MMX */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
827 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
828 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
829
5054
6e7e23b6615d Add explanatory comments to some #endifs.
diego
parents: 4624
diff changeset
830 #endif /* TEST */