diff --git a/apps/decoder.c b/apps/decoder.c index 270c644db6f9b481e464714d194cb1cb3886d8b4..3180647b1c85cbbbbcbb5310ee201043fa64d1c6 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -163,6 +163,9 @@ static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtf, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ObjectEditFileReader *objectEditFileReader, ISAR_SPLIT_REND_BITS_DATA *splitRendBits, IVAS_DEC_HANDLE *phIvasDec, int16_t *pcmBuf ); static ivas_error load_hrtf_from_file( IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtfBinary, IVAS_DEC_HANDLE hIvasDec, const IVAS_AUDIO_CONFIG OutputConfig, const int32_t output_Fs ); static void do_object_editing_fx( IVAS_EDITABLE_PARAMETERS *editableParameters, ObjectEditFileReader *objectEditFileReader ); +#ifdef FIX_FMSW_DEC_EXT +static ivas_error updateOnFormatSwitching( IVAS_DEC_HANDLE hIvasDec, IVAS_DEC_BS_FORMAT *pBsFormat, const char *outputWavFilename, MasaFileWriter **ppMasaWriter, IsmFileWriter *ismWriters[IVAS_MAX_NUM_OBJECTS], int16_t *pNumOutChannels, uint16_t *pNumObj, const bool delayCompensationEnabled ); +#endif /*------------------------------------------------------------------------------------------* @@ -203,7 +206,6 @@ int main( reset_mem( USE_BYTES ); #endif - splitRendBits.bits_buf = splitRendBitsBuf; /*------------------------------------------------------------------------------------------* @@ -453,7 +455,6 @@ int main( } } - /*-------------------------------------------------------------------* * Load renderer configuration from file *--------------------------------------------------------------------*/ @@ -538,6 +539,7 @@ int main( fprintf( stderr, "Failed to get directivity patterns for one or more of IDs: %d %d %d %d\n\n", arg.directivityPatternId[0], arg.directivityPatternId[1], arg.directivityPatternId[2], arg.directivityPatternId[3] ); goto cleanup; } + if ( ( error = RenderConfigReader_getDistanceAttenuation( renderConfigReader, renderConfig.distAtt_fx ) ) != IVAS_ERR_OK ) { fprintf( stderr, "Failed to get Distance Attenuation \n\n" ); @@ -608,6 +610,7 @@ int main( hLsCustomData.azimuth_fx[i] = (Word32) ( hLsCustomData.azimuth[i] * ( 1u << 22 ) ); hLsCustomData.elevation_fx[i] = (Word32) ( hLsCustomData.elevation[i] * ( 1u << 22 ) ); } + if ( ( error = IVAS_DEC_FeedCustomLsData( hIvasDec, hLsCustomData ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_DEC_FeedCustomLsData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); @@ -686,7 +689,6 @@ int main( goto cleanup; } - /*------------------------------------------------------------------------------------------* * Close files and deallocate resources *------------------------------------------------------------------------------------------*/ @@ -734,7 +736,6 @@ cleanup: print_wmops(); print_mem( NULL ); #endif - if ( !arg.quietModeEnabled ) { printf( "\n" ); @@ -2026,7 +2027,11 @@ static ivas_error decodeG192( int16_t isSplitRend, isSplitCoded; IVAS_RENDER_CONFIG_DATA renderConfig; RenderConfigReader *renderConfigReader = NULL; +#ifdef FIX_FMSW_DEC_EXT + bool restartNeeded = false; +#else bool restartNeeded; +#endif #ifdef VARIABLE_SPEED_DECODING if ( arg.tsmEnabled ) @@ -2117,6 +2122,7 @@ static ivas_error decodeG192( fprintf( stderr, "\nError getting render frame size in samples\n" ); return error; } + if ( ( error = IVAS_DEC_GetReferencesUpdateFrequency( hIvasDec, &vec_pos_len ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError getting render frame size in samples\n" ); @@ -2412,6 +2418,18 @@ static ivas_error decodeG192( } } +#ifdef FIX_FMSW_DEC_EXT + /* Output writing update in case of format switching and EXTERNAL output */ + if ( restartNeeded && arg.outputConfig == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + if ( ( error = updateOnFormatSwitching( hIvasDec, &bsFormat, arg.outputWavFilename, &masaWriter, ismWriters, &nOutChannels, &numObj, arg.delayCompensationEnabled ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in updateOnFormatSwitching(): %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } +#endif + /* Write current frame */ if ( decodedGoodFrame ) { @@ -2805,7 +2823,11 @@ static ivas_error decodeVoIP( int16_t i; IVAS_DEC_HANDLE hIvasDec = *phIvasDec; +#ifdef FIX_FMSW_DEC_EXT + bool restartNeeded = false; +#else bool restartNeeded; +#endif IVAS_RTP ivasRtp = { 0 }; IVAS_RTP srRtp = { 0 }; IVAS_RTP_SR_INFO srInfo = { true, false, 0, 20, IVAS_SR_TRANSPORT_LCLD }; @@ -3292,6 +3314,18 @@ static ivas_error decodeVoIP( } } +#ifdef FIX_FMSW_DEC_EXT + /* Output writing update in case of format switching and EXTERNAL output */ + if ( restartNeeded && arg.outputConfig == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + if ( ( error = updateOnFormatSwitching( hIvasDec, &bsFormat, arg.outputWavFilename, &masaWriter, ismWriters, &nOutChannels, &numObj, arg.delayCompensationEnabled ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in updateOnFormatSwitching(): %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } +#endif + /* Write current frame */ if ( !srRtp.hPack && decodedGoodFrame ) { @@ -3900,4 +3934,80 @@ static ivas_error load_hrtf_from_file( return IVAS_ERR_OK; } +#ifdef FIX_FMSW_DEC_EXT + +/*---------------------------------------------------------------------* + * updateOnFormatSwitching() + * + * In case of IVAS format switching and EXTERNAL output, + * update decoder wrt. output writing + *---------------------------------------------------------------------*/ + +static ivas_error updateOnFormatSwitching( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_BS_FORMAT *pBsFormat, /* o : format of currently decoded bitstream */ + const char *outputWavFilename, /* i : name of the output audio file */ + MasaFileWriter **ppMasaWriter, /* o : MasaFileWriter handle */ + IsmFileWriter *ismWriters[IVAS_MAX_NUM_OBJECTS], /* o : 1-4 ismWriters handles */ + int16_t *pNumOutChannels, /* o : number of output channels */ + uint16_t *pNumObj, /* o : number of ISM objects */ + const bool delayCompensationEnabled /* i : is delay compensation enabled */ +) +{ + ivas_error error; + + /* in case of EXT output, the number of output audio channels can change */ + if ( ( error = IVAS_DEC_GetNumOutputChannels( hIvasDec, pNumOutChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetNumOutputChannels, code: %d\n", error ); + return error; + } + + /* Get the format of currently decoded bitstream */ + if ( ( error = IVAS_DEC_GetFormat( hIvasDec, pBsFormat ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetFormat, code: %d\n", error ); + return error; + } + + *pNumObj = 0; + if ( *pBsFormat == IVAS_DEC_BS_OBJ || *pBsFormat == IVAS_DEC_BS_MASA_ISM || *pBsFormat == IVAS_DEC_BS_SBA_ISM ) + { + if ( ( error = IVAS_DEC_GetNumObjects( hIvasDec, pNumObj ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetNumObjects: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + return error; + } + + /* If outputting ISM/OMASA/OSBA, ensure the output metadata files are opened */ + for ( int16_t i = 0; i < *pNumObj; ++i ) + { + if ( ismWriters[i] == NULL ) + { + if ( ( error = IsmFileWriter_open( outputWavFilename, i, &ismWriters[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Error opening ISM decoded metadata file %s\n", IsmFileWriter_getFilePath( ismWriters[i] ) ); + return error; + } + } + } + } + + /* If outputting MASA, ensure the output file metadata is opened */ + if ( *pBsFormat == IVAS_DEC_BS_MASA || *pBsFormat == IVAS_DEC_BS_MASA_ISM ) + { + if ( ppMasaWriter != NULL ) + { + if ( ( error = MasaFileWriter_open( outputWavFilename, delayCompensationEnabled, ppMasaWriter ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Error opening MASA decoded metadata file %s\n", MasaFileWriter_getFilePath( *ppMasaWriter ) ); + return error; + } + } + } + + return IVAS_ERR_OK; +} +#endif + #undef WMC_TOOL_SKIP diff --git a/lib_com/options.h b/lib_com/options.h index a1b758cfc563aca2adef722e54399cc2355c02f1..95272a536476586c757eb0e7473cd5c4aecbc98e 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -106,6 +106,7 @@ #define FIX_BASOP_2599_TCA_OVERFLOW /* VA: issue 2599, Fix TCA overflow */ #define FIX_2588_MISSING_CONDITIONS /* VA: Proposed fix to 2588, addition of a condition in lsf_dec */ #define FIX_BASOP_2442_MASA2TC_TO_MONO_AND_AMBI /* Nokia: BASOP issue 2442: Increase accuracy of computations and add additional gain clamp for low energy decorrelated signal rendering. */ +#define FIX_FMSW_DEC_EXT /* float issue 1566: fix EXT output in format switching */ /* ##################### End NON-BE switches ########################### */