|
|
@@ -129,13 +129,24 @@ av_cold void ff_aac_sbr_init(void) |
|
|
|
ff_ps_init(); |
|
|
|
} |
|
|
|
|
|
|
|
/** Places SBR in pure upsampling mode. */ |
|
|
|
static void sbr_turnoff(SpectralBandReplication *sbr) { |
|
|
|
sbr->start = 0; |
|
|
|
// Init defults used in pure upsampling mode |
|
|
|
sbr->kx[1] = 32; //Typo in spec, kx' inits to 32 |
|
|
|
sbr->m[1] = 0; |
|
|
|
// Reset values for first SBR header |
|
|
|
sbr->data[0].e_a[1] = sbr->data[1].e_a[1] = -1; |
|
|
|
memset(&sbr->spectrum_params, -1, sizeof(SpectrumParameters)); |
|
|
|
} |
|
|
|
|
|
|
|
av_cold void ff_aac_sbr_ctx_init(AACContext *ac, SpectralBandReplication *sbr) |
|
|
|
{ |
|
|
|
float mdct_scale; |
|
|
|
if(sbr->mdct.mdct_bits) |
|
|
|
return; |
|
|
|
sbr->kx[0] = sbr->kx[1] = 32; //Typo in spec, kx' inits to 32 |
|
|
|
sbr->data[0].e_a[1] = sbr->data[1].e_a[1] = -1; |
|
|
|
sbr->kx[0] = sbr->kx[1]; |
|
|
|
sbr_turnoff(sbr); |
|
|
|
sbr->data[0].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128); |
|
|
|
sbr->data[1].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128); |
|
|
|
/* SBR requires samples to be scaled to +/-32768.0 to work correctly. |
|
|
@@ -998,18 +1009,18 @@ static unsigned int read_sbr_data(AACContext *ac, SpectralBandReplication *sbr, |
|
|
|
|
|
|
|
if (id_aac == TYPE_SCE || id_aac == TYPE_CCE) { |
|
|
|
if (read_sbr_single_channel_element(ac, sbr, gb)) { |
|
|
|
sbr->start = 0; |
|
|
|
sbr_turnoff(sbr); |
|
|
|
return get_bits_count(gb) - cnt; |
|
|
|
} |
|
|
|
} else if (id_aac == TYPE_CPE) { |
|
|
|
if (read_sbr_channel_pair_element(ac, sbr, gb)) { |
|
|
|
sbr->start = 0; |
|
|
|
sbr_turnoff(sbr); |
|
|
|
return get_bits_count(gb) - cnt; |
|
|
|
} |
|
|
|
} else { |
|
|
|
av_log(ac->avctx, AV_LOG_ERROR, |
|
|
|
"Invalid bitstream - cannot apply SBR to element type %d\n", id_aac); |
|
|
|
sbr->start = 0; |
|
|
|
sbr_turnoff(sbr); |
|
|
|
return get_bits_count(gb) - cnt; |
|
|
|
} |
|
|
|
if (get_bits1(gb)) { // bs_extended_data |
|
|
@@ -1041,7 +1052,7 @@ static void sbr_reset(AACContext *ac, SpectralBandReplication *sbr) |
|
|
|
if (err < 0) { |
|
|
|
av_log(ac->avctx, AV_LOG_ERROR, |
|
|
|
"SBR reset failed. Switching SBR to pure upsampling mode.\n"); |
|
|
|
sbr->start = 0; |
|
|
|
sbr_turnoff(sbr); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@@ -1076,6 +1087,7 @@ int ff_decode_sbr_extension(AACContext *ac, SpectralBandReplication *sbr, |
|
|
|
//Save some state from the previous frame. |
|
|
|
sbr->kx[0] = sbr->kx[1]; |
|
|
|
sbr->m[0] = sbr->m[1]; |
|
|
|
sbr->kx_and_m_pushed = 1; |
|
|
|
|
|
|
|
num_sbr_bits++; |
|
|
|
if (get_bits1(gb)) // bs_header_flag |
|
|
@@ -1391,7 +1403,7 @@ static int sbr_x_gen(SpectralBandReplication *sbr, float X[2][38][64], |
|
|
|
/** High Frequency Adjustment (14496-3 sp04 p217) and Mapping |
|
|
|
* (14496-3 sp04 p217) |
|
|
|
*/ |
|
|
|
static void sbr_mapping(AACContext *ac, SpectralBandReplication *sbr, |
|
|
|
static int sbr_mapping(AACContext *ac, SpectralBandReplication *sbr, |
|
|
|
SBRData *ch_data, int e_a[2]) |
|
|
|
{ |
|
|
|
int e, i, m; |
|
|
@@ -1402,7 +1414,12 @@ static void sbr_mapping(AACContext *ac, SpectralBandReplication *sbr, |
|
|
|
uint16_t *table = ch_data->bs_freq_res[e + 1] ? sbr->f_tablehigh : sbr->f_tablelow; |
|
|
|
int k; |
|
|
|
|
|
|
|
av_assert0(sbr->kx[1] <= table[0]); |
|
|
|
if (sbr->kx[1] != table[0]) { |
|
|
|
av_log(ac->avctx, AV_LOG_ERROR, "kx != f_table{high,low}[0]. " |
|
|
|
"Derived frequency tables were not regenerated.\n"); |
|
|
|
sbr_turnoff(sbr); |
|
|
|
return AVERROR_BUG; |
|
|
|
} |
|
|
|
for (i = 0; i < ilim; i++) |
|
|
|
for (m = table[i]; m < table[i + 1]; m++) |
|
|
|
sbr->e_origmapped[e][m - sbr->kx[1]] = ch_data->env_facs[e+1][i]; |
|
|
@@ -1437,6 +1454,7 @@ static void sbr_mapping(AACContext *ac, SpectralBandReplication *sbr, |
|
|
|
} |
|
|
|
|
|
|
|
memcpy(ch_data->s_indexmapped[0], ch_data->s_indexmapped[ch_data->bs_num_env], sizeof(ch_data->s_indexmapped[0])); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
/// Estimation of current envelope (14496-3 sp04 p218) |
|
|
@@ -1637,6 +1655,14 @@ void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int id_aac, |
|
|
|
int downsampled = ac->m4ac.ext_sample_rate < sbr->sample_rate; |
|
|
|
int ch; |
|
|
|
int nch = (id_aac == TYPE_CPE) ? 2 : 1; |
|
|
|
int err; |
|
|
|
|
|
|
|
if (!sbr->kx_and_m_pushed) { |
|
|
|
sbr->kx[0] = sbr->kx[1]; |
|
|
|
sbr->m[0] = sbr->m[1]; |
|
|
|
} else { |
|
|
|
sbr->kx_and_m_pushed = 0; |
|
|
|
} |
|
|
|
|
|
|
|
if (sbr->start) { |
|
|
|
sbr_dequant(sbr, id_aac); |
|
|
@@ -1647,6 +1673,7 @@ void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int id_aac, |
|
|
|
(float*)sbr->qmf_filter_scratch, |
|
|
|
sbr->data[ch].W); |
|
|
|
sbr_lf_gen(ac, sbr, sbr->X_low, sbr->data[ch].W); |
|
|
|
sbr->data[ch].Ypos ^= 1; |
|
|
|
if (sbr->start) { |
|
|
|
sbr_hf_inverse_filter(&sbr->dsp, sbr->alpha0, sbr->alpha1, sbr->X_low, sbr->k[0]); |
|
|
|
sbr_chirp(sbr, &sbr->data[ch]); |
|
|
@@ -1655,13 +1682,14 @@ void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int id_aac, |
|
|
|
sbr->data[ch].bs_num_env); |
|
|
|
|
|
|
|
// hf_adj |
|
|
|
sbr_mapping(ac, sbr, &sbr->data[ch], sbr->data[ch].e_a); |
|
|
|
sbr_env_estimate(sbr->e_curr, sbr->X_high, sbr, &sbr->data[ch]); |
|
|
|
sbr_gain_calc(ac, sbr, &sbr->data[ch], sbr->data[ch].e_a); |
|
|
|
sbr->data[ch].Ypos ^= 1; |
|
|
|
sbr_hf_assemble(sbr->data[ch].Y[sbr->data[ch].Ypos], |
|
|
|
sbr->X_high, sbr, &sbr->data[ch], |
|
|
|
sbr->data[ch].e_a); |
|
|
|
err = sbr_mapping(ac, sbr, &sbr->data[ch], sbr->data[ch].e_a); |
|
|
|
if (!err) { |
|
|
|
sbr_env_estimate(sbr->e_curr, sbr->X_high, sbr, &sbr->data[ch]); |
|
|
|
sbr_gain_calc(ac, sbr, &sbr->data[ch], sbr->data[ch].e_a); |
|
|
|
sbr_hf_assemble(sbr->data[ch].Y[sbr->data[ch].Ypos], |
|
|
|
sbr->X_high, sbr, &sbr->data[ch], |
|
|
|
sbr->data[ch].e_a); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/* synthesis */ |
|
|
|