Mercurial > libavcodec.hg
annotate ppc/float_altivec.c @ 8991:ca768cb2bfb6 libavcodec
Use last decoded SPS as current SPS in order to parse picture timing SEI
correctly. This works around an apparent H.264 standard deficiency.
Patch by Ivan Schreter, schreter gmx net
| author | cehoyos |
|---|---|
| date | Fri, 20 Feb 2009 16:20:01 +0000 |
| parents | 5a923bd4f5c6 |
| children | dd2b5e52336a |
| 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 "gcc_fixes.h" | |
| 24 | |
| 25 #include "dsputil_altivec.h" | |
| 8542 | 26 #include "util_altivec.h" |
| 3581 | 27 |
| 28 static void vector_fmul_altivec(float *dst, const float *src, int len) | |
| 29 { | |
| 30 int i; | |
| 31 vector float d0, d1, s, zero = (vector float)vec_splat_u32(0); | |
| 32 for(i=0; i<len-7; i+=8) { | |
| 33 d0 = vec_ld(0, dst+i); | |
| 34 s = vec_ld(0, src+i); | |
| 35 d1 = vec_ld(16, dst+i); | |
| 36 d0 = vec_madd(d0, s, zero); | |
| 37 d1 = vec_madd(d1, vec_ld(16,src+i), zero); | |
| 38 vec_st(d0, 0, dst+i); | |
| 39 vec_st(d1, 16, dst+i); | |
| 40 } | |
| 41 } | |
| 42 | |
| 43 static void vector_fmul_reverse_altivec(float *dst, const float *src0, | |
| 44 const float *src1, int len) | |
| 45 { | |
| 46 int i; | |
| 47 vector float d, s0, s1, h0, l0, | |
| 48 s2, s3, zero = (vector float)vec_splat_u32(0); | |
| 49 src1 += len-4; | |
| 50 for(i=0; i<len-7; i+=8) { | |
| 51 s1 = vec_ld(0, src1-i); // [a,b,c,d] | |
| 52 s0 = vec_ld(0, src0+i); | |
| 53 l0 = vec_mergel(s1, s1); // [c,c,d,d] | |
| 54 s3 = vec_ld(-16, src1-i); | |
| 55 h0 = vec_mergeh(s1, s1); // [a,a,b,b] | |
| 56 s2 = vec_ld(16, src0+i); | |
| 57 s1 = vec_mergeh(vec_mergel(l0,h0), // [d,b,d,b] | |
| 58 vec_mergeh(l0,h0)); // [c,a,c,a] | |
| 59 // [d,c,b,a] | |
| 60 l0 = vec_mergel(s3, s3); | |
| 61 d = vec_madd(s0, s1, zero); | |
| 62 h0 = vec_mergeh(s3, s3); | |
| 63 vec_st(d, 0, dst+i); | |
| 64 s3 = vec_mergeh(vec_mergel(l0,h0), | |
| 65 vec_mergeh(l0,h0)); | |
| 66 d = vec_madd(s2, s3, zero); | |
| 67 vec_st(d, 16, dst+i); | |
| 68 } | |
| 69 } | |
| 70 | |
| 71 static void vector_fmul_add_add_altivec(float *dst, const float *src0, | |
| 72 const float *src1, const float *src2, | |
| 73 int src3, int len, int step) | |
| 74 { | |
| 75 int i; | |
| 76 vector float d, s0, s1, s2, t0, t1, edges; | |
| 77 vector unsigned char align = vec_lvsr(0,dst), | |
| 78 mask = vec_lvsl(0, dst); | |
| 79 | |
| 80 #if 0 //FIXME: there is still something wrong | |
| 81 if (step == 2) { | |
| 82 int y; | |
| 83 vector float d0, d1, s3, t2; | |
| 84 vector unsigned int sel = | |
| 85 vec_mergeh(vec_splat_u32(-1), vec_splat_u32(0)); | |
| 86 t1 = vec_ld(16, dst); | |
| 87 for (i=0,y=0; i<len-3; i+=4,y+=8) { | |
| 88 | |
| 89 s0 = vec_ld(0,src0+i); | |
| 90 s1 = vec_ld(0,src1+i); | |
| 91 s2 = vec_ld(0,src2+i); | |
| 92 | |
| 93 // t0 = vec_ld(0, dst+y); //[x x x|a] | |
| 94 // t1 = vec_ld(16, dst+y); //[b c d|e] | |
| 95 t2 = vec_ld(31, dst+y); //[f g h|x] | |
| 96 | |
| 97 d = vec_madd(s0,s1,s2); // [A B C D] | |
| 98 | |
| 99 // [A A B B] | |
| 100 | |
| 101 // [C C D D] | |
| 102 | |
| 103 d0 = vec_perm(t0, t1, mask); // [a b c d] | |
| 104 | |
| 105 d0 = vec_sel(vec_mergeh(d, d), d0, sel); // [A b B d] | |
| 106 | |
| 107 edges = vec_perm(t1, t0, mask); | |
| 108 | |
| 109 t0 = vec_perm(edges, d0, align); // [x x x|A] | |
| 110 | |
| 111 t1 = vec_perm(d0, edges, align); // [b B d|e] | |
| 112 | |
| 113 vec_stl(t0, 0, dst+y); | |
| 114 | |
| 115 d1 = vec_perm(t1, t2, mask); // [e f g h] | |
| 116 | |
| 117 d1 = vec_sel(vec_mergel(d, d), d1, sel); // [C f D h] | |
| 118 | |
| 119 edges = vec_perm(t2, t1, mask); | |
| 120 | |
| 121 t1 = vec_perm(edges, d1, align); // [b B d|C] | |
| 122 | |
| 123 t2 = vec_perm(d1, edges, align); // [f D h|x] | |
| 124 | |
| 125 vec_stl(t1, 16, dst+y); | |
| 126 | |
| 127 t0 = t1; | |
| 128 | |
| 129 vec_stl(t2, 31, dst+y); | |
| 130 | |
| 131 t1 = t2; | |
| 132 } | |
| 133 } else | |
| 134 #endif | |
| 135 if (step == 1 && src3 == 0) | |
| 136 for (i=0; i<len-3; i+=4) { | |
| 4387 | 137 t0 = vec_ld(0, dst+i); |
| 3581 | 138 t1 = vec_ld(15, dst+i); |
| 139 s0 = vec_ld(0, src0+i); | |
| 140 s1 = vec_ld(0, src1+i); | |
| 141 s2 = vec_ld(0, src2+i); | |
| 142 edges = vec_perm(t1 ,t0, mask); | |
| 143 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
|
144 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
|
145 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
|
146 vec_st(t1, 15, dst+i); |
| 3581 | 147 vec_st(t0, 0, dst+i); |
| 148 } | |
| 149 else | |
| 150 ff_vector_fmul_add_add_c(dst, src0, src1, src2, src3, len, step); | |
| 151 } | |
| 152 | |
| 8542 | 153 static void vector_fmul_window_altivec(float *dst, const float *src0, const float *src1, const float *win, float add_bias, int len) |
| 154 { | |
| 155 union { | |
| 156 vector float v; | |
| 157 float s[4]; | |
| 158 } vadd; | |
| 159 vector float vadd_bias, zero, t0, t1, s0, s1, wi, wj; | |
| 160 const vector unsigned char reverse = vcprm(3,2,1,0); | |
| 161 int i,j; | |
| 162 | |
| 163 dst += len; | |
| 164 win += len; | |
| 165 src0+= len; | |
| 166 | |
| 167 vadd.s[0] = add_bias; | |
| 168 vadd_bias = vec_splat(vadd.v, 0); | |
| 169 zero = (vector float)vec_splat_u32(0); | |
| 170 | |
| 171 for(i=-len*4, j=len*4-16; i<0; i+=16, j-=16) { | |
| 172 s0 = vec_ld(i, src0); | |
| 173 s1 = vec_ld(j, src1); | |
| 174 wi = vec_ld(i, win); | |
| 175 wj = vec_ld(j, win); | |
| 176 | |
| 177 s1 = vec_perm(s1, s1, reverse); | |
| 178 wj = vec_perm(wj, wj, reverse); | |
| 179 | |
| 180 t0 = vec_madd(s0, wj, vadd_bias); | |
| 181 t0 = vec_nmsub(s1, wi, t0); | |
| 182 t1 = vec_madd(s0, wi, vadd_bias); | |
| 183 t1 = vec_madd(s1, wj, t1); | |
| 184 t1 = vec_perm(t1, t1, reverse); | |
| 185 | |
| 186 vec_st(t0, i, dst); | |
| 187 vec_st(t1, j, dst); | |
| 188 } | |
| 189 } | |
| 7674 | 190 |
|
8365
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
191 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
|
192 { |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
193 union { |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
194 vector float v; |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
195 float s[4]; |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
196 } mul_u; |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
197 int i; |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
198 vector float src1, src2, dst1, dst2, mul_v, zero; |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
199 |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
200 zero = (vector float)vec_splat_u32(0); |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
201 mul_u.s[0] = mul; |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
202 mul_v = vec_splat(mul_u.v, 0); |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
203 |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
204 for(i=0; i<len; i+=8) { |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
205 src1 = vec_ctf(vec_ld(0, src+i), 0); |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
206 src2 = vec_ctf(vec_ld(16, src+i), 0); |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
207 dst1 = vec_madd(src1, mul_v, zero); |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
208 dst2 = vec_madd(src2, mul_v, zero); |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
209 vec_st(dst1, 0, dst+i); |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
210 vec_st(dst2, 16, dst+i); |
|
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 } |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
213 |
|
d33b47d1f4c1
add AltiVec implementation of int32_to_float_fmul_scalar
gpoirier
parents:
7691
diff
changeset
|
214 |
| 7674 | 215 static vector signed short |
| 216 float_to_int16_one_altivec(const float *src) | |
| 217 { | |
| 218 vector float s0 = vec_ld(0, src); | |
| 219 vector float s1 = vec_ld(16, src); | |
| 220 vector signed int t0 = vec_cts(s0, 0); | |
| 221 vector signed int t1 = vec_cts(s1, 0); | |
| 222 return vec_packs(t0,t1); | |
| 223 } | |
| 224 | |
|
8537
93a3020d9636
Fix float_to_int16_altivec prototype to match float_to_int16's in dsputil.h
gpoirier
parents:
8365
diff
changeset
|
225 static void float_to_int16_altivec(int16_t *dst, const float *src, long len) |
| 3581 | 226 { |
| 227 int i; | |
| 228 vector signed short d0, d1, d; | |
| 229 vector unsigned char align; | |
| 230 if(((long)dst)&15) //FIXME | |
| 231 for(i=0; i<len-7; i+=8) { | |
| 232 d0 = vec_ld(0, dst+i); | |
| 7674 | 233 d = float_to_int16_one_altivec(src+i); |
| 3581 | 234 d1 = vec_ld(15, dst+i); |
| 235 d1 = vec_perm(d1, d0, vec_lvsl(0,dst+i)); | |
| 236 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
|
237 d0 = vec_perm(d1, d, align); |
|
ff6720290478
Fix float_to_int16, unaligned case, broken by the previous commit
lu_zero
parents:
3583
diff
changeset
|
238 d1 = vec_perm(d, d1, align); |
| 3581 | 239 vec_st(d0, 0, dst+i); |
| 240 vec_st(d1,15, dst+i); | |
| 241 } | |
| 242 else | |
| 243 for(i=0; i<len-7; i+=8) { | |
| 7674 | 244 d = float_to_int16_one_altivec(src+i); |
| 3581 | 245 vec_st(d, 0, dst+i); |
| 246 } | |
| 247 } | |
| 248 | |
|
7675
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
249 static void |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
250 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
|
251 long len, int channels) |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
252 { |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
253 int i; |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
254 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
|
255 vector unsigned char align; |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
256 if(channels == 1) |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
257 float_to_int16_altivec(dst, src[0], len); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
258 else |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
259 if (channels == 2) { |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
260 if(((long)dst)&15) |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
261 for(i=0; i<len-7; i+=8) { |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
262 d0 = vec_ld(0, dst + i); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
263 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
|
264 d1 = vec_ld(31, dst + i); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
265 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
|
266 c0 = vec_mergeh(t0, t1); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
267 c1 = vec_mergel(t0, t1); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
268 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
|
269 align = vec_lvsr(0, dst + i); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
270 d0 = vec_perm(d2, c0, align); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
271 d1 = vec_perm(c0, c1, align); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
272 vec_st(d0, 0, dst + i); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
273 d0 = vec_perm(c1, d2, align); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
274 vec_st(d1, 15, dst + i); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
275 vec_st(d0, 31, dst + i); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
276 dst+=8; |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
277 } |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
278 else |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
279 for(i=0; i<len-7; i+=8) { |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
280 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
|
281 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
|
282 d0 = vec_mergeh(t0, t1); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
283 d1 = vec_mergel(t0, t1); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
284 vec_st(d0, 0, dst + i); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
285 vec_st(d1, 16, dst + i); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
286 dst+=8; |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
287 } |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
288 } else { |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
289 DECLARE_ALIGNED(16, int16_t, tmp[len]); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
290 int c, j; |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
291 for (c = 0; c < channels; c++) { |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
292 float_to_int16_altivec(tmp, src[c], len); |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
293 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
|
294 dst[j] = tmp[i]; |
|
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 } |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
298 } |
|
ad4bf45b9b63
Introduce float_to_int16_interleave_altivec, tested with vorbis
lu_zero
parents:
7674
diff
changeset
|
299 |
| 3581 | 300 void float_init_altivec(DSPContext* c, AVCodecContext *avctx) |
| 301 { | |
| 302 c->vector_fmul = vector_fmul_altivec; | |
| 303 c->vector_fmul_reverse = vector_fmul_reverse_altivec; | |
| 304 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
|
305 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
|
306 if(!(avctx->flags & CODEC_FLAG_BITEXACT)) { |
| 8542 | 307 c->vector_fmul_window = vector_fmul_window_altivec; |
| 3581 | 308 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
|
309 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
|
310 } |
| 3581 | 311 } |
