From ec7b3fe515640fb32a0de5b5d9503e41b46d8a78 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sat, 7 Nov 2009 15:24:54 +0100 Subject: [PATCH] wma: Move computation of high band values to a separate function. --- wmadec_filter.c | 106 ++++++++++++++++++++++++++---------------------- 1 file changed, 57 insertions(+), 49 deletions(-) diff --git a/wmadec_filter.c b/wmadec_filter.c index 16b9894c..8c9132eb 100644 --- a/wmadec_filter.c +++ b/wmadec_filter.c @@ -678,6 +678,61 @@ static int wma_total_gain_to_bits(int total_gain) return 9; } +static int compute_high_band_values(struct private_wmadec_data *pwd, + int bsize, int nb_coefs[MAX_CHANNELS]) +{ + int ch; + + if (pwd->use_noise_coding) { + for (ch = 0; ch < pwd->ahi.channels; ch++) { + if (pwd->channel_coded[ch]) { + int i, m, a; + m = pwd->exponent_high_sizes[bsize]; + for (i = 0; i < m; i++) { + a = get_bit(&pwd->gb); + pwd->high_band_coded[ch][i] = a; + /* if noise coding, the coefficients are not transmitted */ + if (a) + nb_coefs[ch] -= + pwd-> + exponent_high_bands[bsize] + [i]; + } + } + } + for (ch = 0; ch < pwd->ahi.channels; ch++) { + if (pwd->channel_coded[ch]) { + int i, n, val; + + n = pwd->exponent_high_sizes[bsize]; + val = (int) 0x80000000; + for (i = 0; i < n; i++) { + if (pwd->high_band_coded[ch][i]) { + if (val == (int) 0x80000000) { + val = + get_bits(&pwd->gb, + 7) - 19; + } else { + int code = + get_vlc(&pwd->gb, + pwd-> + hgain_vlc. + table, + HGAINVLCBITS, + HGAINMAX); + if (code < 0) + return -1; + val += code - 18; + } + pwd->high_band_values[ch][i] = + val; + } + } + } + } + } + return 1; +} /** * @return 0 if OK. 1 if last block of frame. return -1 if * unrecorrable error. @@ -757,55 +812,8 @@ static int wma_decode_block(struct private_wmadec_data *pwd) for (ch = 0; ch < pwd->ahi.channels; ch++) nb_coefs[ch] = n; - /* complex coding */ - if (pwd->use_noise_coding) { - for (ch = 0; ch < pwd->ahi.channels; ch++) { - if (pwd->channel_coded[ch]) { - int i, m, a; - m = pwd->exponent_high_sizes[bsize]; - for (i = 0; i < m; i++) { - a = get_bit(&pwd->gb); - pwd->high_band_coded[ch][i] = a; - /* if noise coding, the coefficients are not transmitted */ - if (a) - nb_coefs[ch] -= - pwd-> - exponent_high_bands[bsize] - [i]; - } - } - } - for (ch = 0; ch < pwd->ahi.channels; ch++) { - if (pwd->channel_coded[ch]) { - int i, val; - - n = pwd->exponent_high_sizes[bsize]; - val = (int) 0x80000000; - for (i = 0; i < n; i++) { - if (pwd->high_band_coded[ch][i]) { - if (val == (int) 0x80000000) { - val = - get_bits(&pwd->gb, - 7) - 19; - } else { - code = - get_vlc(&pwd->gb, - pwd-> - hgain_vlc. - table, - HGAINVLCBITS, - HGAINMAX); - if (code < 0) - return -1; - val += code - 18; - } - pwd->high_band_values[ch][i] = - val; - } - } - } - } - } + if (compute_high_band_values(pwd, bsize, nb_coefs) < 0) + return -1; /* exponents can be reused in short blocks. */ if ((pwd->block_len_bits == pwd->frame_len_bits) || get_bit(&pwd->gb)) { -- 2.39.2