| Index: source/patched-ffmpeg-mt/libavcodec/aacsbr.c
|
| ===================================================================
|
| --- source/patched-ffmpeg-mt/libavcodec/aacsbr.c (revision 50820)
|
| +++ source/patched-ffmpeg-mt/libavcodec/aacsbr.c (working copy)
|
| @@ -31,6 +31,7 @@
|
| #include "aacsbr.h"
|
| #include "aacsbrdata.h"
|
| #include "fft.h"
|
| +#include "ps.h"
|
|
|
| #include <stdint.h>
|
| #include <float.h>
|
| @@ -120,6 +121,8 @@
|
|
|
| for (n = 0; n < 320; n++)
|
| sbr_qmf_window_ds[n] = sbr_qmf_window_us[2*n];
|
| +
|
| + ff_ps_init();
|
| }
|
|
|
| av_cold void ff_aac_sbr_ctx_init(SpectralBandReplication *sbr)
|
| @@ -130,6 +133,7 @@
|
| sbr->data[1].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128);
|
| ff_mdct_init(&sbr->mdct, 7, 1, 1.0/64);
|
| ff_mdct_init(&sbr->mdct_ana, 7, 1, -2.0);
|
| + ff_ps_ctx_init(&sbr->ps);
|
| }
|
|
|
| av_cold void ff_aac_sbr_ctx_close(SpectralBandReplication *sbr)
|
| @@ -375,8 +379,7 @@
|
| }
|
|
|
| if (!spectrum->bs_freq_scale) {
|
| - unsigned int dk;
|
| - int k2diff;
|
| + int dk, k2diff;
|
|
|
| dk = spectrum->bs_alter_scale + 1;
|
| sbr->n_master = ((sbr->k[2] - sbr->k[0] + (dk&2)) >> dk) << 1;
|
| @@ -389,7 +392,7 @@
|
| k2diff = sbr->k[2] - sbr->k[0] - sbr->n_master * dk;
|
| if (k2diff < 0) {
|
| sbr->f_master[1]--;
|
| - sbr->f_master[2]-= (k2diff < 1);
|
| + sbr->f_master[2]-= (k2diff < -1);
|
| } else if (k2diff) {
|
| sbr->f_master[sbr->n_master]++;
|
| }
|
| @@ -890,7 +893,6 @@
|
| GetBitContext *gb,
|
| int bs_extension_id, int *num_bits_left)
|
| {
|
| -//TODO - implement ps_data for parametric stereo parsing
|
| switch (bs_extension_id) {
|
| case EXTENSION_ID_PS:
|
| if (!ac->m4ac.ps) {
|
| @@ -898,8 +900,8 @@
|
| skip_bits_long(gb, *num_bits_left); // bs_fill_bits
|
| *num_bits_left = 0;
|
| } else {
|
| -#if 0
|
| - *num_bits_left -= ff_ps_data(gb, ps);
|
| +#if 1
|
| + *num_bits_left -= ff_ps_read_data(ac->avctx, gb, &sbr->ps, *num_bits_left);
|
| #else
|
| av_log_missing_feature(ac->avctx, "Parametric Stereo is", 0);
|
| skip_bits_long(gb, *num_bits_left); // bs_fill_bits
|
| @@ -1008,6 +1010,11 @@
|
| num_bits_left -= 2;
|
| read_sbr_extension(ac, sbr, gb, get_bits(gb, 2), &num_bits_left); // bs_extension_id
|
| }
|
| + if (num_bits_left < 0) {
|
| + av_log(ac->avctx, AV_LOG_ERROR, "SBR Extension over read.\n");
|
| + }
|
| + if (num_bits_left > 0)
|
| + skip_bits(gb, num_bits_left);
|
| }
|
|
|
| return get_bits_count(gb) - cnt;
|
| @@ -1166,7 +1173,7 @@
|
| * (14496-3 sp04 p206)
|
| */
|
| static void sbr_qmf_synthesis(DSPContext *dsp, FFTContext *mdct,
|
| - float *out, float X[2][32][64],
|
| + float *out, float X[2][38][64],
|
| float mdct_buf[2][64],
|
| float *v0, int *v_off, const unsigned int div,
|
| float bias, float scale)
|
| @@ -1402,7 +1409,7 @@
|
| }
|
|
|
| /// Generate the subband filtered lowband
|
| -static int sbr_x_gen(SpectralBandReplication *sbr, float X[2][32][64],
|
| +static int sbr_x_gen(SpectralBandReplication *sbr, float X[2][38][64],
|
| const float X_low[32][40][2], const float Y[2][38][64][2],
|
| int ch)
|
| {
|
| @@ -1424,7 +1431,7 @@
|
| }
|
|
|
| for (k = 0; k < sbr->kx[1]; k++) {
|
| - for (i = i_Temp; i < i_f; i++) {
|
| + for (i = i_Temp; i < 38; i++) {
|
| X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0];
|
| X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1];
|
| }
|
| @@ -1740,6 +1747,16 @@
|
| /* synthesis */
|
| sbr_x_gen(sbr, sbr->X[ch], sbr->X_low, sbr->data[ch].Y, ch);
|
| }
|
| +
|
| + if (ac->m4ac.ps == 1) {
|
| + if (sbr->ps.start) {
|
| + ff_ps_apply(ac->avctx, &sbr->ps, sbr->X[0], sbr->X[1], sbr->kx[1] + sbr->m[1]);
|
| + } else {
|
| + memcpy(sbr->X[1], sbr->X[0], sizeof(sbr->X[0]));
|
| + }
|
| + nch = 2;
|
| + }
|
| +
|
| sbr_qmf_synthesis(&ac->dsp, &sbr->mdct, L, sbr->X[0], sbr->qmf_filter_scratch,
|
| sbr->data[0].synthesis_filterbank_samples,
|
| &sbr->data[0].synthesis_filterbank_samples_offset,
|
|
|