Mercurial > libavcodec.hg
annotate imgresample.c @ 5319:40af705cef7e libavcodec
AC-3 decoder, soc revision 69, Aug 31 07:12:56 2006 UTC by cloud9
Fix the bugs:
1. The quality of output because of incorrect windowing coefficients.
New code for window generation.
2. Dynrng values were reset where dynrng value is present in the first block,
but not in the subsequent block.
| author | jbr |
|---|---|
| date | Sat, 14 Jul 2007 16:03:14 +0000 |
| parents | 9968f39d03aa |
| children | 09f99af1db40 |
| 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 | |
| 31 #define NB_COMPONENTS 3 | |
| 32 | |
| 33 #define PHASE_BITS 4 | |
| 34 #define NB_PHASES (1 << PHASE_BITS) | |
| 35 #define NB_TAPS 4 | |
| 36 #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
|
37 //#define TEST 1 /* Test it */ |
| 0 | 38 |
| 39 #define POS_FRAC_BITS 16 | |
| 40 #define POS_FRAC (1 << POS_FRAC_BITS) | |
| 41 /* 6 bits precision is needed for MMX */ | |
| 42 #define FILTER_BITS 8 | |
| 43 | |
| 44 #define LINE_BUF_HEIGHT (NB_TAPS * 4) | |
| 45 | |
|
4065
93163e2a2398
Do not use a fake libavcodec/swscale.h, but always use the real one
lucabe
parents:
4036
diff
changeset
|
46 struct SwsContext { |
| 5185 | 47 AVClass *av_class; |
|
4065
93163e2a2398
Do not use a fake libavcodec/swscale.h, but always use the real one
lucabe
parents:
4036
diff
changeset
|
48 struct ImgReSampleContext *resampling_ctx; |
|
93163e2a2398
Do not use a fake libavcodec/swscale.h, but always use the real one
lucabe
parents:
4036
diff
changeset
|
49 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
|
50 }; |
|
93163e2a2398
Do not use a fake libavcodec/swscale.h, but always use the real one
lucabe
parents:
4036
diff
changeset
|
51 |
| 0 | 52 struct ImgReSampleContext { |
|
1928
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
53 int iwidth, iheight, owidth, oheight; |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
54 int topBand, bottomBand, leftBand, rightBand; |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
55 int padtop, padbottom, padleft, padright; |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
56 int pad_owidth, pad_oheight; |
| 0 | 57 int h_incr, v_incr; |
| 3089 | 58 DECLARE_ALIGNED_8(int16_t, h_filters[NB_PHASES][NB_TAPS]); /* horizontal filters */ |
| 59 DECLARE_ALIGNED_8(int16_t, v_filters[NB_PHASES][NB_TAPS]); /* vertical filters */ | |
| 1064 | 60 uint8_t *line_buf; |
| 0 | 61 }; |
| 62 | |
|
2082
3dc9bbe1b152
polyphase kaiser windowed sinc and blackman nuttall windowed sinc audio resample filters
michael
parents:
2064
diff
changeset
|
63 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
|
64 |
| 0 | 65 static inline int get_phase(int pos) |
| 66 { | |
| 67 return ((pos) >> (POS_FRAC_BITS - PHASE_BITS)) & ((1 << PHASE_BITS) - 1); | |
| 68 } | |
| 69 | |
| 70 /* This function must be optimized */ | |
|
1488
766a2f4edbea
avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents:
1106
diff
changeset
|
71 static void h_resample_fast(uint8_t *dst, int dst_width, const uint8_t *src, |
| 2979 | 72 int src_width, int src_start, int src_incr, |
| 73 int16_t *filters) | |
| 0 | 74 { |
| 75 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
|
76 const uint8_t *s; |
| 1064 | 77 int16_t *filter; |
| 0 | 78 |
| 79 src_pos = src_start; | |
| 80 for(i=0;i<dst_width;i++) { | |
| 81 #ifdef TEST | |
| 82 /* test */ | |
| 83 if ((src_pos >> POS_FRAC_BITS) < 0 || | |
| 84 (src_pos >> POS_FRAC_BITS) > (src_width - NB_TAPS)) | |
| 653 | 85 av_abort(); |
| 0 | 86 #endif |
| 87 s = src + (src_pos >> POS_FRAC_BITS); | |
| 88 phase = get_phase(src_pos); | |
| 89 filter = filters + phase * NB_TAPS; | |
| 90 #if NB_TAPS == 4 | |
| 91 sum = s[0] * filter[0] + | |
| 92 s[1] * filter[1] + | |
| 93 s[2] * filter[2] + | |
| 94 s[3] * filter[3]; | |
| 95 #else | |
| 96 { | |
| 97 int j; | |
| 98 sum = 0; | |
| 99 for(j=0;j<NB_TAPS;j++) | |
| 100 sum += s[j] * filter[j]; | |
| 101 } | |
| 102 #endif | |
| 103 sum = sum >> FILTER_BITS; | |
| 104 if (sum < 0) | |
| 105 sum = 0; | |
| 106 else if (sum > 255) | |
| 107 sum = 255; | |
| 108 dst[0] = sum; | |
| 109 src_pos += src_incr; | |
| 110 dst++; | |
| 111 } | |
| 112 } | |
| 113 | |
| 114 /* This function must be optimized */ | |
|
1488
766a2f4edbea
avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents:
1106
diff
changeset
|
115 static void v_resample(uint8_t *dst, int dst_width, const uint8_t *src, |
| 2979 | 116 int wrap, int16_t *filter) |
| 0 | 117 { |
| 118 int sum, i; | |
|
1488
766a2f4edbea
avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents:
1106
diff
changeset
|
119 const uint8_t *s; |
| 0 | 120 |
| 121 s = src; | |
| 122 for(i=0;i<dst_width;i++) { | |
| 123 #if NB_TAPS == 4 | |
| 124 sum = s[0 * wrap] * filter[0] + | |
| 125 s[1 * wrap] * filter[1] + | |
| 126 s[2 * wrap] * filter[2] + | |
| 127 s[3 * wrap] * filter[3]; | |
| 128 #else | |
| 129 { | |
| 130 int j; | |
| 1064 | 131 uint8_t *s1 = s; |
| 0 | 132 |
| 133 sum = 0; | |
| 134 for(j=0;j<NB_TAPS;j++) { | |
| 135 sum += s1[0] * filter[j]; | |
| 136 s1 += wrap; | |
| 137 } | |
| 138 } | |
| 139 #endif | |
| 140 sum = sum >> FILTER_BITS; | |
| 141 if (sum < 0) | |
| 142 sum = 0; | |
| 143 else if (sum > 255) | |
| 144 sum = 255; | |
| 145 dst[0] = sum; | |
| 146 dst++; | |
| 147 s++; | |
| 148 } | |
| 149 } | |
| 150 | |
| 2 | 151 #ifdef HAVE_MMX |
| 0 | 152 |
| 153 #include "i386/mmx.h" | |
| 154 | |
| 155 #define FILTER4(reg) \ | |
| 156 {\ | |
| 157 s = src + (src_pos >> POS_FRAC_BITS);\ | |
| 158 phase = get_phase(src_pos);\ | |
| 159 filter = filters + phase * NB_TAPS;\ | |
| 160 movq_m2r(*s, reg);\ | |
| 161 punpcklbw_r2r(mm7, reg);\ | |
| 162 movq_m2r(*filter, mm6);\ | |
| 163 pmaddwd_r2r(reg, mm6);\ | |
| 164 movq_r2r(mm6, reg);\ | |
| 165 psrlq_i2r(32, reg);\ | |
| 166 paddd_r2r(mm6, reg);\ | |
| 167 psrad_i2r(FILTER_BITS, reg);\ | |
| 168 src_pos += src_incr;\ | |
| 169 } | |
| 170 | |
|
4122
daae66c03857
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
4105
diff
changeset
|
171 #define DUMP(reg) movq_r2m(reg, tmp); printf(#reg "=%016"PRIx64"\n", tmp.uq); |
| 0 | 172 |
| 173 /* 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
|
174 static void h_resample_fast4_mmx(uint8_t *dst, int dst_width, |
| 2979 | 175 const uint8_t *src, int src_width, |
| 1064 | 176 int src_start, int src_incr, int16_t *filters) |
| 0 | 177 { |
| 178 int src_pos, phase; | |
|
1488
766a2f4edbea
avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents:
1106
diff
changeset
|
179 const uint8_t *s; |
| 1064 | 180 int16_t *filter; |
| 0 | 181 mmx_t tmp; |
| 2967 | 182 |
| 0 | 183 src_pos = src_start; |
| 184 pxor_r2r(mm7, mm7); | |
| 185 | |
| 186 while (dst_width >= 4) { | |
| 187 | |
| 188 FILTER4(mm0); | |
| 189 FILTER4(mm1); | |
| 190 FILTER4(mm2); | |
| 191 FILTER4(mm3); | |
| 192 | |
| 193 packuswb_r2r(mm7, mm0); | |
| 194 packuswb_r2r(mm7, mm1); | |
| 195 packuswb_r2r(mm7, mm3); | |
| 196 packuswb_r2r(mm7, mm2); | |
| 197 movq_r2m(mm0, tmp); | |
| 198 dst[0] = tmp.ub[0]; | |
| 199 movq_r2m(mm1, tmp); | |
| 200 dst[1] = tmp.ub[0]; | |
| 201 movq_r2m(mm2, tmp); | |
| 202 dst[2] = tmp.ub[0]; | |
| 203 movq_r2m(mm3, tmp); | |
| 204 dst[3] = tmp.ub[0]; | |
| 205 dst += 4; | |
| 206 dst_width -= 4; | |
| 207 } | |
| 208 while (dst_width > 0) { | |
| 209 FILTER4(mm0); | |
| 210 packuswb_r2r(mm7, mm0); | |
| 211 movq_r2m(mm0, tmp); | |
| 212 dst[0] = tmp.ub[0]; | |
| 213 dst++; | |
| 214 dst_width--; | |
| 215 } | |
| 216 emms(); | |
| 217 } | |
| 218 | |
|
1488
766a2f4edbea
avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents:
1106
diff
changeset
|
219 static void v_resample4_mmx(uint8_t *dst, int dst_width, const uint8_t *src, |
| 2979 | 220 int wrap, int16_t *filter) |
| 0 | 221 { |
| 222 int sum, i, v; | |
|
1488
766a2f4edbea
avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents:
1106
diff
changeset
|
223 const uint8_t *s; |
| 0 | 224 mmx_t tmp; |
| 225 mmx_t coefs[4]; | |
| 2967 | 226 |
| 0 | 227 for(i=0;i<4;i++) { |
| 228 v = filter[i]; | |
| 229 coefs[i].uw[0] = v; | |
| 230 coefs[i].uw[1] = v; | |
| 231 coefs[i].uw[2] = v; | |
| 232 coefs[i].uw[3] = v; | |
| 233 } | |
| 2967 | 234 |
| 0 | 235 pxor_r2r(mm7, mm7); |
| 236 s = src; | |
| 237 while (dst_width >= 4) { | |
| 238 movq_m2r(s[0 * wrap], mm0); | |
| 239 punpcklbw_r2r(mm7, mm0); | |
| 240 movq_m2r(s[1 * wrap], mm1); | |
| 241 punpcklbw_r2r(mm7, mm1); | |
| 242 movq_m2r(s[2 * wrap], mm2); | |
| 243 punpcklbw_r2r(mm7, mm2); | |
| 244 movq_m2r(s[3 * wrap], mm3); | |
| 245 punpcklbw_r2r(mm7, mm3); | |
| 246 | |
| 247 pmullw_m2r(coefs[0], mm0); | |
| 248 pmullw_m2r(coefs[1], mm1); | |
| 249 pmullw_m2r(coefs[2], mm2); | |
| 250 pmullw_m2r(coefs[3], mm3); | |
| 251 | |
| 252 paddw_r2r(mm1, mm0); | |
| 253 paddw_r2r(mm3, mm2); | |
| 254 paddw_r2r(mm2, mm0); | |
| 255 psraw_i2r(FILTER_BITS, mm0); | |
| 2967 | 256 |
| 0 | 257 packuswb_r2r(mm7, mm0); |
| 258 movq_r2m(mm0, tmp); | |
| 259 | |
| 1064 | 260 *(uint32_t *)dst = tmp.ud[0]; |
| 0 | 261 dst += 4; |
| 262 s += 4; | |
| 263 dst_width -= 4; | |
| 264 } | |
| 265 while (dst_width > 0) { | |
| 266 sum = s[0 * wrap] * filter[0] + | |
| 267 s[1 * wrap] * filter[1] + | |
| 268 s[2 * wrap] * filter[2] + | |
| 269 s[3 * wrap] * filter[3]; | |
| 270 sum = sum >> FILTER_BITS; | |
| 271 if (sum < 0) | |
| 272 sum = 0; | |
| 273 else if (sum > 255) | |
| 274 sum = 255; | |
| 275 dst[0] = sum; | |
| 276 dst++; | |
| 277 s++; | |
| 278 dst_width--; | |
| 279 } | |
| 280 emms(); | |
| 281 } | |
| 5054 | 282 #endif /* HAVE_MMX */ |
| 0 | 283 |
|
894
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
284 #ifdef HAVE_ALTIVEC |
| 2979 | 285 typedef union { |
|
894
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
286 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
|
287 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
|
288 } vec_uc_t; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
289 |
| 2979 | 290 typedef union { |
|
894
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
291 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
|
292 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
|
293 } vec_ss_t; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
294 |
|
1488
766a2f4edbea
avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents:
1106
diff
changeset
|
295 void v_resample16_altivec(uint8_t *dst, int dst_width, const uint8_t *src, |
| 2979 | 296 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
|
297 { |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
298 int sum, i; |
|
1488
766a2f4edbea
avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents:
1106
diff
changeset
|
299 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
|
300 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
|
301 vec_ss_t srchv[4], srclv[4], fv[4]; |
| 2967 | 302 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
|
303 s = src; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
304 |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
305 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
|
306 { |
|
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 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
|
309 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
|
310 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
|
311 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
|
312 */ |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
313 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
|
314 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
|
315 } |
| 2967 | 316 |
|
894
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
317 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
|
318 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
|
319 |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
320 |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
321 /* |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
322 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
|
323 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
|
324 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
|
325 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
|
326 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
|
327 */ |
|
898
6d5e3fe7aea1
Simplify an expression and eliminate a compile warning
philipjsg
parents:
894
diff
changeset
|
328 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
|
329 while(i>0) { |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
330 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
|
331 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
|
332 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
|
333 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
|
334 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
|
335 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
|
336 dst[0] = sum; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
337 dst++; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
338 s++; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
339 dst_width--; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
340 i--; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
341 } |
| 2967 | 342 |
|
894
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
343 /* 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
|
344 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
|
345 /* |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
346 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
|
347 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
|
348 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
|
349 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
|
350 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
|
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[0 * 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[i * wrap])); |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
354 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
|
355 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
|
356 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
|
357 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
|
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[1 * 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[1 * wrap])); |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
361 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
|
362 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
|
363 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
|
364 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
|
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[2 * 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[2 * wrap])); |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
368 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
|
369 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
|
370 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
|
371 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
|
372 |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
373 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
|
374 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
|
375 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
|
376 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
|
377 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
|
378 sumlv = vec_madds(srclv[3].v, fv[3].v, sumlv); |
| 2967 | 379 |
|
894
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
380 /* |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
381 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
|
382 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
|
383 */ |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
384 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
|
385 vec_st(dstv, 0, (vector unsigned char *) dst); |
| 2967 | 386 |
|
894
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
387 dst+=16; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
388 s+=16; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
389 dst_width-=16; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
390 } |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
391 |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
392 /* |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
393 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
|
394 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
|
395 */ |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
396 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
|
397 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
|
398 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
|
399 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
|
400 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
|
401 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
|
402 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
|
403 dst[0] = sum; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
404 dst++; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
405 s++; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
406 dst_width--; |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
407 } |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
408 } |
| 5054 | 409 #endif /* HAVE_ALTIVEC */ |
|
894
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
410 |
| 0 | 411 /* 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
|
412 static void h_resample_slow(uint8_t *dst, int dst_width, |
| 2979 | 413 const uint8_t *src, int src_width, |
| 1064 | 414 int src_start, int src_incr, int16_t *filters) |
| 0 | 415 { |
| 416 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
|
417 const uint8_t *s, *src_end; |
| 1064 | 418 int16_t *filter; |
| 0 | 419 |
| 420 src_end = src + src_width; | |
| 421 src_pos = src_start; | |
| 422 for(i=0;i<dst_width;i++) { | |
| 423 s = src + (src_pos >> POS_FRAC_BITS); | |
| 424 phase = get_phase(src_pos); | |
| 425 filter = filters + phase * NB_TAPS; | |
| 426 sum = 0; | |
| 427 for(j=0;j<NB_TAPS;j++) { | |
| 428 if (s < src) | |
| 429 v = src[0]; | |
| 430 else if (s >= src_end) | |
| 431 v = src_end[-1]; | |
| 432 else | |
| 433 v = s[0]; | |
| 434 sum += v * filter[j]; | |
| 435 s++; | |
| 436 } | |
| 437 sum = sum >> FILTER_BITS; | |
| 438 if (sum < 0) | |
| 439 sum = 0; | |
| 440 else if (sum > 255) | |
| 441 sum = 255; | |
| 442 dst[0] = sum; | |
| 443 src_pos += src_incr; | |
| 444 dst++; | |
| 445 } | |
| 446 } | |
| 447 | |
|
1488
766a2f4edbea
avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents:
1106
diff
changeset
|
448 static void h_resample(uint8_t *dst, int dst_width, const uint8_t *src, |
| 2979 | 449 int src_width, int src_start, int src_incr, |
| 450 int16_t *filters) | |
| 0 | 451 { |
| 452 int n, src_end; | |
| 453 | |
| 454 if (src_start < 0) { | |
| 455 n = (0 - src_start + src_incr - 1) / src_incr; | |
| 456 h_resample_slow(dst, n, src, src_width, src_start, src_incr, filters); | |
| 457 dst += n; | |
| 458 dst_width -= n; | |
| 459 src_start += n * src_incr; | |
| 460 } | |
| 461 src_end = src_start + dst_width * src_incr; | |
| 462 if (src_end > ((src_width - NB_TAPS) << POS_FRAC_BITS)) { | |
| 2967 | 463 n = (((src_width - NB_TAPS + 1) << POS_FRAC_BITS) - 1 - src_start) / |
| 0 | 464 src_incr; |
| 465 } else { | |
| 466 n = dst_width; | |
| 467 } | |
| 2 | 468 #ifdef HAVE_MMX |
| 4197 | 469 if ((mm_flags & MM_MMX) && NB_TAPS == 4) |
| 2967 | 470 h_resample_fast4_mmx(dst, n, |
| 0 | 471 src, src_width, src_start, src_incr, filters); |
| 472 else | |
| 473 #endif | |
| 2967 | 474 h_resample_fast(dst, n, |
| 0 | 475 src, src_width, src_start, src_incr, filters); |
| 476 if (n < dst_width) { | |
| 477 dst += n; | |
| 478 dst_width -= n; | |
| 479 src_start += n * src_incr; | |
| 2967 | 480 h_resample_slow(dst, dst_width, |
| 0 | 481 src, src_width, src_start, src_incr, filters); |
| 482 } | |
| 483 } | |
| 484 | |
| 2967 | 485 static void component_resample(ImgReSampleContext *s, |
| 1064 | 486 uint8_t *output, int owrap, int owidth, int oheight, |
| 487 uint8_t *input, int iwrap, int iwidth, int iheight) | |
| 0 | 488 { |
| 489 int src_y, src_y1, last_src_y, ring_y, phase_y, y1, y; | |
| 1064 | 490 uint8_t *new_line, *src_line; |
| 0 | 491 |
| 492 last_src_y = - FCENTER - 1; | |
| 493 /* position of the bottom of the filter in the source image */ | |
| 2967 | 494 src_y = (last_src_y + NB_TAPS) * POS_FRAC; |
| 0 | 495 ring_y = NB_TAPS; /* position in ring buffer */ |
| 496 for(y=0;y<oheight;y++) { | |
| 497 /* apply horizontal filter on new lines from input if needed */ | |
| 498 src_y1 = src_y >> POS_FRAC_BITS; | |
| 499 while (last_src_y < src_y1) { | |
| 500 if (++ring_y >= LINE_BUF_HEIGHT + NB_TAPS) | |
| 501 ring_y = NB_TAPS; | |
| 502 last_src_y++; | |
|
630
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
503 /* 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
|
504 inefficient because we filter multiple times) */ |
| 0 | 505 y1 = last_src_y; |
| 506 if (y1 < 0) { | |
| 507 y1 = 0; | |
| 508 } else if (y1 >= iheight) { | |
| 509 y1 = iheight - 1; | |
| 510 } | |
| 511 src_line = input + y1 * iwrap; | |
| 512 new_line = s->line_buf + ring_y * owidth; | |
| 513 /* apply filter and handle limit cases correctly */ | |
| 2967 | 514 h_resample(new_line, owidth, |
| 515 src_line, iwidth, - FCENTER * POS_FRAC, s->h_incr, | |
| 0 | 516 &s->h_filters[0][0]); |
| 517 /* handle ring buffer wraping */ | |
| 518 if (ring_y >= LINE_BUF_HEIGHT) { | |
| 519 memcpy(s->line_buf + (ring_y - LINE_BUF_HEIGHT) * owidth, | |
| 520 new_line, owidth); | |
| 521 } | |
| 522 } | |
| 523 /* apply vertical filter */ | |
| 524 phase_y = get_phase(src_y); | |
| 2 | 525 #ifdef HAVE_MMX |
| 0 | 526 /* desactivated MMX because loss of precision */ |
| 4197 | 527 if ((mm_flags & MM_MMX) && NB_TAPS == 4 && 0) |
| 2967 | 528 v_resample4_mmx(output, owidth, |
| 529 s->line_buf + (ring_y - NB_TAPS + 1) * owidth, owidth, | |
| 0 | 530 &s->v_filters[phase_y][0]); |
| 531 else | |
| 532 #endif | |
|
894
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
533 #ifdef HAVE_ALTIVEC |
| 4197 | 534 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
|
535 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
|
536 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
|
537 &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
|
538 else |
|
a408778eff87
altivec accelerated v-resample patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
653
diff
changeset
|
539 #endif |
| 2967 | 540 v_resample(output, owidth, |
| 541 s->line_buf + (ring_y - NB_TAPS + 1) * owidth, owidth, | |
| 0 | 542 &s->v_filters[phase_y][0]); |
| 2967 | 543 |
| 0 | 544 src_y += s->v_incr; |
| 2967 | 545 |
| 0 | 546 output += owrap; |
| 547 } | |
| 548 } | |
| 549 | |
| 550 ImgReSampleContext *img_resample_init(int owidth, int oheight, | |
| 551 int iwidth, int iheight) | |
| 552 { | |
| 2967 | 553 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
|
554 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
|
555 } |
|
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
556 |
|
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
557 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
|
558 int iwidth, int iheight, |
|
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
559 int topBand, int bottomBand, |
|
1928
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
560 int leftBand, int rightBand, |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
561 int padtop, int padbottom, |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
562 int padleft, int padright) |
|
630
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
563 { |
| 0 | 564 ImgReSampleContext *s; |
| 565 | |
| 2904 | 566 if (!owidth || !oheight || !iwidth || !iheight) |
| 2979 | 567 return NULL; |
| 2904 | 568 |
| 0 | 569 s = av_mallocz(sizeof(ImgReSampleContext)); |
| 570 if (!s) | |
| 571 return NULL; | |
| 2422 | 572 if((unsigned)owidth >= UINT_MAX / (LINE_BUF_HEIGHT + NB_TAPS)) |
| 573 return NULL; | |
| 0 | 574 s->line_buf = av_mallocz(owidth * (LINE_BUF_HEIGHT + NB_TAPS)); |
| 2967 | 575 if (!s->line_buf) |
| 0 | 576 goto fail; |
| 2967 | 577 |
| 0 | 578 s->owidth = owidth; |
| 579 s->oheight = oheight; | |
| 580 s->iwidth = iwidth; | |
| 581 s->iheight = iheight; | |
| 2967 | 582 |
|
630
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
583 s->topBand = topBand; |
|
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
584 s->bottomBand = bottomBand; |
|
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
585 s->leftBand = leftBand; |
|
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
586 s->rightBand = rightBand; |
| 2967 | 587 |
|
1928
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
588 s->padtop = padtop; |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
589 s->padbottom = padbottom; |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
590 s->padleft = padleft; |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
591 s->padright = padright; |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
592 |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
593 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
|
594 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
|
595 |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
596 s->h_incr = ((iwidth - leftBand - rightBand) * POS_FRAC) / s->pad_owidth; |
| 2967 | 597 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
|
598 |
| 2967 | 599 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
|
600 (float) (iwidth - leftBand - rightBand), NB_TAPS, NB_PHASES, 1<<FILTER_BITS, 0); |
| 2967 | 601 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
|
602 (float) (iheight - topBand - bottomBand), NB_TAPS, NB_PHASES, 1<<FILTER_BITS, 0); |
| 0 | 603 |
| 604 return s; | |
|
1928
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
605 fail: |
|
396
fce0a2520551
removed useless header includes - use av memory functions
glantau
parents:
18
diff
changeset
|
606 av_free(s); |
| 0 | 607 return NULL; |
| 608 } | |
| 609 | |
| 2967 | 610 void img_resample(ImgReSampleContext *s, |
|
1488
766a2f4edbea
avcodec const correctness patch by (Drew Hess <dhess at ilm dot com>)
michaelni
parents:
1106
diff
changeset
|
611 AVPicture *output, const AVPicture *input) |
| 0 | 612 { |
| 613 int i, shift; | |
|
1928
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
614 uint8_t* optr; |
| 0 | 615 |
|
1928
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
616 for (i=0;i<3;i++) { |
| 0 | 617 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
|
618 |
| 2967 | 619 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
|
620 s->padtop) + s->padleft) >> shift); |
|
0c23a5564489
padding support in ffmpeg patch by (Todd Kirby <doubleshot at pacbell dot net>)
michael
parents:
1488
diff
changeset
|
621 |
| 2967 | 622 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
|
623 s->pad_owidth >> shift, s->pad_oheight >> shift, |
| 2967 | 624 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
|
625 (s->topBand >> shift)) + (s->leftBand >> shift), |
| 2967 | 626 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
|
627 s->rightBand) >> shift), |
|
630
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
628 (s->iheight - s->topBand - s->bottomBand) >> shift); |
| 0 | 629 } |
| 630 } | |
| 631 | |
| 632 void img_resample_close(ImgReSampleContext *s) | |
| 633 { | |
|
396
fce0a2520551
removed useless header includes - use av memory functions
glantau
parents:
18
diff
changeset
|
634 av_free(s->line_buf); |
|
fce0a2520551
removed useless header includes - use av memory functions
glantau
parents:
18
diff
changeset
|
635 av_free(s); |
| 0 | 636 } |
| 637 | |
| 3249 | 638 struct SwsContext *sws_getContext(int srcW, int srcH, int srcFormat, |
| 639 int dstW, int dstH, int dstFormat, | |
| 640 int flags, SwsFilter *srcFilter, | |
| 641 SwsFilter *dstFilter, double *param) | |
| 642 { | |
| 643 struct SwsContext *ctx; | |
| 644 | |
| 645 ctx = av_malloc(sizeof(struct SwsContext)); | |
| 5186 | 646 if (ctx) |
| 5187 | 647 ctx->av_class = av_mallocz(sizeof(AVClass)); |
| 5185 | 648 if (!ctx || !ctx->av_class) { |
| 3249 | 649 av_log(NULL, AV_LOG_ERROR, "Cannot allocate a resampling context!\n"); |
| 650 | |
| 651 return NULL; | |
| 652 } | |
| 653 | |
| 654 if ((srcH != dstH) || (srcW != dstW)) { | |
| 655 if ((srcFormat != PIX_FMT_YUV420P) || (dstFormat != PIX_FMT_YUV420P)) { | |
| 656 av_log(NULL, AV_LOG_INFO, "PIX_FMT_YUV420P will be used as an intermediate format for rescaling\n"); | |
| 657 } | |
| 658 ctx->resampling_ctx = img_resample_init(dstW, dstH, srcW, srcH); | |
| 659 } else { | |
| 660 ctx->resampling_ctx = av_malloc(sizeof(ImgReSampleContext)); | |
| 661 ctx->resampling_ctx->iheight = srcH; | |
| 662 ctx->resampling_ctx->iwidth = srcW; | |
| 663 ctx->resampling_ctx->oheight = dstH; | |
| 664 ctx->resampling_ctx->owidth = dstW; | |
| 665 } | |
| 666 ctx->src_pix_fmt = srcFormat; | |
| 667 ctx->dst_pix_fmt = dstFormat; | |
| 668 | |
| 669 return ctx; | |
| 670 } | |
| 671 | |
| 672 void sws_freeContext(struct SwsContext *ctx) | |
| 673 { | |
|
4357
1654075b205c
fix segfault with http://sam.zoy.org/zzuf/lol-ffplay.ogm and
takis
parents:
4197
diff
changeset
|
674 if (!ctx) |
|
1654075b205c
fix segfault with http://sam.zoy.org/zzuf/lol-ffplay.ogm and
takis
parents:
4197
diff
changeset
|
675 return; |
| 3249 | 676 if ((ctx->resampling_ctx->iwidth != ctx->resampling_ctx->owidth) || |
| 677 (ctx->resampling_ctx->iheight != ctx->resampling_ctx->oheight)) { | |
| 678 img_resample_close(ctx->resampling_ctx); | |
| 679 } else { | |
| 680 av_free(ctx->resampling_ctx); | |
| 681 } | |
| 5185 | 682 av_free(ctx->av_class); |
| 3249 | 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) { |
|
4624
6a900f539e2c
Add the prefix "av_" to img_crop(), img_copy() and img_pad(), and rename "img"
takis
parents:
4357
diff
changeset
|
805 av_picture_copy(&dst_pict, resampled_picture, current_pix_fmt, |
| 3516 | 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> |
| 5055 | 818 #undef exit |
|
630
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
819 |
| 0 | 820 /* input */ |
| 821 #define XSIZE 256 | |
| 822 #define YSIZE 256 | |
| 1064 | 823 uint8_t img[XSIZE * YSIZE]; |
| 0 | 824 |
| 825 /* output */ | |
| 826 #define XSIZE1 512 | |
| 827 #define YSIZE1 512 | |
| 1064 | 828 uint8_t img1[XSIZE1 * YSIZE1]; |
| 829 uint8_t img2[XSIZE1 * YSIZE1]; | |
| 0 | 830 |
| 1064 | 831 void save_pgm(const char *filename, uint8_t *img, int xsize, int ysize) |
| 0 | 832 { |
|
2846
40765c51a7a9
Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents:
2423
diff
changeset
|
833 #undef fprintf |
| 0 | 834 FILE *f; |
| 835 f=fopen(filename,"w"); | |
| 836 fprintf(f,"P5\n%d %d\n%d\n", xsize, ysize, 255); | |
| 837 fwrite(img,1, xsize * ysize,f); | |
| 838 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
|
839 #define fprintf please_use_av_log |
| 0 | 840 } |
| 841 | |
| 1064 | 842 static void dump_filter(int16_t *filter) |
| 0 | 843 { |
| 844 int i, ph; | |
| 845 | |
| 846 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
|
847 av_log(NULL, AV_LOG_INFO, "%2d: ", ph); |
| 0 | 848 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
|
849 av_log(NULL, AV_LOG_INFO, " %5.2f", filter[ph * NB_TAPS + i] / 256.0); |
| 0 | 850 } |
|
2400
17ec73c65748
imgresample test cleanup patch by (Panagiotis Issaris <takis )( lumumba d0t luc d0t ac.be>)
michael
parents:
2082
diff
changeset
|
851 av_log(NULL, AV_LOG_INFO, "\n"); |
| 0 | 852 } |
| 853 } | |
| 854 | |
| 2 | 855 #ifdef HAVE_MMX |
| 644 | 856 int mm_flags; |
| 0 | 857 #endif |
| 858 | |
| 859 int main(int argc, char **argv) | |
| 860 { | |
| 861 int x, y, v, i, xsize, ysize; | |
| 862 ImgReSampleContext *s; | |
| 863 float fact, factors[] = { 1/2.0, 3.0/4.0, 1.0, 4.0/3.0, 16.0/9.0, 2.0 }; | |
| 864 char buf[256]; | |
| 865 | |
| 866 /* build test image */ | |
| 867 for(y=0;y<YSIZE;y++) { | |
| 868 for(x=0;x<XSIZE;x++) { | |
| 869 if (x < XSIZE/2 && y < YSIZE/2) { | |
| 870 if (x < XSIZE/4 && y < YSIZE/4) { | |
| 871 if ((x % 10) <= 6 && | |
| 872 (y % 10) <= 6) | |
| 873 v = 0xff; | |
| 874 else | |
| 875 v = 0x00; | |
| 876 } else if (x < XSIZE/4) { | |
| 2967 | 877 if (x & 1) |
| 0 | 878 v = 0xff; |
| 2967 | 879 else |
| 0 | 880 v = 0; |
| 881 } else if (y < XSIZE/4) { | |
| 2967 | 882 if (y & 1) |
| 0 | 883 v = 0xff; |
| 2967 | 884 else |
| 0 | 885 v = 0; |
| 886 } else { | |
| 887 if (y < YSIZE*3/8) { | |
| 2967 | 888 if ((y+x) & 1) |
| 0 | 889 v = 0xff; |
| 2967 | 890 else |
| 0 | 891 v = 0; |
| 892 } else { | |
| 893 if (((x+3) % 4) <= 1 && | |
| 894 ((y+3) % 4) <= 1) | |
| 895 v = 0xff; | |
| 896 else | |
| 897 v = 0x00; | |
| 898 } | |
| 899 } | |
| 900 } else if (x < XSIZE/2) { | |
| 901 v = ((x - (XSIZE/2)) * 255) / (XSIZE/2); | |
| 902 } else if (y < XSIZE/2) { | |
| 903 v = ((y - (XSIZE/2)) * 255) / (XSIZE/2); | |
| 904 } else { | |
| 905 v = ((x + y - XSIZE) * 255) / XSIZE; | |
| 906 } | |
|
630
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
907 img[(YSIZE - y) * XSIZE + (XSIZE - x)] = v; |
| 0 | 908 } |
| 909 } | |
| 910 save_pgm("/tmp/in.pgm", img, XSIZE, YSIZE); | |
| 911 for(i=0;i<sizeof(factors)/sizeof(float);i++) { | |
| 912 fact = factors[i]; | |
| 913 xsize = (int)(XSIZE * fact); | |
|
630
b4ee42142ad1
croping patch by (talus25 at speakeasy dot net) with fixes from atmos & me
michaelni
parents:
429
diff
changeset
|
914 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
|
915 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
|
916 av_log(NULL, AV_LOG_INFO, "Factor=%0.2f\n", fact); |
| 0 | 917 dump_filter(&s->h_filters[0][0]); |
| 918 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
|
919 img + 50 * XSIZE, XSIZE, XSIZE, YSIZE - 100); |
| 0 | 920 img_resample_close(s); |
| 921 | |
| 2423 | 922 snprintf(buf, sizeof(buf), "/tmp/out%d.pgm", i); |
| 0 | 923 save_pgm(buf, img1, xsize, ysize); |
| 924 } | |
| 925 | |
| 926 /* mmx test */ | |
| 2 | 927 #ifdef HAVE_MMX |
|
2400
17ec73c65748
imgresample test cleanup patch by (Panagiotis Issaris <takis )( lumumba d0t luc d0t ac.be>)
michael
parents:
2082
diff
changeset
|
928 av_log(NULL, AV_LOG_INFO, "MMX test\n"); |
| 0 | 929 fact = 0.72; |
| 930 xsize = (int)(XSIZE * fact); | |
| 931 ysize = (int)(YSIZE * fact); | |
| 932 mm_flags = MM_MMX; | |
| 933 s = img_resample_init(xsize, ysize, XSIZE, YSIZE); | |
| 934 component_resample(s, img1, xsize, xsize, ysize, | |
| 935 img, XSIZE, XSIZE, YSIZE); | |
| 936 | |
| 937 mm_flags = 0; | |
| 938 s = img_resample_init(xsize, ysize, XSIZE, YSIZE); | |
| 939 component_resample(s, img2, xsize, xsize, ysize, | |
| 940 img, XSIZE, XSIZE, YSIZE); | |
| 941 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
|
942 av_log(NULL, AV_LOG_ERROR, "mmx error\n"); |
| 0 | 943 exit(1); |
| 944 } | |
|
2400
17ec73c65748
imgresample test cleanup patch by (Panagiotis Issaris <takis )( lumumba d0t luc d0t ac.be>)
michael
parents:
2082
diff
changeset
|
945 av_log(NULL, AV_LOG_INFO, "MMX OK\n"); |
| 5054 | 946 #endif /* HAVE_MMX */ |
| 0 | 947 return 0; |
| 948 } | |
| 949 | |
| 5054 | 950 #endif /* TEST */ |
