00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <stdint.h>
00022
00023 #include "libavutil/mem.h"
00024 #include "dct32.h"
00025 #include "mathops.h"
00026 #include "mpegaudiodsp.h"
00027 #include "mpegaudio.h"
00028 #include "mpegaudiodata.h"
00029
00030 #if CONFIG_FLOAT
00031 #define RENAME(n) n##_float
00032
00033 static inline float round_sample(float *sum)
00034 {
00035 float sum1=*sum;
00036 *sum = 0;
00037 return sum1;
00038 }
00039
00040 #define MACS(rt, ra, rb) rt+=(ra)*(rb)
00041 #define MULS(ra, rb) ((ra)*(rb))
00042 #define MULH3(x, y, s) ((s)*(y)*(x))
00043 #define MLSS(rt, ra, rb) rt-=(ra)*(rb)
00044 #define MULLx(x, y, s) ((y)*(x))
00045 #define FIXHR(x) ((float)(x))
00046 #define FIXR(x) ((float)(x))
00047 #define SHR(a,b) ((a)*(1.0f/(1<<(b))))
00048
00049 #else
00050
00051 #define RENAME(n) n##_fixed
00052 #define OUT_SHIFT (WFRAC_BITS + FRAC_BITS - 15)
00053
00054 static inline int round_sample(int64_t *sum)
00055 {
00056 int sum1;
00057 sum1 = (int)((*sum) >> OUT_SHIFT);
00058 *sum &= (1<<OUT_SHIFT)-1;
00059 return av_clip_int16(sum1);
00060 }
00061
00062 # define MULS(ra, rb) MUL64(ra, rb)
00063 # define MACS(rt, ra, rb) MAC64(rt, ra, rb)
00064 # define MLSS(rt, ra, rb) MLS64(rt, ra, rb)
00065 # define MULH3(x, y, s) MULH((s)*(x), y)
00066 # define MULLx(x, y, s) MULL(x,y,s)
00067 # define SHR(a,b) ((a)>>(b))
00068 # define FIXR(a) ((int)((a) * FRAC_ONE + 0.5))
00069 # define FIXHR(a) ((int)((a) * (1LL<<32) + 0.5))
00070 #endif
00071
00072 DECLARE_ALIGNED(16, MPA_INT, RENAME(ff_mpa_synth_window))[512+256];
00073
00074 #define SUM8(op, sum, w, p) \
00075 { \
00076 op(sum, (w)[0 * 64], (p)[0 * 64]); \
00077 op(sum, (w)[1 * 64], (p)[1 * 64]); \
00078 op(sum, (w)[2 * 64], (p)[2 * 64]); \
00079 op(sum, (w)[3 * 64], (p)[3 * 64]); \
00080 op(sum, (w)[4 * 64], (p)[4 * 64]); \
00081 op(sum, (w)[5 * 64], (p)[5 * 64]); \
00082 op(sum, (w)[6 * 64], (p)[6 * 64]); \
00083 op(sum, (w)[7 * 64], (p)[7 * 64]); \
00084 }
00085
00086 #define SUM8P2(sum1, op1, sum2, op2, w1, w2, p) \
00087 { \
00088 INTFLOAT tmp;\
00089 tmp = p[0 * 64];\
00090 op1(sum1, (w1)[0 * 64], tmp);\
00091 op2(sum2, (w2)[0 * 64], tmp);\
00092 tmp = p[1 * 64];\
00093 op1(sum1, (w1)[1 * 64], tmp);\
00094 op2(sum2, (w2)[1 * 64], tmp);\
00095 tmp = p[2 * 64];\
00096 op1(sum1, (w1)[2 * 64], tmp);\
00097 op2(sum2, (w2)[2 * 64], tmp);\
00098 tmp = p[3 * 64];\
00099 op1(sum1, (w1)[3 * 64], tmp);\
00100 op2(sum2, (w2)[3 * 64], tmp);\
00101 tmp = p[4 * 64];\
00102 op1(sum1, (w1)[4 * 64], tmp);\
00103 op2(sum2, (w2)[4 * 64], tmp);\
00104 tmp = p[5 * 64];\
00105 op1(sum1, (w1)[5 * 64], tmp);\
00106 op2(sum2, (w2)[5 * 64], tmp);\
00107 tmp = p[6 * 64];\
00108 op1(sum1, (w1)[6 * 64], tmp);\
00109 op2(sum2, (w2)[6 * 64], tmp);\
00110 tmp = p[7 * 64];\
00111 op1(sum1, (w1)[7 * 64], tmp);\
00112 op2(sum2, (w2)[7 * 64], tmp);\
00113 }
00114
00115 void RENAME(ff_mpadsp_apply_window)(MPA_INT *synth_buf, MPA_INT *window,
00116 int *dither_state, OUT_INT *samples,
00117 int incr)
00118 {
00119 register const MPA_INT *w, *w2, *p;
00120 int j;
00121 OUT_INT *samples2;
00122 #if CONFIG_FLOAT
00123 float sum, sum2;
00124 #else
00125 int64_t sum, sum2;
00126 #endif
00127
00128
00129 memcpy(synth_buf + 512, synth_buf, 32 * sizeof(*synth_buf));
00130
00131 samples2 = samples + 31 * incr;
00132 w = window;
00133 w2 = window + 31;
00134
00135 sum = *dither_state;
00136 p = synth_buf + 16;
00137 SUM8(MACS, sum, w, p);
00138 p = synth_buf + 48;
00139 SUM8(MLSS, sum, w + 32, p);
00140 *samples = round_sample(&sum);
00141 samples += incr;
00142 w++;
00143
00144
00145
00146 for(j=1;j<16;j++) {
00147 sum2 = 0;
00148 p = synth_buf + 16 + j;
00149 SUM8P2(sum, MACS, sum2, MLSS, w, w2, p);
00150 p = synth_buf + 48 - j;
00151 SUM8P2(sum, MLSS, sum2, MLSS, w + 32, w2 + 32, p);
00152
00153 *samples = round_sample(&sum);
00154 samples += incr;
00155 sum += sum2;
00156 *samples2 = round_sample(&sum);
00157 samples2 -= incr;
00158 w++;
00159 w2--;
00160 }
00161
00162 p = synth_buf + 32;
00163 SUM8(MLSS, sum, w + 32, p);
00164 *samples = round_sample(&sum);
00165 *dither_state= sum;
00166 }
00167
00168
00169
00170 void RENAME(ff_mpa_synth_filter)(MPADSPContext *s, MPA_INT *synth_buf_ptr,
00171 int *synth_buf_offset,
00172 MPA_INT *window, int *dither_state,
00173 OUT_INT *samples, int incr,
00174 MPA_INT *sb_samples)
00175 {
00176 MPA_INT *synth_buf;
00177 int offset;
00178
00179 offset = *synth_buf_offset;
00180 synth_buf = synth_buf_ptr + offset;
00181
00182 s->RENAME(dct32)(synth_buf, sb_samples);
00183 s->RENAME(apply_window)(synth_buf, window, dither_state, samples, incr);
00184
00185 offset = (offset - 32) & 511;
00186 *synth_buf_offset = offset;
00187 }
00188
00189 void av_cold RENAME(ff_mpa_synth_init)(MPA_INT *window)
00190 {
00191 int i, j;
00192
00193
00194 for(i=0;i<257;i++) {
00195 INTFLOAT v;
00196 v = ff_mpa_enwindow[i];
00197 #if CONFIG_FLOAT
00198 v *= 1.0 / (1LL<<(16 + FRAC_BITS));
00199 #endif
00200 window[i] = v;
00201 if ((i & 63) != 0)
00202 v = -v;
00203 if (i != 0)
00204 window[512 - i] = v;
00205 }
00206
00207
00208 for(i=0; i < 8; i++)
00209 for(j=0; j < 16; j++)
00210 window[512+16*i+j] = window[64*i+32-j];
00211
00212 for(i=0; i < 8; i++)
00213 for(j=0; j < 16; j++)
00214 window[512+128+16*i+j] = window[64*i+48-j];
00215 }
00216
00217
00218 #define C1 FIXHR(0.98480775301220805936/2)
00219 #define C2 FIXHR(0.93969262078590838405/2)
00220 #define C3 FIXHR(0.86602540378443864676/2)
00221 #define C4 FIXHR(0.76604444311897803520/2)
00222 #define C5 FIXHR(0.64278760968653932632/2)
00223 #define C6 FIXHR(0.5/2)
00224 #define C7 FIXHR(0.34202014332566873304/2)
00225 #define C8 FIXHR(0.17364817766693034885/2)
00226
00227
00228 static const INTFLOAT icos36[9] = {
00229 FIXR(0.50190991877167369479),
00230 FIXR(0.51763809020504152469),
00231 FIXR(0.55168895948124587824),
00232 FIXR(0.61038729438072803416),
00233 FIXR(0.70710678118654752439),
00234 FIXR(0.87172339781054900991),
00235 FIXR(1.18310079157624925896),
00236 FIXR(1.93185165257813657349),
00237 FIXR(5.73685662283492756461),
00238 };
00239
00240
00241 static const INTFLOAT icos36h[9] = {
00242 FIXHR(0.50190991877167369479/2),
00243 FIXHR(0.51763809020504152469/2),
00244 FIXHR(0.55168895948124587824/2),
00245 FIXHR(0.61038729438072803416/2),
00246 FIXHR(0.70710678118654752439/2),
00247 FIXHR(0.87172339781054900991/2),
00248 FIXHR(1.18310079157624925896/4),
00249 FIXHR(1.93185165257813657349/4),
00250 };
00251
00252
00253
00254 void RENAME(ff_imdct36)(INTFLOAT *out, INTFLOAT *buf, INTFLOAT *in,
00255 INTFLOAT *win)
00256 {
00257 int i, j;
00258 INTFLOAT t0, t1, t2, t3, s0, s1, s2, s3;
00259 INTFLOAT tmp[18], *tmp1, *in1;
00260
00261 for(i=17;i>=1;i--)
00262 in[i] += in[i-1];
00263 for(i=17;i>=3;i-=2)
00264 in[i] += in[i-2];
00265
00266 for(j=0;j<2;j++) {
00267 tmp1 = tmp + j;
00268 in1 = in + j;
00269
00270 t2 = in1[2*4] + in1[2*8] - in1[2*2];
00271
00272 t3 = in1[2*0] + SHR(in1[2*6],1);
00273 t1 = in1[2*0] - in1[2*6];
00274 tmp1[ 6] = t1 - SHR(t2,1);
00275 tmp1[16] = t1 + t2;
00276
00277 t0 = MULH3(in1[2*2] + in1[2*4] , C2, 2);
00278 t1 = MULH3(in1[2*4] - in1[2*8] , -2*C8, 1);
00279 t2 = MULH3(in1[2*2] + in1[2*8] , -C4, 2);
00280
00281 tmp1[10] = t3 - t0 - t2;
00282 tmp1[ 2] = t3 + t0 + t1;
00283 tmp1[14] = t3 + t2 - t1;
00284
00285 tmp1[ 4] = MULH3(in1[2*5] + in1[2*7] - in1[2*1], -C3, 2);
00286 t2 = MULH3(in1[2*1] + in1[2*5], C1, 2);
00287 t3 = MULH3(in1[2*5] - in1[2*7], -2*C7, 1);
00288 t0 = MULH3(in1[2*3], C3, 2);
00289
00290 t1 = MULH3(in1[2*1] + in1[2*7], -C5, 2);
00291
00292 tmp1[ 0] = t2 + t3 + t0;
00293 tmp1[12] = t2 + t1 - t0;
00294 tmp1[ 8] = t3 - t1 - t0;
00295 }
00296
00297 i = 0;
00298 for(j=0;j<4;j++) {
00299 t0 = tmp[i];
00300 t1 = tmp[i + 2];
00301 s0 = t1 + t0;
00302 s2 = t1 - t0;
00303
00304 t2 = tmp[i + 1];
00305 t3 = tmp[i + 3];
00306 s1 = MULH3(t3 + t2, icos36h[j], 2);
00307 s3 = MULLx(t3 - t2, icos36[8 - j], FRAC_BITS);
00308
00309 t0 = s0 + s1;
00310 t1 = s0 - s1;
00311 out[(9 + j)*SBLIMIT] = MULH3(t1, win[9 + j], 1) + buf[9 + j];
00312 out[(8 - j)*SBLIMIT] = MULH3(t1, win[8 - j], 1) + buf[8 - j];
00313 buf[9 + j] = MULH3(t0, win[20 + 9 + j], 1);
00314 buf[8 - j] = MULH3(t0, win[20 + 8 - j], 1);
00315
00316 t0 = s2 + s3;
00317 t1 = s2 - s3;
00318 out[(9 + 8 - j)*SBLIMIT] = MULH3(t1, win[9 + 8 - j], 1) + buf[9 + 8 - j];
00319 out[( j)*SBLIMIT] = MULH3(t1, win[ j], 1) + buf[ j];
00320 buf[9 + 8 - j] = MULH3(t0, win[20 + 9 + 8 - j], 1);
00321 buf[ + j] = MULH3(t0, win[20 + j], 1);
00322 i += 4;
00323 }
00324
00325 s0 = tmp[16];
00326 s1 = MULH3(tmp[17], icos36h[4], 2);
00327 t0 = s0 + s1;
00328 t1 = s0 - s1;
00329 out[(9 + 4)*SBLIMIT] = MULH3(t1, win[9 + 4], 1) + buf[9 + 4];
00330 out[(8 - 4)*SBLIMIT] = MULH3(t1, win[8 - 4], 1) + buf[8 - 4];
00331 buf[9 + 4] = MULH3(t0, win[20 + 9 + 4], 1);
00332 buf[8 - 4] = MULH3(t0, win[20 + 8 - 4], 1);
00333 }
00334