diff --git a/apps/decoder.c b/apps/decoder.c index 84281854b46b03432ed2aab0f54ae8b63359ef50..c72463750328c22582e0e174df2fc68e84710560 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -196,7 +196,11 @@ int main( RotFileReader *refRotReader = NULL; Vector3PairFileReader *referenceVectorReader = NULL; ivas_error error = IVAS_ERR_UNKNOWN; +#ifdef FIX_847_OUTPUT_PCM_BUFFER + int16_t *pcmBuf = NULL; +#else int16_t pcmBuf[MAX_OUTPUT_PCM_BUFFER_SIZE]; +#endif #ifdef SPLIT_REND_WITH_HEAD_ROT uint8_t splitRendBitsBuf[IVAS_MAX_SPLIT_REND_BITS_BUFFER_SIZE_IN_BYTES]; #endif @@ -743,6 +747,21 @@ int main( } } +#ifdef FIX_847_OUTPUT_PCM_BUFFER + /*------------------------------------------------------------------------------------------* + * Allocate output data buffer + *------------------------------------------------------------------------------------------*/ + + int16_t pcmBufSize; + if ( ( error = IVAS_DEC_GetOutputBufferSize( hIvasDec, &pcmBufSize ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nGetOutputBufferSize failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + pcmBuf = malloc( pcmBufSize * sizeof( int16_t ) ); + +#endif /*-----------------------------------------------------------------* * Decoding @@ -797,10 +816,14 @@ int main( cleanup: +#ifdef FIX_847_OUTPUT_PCM_BUFFER + free( pcmBuf ); +#endif + #ifdef DEBUG_SBA_AUDIO_DUMP IVAS_DEC_GetSbaDebugParams( hIvasDec, &numOutChannels, &numTransportChannels, &pca_ingest_channels ); -#endif +#endif if ( arg.hrtfReaderEnabled ) { IVAS_DEC_HRTF_HANDLE hHrtfTD = NULL; diff --git a/lib_com/ivas_error.h b/lib_com/ivas_error.h index d2e0260646ff62a3eda606c73a8c6ef1200a8b42..e905f9ef102049166e8399d43cd5fe4485a4c6ee 100644 --- a/lib_com/ivas_error.h +++ b/lib_com/ivas_error.h @@ -65,6 +65,9 @@ typedef enum IVAS_ERR_INVALID_FEC_CONFIG, IVAS_ERR_INVALID_FEC_OFFSET, IVAS_ERR_INVALID_INPUT_BUFFER_SIZE, +#ifdef FIX_847_OUTPUT_PCM_BUFFER + IVAS_ERR_INVALID_OUTPUT_BUFFER_SIZE, +#endif IVAS_ERR_DTX_NOT_SUPPORTED, IVAS_ERR_UNEXPECTED_NULL_POINTER, IVAS_ERR_METADATA_NOT_EXPECTED, @@ -217,6 +220,10 @@ static inline const char *ivas_error_to_string( ivas_error error_code ) return "Invalid FEC offset"; case IVAS_ERR_INVALID_INPUT_BUFFER_SIZE: return "Invalid input buffer size"; +#ifdef FIX_847_OUTPUT_PCM_BUFFER + case IVAS_ERR_INVALID_OUTPUT_BUFFER_SIZE: + return "Invalid output buffer size"; +#endif case IVAS_ERR_DTX_NOT_SUPPORTED: return "DTX is not supported in this IVAS format and element mode"; case IVAS_ERR_UNEXPECTED_NULL_POINTER: diff --git a/lib_com/options.h b/lib_com/options.h index a881f3ca596bb01675901b8c11de7ebb33ec51bc..f11b257869c06eb8dd023f6a659349302e6b8f38 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -161,6 +161,8 @@ #define FIX_818_DOUBLE_PREC_KERNEL_SW /* FhG: Issue 818: Avoid double precision in kernel switching */ #define FIX_822_REFACTOR_BIN_REVERB_OPEN /* Nokia: Addresses first step of issue 822 by refactoring ivas_binaural_reverb_open */ +#define FIX_847_OUTPUT_PCM_BUFFER /* VA: issue 847: Allocate decoder output PCM buffer dynamically */ + /* #################### End BE switches ################################## */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index cb72a48b5e6916094939d07987d9a6d51f1ec2ad..374c3e41895c3cd62d9ffac63e7522b3ad0bd78b 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1417,6 +1417,72 @@ ivas_error IVAS_DEC_GetFormat( } +#ifdef FIX_847_OUTPUT_PCM_BUFFER +/*---------------------------------------------------------------------* + * getInputBufferSize() + * + * + *---------------------------------------------------------------------*/ + +static int16_t getOutputBufferSize( + const Decoder_Struct *st_ivas /* i : IVAS decoder handle */ +) +{ + if ( st_ivas->hDecoderConfig == NULL ) + { + return -1; + } + + if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + return (int16_t) ( st_ivas->hDecoderConfig->output_Fs * ( IVAS_MAX_OUTPUT_CHANNELS + IVAS_MAX_NUM_OBJECTS ) / FRAMES_PER_SEC ); + } + else if ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_LS_CUSTOM ) + { + if ( st_ivas->hLsSetupCustom == NULL ) + { + return -1; + } + + return (int16_t) ( st_ivas->hDecoderConfig->output_Fs * ( st_ivas->hLsSetupCustom->num_spk + st_ivas->hLsSetupCustom->num_lfe ) / FRAMES_PER_SEC ); + } + else + { + return (int16_t) ( st_ivas->hDecoderConfig->output_Fs * st_ivas->hDecoderConfig->nchan_out / FRAMES_PER_SEC ); + } +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetOutputBufferSize() + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetOutputBufferSize( + const IVAS_DEC_HANDLE hIvasDec, /* i : IVAS decoder handle */ + int16_t *outputBufferSize /* o : total number of samples expected in the output buffer for current decoder configuration */ +) +{ + if ( outputBufferSize == NULL || hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + *outputBufferSize = getOutputBufferSize( hIvasDec->st_ivas ); + + if ( *outputBufferSize == -1 ) + { + return IVAS_ERR_INVALID_OUTPUT_BUFFER_SIZE; + } + else + { + return IVAS_ERR_OK; + } +} +#endif + + /*---------------------------------------------------------------------* * IVAS_DEC_GetNumOutputChannels( ) * diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 5367fa9b58ee20bb5d4fbca17014d2fa75dc40e3..181b8f665687cd66c71ec789de72f849a08675a4 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -358,6 +358,14 @@ ivas_error IVAS_DEC_GetFormat( IVAS_DEC_BS_FORMAT *format /* o : format detected from bitstream fed to the decoder */ ); +#ifdef FIX_847_OUTPUT_PCM_BUFFER +/*! r: error code */ +ivas_error IVAS_DEC_GetOutputBufferSize( + const IVAS_DEC_HANDLE hIvasDec, /* i : IVAS decoder handle */ + int16_t *outputBufferSize /* o : total number of samples expected in the output buffer for current decoder configuration */ +); +#endif + /*! r: error code */ ivas_error IVAS_DEC_GetNumOutputChannels( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */