Commit c885e400 authored by Vladimir Malenovsky's avatar Vladimir Malenovsky
Browse files

Merge branch '2200-isar-post-renderer-crashing-inside-cldfb-synthesis' into 'main'

Resolve "ISAR post-renderer crashing inside CLDFB synthesis"

Closes #2200

See merge request !2532
parents 2ac0e6bc e97fd74e
Loading
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -101,6 +101,8 @@

#define FIX_2184_EVS_STEREO_DMX_CHANNEL_DISAPPEARING         /* Orange: Fix for issue 2184 - to prevent one channel from becoming inaudible in the mono downmix output */
#define FIX_2148_OBJ_EDIT_ISSUE_WITH_OSBA                    /* Nokia: Add missing code to solve issue */
#define FIX_2200_ISAR_PLC_CRASH                              /* Dolby: Fix for ISAR PLC crash observed with newly added BASOP tests */

/* ################### End FIXES switches ########################### */

/* #################### Start BASOP porting switches ############################ */
+22 −0
Original line number Diff line number Diff line
@@ -225,6 +225,7 @@ void isar_splitBinLCLDDecProcess(
#endif
            IF( AnyDecodingFailed( hSplitBinLCLDDec->psLCLDDecoder ) )
            {
#ifndef FIX_2200_ISAR_PLC_CRASH
                IF( NE_16( *Q_cldfb_final, 11 ) )
                {
                    FOR( n = 0; n < hSplitBinLCLDDec->iChannels; n++ )
@@ -240,12 +241,20 @@ void isar_splitBinLCLDDecProcess(
                    }
                    *Q_cldfb_final = 11;
                }
#else
                *Q_cldfb_final = hSplitBinLCLDDec->hSplitRendPLC->CldfbPLC_state.Q_Prev_Bin_fx;
#endif

                /* continue concealing */
                isar_splitBinRendPLC( hSplitBinLCLDDec->hSplitRendPLC, Cldfb_Out_Real_fx, Cldfb_Out_Imag_fx, (Word16) hSplitBinLCLDDec->iChannels, hSplitBinLCLDDec->iNumBlocks, hSplitBinLCLDDec->iNumIterations, GetDecodingFailedStatus( hSplitBinLCLDDec->psLCLDDecoder ), *Q_cldfb_final );
            }
            IF( AnyDecodingFailedPrev( hSplitBinLCLDDec->psLCLDDecoder ) )
            {
#ifndef FIX_2200_ISAR_PLC_CRASH
                IF( NE_16( *Q_cldfb_final, 11 ) )
#else
                IF( GT_16( *Q_cldfb_final, hSplitBinLCLDDec->hSplitRendPLC->CldfbPLC_state.Q_Prev_Bin_fx ) )
#endif
                {
                    FOR( n = 0; n < hSplitBinLCLDDec->iChannels; n++ )
                    {
@@ -253,12 +262,21 @@ void isar_splitBinLCLDDecProcess(
                        {
                            FOR( Word16 j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ )
                            {
#ifndef FIX_2200_ISAR_PLC_CRASH
                                hSplitBinLCLDDec->pppfDecLCLDReal_fx[n][k][j] = L_shl_r( hSplitBinLCLDDec->pppfDecLCLDReal_fx[n][k][j], sub( 11, *Q_cldfb_final ) ); // Q11
                                hSplitBinLCLDDec->pppfDecLCLDImag_fx[n][k][j] = L_shl_r( hSplitBinLCLDDec->pppfDecLCLDImag_fx[n][k][j], sub( 11, *Q_cldfb_final ) ); // Q11
#else
                                hSplitBinLCLDDec->pppfDecLCLDReal_fx[n][k][j] = L_shl_r( hSplitBinLCLDDec->pppfDecLCLDReal_fx[n][k][j], sub( hSplitBinLCLDDec->hSplitRendPLC->CldfbPLC_state.Q_Prev_Bin_fx, *Q_cldfb_final ) ); // hSplitBinLCLDDec->hSplitRendPLC->CldfbPLC_state.Q_Prev_Bin_fx
                                hSplitBinLCLDDec->pppfDecLCLDImag_fx[n][k][j] = L_shl_r( hSplitBinLCLDDec->pppfDecLCLDImag_fx[n][k][j], sub( hSplitBinLCLDDec->hSplitRendPLC->CldfbPLC_state.Q_Prev_Bin_fx, *Q_cldfb_final ) ); // hSplitBinLCLDDec->hSplitRendPLC->CldfbPLC_state.Q_Prev_Bin_fx
#endif
                            }
                        }
                    }
#ifndef FIX_2200_ISAR_PLC_CRASH
                    *Q_cldfb_final = 11;
#else
                    *Q_cldfb_final = hSplitBinLCLDDec->hSplitRendPLC->CldfbPLC_state.Q_Prev_Bin_fx;
#endif
                }
                /* cross-fade recovered frame into good frame */
                isar_splitBinRendPLC_xf_fx( hSplitBinLCLDDec->hSplitRendPLC, Cldfb_Out_Real_fx, Cldfb_Out_Imag_fx, (Word16) hSplitBinLCLDDec->iChannels, hSplitBinLCLDDec->iNumBlocks, hSplitBinLCLDDec->iNumIterations, GetDecodingFailedStatus( hSplitBinLCLDDec->psLCLDDecoder ), GetDecodingFailedPrevStatus( hSplitBinLCLDDec->psLCLDDecoder ), *Q_cldfb_final );
@@ -270,6 +288,10 @@ void isar_splitBinLCLDDecProcess(
        /* set states in decoder */
        SetDecodingUnresolved( hSplitBinLCLDDec->psLCLDDecoder );

#ifdef FIX_2200_ISAR_PLC_CRASH
        *Q_cldfb_final = hSplitBinLCLDDec->hSplitRendPLC->CldfbPLC_state.Q_Prev_Bin_fx;
#endif

        /* do PLC for lost split renderer frame */
        isar_splitBinRendPLC( hSplitBinLCLDDec->hSplitRendPLC, Cldfb_Out_Real_fx, Cldfb_Out_Imag_fx, (Word16) hSplitBinLCLDDec->iChannels, hSplitBinLCLDDec->iNumBlocks, hSplitBinLCLDDec->iNumIterations, GetDecodingFailedStatus( hSplitBinLCLDDec->psLCLDDecoder ), *Q_cldfb_final );
    }