diff options
Diffstat (limited to 'fdk-aac/libDRCdec/src/FDK_drcDecLib.cpp')
| -rw-r--r-- | fdk-aac/libDRCdec/src/FDK_drcDecLib.cpp | 178 | 
1 files changed, 102 insertions, 76 deletions
| diff --git a/fdk-aac/libDRCdec/src/FDK_drcDecLib.cpp b/fdk-aac/libDRCdec/src/FDK_drcDecLib.cpp index b29b79d..4f8ebc7 100644 --- a/fdk-aac/libDRCdec/src/FDK_drcDecLib.cpp +++ b/fdk-aac/libDRCdec/src/FDK_drcDecLib.cpp @@ -1,7 +1,7 @@  /* -----------------------------------------------------------------------------  Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright  1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright  1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten  Forschung e.V. All rights reserved.   1.    INTRODUCTION @@ -173,13 +173,11 @@ static int isResetNeeded(HANDLE_DRC_DECODER hDrcDec,    return resetNeeded;  } -static DRC_DEC_ERROR startSelectionProcess(HANDLE_DRC_DECODER hDrcDec) { -  DRC_ERROR dErr = DE_OK; -  DRCDEC_SELECTION_PROCESS_RETURN sErr = DRCDEC_SELECTION_PROCESS_NO_ERROR; +static void startSelectionProcess(HANDLE_DRC_DECODER hDrcDec) {    int uniDrcConfigHasChanged = 0;    SEL_PROC_OUTPUT oldSelProcOutput = hDrcDec->selProcOutput; -  if (!hDrcDec->status) return DRC_DEC_NOT_READY; +  if (!hDrcDec->status) return;    if (hDrcDec->functionalRange & DRC_DEC_SELECTION) {      uniDrcConfigHasChanged = hDrcDec->uniDrcConfig.diff; @@ -189,10 +187,9 @@ static DRC_DEC_ERROR startSelectionProcess(HANDLE_DRC_DECODER hDrcDec) {         */        hDrcDec->selProcOutput.numSelectedDrcSets = 0; -      sErr = drcDec_SelectionProcess_Process( +      drcDec_SelectionProcess_Process(            hDrcDec->hSelectionProc, &(hDrcDec->uniDrcConfig),            &(hDrcDec->loudnessInfoSet), &(hDrcDec->selProcOutput)); -      if (sErr) return DRC_DEC_OK;        hDrcDec->selProcInputDiff = 0;        hDrcDec->uniDrcConfig.diff = 0; @@ -202,15 +199,12 @@ static DRC_DEC_ERROR startSelectionProcess(HANDLE_DRC_DECODER hDrcDec) {    if (hDrcDec->functionalRange & DRC_DEC_GAIN) {      if (isResetNeeded(hDrcDec, oldSelProcOutput) || uniDrcConfigHasChanged) { -      dErr = -          drcDec_GainDecoder_Config(hDrcDec->hGainDec, &(hDrcDec->uniDrcConfig), -                                    hDrcDec->selProcOutput.numSelectedDrcSets, -                                    hDrcDec->selProcOutput.selectedDrcSetIds, -                                    hDrcDec->selProcOutput.selectedDownmixIds); -      if (dErr) return DRC_DEC_OK; +      drcDec_GainDecoder_Config(hDrcDec->hGainDec, &(hDrcDec->uniDrcConfig), +                                hDrcDec->selProcOutput.numSelectedDrcSets, +                                hDrcDec->selProcOutput.selectedDrcSetIds, +                                hDrcDec->selProcOutput.selectedDownmixIds);      }    } -  return DRC_DEC_OK;  }  DRC_DEC_ERROR @@ -342,7 +336,13 @@ FDK_drcDec_Init(HANDLE_DRC_DECODER hDrcDec, const int frameSize,    }    if (hDrcDec->functionalRange & DRC_DEC_GAIN) { -    dErr = drcDec_GainDecoder_Init(hDrcDec->hGainDec, frameSize, sampleRate); +    dErr = drcDec_GainDecoder_SetParam(hDrcDec->hGainDec, GAIN_DEC_FRAME_SIZE, +                                       frameSize); +    if (dErr) return DRC_DEC_NOT_OK; +    dErr = drcDec_GainDecoder_SetParam(hDrcDec->hGainDec, GAIN_DEC_SAMPLE_RATE, +                                       sampleRate); +    if (dErr) return DRC_DEC_NOT_OK; +    dErr = drcDec_GainDecoder_Init(hDrcDec->hGainDec);      if (dErr) return DRC_DEC_NOT_OK;    } @@ -383,73 +383,99 @@ DRC_DEC_ERROR  FDK_drcDec_SetParam(HANDLE_DRC_DECODER hDrcDec,                      const DRC_DEC_USERPARAM requestType,                      const FIXP_DBL requestValue) { +  DRC_ERROR dErr = DE_OK;    DRCDEC_SELECTION_PROCESS_RETURN sErr = DRCDEC_SELECTION_PROCESS_NO_ERROR; +  int invalidParameter = 0;    if (hDrcDec == NULL) return DRC_DEC_NOT_OPENED; -  if (hDrcDec->functionalRange == DRC_DEC_GAIN) -    return DRC_DEC_NOT_OK; /* not supported for DRC_DEC_GAIN. All parameters are -                              handed over to selection process lib. */ +  if (hDrcDec->functionalRange & DRC_DEC_GAIN) { +    switch (requestType) { +      case DRC_DEC_SAMPLE_RATE: +        dErr = drcDec_GainDecoder_SetParam( +            hDrcDec->hGainDec, GAIN_DEC_SAMPLE_RATE, (int)requestValue); +        if (dErr) return DRC_DEC_PARAM_OUT_OF_RANGE; +        break; +      case DRC_DEC_FRAME_SIZE: +        dErr = drcDec_GainDecoder_SetParam( +            hDrcDec->hGainDec, GAIN_DEC_FRAME_SIZE, (int)requestValue); +        if (dErr) return DRC_DEC_PARAM_OUT_OF_RANGE; +        break; +      default: +        invalidParameter |= DRC_DEC_GAIN; +    } +  } -  switch (requestType) { -    case DRC_DEC_BOOST: -      sErr = drcDec_SelectionProcess_SetParam(hDrcDec->hSelectionProc, -                                              SEL_PROC_BOOST, requestValue, -                                              &(hDrcDec->selProcInputDiff)); -      if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; -      break; -    case DRC_DEC_COMPRESS: -      sErr = drcDec_SelectionProcess_SetParam(hDrcDec->hSelectionProc, -                                              SEL_PROC_COMPRESS, requestValue, -                                              &(hDrcDec->selProcInputDiff)); -      if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; -      break; -    case DRC_DEC_LOUDNESS_NORMALIZATION_ON: -      sErr = drcDec_SelectionProcess_SetParam( -          hDrcDec->hSelectionProc, SEL_PROC_LOUDNESS_NORMALIZATION_ON, -          requestValue, &(hDrcDec->selProcInputDiff)); -      if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; -      break; -    case DRC_DEC_TARGET_LOUDNESS: -      sErr = drcDec_SelectionProcess_SetParam( -          hDrcDec->hSelectionProc, SEL_PROC_TARGET_LOUDNESS, requestValue, -          &(hDrcDec->selProcInputDiff)); -      if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; -      break; -    case DRC_DEC_EFFECT_TYPE: -      sErr = drcDec_SelectionProcess_SetParam( -          hDrcDec->hSelectionProc, SEL_PROC_EFFECT_TYPE, requestValue, -          &(hDrcDec->selProcInputDiff)); -      if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; -      break; -    case DRC_DEC_DOWNMIX_ID: -      sErr = drcDec_SelectionProcess_SetParam(hDrcDec->hSelectionProc, -                                              SEL_PROC_DOWNMIX_ID, requestValue, -                                              &(hDrcDec->selProcInputDiff)); -      if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; -      break; -    case DRC_DEC_TARGET_CHANNEL_COUNT_REQUESTED: -      sErr = drcDec_SelectionProcess_SetParam( -          hDrcDec->hSelectionProc, SEL_PROC_TARGET_CHANNEL_COUNT, requestValue, -          &(hDrcDec->selProcInputDiff)); -      if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; -      break; -    case DRC_DEC_BASE_CHANNEL_COUNT: -      sErr = drcDec_SelectionProcess_SetParam( -          hDrcDec->hSelectionProc, SEL_PROC_BASE_CHANNEL_COUNT, requestValue, -          &(hDrcDec->selProcInputDiff)); -      if (sErr) return DRC_DEC_NOT_OK; -      break; -    case DRC_DEC_LOUDNESS_MEASUREMENT_METHOD: -      sErr = drcDec_SelectionProcess_SetParam( -          hDrcDec->hSelectionProc, SEL_PROC_LOUDNESS_MEASUREMENT_METHOD, -          requestValue, &(hDrcDec->selProcInputDiff)); -      if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; -      break; -    default: -      return DRC_DEC_INVALID_PARAM; +  if (hDrcDec->functionalRange & DRC_DEC_SELECTION) { +    switch (requestType) { +      case DRC_DEC_BOOST: +        sErr = drcDec_SelectionProcess_SetParam(hDrcDec->hSelectionProc, +                                                SEL_PROC_BOOST, requestValue, +                                                &(hDrcDec->selProcInputDiff)); +        if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; +        break; +      case DRC_DEC_COMPRESS: +        sErr = drcDec_SelectionProcess_SetParam(hDrcDec->hSelectionProc, +                                                SEL_PROC_COMPRESS, requestValue, +                                                &(hDrcDec->selProcInputDiff)); +        if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; +        break; +      case DRC_DEC_LOUDNESS_NORMALIZATION_ON: +        sErr = drcDec_SelectionProcess_SetParam( +            hDrcDec->hSelectionProc, SEL_PROC_LOUDNESS_NORMALIZATION_ON, +            requestValue, &(hDrcDec->selProcInputDiff)); +        if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; +        break; +      case DRC_DEC_TARGET_LOUDNESS: +        sErr = drcDec_SelectionProcess_SetParam( +            hDrcDec->hSelectionProc, SEL_PROC_TARGET_LOUDNESS, requestValue, +            &(hDrcDec->selProcInputDiff)); +        if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; +        break; +      case DRC_DEC_EFFECT_TYPE: +        sErr = drcDec_SelectionProcess_SetParam( +            hDrcDec->hSelectionProc, SEL_PROC_EFFECT_TYPE, requestValue, +            &(hDrcDec->selProcInputDiff)); +        if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; +        break; +      case DRC_DEC_DOWNMIX_ID: +        sErr = drcDec_SelectionProcess_SetParam( +            hDrcDec->hSelectionProc, SEL_PROC_DOWNMIX_ID, requestValue, +            &(hDrcDec->selProcInputDiff)); +        if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; +        break; +      case DRC_DEC_TARGET_CHANNEL_COUNT_REQUESTED: +        sErr = drcDec_SelectionProcess_SetParam( +            hDrcDec->hSelectionProc, SEL_PROC_TARGET_CHANNEL_COUNT, +            requestValue, &(hDrcDec->selProcInputDiff)); +        if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; +        break; +      case DRC_DEC_BASE_CHANNEL_COUNT: +        sErr = drcDec_SelectionProcess_SetParam( +            hDrcDec->hSelectionProc, SEL_PROC_BASE_CHANNEL_COUNT, requestValue, +            &(hDrcDec->selProcInputDiff)); +        if (sErr) return DRC_DEC_NOT_OK; +        break; +      case DRC_DEC_LOUDNESS_MEASUREMENT_METHOD: +        sErr = drcDec_SelectionProcess_SetParam( +            hDrcDec->hSelectionProc, SEL_PROC_LOUDNESS_MEASUREMENT_METHOD, +            requestValue, &(hDrcDec->selProcInputDiff)); +        if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; +        break; +      case DRC_DEC_ALBUM_MODE: +        sErr = drcDec_SelectionProcess_SetParam( +            hDrcDec->hSelectionProc, SEL_PROC_ALBUM_MODE, requestValue, +            &(hDrcDec->selProcInputDiff)); +        if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; +        break; +      default: +        invalidParameter |= DRC_DEC_SELECTION; +    }    } +  if (invalidParameter == hDrcDec->functionalRange) +    return DRC_DEC_INVALID_PARAM; +    /* All parameters need a new start of the selection process */    startSelectionProcess(hDrcDec); @@ -721,9 +747,9 @@ FDK_drcDec_ReadUniDrc(HANDLE_DRC_DECODER hDrcDec,        drcDec_GainDecoder_GetFrameSize(hDrcDec->hGainDec),        drcDec_GainDecoder_GetDeltaTminDefault(hDrcDec->hGainDec),        &(hDrcDec->uniDrcGain)); -  if (dErr) return DRC_DEC_NOT_OK;    startSelectionProcess(hDrcDec); +  if (dErr) return DRC_DEC_NOT_OK;    hDrcDec->status = DRC_DEC_NEW_GAIN_PAYLOAD; | 
