vlc | branch: master | Francois Cartegnie <[email protected]> | Mon Feb 27 17:14:34 2017 +0100| [065258d411b4c34f56b550589f576c339f146241] | committer: Francois Cartegnie
codec: faad: move away mpeg4 audiospecific table > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=065258d411b4c34f56b550589f576c339f146241 --- modules/codec/Makefile.am | 2 +- modules/codec/faad.c | 46 +++++++++------------------ modules/packetizer/mpeg4audio.h | 69 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 32 deletions(-) diff --git a/modules/codec/Makefile.am b/modules/codec/Makefile.am index c3be95a..343f17e 100644 --- a/modules/codec/Makefile.am +++ b/modules/codec/Makefile.am @@ -40,7 +40,7 @@ libaraw_plugin_la_SOURCES = codec/araw.c libaraw_plugin_la_LIBADD = $(LIBM) codec_LTLIBRARIES += libaraw_plugin.la -libfaad_plugin_la_SOURCES = codec/faad.c +libfaad_plugin_la_SOURCES = codec/faad.c packetizer/mpeg4audio.h libfaad_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_faad) libfaad_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(codecdir)' libfaad_plugin_la_LIBADD = $(LIBS_faad) $(LIBM) diff --git a/modules/codec/faad.c b/modules/codec/faad.c index adb5069..b10c957 100644 --- a/modules/codec/faad.c +++ b/modules/codec/faad.c @@ -41,6 +41,7 @@ #include <vlc_cpu.h> #include <neaacdec.h> +#include "../packetizer/mpeg4audio.h" /***************************************************************************** * Module descriptor @@ -63,8 +64,6 @@ static int DecodeBlock( decoder_t *, block_t * ); static void Flush( decoder_t * ); static void DoReordering( uint32_t *, uint32_t *, int, int, uint32_t * ); -#define MAX_CHANNEL_POSITIONS 9 - struct decoder_sys_t { /* faad handler */ @@ -77,43 +76,28 @@ struct decoder_sys_t block_t *p_block; /* Channel positions of the current stream (for re-ordering) */ - uint32_t pi_channel_positions[MAX_CHANNEL_POSITIONS]; + uint32_t pi_channel_positions[MPEG4_ASC_MAX_INDEXEDPOS]; bool b_sbr, b_ps, b_discontinuity; }; -static const uint32_t pi_channels_in[MAX_CHANNEL_POSITIONS] = +/* 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[MAX_CHANNEL_POSITIONS] = +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[MAX_CHANNEL_POSITIONS] = +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 }; -static const uint32_t pi_channels_guessed[MAX_CHANNEL_POSITIONS] = - { 0, AOUT_CHAN_CENTER, AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT, - AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_LFE, - AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_REARLEFT - | AOUT_CHAN_REARRIGHT, - AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_REARLEFT - | AOUT_CHAN_REARRIGHT | AOUT_CHAN_CENTER, - AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_REARLEFT - | AOUT_CHAN_REARRIGHT | AOUT_CHAN_CENTER | AOUT_CHAN_LFE, - AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_MIDDLELEFT - | AOUT_CHAN_MIDDLERIGHT | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT - | AOUT_CHAN_CENTER, - AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_MIDDLELEFT - | AOUT_CHAN_MIDDLERIGHT | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT - | AOUT_CHAN_CENTER | AOUT_CHAN_LFE - }; /***************************************************************************** * OpenDecoder: probe the decoder and return score @@ -170,7 +154,7 @@ static int Open( vlc_object_t *p_this ) p_dec->fmt_out.audio.i_channels = i_channels; p_dec->fmt_out.audio.i_physical_channels = p_dec->fmt_out.audio.i_original_channels - = pi_channels_guessed[i_channels]; + = mpeg4_asc_channelsbyindex[i_channels]; date_Init( &p_sys->date, i_rate, 1 ); } else @@ -305,7 +289,7 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block ) p_dec->fmt_out.audio.i_channels = i_channels; p_dec->fmt_out.audio.i_physical_channels = p_dec->fmt_out.audio.i_original_channels - = pi_channels_guessed[i_channels]; + = mpeg4_asc_channelsbyindex[i_channels]; date_Init( &p_sys->date, i_rate, 1 ); } @@ -328,7 +312,7 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block ) p_dec->fmt_out.audio.i_channels = i_channels; p_dec->fmt_out.audio.i_physical_channels = p_dec->fmt_out.audio.i_original_channels - = pi_channels_guessed[i_channels]; + = mpeg4_asc_channelsbyindex[i_channels]; date_Init( &p_sys->date, i_rate, 1 ); } @@ -397,7 +381,7 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block ) p_dec->fmt_out.audio.i_channels = i_channels; p_dec->fmt_out.audio.i_physical_channels = p_dec->fmt_out.audio.i_original_channels - = pi_channels_guessed[i_channels]; + = mpeg4_asc_channelsbyindex[i_channels]; date_Init( &p_sys->date, i_rate, 1 ); } } @@ -460,12 +444,12 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block ) for( unsigned i = 0; i < nbChannels; i++ ) { /* Find the channel code */ - for( j = 0; j < MAX_CHANNEL_POSITIONS; j++ ) + for( j = 0; j < MPEG4_ASC_MAX_INDEXEDPOS; j++ ) { if( frame.channel_position[i] == pi_channels_in[j] ) break; } - if( j >= MAX_CHANNEL_POSITIONS ) + if( j >= MPEG4_ASC_MAX_INDEXEDPOS ) { msg_Warn( p_dec, "unknown channel ordering" ); /* Invent something */ @@ -482,7 +466,7 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block ) { p_dec->fmt_out.audio.i_physical_channels = p_dec->fmt_out.audio.i_original_channels - = pi_channels_guessed[nbChannels]; + = mpeg4_asc_channelsbyindex[nbChannels]; } else { @@ -549,11 +533,11 @@ static void Close( vlc_object_t *p_this ) static void DoReordering( uint32_t *p_out, uint32_t *p_in, int i_samples, int i_nb_channels, uint32_t *pi_chan_positions ) { - int pi_chan_table[MAX_CHANNEL_POSITIONS] = {0}; + int pi_chan_table[MPEG4_ASC_MAX_INDEXEDPOS] = {0}; int i, j, k; /* Find the channels mapping */ - for( i = 0, j = 0; i < MAX_CHANNEL_POSITIONS; i++ ) + for( i = 0, j = 0; i < MPEG4_ASC_MAX_INDEXEDPOS; i++ ) { for( k = 0; k < i_nb_channels; k++ ) { diff --git a/modules/packetizer/mpeg4audio.h b/modules/packetizer/mpeg4audio.h new file mode 100644 index 0000000..27f1b24 --- /dev/null +++ b/modules/packetizer/mpeg4audio.h @@ -0,0 +1,69 @@ +/***************************************************************************** + * mpeg4audio.h: MPEG 4 audio definitions + ***************************************************************************** + * Copyright (C) 2001-2017 VLC authors and VideoLAN + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ +enum +{ + AOT_AAC_MAIN = 1, + AOT_AAC_LC, + AOT_AAC_SSR, + AOT_AAC_LTP, + AOT_AAC_SBR, + AOT_AAC_SC, + AOT_ER_AAC_LC = 17, + AOT_ER_AAC_LTP = 19, + AOT_ER_AAC_SC = 20, + AOT_ER_AAC_LD = 23, + AOT_AAC_PS = 29, + AOT_ER_AAC_ELD = 39, +}; + +enum +{ + AAC_PROFILE_MAIN = AOT_AAC_MAIN - 1, + AAC_PROFILE_LC, + AAC_PROFILE_SSR, + AAC_PROFILE_LTP, +}; + +#define MPEG4_ASC_MAX_INDEXEDPOS 9 + +static const uint32_t mpeg4_asc_channelsbyindex[MPEG4_ASC_MAX_INDEXEDPOS] = +{ + 0, /* Set later */ + + AOUT_CHAN_CENTER, AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT, + + AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_LFE, + + AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT, + + AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT | + AOUT_CHAN_CENTER, + + AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT | + AOUT_CHAN_CENTER | AOUT_CHAN_LFE, + + AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_MIDDLELEFT | + AOUT_CHAN_MIDDLERIGHT | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT | + AOUT_CHAN_CENTER, + + AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_MIDDLELEFT | + AOUT_CHAN_MIDDLERIGHT | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT | + AOUT_CHAN_CENTER | AOUT_CHAN_LFE +}; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
