diff --git a/libavcodec/aac.h b/libavcodec/aac.h index e9c373fc34e89efae8bd926afe9afa76e2d6a82e..b25b40c9c6b3135472d054d32bed2ca55ba849a0 100644 --- a/libavcodec/aac.h +++ b/libavcodec/aac.h @@ -233,7 +233,8 @@ typedef struct SingleChannelElement { float sf[120]; ///< scalefactors int sf_idx[128]; ///< scalefactor indices (used by encoder) uint8_t zeroes[128]; ///< band is not coded (used by encoder) - DECLARE_ALIGNED(32, float, coeffs)[1024]; ///< coefficients for IMDCT + DECLARE_ALIGNED(32, float, pcoeffs)[1024]; ///< coefficients for IMDCT, pristine + DECLARE_ALIGNED(32, float, coeffs)[1024]; ///< coefficients for IMDCT, maybe processed DECLARE_ALIGNED(32, float, saved)[1536]; ///< overlap DECLARE_ALIGNED(32, float, ret_buf)[2048]; ///< PCM output buffer DECLARE_ALIGNED(16, float, ltp_state)[3072]; ///< time signal for LTP diff --git a/libavcodec/aaccoder.c b/libavcodec/aaccoder.c index b4d200983825e6ac4dbf306b980c0ad219813f4b..64eee3236bea1a535e248396cf0b802e57977d57 100644 --- a/libavcodec/aaccoder.c +++ b/libavcodec/aaccoder.c @@ -1069,10 +1069,10 @@ static void search_for_ms(AACEncContext *s, ChannelElement *cpe, float minthr = FFMIN(band0->threshold, band1->threshold); float maxthr = FFMAX(band0->threshold, band1->threshold); for (i = 0; i < sce0->ics.swb_sizes[g]; i++) { - M[i] = (sce0->coeffs[start+w2*128+i] - + sce1->coeffs[start+w2*128+i]) * 0.5; + M[i] = (sce0->pcoeffs[start+w2*128+i] + + sce1->pcoeffs[start+w2*128+i]) * 0.5; S[i] = M[i] - - sce1->coeffs[start+w2*128+i]; + - sce1->pcoeffs[start+w2*128+i]; } abs_pow34_v(L34, sce0->coeffs+start+w2*128, sce0->ics.swb_sizes[g]); abs_pow34_v(R34, sce1->coeffs+start+w2*128, sce0->ics.swb_sizes[g]); diff --git a/libavcodec/aacenc.c b/libavcodec/aacenc.c index 9c910b7f7fdbda8636f59d096ca3b0c521da1488..7c286aac203473097b362083ae9583435e79d24e 100644 --- a/libavcodec/aacenc.c +++ b/libavcodec/aacenc.c @@ -260,6 +260,7 @@ static void apply_window_and_mdct(AACEncContext *s, SingleChannelElement *sce, for (i = 0; i < 1024; i += 128) s->mdct128.mdct_calc(&s->mdct128, sce->coeffs + i, output + i*2); memcpy(audio, audio + 1024, sizeof(audio[0]) * 1024); + memcpy(sce->pcoeffs, sce->coeffs, sizeof(sce->pcoeffs)); } /** @@ -311,20 +312,23 @@ static void adjust_frame_information(ChannelElement *cpe, int chans) start = 0; maxsfb = 0; cpe->ch[ch].pulse.num_pulse = 0; - for (w = 0; w < ics->num_windows*16; w += 16) { - for (g = 0; g < ics->num_swb; g++) { - //apply M/S - if (cpe->common_window && !ch && cpe->ms_mask[w + g]) { - for (i = 0; i < ics->swb_sizes[g]; i++) { - cpe->ch[0].coeffs[start+i] = (cpe->ch[0].coeffs[start+i] + cpe->ch[1].coeffs[start+i]) / 2.0; - cpe->ch[1].coeffs[start+i] = cpe->ch[0].coeffs[start+i] - cpe->ch[1].coeffs[start+i]; + for (w = 0; w < ics->num_windows; w += ics->group_len[w]) { + for (w2 = 0; w2 < ics->group_len[w]; w2++) { + start = (w+w2) * 128; + for (g = 0; g < ics->num_swb; g++) { + //apply M/S + if (cpe->common_window && !ch && cpe->ms_mask[w*16 + g]) { + for (i = 0; i < ics->swb_sizes[g]; i++) { + cpe->ch[0].coeffs[start+i] = (cpe->ch[0].pcoeffs[start+i] + cpe->ch[1].pcoeffs[start+i]) * 0.5f; + cpe->ch[1].coeffs[start+i] = cpe->ch[0].coeffs[start+i] - cpe->ch[1].pcoeffs[start+i]; + } } + start += ics->swb_sizes[g]; } - start += ics->swb_sizes[g]; + for (cmaxsfb = ics->num_swb; cmaxsfb > 0 && cpe->ch[ch].zeroes[w*16+cmaxsfb-1]; cmaxsfb--) + ; + maxsfb = FFMAX(maxsfb, cmaxsfb); } - for (cmaxsfb = ics->num_swb; cmaxsfb > 0 && cpe->ch[ch].zeroes[w+cmaxsfb-1]; cmaxsfb--) - ; - maxsfb = FFMAX(maxsfb, cmaxsfb); } ics->max_sfb = maxsfb; @@ -507,7 +511,7 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, AACEncContext *s = avctx->priv_data; float **samples = s->planar_samples, *samples2, *la, *overlap; ChannelElement *cpe; - int i, ch, w, g, chans, tag, start_ch, ret; + int i, ch, w, g, chans, tag, start_ch, ret, ms_mode = 0; int chan_el_counter[4]; FFPsyWindowInfo windows[AAC_MAX_CHANNELS]; @@ -630,6 +634,7 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, if (cpe->common_window) { put_ics_info(s, &cpe->ch[0].ics); encode_ms_info(&s->pb, cpe); + if (cpe->ms_mode) ms_mode = 1; } } for (ch = 0; ch < chans; ch++) { @@ -644,6 +649,15 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, s->psy.bitres.bits = frame_bits / s->channels; break; } + if (ms_mode) { + for (i = 0; i < s->chan_map[0]; i++) { + // Must restore coeffs + chans = tag == TYPE_CPE ? 2 : 1; + cpe = &s->cpe[i]; + for (ch = 0; ch < chans; ch++) + memcpy(cpe->ch[ch].coeffs, cpe->ch[ch].pcoeffs, sizeof(cpe->ch[ch].coeffs)); + } + } s->lambda *= avctx->bit_rate * 1024.0f / avctx->sample_rate / frame_bits;