Loading lib_rend/ivas_prot_rend.h +26 −0 Original line number Diff line number Diff line Loading @@ -1596,6 +1596,31 @@ void ivas_TD_RINGBUF_Close( TD_RINGBUF_HANDLE *ph /* i/o: Ring buffer handle */ ); #ifdef FIX_1119_SPLIT_RENDERING_VOIP void ivas_TD_RINGBUF_PushInterleaved( TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ const float *data, /* i : Input audio in interleaved channels layout */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to push */ ); void ivas_TD_RINGBUF_PushChannels( TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ const float *p_channels[], /* i : Array of pointers to each input channel */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to store */ ); void ivas_TD_RINGBUF_PushConstant( TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ const float value, /* i : Value to push */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to push */ ); void ivas_TD_RINGBUF_PopChannels( TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ float *p_channels[], /* i : Array of pointers to each output channel */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to pop */ ); #else void ivas_TD_RINGBUF_Push( TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ const float *data, /* i : Input data */ Loading @@ -1612,6 +1637,7 @@ void ivas_TD_RINGBUF_Pop( float *data, /* i : Output data */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to retrieve*/ ); #endif uint32_t ivas_TD_RINGBUF_Size( const TD_RINGBUF_HANDLE h /* i : Ring buffer handle */ Loading lib_rend/ivas_td_ring_buffer.c +129 −0 Original line number Diff line number Diff line Loading @@ -66,6 +66,40 @@ static int16_t ivas_td_ringbuf_has_space_for_num_samples( return (int16_t) ( ivas_td_ringbuf_total_size( h ) + num_samples <= h->capacity ); } #ifdef FIX_1119_SPLIT_RENDERING_VOIP static void ivas_td_ringbuf_push_interleaved( TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ const float *data, /* i : Input audio in interleaved channels layout */ const uint32_t num_samples_per_channel, /* i : Number of samples per channel to push */ const uint16_t read_stride /* i: : 1 for normal operation, 0 for reading from a single input value */ ) { uint32_t s, read_s; assert( h != NULL ); assert( data != NULL ); assert( read_stride == 0 || read_stride == 1 ); assert( ivas_td_ringbuf_has_space_for_num_samples( h, num_samples_per_channel * h->num_channels ) ); for ( s = 0, read_s = 0; s < num_samples_per_channel * h->num_channels; ++s, read_s += read_stride ) { h->data[h->write_pos] = data[read_s]; ++h->write_pos; if ( h->write_pos == h->capacity ) { h->write_pos = 0; } } if ( h->read_pos == h->write_pos ) { h->is_full = 1; } return; } #endif /*-----------------------------------------------------------------------* * Global function definitions Loading Loading @@ -150,6 +184,36 @@ void ivas_TD_RINGBUF_Close( } #ifdef FIX_1119_SPLIT_RENDERING_VOIP /*---------------------------------------------------------------------* * ivas_TD_RINGBUF_PushInterleaved() * * Push samples from a buffer with interleaved channel layout onto the back of the TD ring buffer. *---------------------------------------------------------------------*/ void ivas_TD_RINGBUF_PushInterleaved( TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ const float *data, /* i : Input audio in interleaved channels layout */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to push */ ) { ivas_td_ringbuf_push_interleaved( h, data, num_samples_per_channel, 1 ); return; } /*---------------------------------------------------------------------* * ivas_TD_RINGBUF_PushChannels() * * Push samples from channel pointers onto the back of the TD ring buffer. *---------------------------------------------------------------------*/ void ivas_TD_RINGBUF_PushChannels( TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ const float *p_channels[], /* i : Array of pointers to each input channel */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to push */ ) #else /*---------------------------------------------------------------------* * ivas_TD_RINGBUF_Push() * Loading @@ -162,17 +226,30 @@ void ivas_TD_RINGBUF_Push( const float *data, /* i : Input data */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to store */ ) #endif { uint32_t s; uint16_t c; #ifdef FIX_1119_SPLIT_RENDERING_VOIP assert( h != NULL ); assert( p_channels != NULL ); for ( c = 0; c < h->num_channels; ++c ) { assert( p_channels[c] != NULL ); } #endif assert( ivas_td_ringbuf_has_space_for_num_samples( h, num_samples_per_channel * h->num_channels ) ); for ( s = 0; s < num_samples_per_channel; ++s ) { for ( c = 0; c < h->num_channels; ++c ) { #ifdef FIX_1119_SPLIT_RENDERING_VOIP h->data[h->write_pos] = p_channels[c][s]; #else h->data[h->write_pos] = *( data + c * num_samples_per_channel + s ); #endif ++h->write_pos; if ( h->write_pos == h->capacity ) Loading @@ -191,6 +268,24 @@ void ivas_TD_RINGBUF_Push( } #ifdef FIX_1119_SPLIT_RENDERING_VOIP /*---------------------------------------------------------------------* * ivas_TD_RINGBUF_PushConstant() * * Push samples with a constant value onto the back of the TD ring buffer. *---------------------------------------------------------------------*/ void ivas_TD_RINGBUF_PushConstant( TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ const float value, /* i : Value to push */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to push */ ) { ivas_td_ringbuf_push_interleaved( h, &value, num_samples_per_channel, 0 ); return; } #else /*---------------------------------------------------------------------* * ivas_TD_RINGBUF_PushZeros() * Loading Loading @@ -232,8 +327,22 @@ void ivas_TD_RINGBUF_PushZeros( return; } #endif #ifdef FIX_1119_SPLIT_RENDERING_VOIP /*---------------------------------------------------------------------* * ivas_TD_RINGBUF_PopChannels() * * Pop samples from the front of the TD ring buffer to an array of channel pointers. *---------------------------------------------------------------------*/ void ivas_TD_RINGBUF_PopChannels( TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ float *p_channels[], /* i : Array of pointers to each output channel */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to pop */ ) #else /*---------------------------------------------------------------------* * ivas_TD_RINGBUF_Pop() * Loading @@ -245,17 +354,30 @@ void ivas_TD_RINGBUF_Pop( float *data, /* i : Output data */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to retrieve */ ) #endif { uint32_t s; uint16_t c; #ifdef FIX_1119_SPLIT_RENDERING_VOIP assert( h != NULL ); assert( p_channels != NULL ); for ( c = 0; c < h->num_channels; ++c ) { assert( p_channels[c] != NULL ); } #endif assert( ivas_td_ringbuf_total_size( h ) >= num_samples_per_channel * h->num_channels ); for ( s = 0; s < num_samples_per_channel; ++s ) { for ( c = 0; c < h->num_channels; ++c ) { #ifdef FIX_1119_SPLIT_RENDERING_VOIP p_channels[c][s] = h->data[h->read_pos]; #else *( data + c * num_samples_per_channel + s ) = h->data[h->read_pos]; #endif ++h->read_pos; if ( h->read_pos == h->capacity ) Loading @@ -265,10 +387,17 @@ void ivas_TD_RINGBUF_Pop( } } #ifdef FIX_1119_SPLIT_RENDERING_VOIP if ( num_samples_per_channel != 0 ) { h->is_full = 0; } #else if ( h->is_full ) { h->is_full = 0; } #endif return; } Loading lib_rend/lib_rend.c +23 −0 Original line number Diff line number Diff line Loading @@ -1479,6 +1479,11 @@ static ivas_error alignInputDelay( int16_t maxGlobalDelaySamples; int32_t numSamplesToPush, numSamplesToPop; uint32_t ringBufferSize, preDelay; #ifdef FIX_1119_SPLIT_RENDERING_VOIP int32_t i; const float *p_read_channels[MAX_INPUT_CHANNELS]; float *p_write_channels[MAX_INPUT_CHANNELS]; #endif maxGlobalDelaySamples = latencyNsToSamples( sampleRateOut, maxGlobalDelayNs ); maxGlobalDelaySamples *= cldfb2tdSampleFact; Loading @@ -1501,7 +1506,11 @@ static ivas_error alignInputDelay( /* for the first frame we need to push zeros to align the input delay to the global delay * and then push a frame of actual data */ #ifdef FIX_1119_SPLIT_RENDERING_VOIP ivas_TD_RINGBUF_PushConstant( inputBase->delayBuffer, 0, preDelay ); #else ivas_TD_RINGBUF_PushZeros( inputBase->delayBuffer, preDelay ); #endif /* for ISM inputs, ensure the metadata sync delay is updated */ if ( getAudioConfigType( inputBase->inConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) Loading @@ -1519,8 +1528,22 @@ static ivas_error alignInputDelay( numSamplesToPush = flushInputs ? 0 : inputAudio.config.numSamplesPerChannel; numSamplesToPop = flushInputs ? ivas_TD_RINGBUF_Size( inputBase->delayBuffer ) : (uint32_t) inputAudio.config.numSamplesPerChannel; #ifdef FIX_1119_SPLIT_RENDERING_VOIP for ( i = 0; i < inputAudio.config.numChannels; ++i ) { p_read_channels[i] = inputAudio.data + i * numSamplesToPush; } ivas_TD_RINGBUF_PushChannels( inputBase->delayBuffer, p_read_channels, numSamplesToPush ); for ( i = 0; i < inputAudio.config.numChannels; ++i ) { p_write_channels[i] = inputBase->inputBuffer.data + i * numSamplesToPop; } ivas_TD_RINGBUF_PopChannels( inputBase->delayBuffer, p_write_channels, numSamplesToPop ); #else ivas_TD_RINGBUF_Push( inputBase->delayBuffer, inputAudio.data, numSamplesToPush ); ivas_TD_RINGBUF_Pop( inputBase->delayBuffer, inputBase->inputBuffer.data, numSamplesToPop ); #endif } else { Loading Loading
lib_rend/ivas_prot_rend.h +26 −0 Original line number Diff line number Diff line Loading @@ -1596,6 +1596,31 @@ void ivas_TD_RINGBUF_Close( TD_RINGBUF_HANDLE *ph /* i/o: Ring buffer handle */ ); #ifdef FIX_1119_SPLIT_RENDERING_VOIP void ivas_TD_RINGBUF_PushInterleaved( TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ const float *data, /* i : Input audio in interleaved channels layout */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to push */ ); void ivas_TD_RINGBUF_PushChannels( TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ const float *p_channels[], /* i : Array of pointers to each input channel */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to store */ ); void ivas_TD_RINGBUF_PushConstant( TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ const float value, /* i : Value to push */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to push */ ); void ivas_TD_RINGBUF_PopChannels( TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ float *p_channels[], /* i : Array of pointers to each output channel */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to pop */ ); #else void ivas_TD_RINGBUF_Push( TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ const float *data, /* i : Input data */ Loading @@ -1612,6 +1637,7 @@ void ivas_TD_RINGBUF_Pop( float *data, /* i : Output data */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to retrieve*/ ); #endif uint32_t ivas_TD_RINGBUF_Size( const TD_RINGBUF_HANDLE h /* i : Ring buffer handle */ Loading
lib_rend/ivas_td_ring_buffer.c +129 −0 Original line number Diff line number Diff line Loading @@ -66,6 +66,40 @@ static int16_t ivas_td_ringbuf_has_space_for_num_samples( return (int16_t) ( ivas_td_ringbuf_total_size( h ) + num_samples <= h->capacity ); } #ifdef FIX_1119_SPLIT_RENDERING_VOIP static void ivas_td_ringbuf_push_interleaved( TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ const float *data, /* i : Input audio in interleaved channels layout */ const uint32_t num_samples_per_channel, /* i : Number of samples per channel to push */ const uint16_t read_stride /* i: : 1 for normal operation, 0 for reading from a single input value */ ) { uint32_t s, read_s; assert( h != NULL ); assert( data != NULL ); assert( read_stride == 0 || read_stride == 1 ); assert( ivas_td_ringbuf_has_space_for_num_samples( h, num_samples_per_channel * h->num_channels ) ); for ( s = 0, read_s = 0; s < num_samples_per_channel * h->num_channels; ++s, read_s += read_stride ) { h->data[h->write_pos] = data[read_s]; ++h->write_pos; if ( h->write_pos == h->capacity ) { h->write_pos = 0; } } if ( h->read_pos == h->write_pos ) { h->is_full = 1; } return; } #endif /*-----------------------------------------------------------------------* * Global function definitions Loading Loading @@ -150,6 +184,36 @@ void ivas_TD_RINGBUF_Close( } #ifdef FIX_1119_SPLIT_RENDERING_VOIP /*---------------------------------------------------------------------* * ivas_TD_RINGBUF_PushInterleaved() * * Push samples from a buffer with interleaved channel layout onto the back of the TD ring buffer. *---------------------------------------------------------------------*/ void ivas_TD_RINGBUF_PushInterleaved( TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ const float *data, /* i : Input audio in interleaved channels layout */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to push */ ) { ivas_td_ringbuf_push_interleaved( h, data, num_samples_per_channel, 1 ); return; } /*---------------------------------------------------------------------* * ivas_TD_RINGBUF_PushChannels() * * Push samples from channel pointers onto the back of the TD ring buffer. *---------------------------------------------------------------------*/ void ivas_TD_RINGBUF_PushChannels( TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ const float *p_channels[], /* i : Array of pointers to each input channel */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to push */ ) #else /*---------------------------------------------------------------------* * ivas_TD_RINGBUF_Push() * Loading @@ -162,17 +226,30 @@ void ivas_TD_RINGBUF_Push( const float *data, /* i : Input data */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to store */ ) #endif { uint32_t s; uint16_t c; #ifdef FIX_1119_SPLIT_RENDERING_VOIP assert( h != NULL ); assert( p_channels != NULL ); for ( c = 0; c < h->num_channels; ++c ) { assert( p_channels[c] != NULL ); } #endif assert( ivas_td_ringbuf_has_space_for_num_samples( h, num_samples_per_channel * h->num_channels ) ); for ( s = 0; s < num_samples_per_channel; ++s ) { for ( c = 0; c < h->num_channels; ++c ) { #ifdef FIX_1119_SPLIT_RENDERING_VOIP h->data[h->write_pos] = p_channels[c][s]; #else h->data[h->write_pos] = *( data + c * num_samples_per_channel + s ); #endif ++h->write_pos; if ( h->write_pos == h->capacity ) Loading @@ -191,6 +268,24 @@ void ivas_TD_RINGBUF_Push( } #ifdef FIX_1119_SPLIT_RENDERING_VOIP /*---------------------------------------------------------------------* * ivas_TD_RINGBUF_PushConstant() * * Push samples with a constant value onto the back of the TD ring buffer. *---------------------------------------------------------------------*/ void ivas_TD_RINGBUF_PushConstant( TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ const float value, /* i : Value to push */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to push */ ) { ivas_td_ringbuf_push_interleaved( h, &value, num_samples_per_channel, 0 ); return; } #else /*---------------------------------------------------------------------* * ivas_TD_RINGBUF_PushZeros() * Loading Loading @@ -232,8 +327,22 @@ void ivas_TD_RINGBUF_PushZeros( return; } #endif #ifdef FIX_1119_SPLIT_RENDERING_VOIP /*---------------------------------------------------------------------* * ivas_TD_RINGBUF_PopChannels() * * Pop samples from the front of the TD ring buffer to an array of channel pointers. *---------------------------------------------------------------------*/ void ivas_TD_RINGBUF_PopChannels( TD_RINGBUF_HANDLE h, /* i/o: Ring buffer handle */ float *p_channels[], /* i : Array of pointers to each output channel */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to pop */ ) #else /*---------------------------------------------------------------------* * ivas_TD_RINGBUF_Pop() * Loading @@ -245,17 +354,30 @@ void ivas_TD_RINGBUF_Pop( float *data, /* i : Output data */ const uint32_t num_samples_per_channel /* i : Number of samples per channel to retrieve */ ) #endif { uint32_t s; uint16_t c; #ifdef FIX_1119_SPLIT_RENDERING_VOIP assert( h != NULL ); assert( p_channels != NULL ); for ( c = 0; c < h->num_channels; ++c ) { assert( p_channels[c] != NULL ); } #endif assert( ivas_td_ringbuf_total_size( h ) >= num_samples_per_channel * h->num_channels ); for ( s = 0; s < num_samples_per_channel; ++s ) { for ( c = 0; c < h->num_channels; ++c ) { #ifdef FIX_1119_SPLIT_RENDERING_VOIP p_channels[c][s] = h->data[h->read_pos]; #else *( data + c * num_samples_per_channel + s ) = h->data[h->read_pos]; #endif ++h->read_pos; if ( h->read_pos == h->capacity ) Loading @@ -265,10 +387,17 @@ void ivas_TD_RINGBUF_Pop( } } #ifdef FIX_1119_SPLIT_RENDERING_VOIP if ( num_samples_per_channel != 0 ) { h->is_full = 0; } #else if ( h->is_full ) { h->is_full = 0; } #endif return; } Loading
lib_rend/lib_rend.c +23 −0 Original line number Diff line number Diff line Loading @@ -1479,6 +1479,11 @@ static ivas_error alignInputDelay( int16_t maxGlobalDelaySamples; int32_t numSamplesToPush, numSamplesToPop; uint32_t ringBufferSize, preDelay; #ifdef FIX_1119_SPLIT_RENDERING_VOIP int32_t i; const float *p_read_channels[MAX_INPUT_CHANNELS]; float *p_write_channels[MAX_INPUT_CHANNELS]; #endif maxGlobalDelaySamples = latencyNsToSamples( sampleRateOut, maxGlobalDelayNs ); maxGlobalDelaySamples *= cldfb2tdSampleFact; Loading @@ -1501,7 +1506,11 @@ static ivas_error alignInputDelay( /* for the first frame we need to push zeros to align the input delay to the global delay * and then push a frame of actual data */ #ifdef FIX_1119_SPLIT_RENDERING_VOIP ivas_TD_RINGBUF_PushConstant( inputBase->delayBuffer, 0, preDelay ); #else ivas_TD_RINGBUF_PushZeros( inputBase->delayBuffer, preDelay ); #endif /* for ISM inputs, ensure the metadata sync delay is updated */ if ( getAudioConfigType( inputBase->inConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) Loading @@ -1519,8 +1528,22 @@ static ivas_error alignInputDelay( numSamplesToPush = flushInputs ? 0 : inputAudio.config.numSamplesPerChannel; numSamplesToPop = flushInputs ? ivas_TD_RINGBUF_Size( inputBase->delayBuffer ) : (uint32_t) inputAudio.config.numSamplesPerChannel; #ifdef FIX_1119_SPLIT_RENDERING_VOIP for ( i = 0; i < inputAudio.config.numChannels; ++i ) { p_read_channels[i] = inputAudio.data + i * numSamplesToPush; } ivas_TD_RINGBUF_PushChannels( inputBase->delayBuffer, p_read_channels, numSamplesToPush ); for ( i = 0; i < inputAudio.config.numChannels; ++i ) { p_write_channels[i] = inputBase->inputBuffer.data + i * numSamplesToPop; } ivas_TD_RINGBUF_PopChannels( inputBase->delayBuffer, p_write_channels, numSamplesToPop ); #else ivas_TD_RINGBUF_Push( inputBase->delayBuffer, inputAudio.data, numSamplesToPush ); ivas_TD_RINGBUF_Pop( inputBase->delayBuffer, inputBase->inputBuffer.data, numSamplesToPop ); #endif } else { Loading