Commit bf1f4da0 authored by Alex Beregszaszi's avatar Alex Beregszaszi

exported ff_mpa_synth_filter for upcoming qdm2 decoder

Originally committed as revision 3897 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 0c716ab7
...@@ -180,6 +180,7 @@ static uint32_t scale_factor_mult3[4] = { ...@@ -180,6 +180,7 @@ static uint32_t scale_factor_mult3[4] = {
FIXR(1.68179283050742908605), FIXR(1.68179283050742908605),
}; };
void ff_mpa_synth_init(MPA_INT *window);
static MPA_INT window[512] __attribute__((aligned(16))); static MPA_INT window[512] __attribute__((aligned(16)));
/* layer 1 unscaling */ /* layer 1 unscaling */
...@@ -350,20 +351,7 @@ static int decode_init(AVCodecContext * avctx) ...@@ -350,20 +351,7 @@ static int decode_init(AVCodecContext * avctx)
scale_factor_mult[i][2]); scale_factor_mult[i][2]);
} }
/* window */ ff_mpa_synth_init(window);
/* max = 18760, max sum over all 16 coefs : 44736 */
for(i=0;i<257;i++) {
int v;
v = mpa_enwindow[i];
#if WFRAC_BITS < 16
v = (v + (1 << (16 - WFRAC_BITS - 1))) >> (16 - WFRAC_BITS);
#endif
window[i] = v;
if ((i & 63) != 0)
v = -v;
if (i != 0)
window[512 - i] = v;
}
/* huffman decode tables */ /* huffman decode tables */
huff_code_table[0] = NULL; huff_code_table[0] = NULL;
...@@ -850,12 +838,31 @@ static inline int round_sample(int64_t sum) ...@@ -850,12 +838,31 @@ static inline int round_sample(int64_t sum)
sum2 op2 MULS((w2)[7 * 64], tmp);\ sum2 op2 MULS((w2)[7 * 64], tmp);\
} }
void ff_mpa_synth_init(MPA_INT *window)
{
int i;
/* max = 18760, max sum over all 16 coefs : 44736 */
for(i=0;i<257;i++) {
int v;
v = mpa_enwindow[i];
#if WFRAC_BITS < 16
v = (v + (1 << (16 - WFRAC_BITS - 1))) >> (16 - WFRAC_BITS);
#endif
window[i] = v;
if ((i & 63) != 0)
v = -v;
if (i != 0)
window[512 - i] = v;
}
}
/* 32 sub band synthesis filter. Input: 32 sub band samples, Output: /* 32 sub band synthesis filter. Input: 32 sub band samples, Output:
32 samples. */ 32 samples. */
/* XXX: optimize by avoiding ring buffer usage */ /* XXX: optimize by avoiding ring buffer usage */
static void synth_filter(MPADecodeContext *s1, void ff_mpa_synth_filter(MPA_INT *synth_buf_ptr, int *synth_buf_offset,
int ch, int16_t *samples, int incr, MPA_INT *window,
int16_t *samples, int incr,
int32_t sb_samples[SBLIMIT]) int32_t sb_samples[SBLIMIT])
{ {
int32_t tmp[32]; int32_t tmp[32];
...@@ -868,11 +875,11 @@ static void synth_filter(MPADecodeContext *s1, ...@@ -868,11 +875,11 @@ static void synth_filter(MPADecodeContext *s1,
#else #else
int64_t sum, sum2; int64_t sum, sum2;
#endif #endif
dct32(tmp, sb_samples); dct32(tmp, sb_samples);
offset = s1->synth_buf_offset[ch]; offset = *synth_buf_offset;
synth_buf = s1->synth_buf[ch] + offset; synth_buf = synth_buf_ptr + offset;
for(j=0;j<32;j++) { for(j=0;j<32;j++) {
v = tmp[j]; v = tmp[j];
...@@ -926,7 +933,7 @@ static void synth_filter(MPADecodeContext *s1, ...@@ -926,7 +933,7 @@ static void synth_filter(MPADecodeContext *s1,
*samples = round_sample(sum); *samples = round_sample(sum);
offset = (offset - 32) & 511; offset = (offset - 32) & 511;
s1->synth_buf_offset[ch] = offset; *synth_buf_offset = offset;
} }
/* cos(pi*i/24) */ /* cos(pi*i/24) */
...@@ -2505,7 +2512,9 @@ static int mp_decode_frame(MPADecodeContext *s, ...@@ -2505,7 +2512,9 @@ static int mp_decode_frame(MPADecodeContext *s,
for(ch=0;ch<s->nb_channels;ch++) { for(ch=0;ch<s->nb_channels;ch++) {
samples_ptr = samples + ch; samples_ptr = samples + ch;
for(i=0;i<nb_frames;i++) { for(i=0;i<nb_frames;i++) {
synth_filter(s, ch, samples_ptr, s->nb_channels, ff_mpa_synth_filter(s->synth_buf[ch], &(s->synth_buf_offset[ch]),
window,
samples_ptr, s->nb_channels,
s->sb_samples[ch][i]); s->sb_samples[ch][i]);
samples_ptr += 32 * s->nb_channels; samples_ptr += 32 * s->nb_channels;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment