Commit 49e1047e authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

aout_ChannelReorder: optimize 16 and 32 bits cases with aligned access

parent d8232746
...@@ -179,7 +179,7 @@ static const uint32_t pi_vlc_chan_order_wg4[] = ...@@ -179,7 +179,7 @@ static const uint32_t pi_vlc_chan_order_wg4[] =
* internal (WG4) order is requested. * internal (WG4) order is requested.
*/ */
VLC_API int aout_CheckChannelReorder( const uint32_t *pi_chan_order_in, const uint32_t *pi_chan_order_out, uint32_t i_channel_mask, int i_channels, int *pi_chan_table ); VLC_API int aout_CheckChannelReorder( const uint32_t *pi_chan_order_in, const uint32_t *pi_chan_order_out, uint32_t i_channel_mask, int i_channels, int *pi_chan_table );
VLC_API void aout_ChannelReorder( uint8_t *, int, int, const int *, int ); VLC_API void aout_ChannelReorder( void *, size_t, unsigned, const int *, unsigned );
/** /**
* This fonction will compute the extraction parameter into pi_selection to go * This fonction will compute the extraction parameter into pi_selection to go
......
...@@ -280,69 +280,80 @@ int aout_CheckChannelReorder( const uint32_t *pi_chan_order_in, ...@@ -280,69 +280,80 @@ int aout_CheckChannelReorder( const uint32_t *pi_chan_order_in,
/***************************************************************************** /*****************************************************************************
* aout_ChannelReorder : * aout_ChannelReorder :
*****************************************************************************/ *****************************************************************************/
void aout_ChannelReorder( uint8_t *p_buf, int i_buffer, void aout_ChannelReorder( void *ptr, size_t bytes, unsigned channels,
int i_channels, const int *pi_chan_table, const int *pi_chan_table, unsigned bits_per_sample )
int i_bits_per_sample )
{ {
uint8_t p_tmp[AOUT_CHAN_MAX * 4]; size_t samples = bytes / (channels * (bits_per_sample >> 3));
int i, j;
if( i_bits_per_sample == 8 ) assert( channels <= AOUT_CHAN_MAX );
switch( bits_per_sample )
{ {
for( i = 0; i < i_buffer / i_channels; i++ ) case 32:
{ {
for( j = 0; j < i_channels; j++ ) uint32_t *buf = ptr;
for( size_t i = 0; i < samples; i++ )
{ {
p_tmp[pi_chan_table[j]] = p_buf[j]; uint32_t tmp[AOUT_CHAN_MAX];
}
memcpy( p_buf, p_tmp, i_channels ); for( size_t j = 0; j < channels; j++ )
p_buf += i_channels; tmp[pi_chan_table[j]] = buf[j];
memcpy( buf, tmp, 4 * channels );
buf += channels;
}
break;
} }
}
else if( i_bits_per_sample == 16 ) case 16:
{
for( i = 0; i < i_buffer / i_channels / 2; i++ )
{ {
for( j = 0; j < i_channels; j++ ) uint16_t *buf = ptr;
for( size_t i = 0; i < samples; i++ )
{ {
p_tmp[2 * pi_chan_table[j]] = p_buf[2 * j]; uint16_t tmp[AOUT_CHAN_MAX];
p_tmp[2 * pi_chan_table[j] + 1] = p_buf[2 * j + 1];
}
memcpy( p_buf, p_tmp, 2 * i_channels ); for( size_t j = 0; j < channels; j++ )
p_buf += 2 * i_channels; tmp[pi_chan_table[j]] = buf[j];
memcpy( buf, tmp, 2 * channels );
buf += channels;
}
break;
} }
}
else if( i_bits_per_sample == 24 ) case 8:
{
for( i = 0; i < i_buffer / i_channels / 3; i++ )
{ {
for( j = 0; j < i_channels; j++ ) uint8_t *buf = ptr;
for( size_t i = 0; i < samples; i++ )
{ {
p_tmp[3 * pi_chan_table[j]] = p_buf[3 * j]; uint8_t tmp[AOUT_CHAN_MAX];
p_tmp[3 * pi_chan_table[j] + 1] = p_buf[3 * j + 1];
p_tmp[3 * pi_chan_table[j] + 2] = p_buf[3 * j + 2];
}
memcpy( p_buf, p_tmp, 3 * i_channels ); for( size_t j = 0; j < channels; j++ )
p_buf += 3 * i_channels; tmp[pi_chan_table[j]] = buf[j];
memcpy( buf, tmp, channels );
buf += channels;
}
break;
} }
}
else if( i_bits_per_sample == 32 ) case 24:
{
for( i = 0; i < i_buffer / i_channels / 4; i++ )
{ {
for( j = 0; j < i_channels; j++ ) uint8_t *buf = ptr;
for( size_t i = 0; i < samples; i++ )
{ {
p_tmp[4 * pi_chan_table[j]] = p_buf[4 * j]; uint8_t tmp[3 * AOUT_CHAN_MAX];
p_tmp[4 * pi_chan_table[j] + 1] = p_buf[4 * j + 1];
p_tmp[4 * pi_chan_table[j] + 2] = p_buf[4 * j + 2]; for( size_t j = 0; j < channels; j++ )
p_tmp[4 * pi_chan_table[j] + 3] = p_buf[4 * j + 3]; memcpy( tmp + (3 * pi_chan_table[j]), buf + (3 * j), 3 );
}
memcpy( p_buf, p_tmp, 4 * i_channels ); memcpy( buf, tmp, 3 * channels );
p_buf += 4 * i_channels; buf += 3 * channels;
}
} }
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment