diff options
Diffstat (limited to 'libavcodec/ac3dec.c')
-rw-r--r-- | libavcodec/ac3dec.c | 109 |
1 files changed, 13 insertions, 96 deletions
diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c index 99c8694b7f..3e8b0b5afc 100644 --- a/libavcodec/ac3dec.c +++ b/libavcodec/ac3dec.c @@ -749,8 +749,8 @@ static void decode_band_structure(GetBitContext *gbc, int blk, int eac3, /* calculate number of bands and band sizes based on band structure. note that the first 4 subbands in enhanced coupling span only 6 bins instead of 12. */ - n_bands = n_subbands; if (num_bands || band_sizes ) { + n_bands = n_subbands; bnd_sz[0] = ecpl ? 6 : 12; for (bnd = 0, subbnd = 1; subbnd < n_subbands; subbnd++) { int subbnd_size = (ecpl && subbnd < 4) ? 6 : 12; @@ -818,86 +818,14 @@ static int decode_audio_block(AC3DecodeContext *s, int blk) /* spectral extension strategy */ if (s->eac3 && (!blk || get_bits1(gbc))) { - s->spx_in_use[blk] = get_bits1(gbc); - if (s->spx_in_use[blk]) { - int begf, endf; - int spx_end_subband; - - /* determine which channels use spx */ - if (s->channel_mode == AC3_CHMODE_MONO) { - s->channel_in_spx[1] = 1; - s->spx_coords_exist[1] = 0; - } else { - for (ch = 1; ch <= fbw_channels; ch++) { - s->channel_in_spx[ch] = get_bits1(gbc); - s->spx_coords_exist[ch] = 0; - } - } - - s->spx_copy_start_freq = get_bits(gbc, 2) * 12 + 25; - begf = get_bits(gbc, 3); - endf = get_bits(gbc, 3); - s->spx_start_subband = begf < 6 ? begf+2 : 2*begf-3; - spx_end_subband = endf < 4 ? endf+5 : 2*endf+3; - s->num_spx_subbands = spx_end_subband - s->spx_start_subband; - s->spx_start_freq = s->spx_start_subband * 12 + 25; - s->spx_end_freq = spx_end_subband * 12 + 25; - - decode_band_structure(gbc, blk, s->eac3, 0, - s->spx_start_subband, spx_end_subband, - ff_eac3_default_spx_band_struct, - s->spx_band_struct, NULL, &s->num_spx_bands, - s->spx_band_sizes); - } else { - for (ch = 1; ch <= fbw_channels; ch++) { - s->channel_in_spx[ch] = 0; - s->first_spx_coords[ch] = 1; - } + if (get_bits1(gbc)) { + av_log_missing_feature(s->avctx, "Spectral extension", 1); + return -1; } - } else { - s->spx_in_use[blk] = blk ? s->spx_in_use[blk-1] : 0; + /* TODO: parse spectral extension strategy info */ } - /* spectral extension coordinates */ - if (s->spx_in_use[blk]) { - for (ch = 1; ch <= fbw_channels; ch++) { - if (s->channel_in_spx[ch]) { - if (s->first_spx_coords[ch] || get_bits1(gbc)) { - int bin, spx_blend; - int master_spx_coord; - s->first_spx_coords[ch] = 0; - s->spx_coords_exist[ch] = 1; - spx_blend = get_bits(gbc, 5) << 18; - master_spx_coord = get_bits(gbc, 2) * 3; - bin = s->spx_start_freq; - for (bnd = 0; bnd < s->num_spx_bands; bnd++) { - int spx_coord_exp, spx_coord_mant; - - /* calculate blending factors */ - int bandsize = s->spx_band_sizes[bnd]; - int nratio = (((bin + (bandsize >> 1)) << 23) / s->spx_end_freq) - spx_blend; - nratio = av_clip(nratio, 0, INT24_MAX); - s->spx_noise_blend [ch][bnd] = ff_sqrt(( nratio) << 8) * M_SQRT_POW2_15; - s->spx_signal_blend[ch][bnd] = ff_sqrt((INT24_MAX - nratio) << 8) * M_SQRT_POW2_15; - bin += bandsize; - - /* decode spx coordinates */ - spx_coord_exp = get_bits(gbc, 4); - spx_coord_mant = get_bits(gbc, 2); - if (spx_coord_exp == 15) - s->spx_coords[ch][bnd] = spx_coord_mant << 26; - else - s->spx_coords[ch][bnd] = (spx_coord_mant + 4) << 25; - s->spx_coords[ch][bnd] >>= (spx_coord_exp + master_spx_coord); - } - } else { - s->spx_coords_exist[ch] = 0; - } - } else { - s->first_spx_coords[ch] = 1; - } - } - } + /* TODO: spectral extension coordinates */ /* coupling strategy */ if (s->eac3 ? s->cpl_strategy_exists[blk] : get_bits1(gbc)) { @@ -934,12 +862,9 @@ static int decode_audio_block(AC3DecodeContext *s, int blk) s->phase_flags_in_use = get_bits1(gbc); /* coupling frequency range */ + /* TODO: modify coupling end freq if spectral extension is used */ cpl_start_subband = get_bits(gbc, 4); - if (s->spx_in_use[blk]) { - cpl_end_subband = s->spx_start_subband - 1; - } else { - cpl_end_subband = get_bits(gbc, 4) + 3; - } + cpl_end_subband = get_bits(gbc, 4) + 3; s->num_cpl_subbands = cpl_end_subband - cpl_start_subband; if (s->num_cpl_subbands < 0) { av_log(s->avctx, AV_LOG_ERROR, "invalid coupling range (%d > %d)\n", @@ -1014,14 +939,8 @@ static int decode_audio_block(AC3DecodeContext *s, int blk) if (channel_mode == AC3_CHMODE_STEREO) { if ((s->eac3 && !blk) || get_bits1(gbc)) { s->num_rematrixing_bands = 4; - if (cpl_in_use) { - if (s->start_freq[CPL_CH] <= 61) - s->num_rematrixing_bands -= 1 + (s->start_freq[CPL_CH] == 37); - } else if (s->spx_in_use[blk]) { - if (s->spx_start_freq <= 61) - s->num_rematrixing_bands -= 1 + (s->spx_start_freq <= 37) + - (s->spx_start_freq <= 25); - } + if(cpl_in_use && s->start_freq[CPL_CH] <= 61) + s->num_rematrixing_bands -= 1 + (s->start_freq[CPL_CH] == 37); for(bnd=0; bnd<s->num_rematrixing_bands; bnd++) s->rematrixing_flags[bnd] = get_bits1(gbc); } else if (!blk) { @@ -1046,8 +965,6 @@ static int decode_audio_block(AC3DecodeContext *s, int blk) int prev = s->end_freq[ch]; if (s->channel_in_cpl[ch]) s->end_freq[ch] = s->start_freq[CPL_CH]; - else if (s->channel_in_spx[ch]) - s->end_freq[ch] = s->spx_start_freq; else { int bandwidth_code = get_bits(gbc, 6); if (bandwidth_code > 60) { @@ -1086,7 +1003,7 @@ static int decode_audio_block(AC3DecodeContext *s, int blk) s->bit_alloc_params.fast_decay = ff_ac3_fast_decay_tab[get_bits(gbc, 2)] >> s->bit_alloc_params.sr_shift; s->bit_alloc_params.slow_gain = ff_ac3_slow_gain_tab[get_bits(gbc, 2)]; s->bit_alloc_params.db_per_bit = ff_ac3_db_per_bit_tab[get_bits(gbc, 2)]; - s->bit_alloc_params.floor = ff_ac3_floor_tab[get_bits(gbc, 3)]; + s->bit_alloc_params.floor = ff_ac3_floor_tab[get_bits(gbc, 3)]; for(ch=!cpl_in_use; ch<=s->channels; ch++) bit_alloc_stages[ch] = FFMAX(bit_alloc_stages[ch], 2); } else if (!blk) { @@ -1238,12 +1155,12 @@ static int decode_audio_block(AC3DecodeContext *s, int blk) /* TODO: generate enhanced coupling coordinates and uncouple */ + /* TODO: apply spectral extension */ + /* recover coefficients if rematrixing is in use */ if(s->channel_mode == AC3_CHMODE_STEREO) do_rematrixing(s); - ff_eac3_apply_spectral_extension(s); - /* apply scaling to coefficients (headroom, dynrng) */ for(ch=1; ch<=s->channels; ch++) { float gain = s->mul_bias / 4194304.0f; |