Commit ca42ef8b authored by TYAGIRIS's avatar TYAGIRIS
Browse files

ISM rend SPLIT PCM out bug fixes

parent 1f1b79c0
Loading
Loading
Loading
Loading
+14 −25
Original line number Diff line number Diff line
@@ -720,9 +720,8 @@ void ObjRenderIvasFrame_splitBinaural(
    int32_t i;
    float tmpProcessing[MAX_NUM_OBJECTS][L_FRAME48k];
    float tmpBinaural[MAX_HEAD_ROT_POSES * 2][L_FRAME48k];
#ifdef FIX_SPLIT_REND_MERGE
    float *p_tmpProcessing[MAX_NUM_OBJECTS];
#endif

    int16_t pos_idx;
    IVAS_QUATERNION originalHeadRot[MAX_PARAM_SPATIAL_SUBFRAMES];
    MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData;
@@ -754,7 +753,7 @@ void ObjRenderIvasFrame_splitBinaural(
    /* Save current head positions */
    for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; ++i )
    {
        originalHeadRot[i] = st_ivas->hHeadTrackData->Quaternions[i];
        originalHeadRot[i] = st_ivas->hCombinedOrientationData->Quaternions[i];
    }

    /* Copy input audio to a processing buffer. Cannot render in-place because binaurally rendered
@@ -773,39 +772,33 @@ void ObjRenderIvasFrame_splitBinaural(
            {
                if ( originalHeadRot[i].w == -3.0f )
                {
                    st_ivas->hHeadTrackData->Quaternions[i].w = -3.0f;
                    st_ivas->hHeadTrackData->Quaternions[i].x = originalHeadRot[i].x + pMultiBinPoseData->relative_head_poses[pos_idx][0];
                    st_ivas->hHeadTrackData->Quaternions[i].y = originalHeadRot[i].y + pMultiBinPoseData->relative_head_poses[pos_idx][1];
                    st_ivas->hHeadTrackData->Quaternions[i].z = originalHeadRot[i].z + pMultiBinPoseData->relative_head_poses[pos_idx][2];
                    st_ivas->hCombinedOrientationData->Quaternions[i].w = -3.0f;
                    st_ivas->hCombinedOrientationData->Quaternions[i].x = originalHeadRot[i].x + pMultiBinPoseData->relative_head_poses[pos_idx][0];
                    st_ivas->hCombinedOrientationData->Quaternions[i].y = originalHeadRot[i].y + pMultiBinPoseData->relative_head_poses[pos_idx][1];
                    st_ivas->hCombinedOrientationData->Quaternions[i].z = originalHeadRot[i].z + pMultiBinPoseData->relative_head_poses[pos_idx][2];
                }
                else
                {
                    st_ivas->hHeadTrackData->Quaternions[i].w = -3.0f;
                    st_ivas->hCombinedOrientationData->Quaternions[i].w = -3.0f;
                    Quat2EulerDegree( originalHeadRot[i], /* TODO tmu : fix bug with ordering*/
                                      &st_ivas->hHeadTrackData->Quaternions[i].z,
                                      &st_ivas->hHeadTrackData->Quaternions[i].y,
                                      &st_ivas->hHeadTrackData->Quaternions[i].x );
                    st_ivas->hHeadTrackData->Quaternions[i].x += pMultiBinPoseData->relative_head_poses[pos_idx][0];
                    st_ivas->hHeadTrackData->Quaternions[i].y += pMultiBinPoseData->relative_head_poses[pos_idx][1];
                    st_ivas->hHeadTrackData->Quaternions[i].z += pMultiBinPoseData->relative_head_poses[pos_idx][2];
                                      &st_ivas->hCombinedOrientationData->Quaternions[i].z,
                                      &st_ivas->hCombinedOrientationData->Quaternions[i].y,
                                      &st_ivas->hCombinedOrientationData->Quaternions[i].x );
                    st_ivas->hCombinedOrientationData->Quaternions[i].x += pMultiBinPoseData->relative_head_poses[pos_idx][0];
                    st_ivas->hCombinedOrientationData->Quaternions[i].y += pMultiBinPoseData->relative_head_poses[pos_idx][1];
                    st_ivas->hCombinedOrientationData->Quaternions[i].z += pMultiBinPoseData->relative_head_poses[pos_idx][2];
                }
            }
        }
#ifdef FIX_SPLIT_REND_MERGE
        for ( i = 0; i < BINAURAL_CHANNELS; i++ )
        {
            p_tmpProcessing[i] = tmpProcessing[i];
        }
#endif
        /* Render */
        if ( pos_idx == 0 )
        {
            ivas_td_binaural_renderer( st_ivas,
#ifdef FIX_SPLIT_REND_MERGE
                                       p_tmpProcessing,
#else
                                       tmpProcessing
#endif
                                       output_frame );
        }
        else
@@ -814,11 +807,7 @@ void ObjRenderIvasFrame_splitBinaural(
            tmpTdRendHandle = st_ivas->hBinRendererTd;
            st_ivas->hBinRendererTd = st_ivas->splitBinRend.splitrend.hTdRendHandles[pos_idx - 1];
            ivas_td_binaural_renderer( st_ivas,
#ifdef FIX_SPLIT_REND_MERGE
                                       p_tmpProcessing,
#else
                                       tmpProcessing
#endif
                                       output_frame );
            st_ivas->hBinRendererTd = tmpTdRendHandle;
        }
@@ -842,7 +831,7 @@ void ObjRenderIvasFrame_splitBinaural(
    /* Restore original head rotation */
    for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; ++i )
    {
        st_ivas->hHeadTrackData->Quaternions[i] = originalHeadRot[i];
        st_ivas->hCombinedOrientationData->Quaternions[i] = originalHeadRot[i];
    }

    pop_wmops();
+35 −25
Original line number Diff line number Diff line
@@ -6037,7 +6037,7 @@ static ivas_error renderIsmToSplitBinaural(
    IVAS_QUATERNION originalHeadRot[MAX_PARAM_SPATIAL_SUBFRAMES];
    float tmpBinaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][L_FRAME48k];
    int16_t output_frame = ismInput->base.inputBuffer.config.numSamplesPerChannel;
    IVAS_REND_HeadRotData modifiedHeadRotData;
    COMBINED_ORIENTATION_HANDLE pCombinedOrientationData;

    push_wmops( "renderIsmToSplitBinaural" );

@@ -6065,16 +6065,22 @@ static ivas_error renderIsmToSplitBinaural(
        assert( ismInput->splitTdRendWrappers[i].binaural_latency_ns == ismInput->tdRendWrapper.binaural_latency_ns );
    }

    pCombinedOrientationData = *ismInput->base.ctx.pCombinedOrientationData;

    for ( i = 1; i < MAX_PARAM_SPATIAL_SUBFRAMES; ++i )
    {
        pCombinedOrientationData->Quaternions[i] = pCombinedOrientationData->Quaternions[0];
    }

    /* Save current head positions */
    for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; ++i )
    {
        originalHeadRot[i] = ismInput->base.ctx.pHeadRotData->headPositions[i];
        originalHeadRot[i] = pCombinedOrientationData->Quaternions[i];
    }

    /* Copy input audio to a processing buffer. */
    copyBufferTo2dArray( ismInput->base.inputBuffer, tmpProcessing );

    modifiedHeadRotData = *ismInput->base.ctx.pHeadRotData;
    for ( pos_idx = 0; pos_idx < pMultiBinPoseData->num_poses; pos_idx++ )
    {
        /* Update head positions */
@@ -6084,21 +6090,21 @@ static ivas_error renderIsmToSplitBinaural(
            {
                if ( originalHeadRot[i].w == -3.0f )
                {
                    modifiedHeadRotData.headPositions[i].w = -3.0f;
                    modifiedHeadRotData.headPositions[i].x = originalHeadRot[i].x + pMultiBinPoseData->relative_head_poses[pos_idx - 1][0];
                    modifiedHeadRotData.headPositions[i].y = originalHeadRot[i].y + pMultiBinPoseData->relative_head_poses[pos_idx - 1][1];
                    modifiedHeadRotData.headPositions[i].z = originalHeadRot[i].z + pMultiBinPoseData->relative_head_poses[pos_idx - 1][2];
                    pCombinedOrientationData->Quaternions[i].w = -3.0f;
                    pCombinedOrientationData->Quaternions[i].x = originalHeadRot[i].x + pMultiBinPoseData->relative_head_poses[pos_idx][0];
                    pCombinedOrientationData->Quaternions[i].y = originalHeadRot[i].y + pMultiBinPoseData->relative_head_poses[pos_idx][1];
                    pCombinedOrientationData->Quaternions[i].z = originalHeadRot[i].z + pMultiBinPoseData->relative_head_poses[pos_idx][2];
                }
                else
                {
                    modifiedHeadRotData.headPositions[i].w = -3.0f;
                    pCombinedOrientationData->Quaternions[i].w = -3.0f;
                    Quat2EulerDegree( originalHeadRot[i],
                                      &modifiedHeadRotData.headPositions[i].z,
                                      &modifiedHeadRotData.headPositions[i].y,
                                      &modifiedHeadRotData.headPositions[i].x );
                    modifiedHeadRotData.headPositions[i].x += pMultiBinPoseData->relative_head_poses[pos_idx - 1][0];
                    modifiedHeadRotData.headPositions[i].y += pMultiBinPoseData->relative_head_poses[pos_idx - 1][1];
                    modifiedHeadRotData.headPositions[i].z += pMultiBinPoseData->relative_head_poses[pos_idx - 1][2];
                                      &pCombinedOrientationData->Quaternions[i].z,
                                      &pCombinedOrientationData->Quaternions[i].y,
                                      &pCombinedOrientationData->Quaternions[i].x );
                    pCombinedOrientationData->Quaternions[i].x += pMultiBinPoseData->relative_head_poses[pos_idx][0];
                    pCombinedOrientationData->Quaternions[i].y += pMultiBinPoseData->relative_head_poses[pos_idx][1];
                    pCombinedOrientationData->Quaternions[i].z += pMultiBinPoseData->relative_head_poses[pos_idx][2];
                }
            }
        }
@@ -6109,12 +6115,7 @@ static ivas_error renderIsmToSplitBinaural(
            error = ivas_td_binaural_renderer_ext( &ismInput->tdRendWrapper,
                                                   ismInput->base.inConfig,
                                                   NULL,
#ifndef FIX_SPLIT_REND_MERGE
                                                   ismInput->base.ctx.pHeadRotData,
#endif
#ifdef FIX_SPLIT_REND_MERGE
                                                   ismInput->base.ctx.pCombinedOrientationData,
#endif
                                                   &ismInput->currentPos,
                                                   NULL,
                                                   output_frame,
@@ -6129,12 +6130,7 @@ static ivas_error renderIsmToSplitBinaural(
            error = ivas_td_binaural_renderer_ext( &ismInput->splitTdRendWrappers[pos_idx - 1],
                                                   ismInput->base.inConfig,
                                                   NULL,
#ifndef FIX_SPLIT_REND_MERGE
                                                   &modifiedHeadRotData,
#endif
#ifdef FIX_SPLIT_REND_MERGE
                                                   ismInput->base.ctx.pCombinedOrientationData,
#endif
                                                   &ismInput->currentPos,
                                                   NULL,
                                                   output_frame,
@@ -6153,6 +6149,11 @@ static ivas_error renderIsmToSplitBinaural(
        /* Overwrite processing buffer with original input audio again */
        copyBufferTo2dArray( ismInput->base.inputBuffer, tmpProcessing );
    }
    /* Restore original head rotation */
    for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; ++i )
    {
        pCombinedOrientationData->Quaternions[i] = originalHeadRot[i];
    }

    accumulate2dArrayToBuffer( tmpBinaural, &outAudio );
    pop_wmops();
@@ -8183,6 +8184,7 @@ ivas_error IVAS_REND_GetSamples(
    int16_t numOutChannels;
#ifdef SPLIT_REND_WITH_HEAD_ROT
    int16_t cldfb2tdSampleFact;
    IVAS_REND_AudioBuffer outAudioOrig;
#endif

    /* Validate function arguments */
@@ -8261,8 +8263,14 @@ ivas_error IVAS_REND_GetSamples(
    }

#ifdef SPLIT_REND_LC3PLUS
    /* Clear original output buffer */
    set_zero( outAudio.data, outAudio.config.numChannels * outAudio.config.numSamplesPerChannel );

    outAudioOrig = outAudio;
    /* Use internal buffer if outputting split rendering bitstream */
    if ( hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_SPLIT_CLDFB )
    if ( ( hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_SPLIT_CLDFB ) ||
         ( ( hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) &&
           ( hIvasRend->inputsIsm[0].base.inConfig != IVAS_REND_AUDIO_CONFIG_UNKNOWN ) ) )
    {
        outAudio = hIvasRend->splitRendEncBuffer;
    }
@@ -8360,6 +8368,8 @@ ivas_error IVAS_REND_GetSamples(
            return error;
        }
        convertInternalBitsBuffToBitsBuffer( hBits, bits );
        outAudio = outAudioOrig;
        accumulate2dArrayToBuffer( tmpBinaural, &outAudio );
    }
#endif