X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faudio_filter%2Fconverter%2Fa52tofloat32.c;h=51ee9e47d0a64598d4ce1564a012297e790253d8;hb=0c7e60bf0a0e35f3c7a37e78a7771072d997a3c8;hp=6cac68dd3ab219b0e799664cf48489152bf95511;hpb=4f028428053d0342c55deb6ba8b8da114c6a0caa;p=vlc diff --git a/modules/audio_filter/converter/a52tofloat32.c b/modules/audio_filter/converter/a52tofloat32.c index 6cac68dd3a..51ee9e47d0 100644 --- a/modules/audio_filter/converter/a52tofloat32.c +++ b/modules/audio_filter/converter/a52tofloat32.c @@ -3,7 +3,7 @@ * This plugin makes use of liba52 to decode A/52 audio * (http://liba52.sf.net/). ***************************************************************************** - * Copyright (C) 2001, 2002 the VideoLAN team + * Copyright (C) 2001-2009 the VideoLAN team * $Id$ * * Authors: Gildas Bazin @@ -27,14 +27,15 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include - -#ifdef HAVE_STDINT_H -# include /* int16_t .. */ -#elif HAVE_INTTYPES_H -# include /* int16_t .. */ +#ifdef HAVE_CONFIG_H +# include "config.h" #endif +#include +#include + +#include /* int16_t .. */ + #ifdef HAVE_UNISTD_H # include #endif @@ -66,11 +67,7 @@ static block_t *Convert( filter_t *, block_t * ); /* liba52 channel order */ static const uint32_t pi_channels_in[] = { AOUT_CHAN_LFE, AOUT_CHAN_LEFT, AOUT_CHAN_CENTER, AOUT_CHAN_RIGHT, - AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT, 0 }; -/* our internal channel order (WG-4 order) */ -static const uint32_t pi_channels_out[] = -{ AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT, AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT, - AOUT_CHAN_CENTER, AOUT_CHAN_LFE, 0 }; + AOUT_CHAN_REARLEFT, AOUT_CHAN_REARCENTER, AOUT_CHAN_REARRIGHT, 0 }; /***************************************************************************** * Local structures @@ -78,9 +75,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 */ @@ -100,21 +97,21 @@ struct filter_sys_t #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_category( CAT_INPUT ); - set_subcategory( SUBCAT_INPUT_ACODEC ); - add_bool( "a52-dynrng", 1, NULL, DYNRNG_TEXT, DYNRNG_LONGTEXT, VLC_FALSE ); - add_bool( "a52-upmix", 0, NULL, UPMIX_TEXT, UPMIX_LONGTEXT, VLC_TRUE ); - set_capability( "audio filter", 100 ); - set_callbacks( Create, Destroy ); - - add_submodule(); - set_description( _("ATSC A/52 (AC-3) audio decoder") ); - set_capability( "audio filter2", 100 ); - set_callbacks( OpenFilter, CloseFilter ); -vlc_module_end(); +vlc_module_begin () + set_shortname( "A/52" ) + set_description( N_("ATSC A/52 (AC-3) audio decoder") ) + set_category( CAT_INPUT ) + set_subcategory( SUBCAT_INPUT_ACODEC ) + add_bool( "a52-dynrng", true, NULL, DYNRNG_TEXT, DYNRNG_LONGTEXT, false ) + add_bool( "a52-upmix", false, NULL, UPMIX_TEXT, UPMIX_LONGTEXT, true ) + set_capability( "audio filter", 100 ) + set_callbacks( Create, Destroy ) + + add_submodule () + set_description( N_("ATSC A/52 (AC-3) audio decoder") ) + set_capability( "audio filter2", 100 ) + set_callbacks( OpenFilter, CloseFilter ) +vlc_module_end () /***************************************************************************** * Create: @@ -122,14 +119,14 @@ vlc_module_end(); static int Create( vlc_object_t *p_this ) { aout_filter_t *p_filter = (aout_filter_t *)p_this; - filter_sys_t *p_sys = (filter_sys_t *)p_filter->p_sys; + filter_sys_t *p_sys; int i_ret; - if ( p_filter->input.i_format != VLC_FOURCC('a','5','2',' ') + if ( p_filter->input.i_format != VLC_CODEC_A52 #ifdef LIBA52_FIXED - || p_filter->output.i_format != VLC_FOURCC('f','i','3','2') ) + || p_filter->output.i_format != VLC_CODEC_FI32 ) #else - || p_filter->output.i_format != VLC_FOURCC('f','l','3','2') ) + || p_filter->output.i_format != VLC_CODEC_FL32 ) #endif { return -1; @@ -144,10 +141,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 ); @@ -269,7 +263,7 @@ static int Open( vlc_object_t *p_this, filter_sys_t *p_sys, return VLC_EGENERIC; } - aout_CheckChannelReorder( pi_channels_in, pi_channels_out, + aout_CheckChannelReorder( pi_channels_in, NULL, output.i_physical_channels & AOUT_CHAN_PHYSMASK, p_sys->i_nb_channels, p_sys->pi_chan_table ); @@ -280,8 +274,8 @@ static int Open( vlc_object_t *p_this, filter_sys_t *p_sys, /***************************************************************************** * Interleave: helper function to interleave channels *****************************************************************************/ -static void Interleave( float * p_out, const float * p_in, int i_nb_channels, - int *pi_chan_table ) +static void Interleave( sample_t * p_out, const sample_t * p_in, + int i_nb_channels, int *pi_chan_table ) { /* We do not only have to interleave, but also reorder the channels */ @@ -298,7 +292,7 @@ static void Interleave( float * p_out, const float * p_in, int i_nb_channels, /***************************************************************************** * Duplicate: helper function to duplicate a unique channel *****************************************************************************/ -static void Duplicate( float * p_out, const float * p_in ) +static void Duplicate( sample_t * p_out, const sample_t * p_in ) { int i; @@ -313,11 +307,11 @@ static void Duplicate( float * p_out, const float * p_in ) /***************************************************************************** * Exchange: helper function to exchange left & right channels *****************************************************************************/ -static void Exchange( float * p_out, const float * p_in ) +static void Exchange( sample_t * p_out, const sample_t * p_in ) { int i; - const float * p_first = p_in + 256; - const float * p_second = p_in; + const sample_t * p_first = p_in + 256; + const sample_t * p_second = p_in; for ( i = 0; i < 256; i++ ) { @@ -340,7 +334,7 @@ static void DoWork( aout_instance_t * p_aout, aout_filter_t * p_filter, #endif int i_flags = p_sys->i_flags; int i_bytes_per_block = 256 * p_sys->i_nb_channels - * sizeof(float); + * sizeof(sample_t); int i; /* Do the actual decoding now. */ @@ -380,19 +374,19 @@ static void DoWork( aout_instance_t * p_aout, aout_filter_t * p_filter, && (p_filter->output.i_physical_channels & (AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT)) ) { - Duplicate( (float *)(p_out_buf->p_buffer + i * i_bytes_per_block), + Duplicate( (sample_t *)(p_out_buf->p_buffer + i * i_bytes_per_block), p_samples ); } else if ( p_filter->output.i_original_channels & AOUT_CHAN_REVERSESTEREO ) { - Exchange( (float *)(p_out_buf->p_buffer + i * i_bytes_per_block), + Exchange( (sample_t *)(p_out_buf->p_buffer + i * i_bytes_per_block), p_samples ); } else { /* Interleave the *$£%ù samples. */ - Interleave( (float *)(p_out_buf->p_buffer + i * i_bytes_per_block), + Interleave( (sample_t *)(p_out_buf->p_buffer + i * i_bytes_per_block), p_samples, p_sys->i_nb_channels, p_sys->pi_chan_table); } } @@ -422,25 +416,24 @@ static int OpenFilter( vlc_object_t *p_this ) filter_sys_t *p_sys; int i_ret; - if( p_filter->fmt_in.i_codec != VLC_FOURCC('a','5','2',' ') ) + if( p_filter->fmt_in.i_codec != VLC_CODEC_A52 ) { return VLC_EGENERIC; } p_filter->fmt_out.audio.i_format = #ifdef LIBA52_FIXED - p_filter->fmt_out.i_codec = VLC_FOURCC('f','i','3','2'); + p_filter->fmt_out.i_codec = VLC_CODEC_FI32; #else - p_filter->fmt_out.i_codec = VLC_FOURCC('f','l','3','2'); + p_filter->fmt_out.i_codec = VLC_CODEC_FL32; #endif + 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 ); @@ -470,13 +463,14 @@ static block_t *Convert( filter_t *p_filter, block_t *p_block ) block_t *p_out; int i_out_size; - if( !p_block || !p_block->i_samples ) + if( !p_block || !p_block->i_nb_samples ) { - if( p_block ) p_block->pf_release( p_block ); + if( p_block ) + block_Release( p_block ); return NULL; } - i_out_size = p_block->i_samples * + i_out_size = p_block->i_nb_samples * p_filter->fmt_out.audio.i_bitspersample * p_filter->fmt_out.audio.i_channels / 8; @@ -484,11 +478,11 @@ 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; } - p_out->i_samples = p_block->i_samples; + p_out->i_nb_samples = p_block->i_nb_samples; p_out->i_dts = p_block->i_dts; p_out->i_pts = p_block->i_pts; p_out->i_length = p_block->i_length; @@ -501,17 +495,17 @@ static block_t *Convert( filter_t *p_filter, block_t *p_block ) in_buf.p_buffer = p_block->p_buffer; in_buf.i_nb_bytes = p_block->i_buffer; - in_buf.i_nb_samples = p_block->i_samples; + in_buf.i_nb_samples = p_block->i_nb_samples; out_buf.p_buffer = p_out->p_buffer; out_buf.i_nb_bytes = p_out->i_buffer; - out_buf.i_nb_samples = p_out->i_samples; + out_buf.i_nb_samples = p_out->i_nb_samples; DoWork( (aout_instance_t *)p_filter, &aout_filter, &in_buf, &out_buf ); p_out->i_buffer = out_buf.i_nb_bytes; - p_out->i_samples = out_buf.i_nb_samples; + p_out->i_nb_samples = out_buf.i_nb_samples; - p_block->pf_release( p_block ); + block_Release( p_block ); return p_out; }