Commit f45b1a13 authored by sagnowski's avatar sagnowski
Browse files

Keep TC channel pointers in one constant place during decoding and rendering

parent eeae8dbd
Loading
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -2064,15 +2064,28 @@ void ivas_buffer_interleaved_to_deinterleaved_fx(
    Word32 *audio,                                              /* i/o: audio buffer                                */
    const Word16 n_channels,                                    /* i  : number of channels                          */
    const Word16 frame_length,                                  /* i  : frame length (one channel)                  */
#ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER
    const Word16 deinterleaved_stride                           /* i  : offset between subsequent channels in deinterleaved layout */
#else
    const Word16 n_samp_full                                    /* i  : full frame length (one channel)             */
#endif
);

#ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER
void ivas_buffer_deinterleaved_to_interleaved_fx(
    Word32 *audio,                                              /* i/o: audio buffer                                */
    const Word16 n_channels,                                    /* i  : number of channels                          */
    const Word16 frame_length,                                  /* i  : frame length (one channel)                  */
    const Word16 deinterleaved_stride                           /* i  : offset between subsequent channels in deinterleaved layout */
);
#else
void ivas_buffer_deinterleaved_to_interleaved_fx(
    Word32 *audio[],                                            /* i  : deinterleaved audio buffer                  */
    const Word16 n_channels,                                    /* i  : number of channels                          */
    const Word16 frame_length,                                  /* i  : frame length (one channel)                  */
    Word32 *audio_out                                           /* o  : interleaved audio buffer                    */
);
#endif

void stereo_tcx_core_dec_fx(
    Decoder_State *st,                                          /* i/o: decoder state structure                     */
+41 −0
Original line number Diff line number Diff line
@@ -164,7 +164,11 @@ void ivas_buffer_interleaved_to_deinterleaved_fx(
    Word32 *audio,             /* i/o: audio buffer                    */
    const Word16 n_channels,   /* i  : number of channels              */
    const Word16 frame_length, /* i  : frame length (one channel)      */
#ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER
    const Word16 deinterleaved_stride   /* i  : offset between subsequent channels in deinterleaved layout */
#else
    const Word16 n_samp_full   /* i  : full frame length (one channel) */
#endif
)
{
    Word16 offset, ch, m;
@@ -184,7 +188,11 @@ void ivas_buffer_interleaved_to_deinterleaved_fx(
    FOR( ch = 0; ch < n_channels; ch++ )
    {
        Copy32( buffer[ch], audio + offset, frame_length );
#ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER
        offset = add( offset, deinterleaved_stride );
#else
        offset = add( offset, n_samp_full );
#endif
    }

    return;
@@ -197,6 +205,38 @@ void ivas_buffer_interleaved_to_deinterleaved_fx(
 * Convert a deinterleaved buffer of audio channels to interleaved one
 *-------------------------------------------------------------------*/

#ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER
void ivas_buffer_deinterleaved_to_interleaved_fx(
    Word32 *audio,                      /* i/o: audio buffer                    */
    const Word16 n_channels,            /* i  : number of channels              */
    const Word16 frame_length,          /* i  : frame length (one channel)      */
    const Word16 deinterleaved_stride   /* i  : offset between subsequent channels in deinterleaved layout */
)
{
    Word16 offset, ch, m;
    Word32 buffer[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][L_FRAME48k];

    offset = 0;
    move16();
    FOR( ch = 0; ch < n_channels; ch++ )
    {
        Copy32( audio + offset, buffer[ch], frame_length );
        offset = add( offset, deinterleaved_stride );
    }


    FOR( ch = 0; ch < n_channels; ch++ )
    {
        FOR( m = 0; m < frame_length; m++ )
        {
            audio[m * n_channels + ch] = buffer[ch][m];
            move32();
        }
    }

    return;
}
#else
void ivas_buffer_deinterleaved_to_interleaved_fx(
    Word32 *audio[],           /* i/o: deinterleaved audio buffer      */
    const Word16 n_channels,   /* i  : number of channels              */
@@ -224,6 +264,7 @@ void ivas_buffer_deinterleaved_to_interleaved_fx(

    return;
}
#endif


/*-------------------------------------------------------------------*
+1 −0
Original line number Diff line number Diff line
@@ -107,6 +107,7 @@
#define FIX_2383_INIT_Q_A_ITF                           /* FhG: Initialize Q_A_itf, to avoid reading of uninitialized memory in case ITF is not triggered */
#define FIX_2382_COPY_AQ_IN_MCT                         /* FhG: basop issue 2382: 2nd instance of prevent copying uninitialized values from Aq_fx[][] to Aq_fx_32[][] in TCX */
#define FIX_2391_INIT_HQ_GENERIC_OFFSET                 /* FhG/Eri: basop issue 2391: make sure hq_generic_offset is initialized inside hq_hr_dec_fx() */
#define FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER           /* FhG/VA: basop issue 2396: keep TC channel pointers in one constant place during decoding and rendering */

/* #################### End BE switches ################################## */

+3 −0
Original line number Diff line number Diff line
@@ -1262,6 +1262,9 @@ static ivas_error ivas_dec_tc_audio_allocate_fx(
        move16();
    }

#ifdef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER
    hTcBuffer->tc_stride = n_samp_full;
#endif
    nsamp_to_allocate = imult1616( s_max( hTcBuffer->nchan_transport_rend, hTcBuffer->nchan_buffer_full ), n_samp_full );

    IF( Opt_tsm )
+2 −0
Original line number Diff line number Diff line
@@ -109,6 +109,7 @@ void ivas_dec_feed_tc_to_renderer_fx(
        n_ch_full_copy = s_min( hTcBuffer->nchan_transport_rend, hTcBuffer->nchan_buffer_full );
        n_ch_res_copy = sub( hTcBuffer->nchan_transport_rend, hTcBuffer->nchan_buffer_full );

#ifndef FIX_2396_CONSTANT_STRIDE_IN_TC_BUFFER
        /* buffers are shared between 'hTcBuffer->tc[]' and 'p_output_f[]':
           in case of 'length(hTcBuffer->tc[]) < length(p_output_f[])', reset of TC buffer
           pointers is needed after ivas_buffer_interleaved_to_deinterleaved() */
@@ -125,6 +126,7 @@ void ivas_dec_feed_tc_to_renderer_fx(
            }
        }

#endif
        FOR( ch = 0; ch < n_ch_full_copy; ch++ )
        {
            Copy32( hTcBuffer->tc_fx[ch], tmp_buf_fx, nSamplesForRendering );
Loading