Commit 9f8fb15f authored by sagnowski's avatar sagnowski
Browse files

[WIP] Port split rendering support in VoIP mode

parent db0cb169
Loading
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -138,6 +138,7 @@
    </Lib>
  </ItemDefinitionGroup>
  <ItemGroup>
    <ClCompile Include="..\lib_rend\ivas_cldfb_ring_buffer.c" />
    <ClCompile Include="..\lib_rend\ivas_dirac_decorr_dec_fx.c" />
    <ClCompile Include="..\lib_rend\ivas_dirac_dec_binaural_functions_fx.c" />
    <ClCompile Include="..\lib_rend\ivas_dirac_onsets_dec_fx.c" />
+3 −0
Original line number Diff line number Diff line
@@ -109,6 +109,9 @@
    <ClCompile Include="..\lib_rend\ivas_td_decorr_fx.c">
      <Filter>rend_c</Filter>
    </ClCompile>
    <ClCompile Include="..\lib_rend\ivas_cldfb_ring_buffer.c">
      <Filter>rend_c</Filter>
    </ClCompile>
    <ClCompile Include="..\lib_rend\ivas_vbap_fx.c">
      <Filter>rend_c</Filter>
    </ClCompile>
+120 −9
Original line number Diff line number Diff line
@@ -163,7 +163,11 @@ static bool parseCmdlIVAS_dec( int16_t argc, char **argv, DecArguments *arg );
static void usage_dec( void );
#ifdef FIX_1217_OBJECT_EDIT_FILE_INTERFACE
static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtfBinary, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ObjectEditFileReader *objectEditFileReader, ISAR_SPLIT_REND_BITS_DATA *splitRendBits, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf );
#ifdef FIX_1119_SPLIT_RENDERING_VOIP
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 hIvasDec, int16_t *pcmBuf );
#else
static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtfBinary, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ObjectEditFileReader *objectEditFileReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf );
#endif
#else
static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtfBinary, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ISAR_SPLIT_REND_BITS_DATA *splitRendBits, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf );
static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtfBinary, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf );
@@ -655,7 +659,11 @@ int main(
    if ( arg.voipMode )
    {
#ifdef FIX_1217_OBJECT_EDIT_FILE_INTERFACE
#ifdef FIX_1119_SPLIT_RENDERING_VOIP
        error = decodeVoIP( arg, hBsReader, &hHrtfBinary, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, objectEditFileReader, &splitRendBits, hIvasDec, pcmBuf );
#else
        error = decodeVoIP( arg, hBsReader, &hHrtfBinary, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, objectEditFileReader, hIvasDec, pcmBuf );
#endif
#else
        error = decodeVoIP( arg, hBsReader, &hHrtfBinary, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, hIvasDec, pcmBuf );
#endif
@@ -1755,7 +1763,11 @@ static ivas_error initOnFirstGoodFrame(

    for ( int16_t i = 0; i < numInitialBadFrames; ++i )
    {
#ifdef FIX_1119_SPLIT_RENDERING_VOIP
        if ( isSplitRend )
#else
        if ( *splitRendWriter != NULL )
#endif
        {
            ISAR_SPLIT_REND_BITS_DATA splitRendBitsZero;
            splitRendBitsZero.bits_buf = NULL;
@@ -1773,7 +1785,12 @@ static ivas_error initOnFirstGoodFrame(
                return error;
            }
        }

#ifdef FIX_1119_SPLIT_RENDERING_VOIP
        if ( !isSplitCoded )
#else
        else
#endif
        {
            if ( *pRemainingDelayNumSamples < *numOutSamples )
            {
@@ -1984,6 +2001,14 @@ static ivas_error decodeG192(
        return error;
    }

#ifdef FIX_1119_SPLIT_RENDERING_VOIP
    if ( !isSplitRend )
    {
        /* Ensure split rendering output struct is not used when not outputting to a split rendering output configuration */
        splitRendBits = NULL;
    }
#endif

    if ( ( error = IVAS_DEC_is_split_rendering_coded_out( hIvasDec, &isSplitCoded ) ) != IVAS_ERR_OK )
    {
        fprintf( stderr, "\nError in IVAS_DEC_is_split_rendering_coded_out, code: %d\n", error );
@@ -2245,7 +2270,11 @@ static ivas_error decodeG192(
                }

                /* decode transport channels, do TSM and feed to renderer */
#ifdef FIX_1119_SPLIT_RENDERING_VOIP
                if ( ( error = IVAS_DEC_GetSamplesDecoder( hIvasDec, splitRendBits ) ) != IVAS_ERR_OK )
#else
                if ( ( error = IVAS_DEC_GetSamplesDecoder( hIvasDec, isSplitRend, splitRendBits ) ) != IVAS_ERR_OK )
#endif
                {
                    return error;
                }
@@ -2700,6 +2729,9 @@ static ivas_error decodeVoIP(
    Vector3PairFileReader *referenceVectorReader,
#ifdef FIX_1217_OBJECT_EDIT_FILE_INTERFACE
    ObjectEditFileReader *objectEditFileReader,
#endif
#ifdef FIX_1119_SPLIT_RENDERING_VOIP
    ISAR_SPLIT_REND_BITS_DATA *splitRendBits,
#endif
    IVAS_DEC_HANDLE hIvasDec,
    int16_t *pcmBuf )
@@ -2750,6 +2782,29 @@ static ivas_error decodeVoIP(
    bool parametersAvailableForEditing = false;
    uint16_t nSamplesRendered;

#ifdef FIX_1119_SPLIT_RENDERING_VOIP
    SplitFileReadWrite *splitRendWriter = NULL;
    int16_t isSplitRend, isSplitCoded;

    if ( ( error = IVAS_DEC_is_split_rendering_enabled( hIvasDec, &isSplitRend ) ) != IVAS_ERR_OK )
    {
        fprintf( stderr, "\nError in IVAS_DEC_is_split_rendering_enabled, code: %d\n", error );
        return error;
    }

    if ( !isSplitRend )
    {
        /* Ensure split rendering output struct is not used when not outputting to a split rendering format */
        splitRendBits = NULL;
    }

    if ( ( error = IVAS_DEC_is_split_rendering_coded_out( hIvasDec, &isSplitCoded ) ) != IVAS_ERR_OK )
    {
        fprintf( stderr, "\nError in IVAS_DEC_is_split_rendering_coded_out, code: %d\n", error );
        return error;
    }
#endif

    vec_pos_update = 0;
    if ( ( error = IVAS_DEC_GetRenderFramesizeMs( hIvasDec, &systemTimeInc_ms ) ) != IVAS_ERR_OK )
    {
@@ -3047,6 +3102,22 @@ static ivas_error decodeVoIP(
        /* decode and get samples */
        while ( nSamplesRendered < nOutSamples )
        {
#ifdef FIX_1119_SPLIT_RENDERING_VOIP
            if ( isSplitRend )
            {
#ifdef SUPPORT_JBM_TRACEFILE
                if ( ( error = IVAS_DEC_VoIP_GetSplitBinauralBitstream( hIvasDec, (void *) pcmBuf, splitRendBits, writeJbmTraceFileFrameWrapper, jbmTraceWriter, &bitstreamReadDone, &nSamplesRendered, &parametersAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK )
#else
                if ( ( error = IVAS_DEC_VoIP_GetSplitBinauralBitstream( hIvasDec, (void *) pcmBuf, splitRendBits, &bitstreamReadDone, &nSamplesRendered, &parametersAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK )
#endif
                {
                    fprintf( stderr, "\nError in IVAS_DEC_VoIP_GetSplitBinauralBitstream: %s\n", IVAS_DEC_GetErrorMessage( error ) );
                    goto cleanup;
                }
            }
            else
            {
#endif
#ifdef SUPPORT_JBM_TRACEFILE
            if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, (void *) pcmBuf, writeJbmTraceFileFrameWrapper, jbmTraceWriter, &bitstreamReadDone, &nSamplesRendered, &parametersAvailableForEditing, systemTime_ms ) ) != IVAS_ERR_OK )
#else
@@ -3056,6 +3127,9 @@ static ivas_error decodeVoIP(
                fprintf( stderr, "\nError in IVAS_DEC_VoIP_GetSamples: %s\n", IVAS_DEC_GetErrorMessage( error ) );
                goto cleanup;
            }
#ifdef FIX_1119_SPLIT_RENDERING_VOIP
            }
#endif

            if ( bitstreamReadDone == true )
            {
@@ -3143,9 +3217,15 @@ static ivas_error decodeVoIP(
            /* Once good frame decoded, catch up */
            if ( decodedGoodFrame )
            {
#ifndef FIX_1119_SPLIT_RENDERING_VOIP
                SplitFileReadWrite *splitRendWriter = NULL;

#endif
#ifdef FIX_1119_SPLIT_RENDERING_VOIP
                if ( ( error = initOnFirstGoodFrame( hIvasDec, arg, numInitialBadFrames, &nOutSamples, &vec_pos_len, delayNumSamples_orig, &delayNumSamples, &delayTimeScale,
#else
                if ( ( error = initOnFirstGoodFrame( hIvasDec, arg, numInitialBadFrames, &nOutSamples, NULL, delayNumSamples_orig, &delayNumSamples, &delayTimeScale,
#endif
                                                     &bsFormat, &afWriter, &masaWriter, ismWriters, &nOutChannels, &numObj, &splitRendWriter ) ) != IVAS_ERR_OK )
                {
                    goto cleanup;
@@ -3160,6 +3240,19 @@ static ivas_error decodeVoIP(
        /* Write current frame */
        if ( decodedGoodFrame )
        {
#ifdef FIX_1119_SPLIT_RENDERING_VOIP
            if ( isSplitRend )
            {
                if ( split_rend_write_bitstream_to_file( splitRendWriter, splitRendBits->bits_buf, &splitRendBits->bits_read, &splitRendBits->bits_written ) != IVAS_ERR_OK )
                {
                    fprintf( stderr, "\nUnable to write to bitstream file!\n" );
                    goto cleanup;
                }
            }

            if ( !isSplitCoded )
            {
#endif
                if ( delayNumSamples < nOutSamples )
                {
                    if ( ( error = AudioFileWriter_write( afWriter, &pcmBuf[delayNumSamples * nOutChannels], nOutSamples * nOutChannels - ( delayNumSamples * nOutChannels ) ) ) != IVAS_ERR_OK )
@@ -3173,6 +3266,9 @@ static ivas_error decodeVoIP(
                {
                    delayNumSamples -= nOutSamples;
                }
#ifdef FIX_1119_SPLIT_RENDERING_VOIP
            }
#endif

            /* Write ISM metadata to external file(s) */
            if ( decodedGoodFrame && arg.outputConfig == IVAS_AUDIO_CONFIG_EXTERNAL )
@@ -3272,7 +3368,11 @@ static ivas_error decodeVoIP(
        goto cleanup;
    }

#ifdef FIX_1119_SPLIT_RENDERING_VOIP
    if ( nSamplesFlushed && !isSplitCoded )
#else
    if ( nSamplesFlushed )
#endif
    {
        /* Write current frame */
        if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, nSamplesFlushed * nOutChannels ) ) != IVAS_ERR_OK )
@@ -3343,11 +3443,19 @@ static ivas_error decodeVoIP(
     *------------------------------------------------------------------------------------------*/

    memset( pcmBuf, 0, delayNumSamples_orig[0] * nOutChannels * sizeof( int16_t ) );

#ifdef FIX_1119_SPLIT_RENDERING_VOIP
    if ( afWriter != NULL )
    {
#endif
        if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig[0] * nOutChannels ) ) != IVAS_ERR_OK )
        {
            fprintf( stderr, "\nError writing output file: %s\n", ivas_error_to_string( error ) );
            goto cleanup;
        }
#ifdef FIX_1119_SPLIT_RENDERING_VOIP
    }
#endif

    /*------------------------------------------------------------------------------------------*
     * Printouts after decoding has finished
@@ -3392,6 +3500,9 @@ cleanup:

    EVS_RTPDUMP_DEPACKER_close( &rtpdumpDepacker );
    AudioFileWriter_close( &afWriter );
#ifdef FIX_1119_SPLIT_RENDERING_VOIP
    split_rend_reader_writer_close( &splitRendWriter );
#endif
    JbmOffsetFileWriter_close( &jbmOffsetWriter );
#ifdef SUPPORT_JBM_TRACEFILE
    JbmTraceFileWriter_close( &jbmTraceWriter );
+13 −0
Original line number Diff line number Diff line
@@ -1127,6 +1127,19 @@ int main(
                    fprintf( stderr, "\nISAR_POST_REND_FeedSplitBinauralBitstream failed: %s\n", ivas_error_to_string( error ) );
                    goto cleanup;
                }

#ifdef FIX_1119_SPLIT_RENDERING_VOIP
                /* Set BFI if frame is empty */
                int16_t frameEmpty = (int16_t) ( bitsBuffer.config.bitsWritten == 0 );
                if ( frameEmpty )
                {
                    if ( ( error = ISAR_POST_REND_SetSplitRendBFI( hIsarPostRend, 1 ) ) != IVAS_ERR_OK )
                    {
                        fprintf( stderr, "Error in ISAR_POST_REND_SetSplitRendBFI(): %s\n", ivas_error_to_string( error ) );
                        goto cleanup;
                    }
                }
#endif
            }
        }

+38 −0
Original line number Diff line number Diff line
@@ -6733,6 +6733,44 @@ void ivas_binaural_hrtf_close_fx(
    HRTFS_FASTCONV_HANDLE *hHrtfFastConv                        /* i/o: decoder binaural hrtf handle                */
);

#ifdef FIX_1119_SPLIT_RENDERING_VOIP

/*---------------------------------------------------------------------------------*
 * Multi-pose ring buffer Prototypes
*-----------------------------------------------------------------------------------*/

ivas_error ivas_CLDFB_RINGBUF_Open( 
    ISAR_CLDFB_RINGBUF_HANDLE *ph, 
    const Word16 capacity_columns 
);

void ivas_CLDFB_RINGBUF_Close( 
    ISAR_CLDFB_RINGBUF_HANDLE *ph 
);

void ivas_CLDFB_RINGBUF_Push( 
    ISAR_CLDFB_RINGBUF_HANDLE h, 
    const Word32 *real, 
    const Word32 *imag, 
    const Word16 num_bands 
);

void ivas_CLDFB_RINGBUF_Pop( 
    ISAR_CLDFB_RINGBUF_HANDLE h, 
    Word32 *real, 
    Word32 *imag, 
    const Word16 num_bands 
);

void ivas_CLDFB_RINGBUF_GetByIdx( 
    ISAR_CLDFB_RINGBUF_HANDLE h,
    Word32 **p_real, 
    Word32 **p_imag, 
    const Word16 idx 
);

#endif

/*----------------------------------------------------------------------------------*
 * renderer prototypes
 *----------------------------------------------------------------------------------*/
Loading