[vlc-commits] codec: faad: use aout_channel_reorder and simplify
Francois Cartegnie
git at videolan.org
Mon Feb 27 23:08:22 CET 2017
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Mon Feb 27 19:35:39 2017 +0100| [2fd09b071cb1f39435f9e276f5824d46261150d5] | committer: Francois Cartegnie
codec: faad: use aout_channel_reorder and simplify
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=2fd09b071cb1f39435f9e276f5824d46261150d5
---
modules/codec/faad.c | 165 ++++++++++++++++++++++-----------------------------
1 file changed, 70 insertions(+), 95 deletions(-)
diff --git a/modules/codec/faad.c b/modules/codec/faad.c
index b10c957..938424d 100644
--- a/modules/codec/faad.c
+++ b/modules/codec/faad.c
@@ -39,6 +39,7 @@
#include <vlc_input.h>
#include <vlc_codec.h>
#include <vlc_cpu.h>
+#include <vlc_aout.h>
#include <neaacdec.h>
#include "../packetizer/mpeg4audio.h"
@@ -62,7 +63,7 @@ vlc_module_end ()
****************************************************************************/
static int DecodeBlock( decoder_t *, block_t * );
static void Flush( decoder_t * );
-static void DoReordering( uint32_t *, uint32_t *, int, int, uint32_t * );
+static void DoReordering( uint32_t *, uint32_t *, int, int, uint8_t * );
struct decoder_sys_t
{
@@ -81,23 +82,24 @@ struct decoder_sys_t
bool b_sbr, b_ps, b_discontinuity;
};
-/* Channels positions values as output by faad */
-static const uint32_t pi_channels_in[MPEG4_ASC_MAX_INDEXEDPOS] =
- { FRONT_CHANNEL_CENTER, FRONT_CHANNEL_LEFT, FRONT_CHANNEL_RIGHT,
- SIDE_CHANNEL_LEFT, SIDE_CHANNEL_RIGHT,
- BACK_CHANNEL_LEFT, BACK_CHANNEL_RIGHT,
- BACK_CHANNEL_CENTER, LFE_CHANNEL };
-static const uint32_t pi_channels_out[MPEG4_ASC_MAX_INDEXEDPOS] =
- { AOUT_CHAN_CENTER, AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT,
- AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_MIDDLERIGHT,
- AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT,
- AOUT_CHAN_REARCENTER, AOUT_CHAN_LFE };
-static const uint32_t pi_channels_ordered[MPEG4_ASC_MAX_INDEXEDPOS] =
- { AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT,
- AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_MIDDLERIGHT,
- AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT,
- AOUT_CHAN_CENTER, AOUT_CHAN_REARCENTER, AOUT_CHAN_LFE
- };
+#if MPEG4_ASC_MAX_INDEXEDPOS != LFE_CHANNEL
+ #error MPEG4_ASC_MAX_INDEXEDPOS != LFE_CHANNEL
+#endif
+
+#define FAAD_CHANNEL_ID_COUNT (LFE_CHANNEL + 1)
+static const uint32_t pi_tovlcmapping[FAAD_CHANNEL_ID_COUNT] =
+{
+ [UNKNOWN_CHANNEL] = 0,
+ [FRONT_CHANNEL_CENTER] = AOUT_CHAN_CENTER,
+ [FRONT_CHANNEL_LEFT] = AOUT_CHAN_LEFT,
+ [FRONT_CHANNEL_RIGHT] = AOUT_CHAN_RIGHT,
+ [SIDE_CHANNEL_LEFT] = AOUT_CHAN_MIDDLELEFT,
+ [SIDE_CHANNEL_RIGHT] = AOUT_CHAN_MIDDLERIGHT,
+ [BACK_CHANNEL_LEFT] = AOUT_CHAN_REARLEFT,
+ [BACK_CHANNEL_RIGHT] = AOUT_CHAN_REARRIGHT,
+ [BACK_CHANNEL_CENTER] = AOUT_CHAN_REARCENTER,
+ [LFE_CHANNEL] = AOUT_CHAN_LFE
+};
/*****************************************************************************
* OpenDecoder: probe the decoder and return score
@@ -332,7 +334,7 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block )
{
void *samples;
NeAACDecFrameInfo frame;
- block_t *p_out;
+ block_t *p_out = NULL;
samples = NeAACDecDecode( p_sys->hfaad, &frame,
p_sys->p_block->p_buffer,
@@ -416,7 +418,6 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block )
}
p_dec->fmt_out.audio.i_rate = frame.samplerate;
- p_dec->fmt_out.audio.i_channels = frame.channels;
/* Adjust stream info when dealing with SBR/PS */
bool b_sbr = (frame.sbr == 1) || (frame.sbr == 2);
@@ -439,69 +440,56 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block )
/* Convert frame.channel_position to our own channel values */
p_dec->fmt_out.audio.i_physical_channels = 0;
- const uint32_t nbChannels = frame.channels;
- unsigned j;
- for( unsigned i = 0; i < nbChannels; i++ )
+ uint32_t pi_faad_channels_positions[FAAD_CHANNEL_ID_COUNT] = {0};
+ uint8_t pi_neworder_table[AOUT_CHAN_MAX];
+ for( size_t i = 0; i < frame.channels; i++ )
{
- /* Find the channel code */
- for( j = 0; j < MPEG4_ASC_MAX_INDEXEDPOS; j++ )
+ unsigned pos = frame.channel_position[i];
+ if( likely(pos < FAAD_CHANNEL_ID_COUNT) )
{
- if( frame.channel_position[i] == pi_channels_in[j] )
- break;
+ pi_faad_channels_positions[i] = pi_tovlcmapping[pos];
+ p_dec->fmt_out.audio.i_physical_channels |= pi_faad_channels_positions[i];
}
- if( j >= MPEG4_ASC_MAX_INDEXEDPOS )
- {
- msg_Warn( p_dec, "unknown channel ordering" );
- /* Invent something */
- j = i;
- }
- /* */
- p_sys->pi_channel_positions[i] = pi_channels_out[j];
- if( p_dec->fmt_out.audio.i_physical_channels & pi_channels_out[j] )
- frame.channels--; /* We loose a duplicated channel */
- else
- p_dec->fmt_out.audio.i_physical_channels |= pi_channels_out[j];
- }
- if ( nbChannels != frame.channels )
- {
- p_dec->fmt_out.audio.i_physical_channels
- = p_dec->fmt_out.audio.i_original_channels
- = mpeg4_asc_channelsbyindex[nbChannels];
+ else pi_faad_channels_positions[i] = 0;
}
- else
+
+ aout_CheckChannelReorder( pi_faad_channels_positions, NULL,
+ p_dec->fmt_out.audio.i_physical_channels, pi_neworder_table );
+
+
+ p_dec->fmt_out.audio.i_original_channels = p_dec->fmt_out.audio.i_physical_channels;
+ p_dec->fmt_out.audio.i_channels = popcount(p_dec->fmt_out.audio.i_physical_channels);
+
+ if( !decoder_UpdateAudioFormat( p_dec ) && p_dec->fmt_out.audio.i_channels > 0 )
+ p_out = decoder_NewAudioBuffer( p_dec, frame.samples / p_dec->fmt_out.audio.i_channels );
+
+ if( p_out )
{
- p_dec->fmt_out.audio.i_original_channels =
- p_dec->fmt_out.audio.i_physical_channels;
+ p_out->i_pts = date_Get( &p_sys->date );
+ p_out->i_length = date_Increment( &p_sys->date,
+ frame.samples / frame.channels )
+ - p_out->i_pts;
+
+ /* FIXME: replace when aout_channel_reorder can take samples from a different buffer */
+ DoReordering( (uint32_t *)p_out->p_buffer, samples,
+ frame.samples / frame.channels, frame.channels,
+ pi_neworder_table );
+
+ if( p_sys->b_discontinuity )
+ {
+ p_out->i_flags |= BLOCK_FLAG_DISCONTINUITY;
+ p_sys->b_discontinuity = false;
+ }
+
+ decoder_QueueAudio( p_dec, p_out );
}
- p_dec->fmt_out.audio.i_channels = nbChannels;
- if( decoder_UpdateAudioFormat( p_dec ) )
- p_out = NULL;
else
- p_out = decoder_NewAudioBuffer( p_dec, frame.samples / nbChannels );
- if( p_out == NULL )
{
- FlushBuffer( p_sys, SIZE_MAX );
- return VLCDEC_SUCCESS;
+ date_Increment( &p_sys->date, frame.samples / frame.channels );
}
- p_out->i_pts = date_Get( &p_sys->date );
- p_out->i_length = date_Increment( &p_sys->date,
- frame.samples / nbChannels )
- - p_out->i_pts;
-
- DoReordering( (uint32_t *)p_out->p_buffer, samples,
- frame.samples / nbChannels, nbChannels,
- p_sys->pi_channel_positions );
-
FlushBuffer( p_sys, frame.bytesconsumed );
- if( p_sys->b_discontinuity )
- {
- p_out->i_flags |= BLOCK_FLAG_DISCONTINUITY;
- p_sys->b_discontinuity = false;
- }
-
- decoder_QueueAudio( p_dec, p_out );
return VLCDEC_SUCCESS;
}
else
@@ -531,34 +519,21 @@ static void Close( vlc_object_t *p_this )
* different from the aac one).
*****************************************************************************/
static void DoReordering( uint32_t *p_out, uint32_t *p_in, int i_samples,
- int i_nb_channels, uint32_t *pi_chan_positions )
+ int i_nb_channels, uint8_t *pi_chan_positions )
{
- int pi_chan_table[MPEG4_ASC_MAX_INDEXEDPOS] = {0};
- int i, j, k;
-
- /* Find the channels mapping */
- for( i = 0, j = 0; i < MPEG4_ASC_MAX_INDEXEDPOS; i++ )
+#if HAVE_FPU
+ #define CAST_SAMPLE(a) a
+#else
+ #define CAST_SAMPLE(a) ((uint16_t *)a)
+#endif
+ /* Do the actual reordering */
+ for( int i = 0; i < i_samples; i++ )
{
- for( k = 0; k < i_nb_channels; k++ )
+ for( int j = 0; j < i_nb_channels; j++ )
{
- if( pi_channels_ordered[i] == pi_chan_positions[k] )
- {
- pi_chan_table[k] = j++;
- break;
- }
+ CAST_SAMPLE(p_out)[i * i_nb_channels + pi_chan_positions[j]] =
+ CAST_SAMPLE(p_in)[i * i_nb_channels + j];
}
}
-
- /* Do the actual reordering */
- if( HAVE_FPU )
- for( i = 0; i < i_samples; i++ )
- for( j = 0; j < i_nb_channels; j++ )
- p_out[i * i_nb_channels + pi_chan_table[j]] =
- p_in[i * i_nb_channels + j];
- else
- for( i = 0; i < i_samples; i++ )
- for( j = 0; j < i_nb_channels; j++ )
- ((uint16_t *)p_out)[i * i_nb_channels + pi_chan_table[j]] =
- ((uint16_t *)p_in)[i * i_nb_channels + j];
}
More information about the vlc-commits
mailing list