Commit 9a6b8df9 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Fix for 3GPP issue 1728: Renderer crash with assertion in OMASA to MASA output (renderIsmToMasa)

Link #1728, #1729
This change fixes issue #1729 as well
parent ced61be1
Loading
Loading
Loading
Loading
Loading
+12 −33
Original line number Diff line number Diff line
@@ -5530,53 +5530,32 @@ static void renderIsmToMasa(
    Word16 *exp )
{
    Word32 tmpRendBuffer_fx[MAX_NUM_OBJECTS][L_FRAME48k];
    Word16 i, j;
    Word16 q_fact;
    Word16 i, guard_bits, q_min, q_diff;

    push_wmops( "renderIsmToMasa" );

    FOR( i = 0; i < MAX_NUM_OBJECTS; i++ )
    {
        set32_fx( tmpRendBuffer_fx[i], 0, L_FRAME48k );
    }

    copyBufferTo2dArray_fx( ismInput->base.inputBuffer, tmpRendBuffer_fx );
    Word16 input_e[MAX_NUM_OBJECTS], max_e;

    FOR( i = 0; i < MAX_NUM_OBJECTS; i++ )
    {
        input_e[i] = sub( 31, add( getScaleFactor32( tmpRendBuffer_fx[i], L_FRAME48k ), *outAudio.pq_fact ) );
        move16();
    }

    Word16 guard_bits = find_guarded_bits_fx( L_FRAME48k );
    max_e = input_e[0];
    q_min = MAX_16;
    move16();

    FOR( i = 1; i < MAX_NUM_OBJECTS; i++ )
    FOR( i = 0; i < ismInput->base.inputBuffer.config.numChannels; i++ )
    {
        if ( LT_16( max_e, input_e[0] ) )
        {
            max_e = input_e[i];
            move16();
        }
        q_min = s_min( q_min, L_norm_arr( tmpRendBuffer_fx[i], ismInput->base.inputBuffer.config.numSamplesPerChannel ) );
    }

    FOR( i = 0; i < MAX_NUM_OBJECTS; i++ )
    {
        FOR( j = 0; j < L_FRAME48k; j++ )
    guard_bits = find_guarded_bits_fx( ismInput->base.inputBuffer.config.numSamplesPerChannel );
    q_min = sub( add( q_min, *outAudio.pq_fact ), guard_bits );
    q_diff = sub( q_min, *outAudio.pq_fact );

    FOR( i = 0; i < ismInput->base.inputBuffer.config.numChannels; i++ )
    {
            tmpRendBuffer_fx[i][j] = L_shr( tmpRendBuffer_fx[i][j], add( sub( max_e, sub( 31, *outAudio.pq_fact ) ), guard_bits ) ); /* Q(31 - (max_e + guard_bits)) */
            move32();
        scale_sig32( tmpRendBuffer_fx[i], ismInput->base.inputBuffer.config.numSamplesPerChannel, q_diff ); // *outAudio.pq_fact -> q_min
    }
    }

    max_e = add( max_e, guard_bits );
    q_fact = sub( Q31, max_e );

    ivas_omasa_ana_fx( ismInput->hOMasa, tmpRendBuffer_fx, &q_fact, ismInput->base.inputBuffer.config.numSamplesPerChannel, outAudio.config.numChannels, ismInput->base.inputBuffer.config.numChannels );
    ivas_omasa_ana_fx( ismInput->hOMasa, tmpRendBuffer_fx, &q_min, ismInput->base.inputBuffer.config.numSamplesPerChannel, outAudio.config.numChannels, ismInput->base.inputBuffer.config.numChannels );

    *exp = q_fact;
    *exp = q_min;
    move16();

    accumulate2dArrayToBuffer_fx( tmpRendBuffer_fx, &outAudio );