From 64fe1eebddbbf705d0c25d000c102bfca5558682 Mon Sep 17 00:00:00 2001 From: foo86 Date: Fri, 13 May 2016 12:48:27 +0300 Subject: avcodec/dca: use LUT for LBR frequency ranges Values for unsupported frequencies > 48000 Hz are still included (parser will make use of them). Also convert sampling frequencies array to unsigned. Signed-off-by: James Almer --- libavcodec/dca_lbr.c | 15 +++++---------- libavcodec/dcadata.c | 6 +++++- libavcodec/dcadata.h | 3 ++- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/libavcodec/dca_lbr.c b/libavcodec/dca_lbr.c index 9a7f4cd819..f116ab9a02 100644 --- a/libavcodec/dca_lbr.c +++ b/libavcodec/dca_lbr.c @@ -1000,15 +1000,15 @@ static int parse_decoder_init(DCALbrDecoder *s, GetByteContext *gb) int old_band_limit = s->band_limit; int old_nchannels = s->nchannels; int version, bit_rate_hi; - unsigned int code; + unsigned int sr_code; // Sample rate of LBR audio - code = bytestream2_get_byte(gb); - if (code >= FF_ARRAY_ELEMS(ff_dca_sampling_freqs)) { + sr_code = bytestream2_get_byte(gb); + if (sr_code >= FF_ARRAY_ELEMS(ff_dca_sampling_freqs)) { av_log(s->avctx, AV_LOG_ERROR, "Invalid LBR sample rate\n"); return AVERROR_INVALIDDATA; } - s->sample_rate = ff_dca_sampling_freqs[code]; + s->sample_rate = ff_dca_sampling_freqs[sr_code]; if (s->sample_rate > 48000) { avpriv_report_missing_feature(s->avctx, "%d Hz LBR sample rate", s->sample_rate); return AVERROR_PATCHWELCOME; @@ -1076,12 +1076,7 @@ static int parse_decoder_init(DCALbrDecoder *s, GetByteContext *gb) } // Setup frequency range - if (s->sample_rate < 14000) - s->freq_range = 0; - else if (s->sample_rate < 28000) - s->freq_range = 1; - else - s->freq_range = 2; + s->freq_range = ff_dca_freq_ranges[sr_code]; // Setup resolution profile if (s->bit_rate_orig >= 44000 * (s->nchannels_total + 2)) diff --git a/libavcodec/dcadata.c b/libavcodec/dcadata.c index 53be01d1e7..2d533d0c12 100644 --- a/libavcodec/dcadata.c +++ b/libavcodec/dcadata.c @@ -8725,11 +8725,15 @@ const int32_t ff_dca_xll_band_coeff[20] = { 3259333, -5074941, 6928550, -8204883 }; -const int32_t ff_dca_sampling_freqs[16] = { +const uint32_t ff_dca_sampling_freqs[16] = { 8000, 16000, 32000, 64000, 128000, 22050, 44100, 88200, 176400, 352800, 12000, 24000, 48000, 96000, 192000, 384000, }; +const uint8_t ff_dca_freq_ranges[16] = { + 0, 1, 2, 3, 4, 1, 2, 3, 4, 4, 0, 1, 2, 3, 4, 4 +}; + const uint16_t ff_dca_avg_g3_freqs[3] = { 16000, 18000, 24000 }; const uint16_t ff_dca_fst_amp[44] = { diff --git a/libavcodec/dcadata.h b/libavcodec/dcadata.h index 0c54225f97..1ef1342917 100644 --- a/libavcodec/dcadata.h +++ b/libavcodec/dcadata.h @@ -71,7 +71,8 @@ extern const uint16_t ff_dca_xll_refl_coeff[128]; extern const int32_t ff_dca_xll_band_coeff[20]; -extern const int32_t ff_dca_sampling_freqs[16]; +extern const uint32_t ff_dca_sampling_freqs[16]; +extern const uint8_t ff_dca_freq_ranges[16]; extern const uint16_t ff_dca_avg_g3_freqs[3]; -- cgit v1.2.3