Mercurial > libavcodec.hg
annotate ppc/float_altivec.c @ 9896:bbefbca72722 libavcodec
Drop code that attempts to decode frames that are prefixed by junk.
Too often it ends up decoding random data into noise without detecting
it (for example after seeking of some MP3 data with oddly often occurring
startcode emulation).
Fixes issue1154.
| author | michael |
|---|---|
| date | Tue, 30 Jun 2009 03:57:27 +0000 |
| parents | dd2b5e52336a |
| children | 4d1b9ca628fc |
| rev | line source |
|---|---|
| 3581 | 1 /* |
| 2 * Copyright (c) 2006 Luca Barbato <lu_zero@gentoo.org> | |
| 3 * | |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3659
diff
changeset
|
4 * This file is part of FFmpeg. |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3659
diff
changeset
|
5 * |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3659
diff
changeset
|
6 * FFmpeg is free software; you can redistribute it and/or |
| 3581 | 7 * modify it under the terms of the GNU Lesser General Public |
| 8 * 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:
3659
diff
changeset
|
9 * version 2.1 of the License, or (at your option) any later version. |
| 3581 | 10 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3659
diff
changeset
|
11 * FFmpeg is distributed in the hope that it will be useful, |
| 3581 | 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 14 * Lesser General Public License for more details. | |
| 15 * | |
| 16 * 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:
3659
diff
changeset
|
17 * License along with FFmpeg; if not, write to the Free Software |
| 3581 | 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| 19 */ | |
| 20 | |
| 6763 | 21 #include "libavcodec/dsputil.h" |
| 3581 | 22 |
| 23 #include "dsputil_altivec.h" | |
| 8542 | 24 #include "util_altivec.h" |
| 3581 | 25 |
| 26 static void vector_fmul_altivec(float *dst, const float *src, int len) | |
| 27 { | |
| 28 int i; | |
| 29 vector float d0, d1, s, zero = (vector float)vec_splat_u32(0); | |
| 30 for(i=0; i<len-7; i+=8) { | |
| 31 d0 = vec_ld(0, dst+i); | |
| 32 s = vec_ld(0, src+i); | |
| 33 d1 = vec_ld(16, dst+i); | |
| 34 d0 = vec_madd(d0, s, zero); | |
| 35 d1 = vec_madd(d1, vec_ld(16,src+i), zero); | |
| 36 vec_st(d0, 0, dst+i); | |
| 37 vec_st(d1, 16, dst+i); | |
| 38 } | |
| 39 } | |
| 40 | |
| 41 static void vector_fmul_reverse_altivec(float *dst, const float *src0, | |
| 42 const float *src1, int len) | |
| 43 { | |
| 44 int i; | |
| 45 vector float d, s0, s1, h0, l0, | |
| 46 s2, s3, zero = (vector float)vec_splat_u32(0); | |
| 47 src1 += len-4; | |
| 48 for(i=0; i<len-7; i+=8) { | |
| 49 s1 = vec_ld(0, src1-i); // [a,b,c,d] | |
| 50 s0 = vec_ld(0, src0+i); | |
| 51 l0 = vec_mergel(s1, s1); // [c,c,d,d] | |
| 52 s3 = vec_ld(-16, src1-i); | |
| 53 h0 = vec_mergeh(s1, s1); // [a,a,b,b] | |
| 54 s2 = vec_ld(16, src0+i); | |
| 55 s1 = vec_mergeh(vec_mergel(l0,h0), // [d,b,d,b] | |
| 56 vec_mergeh(l0,h0)); // [c,a,c,a] | |
| 57 // [d,c,b,a] | |
| 58 l0 = vec_mergel(s3, s3); | |
| 59 d = vec_madd(s0, s1, zero); | |
| 60 h0 = vec_mergeh(s3, s3); | |
| 61 vec_st(d, 0, dst+i); | |
| 62 s3 = vec_mergeh(vec_mergel(l0,h0), | |
| 63 vec_mergeh(l0,h0)); | |
| 64 d = vec_madd(s2, s3, zero); | |
| 65 vec_st(d, 16, dst+i); | |
| 66 } | |
| 67 } | |
| 68 | |
| 69 static void vector_fmul_add_add_altivec(float *dst, const float *src0, | |
| 70 const float *src1, const float *src2, | |
| 71 int src3, int len, int step) | |
| 72 { | |
| 73 int i; | |
| 74 vector float d, s0, s1, s2, t0, t1, edges; | |
| 75 vector unsigned char align = vec_lvsr(0,dst), | |
| 76 mask = vec_lvsl(0, dst); | |
| 77 | |
| 78 #if 0 //FIXME: there is still something wrong | |
| 79 if (step == 2) { | |
| 80 int y; | |
| 81 vector float d0, d1, s3, t2; | |
| 82 vector unsigned int sel = | |
| 83 vec_mergeh(vec_splat_u32(-1), vec_splat_u32(0)); | |
| 84 t1 = vec_ld(16, dst); | |
| 85 for (i=0,y=0; i<len-3; i+=4,y+=8) { | |
| 86 | |
| 87 s0 = vec_ld(0,src0+i); | |
| 88 s1 = vec_ld(0,src1+i); | |
| 89 s2 = vec_ld(0,src2+i); | |
| 90 | |
| 91 // t0 = vec_ld(0, dst+y); //[x x x|a] | |
| 92 // t1 = vec_ld(16, dst+y); //[b c d|e] | |
| 93 t2 = vec_ld(31, dst+y); //[f g h|x] | |
| 94 | |
| 95 d = vec_madd(s0,s1,s2); // [A B C D] | |
| 96 | |
| 97 // [A A B B] | |
| 98 | |
| 99 // [C C D D] | |
| 100 | |
| 101 d0 = vec_perm(t0, t1, mask); // [a b c d] | |
| 102 | |
| 103 d0 = vec_sel(vec_mergeh(d, d), d0, sel); // [A b B d] | |
| 104 | |
| 105 edges = vec_perm(t1, t0, mask); | |
| 106 | |
| 107 t0 = vec_perm(edges, d0, align); // [x x x|A] | |
| 108 | |
| 109 t1 = vec_perm(d0, edges, align); // [b B d|e] | |
| 110 | |
| 111 vec_stl(t0, 0, dst+y); | |
| 112 | |
| 113 d1 = vec_perm(t1, t2, mask); // [e f g h] | |
| 114 | |
| 115 d1 = vec_sel(vec_mergel(d, d), d1, sel); // [C f D h] | |
| 116 | |
| 117 edges = vec_perm(t2, t1, mask); | |
| 118 | |
| 119 t1 = vec_perm(edges, d1, align); // [b B d|C] | |
| 120 | |
| 121 t2 = vec_perm(d1, edges, align); // [f D h|x] | |
| 122 | |
| 123 vec_stl(t1, 16, dst+y); | |
| 124 | |
| 125 t0 = t1; | |
| 126 | |
| 127 vec_stl(t2, 31, dst+y); | |
| 128 | |
| 129 t1 = t2; | |
| 130 } | |
| 131 } else | |
| 132 #endif | |
| 133 if (step == 1 && src3 == 0) | |
| 134 for (i=0; i<len-3; i+=4) { | |
| 4387 | 135 t0 = vec_ld(0, dst+i); |
| 3581 | 136 t1 = vec_ld(15, dst+i); |
| 137 s0 = vec_ld(0, src0+i); | |
| 138 s1 = vec_ld(0, src1+i); | |
| 139 s2 = vec_ld(0, src2+i); | |
| 140 edges = vec_perm(t1 ,t0, mask); | |
| 141 d = vec_madd(s0,s1,s2); | |
|
3659
dd55fb216497
Proper fix for the corner case that would have been corrected before, praise&blame to me and exg in equal shares
lu_zero
parents:
3657
diff
changeset
|
142 t1 = vec_perm(d, edges, align); |
|
dd55fb216497
Proper fix for the corner case that would have been corrected before, praise&blame to me and exg in equal shares
lu_zero
parents:
3657
diff
changeset
|
143 t0 = vec_perm(edges, d, align); |
|
dd55fb216497
Proper fix for the corner case that would have been corrected before, praise&blame to me and exg in equal shares
lu_zero
parents:
3657
diff
changeset
|
144 vec_st(t1, 15, dst+i); |
| 3581 | 145 vec_st(t0, 0, dst+i); |
| 146 } | |
| 147 else | |
| 148 ff_vector_fmul_add_add_c(dst, src0, src1, src2, src3, len, step); | |
| 149 } | |
| 150 | |
| 8542 | 151 static void vector_fmul_window_altivec(float *dst, const float *src0, const float *src1, const float *win, float add_bias, int len) |
| 152 { | |
| 153 union { | |
| 154 vector float v; | |
| 155 float s[4]; | |
| 156 } vadd; | |
| 157 vector float vadd_bias, zero, t0, t1, s0, s1, wi, wj; | |
| 158 const vector unsigned char reverse = vcprm(3,2,1,0); | |
| 159 int i,j; | |
| 160 | |
| 161 dst += len; | |
| 162 win += len; | |
| 163 src0+= len; | |
| 164 | |
| 165 vadd.s[0] = add_bias; | |
| 166 vadd_bias = vec_splat(vadd.v, 0); | |
| 167 zero = (vector float)vec_splat_u32(0); | |
| 168 | |
| 169 for(i=-len*4, j=len*4-16; i<0; i+=16, j-=16) { | |
| 170 s0 = vec_ld(i, src0); | |
| 171 s1 = vec_ld(j, src1); | |
| 172 wi = vec_ld(i, win); | |
| 173 wj = vec_ld(j, win); | |
| 174 | |
| 175 s1 = vec_perm(s1, s1, reverse); | |
| 176 wj = vec_perm(wj, wj, reverse); | |
| 177 | |
| 178 t0 = vec_madd(s0, wj, vadd_bias); | |
| 179 t0 = vec_nmsub(s1, wi, t0); | |
| 180 t1 = vec_madd(s0, wi, vadd_bias); | |
| 181 t1 = vec_madd(s1, wj, t1); | |
| 182 t1 = vec_perm(t1, t1, reverse); | |
| 183 | |
| 184 vec_st(t0, i, dst); | |
| 185 vec_st(t1, j, dst); | |
| 186 } | |
| 187 } | |
| 7674 | 188 |
|
8365
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
189 static void int32_to_float_fmul_scalar_altivec(float *dst, const int *src, float mul, int len) |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
190 { |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
191 union { |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
192 vector float v; |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
193 float s[4]; |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
194 } mul_u; |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
195 int i; |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
196 vector float src1, src2, dst1, dst2, mul_v, zero; |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
197 |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
198 zero = (vector float)vec_splat_u32(0); |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
199 mul_u.s[0] = mul; |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
200 mul_v = vec_splat(mul_u.v, 0); |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
201 |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
202 for(i=0; i<len; i+=8) { |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
203 src1 = vec_ctf(vec_ld(0, src+i), 0); |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
204 src2 = vec_ctf(vec_ld(16, src+i), 0); |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
205 dst1 = vec_madd(src1, mul_v, zero); |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
206 dst2 = vec_madd(src2, mul_v, zero); |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
207 vec_st(dst1, 0, dst+i); |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
208 vec_st(dst2, 16, dst+i); |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
209 } |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
210 } |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
211 |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
212 |
| 7674 | 213 static vector signed short |
| 214 float_to_int16_one_altivec(const float *src) | |
| 215 { | |
| 216 vector float s0 = vec_ld(0, src); | |
| 217 vector float s1 = vec_ld(16, src); | |
| 218 vector signed int t0 = vec_cts(s0, 0); | |
| 219 vector signed int t1 = vec_cts(s1, 0); | |
| 220 return vec_packs(t0,t1); | |
| 221 } | |
| 222 | |
|
8537
93a3020d9636
Fix float_to_int16_altivec prototype to match float_to_int16's in dsputil.h
gpoirier
parents:
8365
diff
changeset
|
223 static void float_to_int16_altivec(int16_t *dst, const float *src, long len) |
| 3581 | 224 { |
| 225 int i; | |
| 226 vector signed short d0, d1, d; | |
| 227 vector unsigned char align; | |
| 228 if(((long)dst)&15) //FIXME | |
| 229 for(i=0; i<len-7; i+=8) { | |
| 230 d0 = vec_ld(0, dst+i); | |
| 7674 | 231 d = float_to_int16_one_altivec(src+i); |
| 3581 | 232 d1 = vec_ld(15, dst+i); |
| 233 d1 = vec_perm(d1, d0, vec_lvsl(0,dst+i)); | |
| 234 align = vec_lvsr(0, dst+i); | |
|
3657
ff6720290478
Fix float_to_int16, unaligned case, broken by the previous commit
lu_zero
parents:
3583
diff
changeset
|
235 d0 = vec_perm(d1, d, align); |
|
ff6720290478
Fix float_to_int16, unaligned case, broken by the previous commit
lu_zero
parents:
3583
diff
changeset
|
236 d1 = vec_perm(d, d1, align); |
| 3581 | 237 vec_st(d0, 0, dst+i); |
| 238 vec_st(d1,15, dst+i); | |
| 239 } | |
| 240 else | |
| 241 for(i=0; i<len-7; i+=8) { | |
| 7674 | 242 d = float_to_int16_one_altivec(src+i); |
| 3581 | 243 vec_st(d, 0, dst+i); |
| 244 } | |
| 245 } | |
| 246 | |
|
7675
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
247 static void |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
248 float_to_int16_interleave_altivec(int16_t *dst, const float **src, |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
249 long len, int channels) |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
250 { |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
251 int i; |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
252 vector signed short d0, d1, d2, c0, c1, t0, t1; |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
253 vector unsigned char align; |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
254 if(channels == 1) |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
255 float_to_int16_altivec(dst, src[0], len); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
256 else |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
257 if (channels == 2) { |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
258 if(((long)dst)&15) |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
259 for(i=0; i<len-7; i+=8) { |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
260 d0 = vec_ld(0, dst + i); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
261 t0 = float_to_int16_one_altivec(src[0] + i); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
262 d1 = vec_ld(31, dst + i); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
263 t1 = float_to_int16_one_altivec(src[1] + i); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
264 c0 = vec_mergeh(t0, t1); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
265 c1 = vec_mergel(t0, t1); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
266 d2 = vec_perm(d1, d0, vec_lvsl(0, dst + i)); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
267 align = vec_lvsr(0, dst + i); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
268 d0 = vec_perm(d2, c0, align); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
269 d1 = vec_perm(c0, c1, align); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
270 vec_st(d0, 0, dst + i); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
271 d0 = vec_perm(c1, d2, align); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
272 vec_st(d1, 15, dst + i); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
273 vec_st(d0, 31, dst + i); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
274 dst+=8; |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
275 } |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
276 else |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
277 for(i=0; i<len-7; i+=8) { |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
278 t0 = float_to_int16_one_altivec(src[0] + i); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
279 t1 = float_to_int16_one_altivec(src[1] + i); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
280 d0 = vec_mergeh(t0, t1); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
281 d1 = vec_mergel(t0, t1); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
282 vec_st(d0, 0, dst + i); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
283 vec_st(d1, 16, dst + i); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
284 dst+=8; |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
285 } |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
286 } else { |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
287 DECLARE_ALIGNED(16, int16_t, tmp[len]); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
288 int c, j; |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
289 for (c = 0; c < channels; c++) { |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
290 float_to_int16_altivec(tmp, src[c], len); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
291 for (i = 0, j = c; i < len; i++, j+=channels) { |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
292 dst[j] = tmp[i]; |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
293 } |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
294 } |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
295 } |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
296 } |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
297 |
| 3581 | 298 void float_init_altivec(DSPContext* c, AVCodecContext *avctx) |
| 299 { | |
| 300 c->vector_fmul = vector_fmul_altivec; | |
| 301 c->vector_fmul_reverse = vector_fmul_reverse_altivec; | |
| 302 c->vector_fmul_add_add = vector_fmul_add_add_altivec; | |
|
8365
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
303 c->int32_to_float_fmul_scalar = int32_to_float_fmul_scalar_altivec; |
|
7675
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
304 if(!(avctx->flags & CODEC_FLAG_BITEXACT)) { |
| 8542 | 305 c->vector_fmul_window = vector_fmul_window_altivec; |
| 3581 | 306 c->float_to_int16 = float_to_int16_altivec; |
|
7675
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
307 c->float_to_int16_interleave = float_to_int16_interleave_altivec; |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
308 } |
| 3581 | 309 } |
