/* * Arbitrary order bitstream parser */ AAC_DECODER_ERROR CChannelElement_Read( HANDLE_FDK_BITSTREAM hBs, CAacDecoderChannelInfo *pAacDecoderChannelInfo[], CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[], const AUDIO_OBJECT_TYPE aot, SamplingRateInfo *pSamplingRateInfo, const UINT flags, const UINT elFlags, const UINT frame_length, const UCHAR numberOfChannels, const SCHAR epConfig, HANDLE_TRANSPORTDEC pTpDec) { AAC_DECODER_ERROR error = AAC_DEC_OK; const element_list_t *list; int i, ch, decision_bit; int crcReg1 = -1, crcReg2 = -1; int cplxPred; int ind_sw_cce_flag = 0, num_gain_element_lists = 0; FDK_ASSERT((numberOfChannels == 1) || (numberOfChannels == 2)); /* Get channel element sequence table */ list = getBitstreamElementList(aot, epConfig, numberOfChannels, 0, elFlags); if (list == NULL) { error = AAC_DEC_UNSUPPORTED_FORMAT; goto bail; } CTns_Reset(&pAacDecoderChannelInfo[0]->pDynData->TnsData); /* Set common window to 0 by default. If signalized in the bit stream it will * be overwritten later explicitely */ pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow = 0; if (flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) { pAacDecoderChannelInfo[0]->pDynData->specificTo.usac.tns_active = 0; pAacDecoderChannelInfo[0]->pDynData->specificTo.usac.tns_on_lr = 0; } if (numberOfChannels == 2) { CTns_Reset(&pAacDecoderChannelInfo[1]->pDynData->TnsData); pAacDecoderChannelInfo[1]->pDynData->RawDataInfo.CommonWindow = 0; } cplxPred = 0; if (pAacDecoderStaticChannelInfo != NULL) { if (elFlags & AC_EL_USAC_CP_POSSIBLE) { pAacDecoderChannelInfo[0]->pComData->jointStereoData.cplx_pred_flag = 0; cplxPred = 1; } } if (0 || (flags & (AC_ELD | AC_SCALABLE))) { pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow = 1; if (numberOfChannels == 2) { pAacDecoderChannelInfo[1]->pDynData->RawDataInfo.CommonWindow = pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow; } } /* Iterate through sequence table */ i = 0; ch = 0; decision_bit = 0; do { switch (list->id[i]) { case element_instance_tag: pAacDecoderChannelInfo[0]->ElementInstanceTag = FDKreadBits(hBs, 4); if (numberOfChannels == 2) { pAacDecoderChannelInfo[1]->ElementInstanceTag = pAacDecoderChannelInfo[0]->ElementInstanceTag; } break; case common_window: decision_bit = pAacDecoderChannelInfo[ch]->pDynData->RawDataInfo.CommonWindow = FDKreadBits(hBs, 1); if (numberOfChannels == 2) { pAacDecoderChannelInfo[1]->pDynData->RawDataInfo.CommonWindow = pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow; } break; case ics_info: /* store last window sequence (utilized in complex stereo prediction) * before reading new channel-info */ if (cplxPred) { if (pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow) { pAacDecoderStaticChannelInfo[0] ->pCpeStaticData->jointStereoPersistentData.winSeqPrev = pAacDecoderChannelInfo[0]->icsInfo.WindowSequence; pAacDecoderStaticChannelInfo[0] ->pCpeStaticData->jointStereoPersistentData.winShapePrev = pAacDecoderChannelInfo[0]->icsInfo.WindowShape; } } /* Read individual channel info */ error = IcsRead(hBs, &pAacDecoderChannelInfo[ch]->icsInfo, pSamplingRateInfo, flags); if (elFlags & AC_EL_LFE && GetWindowSequence(&pAacDecoderChannelInfo[ch]->icsInfo) != BLOCK_LONG) { error = AAC_DEC_PARSE_ERROR; break; } if (numberOfChannels == 2 && pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow) { pAacDecoderChannelInfo[1]->icsInfo = pAacDecoderChannelInfo[0]->icsInfo; } break; case common_max_sfb: if (FDKreadBit(hBs) == 0) { error = IcsReadMaxSfb(hBs, &pAacDecoderChannelInfo[1]->icsInfo, pSamplingRateInfo); } break; case ltp_data_present: if (FDKreadBits(hBs, 1) != 0) { error = AAC_DEC_UNSUPPORTED_PREDICTION; } break; case ms: INT max_sfb_ste; INT max_sfb_ste_clear; max_sfb_ste = GetScaleMaxFactorBandsTransmitted( &pAacDecoderChannelInfo[0]->icsInfo, &pAacDecoderChannelInfo[1]->icsInfo); max_sfb_ste_clear = 64; pAacDecoderChannelInfo[0]->icsInfo.max_sfb_ste = (UCHAR)max_sfb_ste; pAacDecoderChannelInfo[1]->icsInfo.max_sfb_ste = (UCHAR)max_sfb_ste; if (flags & (AC_USAC | AC_RSV603DA) && pAacDecoderChannelInfo[ch]->pDynData->RawDataInfo.CommonWindow == 0) { Clean_Complex_Prediction_coefficients( &pAacDecoderStaticChannelInfo[0] ->pCpeStaticData->jointStereoPersistentData, GetWindowGroups(&pAacDecoderChannelInfo[0]->icsInfo), 0, 64); } if (CJointStereo_Read( hBs, &pAacDecoderChannelInfo[0]->pComData->jointStereoData, GetWindowGroups(&pAacDecoderChannelInfo[0]->icsInfo), max_sfb_ste, max_sfb_ste_clear, /* jointStereoPersistentData and cplxPredictionData are only available/allocated if cplxPred is active. */ ((cplxPred == 0) || (pAacDecoderStaticChannelInfo == NULL)) ? NULL : &pAacDecoderStaticChannelInfo[0] ->pCpeStaticData->jointStereoPersistentData, ((cplxPred == 0) || (pAacDecoderChannelInfo[0] == NULL)) ? NULL : pAacDecoderChannelInfo[0] ->pComStaticData->cplxPredictionData, cplxPred, GetScaleFactorBandsTotal(&pAacDecoderChannelInfo[0]->icsInfo), GetWindowSequence(&pAacDecoderChannelInfo[0]->icsInfo), flags)) { error = AAC_DEC_PARSE_ERROR; } break; case global_gain: pAacDecoderChannelInfo[ch]->pDynData->RawDataInfo.GlobalGain = (UCHAR)FDKreadBits(hBs, 8); break; case section_data: error = CBlock_ReadSectionData(hBs, pAacDecoderChannelInfo[ch], pSamplingRateInfo, flags); break; case scale_factor_data_usac: pAacDecoderChannelInfo[ch]->currAliasingSymmetry = 0; /* Set active sfb codebook indexes to HCB_ESC to make them "active" */ CChannel_CodebookTableInit( pAacDecoderChannelInfo[ch]); /* equals ReadSectionData(self, bs) in float soft. block.c line: ~599 */ /* Note: The missing "break" is intentional here, since we need to call * CBlock_ReadScaleFactorData(). */ case scale_factor_data: if (flags & AC_ER_RVLC) { /* read RVLC data from bitstream (error sens. cat. 1) */ CRvlc_Read(pAacDecoderChannelInfo[ch], hBs); } else { error = CBlock_ReadScaleFactorData(pAacDecoderChannelInfo[ch], hBs, flags); } break; case pulse: if (CPulseData_Read( hBs, &pAacDecoderChannelInfo[ch]->pDynData->specificTo.aac.PulseData, pSamplingRateInfo->ScaleFactorBands_Long, /* pulse data is only allowed to be present in long blocks! */ (void *)&pAacDecoderChannelInfo[ch]->icsInfo, frame_length) != 0) { error = AAC_DEC_DECODE_FRAME_ERROR; } break; case tns_data_present: CTns_ReadDataPresentFlag( hBs, &pAacDecoderChannelInfo[ch]->pDynData->TnsData); if (elFlags & AC_EL_LFE && pAacDecoderChannelInfo[ch]->pDynData->TnsData.DataPresent) { error = AAC_DEC_PARSE_ERROR; } break; case tns_data: /* tns_data_present is checked inside CTns_Read(). */ error = CTns_Read(hBs, &pAacDecoderChannelInfo[ch]->pDynData->TnsData, &pAacDecoderChannelInfo[ch]->icsInfo, flags); break; case gain_control_data: break; case gain_control_data_present: if (FDKreadBits(hBs, 1)) { error = AAC_DEC_UNSUPPORTED_GAIN_CONTROL_DATA; } break; case tw_data: break; case common_tw: break; case tns_data_present_usac: if (pAacDecoderChannelInfo[0]->pDynData->specificTo.usac.tns_active) { CTns_ReadDataPresentUsac( hBs, &pAacDecoderChannelInfo[0]->pDynData->TnsData, &pAacDecoderChannelInfo[1]->pDynData->TnsData, &pAacDecoderChannelInfo[0]->pDynData->specificTo.usac.tns_on_lr, &pAacDecoderChannelInfo[0]->icsInfo, flags, elFlags, pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow); } else { pAacDecoderChannelInfo[0]->pDynData->specificTo.usac.tns_on_lr = (UCHAR)1; } break; case core_mode: decision_bit = FDKreadBits(hBs, 1); pAacDecoderChannelInfo[ch]->data.usac.core_mode = decision_bit; if ((ch == 1) && (pAacDecoderChannelInfo[0]->data.usac.core_mode != pAacDecoderChannelInfo[1]->data.usac.core_mode)) { /* StereoCoreToolInfo(core_mode[ch] ) */ pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow = 0; pAacDecoderChannelInfo[1]->pDynData->RawDataInfo.CommonWindow = 0; } break; case tns_active: pAacDecoderChannelInfo[0]->pDynData->specificTo.usac.tns_active = FDKreadBit(hBs); break; case noise: if (elFlags & AC_EL_USAC_NOISE) { pAacDecoderChannelInfo[ch] ->pDynData->specificTo.usac.fd_noise_level_and_offset = FDKreadBits(hBs, 3 + 5); /* Noise level */ } break; case lpd_channel_stream: { error = CLpdChannelStream_Read(/* = lpd_channel_stream() */ hBs, pAacDecoderChannelInfo[ch], pAacDecoderStaticChannelInfo[ch], pSamplingRateInfo, flags); } pAacDecoderChannelInfo[ch]->renderMode = AACDEC_RENDER_LPD; break; case fac_data: { int fFacDatPresent = FDKreadBit(hBs); /* Wee need a valid fac_data[0] even if no FAC data is present (as * temporal buffer) */ pAacDecoderChannelInfo[ch]->data.usac.fac_data[0] = pAacDecoderChannelInfo[ch]->data.usac.fac_data0; if (fFacDatPresent) { if (elFlags & AC_EL_LFE) { error = AAC_DEC_PARSE_ERROR; break; } /* FAC data present, this frame is FD, so the last mode had to be * ACELP. */ if (pAacDecoderStaticChannelInfo[ch]->last_core_mode != LPD || pAacDecoderStaticChannelInfo[ch]->last_lpd_mode != 0) { pAacDecoderChannelInfo[ch]->data.usac.core_mode_last = LPD; pAacDecoderChannelInfo[ch]->data.usac.lpd_mode_last = 0; /* We can't change the past! So look to the future and go ahead! */ } CLpd_FAC_Read(hBs, pAacDecoderChannelInfo[ch]->data.usac.fac_data[0], pAacDecoderChannelInfo[ch]->data.usac.fac_data_e, CLpd_FAC_getLength( IsLongBlock(&pAacDecoderChannelInfo[ch]->icsInfo), pAacDecoderChannelInfo[ch]->granuleLength), 1, 0); } else { if (pAacDecoderStaticChannelInfo[ch]->last_core_mode == LPD && pAacDecoderStaticChannelInfo[ch]->last_lpd_mode == 0) { /* ACELP to FD transitons without FAC are possible. That is why we zero it out (i.e FAC will not be considered in the subsequent calculations */ FDKmemclear(pAacDecoderChannelInfo[ch]->data.usac.fac_data0, LFAC * sizeof(FIXP_DBL)); } } } break; case esc2_rvlc: if (flags & AC_ER_RVLC) { CRvlc_Decode(pAacDecoderChannelInfo[ch], pAacDecoderStaticChannelInfo[ch], hBs); } break; case esc1_hcr: if (flags & AC_ER_HCR) { CHcr_Read(hBs, pAacDecoderChannelInfo[ch], numberOfChannels == 2 ? ID_CPE : ID_SCE); } break; case spectral_data: error = CBlock_ReadSpectralData(hBs, pAacDecoderChannelInfo[ch], pSamplingRateInfo, flags); if (flags & AC_ELD) { pAacDecoderChannelInfo[ch]->renderMode = AACDEC_RENDER_ELDFB; } else { if (flags & AC_HDAAC) { pAacDecoderChannelInfo[ch]->renderMode = AACDEC_RENDER_INTIMDCT; } else { pAacDecoderChannelInfo[ch]->renderMode = AACDEC_RENDER_IMDCT; } } break; case ac_spectral_data: error = CBlock_ReadAcSpectralData( hBs, pAacDecoderChannelInfo[ch], pAacDecoderStaticChannelInfo[ch], pSamplingRateInfo, frame_length, flags); pAacDecoderChannelInfo[ch]->renderMode = AACDEC_RENDER_IMDCT; break; case coupled_elements: { int num_coupled_elements, c; ind_sw_cce_flag = FDKreadBit(hBs); num_coupled_elements = FDKreadBits(hBs, 3); for (c = 0; c < (num_coupled_elements + 1); c++) { int cc_target_is_cpe; num_gain_element_lists++; cc_target_is_cpe = FDKreadBit(hBs); /* cc_target_is_cpe[c] */ FDKreadBits(hBs, 4); /* cc_target_tag_select[c] */ if (cc_target_is_cpe) { int cc_l, cc_r; cc_l = FDKreadBit(hBs); /* cc_l[c] */ cc_r = FDKreadBit(hBs); /* cc_r[c] */ if (cc_l && cc_r) { num_gain_element_lists++; } } } FDKreadBit(hBs); /* cc_domain */ FDKreadBit(hBs); /* gain_element_sign */ FDKreadBits(hBs, 2); /* gain_element_scale */ } break; case gain_element_lists: { const CodeBookDescription *hcb; UCHAR *pCodeBook; int c; hcb = &AACcodeBookDescriptionTable[BOOKSCL]; pCodeBook = pAacDecoderChannelInfo[ch]->pDynData->aCodeBook; for (c = 1; c < num_gain_element_lists; c++) { int cge; if (ind_sw_cce_flag) { cge = 1; } else { cge = FDKreadBits(hBs, 1); /* common_gain_element_present[c] */ } if (cge) { /* Huffman */ CBlock_DecodeHuffmanWord( hBs, hcb); /* hcod_sf[common_gain_element[c]] 1..19 */ } else { int g, sfb; for (g = 0; g < GetWindowGroups(&pAacDecoderChannelInfo[ch]->icsInfo); g++) { for (sfb = 0; sfb < GetScaleFactorBandsTransmitted( &pAacDecoderChannelInfo[ch]->icsInfo); sfb++) { if (pCodeBook[sfb] != ZERO_HCB) { /* Huffman */ CBlock_DecodeHuffmanWord( hBs, hcb); /* hcod_sf[dpcm_gain_element[c][g][sfb]] 1..19 */ } } } } } } break; /* CRC handling */ case adtscrc_start_reg1: if (pTpDec != NULL) { crcReg1 = transportDec_CrcStartReg(pTpDec, 192); } break; case adtscrc_start_reg2: if (pTpDec != NULL) { crcReg2 = transportDec_CrcStartReg(pTpDec, 128); } break; case adtscrc_end_reg1: case drmcrc_end_reg: if (pTpDec != NULL) { transportDec_CrcEndReg(pTpDec, crcReg1); crcReg1 = -1; } break; case adtscrc_end_reg2: if (crcReg1 != -1) { error = AAC_DEC_DECODE_FRAME_ERROR; } else if (pTpDec != NULL) { transportDec_CrcEndReg(pTpDec, crcReg2); crcReg2 = -1; } break; case drmcrc_start_reg: if (pTpDec != NULL) { crcReg1 = transportDec_CrcStartReg(pTpDec, 0); } break; /* Non data cases */ case next_channel: ch = (ch + 1) % numberOfChannels; break; case link_sequence: list = list->next[decision_bit]; i = -1; break; default: error = AAC_DEC_UNSUPPORTED_FORMAT; break; } if (error != AAC_DEC_OK) { goto bail; } i++; } while (list->id[i] != end_of_sequence); for (ch = 0; ch < numberOfChannels; ch++) { if (pAacDecoderChannelInfo[ch]->renderMode == AACDEC_RENDER_IMDCT || pAacDecoderChannelInfo[ch]->renderMode == AACDEC_RENDER_ELDFB) { /* Shows which bands are empty. */ UCHAR *band_is_noise = pAacDecoderChannelInfo[ch]->pDynData->band_is_noise; FDKmemset(band_is_noise, (UCHAR)1, sizeof(UCHAR) * (8 * 16)); error = CBlock_InverseQuantizeSpectralData( pAacDecoderChannelInfo[ch], pSamplingRateInfo, band_is_noise, 1); if (error != AAC_DEC_OK) { return error; } if (elFlags & AC_EL_USAC_NOISE) { CBlock_ApplyNoise(pAacDecoderChannelInfo[ch], pSamplingRateInfo, &pAacDecoderStaticChannelInfo[ch]->nfRandomSeed, band_is_noise); } /* if (elFlags & AC_EL_USAC_NOISE) */ } } bail: if (crcReg1 != -1 || crcReg2 != -1) { if (error == AAC_DEC_OK) { error = AAC_DEC_DECODE_FRAME_ERROR; } if (crcReg1 != -1) { transportDec_CrcEndReg(pTpDec, crcReg1); } if (crcReg2 != -1) { transportDec_CrcEndReg(pTpDec, crcReg2); } } return error; }
void FDKmemclear(void *memPtr, const UINT size) { FDKmemset(memPtr,0,size); }
/******************************************************************************* Functionname: subbandTPApply ******************************************************************************/ SACDEC_ERROR subbandTPApply(spatialDec *self, const SPATIAL_BS_FRAME *frame) { FIXP_DBL *qmfOutputRealDry[MAX_OUTPUT_CHANNELS]; FIXP_DBL *qmfOutputImagDry[MAX_OUTPUT_CHANNELS]; FIXP_DBL *qmfOutputRealWet[MAX_OUTPUT_CHANNELS]; FIXP_DBL *qmfOutputImagWet[MAX_OUTPUT_CHANNELS]; FIXP_DBL DryEner[MAX_INPUT_CHANNELS]; FIXP_DBL scale[MAX_OUTPUT_CHANNELS]; FIXP_DBL DryEnerLD64[MAX_INPUT_CHANNELS]; FIXP_DBL WetEnerLD64[MAX_OUTPUT_CHANNELS]; FIXP_DBL DryEner0 = FL2FXCONST_DBL(0.0f); FIXP_DBL WetEnerX, damp, tmp; FIXP_DBL dmxReal0, dmxImag0; int skipChannels[MAX_OUTPUT_CHANNELS]; int n, ch, cplxBands, cplxHybBands; int dry_scale_dmx, wet_scale_dmx; int i_LF, i_RF; HANDLE_STP_DEC hStpDec; const FIXP_CFG *pBP; int nrgScale = (2 * self->clipProtectGainSF__FDK); hStpDec = self->hStpDec; /* set scalefactor and loop counter */ FDK_ASSERT(SF_DRY >= 1); { cplxBands = BP_GF_SIZE; cplxHybBands = self->hybridBands; dry_scale_dmx = (2 * SF_DRY) - 2; wet_scale_dmx = 2; } /* setup pointer for forming the direct downmix signal */ for (ch = 0; ch < self->numOutputChannels; ch++) { qmfOutputRealDry[ch] = &self->hybOutputRealDry__FDK[ch][7]; qmfOutputRealWet[ch] = &self->hybOutputRealWet__FDK[ch][7]; qmfOutputImagDry[ch] = &self->hybOutputImagDry__FDK[ch][7]; qmfOutputImagWet[ch] = &self->hybOutputImagWet__FDK[ch][7]; } /* clear skipping flag for all output channels */ FDKmemset(skipChannels, 0, self->numOutputChannels * sizeof(int)); /* set scale values to zero */ FDKmemset(scale, 0, self->numOutputChannels * sizeof(FIXP_DBL)); /* update normalisation energy with latest smoothed energy */ if (hStpDec->update_old_ener == STP_UPDATE_ENERGY_RATE) { hStpDec->update_old_ener = 1; for (ch = 0; ch < self->numInputChannels; ch++) { hStpDec->oldDryEnerLD64[ch] = CalcLdData(hStpDec->runDryEner[ch] + ABS_THR__FDK); } for (ch = 0; ch < self->numOutputChannels; ch++) { hStpDec->oldWetEnerLD64[ch] = CalcLdData(hStpDec->runWetEner[ch] + ABS_THR2__FDK); } } else { hStpDec->update_old_ener++; } /* get channel configuration */ switch (self->treeConfig) { case TREE_212: i_LF = 0; i_RF = 1; break; default: return MPS_WRONG_TREECONFIG; } /* form the 'direct' downmix signal */ pBP = hStpDec->BP_GF - BP_GF_START; switch (self->treeConfig) { case TREE_212: for (n = BP_GF_START; n < cplxBands; n++) { dmxReal0 = qmfOutputRealDry[i_LF][n] + qmfOutputRealDry[i_RF][n]; dmxImag0 = qmfOutputImagDry[i_LF][n] + qmfOutputImagDry[i_RF][n]; DRY_ENER_SUM_CPLX(DryEner0, dmxReal0, dmxImag0, n); } DRY_ENER_WEIGHT(DryEner0); break; default:; } DryEner[0] = DryEner0; /* normalise the 'direct' signals */ for (ch = 0; ch < self->numInputChannels; ch++) { DryEner[ch] = DryEner[ch] << (nrgScale); hStpDec->runDryEner[ch] = fMult(STP_LPF_COEFF1__FDK, hStpDec->runDryEner[ch]) + fMult(ONE_MINUS_STP_LPF_COEFF1__FDK, DryEner[ch]); if (DryEner[ch] != FL2FXCONST_DBL(0.0f)) { DryEnerLD64[ch] = fixMax((CalcLdData(DryEner[ch]) - hStpDec->oldDryEnerLD64[ch]), FL2FXCONST_DBL(-0.484375f)); } else { DryEnerLD64[ch] = FL2FXCONST_DBL(-0.484375f); } } if (self->treeConfig == TREE_212) { for (; ch < MAX_INPUT_CHANNELS; ch++) { DryEnerLD64[ch] = FL2FXCONST_DBL(-0.484375f); } } /* normalise the 'diffuse' signals */ pBP = hStpDec->BP_GF - BP_GF_START; for (ch = 0; ch < self->numOutputChannels; ch++) { if (skipChannels[ch]) { continue; } WetEnerX = FL2FXCONST_DBL(0.0f); for (n = BP_GF_START; n < cplxBands; n++) { tmp = fPow2Div2(qmfOutputRealWet[ch][n] << SF_WET); tmp += fPow2Div2(qmfOutputImagWet[ch][n] << SF_WET); WetEnerX += fMultDiv2(tmp, pBP[n]); } WET_ENER_WEIGHT(WetEnerX); WetEnerX = WetEnerX << (nrgScale); hStpDec->runWetEner[ch] = fMult(STP_LPF_COEFF1__FDK, hStpDec->runWetEner[ch]) + fMult(ONE_MINUS_STP_LPF_COEFF1__FDK, WetEnerX); if (WetEnerX == FL2FXCONST_DBL(0.0f)) { WetEnerLD64[ch] = FL2FXCONST_DBL(-0.484375f); } else { WetEnerLD64[ch] = fixMax((CalcLdData(WetEnerX) - hStpDec->oldWetEnerLD64[ch]), FL2FXCONST_DBL(-0.484375f)); } } /* compute scale factor for the 'diffuse' signals */ switch (self->treeConfig) { case TREE_212: if (DryEner[0] != FL2FXCONST_DBL(0.0f)) { CALC_WET_SCALE(0, i_LF); CALC_WET_SCALE(0, i_RF); } break; default:; } damp = FL2FXCONST_DBL(0.1f / (1 << SF_SCALE)); for (ch = 0; ch < self->numOutputChannels; ch++) { /* damp the scaling factor */ scale[ch] = damp + fMult(FL2FXCONST_DBL(0.9f), scale[ch]); /* limiting the scale factor */ if (scale[ch] > STP_SCALE_LIMIT__FDK) { scale[ch] = STP_SCALE_LIMIT__FDK; } if (scale[ch] < ONE_DIV_STP_SCALE_LIMIT__FDK) { scale[ch] = ONE_DIV_STP_SCALE_LIMIT__FDK; } /* low pass filter the scaling factor */ scale[ch] = fMult(STP_LPF_COEFF2__FDK, scale[ch]) + fMult(ONE_MINUS_STP_LPF_COEFF2__FDK, hStpDec->prev_tp_scale[ch]); hStpDec->prev_tp_scale[ch] = scale[ch]; } /* combine 'direct' and scaled 'diffuse' signal */ FDK_ASSERT((HP_SIZE - 3 + 10 - 1) == PC_NUM_HYB_BANDS); const SCHAR *channlIndex = row2channelSTP[self->treeConfig]; for (ch = 0; ch < self->numOutputChannels; ch++) { int no_scaling; no_scaling = !frame->tempShapeEnableChannelSTP[channlIndex[ch]]; if (no_scaling) { combineSignalCplx( &self->hybOutputRealDry__FDK[ch][self->tp_hybBandBorder], &self->hybOutputImagDry__FDK[ch][self->tp_hybBandBorder], &self->hybOutputRealWet__FDK[ch][self->tp_hybBandBorder], &self->hybOutputImagWet__FDK[ch][self->tp_hybBandBorder], cplxHybBands - self->tp_hybBandBorder); } else { FIXP_DBL scaleX; scaleX = scale[ch]; pBP = hStpDec->BP - self->tp_hybBandBorder; /* Band[HP_SIZE-3+10-1] needs not to be processed in combineSignalCplxScale1(), because pB[HP_SIZE-3+10-1] would be 1.0 */ combineSignalCplxScale1( &self->hybOutputRealDry__FDK[ch][self->tp_hybBandBorder], &self->hybOutputImagDry__FDK[ch][self->tp_hybBandBorder], &self->hybOutputRealWet__FDK[ch][self->tp_hybBandBorder], &self->hybOutputImagWet__FDK[ch][self->tp_hybBandBorder], &pBP[self->tp_hybBandBorder], scaleX, (HP_SIZE - 3 + 10 - 1) - self->tp_hybBandBorder); { combineSignalCplxScale2( &self->hybOutputRealDry__FDK[ch][HP_SIZE - 3 + 10 - 1], &self->hybOutputImagDry__FDK[ch][HP_SIZE - 3 + 10 - 1], &self->hybOutputRealWet__FDK[ch][HP_SIZE - 3 + 10 - 1], &self->hybOutputImagWet__FDK[ch][HP_SIZE - 3 + 10 - 1], scaleX, cplxHybBands - (HP_SIZE - 3 + 10 - 1)); } } } return (SACDEC_ERROR)MPS_OK; ; }