Mercurial > libavcodec.hg
annotate imgresample.c @ 4580:55d7ebd2d699 libavcodec
fix chroma mc2 bug, this is based on a patch by (Oleg Metelitsa oleg hitron co kr)
and does slow the mc2 chroma put down, avg interrestingly seems unaffected speedwise on duron
this of course should be rather done in a way which doesnt slow it down but its better a few %
slower but correct then incorrect
| author | michael |
|---|---|
| date | Fri, 23 Feb 2007 14:29:13 +0000 |
| parents | 1654075b205c |
| children | 6a900f539e2c |
| rev | line source |
|---|---|
| 0 | 1 /* |
| 2967 | 2 * High quality image resampling with polyphase filters |
| 429 | 3 * Copyright (c) 2001 Fabrice Bellard. |
| 0 | 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 | 8 * modify it under the terms of the GNU Lesser General Public |
| 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 | 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 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 429 | 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 15 * Lesser General Public License for more details. | |
| 0 | 16 * |
| 429 | 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 | 20 */ |
| 2967 | 21 |
| 1106 | 22 /** |
| 23 * @file imgresample.c | |
| 24 * High quality image resampling with polyphase filters . | |
| 25 */ | |
| 2967 | 26 |
|
396
fce0a2520551
removed useless header includes - use av memory functions
glantau
parents:
18
diff
changeset
|
27 #include "avcodec.h" |
| 3249 | 28 #include "swscale.h" |
| 0 | 29 #include "dsputil.h" |
| 30 | |
| 17 | 31 #ifdef USE_FASTMEMCPY |
| 3589 | 32 #include "libvo/fastmemcpy.h" |
| 17 | 33 #endif |
| 34 | |
| 0 | 35 #define NB_COMPONENTS 3 |
| 36 | |
| 37 #define PHASE_BITS 4 | |
| 38 #define NB_PHASES (1 << PHASE_BITS) | |
| 39 #define NB_TAPS 4 | |
| 40 #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
|
41 //#define TEST 1 /* Test it */ |
| 0 | 42 |
| 43 #define POS_FRAC_BITS 16 | |
| 44 #define POS_FRAC (1 << POS_FRAC_BITS) | |
| 45 /* 6 bits precision is needed for MMX */ | |
| 46 #define FILTER_BITS 8 | |
| 47 | |
| 48 #define LINE_BUF_HEIGHT (NB_TAPS * 4) | |
| 49 | |
|
4065
93163e2a2398
Do not use a fake libavcodec/swscale.h, but always use the real one
lucabe
parents:
4036
diff
changeset
|
50 struct SwsContext { |
|
93163e2a2398
Do not use a fake libavcodec/swscale.h, but always use the real one
lucabe
parents:
4036
diff
changeset
|
51 struct ImgReSampleContext *resampling_ctx; |
|
93163e2a2398
Do not use a fake libavcodec/swscale.h, but always use the real one
lucabe
parents:
4036
diff
changeset
|
52 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
|
53 }; |
|
93163e2a2398
Do not use a fake libavcodec/swscale.h, but always use the real one
lucabe
parents:
4036
diff
changeset
|
54 |
| 0 | 55 struct ImgReSampleContext { |
|
1928
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
56 int iwidth, iheight, owidth, oheight; |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
57 int topBand, bottomBand, leftBand, rightBand; |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
58 int padtop, padbottom, padleft, padright; |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
59 int pad_owidth, pad_oheight; |
| 0 | 60 int h_incr, v_incr; |
| 3089 | 61 DECLARE_ALIGNED_8(int16_t, h_filters[NB_PHASES][NB_TAPS]); /* horizontal filters */ |
| 62 DECLARE_ALIGNED_8(int16_t, v_filters[NB_PHASES][NB_TAPS]); /* vertical filters */ | |
| 1064 | 63 uint8_t *line_buf; |
| 0 | 64 }; |
| 65 | |
|
2082
3dc9bbe1b152
polyphase kaiser windowed sinc and blackman nuttall windowed sinc audio resample filters
michael
parents:
2064
diff
changeset
|
66 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
|
67 |
| 0 | 68 static inline int get_phase(int pos) |
| 69 { | |
| 70 return ((pos) >> (POS_FRAC_BITS - PHASE_BITS)) & ((1 << PHASE_BITS) - 1); | |
| 71 } | |
| 72 | |
| 73 /* This function must be optimized */ | |
|
1488
766a2f4edbea
avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents:
1106
diff
changeset
|
74 static void h_resample_fast(uint8_t *dst, int dst_width, const uint8_t *src, |
| 2979 | 75 int src_width, int src_start, int src_incr, |
| 76 int16_t *filters) | |
| 0 | 77 { |
| 78 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
|
79 const uint8_t *s; |
| 1064 | 80 int16_t *filter; |
| 0 | 81 |
| 82 src_pos = src_start; | |
| 83 for(i=0;i<dst_width;i++) { | |
| 84 #ifdef TEST | |
| 85 /* test */ | |
| 86 if ((src_pos >> POS_FRAC_BITS) < 0 || | |
| 87 (src_pos >> POS_FRAC_BITS) > (src_width - NB_TAPS)) | |
| 653 | 88 av_abort(); |
| 0 | 89 #endif |
| 90 s = src + (src_pos >> POS_FRAC_BITS); | |
| 91 phase = get_phase(src_pos); | |
| 92 filter = filters + phase * NB_TAPS; | |
| 93 #if NB_TAPS == 4 | |
| 94 sum = s[0] * filter[0] + | |
| 95 s[1] * filter[1] + | |
| 96 s[2] * filter[2] + | |
| 97 s[3] * filter[3]; | |
| 98 #else | |
| 99 { | |
| 100 int j; | |
| 101 sum = 0; | |
| 102 for(j=0;j<NB_TAPS;j++) | |
| 103 sum += s[j] * filter[j]; | |
| 104 } | |
| 105 #endif | |
| 106 sum = sum >> FILTER_BITS; | |
| 107 if (sum < 0) | |
| 108 sum = 0; | |
| 109 else if (sum > 255) | |
| 110 sum = 255; | |
| 111 dst[0] = sum; | |
| 112 src_pos += src_incr; | |
| 113 dst++; | |
| 114 } | |
| 115 } | |
| 116 | |
| 117 /* This function must be optimized */ | |
|
1488
766a2f4edbea
avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents:
1106
diff
changeset
|
118 static void v_resample(uint8_t *dst, int dst_width, const uint8_t *src, |
| 2979 | 119 int wrap, int16_t *filter) |
| 0 | 120 { |
| 121 int sum, i; | |
|
1488
766a2f4edbea
avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents:
1106
diff
changeset
|
122 const uint8_t *s; |
| 0 | 123 |
| 124 s = src; | |
| 125 for(i=0;i<dst_width;i++) { | |
| 126 #if NB_TAPS == 4 | |
| 127 sum = s[0 * wrap] * filter[0] + | |
| 128 s[1 * wrap] * filter[1] + | |
| 129 s[2 * wrap] * filter[2] + | |
| 130 s[3 * wrap] * filter[3]; | |
| 131 #else | |
| 132 { | |
| 133 int j; | |
| 1064 | 134 uint8_t *s1 = s; |
| 0 | 135 |
| 136 sum = 0; | |
| 137 for(j=0;j<NB_TAPS;j++) { | |
| 138 sum += s1[0] * filter[j]; | |
| 139 s1 += wrap; | |
| 140 } | |
| 141 } | |
| 142 #endif | |
| 143 sum = sum >> FILTER_BITS; | |
| 144 if (sum < 0) | |
| 145 sum = 0; | |
| 146 else if (sum > 255) | |
| 147 sum = 255; | |
| 148 dst[0] = sum; | |
| 149 dst++; | |
| 150 s++; | |
| 151 } | |
| 152 } | |
| 153 | |
| 2 | 154 #ifdef HAVE_MMX |
| 0 | 155 |
| 156 #include "i386/mmx.h" | |
| 157 | |
| 158 #define FILTER4(reg) \ | |
| 159 {\ | |
| 160 s = src + (src_pos >> POS_FRAC_BITS);\ | |
| 161 phase = get_phase(src_pos);\ | |
| 162 filter = filters + phase * NB_TAPS;\ | |
| 163 movq_m2r(*s, reg);\ | |
| 164 punpcklbw_r2r(mm7, reg);\ | |
| 165 movq_m2r(*filter, mm6);\ | |
| 166 pmaddwd_r2r(reg, mm6);\ | |
| 167 movq_r2r(mm6, reg);\ | |
| 168 psrlq_i2r(32, reg);\ | |
| 169 paddd_r2r(mm6, reg);\ | |
| 170 psrad_i2r(FILTER_BITS, reg);\ | |
| 171 src_pos += src_incr;\ | |
| 172 } | |
| 173 | |
|
4122
daae66c03857
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
4105
diff
changeset
|
174 #define DUMP(reg) movq_r2m(reg, tmp); printf(#reg "=%016"PRIx64"\n", tmp.uq); |
| 0 | 175 |
| 176 /* 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
|
177 static void h_resample_fast4_mmx(uint8_t *dst, int dst_width, |
| 2979 | 178 const uint8_t *src, int src_width, |
| 1064 | 179 int src_start, int src_incr, int16_t *filters) |
| 0 | 180 { |
| 181 int src_pos, phase; | |
|
1488
766a2f4edbea
avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents:
1106
diff
changeset
|
182 const uint8_t *s; |
| 1064 | 183 int16_t *filter; |
| 0 | 184 mmx_t tmp; |
| 2967 | 185 |
| 0 | 186 src_pos = src_start; |
| 187 pxor_r2r(mm7, mm7); | |
| 188 | |
| 189 while (dst_width >= 4) { | |
| 190 | |
| 191 FILTER4(mm0); | |
| 192 FILTER4(mm1); | |
| 193 FILTER4(mm2); | |
| 194 FILTER4(mm3); | |
| 195 | |
| 196 packuswb_r2r(mm7, mm0); | |
| 197 packuswb_r2r(mm7, mm1); | |
| 198 packuswb_r2r(mm7, mm3); | |
| 199 packuswb_r2r(mm7, mm2); | |
| 200 movq_r2m(mm0, tmp); | |
| 201 dst[0] = tmp.ub[0]; | |
| 202 movq_r2m(mm1, tmp); | |
| 203 dst[1] = tmp.ub[0]; | |
| 204 movq_r2m(mm2, tmp); | |
| 205 dst[2] = tmp.ub[0]; | |
| 206 movq_r2m(mm3, tmp); | |
| 207 dst[3] = tmp.ub[0]; | |
| 208 dst += 4; | |
| 209 dst_width -= 4; | |
| 210 } | |
| 211 while (dst_width > 0) { | |
| 212 FILTER4(mm0); | |
| 213 packuswb_r2r(mm7, mm0); | |
| 214 movq_r2m(mm0, tmp); | |
| 215 dst[0] = tmp.ub[0]; | |
| 216 dst++; | |
| 217 dst_width--; | |
| 218 } | |
| 219 emms(); | |
| 220 } | |
| 221 | |
|
1488
766a2f4edbea
avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents:
1106
diff
changeset
|
222 static void v_resample4_mmx(uint8_t *dst, int dst_width, const uint8_t *src, |
| 2979 | 223 int wrap, int16_t *filter) |
| 0 | 224 { |
| 225 int sum, i, v; | |
|
1488
766a2f4edbea
avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents:
1106
diff
changeset
|
226 const uint8_t *s; |
| 0 | 227 mmx_t tmp; |
| 228 mmx_t coefs[4]; | |
| 2967 | 229 |
| 0 | 230 for(i=0;i<4;i++) { |
| 231 v = filter[i]; | |
| 232 coefs[i].uw[0] = v; | |
| 233 coefs[i].uw[1] = v; | |
| 234 coefs[i].uw[2] = v; | |
| 235 coefs[i].uw[3] = v; | |
| 236 } | |
| 2967 | 237 |
| 0 | 238 pxor_r2r(mm7, mm7); |
| 239 s = src; | |
| 240 while (dst_width >= 4) { | |
| 241 movq_m2r(s[0 * wrap], mm0); | |
| 242 punpcklbw_r2r(mm7, mm0); | |
| 243 movq_m2r(s[1 * wrap], mm1); | |
| 244 punpcklbw_r2r(mm7, mm1); | |
| 245 movq_m2r(s[2 * wrap], mm2); | |
| 246 punpcklbw_r2r(mm7, mm2); | |
| 247 movq_m2r(s[3 * wrap], mm3); | |
| 248 punpcklbw_r2r(mm7, mm3); | |
| 249 | |
| 250 pmullw_m2r(coefs[0], mm0); | |
| 251 pmullw_m2r(coefs[1], mm1); | |
| 252 pmullw_m2r(coefs[2], mm2); | |
| 253 pmullw_m2r(coefs[3], mm3); | |
| 254 | |
| 255 paddw_r2r(mm1, mm0); | |
| 256 paddw_r2r(mm3, mm2); | |
| 257 paddw_r2r(mm2, mm0); | |
| 258 psraw_i2r(FILTER_BITS, mm0); | |
| 2967 | 259 |
| 0 | 260 packuswb_r2r(mm7, mm0); |
| 261 movq_r2m(mm0, tmp); | |
| 262 | |
| 1064 | 263 *(uint32_t *)dst = tmp.ud[0]; |
| 0 | 264 dst += 4; |
| 265 s += 4; | |
| 266 dst_width -= 4; | |
| 267 } | |
| 268 while (dst_width > 0) { | |
| 269 sum = s[0 * wrap] * filter[0] + | |
| 270 s[1 * wrap] * filter[1] + | |
| 271 s[2 * wrap] * filter[2] + | |
| 272 s[3 * wrap] * filter[3]; | |
| 273 sum = sum >> FILTER_BITS; | |
| 274 if (sum < 0) | |
| 275 sum = 0; | |
| 276 else if (sum > 255) | |
| 277 sum = 255; | |
| 278 dst[0] = sum; | |
| 279 dst++; | |
| 280 s++; | |
| 281 dst_width--; | |
| 282 } | |
| 283 emms(); | |
| 284 } | |
| 285 #endif | |
| 286 | |
|
894
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
287 #ifdef HAVE_ALTIVEC |
| 2979 | 288 typedef union { |
|
894
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
289 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
|
290 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
|
291 } vec_uc_t; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
292 |
| 2979 | 293 typedef union { |
|
894
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
294 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
|
295 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
|
296 } vec_ss_t; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
297 |
|
1488
766a2f4edbea
avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents:
1106
diff
changeset
|
298 void v_resample16_altivec(uint8_t *dst, int dst_width, const uint8_t *src, |
| 2979 | 299 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
|
300 { |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
301 int sum, i; |
|
1488
766a2f4edbea
avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents:
1106
diff
changeset
|
302 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
|
303 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
|
304 vec_ss_t srchv[4], srclv[4], fv[4]; |
| 2967 | 305 vector signed short zeros, sumhv, sumlv; |
|
894
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
306 s = src; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
307 |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
308 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
|
309 { |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
310 /* |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
311 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
|
312 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
|
313 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
|
314 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
|
315 */ |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
316 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
|
317 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
|
318 } |
| 2967 | 319 |
|
894
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
320 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
|
321 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
|
322 |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
323 |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
324 /* |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
325 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
|
326 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
|
327 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
|
328 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
|
329 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
|
330 */ |
|
898
6d5e3fe7aea1
Simplify an expression and eliminate a compile warning
philipjsg
parents:
894
diff
changeset
|
331 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
|
332 while(i>0) { |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
333 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
|
334 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
|
335 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
|
336 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
|
337 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
|
338 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
|
339 dst[0] = sum; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
340 dst++; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
341 s++; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
342 dst_width--; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
343 i--; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
344 } |
| 2967 | 345 |
|
894
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
346 /* 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
|
347 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
|
348 /* |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
349 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
|
350 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
|
351 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
|
352 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
|
353 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
|
354 */ |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
355 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
|
356 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
|
357 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
|
358 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
|
359 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
|
360 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
|
361 |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
362 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
|
363 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
|
364 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
|
365 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
|
366 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
|
367 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
|
368 |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
369 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
|
370 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
|
371 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
|
372 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
|
373 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
|
374 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
|
375 |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
376 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
|
377 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
|
378 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
|
379 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
|
380 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
|
381 sumlv = vec_madds(srclv[3].v, fv[3].v, sumlv); |
| 2967 | 382 |
|
894
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 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
|
385 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
|
386 */ |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
387 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
|
388 vec_st(dstv, 0, (vector unsigned char *) dst); |
| 2967 | 389 |
|
894
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
390 dst+=16; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
391 s+=16; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
392 dst_width-=16; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
393 } |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
394 |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
395 /* |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
396 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
|
397 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
|
398 */ |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
399 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
|
400 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
|
401 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
|
402 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
|
403 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
|
404 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
|
405 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
|
406 dst[0] = sum; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
407 dst++; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
408 s++; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
409 dst_width--; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
410 } |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
411 } |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
412 #endif |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
413 |
| 0 | 414 /* 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
|
415 static void h_resample_slow(uint8_t *dst, int dst_width, |
| 2979 | 416 const uint8_t *src, int src_width, |
| 1064 | 417 int src_start, int src_incr, int16_t *filters) |
| 0 | 418 { |
| 419 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
|
420 const uint8_t *s, *src_end; |
| 1064 | 421 int16_t *filter; |
| 0 | 422 |
| 423 src_end = src + src_width; | |
| 424 src_pos = src_start; | |
| 425 for(i=0;i<dst_width;i++) { | |
| 426 s = src + (src_pos >> POS_FRAC_BITS); | |
| 427 phase = get_phase(src_pos); | |
| 428 filter = filters + phase * NB_TAPS; | |
| 429 sum = 0; | |
| 430 for(j=0;j<NB_TAPS;j++) { | |
| 431 if (s < src) | |
| 432 v = src[0]; | |
| 433 else if (s >= src_end) | |
| 434 v = src_end[-1]; | |
| 435 else | |
| 436 v = s[0]; | |
| 437 sum += v * filter[j]; | |
| 438 s++; | |
| 439 } | |
| 440 sum = sum >> FILTER_BITS; | |
| 441 if (sum < 0) | |
| 442 sum = 0; | |
| 443 else if (sum > 255) | |
| 444 sum = 255; | |
| 445 dst[0] = sum; | |
| 446 src_pos += src_incr; | |
| 447 dst++; | |
| 448 } | |
| 449 } | |
| 450 | |
|
1488
766a2f4edbea
avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents:
1106
diff
changeset
|
451 static void h_resample(uint8_t *dst, int dst_width, const uint8_t *src, |
| 2979 | 452 int src_width, int src_start, int src_incr, |
| 453 int16_t *filters) | |
| 0 | 454 { |
| 455 int n, src_end; | |
| 456 | |
| 457 if (src_start < 0) { | |
| 458 n = (0 - src_start + src_incr - 1) / src_incr; | |
| 459 h_resample_slow(dst, n, src, src_width, src_start, src_incr, filters); | |
| 460 dst += n; | |
| 461 dst_width -= n; | |
| 462 src_start += n * src_incr; | |
| 463 } | |
| 464 src_end = src_start + dst_width * src_incr; | |
| 465 if (src_end > ((src_width - NB_TAPS) << POS_FRAC_BITS)) { | |
| 2967 | 466 n = (((src_width - NB_TAPS + 1) << POS_FRAC_BITS) - 1 - src_start) / |
| 0 | 467 src_incr; |
| 468 } else { | |
| 469 n = dst_width; | |
| 470 } | |
| 2 | 471 #ifdef HAVE_MMX |
| 4197 | 472 if ((mm_flags & MM_MMX) && NB_TAPS == 4) |
| 2967 | 473 h_resample_fast4_mmx(dst, n, |
| 0 | 474 src, src_width, src_start, src_incr, filters); |
| 475 else | |
| 476 #endif | |
| 2967 | 477 h_resample_fast(dst, n, |
| 0 | 478 src, src_width, src_start, src_incr, filters); |
| 479 if (n < dst_width) { | |
| 480 dst += n; | |
| 481 dst_width -= n; | |
| 482 src_start += n * src_incr; | |
| 2967 | 483 h_resample_slow(dst, dst_width, |
| 0 | 484 src, src_width, src_start, src_incr, filters); |
| 485 } | |
| 486 } | |
| 487 | |
| 2967 | 488 static void component_resample(ImgReSampleContext *s, |
| 1064 | 489 uint8_t *output, int owrap, int owidth, int oheight, |
| 490 uint8_t *input, int iwrap, int iwidth, int iheight) | |
| 0 | 491 { |
| 492 int src_y, src_y1, last_src_y, ring_y, phase_y, y1, y; | |
| 1064 | 493 uint8_t *new_line, *src_line; |
| 0 | 494 |
| 495 last_src_y = - FCENTER - 1; | |
| 496 /* position of the bottom of the filter in the source image */ | |
| 2967 | 497 src_y = (last_src_y + NB_TAPS) * POS_FRAC; |
| 0 | 498 ring_y = NB_TAPS; /* position in ring buffer */ |
| 499 for(y=0;y<oheight;y++) { | |
| 500 /* apply horizontal filter on new lines from input if needed */ | |
| 501 src_y1 = src_y >> POS_FRAC_BITS; | |
| 502 while (last_src_y < src_y1) { | |
| 503 if (++ring_y >= LINE_BUF_HEIGHT + NB_TAPS) | |
| 504 ring_y = NB_TAPS; | |
| 505 last_src_y++; | |
|
630
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
506 /* 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
|
507 inefficient because we filter multiple times) */ |
| 0 | 508 y1 = last_src_y; |
| 509 if (y1 < 0) { | |
| 510 y1 = 0; | |
| 511 } else if (y1 >= iheight) { | |
| 512 y1 = iheight - 1; | |
| 513 } | |
| 514 src_line = input + y1 * iwrap; | |
| 515 new_line = s->line_buf + ring_y * owidth; | |
| 516 /* apply filter and handle limit cases correctly */ | |
| 2967 | 517 h_resample(new_line, owidth, |
| 518 src_line, iwidth, - FCENTER * POS_FRAC, s->h_incr, | |
| 0 | 519 &s->h_filters[0][0]); |
| 520 /* handle ring buffer wraping */ | |
| 521 if (ring_y >= LINE_BUF_HEIGHT) { | |
| 522 memcpy(s->line_buf + (ring_y - LINE_BUF_HEIGHT) * owidth, | |
| 523 new_line, owidth); | |
| 524 } | |
| 525 } | |
| 526 /* apply vertical filter */ | |
| 527 phase_y = get_phase(src_y); | |
| 2 | 528 #ifdef HAVE_MMX |
| 0 | 529 /* desactivated MMX because loss of precision */ |
| 4197 | 530 if ((mm_flags & MM_MMX) && NB_TAPS == 4 && 0) |
| 2967 | 531 v_resample4_mmx(output, owidth, |
| 532 s->line_buf + (ring_y - NB_TAPS + 1) * owidth, owidth, | |
| 0 | 533 &s->v_filters[phase_y][0]); |
| 534 else | |
| 535 #endif | |
|
894
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
536 #ifdef HAVE_ALTIVEC |
| 4197 | 537 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
|
538 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
|
539 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
|
540 &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
|
541 else |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
542 #endif |
| 2967 | 543 v_resample(output, owidth, |
| 544 s->line_buf + (ring_y - NB_TAPS + 1) * owidth, owidth, | |
| 0 | 545 &s->v_filters[phase_y][0]); |
| 2967 | 546 |
| 0 | 547 src_y += s->v_incr; |
| 2967 | 548 |
| 0 | 549 output += owrap; |
| 550 } | |
| 551 } | |
| 552 | |
| 553 ImgReSampleContext *img_resample_init(int owidth, int oheight, | |
| 554 int iwidth, int iheight) | |
| 555 { | |
| 2967 | 556 return img_resample_full_init(owidth, oheight, iwidth, iheight, |
|
1928
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
557 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
|
558 } |
|
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
559 |
|
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
560 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
|
561 int iwidth, int iheight, |
|
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
562 int topBand, int bottomBand, |
|
1928
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
563 int leftBand, int rightBand, |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
564 int padtop, int padbottom, |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
565 int padleft, int padright) |
|
630
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
566 { |
| 0 | 567 ImgReSampleContext *s; |
| 568 | |
| 2904 | 569 if (!owidth || !oheight || !iwidth || !iheight) |
| 2979 | 570 return NULL; |
| 2904 | 571 |
| 0 | 572 s = av_mallocz(sizeof(ImgReSampleContext)); |
| 573 if (!s) | |
| 574 return NULL; | |
| 2422 | 575 if((unsigned)owidth >= UINT_MAX / (LINE_BUF_HEIGHT + NB_TAPS)) |
| 576 return NULL; | |
| 0 | 577 s->line_buf = av_mallocz(owidth * (LINE_BUF_HEIGHT + NB_TAPS)); |
| 2967 | 578 if (!s->line_buf) |
| 0 | 579 goto fail; |
| 2967 | 580 |
| 0 | 581 s->owidth = owidth; |
| 582 s->oheight = oheight; | |
| 583 s->iwidth = iwidth; | |
| 584 s->iheight = iheight; | |
| 2967 | 585 |
|
630
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
586 s->topBand = topBand; |
|
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
587 s->bottomBand = bottomBand; |
|
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
588 s->leftBand = leftBand; |
|
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
589 s->rightBand = rightBand; |
| 2967 | 590 |
|
1928
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
591 s->padtop = padtop; |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
592 s->padbottom = padbottom; |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
593 s->padleft = padleft; |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
594 s->padright = padright; |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
595 |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
596 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
|
597 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
|
598 |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
599 s->h_incr = ((iwidth - leftBand - rightBand) * POS_FRAC) / s->pad_owidth; |
| 2967 | 600 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
|
601 |
| 2967 | 602 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
|
603 (float) (iwidth - leftBand - rightBand), NB_TAPS, NB_PHASES, 1<<FILTER_BITS, 0); |
| 2967 | 604 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
|
605 (float) (iheight - topBand - bottomBand), NB_TAPS, NB_PHASES, 1<<FILTER_BITS, 0); |
| 0 | 606 |
| 607 return s; | |
|
1928
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
608 fail: |
|
396
fce0a2520551
removed useless header includes - use av memory functions
glantau
parents:
18
diff
changeset
|
609 av_free(s); |
| 0 | 610 return NULL; |
| 611 } | |
| 612 | |
| 2967 | 613 void img_resample(ImgReSampleContext *s, |
|
1488
766a2f4edbea
avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents:
1106
diff
changeset
|
614 AVPicture *output, const AVPicture *input) |
| 0 | 615 { |
| 616 int i, shift; | |
|
1928
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
617 uint8_t* optr; |
| 0 | 618 |
|
1928
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
619 for (i=0;i<3;i++) { |
| 0 | 620 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
|
621 |
| 2967 | 622 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
|
623 s->padtop) + s->padleft) >> shift); |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
624 |
| 2967 | 625 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
|
626 s->pad_owidth >> shift, s->pad_oheight >> shift, |
| 2967 | 627 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
|
628 (s->topBand >> shift)) + (s->leftBand >> shift), |
| 2967 | 629 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
|
630 s->rightBand) >> shift), |
|
630
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
631 (s->iheight - s->topBand - s->bottomBand) >> shift); |
| 0 | 632 } |
| 633 } | |
| 634 | |
| 635 void img_resample_close(ImgReSampleContext *s) | |
| 636 { | |
|
396
fce0a2520551
removed useless header includes - use av memory functions
glantau
parents:
18
diff
changeset
|
637 av_free(s->line_buf); |
|
fce0a2520551
removed useless header includes - use av memory functions
glantau
parents:
18
diff
changeset
|
638 av_free(s); |
| 0 | 639 } |
| 640 | |
| 3249 | 641 struct SwsContext *sws_getContext(int srcW, int srcH, int srcFormat, |
| 642 int dstW, int dstH, int dstFormat, | |
| 643 int flags, SwsFilter *srcFilter, | |
| 644 SwsFilter *dstFilter, double *param) | |
| 645 { | |
| 646 struct SwsContext *ctx; | |
| 647 | |
| 648 ctx = av_malloc(sizeof(struct SwsContext)); | |
| 649 if (ctx == NULL) { | |
| 650 av_log(NULL, AV_LOG_ERROR, "Cannot allocate a resampling context!\n"); | |
| 651 | |
| 652 return NULL; | |
| 653 } | |
| 654 | |
| 655 if ((srcH != dstH) || (srcW != dstW)) { | |
| 656 if ((srcFormat != PIX_FMT_YUV420P) || (dstFormat != PIX_FMT_YUV420P)) { | |
| 657 av_log(NULL, AV_LOG_INFO, "PIX_FMT_YUV420P will be used as an intermediate format for rescaling\n"); | |
| 658 } | |
| 659 ctx->resampling_ctx = img_resample_init(dstW, dstH, srcW, srcH); | |
| 660 } else { | |
| 661 ctx->resampling_ctx = av_malloc(sizeof(ImgReSampleContext)); | |
| 662 ctx->resampling_ctx->iheight = srcH; | |
| 663 ctx->resampling_ctx->iwidth = srcW; | |
| 664 ctx->resampling_ctx->oheight = dstH; | |
| 665 ctx->resampling_ctx->owidth = dstW; | |
| 666 } | |
| 667 ctx->src_pix_fmt = srcFormat; | |
| 668 ctx->dst_pix_fmt = dstFormat; | |
| 669 | |
| 670 return ctx; | |
| 671 } | |
| 672 | |
| 673 void sws_freeContext(struct SwsContext *ctx) | |
| 674 { | |
|
4357
1654075b205c
fix segfault with http://sam.zoy.org/zzuf/lol-ffplay.ogm and
takis
parents:
4197
diff
changeset
|
675 if (!ctx) |
|
1654075b205c
fix segfault with http://sam.zoy.org/zzuf/lol-ffplay.ogm and
takis
parents:
4197
diff
changeset
|
676 return; |
| 3249 | 677 if ((ctx->resampling_ctx->iwidth != ctx->resampling_ctx->owidth) || |
| 678 (ctx->resampling_ctx->iheight != ctx->resampling_ctx->oheight)) { | |
| 679 img_resample_close(ctx->resampling_ctx); | |
| 680 } else { | |
| 681 av_free(ctx->resampling_ctx); | |
| 682 } | |
| 683 av_free(ctx); | |
| 684 } | |
| 685 | |
|
4036
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
686 |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
687 /** |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
688 * Checks if context is valid or reallocs a new one instead. |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
689 * 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
|
690 * Otherwise, checks if the parameters are the same already saved in context. |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
691 * If that is the case, returns the current context. |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
692 * Otherwise, frees context and gets a new one. |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
693 * |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
694 * Be warned that srcFilter, dstFilter are not checked, they are |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
695 * asumed to remain valid. |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
696 */ |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
697 struct SwsContext *sws_getCachedContext(struct SwsContext *ctx, |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
698 int srcW, int srcH, int srcFormat, |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
699 int dstW, int dstH, int dstFormat, int flags, |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
700 SwsFilter *srcFilter, SwsFilter *dstFilter, double *param) |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
701 { |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
702 if (ctx != NULL) { |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
703 if ((ctx->resampling_ctx->iwidth != srcW) || |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
704 (ctx->resampling_ctx->iheight != srcH) || |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
705 (ctx->src_pix_fmt != srcFormat) || |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
706 (ctx->resampling_ctx->owidth != dstW) || |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
707 (ctx->resampling_ctx->oheight != dstH) || |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
708 (ctx->dst_pix_fmt != dstFormat)) |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
709 { |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
710 sws_freeContext(ctx); |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
711 ctx = NULL; |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
712 } |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
713 } |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
714 if (ctx == NULL) { |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
715 return sws_getContext(srcW, srcH, srcFormat, |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
716 dstW, dstH, dstFormat, flags, |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
717 srcFilter, dstFilter, param); |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
718 } |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
719 return ctx; |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
720 } |
|
207c22206d53
Implement sws_getCachedContext() in swscale emulation
lucabe
parents:
3947
diff
changeset
|
721 |
| 3249 | 722 int sws_scale(struct SwsContext *ctx, uint8_t* src[], int srcStride[], |
| 723 int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]) | |
| 724 { | |
| 725 AVPicture src_pict, dst_pict; | |
| 726 int i, res = 0; | |
| 727 AVPicture picture_format_temp; | |
| 728 AVPicture picture_resample_temp, *formatted_picture, *resampled_picture; | |
| 729 uint8_t *buf1 = NULL, *buf2 = NULL; | |
| 730 enum PixelFormat current_pix_fmt; | |
| 731 | |
| 4105 | 732 for (i = 0; i < 4; i++) { |
| 3249 | 733 src_pict.data[i] = src[i]; |
| 734 src_pict.linesize[i] = srcStride[i]; | |
| 735 dst_pict.data[i] = dst[i]; | |
| 736 dst_pict.linesize[i] = dstStride[i]; | |
| 737 } | |
| 738 if ((ctx->resampling_ctx->iwidth != ctx->resampling_ctx->owidth) || | |
| 739 (ctx->resampling_ctx->iheight != ctx->resampling_ctx->oheight)) { | |
| 740 /* We have to rescale the picture, but only YUV420P rescaling is supported... */ | |
| 741 | |
| 742 if (ctx->src_pix_fmt != PIX_FMT_YUV420P) { | |
| 743 int size; | |
| 744 | |
| 745 /* create temporary picture for rescaling input*/ | |
| 746 size = avpicture_get_size(PIX_FMT_YUV420P, ctx->resampling_ctx->iwidth, ctx->resampling_ctx->iheight); | |
| 747 buf1 = av_malloc(size); | |
| 748 if (!buf1) { | |
| 749 res = -1; | |
| 750 goto the_end; | |
| 751 } | |
| 752 formatted_picture = &picture_format_temp; | |
| 753 avpicture_fill((AVPicture*)formatted_picture, buf1, | |
| 754 PIX_FMT_YUV420P, ctx->resampling_ctx->iwidth, ctx->resampling_ctx->iheight); | |
| 755 | |
| 756 if (img_convert((AVPicture*)formatted_picture, PIX_FMT_YUV420P, | |
| 757 &src_pict, ctx->src_pix_fmt, | |
| 758 ctx->resampling_ctx->iwidth, ctx->resampling_ctx->iheight) < 0) { | |
| 759 | |
| 760 av_log(NULL, AV_LOG_ERROR, "pixel format conversion not handled\n"); | |
| 761 res = -1; | |
| 762 goto the_end; | |
| 763 } | |
| 764 } else { | |
| 765 formatted_picture = &src_pict; | |
| 766 } | |
| 767 | |
| 768 if (ctx->dst_pix_fmt != PIX_FMT_YUV420P) { | |
| 769 int size; | |
| 770 | |
| 771 /* create temporary picture for rescaling output*/ | |
| 772 size = avpicture_get_size(PIX_FMT_YUV420P, ctx->resampling_ctx->owidth, ctx->resampling_ctx->oheight); | |
| 773 buf2 = av_malloc(size); | |
| 774 if (!buf2) { | |
| 775 res = -1; | |
| 776 goto the_end; | |
| 777 } | |
| 778 resampled_picture = &picture_resample_temp; | |
| 779 avpicture_fill((AVPicture*)resampled_picture, buf2, | |
| 780 PIX_FMT_YUV420P, ctx->resampling_ctx->owidth, ctx->resampling_ctx->oheight); | |
| 781 | |
| 782 } else { | |
| 783 resampled_picture = &dst_pict; | |
| 784 } | |
| 785 | |
| 786 /* ...and finally rescale!!! */ | |
| 787 img_resample(ctx->resampling_ctx, resampled_picture, formatted_picture); | |
| 788 current_pix_fmt = PIX_FMT_YUV420P; | |
| 789 } else { | |
| 790 resampled_picture = &src_pict; | |
| 791 current_pix_fmt = ctx->src_pix_fmt; | |
| 792 } | |
| 793 | |
| 794 if (current_pix_fmt != ctx->dst_pix_fmt) { | |
| 795 if (img_convert(&dst_pict, ctx->dst_pix_fmt, | |
| 796 resampled_picture, current_pix_fmt, | |
| 797 ctx->resampling_ctx->owidth, ctx->resampling_ctx->oheight) < 0) { | |
| 798 | |
| 799 av_log(NULL, AV_LOG_ERROR, "pixel format conversion not handled\n"); | |
| 800 | |
| 801 res = -1; | |
| 802 goto the_end; | |
| 803 } | |
| 3516 | 804 } else if (resampled_picture != &dst_pict) { |
| 805 img_copy(&dst_pict, resampled_picture, current_pix_fmt, | |
| 806 ctx->resampling_ctx->owidth, ctx->resampling_ctx->oheight); | |
| 3249 | 807 } |
| 808 | |
| 809 the_end: | |
| 810 av_free(buf1); | |
| 811 av_free(buf2); | |
| 812 return res; | |
| 813 } | |
| 814 | |
| 815 | |
| 0 | 816 #ifdef TEST |
|
2400
17ec73c65748
imgresample test cleanup patch by (Panagiotis Issaris <takis )( lumumba d0t luc d0t ac.be>)
michael
parents:
2082
diff
changeset
|
817 #include <stdio.h> |
|
630
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
818 |
| 0 | 819 /* input */ |
| 820 #define XSIZE 256 | |
| 821 #define YSIZE 256 | |
| 1064 | 822 uint8_t img[XSIZE * YSIZE]; |
| 0 | 823 |
| 824 /* output */ | |
| 825 #define XSIZE1 512 | |
| 826 #define YSIZE1 512 | |
| 1064 | 827 uint8_t img1[XSIZE1 * YSIZE1]; |
| 828 uint8_t img2[XSIZE1 * YSIZE1]; | |
| 0 | 829 |
| 1064 | 830 void save_pgm(const char *filename, uint8_t *img, int xsize, int ysize) |
| 0 | 831 { |
|
2846
40765c51a7a9
Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents:
2423
diff
changeset
|
832 #undef fprintf |
| 0 | 833 FILE *f; |
| 834 f=fopen(filename,"w"); | |
| 835 fprintf(f,"P5\n%d %d\n%d\n", xsize, ysize, 255); | |
| 836 fwrite(img,1, xsize * ysize,f); | |
| 837 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
|
838 #define fprintf please_use_av_log |
| 0 | 839 } |
| 840 | |
| 1064 | 841 static void dump_filter(int16_t *filter) |
| 0 | 842 { |
| 843 int i, ph; | |
| 844 | |
| 845 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
|
846 av_log(NULL, AV_LOG_INFO, "%2d: ", ph); |
| 0 | 847 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
|
848 av_log(NULL, AV_LOG_INFO, " %5.2f", filter[ph * NB_TAPS + i] / 256.0); |
| 0 | 849 } |
|
2400
17ec73c65748
imgresample test cleanup patch by (Panagiotis Issaris <takis )( lumumba d0t luc d0t ac.be>)
michael
parents:
2082
diff
changeset
|
850 av_log(NULL, AV_LOG_INFO, "\n"); |
| 0 | 851 } |
| 852 } | |
| 853 | |
| 2 | 854 #ifdef HAVE_MMX |
| 644 | 855 int mm_flags; |
| 0 | 856 #endif |
| 857 | |
| 858 int main(int argc, char **argv) | |
| 859 { | |
| 860 int x, y, v, i, xsize, ysize; | |
| 861 ImgReSampleContext *s; | |
| 862 float fact, factors[] = { 1/2.0, 3.0/4.0, 1.0, 4.0/3.0, 16.0/9.0, 2.0 }; | |
| 863 char buf[256]; | |
| 864 | |
| 865 /* build test image */ | |
| 866 for(y=0;y<YSIZE;y++) { | |
| 867 for(x=0;x<XSIZE;x++) { | |
| 868 if (x < XSIZE/2 && y < YSIZE/2) { | |
| 869 if (x < XSIZE/4 && y < YSIZE/4) { | |
| 870 if ((x % 10) <= 6 && | |
| 871 (y % 10) <= 6) | |
| 872 v = 0xff; | |
| 873 else | |
| 874 v = 0x00; | |
| 875 } else if (x < XSIZE/4) { | |
| 2967 | 876 if (x & 1) |
| 0 | 877 v = 0xff; |
| 2967 | 878 else |
| 0 | 879 v = 0; |
| 880 } else if (y < XSIZE/4) { | |
| 2967 | 881 if (y & 1) |
| 0 | 882 v = 0xff; |
| 2967 | 883 else |
| 0 | 884 v = 0; |
| 885 } else { | |
| 886 if (y < YSIZE*3/8) { | |
| 2967 | 887 if ((y+x) & 1) |
| 0 | 888 v = 0xff; |
| 2967 | 889 else |
| 0 | 890 v = 0; |
| 891 } else { | |
| 892 if (((x+3) % 4) <= 1 && | |
| 893 ((y+3) % 4) <= 1) | |
| 894 v = 0xff; | |
| 895 else | |
| 896 v = 0x00; | |
| 897 } | |
| 898 } | |
| 899 } else if (x < XSIZE/2) { | |
| 900 v = ((x - (XSIZE/2)) * 255) / (XSIZE/2); | |
| 901 } else if (y < XSIZE/2) { | |
| 902 v = ((y - (XSIZE/2)) * 255) / (XSIZE/2); | |
| 903 } else { | |
| 904 v = ((x + y - XSIZE) * 255) / XSIZE; | |
| 905 } | |
|
630
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
906 img[(YSIZE - y) * XSIZE + (XSIZE - x)] = v; |
| 0 | 907 } |
| 908 } | |
| 909 save_pgm("/tmp/in.pgm", img, XSIZE, YSIZE); | |
| 910 for(i=0;i<sizeof(factors)/sizeof(float);i++) { | |
| 911 fact = factors[i]; | |
| 912 xsize = (int)(XSIZE * fact); | |
|
630
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
913 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
|
914 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
|
915 av_log(NULL, AV_LOG_INFO, "Factor=%0.2f\n", fact); |
| 0 | 916 dump_filter(&s->h_filters[0][0]); |
| 917 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
|
918 img + 50 * XSIZE, XSIZE, XSIZE, YSIZE - 100); |
| 0 | 919 img_resample_close(s); |
| 920 | |
| 2423 | 921 snprintf(buf, sizeof(buf), "/tmp/out%d.pgm", i); |
| 0 | 922 save_pgm(buf, img1, xsize, ysize); |
| 923 } | |
| 924 | |
| 925 /* mmx test */ | |
| 2 | 926 #ifdef HAVE_MMX |
|
2400
17ec73c65748
imgresample test cleanup patch by (Panagiotis Issaris <takis )( lumumba d0t luc d0t ac.be>)
michael
parents:
2082
diff
changeset
|
927 av_log(NULL, AV_LOG_INFO, "MMX test\n"); |
| 0 | 928 fact = 0.72; |
| 929 xsize = (int)(XSIZE * fact); | |
| 930 ysize = (int)(YSIZE * fact); | |
| 931 mm_flags = MM_MMX; | |
| 932 s = img_resample_init(xsize, ysize, XSIZE, YSIZE); | |
| 933 component_resample(s, img1, xsize, xsize, ysize, | |
| 934 img, XSIZE, XSIZE, YSIZE); | |
| 935 | |
| 936 mm_flags = 0; | |
| 937 s = img_resample_init(xsize, ysize, XSIZE, YSIZE); | |
| 938 component_resample(s, img2, xsize, xsize, ysize, | |
| 939 img, XSIZE, XSIZE, YSIZE); | |
| 940 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
|
941 av_log(NULL, AV_LOG_ERROR, "mmx error\n"); |
| 0 | 942 exit(1); |
| 943 } | |
|
2400
17ec73c65748
imgresample test cleanup patch by (Panagiotis Issaris <takis )( lumumba d0t luc d0t ac.be>)
michael
parents:
2082
diff
changeset
|
944 av_log(NULL, AV_LOG_INFO, "MMX OK\n"); |
| 0 | 945 #endif |
| 946 return 0; | |
| 947 } | |
| 948 | |
| 949 #endif |
