annotate imgresample.c @ 1968:19c2344e800a libavcodec

support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors minor cleanup segfault fix
author michael
date Sun, 25 Apr 2004 02:09:47 +0000
parents 0c23a5564489
children 37ca6f8677de
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1 /*
986e461dc072 Initial revision
glantau
parents:
diff changeset
2 * High quality image resampling with polyphase filters
429
718a22dc121f license/copyright change
glantau
parents: 412
diff changeset
3 * Copyright (c) 2001 Fabrice Bellard.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
4 *
429
718a22dc121f license/copyright change
glantau
parents: 412
diff changeset
5 * This library is free software; you can redistribute it and/or
718a22dc121f license/copyright change
glantau
parents: 412
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
718a22dc121f license/copyright change
glantau
parents: 412
diff changeset
7 * License as published by the Free Software Foundation; either
718a22dc121f license/copyright change
glantau
parents: 412
diff changeset
8 * version 2 of the License, or (at your option) any later version.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
9 *
429
718a22dc121f license/copyright change
glantau
parents: 412
diff changeset
10 * This library is distributed in the hope that it will be useful,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
429
718a22dc121f license/copyright change
glantau
parents: 412
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
718a22dc121f license/copyright change
glantau
parents: 412
diff changeset
13 * Lesser General Public License for more details.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
14 *
429
718a22dc121f license/copyright change
glantau
parents: 412
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
718a22dc121f license/copyright change
glantau
parents: 412
diff changeset
16 * License along with this library; if not, write to the Free Software
718a22dc121f license/copyright change
glantau
parents: 412
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
18 */
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
19
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
20 /**
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
21 * @file imgresample.c
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
22 * High quality image resampling with polyphase filters .
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
23 */
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
24
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 18
diff changeset
25 #include "avcodec.h"
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
26 #include "dsputil.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
27
17
b69fe46fd708 Adding fastmemcpy stuff to speedup mplayer project
nickols_k
parents: 2
diff changeset
28 #ifdef USE_FASTMEMCPY
b69fe46fd708 Adding fastmemcpy stuff to speedup mplayer project
nickols_k
parents: 2
diff changeset
29 #include "fastmemcpy.h"
b69fe46fd708 Adding fastmemcpy stuff to speedup mplayer project
nickols_k
parents: 2
diff changeset
30 #endif
b69fe46fd708 Adding fastmemcpy stuff to speedup mplayer project
nickols_k
parents: 2
diff changeset
31
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
32 #define NB_COMPONENTS 3
986e461dc072 Initial revision
glantau
parents:
diff changeset
33
986e461dc072 Initial revision
glantau
parents:
diff changeset
34 #define PHASE_BITS 4
986e461dc072 Initial revision
glantau
parents:
diff changeset
35 #define NB_PHASES (1 << PHASE_BITS)
986e461dc072 Initial revision
glantau
parents:
diff changeset
36 #define NB_TAPS 4
986e461dc072 Initial revision
glantau
parents:
diff changeset
37 #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
38 //#define TEST 1 /* Test it */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
39
986e461dc072 Initial revision
glantau
parents:
diff changeset
40 #define POS_FRAC_BITS 16
986e461dc072 Initial revision
glantau
parents:
diff changeset
41 #define POS_FRAC (1 << POS_FRAC_BITS)
986e461dc072 Initial revision
glantau
parents:
diff changeset
42 /* 6 bits precision is needed for MMX */
986e461dc072 Initial revision
glantau
parents:
diff changeset
43 #define FILTER_BITS 8
986e461dc072 Initial revision
glantau
parents:
diff changeset
44
986e461dc072 Initial revision
glantau
parents:
diff changeset
45 #define LINE_BUF_HEIGHT (NB_TAPS * 4)
986e461dc072 Initial revision
glantau
parents:
diff changeset
46
986e461dc072 Initial revision
glantau
parents:
diff changeset
47 struct ImgReSampleContext {
1928
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
48 int iwidth, iheight, owidth, oheight;
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
49 int topBand, bottomBand, leftBand, rightBand;
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
50 int padtop, padbottom, padleft, padright;
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
51 int pad_owidth, pad_oheight;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
52 int h_incr, v_incr;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
53 int16_t h_filters[NB_PHASES][NB_TAPS] __align8; /* horizontal filters */
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
54 int16_t v_filters[NB_PHASES][NB_TAPS] __align8; /* vertical filters */
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
55 uint8_t *line_buf;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
56 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
57
986e461dc072 Initial revision
glantau
parents:
diff changeset
58 static inline int get_phase(int pos)
986e461dc072 Initial revision
glantau
parents:
diff changeset
59 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
60 return ((pos) >> (POS_FRAC_BITS - PHASE_BITS)) & ((1 << PHASE_BITS) - 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
61 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
62
986e461dc072 Initial revision
glantau
parents:
diff changeset
63 /* This function must be optimized */
1488
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
64 static void h_resample_fast(uint8_t *dst, int dst_width, const uint8_t *src,
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
65 int src_width, int src_start, int src_incr,
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
66 int16_t *filters)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
67 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
68 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
69 const uint8_t *s;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
70 int16_t *filter;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
71
986e461dc072 Initial revision
glantau
parents:
diff changeset
72 src_pos = src_start;
986e461dc072 Initial revision
glantau
parents:
diff changeset
73 for(i=0;i<dst_width;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
74 #ifdef TEST
986e461dc072 Initial revision
glantau
parents:
diff changeset
75 /* test */
986e461dc072 Initial revision
glantau
parents:
diff changeset
76 if ((src_pos >> POS_FRAC_BITS) < 0 ||
986e461dc072 Initial revision
glantau
parents:
diff changeset
77 (src_pos >> POS_FRAC_BITS) > (src_width - NB_TAPS))
653
714795876872 Change abort() calls to av_abort() calls.
philipjsg
parents: 644
diff changeset
78 av_abort();
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
79 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
80 s = src + (src_pos >> POS_FRAC_BITS);
986e461dc072 Initial revision
glantau
parents:
diff changeset
81 phase = get_phase(src_pos);
986e461dc072 Initial revision
glantau
parents:
diff changeset
82 filter = filters + phase * NB_TAPS;
986e461dc072 Initial revision
glantau
parents:
diff changeset
83 #if NB_TAPS == 4
986e461dc072 Initial revision
glantau
parents:
diff changeset
84 sum = s[0] * filter[0] +
986e461dc072 Initial revision
glantau
parents:
diff changeset
85 s[1] * filter[1] +
986e461dc072 Initial revision
glantau
parents:
diff changeset
86 s[2] * filter[2] +
986e461dc072 Initial revision
glantau
parents:
diff changeset
87 s[3] * filter[3];
986e461dc072 Initial revision
glantau
parents:
diff changeset
88 #else
986e461dc072 Initial revision
glantau
parents:
diff changeset
89 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
90 int j;
986e461dc072 Initial revision
glantau
parents:
diff changeset
91 sum = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
92 for(j=0;j<NB_TAPS;j++)
986e461dc072 Initial revision
glantau
parents:
diff changeset
93 sum += s[j] * filter[j];
986e461dc072 Initial revision
glantau
parents:
diff changeset
94 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
95 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
96 sum = sum >> FILTER_BITS;
986e461dc072 Initial revision
glantau
parents:
diff changeset
97 if (sum < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
98 sum = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
99 else if (sum > 255)
986e461dc072 Initial revision
glantau
parents:
diff changeset
100 sum = 255;
986e461dc072 Initial revision
glantau
parents:
diff changeset
101 dst[0] = sum;
986e461dc072 Initial revision
glantau
parents:
diff changeset
102 src_pos += src_incr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
103 dst++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
104 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
105 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
106
986e461dc072 Initial revision
glantau
parents:
diff changeset
107 /* This function must be optimized */
1488
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
108 static void v_resample(uint8_t *dst, int dst_width, const uint8_t *src,
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
109 int wrap, int16_t *filter)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
110 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
111 int sum, i;
1488
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
112 const uint8_t *s;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
113
986e461dc072 Initial revision
glantau
parents:
diff changeset
114 s = src;
986e461dc072 Initial revision
glantau
parents:
diff changeset
115 for(i=0;i<dst_width;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
116 #if NB_TAPS == 4
986e461dc072 Initial revision
glantau
parents:
diff changeset
117 sum = s[0 * wrap] * filter[0] +
986e461dc072 Initial revision
glantau
parents:
diff changeset
118 s[1 * wrap] * filter[1] +
986e461dc072 Initial revision
glantau
parents:
diff changeset
119 s[2 * wrap] * filter[2] +
986e461dc072 Initial revision
glantau
parents:
diff changeset
120 s[3 * wrap] * filter[3];
986e461dc072 Initial revision
glantau
parents:
diff changeset
121 #else
986e461dc072 Initial revision
glantau
parents:
diff changeset
122 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
123 int j;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
124 uint8_t *s1 = s;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
125
986e461dc072 Initial revision
glantau
parents:
diff changeset
126 sum = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
127 for(j=0;j<NB_TAPS;j++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
128 sum += s1[0] * filter[j];
986e461dc072 Initial revision
glantau
parents:
diff changeset
129 s1 += wrap;
986e461dc072 Initial revision
glantau
parents:
diff changeset
130 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
131 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
132 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
133 sum = sum >> FILTER_BITS;
986e461dc072 Initial revision
glantau
parents:
diff changeset
134 if (sum < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
135 sum = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
136 else if (sum > 255)
986e461dc072 Initial revision
glantau
parents:
diff changeset
137 sum = 255;
986e461dc072 Initial revision
glantau
parents:
diff changeset
138 dst[0] = sum;
986e461dc072 Initial revision
glantau
parents:
diff changeset
139 dst++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
140 s++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
141 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
142 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
143
2
2e2c46c87460 fixed config for direct mplayer build compatibility
glantau
parents: 0
diff changeset
144 #ifdef HAVE_MMX
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
145
986e461dc072 Initial revision
glantau
parents:
diff changeset
146 #include "i386/mmx.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
147
986e461dc072 Initial revision
glantau
parents:
diff changeset
148 #define FILTER4(reg) \
986e461dc072 Initial revision
glantau
parents:
diff changeset
149 {\
986e461dc072 Initial revision
glantau
parents:
diff changeset
150 s = src + (src_pos >> POS_FRAC_BITS);\
986e461dc072 Initial revision
glantau
parents:
diff changeset
151 phase = get_phase(src_pos);\
986e461dc072 Initial revision
glantau
parents:
diff changeset
152 filter = filters + phase * NB_TAPS;\
986e461dc072 Initial revision
glantau
parents:
diff changeset
153 movq_m2r(*s, reg);\
986e461dc072 Initial revision
glantau
parents:
diff changeset
154 punpcklbw_r2r(mm7, reg);\
986e461dc072 Initial revision
glantau
parents:
diff changeset
155 movq_m2r(*filter, mm6);\
986e461dc072 Initial revision
glantau
parents:
diff changeset
156 pmaddwd_r2r(reg, mm6);\
986e461dc072 Initial revision
glantau
parents:
diff changeset
157 movq_r2r(mm6, reg);\
986e461dc072 Initial revision
glantau
parents:
diff changeset
158 psrlq_i2r(32, reg);\
986e461dc072 Initial revision
glantau
parents:
diff changeset
159 paddd_r2r(mm6, reg);\
986e461dc072 Initial revision
glantau
parents:
diff changeset
160 psrad_i2r(FILTER_BITS, reg);\
986e461dc072 Initial revision
glantau
parents:
diff changeset
161 src_pos += src_incr;\
986e461dc072 Initial revision
glantau
parents:
diff changeset
162 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
163
986e461dc072 Initial revision
glantau
parents:
diff changeset
164 #define DUMP(reg) movq_r2m(reg, tmp); printf(#reg "=%016Lx\n", tmp.uq);
986e461dc072 Initial revision
glantau
parents:
diff changeset
165
986e461dc072 Initial revision
glantau
parents:
diff changeset
166 /* 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
167 static void h_resample_fast4_mmx(uint8_t *dst, int dst_width,
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
168 const uint8_t *src, int src_width,
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
169 int src_start, int src_incr, int16_t *filters)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
170 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
171 int src_pos, phase;
1488
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
172 const uint8_t *s;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
173 int16_t *filter;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
174 mmx_t tmp;
986e461dc072 Initial revision
glantau
parents:
diff changeset
175
986e461dc072 Initial revision
glantau
parents:
diff changeset
176 src_pos = src_start;
986e461dc072 Initial revision
glantau
parents:
diff changeset
177 pxor_r2r(mm7, mm7);
986e461dc072 Initial revision
glantau
parents:
diff changeset
178
986e461dc072 Initial revision
glantau
parents:
diff changeset
179 while (dst_width >= 4) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
180
986e461dc072 Initial revision
glantau
parents:
diff changeset
181 FILTER4(mm0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
182 FILTER4(mm1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
183 FILTER4(mm2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
184 FILTER4(mm3);
986e461dc072 Initial revision
glantau
parents:
diff changeset
185
986e461dc072 Initial revision
glantau
parents:
diff changeset
186 packuswb_r2r(mm7, mm0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
187 packuswb_r2r(mm7, mm1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
188 packuswb_r2r(mm7, mm3);
986e461dc072 Initial revision
glantau
parents:
diff changeset
189 packuswb_r2r(mm7, mm2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
190 movq_r2m(mm0, tmp);
986e461dc072 Initial revision
glantau
parents:
diff changeset
191 dst[0] = tmp.ub[0];
986e461dc072 Initial revision
glantau
parents:
diff changeset
192 movq_r2m(mm1, tmp);
986e461dc072 Initial revision
glantau
parents:
diff changeset
193 dst[1] = tmp.ub[0];
986e461dc072 Initial revision
glantau
parents:
diff changeset
194 movq_r2m(mm2, tmp);
986e461dc072 Initial revision
glantau
parents:
diff changeset
195 dst[2] = tmp.ub[0];
986e461dc072 Initial revision
glantau
parents:
diff changeset
196 movq_r2m(mm3, tmp);
986e461dc072 Initial revision
glantau
parents:
diff changeset
197 dst[3] = tmp.ub[0];
986e461dc072 Initial revision
glantau
parents:
diff changeset
198 dst += 4;
986e461dc072 Initial revision
glantau
parents:
diff changeset
199 dst_width -= 4;
986e461dc072 Initial revision
glantau
parents:
diff changeset
200 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
201 while (dst_width > 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
202 FILTER4(mm0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
203 packuswb_r2r(mm7, mm0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
204 movq_r2m(mm0, tmp);
986e461dc072 Initial revision
glantau
parents:
diff changeset
205 dst[0] = tmp.ub[0];
986e461dc072 Initial revision
glantau
parents:
diff changeset
206 dst++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
207 dst_width--;
986e461dc072 Initial revision
glantau
parents:
diff changeset
208 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
209 emms();
986e461dc072 Initial revision
glantau
parents:
diff changeset
210 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
211
1488
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
212 static void v_resample4_mmx(uint8_t *dst, int dst_width, const uint8_t *src,
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
213 int wrap, int16_t *filter)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
214 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
215 int sum, i, v;
1488
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
216 const uint8_t *s;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
217 mmx_t tmp;
986e461dc072 Initial revision
glantau
parents:
diff changeset
218 mmx_t coefs[4];
986e461dc072 Initial revision
glantau
parents:
diff changeset
219
986e461dc072 Initial revision
glantau
parents:
diff changeset
220 for(i=0;i<4;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
221 v = filter[i];
986e461dc072 Initial revision
glantau
parents:
diff changeset
222 coefs[i].uw[0] = v;
986e461dc072 Initial revision
glantau
parents:
diff changeset
223 coefs[i].uw[1] = v;
986e461dc072 Initial revision
glantau
parents:
diff changeset
224 coefs[i].uw[2] = v;
986e461dc072 Initial revision
glantau
parents:
diff changeset
225 coefs[i].uw[3] = v;
986e461dc072 Initial revision
glantau
parents:
diff changeset
226 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
227
986e461dc072 Initial revision
glantau
parents:
diff changeset
228 pxor_r2r(mm7, mm7);
986e461dc072 Initial revision
glantau
parents:
diff changeset
229 s = src;
986e461dc072 Initial revision
glantau
parents:
diff changeset
230 while (dst_width >= 4) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
231 movq_m2r(s[0 * wrap], mm0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
232 punpcklbw_r2r(mm7, mm0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
233 movq_m2r(s[1 * wrap], mm1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
234 punpcklbw_r2r(mm7, mm1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
235 movq_m2r(s[2 * wrap], mm2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
236 punpcklbw_r2r(mm7, mm2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
237 movq_m2r(s[3 * wrap], mm3);
986e461dc072 Initial revision
glantau
parents:
diff changeset
238 punpcklbw_r2r(mm7, mm3);
986e461dc072 Initial revision
glantau
parents:
diff changeset
239
986e461dc072 Initial revision
glantau
parents:
diff changeset
240 pmullw_m2r(coefs[0], mm0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
241 pmullw_m2r(coefs[1], mm1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
242 pmullw_m2r(coefs[2], mm2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
243 pmullw_m2r(coefs[3], mm3);
986e461dc072 Initial revision
glantau
parents:
diff changeset
244
986e461dc072 Initial revision
glantau
parents:
diff changeset
245 paddw_r2r(mm1, mm0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
246 paddw_r2r(mm3, mm2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
247 paddw_r2r(mm2, mm0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
248 psraw_i2r(FILTER_BITS, mm0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
249
986e461dc072 Initial revision
glantau
parents:
diff changeset
250 packuswb_r2r(mm7, mm0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
251 movq_r2m(mm0, tmp);
986e461dc072 Initial revision
glantau
parents:
diff changeset
252
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
253 *(uint32_t *)dst = tmp.ud[0];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
254 dst += 4;
986e461dc072 Initial revision
glantau
parents:
diff changeset
255 s += 4;
986e461dc072 Initial revision
glantau
parents:
diff changeset
256 dst_width -= 4;
986e461dc072 Initial revision
glantau
parents:
diff changeset
257 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
258 while (dst_width > 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
259 sum = s[0 * wrap] * filter[0] +
986e461dc072 Initial revision
glantau
parents:
diff changeset
260 s[1 * wrap] * filter[1] +
986e461dc072 Initial revision
glantau
parents:
diff changeset
261 s[2 * wrap] * filter[2] +
986e461dc072 Initial revision
glantau
parents:
diff changeset
262 s[3 * wrap] * filter[3];
986e461dc072 Initial revision
glantau
parents:
diff changeset
263 sum = sum >> FILTER_BITS;
986e461dc072 Initial revision
glantau
parents:
diff changeset
264 if (sum < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
265 sum = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
266 else if (sum > 255)
986e461dc072 Initial revision
glantau
parents:
diff changeset
267 sum = 255;
986e461dc072 Initial revision
glantau
parents:
diff changeset
268 dst[0] = sum;
986e461dc072 Initial revision
glantau
parents:
diff changeset
269 dst++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
270 s++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
271 dst_width--;
986e461dc072 Initial revision
glantau
parents:
diff changeset
272 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
273 emms();
986e461dc072 Initial revision
glantau
parents:
diff changeset
274 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
275 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
276
894
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
277 #ifdef HAVE_ALTIVEC
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
278 typedef union {
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
279 vector unsigned char v;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
280 unsigned char c[16];
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
281 } vec_uc_t;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
282
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
283 typedef union {
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
284 vector signed short v;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
285 signed short s[8];
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
286 } vec_ss_t;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
287
1488
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
288 void v_resample16_altivec(uint8_t *dst, int dst_width, const uint8_t *src,
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
289 int wrap, int16_t *filter)
894
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
290 {
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
291 int sum, 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;
894
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
293 vector unsigned char *tv, tmp, dstv, zero;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
294 vec_ss_t srchv[4], srclv[4], fv[4];
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
295 vector signed short zeros, sumhv, sumlv;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
296 s = src;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
297
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
298 for(i=0;i<4;i++)
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
299 {
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
300 /*
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
301 The vec_madds later on does an implicit >>15 on the result.
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
302 Since FILTER_BITS is 8, and we have 15 bits of magnitude in
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
303 a signed short, we have just enough bits to pre-shift our
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
304 filter constants <<7 to compensate for vec_madds.
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
305 */
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
306 fv[i].s[0] = filter[i] << (15-FILTER_BITS);
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
307 fv[i].v = vec_splat(fv[i].v, 0);
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
308 }
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
309
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
310 zero = vec_splat_u8(0);
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
311 zeros = vec_splat_s16(0);
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
312
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
313
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
314 /*
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
315 When we're resampling, we'd ideally like both our input buffers,
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
316 and output buffers to be 16-byte aligned, so we can do both aligned
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
317 reads and writes. Sadly we can't always have this at the moment, so
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
318 we opt for aligned writes, as unaligned writes have a huge overhead.
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
319 To do this, do enough scalar resamples to get dst 16-byte aligned.
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
320 */
898
6d5e3fe7aea1 Simplify an expression and eliminate a compile warning
philipjsg
parents: 894
diff changeset
321 i = (-(int)dst) & 0xf;
894
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
322 while(i>0) {
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
323 sum = s[0 * wrap] * filter[0] +
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
324 s[1 * wrap] * filter[1] +
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
325 s[2 * wrap] * filter[2] +
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
326 s[3 * wrap] * filter[3];
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
327 sum = sum >> FILTER_BITS;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
328 if (sum<0) sum = 0; else if (sum>255) sum=255;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
329 dst[0] = sum;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
330 dst++;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
331 s++;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
332 dst_width--;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
333 i--;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
334 }
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
335
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
336 /* Do our altivec resampling on 16 pixels at once. */
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
337 while(dst_width>=16) {
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
338 /*
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
339 Read 16 (potentially unaligned) bytes from each of
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
340 4 lines into 4 vectors, and split them into shorts.
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
341 Interleave the multipy/accumulate for the resample
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
342 filter with the loads to hide the 3 cycle latency
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
343 the vec_madds have.
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
344 */
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
345 tv = (vector unsigned char *) &s[0 * wrap];
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
346 tmp = vec_perm(tv[0], tv[1], vec_lvsl(0, &s[i * wrap]));
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
347 srchv[0].v = (vector signed short) vec_mergeh(zero, tmp);
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
348 srclv[0].v = (vector signed short) vec_mergel(zero, tmp);
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
349 sumhv = vec_madds(srchv[0].v, fv[0].v, zeros);
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
350 sumlv = vec_madds(srclv[0].v, fv[0].v, zeros);
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
351
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
352 tv = (vector unsigned char *) &s[1 * wrap];
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
353 tmp = vec_perm(tv[0], tv[1], vec_lvsl(0, &s[1 * wrap]));
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
354 srchv[1].v = (vector signed short) vec_mergeh(zero, tmp);
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
355 srclv[1].v = (vector signed short) vec_mergel(zero, tmp);
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
356 sumhv = vec_madds(srchv[1].v, fv[1].v, sumhv);
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
357 sumlv = vec_madds(srclv[1].v, fv[1].v, sumlv);
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
358
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
359 tv = (vector unsigned char *) &s[2 * wrap];
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
360 tmp = vec_perm(tv[0], tv[1], vec_lvsl(0, &s[2 * wrap]));
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
361 srchv[2].v = (vector signed short) vec_mergeh(zero, tmp);
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
362 srclv[2].v = (vector signed short) vec_mergel(zero, tmp);
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
363 sumhv = vec_madds(srchv[2].v, fv[2].v, sumhv);
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
364 sumlv = vec_madds(srclv[2].v, fv[2].v, sumlv);
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
365
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
366 tv = (vector unsigned char *) &s[3 * wrap];
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
367 tmp = vec_perm(tv[0], tv[1], vec_lvsl(0, &s[3 * wrap]));
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
368 srchv[3].v = (vector signed short) vec_mergeh(zero, tmp);
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
369 srclv[3].v = (vector signed short) vec_mergel(zero, tmp);
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
370 sumhv = vec_madds(srchv[3].v, fv[3].v, sumhv);
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
371 sumlv = vec_madds(srclv[3].v, fv[3].v, sumlv);
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
372
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
373 /*
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
374 Pack the results into our destination vector,
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
375 and do an aligned write of that back to memory.
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
376 */
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
377 dstv = vec_packsu(sumhv, sumlv) ;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
378 vec_st(dstv, 0, (vector unsigned char *) dst);
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
379
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
380 dst+=16;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
381 s+=16;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
382 dst_width-=16;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
383 }
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
384
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
385 /*
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
386 If there are any leftover pixels, resample them
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
387 with the slow scalar method.
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
388 */
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
389 while(dst_width>0) {
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
390 sum = s[0 * wrap] * filter[0] +
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
391 s[1 * wrap] * filter[1] +
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
392 s[2 * wrap] * filter[2] +
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
393 s[3 * wrap] * filter[3];
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
394 sum = sum >> FILTER_BITS;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
395 if (sum<0) sum = 0; else if (sum>255) sum=255;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
396 dst[0] = sum;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
397 dst++;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
398 s++;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
399 dst_width--;
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
400 }
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
401 }
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
402 #endif
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
403
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
404 /* slow version to handle limit cases. Does not need optimisation */
1488
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
405 static void h_resample_slow(uint8_t *dst, int dst_width,
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
406 const uint8_t *src, int src_width,
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
407 int src_start, int src_incr, int16_t *filters)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
408 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
409 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
410 const uint8_t *s, *src_end;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
411 int16_t *filter;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
412
986e461dc072 Initial revision
glantau
parents:
diff changeset
413 src_end = src + src_width;
986e461dc072 Initial revision
glantau
parents:
diff changeset
414 src_pos = src_start;
986e461dc072 Initial revision
glantau
parents:
diff changeset
415 for(i=0;i<dst_width;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
416 s = src + (src_pos >> POS_FRAC_BITS);
986e461dc072 Initial revision
glantau
parents:
diff changeset
417 phase = get_phase(src_pos);
986e461dc072 Initial revision
glantau
parents:
diff changeset
418 filter = filters + phase * NB_TAPS;
986e461dc072 Initial revision
glantau
parents:
diff changeset
419 sum = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
420 for(j=0;j<NB_TAPS;j++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
421 if (s < src)
986e461dc072 Initial revision
glantau
parents:
diff changeset
422 v = src[0];
986e461dc072 Initial revision
glantau
parents:
diff changeset
423 else if (s >= src_end)
986e461dc072 Initial revision
glantau
parents:
diff changeset
424 v = src_end[-1];
986e461dc072 Initial revision
glantau
parents:
diff changeset
425 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
426 v = s[0];
986e461dc072 Initial revision
glantau
parents:
diff changeset
427 sum += v * filter[j];
986e461dc072 Initial revision
glantau
parents:
diff changeset
428 s++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
429 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
430 sum = sum >> FILTER_BITS;
986e461dc072 Initial revision
glantau
parents:
diff changeset
431 if (sum < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
432 sum = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
433 else if (sum > 255)
986e461dc072 Initial revision
glantau
parents:
diff changeset
434 sum = 255;
986e461dc072 Initial revision
glantau
parents:
diff changeset
435 dst[0] = sum;
986e461dc072 Initial revision
glantau
parents:
diff changeset
436 src_pos += src_incr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
437 dst++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
438 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
439 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
440
1488
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
441 static void h_resample(uint8_t *dst, int dst_width, const uint8_t *src,
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
442 int src_width, int src_start, int src_incr,
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
443 int16_t *filters)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
444 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
445 int n, src_end;
986e461dc072 Initial revision
glantau
parents:
diff changeset
446
986e461dc072 Initial revision
glantau
parents:
diff changeset
447 if (src_start < 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
448 n = (0 - src_start + src_incr - 1) / src_incr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
449 h_resample_slow(dst, n, src, src_width, src_start, src_incr, filters);
986e461dc072 Initial revision
glantau
parents:
diff changeset
450 dst += n;
986e461dc072 Initial revision
glantau
parents:
diff changeset
451 dst_width -= n;
986e461dc072 Initial revision
glantau
parents:
diff changeset
452 src_start += n * src_incr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
453 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
454 src_end = src_start + dst_width * src_incr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
455 if (src_end > ((src_width - NB_TAPS) << POS_FRAC_BITS)) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
456 n = (((src_width - NB_TAPS + 1) << POS_FRAC_BITS) - 1 - src_start) /
986e461dc072 Initial revision
glantau
parents:
diff changeset
457 src_incr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
458 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
459 n = dst_width;
986e461dc072 Initial revision
glantau
parents:
diff changeset
460 }
2
2e2c46c87460 fixed config for direct mplayer build compatibility
glantau
parents: 0
diff changeset
461 #ifdef HAVE_MMX
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
462 if ((mm_flags & MM_MMX) && NB_TAPS == 4)
986e461dc072 Initial revision
glantau
parents:
diff changeset
463 h_resample_fast4_mmx(dst, n,
986e461dc072 Initial revision
glantau
parents:
diff changeset
464 src, src_width, src_start, src_incr, filters);
986e461dc072 Initial revision
glantau
parents:
diff changeset
465 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
466 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
467 h_resample_fast(dst, n,
986e461dc072 Initial revision
glantau
parents:
diff changeset
468 src, src_width, src_start, src_incr, filters);
986e461dc072 Initial revision
glantau
parents:
diff changeset
469 if (n < dst_width) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
470 dst += n;
986e461dc072 Initial revision
glantau
parents:
diff changeset
471 dst_width -= n;
986e461dc072 Initial revision
glantau
parents:
diff changeset
472 src_start += n * src_incr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
473 h_resample_slow(dst, dst_width,
986e461dc072 Initial revision
glantau
parents:
diff changeset
474 src, src_width, src_start, src_incr, filters);
986e461dc072 Initial revision
glantau
parents:
diff changeset
475 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
476 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
477
986e461dc072 Initial revision
glantau
parents:
diff changeset
478 static void component_resample(ImgReSampleContext *s,
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
479 uint8_t *output, int owrap, int owidth, int oheight,
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
480 uint8_t *input, int iwrap, int iwidth, int iheight)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
481 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
482 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
483 uint8_t *new_line, *src_line;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
484
986e461dc072 Initial revision
glantau
parents:
diff changeset
485 last_src_y = - FCENTER - 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
486 /* position of the bottom of the filter in the source image */
986e461dc072 Initial revision
glantau
parents:
diff changeset
487 src_y = (last_src_y + NB_TAPS) * POS_FRAC;
986e461dc072 Initial revision
glantau
parents:
diff changeset
488 ring_y = NB_TAPS; /* position in ring buffer */
986e461dc072 Initial revision
glantau
parents:
diff changeset
489 for(y=0;y<oheight;y++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
490 /* apply horizontal filter on new lines from input if needed */
986e461dc072 Initial revision
glantau
parents:
diff changeset
491 src_y1 = src_y >> POS_FRAC_BITS;
986e461dc072 Initial revision
glantau
parents:
diff changeset
492 while (last_src_y < src_y1) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
493 if (++ring_y >= LINE_BUF_HEIGHT + NB_TAPS)
986e461dc072 Initial revision
glantau
parents:
diff changeset
494 ring_y = NB_TAPS;
986e461dc072 Initial revision
glantau
parents:
diff changeset
495 last_src_y++;
630
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
496 /* 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
497 inefficient because we filter multiple times) */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
498 y1 = last_src_y;
986e461dc072 Initial revision
glantau
parents:
diff changeset
499 if (y1 < 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
500 y1 = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
501 } else if (y1 >= iheight) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
502 y1 = iheight - 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
503 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
504 src_line = input + y1 * iwrap;
986e461dc072 Initial revision
glantau
parents:
diff changeset
505 new_line = s->line_buf + ring_y * owidth;
986e461dc072 Initial revision
glantau
parents:
diff changeset
506 /* apply filter and handle limit cases correctly */
986e461dc072 Initial revision
glantau
parents:
diff changeset
507 h_resample(new_line, owidth,
986e461dc072 Initial revision
glantau
parents:
diff changeset
508 src_line, iwidth, - FCENTER * POS_FRAC, s->h_incr,
986e461dc072 Initial revision
glantau
parents:
diff changeset
509 &s->h_filters[0][0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
510 /* handle ring buffer wraping */
986e461dc072 Initial revision
glantau
parents:
diff changeset
511 if (ring_y >= LINE_BUF_HEIGHT) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
512 memcpy(s->line_buf + (ring_y - LINE_BUF_HEIGHT) * owidth,
986e461dc072 Initial revision
glantau
parents:
diff changeset
513 new_line, owidth);
986e461dc072 Initial revision
glantau
parents:
diff changeset
514 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
515 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
516 /* apply vertical filter */
986e461dc072 Initial revision
glantau
parents:
diff changeset
517 phase_y = get_phase(src_y);
2
2e2c46c87460 fixed config for direct mplayer build compatibility
glantau
parents: 0
diff changeset
518 #ifdef HAVE_MMX
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
519 /* desactivated MMX because loss of precision */
986e461dc072 Initial revision
glantau
parents:
diff changeset
520 if ((mm_flags & MM_MMX) && NB_TAPS == 4 && 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
521 v_resample4_mmx(output, owidth,
986e461dc072 Initial revision
glantau
parents:
diff changeset
522 s->line_buf + (ring_y - NB_TAPS + 1) * owidth, owidth,
986e461dc072 Initial revision
glantau
parents:
diff changeset
523 &s->v_filters[phase_y][0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
524 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
525 #endif
894
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
526 #ifdef HAVE_ALTIVEC
920
a0ad8e3452f2 practically disabling altivec resampling code (some ppl said its broken) patch by (Dieter Shirley <dieters at schemasoft dot com>)
michaelni
parents: 898
diff changeset
527 if ((mm_flags & MM_ALTIVEC) && NB_TAPS == 4 && FILTER_BITS <= 6)
894
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
528 v_resample16_altivec(output, owidth,
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
529 s->line_buf + (ring_y - NB_TAPS + 1) * owidth, owidth,
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
530 &s->v_filters[phase_y][0]);
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
531 else
a408778eff87 altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents: 653
diff changeset
532 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
533 v_resample(output, owidth,
986e461dc072 Initial revision
glantau
parents:
diff changeset
534 s->line_buf + (ring_y - NB_TAPS + 1) * owidth, owidth,
986e461dc072 Initial revision
glantau
parents:
diff changeset
535 &s->v_filters[phase_y][0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
536
986e461dc072 Initial revision
glantau
parents:
diff changeset
537 src_y += s->v_incr;
1928
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
538
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
539 output += owrap;
986e461dc072 Initial revision
glantau
parents:
diff changeset
540 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
541 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
542
986e461dc072 Initial revision
glantau
parents:
diff changeset
543 /* XXX: the following filter is quite naive, but it seems to suffice
986e461dc072 Initial revision
glantau
parents:
diff changeset
544 for 4 taps */
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
545 static void build_filter(int16_t *filter, float factor)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
546 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
547 int ph, i, v;
986e461dc072 Initial revision
glantau
parents:
diff changeset
548 float x, y, tab[NB_TAPS], norm, mult;
986e461dc072 Initial revision
glantau
parents:
diff changeset
549
986e461dc072 Initial revision
glantau
parents:
diff changeset
550 /* if upsampling, only need to interpolate, no filter */
986e461dc072 Initial revision
glantau
parents:
diff changeset
551 if (factor > 1.0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
552 factor = 1.0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
553
986e461dc072 Initial revision
glantau
parents:
diff changeset
554 for(ph=0;ph<NB_PHASES;ph++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
555 norm = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
556 for(i=0;i<NB_TAPS;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
557
986e461dc072 Initial revision
glantau
parents:
diff changeset
558 x = M_PI * ((float)(i - FCENTER) - (float)ph / NB_PHASES) * factor;
986e461dc072 Initial revision
glantau
parents:
diff changeset
559 if (x == 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
560 y = 1.0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
561 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
562 y = sin(x) / x;
986e461dc072 Initial revision
glantau
parents:
diff changeset
563 tab[i] = y;
986e461dc072 Initial revision
glantau
parents:
diff changeset
564 norm += y;
986e461dc072 Initial revision
glantau
parents:
diff changeset
565 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
566
986e461dc072 Initial revision
glantau
parents:
diff changeset
567 /* normalize so that an uniform color remains the same */
986e461dc072 Initial revision
glantau
parents:
diff changeset
568 mult = (float)(1 << FILTER_BITS) / norm;
986e461dc072 Initial revision
glantau
parents:
diff changeset
569 for(i=0;i<NB_TAPS;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
570 v = (int)(tab[i] * mult);
986e461dc072 Initial revision
glantau
parents:
diff changeset
571 filter[ph * NB_TAPS + i] = v;
986e461dc072 Initial revision
glantau
parents:
diff changeset
572 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
573 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
574 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
575
986e461dc072 Initial revision
glantau
parents:
diff changeset
576 ImgReSampleContext *img_resample_init(int owidth, int oheight,
986e461dc072 Initial revision
glantau
parents:
diff changeset
577 int iwidth, int iheight)
986e461dc072 Initial revision
glantau
parents:
diff changeset
578 {
1928
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
579 return img_resample_full_init(owidth, oheight, iwidth, iheight,
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
580 0, 0, 0, 0, 0, 0, 0, 0);
630
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
581 }
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
582
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
583 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
584 int iwidth, int iheight,
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
585 int topBand, int bottomBand,
1928
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
586 int leftBand, int rightBand,
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
587 int padtop, int padbottom,
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
588 int padleft, int padright)
630
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
589 {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
590 ImgReSampleContext *s;
986e461dc072 Initial revision
glantau
parents:
diff changeset
591
986e461dc072 Initial revision
glantau
parents:
diff changeset
592 s = av_mallocz(sizeof(ImgReSampleContext));
986e461dc072 Initial revision
glantau
parents:
diff changeset
593 if (!s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
594 return NULL;
986e461dc072 Initial revision
glantau
parents:
diff changeset
595 s->line_buf = av_mallocz(owidth * (LINE_BUF_HEIGHT + NB_TAPS));
986e461dc072 Initial revision
glantau
parents:
diff changeset
596 if (!s->line_buf)
986e461dc072 Initial revision
glantau
parents:
diff changeset
597 goto fail;
986e461dc072 Initial revision
glantau
parents:
diff changeset
598
986e461dc072 Initial revision
glantau
parents:
diff changeset
599 s->owidth = owidth;
986e461dc072 Initial revision
glantau
parents:
diff changeset
600 s->oheight = oheight;
986e461dc072 Initial revision
glantau
parents:
diff changeset
601 s->iwidth = iwidth;
986e461dc072 Initial revision
glantau
parents:
diff changeset
602 s->iheight = iheight;
1928
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
603
630
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
604 s->topBand = topBand;
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
605 s->bottomBand = bottomBand;
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
606 s->leftBand = leftBand;
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
607 s->rightBand = rightBand;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
608
1928
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
609 s->padtop = padtop;
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
610 s->padbottom = padbottom;
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
611 s->padleft = padleft;
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
612 s->padright = padright;
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
613
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
614 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
615 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
616
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
617 s->h_incr = ((iwidth - leftBand - rightBand) * POS_FRAC) / s->pad_owidth;
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
618 s->v_incr = ((iheight - topBand - bottomBand) * POS_FRAC) / s->pad_oheight;
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
619
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
620 build_filter(&s->h_filters[0][0], (float) s->pad_owidth /
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
621 (float) (iwidth - leftBand - rightBand));
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
622 build_filter(&s->v_filters[0][0], (float) s->pad_oheight /
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
623 (float) (iheight - topBand - bottomBand));
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
624
986e461dc072 Initial revision
glantau
parents:
diff changeset
625 return s;
1928
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
626 fail:
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 18
diff changeset
627 av_free(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
628 return NULL;
986e461dc072 Initial revision
glantau
parents:
diff changeset
629 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
630
986e461dc072 Initial revision
glantau
parents:
diff changeset
631 void img_resample(ImgReSampleContext *s,
1488
766a2f4edbea avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents: 1106
diff changeset
632 AVPicture *output, const AVPicture *input)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
633 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
634 int i, shift;
1928
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
635 uint8_t* optr;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
636
1928
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
637 for (i=0;i<3;i++) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
638 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
639
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
640 optr = output->data[i] + (((output->linesize[i] *
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
641 s->padtop) + s->padleft) >> shift);
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
642
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
643 component_resample(s, optr, output->linesize[i],
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
644 s->pad_owidth >> shift, s->pad_oheight >> shift,
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
645 input->data[i] + (input->linesize[i] *
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
646 (s->topBand >> shift)) + (s->leftBand >> shift),
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
647 input->linesize[i], ((s->iwidth - s->leftBand -
0c23a5564489 padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents: 1488
diff changeset
648 s->rightBand) >> shift),
630
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
649 (s->iheight - s->topBand - s->bottomBand) >> shift);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
650 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
651 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
652
986e461dc072 Initial revision
glantau
parents:
diff changeset
653 void img_resample_close(ImgReSampleContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
654 {
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 18
diff changeset
655 av_free(s->line_buf);
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 18
diff changeset
656 av_free(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
657 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
658
986e461dc072 Initial revision
glantau
parents:
diff changeset
659 #ifdef TEST
986e461dc072 Initial revision
glantau
parents:
diff changeset
660
986e461dc072 Initial revision
glantau
parents:
diff changeset
661 void *av_mallocz(int size)
986e461dc072 Initial revision
glantau
parents:
diff changeset
662 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
663 void *ptr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
664 ptr = malloc(size);
986e461dc072 Initial revision
glantau
parents:
diff changeset
665 memset(ptr, 0, size);
986e461dc072 Initial revision
glantau
parents:
diff changeset
666 return ptr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
667 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
668
630
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
669 void av_free(void *ptr)
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
670 {
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
671 /* XXX: this test should not be needed on most libcs */
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
672 if (ptr)
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
673 free(ptr);
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
674 }
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
675
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
676 /* input */
986e461dc072 Initial revision
glantau
parents:
diff changeset
677 #define XSIZE 256
986e461dc072 Initial revision
glantau
parents:
diff changeset
678 #define YSIZE 256
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
679 uint8_t img[XSIZE * YSIZE];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
680
986e461dc072 Initial revision
glantau
parents:
diff changeset
681 /* output */
986e461dc072 Initial revision
glantau
parents:
diff changeset
682 #define XSIZE1 512
986e461dc072 Initial revision
glantau
parents:
diff changeset
683 #define YSIZE1 512
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
684 uint8_t img1[XSIZE1 * YSIZE1];
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
685 uint8_t img2[XSIZE1 * YSIZE1];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
686
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
687 void save_pgm(const char *filename, uint8_t *img, int xsize, int ysize)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
688 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
689 FILE *f;
986e461dc072 Initial revision
glantau
parents:
diff changeset
690 f=fopen(filename,"w");
986e461dc072 Initial revision
glantau
parents:
diff changeset
691 fprintf(f,"P5\n%d %d\n%d\n", xsize, ysize, 255);
986e461dc072 Initial revision
glantau
parents:
diff changeset
692 fwrite(img,1, xsize * ysize,f);
986e461dc072 Initial revision
glantau
parents:
diff changeset
693 fclose(f);
986e461dc072 Initial revision
glantau
parents:
diff changeset
694 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
695
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
696 static void dump_filter(int16_t *filter)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
697 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
698 int i, ph;
986e461dc072 Initial revision
glantau
parents:
diff changeset
699
986e461dc072 Initial revision
glantau
parents:
diff changeset
700 for(ph=0;ph<NB_PHASES;ph++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
701 printf("%2d: ", ph);
986e461dc072 Initial revision
glantau
parents:
diff changeset
702 for(i=0;i<NB_TAPS;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
703 printf(" %5.2f", filter[ph * NB_TAPS + i] / 256.0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
704 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
705 printf("\n");
986e461dc072 Initial revision
glantau
parents:
diff changeset
706 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
707 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
708
2
2e2c46c87460 fixed config for direct mplayer build compatibility
glantau
parents: 0
diff changeset
709 #ifdef HAVE_MMX
644
641708b5c33c fixing tests
michaelni
parents: 630
diff changeset
710 int mm_flags;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
711 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
712
986e461dc072 Initial revision
glantau
parents:
diff changeset
713 int main(int argc, char **argv)
986e461dc072 Initial revision
glantau
parents:
diff changeset
714 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
715 int x, y, v, i, xsize, ysize;
986e461dc072 Initial revision
glantau
parents:
diff changeset
716 ImgReSampleContext *s;
986e461dc072 Initial revision
glantau
parents:
diff changeset
717 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
718 char buf[256];
986e461dc072 Initial revision
glantau
parents:
diff changeset
719
986e461dc072 Initial revision
glantau
parents:
diff changeset
720 /* build test image */
986e461dc072 Initial revision
glantau
parents:
diff changeset
721 for(y=0;y<YSIZE;y++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
722 for(x=0;x<XSIZE;x++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
723 if (x < XSIZE/2 && y < YSIZE/2) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
724 if (x < XSIZE/4 && y < YSIZE/4) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
725 if ((x % 10) <= 6 &&
986e461dc072 Initial revision
glantau
parents:
diff changeset
726 (y % 10) <= 6)
986e461dc072 Initial revision
glantau
parents:
diff changeset
727 v = 0xff;
986e461dc072 Initial revision
glantau
parents:
diff changeset
728 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
729 v = 0x00;
986e461dc072 Initial revision
glantau
parents:
diff changeset
730 } else if (x < XSIZE/4) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
731 if (x & 1)
986e461dc072 Initial revision
glantau
parents:
diff changeset
732 v = 0xff;
986e461dc072 Initial revision
glantau
parents:
diff changeset
733 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
734 v = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
735 } else if (y < XSIZE/4) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
736 if (y & 1)
986e461dc072 Initial revision
glantau
parents:
diff changeset
737 v = 0xff;
986e461dc072 Initial revision
glantau
parents:
diff changeset
738 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
739 v = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
740 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
741 if (y < YSIZE*3/8) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
742 if ((y+x) & 1)
986e461dc072 Initial revision
glantau
parents:
diff changeset
743 v = 0xff;
986e461dc072 Initial revision
glantau
parents:
diff changeset
744 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
745 v = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
746 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
747 if (((x+3) % 4) <= 1 &&
986e461dc072 Initial revision
glantau
parents:
diff changeset
748 ((y+3) % 4) <= 1)
986e461dc072 Initial revision
glantau
parents:
diff changeset
749 v = 0xff;
986e461dc072 Initial revision
glantau
parents:
diff changeset
750 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
751 v = 0x00;
986e461dc072 Initial revision
glantau
parents:
diff changeset
752 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
753 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
754 } else if (x < XSIZE/2) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
755 v = ((x - (XSIZE/2)) * 255) / (XSIZE/2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
756 } else if (y < XSIZE/2) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
757 v = ((y - (XSIZE/2)) * 255) / (XSIZE/2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
758 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
759 v = ((x + y - XSIZE) * 255) / XSIZE;
986e461dc072 Initial revision
glantau
parents:
diff changeset
760 }
630
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
761 img[(YSIZE - y) * XSIZE + (XSIZE - x)] = v;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
762 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
763 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
764 save_pgm("/tmp/in.pgm", img, XSIZE, YSIZE);
986e461dc072 Initial revision
glantau
parents:
diff changeset
765 for(i=0;i<sizeof(factors)/sizeof(float);i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
766 fact = factors[i];
986e461dc072 Initial revision
glantau
parents:
diff changeset
767 xsize = (int)(XSIZE * fact);
630
b4ee42142ad1 croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents: 429
diff changeset
768 ysize = (int)((YSIZE - 100) * fact);
644
641708b5c33c fixing tests
michaelni
parents: 630
diff changeset
769 s = img_resample_full_init(xsize, ysize, XSIZE, YSIZE, 50 ,50, 0, 0);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
770 printf("Factor=%0.2f\n", fact);
986e461dc072 Initial revision
glantau
parents:
diff changeset
771 dump_filter(&s->h_filters[0][0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
772 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
773 img + 50 * XSIZE, XSIZE, XSIZE, YSIZE - 100);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
774 img_resample_close(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
775
986e461dc072 Initial revision
glantau
parents:
diff changeset
776 sprintf(buf, "/tmp/out%d.pgm", i);
986e461dc072 Initial revision
glantau
parents:
diff changeset
777 save_pgm(buf, img1, xsize, ysize);
986e461dc072 Initial revision
glantau
parents:
diff changeset
778 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
779
986e461dc072 Initial revision
glantau
parents:
diff changeset
780 /* mmx test */
2
2e2c46c87460 fixed config for direct mplayer build compatibility
glantau
parents: 0
diff changeset
781 #ifdef HAVE_MMX
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
782 printf("MMX test\n");
986e461dc072 Initial revision
glantau
parents:
diff changeset
783 fact = 0.72;
986e461dc072 Initial revision
glantau
parents:
diff changeset
784 xsize = (int)(XSIZE * fact);
986e461dc072 Initial revision
glantau
parents:
diff changeset
785 ysize = (int)(YSIZE * fact);
986e461dc072 Initial revision
glantau
parents:
diff changeset
786 mm_flags = MM_MMX;
986e461dc072 Initial revision
glantau
parents:
diff changeset
787 s = img_resample_init(xsize, ysize, XSIZE, YSIZE);
986e461dc072 Initial revision
glantau
parents:
diff changeset
788 component_resample(s, img1, xsize, xsize, ysize,
986e461dc072 Initial revision
glantau
parents:
diff changeset
789 img, XSIZE, XSIZE, YSIZE);
986e461dc072 Initial revision
glantau
parents:
diff changeset
790
986e461dc072 Initial revision
glantau
parents:
diff changeset
791 mm_flags = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
792 s = img_resample_init(xsize, ysize, XSIZE, YSIZE);
986e461dc072 Initial revision
glantau
parents:
diff changeset
793 component_resample(s, img2, xsize, xsize, ysize,
986e461dc072 Initial revision
glantau
parents:
diff changeset
794 img, XSIZE, XSIZE, YSIZE);
986e461dc072 Initial revision
glantau
parents:
diff changeset
795 if (memcmp(img1, img2, xsize * ysize) != 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
796 fprintf(stderr, "mmx error\n");
986e461dc072 Initial revision
glantau
parents:
diff changeset
797 exit(1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
798 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
799 printf("MMX OK\n");
986e461dc072 Initial revision
glantau
parents:
diff changeset
800 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
801 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
802 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
803
986e461dc072 Initial revision
glantau
parents:
diff changeset
804 #endif