diff options
Diffstat (limited to 'libSBRdec')
-rw-r--r-- | libSBRdec/src/sbr_dec.cpp | 18 | ||||
-rw-r--r-- | libSBRdec/src/sbrdec_drc.cpp | 37 | ||||
-rw-r--r-- | libSBRdec/src/sbrdec_drc.h | 1 | ||||
-rw-r--r-- | libSBRdec/src/sbrdecoder.cpp | 19 |
4 files changed, 53 insertions, 22 deletions
diff --git a/libSBRdec/src/sbr_dec.cpp b/libSBRdec/src/sbr_dec.cpp index 5a8b320..bd3cd10 100644 --- a/libSBRdec/src/sbr_dec.cpp +++ b/libSBRdec/src/sbr_dec.cpp @@ -585,14 +585,16 @@ sbr_dec ( HANDLE_SBR_DEC hSbrDec, /*!< handle to Decoder channel */ int maxShift = 0; - if (hSbrDec->sbrDrcChannel.prevFact_exp > maxShift) { - maxShift = hSbrDec->sbrDrcChannel.prevFact_exp; - } - if (hSbrDec->sbrDrcChannel.currFact_exp > maxShift) { - maxShift = hSbrDec->sbrDrcChannel.currFact_exp; - } - if (hSbrDec->sbrDrcChannel.nextFact_exp > maxShift) { - maxShift = hSbrDec->sbrDrcChannel.nextFact_exp; + if (hSbrDec->sbrDrcChannel.enable != 0) { + if (hSbrDec->sbrDrcChannel.prevFact_exp > maxShift) { + maxShift = hSbrDec->sbrDrcChannel.prevFact_exp; + } + if (hSbrDec->sbrDrcChannel.currFact_exp > maxShift) { + maxShift = hSbrDec->sbrDrcChannel.currFact_exp; + } + if (hSbrDec->sbrDrcChannel.nextFact_exp > maxShift) { + maxShift = hSbrDec->sbrDrcChannel.nextFact_exp; + } } /* copy DRC data to right channel (with PS both channels use the same DRC gains) */ diff --git a/libSBRdec/src/sbrdec_drc.cpp b/libSBRdec/src/sbrdec_drc.cpp index ce5247a..7497b66 100644 --- a/libSBRdec/src/sbrdec_drc.cpp +++ b/libSBRdec/src/sbrdec_drc.cpp @@ -115,17 +115,17 @@ void sbrDecoder_drcInitChannel ( } for (band = 0; band < (64); band++) { - hDrcData->prevFact_mag[band] = (FIXP_DBL)MAXVAL_DBL /*FL2FXCONST_DBL(1.0f)*/; + hDrcData->prevFact_mag[band] = FL2FXCONST_DBL(0.5f); } for (band = 0; band < SBRDEC_MAX_DRC_BANDS; band++) { - hDrcData->currFact_mag[band] = (FIXP_DBL)MAXVAL_DBL /*FL2FXCONST_DBL(1.0f)*/; - hDrcData->nextFact_mag[band] = (FIXP_DBL)MAXVAL_DBL /*FL2FXCONST_DBL(1.0f)*/; + hDrcData->currFact_mag[band] = FL2FXCONST_DBL(0.5f); + hDrcData->nextFact_mag[band] = FL2FXCONST_DBL(0.5f); } - hDrcData->prevFact_exp = 0; - hDrcData->currFact_exp = 0; - hDrcData->nextFact_exp = 0; + hDrcData->prevFact_exp = 1; + hDrcData->currFact_exp = 1; + hDrcData->nextFact_exp = 1; hDrcData->numBandsCurr = 0; hDrcData->numBandsNext = 0; @@ -238,7 +238,7 @@ void sbrDecoder_drcApplySlot ( } else { if (j >= offset[hDrcData->drcInterpolationSchemeCurr - 1]) { - alphaValue = FL2FXCONST_DBL(1.0f); + alphaValue = (FIXP_DBL)MAXVAL_DBL; } } } @@ -262,7 +262,7 @@ void sbrDecoder_drcApplySlot ( } else { if (j >= offset[hDrcData->drcInterpolationSchemeNext - 1]) { - alphaValue = FL2FXCONST_DBL(1.0f); + alphaValue = (FIXP_DBL)MAXVAL_DBL; } } @@ -301,7 +301,7 @@ void sbrDecoder_drcApplySlot ( } else { if (j >= offset[hDrcData->drcInterpolationSchemeNext - 1]) { - alphaValue = FL2FXCONST_DBL(1.0f); + alphaValue = (FIXP_DBL)MAXVAL_DBL; } } } @@ -322,7 +322,7 @@ void sbrDecoder_drcApplySlot ( for (band = 0; band < (int)numBands; band++) { int bottomQmf, topQmf; - FIXP_DBL drcFact_mag = FL2FXCONST_DBL(1.0f); + FIXP_DBL drcFact_mag = (FIXP_DBL)MAXVAL_DBL; topMdct = (bandTop[band]+1) << 2; @@ -361,7 +361,13 @@ void sbrDecoder_drcApplySlot ( } /* interpolate */ - drcFact_mag = fMult(alphaValue, drcFact2_mag) + fMult((FL2FXCONST_DBL(1.0f) - alphaValue), drcFact1_mag); + if (alphaValue == (FIXP_DBL)0) { + drcFact_mag = drcFact1_mag; + } else if (alphaValue == (FIXP_DBL)MAXVAL_DBL) { + drcFact_mag = drcFact2_mag; + } else { + drcFact_mag = fMult(alphaValue, drcFact2_mag) + fMult(((FIXP_DBL)MAXVAL_DBL - alphaValue), drcFact1_mag); + } /* apply scaling */ qmfRealSlot[bin] = fMult(qmfRealSlot[bin], drcFact_mag); @@ -481,6 +487,15 @@ void sbrDecoder_drcApply ( int col; int maxShift = 0; + if (hDrcData == NULL) { + return; + } + if ( (hDrcData->enable == 0) + || ((hDrcData->numBandsCurr == 0) && (hDrcData->numBandsNext == 0)) + ) { + return; /* Avoid changing the scaleFactor even though the processing is disabled. */ + } + /* get max scale factor */ if (hDrcData->prevFact_exp > maxShift) { maxShift = hDrcData->prevFact_exp; diff --git a/libSBRdec/src/sbrdec_drc.h b/libSBRdec/src/sbrdec_drc.h index 2577e89..14deff7 100644 --- a/libSBRdec/src/sbrdec_drc.h +++ b/libSBRdec/src/sbrdec_drc.h @@ -94,6 +94,7 @@ amm-info@iis.fraunhofer.de #include "sbrdecoder.h" + #define SBRDEC_MAX_DRC_CHANNELS (6) #define SBRDEC_MAX_DRC_BANDS ( 16 ) diff --git a/libSBRdec/src/sbrdecoder.cpp b/libSBRdec/src/sbrdecoder.cpp index a40e5ba..192bdd2 100644 --- a/libSBRdec/src/sbrdecoder.cpp +++ b/libSBRdec/src/sbrdecoder.cpp @@ -137,7 +137,7 @@ amm-info@iis.fraunhofer.de /* Decoder library info */ #define SBRDECODER_LIB_VL0 2 #define SBRDECODER_LIB_VL1 1 -#define SBRDECODER_LIB_VL2 2 +#define SBRDECODER_LIB_VL2 3 #define SBRDECODER_LIB_TITLE "SBR Decoder" #define SBRDECODER_LIB_BUILD_DATE __DATE__ #define SBRDECODER_LIB_BUILD_TIME __TIME__ @@ -533,7 +533,7 @@ SBR_ERROR sbrDecoder_InitElement ( FDKmemclear(self->pSbrElement[elementIndex]->frameErrorFlag, ((1)+1)*sizeof(UCHAR)); /* Initialize this instance */ - sbrError = sbrDecoder_ResetElement( + sbrError = sbrDecoder_ResetElement( self, sampleRateIn, sampleRateOut, @@ -577,7 +577,7 @@ SBR_ERROR sbrDecoder_HeaderUpdate( ) { SBR_ERROR errorStatus = SBRDEC_OK; - + /* change of control data, reset decoder */ @@ -818,6 +818,7 @@ SBR_ERROR sbrDecoder_drcFeedChannel ( HANDLE_SBRDECODER self, USHORT *pBandTop ) { SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL; + int band, isValidData = 0; if (self == NULL) { return SBRDEC_NOT_INITIALIZED; @@ -826,10 +827,21 @@ SBR_ERROR sbrDecoder_drcFeedChannel ( HANDLE_SBRDECODER self, return SBRDEC_SET_PARAM_FAIL; } + /* Search for gain values different to 1.0f */ + for (band = 0; band < numBands; band += 1) { + if ( !((pNextFact_mag[band] == FL2FXCONST_DBL(0.5)) && (nextFact_exp == 1)) + && !((pNextFact_mag[band] == (FIXP_DBL)MAXVAL_DBL) && (nextFact_exp == 0)) ) { + isValidData = 1; + break; + } + } + /* Find the right SBR channel */ pSbrDrcChannelData = sbrDecoder_drcGetChannel( self, ch ); if ( pSbrDrcChannelData != NULL ) { + if ( pSbrDrcChannelData->enable || isValidData ) + { /* Activate processing only with real and valid data */ int i; pSbrDrcChannelData->enable = 1; @@ -844,6 +856,7 @@ SBR_ERROR sbrDecoder_drcFeedChannel ( HANDLE_SBRDECODER self, pSbrDrcChannelData->nextFact_mag[i] = pNextFact_mag[i]; } } + } return SBRDEC_OK; } |