Mercurial > libavcodec.hg
comparison aacsbr.c @ 11886:2d81202be6e2 libavcodec
Add HE-AAC v2 support to the AAC decoder.
author | alexc |
---|---|
date | Sat, 19 Jun 2010 14:14:51 +0000 |
parents | 954d05e65641 |
children | a0c269879276 |
comparison
equal
deleted
inserted
replaced
11885:0e777af9160a | 11886:2d81202be6e2 |
---|---|
29 #include "aac.h" | 29 #include "aac.h" |
30 #include "sbr.h" | 30 #include "sbr.h" |
31 #include "aacsbr.h" | 31 #include "aacsbr.h" |
32 #include "aacsbrdata.h" | 32 #include "aacsbrdata.h" |
33 #include "fft.h" | 33 #include "fft.h" |
34 #include "ps.h" | |
34 | 35 |
35 #include <stdint.h> | 36 #include <stdint.h> |
36 #include <float.h> | 37 #include <float.h> |
37 | 38 |
38 #define ENVELOPE_ADJUSTMENT_OFFSET 2 | 39 #define ENVELOPE_ADJUSTMENT_OFFSET 2 |
118 sbr_qmf_window_us[384] = -sbr_qmf_window_us[384]; | 119 sbr_qmf_window_us[384] = -sbr_qmf_window_us[384]; |
119 sbr_qmf_window_us[512] = -sbr_qmf_window_us[512]; | 120 sbr_qmf_window_us[512] = -sbr_qmf_window_us[512]; |
120 | 121 |
121 for (n = 0; n < 320; n++) | 122 for (n = 0; n < 320; n++) |
122 sbr_qmf_window_ds[n] = sbr_qmf_window_us[2*n]; | 123 sbr_qmf_window_ds[n] = sbr_qmf_window_us[2*n]; |
124 | |
125 ff_ps_init(); | |
123 } | 126 } |
124 | 127 |
125 av_cold void ff_aac_sbr_ctx_init(SpectralBandReplication *sbr) | 128 av_cold void ff_aac_sbr_ctx_init(SpectralBandReplication *sbr) |
126 { | 129 { |
127 sbr->kx[0] = sbr->kx[1] = 32; //Typo in spec, kx' inits to 32 | 130 sbr->kx[0] = sbr->kx[1] = 32; //Typo in spec, kx' inits to 32 |
128 sbr->data[0].e_a[1] = sbr->data[1].e_a[1] = -1; | 131 sbr->data[0].e_a[1] = sbr->data[1].e_a[1] = -1; |
129 sbr->data[0].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128); | 132 sbr->data[0].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128); |
130 sbr->data[1].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128); | 133 sbr->data[1].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128); |
131 ff_mdct_init(&sbr->mdct, 7, 1, 1.0/64); | 134 ff_mdct_init(&sbr->mdct, 7, 1, 1.0/64); |
132 ff_mdct_init(&sbr->mdct_ana, 7, 1, -2.0); | 135 ff_mdct_init(&sbr->mdct_ana, 7, 1, -2.0); |
136 ff_ps_ctx_init(&sbr->ps); | |
133 } | 137 } |
134 | 138 |
135 av_cold void ff_aac_sbr_ctx_close(SpectralBandReplication *sbr) | 139 av_cold void ff_aac_sbr_ctx_close(SpectralBandReplication *sbr) |
136 { | 140 { |
137 ff_mdct_end(&sbr->mdct); | 141 ff_mdct_end(&sbr->mdct); |
888 | 892 |
889 static void read_sbr_extension(AACContext *ac, SpectralBandReplication *sbr, | 893 static void read_sbr_extension(AACContext *ac, SpectralBandReplication *sbr, |
890 GetBitContext *gb, | 894 GetBitContext *gb, |
891 int bs_extension_id, int *num_bits_left) | 895 int bs_extension_id, int *num_bits_left) |
892 { | 896 { |
893 //TODO - implement ps_data for parametric stereo parsing | |
894 switch (bs_extension_id) { | 897 switch (bs_extension_id) { |
895 case EXTENSION_ID_PS: | 898 case EXTENSION_ID_PS: |
896 if (!ac->m4ac.ps) { | 899 if (!ac->m4ac.ps) { |
897 av_log(ac->avctx, AV_LOG_ERROR, "Parametric Stereo signaled to be not-present but was found in the bitstream.\n"); | 900 av_log(ac->avctx, AV_LOG_ERROR, "Parametric Stereo signaled to be not-present but was found in the bitstream.\n"); |
898 skip_bits_long(gb, *num_bits_left); // bs_fill_bits | 901 skip_bits_long(gb, *num_bits_left); // bs_fill_bits |
899 *num_bits_left = 0; | 902 *num_bits_left = 0; |
900 } else { | 903 } else { |
901 #if 0 | 904 #if 1 |
902 *num_bits_left -= ff_ps_data(gb, ps); | 905 *num_bits_left -= ff_ps_read_data(ac->avctx, gb, &sbr->ps, *num_bits_left); |
903 #else | 906 #else |
904 av_log_missing_feature(ac->avctx, "Parametric Stereo is", 0); | 907 av_log_missing_feature(ac->avctx, "Parametric Stereo is", 0); |
905 skip_bits_long(gb, *num_bits_left); // bs_fill_bits | 908 skip_bits_long(gb, *num_bits_left); // bs_fill_bits |
906 *num_bits_left = 0; | 909 *num_bits_left = 0; |
907 #endif | 910 #endif |
1006 num_bits_left <<= 3; | 1009 num_bits_left <<= 3; |
1007 while (num_bits_left > 7) { | 1010 while (num_bits_left > 7) { |
1008 num_bits_left -= 2; | 1011 num_bits_left -= 2; |
1009 read_sbr_extension(ac, sbr, gb, get_bits(gb, 2), &num_bits_left); // bs_extension_id | 1012 read_sbr_extension(ac, sbr, gb, get_bits(gb, 2), &num_bits_left); // bs_extension_id |
1010 } | 1013 } |
1014 if (num_bits_left < 0) { | |
1015 av_log(ac->avctx, AV_LOG_ERROR, "SBR Extension over read.\n"); | |
1016 } | |
1017 if (num_bits_left > 0) | |
1018 skip_bits(gb, num_bits_left); | |
1011 } | 1019 } |
1012 | 1020 |
1013 return get_bits_count(gb) - cnt; | 1021 return get_bits_count(gb) - cnt; |
1014 } | 1022 } |
1015 | 1023 |
1164 /** | 1172 /** |
1165 * Synthesis QMF Bank (14496-3 sp04 p206) and Downsampled Synthesis QMF Bank | 1173 * Synthesis QMF Bank (14496-3 sp04 p206) and Downsampled Synthesis QMF Bank |
1166 * (14496-3 sp04 p206) | 1174 * (14496-3 sp04 p206) |
1167 */ | 1175 */ |
1168 static void sbr_qmf_synthesis(DSPContext *dsp, FFTContext *mdct, | 1176 static void sbr_qmf_synthesis(DSPContext *dsp, FFTContext *mdct, |
1169 float *out, float X[2][32][64], | 1177 float *out, float X[2][38][64], |
1170 float mdct_buf[2][64], | 1178 float mdct_buf[2][64], |
1171 float *v0, int *v_off, const unsigned int div, | 1179 float *v0, int *v_off, const unsigned int div, |
1172 float bias, float scale) | 1180 float bias, float scale) |
1173 { | 1181 { |
1174 int i, n; | 1182 int i, n; |
1400 | 1408 |
1401 return 0; | 1409 return 0; |
1402 } | 1410 } |
1403 | 1411 |
1404 /// Generate the subband filtered lowband | 1412 /// Generate the subband filtered lowband |
1405 static int sbr_x_gen(SpectralBandReplication *sbr, float X[2][32][64], | 1413 static int sbr_x_gen(SpectralBandReplication *sbr, float X[2][38][64], |
1406 const float X_low[32][40][2], const float Y[2][38][64][2], | 1414 const float X_low[32][40][2], const float Y[2][38][64][2], |
1407 int ch) | 1415 int ch) |
1408 { | 1416 { |
1409 int k, i; | 1417 int k, i; |
1410 const int i_f = 32; | 1418 const int i_f = 32; |
1422 X[1][i][k] = Y[0][i + i_f][k][1]; | 1430 X[1][i][k] = Y[0][i + i_f][k][1]; |
1423 } | 1431 } |
1424 } | 1432 } |
1425 | 1433 |
1426 for (k = 0; k < sbr->kx[1]; k++) { | 1434 for (k = 0; k < sbr->kx[1]; k++) { |
1427 for (i = i_Temp; i < i_f; i++) { | 1435 for (i = i_Temp; i < 38; i++) { |
1428 X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0]; | 1436 X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0]; |
1429 X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1]; | 1437 X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1]; |
1430 } | 1438 } |
1431 } | 1439 } |
1432 for (; k < sbr->kx[1] + sbr->m[1]; k++) { | 1440 for (; k < sbr->kx[1] + sbr->m[1]; k++) { |
1738 } | 1746 } |
1739 | 1747 |
1740 /* synthesis */ | 1748 /* synthesis */ |
1741 sbr_x_gen(sbr, sbr->X[ch], sbr->X_low, sbr->data[ch].Y, ch); | 1749 sbr_x_gen(sbr, sbr->X[ch], sbr->X_low, sbr->data[ch].Y, ch); |
1742 } | 1750 } |
1751 | |
1752 if (ac->m4ac.ps == 1) { | |
1753 if (sbr->ps.start) { | |
1754 ff_ps_apply(ac->avctx, &sbr->ps, sbr->X[0], sbr->X[1], sbr->kx[1] + sbr->m[1]); | |
1755 } else { | |
1756 memcpy(sbr->X[1], sbr->X[0], sizeof(sbr->X[0])); | |
1757 } | |
1758 nch = 2; | |
1759 } | |
1760 | |
1743 sbr_qmf_synthesis(&ac->dsp, &sbr->mdct, L, sbr->X[0], sbr->qmf_filter_scratch, | 1761 sbr_qmf_synthesis(&ac->dsp, &sbr->mdct, L, sbr->X[0], sbr->qmf_filter_scratch, |
1744 sbr->data[0].synthesis_filterbank_samples, | 1762 sbr->data[0].synthesis_filterbank_samples, |
1745 &sbr->data[0].synthesis_filterbank_samples_offset, | 1763 &sbr->data[0].synthesis_filterbank_samples_offset, |
1746 downsampled, | 1764 downsampled, |
1747 ac->add_bias, -1024 * ac->sf_scale); | 1765 ac->add_bias, -1024 * ac->sf_scale); |