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);