Commit cc8c2294 authored by bayers's avatar bayers
Browse files

fix #864, use correct information for the JBM control for all rendering sizes

parent 332bc972
Loading
Loading
Loading
Loading
+161 −1
Original line number Diff line number Diff line
@@ -3208,6 +3208,13 @@ static ivas_error decodeVoIP(
        }
#endif

#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE
        if ( vec_pos_update == 0 )
        {
            IVAS_DEC_VoIP_Set20msStart( hIvasDec );
        }
#endif

        /* read all packets with a receive time smaller than the system time */
        while ( nextPacketRcvTime_ms <= systemTime_ms )
        {
@@ -3399,7 +3406,14 @@ static ivas_error decodeVoIP(
        vec_pos_update = ( vec_pos_update + 1 ) % vec_pos_len;
#endif
        frame++;
        systemTime_ms += systemTimeInc_ms;
#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE
        if ( vec_pos_update == 0 )
        {
#endif
            systemTime_ms += vec_pos_len * systemTimeInc_ms;
#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE
        }
#endif

#ifdef WMOPS
        update_mem();
@@ -3407,6 +3421,152 @@ static ivas_error decodeVoIP(
#endif
    }


#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE
    int16_t nSamplesFlushed = 0;

    do
    {


        /* Feed into decoder */

        /* reference vector */
        if ( arg.enableReferenceVectorTracking )
        {
            IVAS_VECTOR3 listenerPosition, referencePosition;
            if ( ( error = Vector3PairFileReader_read( referenceVectorReader, &listenerPosition, &referencePosition ) ) != IVAS_ERR_OK )
            {
                fprintf( stderr, "\nError %s while reading listener and reference positions from %s\n", IVAS_DEC_GetErrorMessage( error ), Vector3PairFileReader_getFilePath( referenceVectorReader ) );
                goto cleanup;
            }

            if ( ( error = IVAS_DEC_FeedRefVectorData( hIvasDec, listenerPosition, referencePosition ) ) != IVAS_ERR_OK )
            {
                fprintf( stderr, "\nIVAS_DEC_FeedRefVectorData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) );
                goto cleanup;
            }
        }

        /* Reference rotation */
        if ( arg.enableReferenceRotation )
        {
            IVAS_QUATERNION quaternion;
            if ( ( error = HeadRotationFileReading( refRotReader, &quaternion, NULL ) ) != IVAS_ERR_OK )
            {
                fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), RotationFileReader_getFilePath( refRotReader ) );
                goto cleanup;
            }

            if ( ( error = IVAS_DEC_FeedRefRotData( hIvasDec, quaternion ) ) != IVAS_ERR_OK )
            {
                fprintf( stderr, "\nIVAS_DEC_FeedRefRotData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) );
                goto cleanup;
            }
        }

        /* Head-tracking input simulation */
        if ( arg.enableHeadRotation )
        {
            IVAS_QUATERNION Quaternion;
            if ( ( error = HeadRotationFileReading( headRotReader, &Quaternion, &Pos[0] ) ) != IVAS_ERR_OK )
            {
                fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), RotationFileReader_getFilePath( headRotReader ) );
                goto cleanup;
            }

#ifdef SPLIT_REND_WITH_HEAD_ROT
            if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternion, Pos[0], 0, DEFAULT_AXIS ) ) != IVAS_ERR_OK )
#else
            if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternion, Pos[0], 0 ) ) != IVAS_ERR_OK )
#endif
            {
                fprintf( stderr, "\nIVAS_DEC_FeedHeadTrackData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) );
                goto cleanup;
            }
        }

        /* decode and get samples */
#ifdef SPLIT_REND_WITH_HEAD_ROT
        if ( ( error = IVAS_DEC_Flush( hIvasDec, nOutSamples, IVAS_DEC_PCM_INT16, (void *) pcmBuf, &nSamplesFlushed ) ) != IVAS_ERR_OK )
#else
        if ( ( error = IVAS_DEC_Flush( hIvasDec, nOutSamples, pcmBuf, &nSamplesFlushed ) ) != IVAS_ERR_OK )
#endif
        {
            fprintf( stderr, "\nError in IVAS_DEC_VoIP_Flush: %s\n", IVAS_DEC_GetErrorMessage( error ) );
            goto cleanup;
        }

        /* Write current frame */
        if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, nSamplesFlushed * nOutChannels ) ) != IVAS_ERR_OK )
        {
            fprintf( stderr, "\nOutput audio file writer error\n" );
            goto cleanup;
        }

        /* Write ISm metadata to external file(s) */
        if ( decodedGoodFrame && arg.outputConfig == IVAS_AUDIO_CONFIG_EXTERNAL )
        {
            if ( bsFormat == IVAS_DEC_BS_OBJ || bsFormat == IVAS_DEC_BS_MASA_ISM || bsFormat == IVAS_DEC_BS_SBA_ISM )
            {
                if ( ( error = IVAS_DEC_GetNumObjects( hIvasDec, &numObj ) ) != IVAS_ERR_OK )
                {
                    fprintf( stderr, "\nError in IVAS_DEC_GetNumObjects: %s\n", IVAS_DEC_GetErrorMessage( error ) );
                    goto cleanup;
                }

                for ( i = 0; i < numObj; ++i )
                {
                    IVAS_ISM_METADATA IsmMetadata;

                    if ( ( error = IVAS_DEC_GetObjectMetadata( hIvasDec, &IsmMetadata, 0, i ) ) != IVAS_ERR_OK )
                    {
                        fprintf( stderr, "\nError in IVAS_DEC_GetObjectMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) );
                        goto cleanup;
                    }

                    if ( ( IsmFileWriter_writeFrame( IsmMetadata, ismWriters[i] ) ) != IVAS_ERR_OK )
                    {
                        fprintf( stderr, "\nError writing ISM metadata to file %s\n", IsmFileWriter_getFilePath( ismWriters[i] ) );
                        goto cleanup;
                    }
                }
            }

            if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM )
            {
                IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta;
                if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 0 ) ) != IVAS_ERR_OK )
                {
                    fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) );
                    goto cleanup;
                }

                if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK )
                {
                    fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) );
                    goto cleanup;
                }
            }
        }

#ifdef NONBE_UNIFIED_DECODING_PATHS
        vec_pos_update = ( vec_pos_update + 1 ) % vec_pos_len;
#endif
        frame++;
        if ( !arg.quietModeEnabled )
        {
            fprintf( stdout, "%-8d\b\b\b\b\b\b\b\b", frame );
#ifdef DEBUGGING
            if ( IVAS_DEC_GetBerDetectFlag( hIvasDec ) )
            {
                fprintf( stdout, "\n   Decoding error: BER detected in frame %d !!!!!\n", frame - 1 );
            }
#endif
        }
    } while ( nSamplesFlushed > 0 );
#endif

    /*------------------------------------------------------------------------------------------*
     * Add zeros at the end to have equal length of synthesized signals
     *------------------------------------------------------------------------------------------*/
+2 −0
Original line number Diff line number Diff line
@@ -128,6 +128,7 @@
/*#define DEBUG_AGC_ENCODER_CMD_OPTION*/        /* Ability to force enable or disable AGC behaviour in DIRAC/SPAR via command line option */
/*#define DEBUG_JBM_CMD_OPTION*/                /* ability for telling the decoder the frontend fetch size and to not delay compensate for bad frames at the beginning */
/*#define VARIABLE_SPEED_DECODING*/             /* variable speed decoding employing the JBM functioniality; move to DEBUGGING after build for disabled is fixed */
#define DISABLE_LIMITER                         /* disable the limiter */

/*Split Rendering Debug switches*/
/*#define DBG_WAV_WRITER*/                      /* add debugging function dbgwrite_wav() */
@@ -165,6 +166,7 @@
#define NONBE_FIX_871_ACELP_CRASH_IN_OSBA                     /* FhG: isse 871: crash in ACELP core encoder with OSBA */
#define NONBE_FIX_225_MASA_EXT_REND                           /* Nokia: Resolve #225: Complete MASA external renderer implementation */
#define NONBE_FIX_897_USAN_WITH_MASA_RENDERING                /* Nokia: issue #897: USAN null pointer in MASA external renderer to Ambisonics */
#define NONBE_FIX_864_JBM_RENDER_FRAMESIZE                    /* FhG: issue #864: fix different behaviour of JBM TSM with different render frame sizes */

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

+41 −0
Original line number Diff line number Diff line
@@ -57,6 +57,9 @@ struct IVAS_DEC_VOIP
    uint16_t lastDecodedWasActive;
    JB4_DATAUNIT_HANDLE hCurrentDataUnit; /* Points to the currently processed data unit */
    uint16_t *bs_conversion_buf;          /* Buffer for bitstream conversion from packed to serial */
#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE
    int16_t nSamplesRendered20ms; /* how many samples have been rendered since the last 20ms render border*/
#endif
#ifdef SUPPORT_JBM_TRACEFILE
    IVAS_JBM_TRACE_DATA JbmTraceData;
#endif
@@ -2612,7 +2615,11 @@ ivas_error IVAS_DEC_VoIP_GetSamples(
                }
            }

#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE
            extBufferedSamples = hVoIP->nSamplesRendered20ms + nSamplesBuffered;
#else
            extBufferedSamples = nSamplesRendered + nSamplesBuffered;
#endif
            extBufferedTime_ms = extBufferedSamples * 1000 / hDecoderConfig->output_Fs;
            dataUnit = NULL;

@@ -2723,6 +2730,9 @@ ivas_error IVAS_DEC_VoIP_GetSamples(
            nSamplesRendered += nSamplesToZero;
            hIvasDec->nSamplesRendered += nSamplesToZero;
            hIvasDec->nSamplesAvailableNext -= nSamplesToZero;
#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE
            hVoIP->nSamplesRendered20ms += nSamplesToZero;
#endif
        }
        else
        {
@@ -2741,6 +2751,9 @@ ivas_error IVAS_DEC_VoIP_GetSamples(
            }

            nSamplesRendered += nSamplesRendered_loop;
#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE
            hVoIP->nSamplesRendered20ms += nSamplesRendered_loop;
#endif
        }
    }

@@ -2748,6 +2761,34 @@ ivas_error IVAS_DEC_VoIP_GetSamples(
}


#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE
/*---------------------------------------------------------------------*
 * IVAS_DEC_VoIP_Set20msStart( )
 *
 * Function to tell the API that a new 20ms rendered samples border has been reached
 * needed for correct JBM packet buffer operations
 *---------------------------------------------------------------------*/
ivas_error IVAS_DEC_VoIP_Set20msStart(
    IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */
)
{
    ivas_error error;

    error = IVAS_ERR_OK;

    if ( hIvasDec->hVoIP == NULL )
    {
        return IVAS_ERR_UNKNOWN;
    }

    hIvasDec->hVoIP->nSamplesRendered20ms = 0;


    return error;
}

#endif

/*---------------------------------------------------------------------*
 * IVAS_DEC_VoIP_Flush( )
 *
+6 −0
Original line number Diff line number Diff line
@@ -283,6 +283,12 @@ ivas_error IVAS_DEC_VoIP_GetSamples(
#endif
);

#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE
ivas_error IVAS_DEC_VoIP_Set20msStart( 
	IVAS_DEC_HANDLE hIvasDec  /* i/o: IVAS decoder handle */
);
#endif

ivas_error IVAS_DEC_Flush(
    IVAS_DEC_HANDLE hIvasDec,                   /* i/o: IVAS decoder handle                                                     */
    const int16_t nSamplesPerChannel,           /* i  : number of samples per channel requested to be written to output buffer  */