Commit 978d581b authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Shrink channel reordering tables to 9-10 bytes (from 36-40 bytes)

parent 784b1bd3
...@@ -179,8 +179,8 @@ static const uint32_t pi_vlc_chan_order_wg4[] = ...@@ -179,8 +179,8 @@ static const uint32_t pi_vlc_chan_order_wg4[] =
* internal (WG4) order is requested. * internal (WG4) order is requested.
*/ */
VLC_API unsigned aout_CheckChannelReorder( const uint32_t *, const uint32_t *, VLC_API unsigned aout_CheckChannelReorder( const uint32_t *, const uint32_t *,
uint32_t mask, int *table ); uint32_t mask, uint8_t *table );
VLC_API void aout_ChannelReorder( void *, size_t, unsigned, const int *, unsigned ); VLC_API void aout_ChannelReorder( void *, size_t, unsigned, const uint8_t *, 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
......
...@@ -73,7 +73,7 @@ struct filter_sys_t ...@@ -73,7 +73,7 @@ struct filter_sys_t
bool b_dontwarn; bool b_dontwarn;
int i_nb_channels; /* number of float32 per sample */ int i_nb_channels; /* number of float32 per sample */
int pi_chan_table[AOUT_CHAN_MAX]; /* channel reordering */ uint8_t pi_chan_table[AOUT_CHAN_MAX]; /* channel reordering */
}; };
/***************************************************************************** /*****************************************************************************
...@@ -223,7 +223,7 @@ static int Open( vlc_object_t *p_this, filter_sys_t *p_sys, ...@@ -223,7 +223,7 @@ static int Open( vlc_object_t *p_this, filter_sys_t *p_sys,
* Interleave: helper function to interleave channels * Interleave: helper function to interleave channels
*****************************************************************************/ *****************************************************************************/
static void Interleave( sample_t * p_out, const sample_t * p_in, static void Interleave( sample_t * p_out, const sample_t * p_in,
int i_nb_channels, int *pi_chan_table ) int i_nb_channels, uint8_t *pi_chan_table )
{ {
/* We do not only have to interleave, but also reorder the channels */ /* We do not only have to interleave, but also reorder the channels */
......
...@@ -66,7 +66,7 @@ struct filter_sys_t ...@@ -66,7 +66,7 @@ struct filter_sys_t
bool b_dontwarn; bool b_dontwarn;
int i_nb_channels; /* number of float32 per sample */ int i_nb_channels; /* number of float32 per sample */
int pi_chan_table[AOUT_CHAN_MAX]; /* channel reordering */ uint8_t pi_chan_table[AOUT_CHAN_MAX]; /* channel reordering */
}; };
/***************************************************************************** /*****************************************************************************
...@@ -185,7 +185,7 @@ static int Open( vlc_object_t *p_this, filter_sys_t *p_sys, ...@@ -185,7 +185,7 @@ static int Open( vlc_object_t *p_this, filter_sys_t *p_sys,
* Interleave: helper function to interleave channels * Interleave: helper function to interleave channels
*****************************************************************************/ *****************************************************************************/
static void Interleave( float * p_out, const float * p_in, int i_nb_channels, static void Interleave( float * p_out, const float * p_in, int i_nb_channels,
int *pi_chan_table ) uint8_t *pi_chan_table )
{ {
/* We do not only have to interleave, but also reorder the channels. */ /* We do not only have to interleave, but also reorder the channels. */
......
...@@ -83,8 +83,8 @@ struct aout_sys_t ...@@ -83,8 +83,8 @@ struct aout_sys_t
int i_speaker_setup; /* Speaker setup override */ int i_speaker_setup; /* Speaker setup override */
bool b_chan_reorder; /* do we need channel reordering */ uint8_t chans_to_reorder; /* do we need channel reordering */
int pi_chan_table[AOUT_CHAN_MAX]; uint8_t chan_table[AOUT_CHAN_MAX];
uint32_t i_channel_mask; uint32_t i_channel_mask;
uint32_t i_bits_per_sample; uint32_t i_bits_per_sample;
uint32_t i_channels; uint32_t i_channels;
...@@ -785,12 +785,11 @@ static int CreateDSBuffer( audio_output_t *p_aout, int i_format, ...@@ -785,12 +785,11 @@ static int CreateDSBuffer( audio_output_t *p_aout, int i_format,
p_aout->sys->i_frame_size = i_bytes_per_frame; p_aout->sys->i_frame_size = i_bytes_per_frame;
p_aout->sys->i_channel_mask = waveformat.dwChannelMask; p_aout->sys->i_channel_mask = waveformat.dwChannelMask;
p_aout->sys->b_chan_reorder = p_aout->sys->chans_to_reorder =
aout_CheckChannelReorder( pi_channels_in, pi_channels_out, aout_CheckChannelReorder( pi_channels_in, pi_channels_out,
waveformat.dwChannelMask, waveformat.dwChannelMask,
p_aout->sys->pi_chan_table ); p_aout->sys->chan_table );
if( p_aout->sys->chans_to_reorder )
if( p_aout->sys->b_chan_reorder )
{ {
msg_Dbg( p_aout, "channel reordering needed" ); msg_Dbg( p_aout, "channel reordering needed" );
} }
...@@ -900,13 +899,11 @@ static int FillBuffer( audio_output_t *p_aout, int i_frame, block_t *p_buffer ) ...@@ -900,13 +899,11 @@ static int FillBuffer( audio_output_t *p_aout, int i_frame, block_t *p_buffer )
} }
else else
{ {
if( p_sys->b_chan_reorder ) if( p_sys->chans_to_reorder )
{
/* Do the channel reordering here */ /* Do the channel reordering here */
aout_ChannelReorder( p_buffer->p_buffer, p_buffer->i_buffer, aout_ChannelReorder( p_buffer->p_buffer, p_buffer->i_buffer,
p_sys->i_channels, p_sys->pi_chan_table, p_sys->chans_to_reorder, p_sys->chan_table,
p_sys->i_bits_per_sample ); p_sys->i_bits_per_sample );
}
memcpy( p_write_position, p_buffer->p_buffer, l_bytes1 ); memcpy( p_write_position, p_buffer->p_buffer, l_bytes1 );
block_Release( p_buffer ); block_Release( p_buffer );
......
...@@ -119,8 +119,8 @@ struct aout_sys_t ...@@ -119,8 +119,8 @@ struct aout_sys_t
bool soft_mute; bool soft_mute;
}; };
bool b_chan_reorder; /* do we need channel reordering */ uint8_t chans_to_reorder; /* do we need channel reordering */
int pi_chan_table[AOUT_CHAN_MAX]; uint8_t chan_table[AOUT_CHAN_MAX];
}; };
#include "volume.h" #include "volume.h"
...@@ -657,15 +657,12 @@ static int OpenWaveOut( audio_output_t *p_aout, uint32_t i_device_id, int i_form ...@@ -657,15 +657,12 @@ static int OpenWaveOut( audio_output_t *p_aout, uint32_t i_device_id, int i_form
return VLC_EGENERIC; return VLC_EGENERIC;
} }
p_aout->sys->b_chan_reorder = p_aout->sys->chans_to_reorder =
aout_CheckChannelReorder( pi_channels_in, pi_channels_out, aout_CheckChannelReorder( pi_channels_in, pi_channels_out,
waveformat.dwChannelMask, waveformat.dwChannelMask,
p_aout->sys->pi_chan_table ); p_aout->sys->chan_table );
if( p_aout->sys->chans_to_reorder )
if( p_aout->sys->b_chan_reorder )
{
msg_Dbg( p_aout, "channel reordering needed" ); msg_Dbg( p_aout, "channel reordering needed" );
}
return VLC_SUCCESS; return VLC_SUCCESS;
...@@ -924,12 +921,12 @@ static void* WaveOutThread( void *data ) ...@@ -924,12 +921,12 @@ static void* WaveOutThread( void *data )
} }
/* Do the channel reordering */ /* Do the channel reordering */
if( p_buffer && p_sys->b_chan_reorder ) if( p_buffer && p_sys->chans_to_reorder )
{ {
aout_ChannelReorder( p_buffer->p_buffer, aout_ChannelReorder( p_buffer->p_buffer,
p_buffer->i_buffer, p_buffer->i_buffer,
p_sys->waveformat.Format.nChannels, p_sys->waveformat.Format.nChannels,
p_sys->pi_chan_table, p_sys->chan_table,
p_sys->waveformat.Format.wBitsPerSample ); p_sys->waveformat.Format.wBitsPerSample );
} }
......
...@@ -263,7 +263,6 @@ end: ...@@ -263,7 +263,6 @@ end:
static int ProcessInitialHeader( decoder_t *p_dec, ogg_packet *p_oggpacket ) static int ProcessInitialHeader( decoder_t *p_dec, ogg_packet *p_oggpacket )
{ {
int err; int err;
int pi_chan_table[AOUT_CHAN_MAX];
unsigned char new_stream_map[8]; unsigned char new_stream_map[8];
decoder_sys_t *p_sys = p_dec->p_sys; decoder_sys_t *p_sys = p_dec->p_sys;
...@@ -296,6 +295,8 @@ static int ProcessInitialHeader( decoder_t *p_dec, ogg_packet *p_oggpacket ) ...@@ -296,6 +295,8 @@ static int ProcessInitialHeader( decoder_t *p_dec, ogg_packet *p_oggpacket )
static const uint32_t *pi_ch[6] = { pi_3channels_in, pi_4channels_in, static const uint32_t *pi_ch[6] = { pi_3channels_in, pi_4channels_in,
pi_5channels_in, pi_6channels_in, pi_5channels_in, pi_6channels_in,
pi_7channels_in, pi_8channels_in }; pi_7channels_in, pi_8channels_in };
uint8_t pi_chan_table[AOUT_CHAN_MAX];
aout_CheckChannelReorder( pi_ch[p_header->channels-3], NULL, aout_CheckChannelReorder( pi_ch[p_header->channels-3], NULL,
p_dec->fmt_out.audio.i_physical_channels, p_dec->fmt_out.audio.i_physical_channels,
pi_chan_table ); pi_chan_table );
......
...@@ -88,7 +88,7 @@ struct decoder_sys_t ...@@ -88,7 +88,7 @@ struct decoder_sys_t
/* /*
** Channel reordering ** Channel reordering
*/ */
int pi_chan_table[AOUT_CHAN_MAX]; uint8_t pi_chan_table[AOUT_CHAN_MAX];
}; };
static const int pi_channels_maps[9] = static const int pi_channels_maps[9] =
...@@ -658,12 +658,15 @@ static void ConfigureChannelOrder(int *pi_chan_table, int i_channels, uint32_t i ...@@ -658,12 +658,15 @@ static void ConfigureChannelOrder(int *pi_chan_table, int i_channels, uint32_t i
} }
} }
uint8_t tab[AOUT_CHAN_MAX];
if( b_decode ) if( b_decode )
aout_CheckChannelReorder( pi_channels_in, NULL, aout_CheckChannelReorder( pi_channels_in, NULL,
i_channel_mask, pi_chan_table ); i_channel_mask, tab );
else else
aout_CheckChannelReorder( NULL, pi_channels_in, aout_CheckChannelReorder( NULL, pi_channels_in,
i_channel_mask, pi_chan_table ); i_channel_mask, tab );
for( int i = 0; i < i_channels; i++)
pi_chan_table[i] = tab[i];
} }
/***************************************************************************** /*****************************************************************************
......
...@@ -69,8 +69,8 @@ struct demux_sys_t ...@@ -69,8 +69,8 @@ struct demux_sys_t
date_t pts; date_t pts;
uint32_t i_channel_mask; uint32_t i_channel_mask;
bool b_chan_reorder; /* do we need channel reordering */ uint8_t i_chans_to_reorder; /* do we need channel reordering */
int pi_chan_table[AOUT_CHAN_MAX]; uint8_t pi_chan_table[AOUT_CHAN_MAX];
}; };
static int ChunkFind( demux_t *, const char *, unsigned int * ); static int ChunkFind( demux_t *, const char *, unsigned int * );
...@@ -123,7 +123,7 @@ static int Open( vlc_object_t * p_this ) ...@@ -123,7 +123,7 @@ static int Open( vlc_object_t * p_this )
return VLC_ENOMEM; return VLC_ENOMEM;
p_sys->p_es = NULL; p_sys->p_es = NULL;
p_sys->b_chan_reorder = false; p_sys->i_chans_to_reorder = 0;
p_sys->i_channel_mask = 0; p_sys->i_channel_mask = 0;
/* skip riff header */ /* skip riff header */
...@@ -270,13 +270,13 @@ static int Open( vlc_object_t * p_this ) ...@@ -270,13 +270,13 @@ static int Open( vlc_object_t * p_this )
if( p_sys->fmt.i_codec == VLC_FOURCC('a','r','a','w') || if( p_sys->fmt.i_codec == VLC_FOURCC('a','r','a','w') ||
p_sys->fmt.i_codec == VLC_FOURCC('p','c','m',' ') || p_sys->fmt.i_codec == VLC_FOURCC('p','c','m',' ') ||
p_sys->fmt.i_codec == VLC_FOURCC('a','f','l','t') ) p_sys->fmt.i_codec == VLC_FOURCC('a','f','l','t') )
p_sys->b_chan_reorder = p_sys->i_chans_to_reorder =
aout_CheckChannelReorder( pi_channels_in, NULL, aout_CheckChannelReorder( pi_channels_in, NULL,
p_sys->i_channel_mask, p_sys->i_channel_mask,
p_sys->pi_chan_table ); p_sys->pi_chan_table );
msg_Dbg( p_demux, "channel mask: %x, reordering: %i", msg_Dbg( p_demux, "channel mask: %x, reordering: %u",
p_sys->i_channel_mask, (int)p_sys->b_chan_reorder ); p_sys->i_channel_mask, p_sys->i_chans_to_reorder );
} }
p_sys->fmt.audio.i_physical_channels = p_sys->fmt.audio.i_physical_channels =
...@@ -427,7 +427,7 @@ static int Demux( demux_t *p_demux ) ...@@ -427,7 +427,7 @@ static int Demux( demux_t *p_demux )
es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_block->i_pts ); es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_block->i_pts );
/* Do the channel reordering */ /* Do the channel reordering */
if( p_sys->b_chan_reorder ) if( p_sys->i_chans_to_reorder )
aout_ChannelReorder( p_block->p_buffer, p_block->i_buffer, aout_ChannelReorder( p_block->p_buffer, p_block->i_buffer,
p_sys->fmt.audio.i_channels, p_sys->fmt.audio.i_channels,
p_sys->pi_chan_table, p_sys->pi_chan_table,
......
...@@ -75,8 +75,8 @@ struct sout_mux_sys_t ...@@ -75,8 +75,8 @@ struct sout_mux_sys_t
uint32_t waveheader2[2]; uint32_t waveheader2[2];
uint32_t i_channel_mask; uint32_t i_channel_mask;
bool b_chan_reorder; /* do we need channel reordering */ uint8_t i_chans_to_reorder; /* do we need channel reordering */
int pi_chan_table[AOUT_CHAN_MAX]; uint8_t pi_chan_table[AOUT_CHAN_MAX];
}; };
static const uint32_t pi_channels_in[] = static const uint32_t pi_channels_in[] =
...@@ -111,7 +111,7 @@ static int Open( vlc_object_t *p_this ) ...@@ -111,7 +111,7 @@ static int Open( vlc_object_t *p_this )
p_sys->b_header = true; p_sys->b_header = true;
p_sys->i_data = 0; p_sys->i_data = 0;
p_sys->b_chan_reorder = 0; p_sys->i_chans_to_reorder = 0;
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -185,13 +185,13 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input ) ...@@ -185,13 +185,13 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input )
if( p_input->p_fmt->audio.i_physical_channels & pi_vlc_chan_order_wg4[i]) if( p_input->p_fmt->audio.i_physical_channels & pi_vlc_chan_order_wg4[i])
p_sys->i_channel_mask |= pi_channels_in[i]; p_sys->i_channel_mask |= pi_channels_in[i];
p_sys->b_chan_reorder = p_sys->i_chans_to_reorder =
aout_CheckChannelReorder( pi_channels_in, pi_channels_out, aout_CheckChannelReorder( pi_channels_in, pi_channels_out,
p_sys->i_channel_mask, p_sys->i_channel_mask,
p_sys->pi_chan_table ); p_sys->pi_chan_table );
msg_Dbg( p_mux, "channel mask: %x, reordering: %i", msg_Dbg( p_mux, "channel mask: %x, reordering: %u",
p_sys->i_channel_mask, (int)p_sys->b_chan_reorder ); p_sys->i_channel_mask, p_sys->i_chans_to_reorder );
} }
fourcc_to_wf_tag( p_input->p_fmt->i_codec, &i_format ); fourcc_to_wf_tag( p_input->p_fmt->i_codec, &i_format );
...@@ -290,9 +290,9 @@ static int Mux( sout_mux_t *p_mux ) ...@@ -290,9 +290,9 @@ static int Mux( sout_mux_t *p_mux )
p_sys->i_data += p_block->i_buffer; p_sys->i_data += p_block->i_buffer;
/* Do the channel reordering */ /* Do the channel reordering */
if( p_sys->b_chan_reorder ) if( p_sys->i_chans_to_reorder )
aout_ChannelReorder( p_block->p_buffer, p_block->i_buffer, aout_ChannelReorder( p_block->p_buffer, p_block->i_buffer,
p_input->p_fmt->audio.i_channels, p_sys->i_chans_to_reorder,
p_sys->pi_chan_table, p_sys->pi_chan_table,
p_input->p_fmt->audio.i_bitspersample ); p_input->p_fmt->audio.i_bitspersample );
......
...@@ -243,7 +243,7 @@ void aout_FormatsPrint( vlc_object_t *obj, const char * psz_text, ...@@ -243,7 +243,7 @@ void aout_FormatsPrint( vlc_object_t *obj, const char * psz_text,
*****************************************************************************/ *****************************************************************************/
unsigned aout_CheckChannelReorder( const uint32_t *chans_in, unsigned aout_CheckChannelReorder( const uint32_t *chans_in,
const uint32_t *chans_out, const uint32_t *chans_out,
uint32_t mask, int *restrict table ) uint32_t mask, uint8_t *restrict table )
{ {
unsigned channels = 0; unsigned channels = 0;
...@@ -276,7 +276,7 @@ unsigned aout_CheckChannelReorder( const uint32_t *chans_in, ...@@ -276,7 +276,7 @@ unsigned aout_CheckChannelReorder( const uint32_t *chans_in,
* aout_ChannelReorder : * aout_ChannelReorder :
*****************************************************************************/ *****************************************************************************/
void aout_ChannelReorder( void *ptr, size_t bytes, unsigned channels, void aout_ChannelReorder( void *ptr, size_t bytes, unsigned channels,
const int *pi_chan_table, unsigned bits_per_sample ) const uint8_t *chans_table, unsigned bits_per_sample )
{ {
size_t samples = bytes / (channels * (bits_per_sample >> 3)); size_t samples = bytes / (channels * (bits_per_sample >> 3));
...@@ -293,7 +293,7 @@ void aout_ChannelReorder( void *ptr, size_t bytes, unsigned channels, ...@@ -293,7 +293,7 @@ void aout_ChannelReorder( void *ptr, size_t bytes, unsigned channels,
uint32_t tmp[AOUT_CHAN_MAX]; uint32_t tmp[AOUT_CHAN_MAX];
for( size_t j = 0; j < channels; j++ ) for( size_t j = 0; j < channels; j++ )
tmp[pi_chan_table[j]] = buf[j]; tmp[chans_table[j]] = buf[j];
memcpy( buf, tmp, 4 * channels ); memcpy( buf, tmp, 4 * channels );
buf += channels; buf += channels;
...@@ -310,7 +310,7 @@ void aout_ChannelReorder( void *ptr, size_t bytes, unsigned channels, ...@@ -310,7 +310,7 @@ void aout_ChannelReorder( void *ptr, size_t bytes, unsigned channels,
uint16_t tmp[AOUT_CHAN_MAX]; uint16_t tmp[AOUT_CHAN_MAX];
for( size_t j = 0; j < channels; j++ ) for( size_t j = 0; j < channels; j++ )
tmp[pi_chan_table[j]] = buf[j]; tmp[chans_table[j]] = buf[j];
memcpy( buf, tmp, 2 * channels ); memcpy( buf, tmp, 2 * channels );
buf += channels; buf += channels;
...@@ -327,7 +327,7 @@ void aout_ChannelReorder( void *ptr, size_t bytes, unsigned channels, ...@@ -327,7 +327,7 @@ void aout_ChannelReorder( void *ptr, size_t bytes, unsigned channels,
uint8_t tmp[AOUT_CHAN_MAX]; uint8_t tmp[AOUT_CHAN_MAX];
for( size_t j = 0; j < channels; j++ ) for( size_t j = 0; j < channels; j++ )
tmp[pi_chan_table[j]] = buf[j]; tmp[chans_table[j]] = buf[j];
memcpy( buf, tmp, channels ); memcpy( buf, tmp, channels );
buf += channels; buf += channels;
...@@ -344,7 +344,7 @@ void aout_ChannelReorder( void *ptr, size_t bytes, unsigned channels, ...@@ -344,7 +344,7 @@ void aout_ChannelReorder( void *ptr, size_t bytes, unsigned channels,
uint8_t tmp[3 * AOUT_CHAN_MAX]; uint8_t tmp[3 * AOUT_CHAN_MAX];
for( size_t j = 0; j < channels; j++ ) for( size_t j = 0; j < channels; j++ )
memcpy( tmp + (3 * pi_chan_table[j]), buf + (3 * j), 3 ); memcpy( tmp + (3 * chans_table[j]), buf + (3 * j), 3 );
memcpy( buf, tmp, 3 * channels ); memcpy( buf, tmp, 3 * channels );
buf += 3 * 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