summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/codecs/aacdec/sbr_dec.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'media/libstagefright/codecs/aacdec/sbr_dec.cpp')
-rw-r--r--media/libstagefright/codecs/aacdec/sbr_dec.cpp960
1 files changed, 960 insertions, 0 deletions
diff --git a/media/libstagefright/codecs/aacdec/sbr_dec.cpp b/media/libstagefright/codecs/aacdec/sbr_dec.cpp
new file mode 100644
index 0000000..8519b17
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_dec.cpp
@@ -0,0 +1,960 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2010 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_dec.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who: Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ sbr decoder core function
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+ Coding Technologies
+
+and edited by
+ -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#ifdef AAC_PLUS
+
+
+#include "s_sbr_frame_data.h"
+#include "calc_sbr_synfilterbank.h"
+#include "calc_sbr_anafilterbank.h"
+#include "calc_sbr_envelope.h"
+#include "sbr_generate_high_freq.h"
+#include "sbr_dec.h"
+#include "decode_noise_floorlevels.h"
+#include "aac_mem_funcs.h"
+#include "fxp_mul32.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+
+#ifdef PARAMETRICSTEREO
+
+#include "ps_applied.h"
+#include "ps_init_stereo_mixing.h"
+
+#endif
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void sbr_dec(Int16 *inPcmData,
+ Int16 *ftimeOutPtr,
+ SBR_FRAME_DATA * hFrameData,
+ int32_t applyProcessing,
+ SBR_DEC *sbrDec,
+#ifdef HQ_SBR
+#ifdef PARAMETRICSTEREO
+ Int16 * ftimeOutPtrPS,
+ HANDLE_PS_DEC hParametricStereoDec,
+#endif
+#endif
+ tDec_Int_File *pVars)
+{
+ int32_t i;
+ int32_t j;
+ int32_t m;
+
+ int32_t *frameInfo = hFrameData->frameInfo;
+ Int num_qmf_bands;
+
+#ifdef HQ_SBR
+#ifdef PARAMETRICSTEREO
+
+ int32_t env;
+
+ int32_t *qmf_PS_generated_Real;
+ int32_t *qmf_PS_generated_Imag;
+
+ int32_t *Sr_x;
+ int32_t *Si_x;
+
+
+#endif
+#endif
+
+ int32_t(*scratch_mem)[64];
+ Int16 *circular_buffer_s;
+
+ int32_t k;
+ int32_t *Sr;
+ int32_t *Si;
+ int32_t *ptr_tmp1;
+ int32_t *ptr_tmp2;
+ scratch_mem = pVars->scratch.scratch_mem;
+
+
+ if (applyProcessing)
+ {
+ num_qmf_bands = sbrDec->lowSubband;
+ }
+ else
+ {
+ num_qmf_bands = 32; /* becomes a resampler by 2 */
+ }
+
+ /* -------------------------------------------------- */
+ /*
+ * Re-Load Buffers
+ */
+ pv_memmove(&hFrameData->sbrQmfBufferReal[0],
+ &hFrameData->HistsbrQmfBufferReal[0],
+ 6*SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferReal));
+#ifdef HQ_SBR
+
+
+ if (sbrDec->LC_aacP_DecoderFlag == OFF)
+ {
+ pv_memmove(&hFrameData->sbrQmfBufferImag[0],
+ &hFrameData->HistsbrQmfBufferImag[0],
+ 6*SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferImag));
+ }
+#endif
+ /* -------------------------------------------------- */
+
+
+ /*
+ * low band codec signal subband filtering
+ */
+
+ for (i = 0; i < 32; i++)
+ {
+
+ if (sbrDec->LC_aacP_DecoderFlag == ON)
+ {
+
+ calc_sbr_anafilterbank_LC(hFrameData->codecQmfBufferReal[sbrDec->bufWriteOffs + i],
+ &inPcmData[319] + (i << 5),
+ scratch_mem,
+ num_qmf_bands);
+
+ }
+#ifdef HQ_SBR
+ else
+ {
+
+ calc_sbr_anafilterbank(hFrameData->codecQmfBufferReal[sbrDec->bufWriteOffs + i],
+ hFrameData->codecQmfBufferImag[sbrDec->bufWriteOffs + i],
+ &inPcmData[319] + (i << 5),
+ scratch_mem,
+ num_qmf_bands);
+ }
+#endif
+
+ }
+
+ if (pVars->ltp_buffer_state)
+ {
+ pv_memcpy(&inPcmData[-1024-288], &inPcmData[1024], 288*sizeof(*inPcmData));
+ }
+ else
+ {
+ pv_memcpy(&inPcmData[1024 + 288], &inPcmData[1024], 288*sizeof(*inPcmData));
+ }
+
+
+ if (applyProcessing)
+ {
+
+ /*
+ * Inverse filtering of lowband + HF generation
+ */
+
+ if (sbrDec->LC_aacP_DecoderFlag == ON)
+ {
+
+ sbr_generate_high_freq((int32_t(*)[32])(hFrameData->codecQmfBufferReal + sbrDec->bufReadOffs),
+ NULL,
+ (int32_t *)(hFrameData->sbrQmfBufferReal),
+ NULL,
+ hFrameData->sbr_invf_mode,
+ hFrameData->sbr_invf_mode_prev,
+ &(sbrDec->FreqBandTableNoise[1]),
+ sbrDec->NoNoiseBands,
+ sbrDec->lowSubband,
+ sbrDec->V_k_master,
+ sbrDec->Num_Master,
+ sbrDec->outSampleRate,
+ frameInfo,
+ hFrameData->degreeAlias,
+ scratch_mem,
+ hFrameData->BwVector,/* */
+ hFrameData->BwVectorOld,
+ &(sbrDec->Patch),
+ sbrDec->LC_aacP_DecoderFlag,
+ &(sbrDec->highSubband));
+
+
+ /*
+ * Adjust envelope of current frame.
+ */
+
+ calc_sbr_envelope(hFrameData,
+ (int32_t *)(hFrameData->sbrQmfBufferReal),
+ NULL,
+ sbrDec->FreqBandTable,
+ sbrDec->NSfb,
+ sbrDec->FreqBandTableNoise,
+ sbrDec->NoNoiseBands,
+ hFrameData->reset_flag,
+ hFrameData->degreeAlias,
+ &(hFrameData->harm_index),
+ &(hFrameData->phase_index),
+ hFrameData->hFp,
+ &(hFrameData->sUp),
+ sbrDec->limSbc,
+ sbrDec->gateMode,
+#ifdef HQ_SBR
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+#endif
+ scratch_mem,
+ sbrDec->Patch,
+ sbrDec->sqrt_cache,
+ sbrDec->LC_aacP_DecoderFlag);
+ }
+#ifdef HQ_SBR
+ else
+ {
+
+ sbr_generate_high_freq((int32_t(*)[32])(hFrameData->codecQmfBufferReal + sbrDec->bufReadOffs),
+ (int32_t(*)[32])(hFrameData->codecQmfBufferImag + sbrDec->bufReadOffs),
+ (int32_t *)(hFrameData->sbrQmfBufferReal),
+ (int32_t *)(hFrameData->sbrQmfBufferImag),
+ hFrameData->sbr_invf_mode,
+ hFrameData->sbr_invf_mode_prev,
+ &(sbrDec->FreqBandTableNoise[1]),
+ sbrDec->NoNoiseBands,
+ sbrDec->lowSubband,
+ sbrDec->V_k_master,
+ sbrDec->Num_Master,
+ sbrDec->outSampleRate,
+ frameInfo,
+ NULL,
+ scratch_mem,
+ hFrameData->BwVector,
+ hFrameData->BwVectorOld,
+ &(sbrDec->Patch),
+ sbrDec->LC_aacP_DecoderFlag,
+ &(sbrDec->highSubband));
+
+ /*
+ * Adjust envelope of current frame.
+ */
+
+ calc_sbr_envelope(hFrameData,
+ (int32_t *)(hFrameData->sbrQmfBufferReal),
+ (int32_t *)(hFrameData->sbrQmfBufferImag),
+ sbrDec->FreqBandTable,
+ sbrDec->NSfb,
+ sbrDec->FreqBandTableNoise,
+ sbrDec->NoNoiseBands,
+ hFrameData->reset_flag,
+ NULL,
+ &(hFrameData->harm_index),
+ &(hFrameData->phase_index),
+ hFrameData->hFp,
+ &(hFrameData->sUp),
+ sbrDec->limSbc,
+ sbrDec->gateMode,
+ hFrameData->fBuf_man,
+ hFrameData->fBuf_exp,
+ hFrameData->fBufN_man,
+ hFrameData->fBufN_exp,
+ scratch_mem,
+ sbrDec->Patch,
+ sbrDec->sqrt_cache,
+ sbrDec->LC_aacP_DecoderFlag);
+
+ }
+#endif
+
+
+ }
+ else /* else for applyProcessing */
+ {
+ /* no sbr, set high band buffers to zero */
+
+ for (i = 0; i < SBR_NUM_COLUMNS; i++)
+ {
+ pv_memset((void *)&hFrameData->sbrQmfBufferReal[i*SBR_NUM_BANDS],
+ 0,
+ SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferReal));
+
+#ifdef HQ_SBR
+ pv_memset((void *)&hFrameData->sbrQmfBufferImag[i*SBR_NUM_BANDS],
+ 0,
+ SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferImag));
+
+#endif
+ }
+
+ }
+
+
+ /*
+ * Synthesis subband filtering.
+ */
+
+#ifdef HQ_SBR
+
+#ifdef PARAMETRICSTEREO
+
+
+ /*
+ * psPresentFlag set implies hParametricStereoDec !=NULL, second condition is
+ * is just here to prevent CodeSonar warnings.
+ */
+ if ((pVars->mc_info.psPresentFlag) && (applyProcessing) &&
+ (hParametricStereoDec != NULL))
+ {
+
+ /*
+ * qmfBufferReal uses the rigth aac channel ( perChan[1] is not used)
+ * followed by the buffer fxpCoef[2][2048] which makes a total of
+ * 2349 + 2048*2 = 6445
+ * These 2 matrices (qmfBufferReal & qmfBufferImag) are
+ * [2][38][64] == 4864 int32_t
+ */
+
+
+ tDec_Int_Chan *tmpx = &pVars->perChan[1];
+ /*
+ * dereferencing type-punned pointer avoid
+ * breaking strict-aliasing rules
+ */
+ int32_t *tmp = (int32_t *)tmpx;
+ hParametricStereoDec->qmfBufferReal = (int32_t(*)[64]) tmp;
+
+ tmp = (int32_t *) & hParametricStereoDec->qmfBufferReal[38][0];
+ hParametricStereoDec->qmfBufferImag = (int32_t(*)[64]) tmp;
+
+ for (i = 0; i < 32; i++)
+ {
+ Int xoverBand;
+
+ if (i < ((hFrameData->frameInfo[1]) << 1))
+ {
+ xoverBand = sbrDec->prevLowSubband;
+ }
+ else
+ {
+ xoverBand = sbrDec->lowSubband;
+ }
+
+ if (xoverBand > sbrDec->highSubband)
+ {
+ /*
+ * error condition, default to upsampling mode
+ * and make sure that the number of bands for xover does
+ * not exceed the number of high freq bands.
+ */
+ xoverBand = (sbrDec->highSubband > 32)? 32: sbrDec->highSubband;
+ }
+
+ m = sbrDec->bufReadOffs + i; /* 2 + i */
+
+ Sr_x = hParametricStereoDec->qmfBufferReal[i];
+ Si_x = hParametricStereoDec->qmfBufferImag[i];
+
+
+
+ for (int32_t j = 0; j < xoverBand; j++)
+ {
+ Sr_x[j] = shft_lft_1(hFrameData->codecQmfBufferReal[m][j]);
+ Si_x[j] = shft_lft_1(hFrameData->codecQmfBufferImag[m][j]);
+ }
+
+
+
+
+ pv_memcpy(&Sr_x[xoverBand],
+ &hFrameData->sbrQmfBufferReal[i*SBR_NUM_BANDS],
+ (sbrDec->highSubband - xoverBand)*sizeof(*Sr_x));
+
+ pv_memcpy(&Si_x[xoverBand],
+ &hFrameData->sbrQmfBufferImag[i*SBR_NUM_BANDS],
+ (sbrDec->highSubband - xoverBand)*sizeof(*Si_x));
+
+ pv_memset((void *)&Sr_x[sbrDec->highSubband],
+ 0,
+ (64 - sbrDec->highSubband)*sizeof(*Sr_x));
+
+ pv_memset((void *)&Si_x[sbrDec->highSubband],
+ 0,
+ (64 - sbrDec->highSubband)*sizeof(*Si_x));
+
+
+ }
+
+ for (i = 32; i < 32 + 6; i++)
+ {
+ m = sbrDec->bufReadOffs + i; /* 2 + i */
+
+ for (int32_t j = 0; j < 5; j++)
+ {
+ hParametricStereoDec->qmfBufferReal[i][j] = shft_lft_1(hFrameData->codecQmfBufferReal[m][j]);
+ hParametricStereoDec->qmfBufferImag[i][j] = shft_lft_1(hFrameData->codecQmfBufferImag[m][j]);
+ }
+
+ }
+
+
+ /*
+ * Update Buffers
+ */
+ for (i = 0; i < sbrDec->bufWriteOffs; i++) /* sbrDec->bufWriteOffs set to 8 and unchanged */
+ {
+ j = sbrDec->noCols + i; /* sbrDec->noCols set to 32 and unchanged */
+
+ pv_memmove(hFrameData->codecQmfBufferReal[i], /* to */
+ hFrameData->codecQmfBufferReal[j], /* from */
+ sizeof(*hFrameData->codecQmfBufferReal[i]) << 5);
+
+ pv_memmove(hFrameData->codecQmfBufferImag[i],
+ hFrameData->codecQmfBufferImag[j],
+ sizeof(*hFrameData->codecQmfBufferImag[i]) << 5);
+ }
+
+
+ pv_memmove(&hFrameData->HistsbrQmfBufferReal[0],
+ &hFrameData->sbrQmfBufferReal[32*SBR_NUM_BANDS],
+ 6*SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferReal));
+
+ pv_memmove(&hFrameData->HistsbrQmfBufferImag[0],
+ &hFrameData->sbrQmfBufferImag[32*SBR_NUM_BANDS],
+ 6*SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferImag));
+
+
+ /*
+ * Needs whole QMF matrix formed before applying
+ * Parametric stereo processing.
+ */
+
+ qmf_PS_generated_Real = scratch_mem[0];
+ qmf_PS_generated_Imag = scratch_mem[1];
+ env = 0;
+
+ /*
+ * Set circular buffer for Left channel
+ */
+
+ circular_buffer_s = (Int16 *)scratch_mem[7];
+
+
+ if (pVars->mc_info.bDownSampledSbr)
+ {
+ pv_memmove(&circular_buffer_s[2048],
+ hFrameData->V,
+ 640*sizeof(*circular_buffer_s));
+ }
+ else
+ {
+ pv_memmove(&circular_buffer_s[4096],
+ hFrameData->V,
+ 1152*sizeof(*circular_buffer_s));
+
+ }
+
+
+ /*
+ * Set Circular buffer for PS hybrid analysis
+ */
+
+ int32_t *pt_temp = &scratch_mem[2][32];
+
+ for (i = 0, j = 0; i < 3; i++)
+ {
+
+ pv_memmove(&pt_temp[ j],
+ hParametricStereoDec->hHybrid->mQmfBufferReal[i],
+ HYBRID_FILTER_LENGTH_m_1*sizeof(*hParametricStereoDec->hHybrid->mQmfBufferReal));
+ pv_memmove(&pt_temp[ j + 44],
+ hParametricStereoDec->hHybrid->mQmfBufferImag[i],
+ HYBRID_FILTER_LENGTH_m_1*sizeof(*hParametricStereoDec->hHybrid->mQmfBufferImag));
+ j += 88;
+ }
+
+
+ pv_memset((void *)&qmf_PS_generated_Real[hParametricStereoDec->usb],
+ 0,
+ (64 - hParametricStereoDec->usb)*sizeof(*qmf_PS_generated_Real));
+
+ pv_memset((void *)&qmf_PS_generated_Imag[hParametricStereoDec->usb],
+ 0,
+ (64 - hParametricStereoDec->usb)*sizeof(*qmf_PS_generated_Imag));
+
+
+ for (i = 0; i < 32; i++)
+ {
+ if (i == (Int)hParametricStereoDec-> aEnvStartStop[env])
+ {
+ ps_init_stereo_mixing(hParametricStereoDec, env, sbrDec->highSubband);
+ env++;
+ }
+
+
+ ps_applied(hParametricStereoDec,
+ &hParametricStereoDec->qmfBufferReal[i],
+ &hParametricStereoDec->qmfBufferImag[i],
+ qmf_PS_generated_Real,
+ qmf_PS_generated_Imag,
+ scratch_mem[2],
+ i);
+
+ /* Create time samples for regular mono channel */
+
+ if (pVars->mc_info.bDownSampledSbr)
+ {
+ calc_sbr_synfilterbank(hParametricStereoDec->qmfBufferReal[i], /* realSamples */
+ hParametricStereoDec->qmfBufferImag[i], /* imagSamples */
+ ftimeOutPtr + (i << 6),
+ &circular_buffer_s[1984 - (i<<6)],
+ pVars->mc_info.bDownSampledSbr);
+ }
+ else
+ {
+ calc_sbr_synfilterbank(hParametricStereoDec->qmfBufferReal[i], /* realSamples */
+ hParametricStereoDec->qmfBufferImag[i], /* imagSamples */
+ ftimeOutPtr + (i << 7),
+ &circular_buffer_s[3968 - (i<<7)],
+ pVars->mc_info.bDownSampledSbr);
+
+ }
+
+ pv_memmove(hParametricStereoDec->qmfBufferReal[i], qmf_PS_generated_Real, 64*sizeof(*qmf_PS_generated_Real));
+ pv_memmove(hParametricStereoDec->qmfBufferImag[i], qmf_PS_generated_Imag, 64*sizeof(*qmf_PS_generated_Real));
+
+ }
+
+
+ /*
+ * Save Circular buffer history used on PS hybrid analysis
+ */
+
+
+ pt_temp = &scratch_mem[2][64];
+
+ for (i = 0, j = 0; i < 3; i++)
+ {
+ pv_memmove(hParametricStereoDec->hHybrid->mQmfBufferReal[i],
+ &pt_temp[ j],
+ HYBRID_FILTER_LENGTH_m_1*sizeof(*hParametricStereoDec->hHybrid->mQmfBufferReal));
+
+ pv_memmove(hParametricStereoDec->hHybrid->mQmfBufferImag[i],
+ &pt_temp[ j + 44],
+ HYBRID_FILTER_LENGTH_m_1*sizeof(*hParametricStereoDec->hHybrid->mQmfBufferImag));
+
+ j += 88;
+ }
+
+
+ pv_memmove(hFrameData->V, &circular_buffer_s[0], 1152*sizeof(*circular_buffer_s));
+
+ /*
+ * Set circular buffer for Right channel
+ */
+
+ circular_buffer_s = (Int16 *)scratch_mem[5];
+
+ if (pVars->mc_info.bDownSampledSbr)
+ {
+ pv_memmove(&circular_buffer_s[2048],
+ (int32_t *)hParametricStereoDec->R_ch_qmf_filter_history,
+ 640*sizeof(*circular_buffer_s));
+ }
+ else
+ {
+ pv_memmove(&circular_buffer_s[4096],
+ (int32_t *)hParametricStereoDec->R_ch_qmf_filter_history,
+ 1152*sizeof(*circular_buffer_s));
+
+ }
+
+
+ for (i = 0; i < 32; i++)
+ {
+ if (pVars->mc_info.bDownSampledSbr)
+ {
+
+ calc_sbr_synfilterbank(hParametricStereoDec->qmfBufferReal[i], /* realSamples */
+ hParametricStereoDec->qmfBufferImag[i], /* imagSamples */
+ ftimeOutPtrPS + (i << 6),
+ &circular_buffer_s[1984 - (i<<6)],
+ pVars->mc_info.bDownSampledSbr);
+ }
+ else
+ {
+ calc_sbr_synfilterbank(hParametricStereoDec->qmfBufferReal[i], /* realSamples */
+ hParametricStereoDec->qmfBufferImag[i], /* imagSamples */
+ ftimeOutPtrPS + (i << 7),
+ &circular_buffer_s[3968 - (i<<7)],
+ pVars->mc_info.bDownSampledSbr);
+ }
+
+ }
+
+ if (pVars->mc_info.bDownSampledSbr)
+ {
+ pv_memmove((int32_t *)hParametricStereoDec->R_ch_qmf_filter_history, &circular_buffer_s[0], 640*sizeof(*circular_buffer_s));
+ }
+ else
+ {
+ pv_memmove((int32_t *)hParametricStereoDec->R_ch_qmf_filter_history, &circular_buffer_s[0], 1152*sizeof(*circular_buffer_s));
+ }
+
+
+
+
+
+ }
+ else /* else -- sbrEnablePS */
+ {
+
+#endif /* PARAMETRICSTEREO */
+#endif /* HQ_SBR */
+
+ /*
+ * Use shared aac memory as continuous buffer
+ */
+
+
+ Sr = scratch_mem[0];
+ Si = scratch_mem[1];
+
+ circular_buffer_s = (Int16*)scratch_mem[2];
+
+ if (pVars->mc_info.bDownSampledSbr)
+ {
+
+ pv_memmove(&circular_buffer_s[2048],
+ hFrameData->V,
+ 640*sizeof(*circular_buffer_s));
+ }
+ else
+ {
+ pv_memmove(&circular_buffer_s[4096],
+ hFrameData->V,
+ 1152*sizeof(*circular_buffer_s));
+ }
+
+ for (i = 0; i < 32; i++)
+ {
+ Int xoverBand;
+
+ if (applyProcessing)
+ {
+ if (i < ((hFrameData->frameInfo[1]) << 1))
+ {
+ xoverBand = sbrDec->prevLowSubband;
+
+ }
+ else
+ {
+ xoverBand = sbrDec->lowSubband;
+ }
+
+ if (xoverBand > sbrDec->highSubband)
+ {
+ /*
+ * error condition, default to upsampling mode
+ * and make sure that the number of bands for xover does
+ * not exceed the number of high freq bands.
+ */
+ xoverBand = (sbrDec->highSubband > 32)? 32: sbrDec->highSubband;
+ }
+ }
+ else
+ {
+ xoverBand = 32;
+ sbrDec->highSubband = 32;
+ }
+
+
+ m = sbrDec->bufReadOffs + i; /* sbrDec->bufReadOffs == 2 */
+
+
+ ptr_tmp1 = (hFrameData->codecQmfBufferReal[m]);
+ ptr_tmp2 = Sr;
+
+ if (sbrDec->LC_aacP_DecoderFlag == ON)
+ {
+
+ for (k = (xoverBand >> 1); k != 0; k--)
+ {
+ *(ptr_tmp2++) = (*(ptr_tmp1++)) >> 9;
+ *(ptr_tmp2++) = (*(ptr_tmp1++)) >> 9;
+ }
+ if (xoverBand & 1)
+ {
+ *(ptr_tmp2++) = (*(ptr_tmp1)) >> 9;
+ }
+
+ ptr_tmp1 = &hFrameData->sbrQmfBufferReal[i*SBR_NUM_BANDS];
+
+
+ for (k = xoverBand; k < sbrDec->highSubband; k++)
+ {
+ *(ptr_tmp2++) = (*(ptr_tmp1++)) << 1;
+ }
+
+ pv_memset((void *)ptr_tmp2,
+ 0,
+ (64 - sbrDec->highSubband)*sizeof(*ptr_tmp2));
+
+
+ if (pVars->mc_info.bDownSampledSbr)
+ {
+ calc_sbr_synfilterbank_LC(Sr, /* realSamples */
+ ftimeOutPtr + (i << 6),
+ &circular_buffer_s[1984 - (i<<6)],
+ pVars->mc_info.bDownSampledSbr);
+ }
+ else
+ {
+ calc_sbr_synfilterbank_LC(Sr, /* realSamples */
+ ftimeOutPtr + (i << 7),
+ &circular_buffer_s[3968 - (i<<7)],
+ pVars->mc_info.bDownSampledSbr);
+ }
+ }
+#ifdef HQ_SBR
+ else
+ {
+
+ for (k = xoverBand; k != 0; k--)
+ {
+ *(ptr_tmp2++) = shft_lft_1(*(ptr_tmp1++));
+ }
+
+ ptr_tmp1 = &hFrameData->sbrQmfBufferReal[i*SBR_NUM_BANDS];
+ ptr_tmp2 = &Sr[xoverBand];
+
+
+ for (k = xoverBand; k < sbrDec->highSubband; k++)
+ {
+ *(ptr_tmp2++) = (*(ptr_tmp1++));
+ }
+
+ pv_memset((void *)ptr_tmp2,
+ 0,
+ (64 - sbrDec->highSubband)*sizeof(*ptr_tmp2));
+
+
+ ptr_tmp1 = (hFrameData->codecQmfBufferImag[m]);
+ ptr_tmp2 = Si;
+
+ for (k = (xoverBand >> 1); k != 0; k--)
+ {
+ *(ptr_tmp2++) = shft_lft_1(*(ptr_tmp1++));
+ *(ptr_tmp2++) = shft_lft_1(*(ptr_tmp1++));
+ }
+ if (xoverBand & 1)
+ {
+ *(ptr_tmp2) = shft_lft_1(*(ptr_tmp1));
+ }
+
+ ptr_tmp1 = &hFrameData->sbrQmfBufferImag[i*SBR_NUM_BANDS];
+ ptr_tmp2 = &Si[xoverBand];
+
+ for (k = xoverBand; k < sbrDec->highSubband; k++)
+ {
+ *(ptr_tmp2++) = (*(ptr_tmp1++));
+ }
+
+ pv_memset((void *)ptr_tmp2,
+ 0,
+ (64 - sbrDec->highSubband)*sizeof(*ptr_tmp2));
+
+
+ if (pVars->mc_info.bDownSampledSbr)
+ {
+ calc_sbr_synfilterbank(Sr, /* realSamples */
+ Si, /* imagSamples */
+ ftimeOutPtr + (i << 6),
+ &circular_buffer_s[1984 - (i<<6)],
+ pVars->mc_info.bDownSampledSbr);
+ }
+ else
+ {
+ calc_sbr_synfilterbank(Sr, /* realSamples */
+ Si, /* imagSamples */
+ ftimeOutPtr + (i << 7),
+ &circular_buffer_s[3968 - (i<<7)],
+ pVars->mc_info.bDownSampledSbr);
+ }
+ }
+#endif
+
+ }
+
+ if (pVars->mc_info.bDownSampledSbr)
+ {
+ pv_memmove(hFrameData->V, &circular_buffer_s[0], 640*sizeof(*circular_buffer_s));
+ }
+ else
+ {
+ pv_memmove(hFrameData->V, &circular_buffer_s[0], 1152*sizeof(*circular_buffer_s));
+ }
+
+
+
+
+ /*
+ * Update Buffers
+ */
+ for (i = 0; i < sbrDec->bufWriteOffs; i++) /* sbrDec->bufWriteOffs set to 8 and unchanged */
+ {
+ j = sbrDec->noCols + i; /* sbrDec->noCols set to 32 and unchanged */
+
+ pv_memmove(hFrameData->codecQmfBufferReal[i], /* to */
+ hFrameData->codecQmfBufferReal[j], /* from */
+ sizeof(*hFrameData->codecQmfBufferReal[i]) << 5);
+ }
+
+
+ pv_memmove(&hFrameData->HistsbrQmfBufferReal[0],
+ &hFrameData->sbrQmfBufferReal[32*SBR_NUM_BANDS],
+ 6*SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferReal));
+
+#ifdef HQ_SBR
+ if (sbrDec->LC_aacP_DecoderFlag == OFF)
+ {
+ for (i = 0; i < sbrDec->bufWriteOffs; i++) /* sbrDec->bufWriteOffs set to 6 and unchanged */
+ {
+ j = sbrDec->noCols + i; /* sbrDec->noCols set to 32 and unchanged */
+
+
+ pv_memmove(hFrameData->codecQmfBufferImag[i],
+ hFrameData->codecQmfBufferImag[j],
+ sizeof(*hFrameData->codecQmfBufferImag[i]) << 5);
+
+ }
+
+ pv_memmove(&hFrameData->HistsbrQmfBufferImag[0],
+ &hFrameData->sbrQmfBufferImag[32*SBR_NUM_BANDS],
+ 6*SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferImag));
+ }
+#endif
+
+
+#ifdef HQ_SBR
+#ifdef PARAMETRICSTEREO
+ }
+#endif
+#endif
+
+
+ hFrameData->reset_flag = 0;
+ if (applyProcessing)
+ {
+ sbrDec->prevLowSubband = sbrDec->lowSubband;
+ }
+
+}
+
+
+#endif /* AAC_PLUS */