mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
qdm2: Use floating point synthesis filter.
This avoid needlessly convertion from floating point to fixed point and back. Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
This commit is contained in:
parent
4e987f8282
commit
984ece7503
@ -172,9 +172,9 @@ typedef struct {
|
|||||||
|
|
||||||
/// Synthesis filter
|
/// Synthesis filter
|
||||||
MPADSPContext mpadsp;
|
MPADSPContext mpadsp;
|
||||||
DECLARE_ALIGNED(16, MPA_INT, synth_buf)[MPA_MAX_CHANNELS][512*2];
|
DECLARE_ALIGNED(32, float, synth_buf)[MPA_MAX_CHANNELS][512*2];
|
||||||
int synth_buf_offset[MPA_MAX_CHANNELS];
|
int synth_buf_offset[MPA_MAX_CHANNELS];
|
||||||
DECLARE_ALIGNED(16, int32_t, sb_samples)[MPA_MAX_CHANNELS][128][SBLIMIT];
|
DECLARE_ALIGNED(32, float, sb_samples)[MPA_MAX_CHANNELS][128][SBLIMIT];
|
||||||
|
|
||||||
/// Mixed temporary data used in decoding
|
/// Mixed temporary data used in decoding
|
||||||
float tone_level[MPA_MAX_CHANNELS][30][64];
|
float tone_level[MPA_MAX_CHANNELS][30][64];
|
||||||
@ -331,11 +331,6 @@ static av_cold void qdm2_init_vlc(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* for floating point to fixed point conversion */
|
|
||||||
static const float f2i_scale = (float) (1 << (FRAC_BITS - 15));
|
|
||||||
|
|
||||||
|
|
||||||
static int qdm2_get_vlc (GetBitContext *gb, VLC *vlc, int flag, int depth)
|
static int qdm2_get_vlc (GetBitContext *gb, VLC *vlc, int flag, int depth)
|
||||||
{
|
{
|
||||||
int value;
|
int value;
|
||||||
@ -484,8 +479,8 @@ static void build_sb_samples_from_noise (QDM2Context *q, int sb)
|
|||||||
|
|
||||||
for (ch = 0; ch < q->nb_channels; ch++)
|
for (ch = 0; ch < q->nb_channels; ch++)
|
||||||
for (j = 0; j < 64; j++) {
|
for (j = 0; j < 64; j++) {
|
||||||
q->sb_samples[ch][j * 2][sb] = (int32_t)(f2i_scale * SB_DITHERING_NOISE(sb,q->noise_idx) * q->tone_level[ch][sb][j] + .5);
|
q->sb_samples[ch][j * 2][sb] = SB_DITHERING_NOISE(sb,q->noise_idx) * q->tone_level[ch][sb][j];
|
||||||
q->sb_samples[ch][j * 2 + 1][sb] = (int32_t)(f2i_scale * SB_DITHERING_NOISE(sb,q->noise_idx) * q->tone_level[ch][sb][j] + .5);
|
q->sb_samples[ch][j * 2 + 1][sb] = SB_DITHERING_NOISE(sb,q->noise_idx) * q->tone_level[ch][sb][j];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -925,11 +920,11 @@ static void synthfilt_build_sb_samples (QDM2Context *q, GetBitContext *gb, int l
|
|||||||
for (chs = 0; chs < q->nb_channels; chs++)
|
for (chs = 0; chs < q->nb_channels; chs++)
|
||||||
for (k = 0; k < run; k++)
|
for (k = 0; k < run; k++)
|
||||||
if ((j + k) < 128)
|
if ((j + k) < 128)
|
||||||
q->sb_samples[chs][j + k][sb] = (int32_t)(f2i_scale * q->tone_level[chs][sb][((j + k)/2)] * tmp[k][chs] + .5);
|
q->sb_samples[chs][j + k][sb] = q->tone_level[chs][sb][((j + k)/2)] * tmp[k][chs];
|
||||||
} else {
|
} else {
|
||||||
for (k = 0; k < run; k++)
|
for (k = 0; k < run; k++)
|
||||||
if ((j + k) < 128)
|
if ((j + k) < 128)
|
||||||
q->sb_samples[ch][j + k][sb] = (int32_t)(f2i_scale * q->tone_level[ch][sb][(j + k)/2] * samples[k] + .5);
|
q->sb_samples[ch][j + k][sb] = q->tone_level[ch][sb][(j + k)/2] * samples[k];
|
||||||
}
|
}
|
||||||
|
|
||||||
j += run;
|
j += run;
|
||||||
@ -1603,7 +1598,7 @@ static void qdm2_calculate_fft (QDM2Context *q, int channel, int sub_packet)
|
|||||||
*/
|
*/
|
||||||
static void qdm2_synthesis_filter (QDM2Context *q, int index)
|
static void qdm2_synthesis_filter (QDM2Context *q, int index)
|
||||||
{
|
{
|
||||||
OUT_INT samples[MPA_MAX_CHANNELS * MPA_FRAME_SIZE];
|
float samples[MPA_MAX_CHANNELS * MPA_FRAME_SIZE];
|
||||||
int i, k, ch, sb_used, sub_sampling, dither_state = 0;
|
int i, k, ch, sb_used, sub_sampling, dither_state = 0;
|
||||||
|
|
||||||
/* copy sb_samples */
|
/* copy sb_samples */
|
||||||
@ -1615,12 +1610,12 @@ static void qdm2_synthesis_filter (QDM2Context *q, int index)
|
|||||||
q->sb_samples[ch][(8 * index) + i][k] = 0;
|
q->sb_samples[ch][(8 * index) + i][k] = 0;
|
||||||
|
|
||||||
for (ch = 0; ch < q->nb_channels; ch++) {
|
for (ch = 0; ch < q->nb_channels; ch++) {
|
||||||
OUT_INT *samples_ptr = samples + ch;
|
float *samples_ptr = samples + ch;
|
||||||
|
|
||||||
for (i = 0; i < 8; i++) {
|
for (i = 0; i < 8; i++) {
|
||||||
ff_mpa_synth_filter_fixed(&q->mpadsp,
|
ff_mpa_synth_filter_float(&q->mpadsp,
|
||||||
q->synth_buf[ch], &(q->synth_buf_offset[ch]),
|
q->synth_buf[ch], &(q->synth_buf_offset[ch]),
|
||||||
ff_mpa_synth_window_fixed, &dither_state,
|
ff_mpa_synth_window_float, &dither_state,
|
||||||
samples_ptr, q->nb_channels,
|
samples_ptr, q->nb_channels,
|
||||||
q->sb_samples[ch][(8 * index) + i]);
|
q->sb_samples[ch][(8 * index) + i]);
|
||||||
samples_ptr += 32 * q->nb_channels;
|
samples_ptr += 32 * q->nb_channels;
|
||||||
@ -1632,7 +1627,7 @@ static void qdm2_synthesis_filter (QDM2Context *q, int index)
|
|||||||
|
|
||||||
for (ch = 0; ch < q->channels; ch++)
|
for (ch = 0; ch < q->channels; ch++)
|
||||||
for (i = 0; i < q->frame_size; i++)
|
for (i = 0; i < q->frame_size; i++)
|
||||||
q->output_buffer[q->channels * i + ch] += (float)(samples[q->nb_channels * sub_sampling * i + ch] >> (sizeof(OUT_INT)*8-16));
|
q->output_buffer[q->channels * i + ch] += (1 << 23) * samples[q->nb_channels * sub_sampling * i + ch];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1649,7 +1644,7 @@ static av_cold void qdm2_init(QDM2Context *q) {
|
|||||||
initialized = 1;
|
initialized = 1;
|
||||||
|
|
||||||
qdm2_init_vlc();
|
qdm2_init_vlc();
|
||||||
ff_mpa_synth_init_fixed(ff_mpa_synth_window_fixed);
|
ff_mpa_synth_init_float(ff_mpa_synth_window_float);
|
||||||
softclip_table_init();
|
softclip_table_init();
|
||||||
rnd_table_init();
|
rnd_table_init();
|
||||||
init_noise_samples();
|
init_noise_samples();
|
||||||
|
Loading…
Reference in New Issue
Block a user