mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Rewrite ff_sbr_apply in a manner more friendly to PS.
This includes merging ff_sbr_dequant into ff_sbr_apply. Originally committed as revision 22995 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
bd744c4fd0
commit
ca6d3f234c
@ -1892,15 +1892,12 @@ static void spectral_to_sample(AACContext *ac)
|
|||||||
apply_channel_coupling(ac, che, type, i, BETWEEN_TNS_AND_IMDCT, apply_dependent_coupling);
|
apply_channel_coupling(ac, che, type, i, BETWEEN_TNS_AND_IMDCT, apply_dependent_coupling);
|
||||||
if (type != TYPE_CCE || che->coup.coupling_point == AFTER_IMDCT) {
|
if (type != TYPE_CCE || che->coup.coupling_point == AFTER_IMDCT) {
|
||||||
imdct_and_windowing(ac, &che->ch[0], imdct_bias);
|
imdct_and_windowing(ac, &che->ch[0], imdct_bias);
|
||||||
if (ac->m4ac.sbr > 0) {
|
|
||||||
ff_sbr_dequant(ac, &che->sbr, type == TYPE_CPE ? TYPE_CPE : TYPE_SCE);
|
|
||||||
ff_sbr_apply(ac, &che->sbr, 0, che->ch[0].ret, che->ch[0].ret);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (type == TYPE_CPE) {
|
if (type == TYPE_CPE) {
|
||||||
imdct_and_windowing(ac, &che->ch[1], imdct_bias);
|
imdct_and_windowing(ac, &che->ch[1], imdct_bias);
|
||||||
if (ac->m4ac.sbr > 0)
|
}
|
||||||
ff_sbr_apply(ac, &che->sbr, 1, che->ch[1].ret, che->ch[1].ret);
|
if (ac->m4ac.sbr > 0) {
|
||||||
|
ff_sbr_apply(ac, &che->sbr, type, che->ch[0].ret, che->ch[1].ret);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (type <= TYPE_CCE)
|
if (type <= TYPE_CCE)
|
||||||
apply_channel_coupling(ac, che, type, i, AFTER_IMDCT, apply_independent_coupling);
|
apply_channel_coupling(ac, che, type, i, AFTER_IMDCT, apply_independent_coupling);
|
||||||
|
@ -1709,20 +1709,19 @@ static void sbr_hf_assemble(float Y[2][38][64][2], const float X_high[64][40][2]
|
|||||||
ch_data->f_indexsine = indexsine;
|
ch_data->f_indexsine = indexsine;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ff_sbr_dequant(AACContext *ac, SpectralBandReplication *sbr, int id_aac)
|
void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int id_aac,
|
||||||
|
float* L, float* R)
|
||||||
{
|
{
|
||||||
|
int downsampled = ac->m4ac.ext_sample_rate < sbr->sample_rate;
|
||||||
|
int ch;
|
||||||
|
int nch = (id_aac == TYPE_CPE) ? 2 : 1;
|
||||||
|
|
||||||
if (sbr->start) {
|
if (sbr->start) {
|
||||||
sbr_dequant(sbr, id_aac);
|
sbr_dequant(sbr, id_aac);
|
||||||
}
|
}
|
||||||
}
|
for (ch = 0; ch < nch; ch++) {
|
||||||
|
|
||||||
void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int ch,
|
|
||||||
const float* in, float* out)
|
|
||||||
{
|
|
||||||
int downsampled = ac->m4ac.ext_sample_rate < sbr->sample_rate;
|
|
||||||
|
|
||||||
/* decode channel */
|
/* decode channel */
|
||||||
sbr_qmf_analysis(&ac->dsp, &sbr->rdft, in, sbr->data[ch].analysis_filterbank_samples,
|
sbr_qmf_analysis(&ac->dsp, &sbr->rdft, ch ? R : L, sbr->data[ch].analysis_filterbank_samples,
|
||||||
(float*)sbr->qmf_filter_scratch,
|
(float*)sbr->qmf_filter_scratch,
|
||||||
sbr->data[ch].W, 1/(-1024 * ac->sf_scale));
|
sbr->data[ch].W, 1/(-1024 * ac->sf_scale));
|
||||||
sbr_lf_gen(ac, sbr, sbr->X_low, sbr->data[ch].W);
|
sbr_lf_gen(ac, sbr, sbr->X_low, sbr->data[ch].W);
|
||||||
@ -1743,9 +1742,16 @@ void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int ch,
|
|||||||
|
|
||||||
/* synthesis */
|
/* synthesis */
|
||||||
sbr_x_gen(sbr, sbr->X, sbr->X_low, sbr->data[ch].Y, ch);
|
sbr_x_gen(sbr, sbr->X, sbr->X_low, sbr->data[ch].Y, ch);
|
||||||
sbr_qmf_synthesis(&ac->dsp, &sbr->mdct, out, sbr->X, sbr->qmf_filter_scratch,
|
}
|
||||||
sbr->data[ch].synthesis_filterbank_samples,
|
sbr_qmf_synthesis(&ac->dsp, &sbr->mdct, L, sbr->X, sbr->qmf_filter_scratch,
|
||||||
&sbr->data[ch].synthesis_filterbank_samples_offset,
|
sbr->data[0].synthesis_filterbank_samples,
|
||||||
|
&sbr->data[0].synthesis_filterbank_samples_offset,
|
||||||
downsampled,
|
downsampled,
|
||||||
ac->add_bias, -1024 * ac->sf_scale);
|
ac->add_bias, -1024 * ac->sf_scale);
|
||||||
|
if (nch == 2)
|
||||||
|
sbr_qmf_synthesis(&ac->dsp, &sbr->mdct, R, sbr->X, sbr->qmf_filter_scratch,
|
||||||
|
sbr->data[1].synthesis_filterbank_samples,
|
||||||
|
&sbr->data[1].synthesis_filterbank_samples_offset,
|
||||||
|
downsampled,
|
||||||
|
ac->add_bias, -1024 * ac->sf_scale);
|
||||||
}
|
}
|
||||||
|
@ -42,10 +42,8 @@ av_cold void ff_aac_sbr_ctx_close(SpectralBandReplication *sbr);
|
|||||||
/** Decode one SBR element. */
|
/** Decode one SBR element. */
|
||||||
int ff_decode_sbr_extension(AACContext *ac, SpectralBandReplication *sbr,
|
int ff_decode_sbr_extension(AACContext *ac, SpectralBandReplication *sbr,
|
||||||
GetBitContext *gb, int crc, int cnt, int id_aac);
|
GetBitContext *gb, int crc, int cnt, int id_aac);
|
||||||
/** Dequantized all channels in one SBR element. */
|
/** Apply one SBR element to one AAC element. */
|
||||||
void ff_sbr_dequant(AACContext *ac, SpectralBandReplication *sbr, int id_aac);
|
void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int id_aac,
|
||||||
/** Apply dequantized SBR to a single AAC channel. */
|
float* L, float *R);
|
||||||
void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int ch,
|
|
||||||
const float* in, float* out);
|
|
||||||
|
|
||||||
#endif /* AVCODEC_AACSBR_H */
|
#endif /* AVCODEC_AACSBR_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user