Commit 21485f9a authored by sagnowski's avatar sagnowski
Browse files

Merge branch 'basop-2396-constant-stride-in-tc-buffer' into 'main'

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

See merge request !2512
parents b740bb52 e62df699
Loading
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -259,19 +259,37 @@ uint32_t ivas_syn_output(
    int16_t *synth_out                                          /* o  : integer 16 bits synthesis signal        */
);

#ifdef FIX_BASOP_2396_CONSTANT_STRIDE_IN_TC_BUFFER
void ivas_buffer_interleaved_to_deinterleaved(
    float *audio_in,                                            /* i  : interleaved audio buffer                                 */
    float *audio_out[],                                         /* o  : pointers to each channel of deinterleaved audio buffer   */
    const int16_t n_channels,                                   /* i  : number of channels                                       */
    const int16_t frame_length                                  /* i  : frame length (one channel)                               */
);
#else
void ivas_buffer_interleaved_to_deinterleaved(
    float *audio,                                               /* i/o: audio buffer                            */
    const int16_t n_channels,                                   /* i  : number of channels                      */
    const int16_t frame_length,                                 /* i  : frame length (one channel)              */
    const int16_t n_samp_full                                   /* i  : full frame length (one channel)         */
);
#endif

#ifdef FIX_BASOP_2396_CONSTANT_STRIDE_IN_TC_BUFFER
void ivas_buffer_deinterleaved_to_interleaved(
    float *audio_in[],                                          /* i  : pointers to each channel of deinterleaved audio buffer  */
    float *audio_out,                                           /* o  : interleaved audio buffer                                */
    const int16_t n_channels,                                   /* i  : number of channels                                      */
    const int16_t frame_length                                  /* i  : frame length (one channel)                              */
);
#else
void ivas_buffer_deinterleaved_to_interleaved(
    float *audio[],                                             /* i  : deinterleaved audio buffer              */
    const int16_t n_channels,                                   /* i  : number of channels                      */
    const int16_t frame_length,                                 /* i  : frame length (one channel)              */
    float *audio_out                                            /* o  : interleaved audio buffer                */
);
#endif

void ivas_initialize_handles_enc(
    Encoder_Struct *st_ivas                                     /* i/o: IVAS encoder structure                  */
+62 −1
Original line number Diff line number Diff line
@@ -155,6 +155,36 @@ uint32_t ivas_syn_output(
 * Convert an interleaved buffer of audio channels to deinterleaved one
 *-------------------------------------------------------------------*/

#ifdef FIX_BASOP_2396_CONSTANT_STRIDE_IN_TC_BUFFER
void ivas_buffer_interleaved_to_deinterleaved(
    float *audio_in,           /* i  : interleaved audio buffer                                 */
    float *audio_out[],        /* o  : pointers to each channel of deinterleaved audio buffer   */
    const int16_t n_channels,  /* i  : number of channels                                       */
    const int16_t frame_length /* i  : frame length (one channel)                               */
)
{
    int16_t ch, s;
    float buffer[MAX_TRANSPORT_CHANNELS][MAX_JBM_L_FRAME48k]; /* temp buffer needed when "*audio_in" and "*audio_out[]" point to the same memory */

    for ( ch = 0; ch < n_channels; ch++ )
    {
        for ( s = 0; s < frame_length; s++ )
        {
            buffer[ch][s] = audio_in[s * n_channels + ch];
        }
    }

    for ( ch = 0; ch < n_channels; ch++ )
    {
        for ( s = 0; s < frame_length; s++ )
        {
            audio_out[ch][s] = buffer[ch][s];
        }
    }

    return;
}
#else
void ivas_buffer_interleaved_to_deinterleaved(
    float *audio,               /* i/o: audio buffer                    */
    const int16_t n_channels,   /* i  : number of channels              */
@@ -182,7 +212,7 @@ void ivas_buffer_interleaved_to_deinterleaved(

    return;
}

#endif

/*-------------------------------------------------------------------*
 * ivas_buffer_deinterleaved_to_interleaved()
@@ -190,6 +220,36 @@ void ivas_buffer_interleaved_to_deinterleaved(
 * Convert a deinterleaved buffer of audio channels to interleaved one
 *-------------------------------------------------------------------*/

#ifdef FIX_BASOP_2396_CONSTANT_STRIDE_IN_TC_BUFFER
void ivas_buffer_deinterleaved_to_interleaved(
    float *audio_in[],         /* i  : pointers to each channel of deinterleaved audio buffer  */
    float *audio_out,          /* o  : interleaved audio buffer                                */
    const int16_t n_channels,  /* i  : number of channels                                      */
    const int16_t frame_length /* i  : frame length (one channel)                              */
)
{
    int16_t ch, s;
    float buffer[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][L_FRAME48k]; /* temp buffer needed when "*audio_in[]" and "*audio_out" point to the same memory */

    for ( ch = 0; ch < n_channels; ch++ )
    {
        for ( s = 0; s < frame_length; s++ )
        {
            buffer[ch][s] = audio_in[ch][s];
        }
    }

    for ( ch = 0; ch < n_channels; ch++ )
    {
        for ( s = 0; s < frame_length; s++ )
        {
            audio_out[s * n_channels + ch] = buffer[ch][s];
        }
    }

    return;
}
#else
void ivas_buffer_deinterleaved_to_interleaved(
    float *audio[],             /* i/o: deinterleaved audio buffer      */
    const int16_t n_channels,   /* i  : number of channels              */
@@ -215,6 +275,7 @@ void ivas_buffer_deinterleaved_to_interleaved(

    return;
}
#endif


/*-------------------------------------------------------------------*
+1 −0
Original line number Diff line number Diff line
@@ -171,6 +171,7 @@
#define FIX_1465_SWB_TBE_RANDOM_VECTOR_CREATION         /* Dolby: issue 1465: Fix constant in create_random_vector() to allow more reliable fixed point port */
#define FIX_BASOP_2317_UNINIT_VALUE_IN_STEREO_CNG       /* Eri: Basop issue 2317: Uninitialized value read in case of DTX and BW switching   */
#define FIX_1283_STEREO_DFT_COLLAPSE                    /* FhG: issue 1283: fix for critical issue with DFT stereo core coder */
#define FIX_BASOP_2396_CONSTANT_STRIDE_IN_TC_BUFFER     /* FhG/VA: basop issue 2396: keep TC channel pointers in one constant place during decoding and rendering */
/* ##################### End NON-BE switches ########################### */

/* ################## End MAINTENANCE switches ######################### */
+14 −0
Original line number Diff line number Diff line
@@ -73,8 +73,12 @@ void ivas_dec_feed_tc_to_renderer(
{
    float tmp_buf[MAX_JBM_L_FRAME48k];
    float *p_data_f[FOA_CHANNELS + MAX_NUM_OBJECTS];
#ifdef FIX_BASOP_2396_CONSTANT_STRIDE_IN_TC_BUFFER
    int16_t n, n_render_timeslots, n_ch_cldfb, ch;
#else
    int16_t n, n_render_timeslots, n_ch_cldfb;
    int16_t ch, offset, len_offset;
#endif
    DECODER_TC_BUFFER_HANDLE hTcBuffer;

    hTcBuffer = st_ivas->hTcBuffer;
@@ -92,6 +96,7 @@ void ivas_dec_feed_tc_to_renderer(
        n_ch_full_copy = min( hTcBuffer->nchan_transport_rend, hTcBuffer->nchan_buffer_full );
        n_ch_res_copy = hTcBuffer->nchan_transport_rend - hTcBuffer->nchan_buffer_full;

#ifndef FIX_BASOP_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() */
@@ -107,6 +112,7 @@ void ivas_dec_feed_tc_to_renderer(
            }
        }

#endif
        for ( ch = 0; ch < n_ch_full_copy; ch++ )
        {
            mvr2r( hTcBuffer->tc[ch], tmp_buf, nSamplesForRendering );
@@ -676,7 +682,11 @@ ivas_error ivas_dec_render(

            break;
        case PCM_FLOAT32:
#ifdef FIX_BASOP_2396_CONSTANT_STRIDE_IN_TC_BUFFER
            ivas_buffer_deinterleaved_to_interleaved( p_output, (float *) data, nchan_out_syn_output, *nSamplesRendered );
#else
            ivas_buffer_deinterleaved_to_interleaved( p_output, nchan_out_syn_output, *nSamplesRendered, (float *) data );
#endif
            break;
        default:
            error = IVAS_ERR_UNKNOWN;
@@ -978,7 +988,11 @@ ivas_error ivas_jbm_dec_flush_renderer(
                ivas_syn_output( p_output, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out, (int16_t *) data );
            break;
        case PCM_FLOAT32:
#ifdef FIX_BASOP_2396_CONSTANT_STRIDE_IN_TC_BUFFER
            ivas_buffer_deinterleaved_to_interleaved( p_output, (float *) data, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered );
#else
            ivas_buffer_deinterleaved_to_interleaved( p_output, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered, (float *) data );
#endif
            break;
        default:
            error = IVAS_ERR_UNKNOWN;
+8 −0
Original line number Diff line number Diff line
@@ -1203,7 +1203,11 @@ ivas_error IVAS_DEC_GetSamplesDecoder(
            }

            /* convert deinterleaved decoded TC audio channels buffer to an interleaved one */
#ifdef FIX_BASOP_2396_CONSTANT_STRIDE_IN_TC_BUFFER
            ivas_buffer_deinterleaved_to_interleaved( st_ivas->p_output_f, st_ivas->hTcBuffer->tc_buffer, nTransportChannels, hIvasDec->nSamplesFrame );
#else
            ivas_buffer_deinterleaved_to_interleaved( st_ivas->p_output_f, nTransportChannels, hIvasDec->nSamplesFrame, st_ivas->hTcBuffer->tc_buffer );
#endif

            /* time-scale modification */
            if ( apa_exec( hIvasDec->hTimeScaler, st_ivas->hTcBuffer->tc_buffer, hIvasDec->nSamplesFrame * nTransportChannels, (uint16_t) hIvasDec->tsm_max_scaling, st_ivas->hTcBuffer->tc_buffer, &nTimeScalerOutSamples ) != 0 )
@@ -1216,7 +1220,11 @@ ivas_error IVAS_DEC_GetSamplesDecoder(
            hIvasDec->timeScalingDone = 1;

            /* convert interleaved time-scaled TC audio channels buffer to deinterleaved one */
#ifdef FIX_BASOP_2396_CONSTANT_STRIDE_IN_TC_BUFFER
            ivas_buffer_interleaved_to_deinterleaved( st_ivas->hTcBuffer->tc_buffer, st_ivas->p_output_f, nTransportChannels, nSamplesTcsScaled );
#else
            ivas_buffer_interleaved_to_deinterleaved( st_ivas->hTcBuffer->tc_buffer, nTransportChannels, nSamplesTcsScaled, NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) );
#endif
        }
        else
        {