X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faudio_filter%2Fconverter%2Fa52tofloat32.c;h=c78633e950e9e14d937581236c4be1a94cd84e89;hb=d3ed2c8a6461deae52a59bc1612b3828bafad86a;hp=4e22aba2dde6616f8e8e37103b160f7c34543f59;hpb=fe087a38282e93addb25fa9598393e40ea233b09;p=vlc diff --git a/modules/audio_filter/converter/a52tofloat32.c b/modules/audio_filter/converter/a52tofloat32.c index 4e22aba2dd..c78633e950 100644 --- a/modules/audio_filter/converter/a52tofloat32.c +++ b/modules/audio_filter/converter/a52tofloat32.c @@ -8,12 +8,12 @@ * * Authors: Gildas Bazin * Christophe Massiot - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 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 @@ -21,16 +21,19 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** * Preamble *****************************************************************************/ -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include -#include /* malloc(), free() */ -#include /* strdup() */ #ifdef HAVE_STDINT_H # include /* int16_t .. */ #elif HAVE_INTTYPES_H @@ -47,16 +50,16 @@ # include "a52dec/a52.h" #endif -#include -#include "aout_internal.h" -#include "vlc_filter.h" +#include +#include +#include /***************************************************************************** * Local prototypes *****************************************************************************/ static int Create ( vlc_object_t * ); static void Destroy ( vlc_object_t * ); -static void DoWork ( aout_instance_t *, aout_filter_t *, aout_buffer_t *, +static void DoWork ( aout_instance_t *, aout_filter_t *, aout_buffer_t *, aout_buffer_t * ); static int Open ( vlc_object_t *, filter_sys_t *, audio_format_t, audio_format_t ); @@ -80,9 +83,9 @@ static const uint32_t pi_channels_out[] = struct filter_sys_t { a52_state_t * p_liba52; /* liba52 internal structure */ - vlc_bool_t b_dynrng; /* see below */ + bool b_dynrng; /* see below */ int i_flags; /* liba52 flags, see a52dec/doc/liba52.txt */ - vlc_bool_t b_dontwarn; + bool b_dontwarn; int i_nb_channels; /* number of float32 per sample */ int pi_chan_table[AOUT_CHAN_MAX]; /* channel reordering */ @@ -98,18 +101,22 @@ struct filter_sys_t "environment without disturbing anyone. If you disable the dynamic range "\ "compression the playback will be more adapted to a movie theater or a " \ "listening room.") +#define UPMIX_TEXT N_("Enable internal upmixing") +#define UPMIX_LONGTEXT N_( \ + "Enable the internal upmixing algorithm (not recommended).") vlc_module_begin(); set_shortname( "A/52" ); - set_description( _("ATSC A/52 (AC-3) audio decoder") ); + set_description( N_("ATSC A/52 (AC-3) audio decoder") ); set_category( CAT_INPUT ); set_subcategory( SUBCAT_INPUT_ACODEC ); - add_bool( "a52-dynrng", 1, NULL, DYNRNG_TEXT, DYNRNG_LONGTEXT, VLC_FALSE ); + add_bool( "a52-dynrng", 1, NULL, DYNRNG_TEXT, DYNRNG_LONGTEXT, false ); + add_bool( "a52-upmix", 0, NULL, UPMIX_TEXT, UPMIX_LONGTEXT, true ); set_capability( "audio filter", 100 ); set_callbacks( Create, Destroy ); add_submodule(); - set_description( _("ATSC A/52 (AC-3) audio decoder") ); + set_description( N_("ATSC A/52 (AC-3) audio decoder") ); set_capability( "audio filter2", 100 ); set_callbacks( OpenFilter, CloseFilter ); vlc_module_end(); @@ -142,10 +149,7 @@ static int Create( vlc_object_t *p_this ) p_sys = malloc( sizeof(filter_sys_t) ); p_filter->p_sys = (struct aout_filter_sys_t *)p_sys; if( p_sys == NULL ) - { - msg_Err( p_filter, "out of memory" ); return -1; - } i_ret = Open( VLC_OBJECT(p_filter), p_sys, p_filter->input, p_filter->output ); @@ -157,7 +161,7 @@ static int Create( vlc_object_t *p_this ) } /***************************************************************************** - * Open: + * Open: *****************************************************************************/ static int Open( vlc_object_t *p_this, filter_sys_t *p_sys, audio_format_t input, audio_format_t output ) @@ -165,6 +169,16 @@ static int Open( vlc_object_t *p_this, filter_sys_t *p_sys, p_sys->b_dynrng = config_GetInt( p_this, "a52-dynrng" ); p_sys->b_dontwarn = 0; + /* No upmixing: it's not necessary and some other filters may want to do + * it themselves. */ + if ( aout_FormatNbChannels( &output ) > aout_FormatNbChannels( &input ) ) + { + if ( ! config_GetInt( p_this, "a52-upmix" ) ) + { + return VLC_EGENERIC; + } + } + /* We'll do our own downmixing, thanks. */ p_sys->i_nb_channels = aout_FormatNbChannels( &output ); switch ( (output.i_physical_channels & AOUT_CHAN_PHYSMASK) @@ -365,7 +379,7 @@ static void DoWork( aout_instance_t * p_aout, aout_filter_t * p_filter, if ( ((p_sys->i_flags & A52_CHANNEL_MASK) == A52_CHANNEL1 || (p_sys->i_flags & A52_CHANNEL_MASK) == A52_CHANNEL2 || (p_sys->i_flags & A52_CHANNEL_MASK) == A52_MONO) - && (p_filter->output.i_physical_channels + && (p_filter->output.i_physical_channels & (AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT)) ) { Duplicate( (float *)(p_out_buf->p_buffer + i * i_bytes_per_block), @@ -379,7 +393,7 @@ static void DoWork( aout_instance_t * p_aout, aout_filter_t * p_filter, } else { - /* Interleave the *$£%ù samples. */ + /* Interleave the *$£%ù samples. */ Interleave( (float *)(p_out_buf->p_buffer + i * i_bytes_per_block), p_samples, p_sys->i_nb_channels, p_sys->pi_chan_table); } @@ -402,7 +416,7 @@ static void Destroy( vlc_object_t *p_this ) } /***************************************************************************** - * OpenFilter: + * OpenFilter: *****************************************************************************/ static int OpenFilter( vlc_object_t *p_this ) { @@ -421,22 +435,13 @@ static int OpenFilter( vlc_object_t *p_this ) #else p_filter->fmt_out.i_codec = VLC_FOURCC('f','l','3','2'); #endif - - /* Allocate the memory needed to store the module's structure */ - p_sys = p_filter->p_sys = malloc( sizeof(filter_sys_t) ); - if( p_sys == NULL ) - { - msg_Err( p_filter, "out of memory" ); - return VLC_EGENERIC; - } + p_filter->fmt_out.audio.i_bitspersample = + aout_BitsPerSample( p_filter->fmt_out.i_codec ); /* Allocate the memory needed to store the module's structure */ p_filter->p_sys = p_sys = malloc( sizeof(filter_sys_t) ); if( p_sys == NULL ) - { - msg_Err( p_filter, "out of memory" ); - return VLC_EGENERIC; - } + return VLC_ENOMEM; i_ret = Open( VLC_OBJECT(p_filter), p_sys, p_filter->fmt_in.audio, p_filter->fmt_out.audio ); @@ -468,7 +473,8 @@ static block_t *Convert( filter_t *p_filter, block_t *p_block ) if( !p_block || !p_block->i_samples ) { - if( p_block ) p_block->pf_release( p_block ); + if( p_block ) + block_Release( p_block ); return NULL; } @@ -480,7 +486,7 @@ static block_t *Convert( filter_t *p_filter, block_t *p_block ) if( !p_out ) { msg_Warn( p_filter, "can't get output buffer" ); - p_block->pf_release( p_block ); + block_Release( p_block ); return NULL; } @@ -507,7 +513,7 @@ static block_t *Convert( filter_t *p_filter, block_t *p_block ) p_out->i_buffer = out_buf.i_nb_bytes; p_out->i_samples = out_buf.i_nb_samples; - p_block->pf_release( p_block ); + block_Release( p_block ); return p_out; }