Commit e60b504c authored by vaclav's avatar vaclav
Browse files

FIX_FMSW_DEC_EXT

parent c8f62466
Loading
Loading
Loading
Loading
Loading
+99 −1
Original line number Diff line number Diff line
@@ -188,6 +188,9 @@ static int16_t app_own_random( int16_t *seed );
#endif
static void do_object_editing( IVAS_EDITABLE_PARAMETERS *editableParameters, ObjectEditFileReader *objectEditFileReader );
static ivas_error restartDecoder( IVAS_DEC_HANDLE *phIvasDec, const IVAS_DEC_MODE decMode, DecArguments *arg, IVAS_RENDER_CONFIG_DATA *renderConfig, IVAS_CUSTOM_LS_DATA *hLsCustomData );
#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


/*------------------------------------------------------------------------------------------*
@@ -3256,7 +3259,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 };
@@ -3762,6 +3769,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 )
        {
@@ -4365,6 +4384,85 @@ static ivas_error load_hrtf_from_file(
}


#ifdef FIX_FMSW_DEC_EXT
/*---------------------------------------------------------------------*
 * restartDecoder()
 *
 * Update decoder in case of IVAS format switching and EXTERNAL output
 *---------------------------------------------------------------------*/

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;

    if ( hIvasDec == NULL )
    {
        return IVAS_ERR_UNEXPECTED_NULL_POINTER;
    }

    /* 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

/*---------------------------------------------------------------------*
 * restartDecoder()
 *
+1 −0
Original line number Diff line number Diff line
@@ -178,6 +178,7 @@
#define FIX_1540_EXPOSE_PT_IN_RTP_HEADER_API            /* Expose Payload Type setting in RTP Header */
#define FIX_1563_FIX_STEREO_SW                          /* VA: float issue 1563: fix clicks in stereo switching */
#define FIX_1562_DTX_CRASH_DECODER                      /* VA: float issue 1562: fix crash in stereo decoding in DTX and bitrate switching */
#define FIX_FMSW_DEC_EXT                                /* float issue 1566: fix EXT output in format switching */

/* ##################### End NON-BE switches ########################### */