X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faudio_filter%2Fformat.c;h=0811231b104a31ce661f3fde102299723099b0e7;hb=7df37bef3c7b6533509d885f947a068353685ca6;hp=28b338a4e4aa21bfd04183bf1232ed13df34c74c;hpb=564f48495fd10c8eb4b7ad1fd9c5f87624bd3a16;p=vlc diff --git a/modules/audio_filter/format.c b/modules/audio_filter/format.c index 28b338a4e4..0811231b10 100644 --- a/modules/audio_filter/format.c +++ b/modules/audio_filter/format.c @@ -1,7 +1,7 @@ /***************************************************************************** * format.c : PCM format converter ***************************************************************************** - * Copyright (C) 2002-2005 VideoLAN + * Copyright (C) 2002-2005 the VideoLAN team * $Id$ * * Authors: Christophe Massiot @@ -19,17 +19,21 @@ * * 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 /* malloc(), free() */ -#include -#include -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include #include "vlc_filter.h" #ifdef WORDS_BIGENDIAN @@ -113,7 +117,7 @@ static block_t *S8toU8( filter_t *, block_t * ); static block_t *Swap16( filter_t *, block_t * ); static block_t *Swap24( filter_t *, block_t * ); -static struct +static const struct { vlc_fourcc_t i_src; vlc_fourcc_t i_dst; @@ -159,7 +163,7 @@ static struct { VLC_FOURCC('s','8',' ',' '), AOUT_FMT_U16_NE, S8toU16 }, { VLC_FOURCC('s','8',' ',' '), AOUT_FMT_U16_IE, S8toU16Invert }, { VLC_FOURCC('s','8',' ',' '), VLC_FOURCC('u','8',' ',' '), S8toU8 }, - + /* From u8 */ { VLC_FOURCC('u','8',' ',' '), VLC_FOURCC('f','l','3','2'), U8toFloat32 }, { VLC_FOURCC('u','8',' ',' '), AOUT_FMT_S16_NE, U8toS16 }, @@ -197,11 +201,13 @@ static struct /***************************************************************************** * Module descriptor *****************************************************************************/ -vlc_module_begin(); - set_description( _("audio filter for PCM format conversion") ); - set_capability( "audio filter2", 1 ); - set_callbacks( Open, NULL ); -vlc_module_end(); +vlc_module_begin () + set_description( N_("Audio filter for PCM format conversion") ) + set_category( CAT_AUDIO ) + set_subcategory( SUBCAT_AUDIO_MISC ) + set_capability( "audio filter2", 1 ) + set_callbacks( Open, NULL ) +vlc_module_end () /***************************************************************************** * Open: @@ -223,11 +229,14 @@ static int Open( vlc_object_t *p_this ) p_filter->pf_audio_filter = ConvertTable[i].pf_convert; p_filter->fmt_out.audio = p_filter->fmt_in.audio; p_filter->fmt_out.audio.i_format = p_filter->fmt_out.i_codec; + p_filter->fmt_out.audio.i_bitspersample = + aout_BitsPerSample( p_filter->fmt_out.i_codec ); - msg_Dbg( p_this, "%4.4s->%4.4s, bits per sample: %i", + msg_Dbg( p_this, "%4.4s->%4.4s, bits per sample: %i->%i", (char *)&p_filter->fmt_in.i_codec, (char *)&p_filter->fmt_out.i_codec, - p_filter->fmt_in.audio.i_bitspersample ); + p_filter->fmt_in.audio.i_bitspersample, + p_filter->fmt_out.audio.i_bitspersample ); return VLC_SUCCESS; } @@ -237,23 +246,24 @@ static int Open( vlc_object_t *p_this ) *****************************************************************************/ static block_t *Float32toS24( filter_t *p_filter, block_t *p_block ) { + VLC_UNUSED(p_filter); int i; float *p_in = (float *)p_block->p_buffer; uint8_t *p_out = (uint8_t *)p_in; int32_t out; - for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) + for( i = p_block->i_buffer / 4; i--; ) { if ( *p_in >= 1.0 ) out = 8388607; else if ( *p_in < -1.0 ) out = -8388608; else out = *p_in * 8388608.0; #ifdef WORDS_BIGENDIAN - *((int16_t *)p_out) = out >> 8; - p_out[2] = out & 0xFF; + *((int16_t *)p_out) = out >> 8; + p_out[2] = out & 0xFF; #else - *((int16_t *)(p_out+1)) = out >> 8; - p_out[0] = out & 0xFF; + *((int16_t *)(p_out+1)) = out >> 8; + p_out[0] = out & 0xFF; #endif p_in++; p_out += 3; @@ -265,11 +275,12 @@ static block_t *Float32toS24( filter_t *p_filter, block_t *p_block ) static block_t *Float32toS16( filter_t *p_filter, block_t *p_block ) { + VLC_UNUSED(p_filter); int i; float *p_in = (float *)p_block->p_buffer; int16_t *p_out = (int16_t *)p_in; - for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) + for( i = p_block->i_buffer / 4; i--; ) { #if 0 /* Slow version. */ @@ -293,11 +304,12 @@ static block_t *Float32toS16( filter_t *p_filter, block_t *p_block ) static block_t *Float32toU16( filter_t *p_filter, block_t *p_block ) { + VLC_UNUSED(p_filter); int i; float *p_in = (float *)p_block->p_buffer; uint16_t *p_out = (uint16_t *)p_in; - for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) + for( i = p_block->i_buffer / 4; i--; ) { if ( *p_in >= 1.0 ) *p_out = 65535; else if ( *p_in < -1.0 ) *p_out = 0; @@ -317,7 +329,7 @@ static block_t *S24toFloat32( filter_t *p_filter, block_t *p_block ) int i; p_block_out = - p_filter->pf_audio_buffer_new( p_filter, p_block->i_buffer*4/3 ); + p_filter->pf_audio_buffer_new( p_filter, p_block->i_buffer * 4 / 3 ); if( !p_block_out ) { msg_Warn( p_filter, "can't get output buffer" ); @@ -327,8 +339,9 @@ static block_t *S24toFloat32( filter_t *p_filter, block_t *p_block ) p_in = p_block->p_buffer; p_out = (float *)p_block_out->p_buffer; - for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) + for( i = p_block->i_buffer / 3; i--; ) { + /* FIXME: unaligned reads */ #ifdef WORDS_BIGENDIAN *p_out = ((float)( (((int32_t)*(int16_t *)(p_in)) << 8) + p_in[2])) #else @@ -345,17 +358,18 @@ static block_t *S24toFloat32( filter_t *p_filter, block_t *p_block ) p_block_out->i_length = p_block->i_length; p_block_out->i_rate = p_block->i_rate; - p_block->pf_release( p_block ); + block_Release( p_block ); return p_block_out; } static block_t *S24toS16( filter_t *p_filter, block_t *p_block ) { + VLC_UNUSED(p_filter); int i; uint8_t *p_in = (uint8_t *)p_block->p_buffer; uint8_t *p_out = (uint8_t *)p_in; - for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) + for( i = p_block->i_buffer / 3; i--; ) { #ifdef WORDS_BIGENDIAN *p_out++ = *p_in++; @@ -390,7 +404,7 @@ static block_t *S16toFloat32( filter_t *p_filter, block_t *p_block ) p_in = (int16_t *)p_block->p_buffer; p_out = (float *)p_block_out->p_buffer; - for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) + for( i = p_block->i_buffer / 2; i--; ) { #if 0 /* Slow version */ @@ -413,14 +427,14 @@ static block_t *S16toFloat32( filter_t *p_filter, block_t *p_block ) p_block_out->i_length = p_block->i_length; p_block_out->i_rate = p_block->i_rate; - p_block->pf_release( p_block ); + block_Release( p_block ); return p_block_out; } static block_t *U16toFloat32( filter_t *p_filter, block_t *p_block ) { block_t *p_block_out; - int16_t *p_in; + uint16_t *p_in; float *p_out; int i; @@ -432,10 +446,10 @@ static block_t *U16toFloat32( filter_t *p_filter, block_t *p_block ) return NULL; } - p_in = (int16_t *)p_block->p_buffer; + p_in = (uint16_t *)p_block->p_buffer; p_out = (float *)p_block_out->p_buffer; - for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) + for( i = p_block->i_buffer / 2; i--; ) { *p_out++ = (float)(*p_in++ - 32768) / 32768.0; } @@ -446,7 +460,7 @@ static block_t *U16toFloat32( filter_t *p_filter, block_t *p_block ) p_block_out->i_length = p_block->i_length; p_block_out->i_rate = p_block->i_rate; - p_block->pf_release( p_block ); + block_Release( p_block ); return p_block_out; } @@ -467,7 +481,7 @@ static block_t *S16toS24( filter_t *p_filter, block_t *p_block ) p_in = (uint8_t *)p_block->p_buffer; p_out = (uint8_t *)p_block_out->p_buffer; - for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) + for( i = p_block->i_buffer / 2; i--; ) { #ifdef WORDS_BIGENDIAN *p_out++ = *p_in++; @@ -486,17 +500,18 @@ static block_t *S16toS24( filter_t *p_filter, block_t *p_block ) p_block_out->i_length = p_block->i_length; p_block_out->i_rate = p_block->i_rate; - p_block->pf_release( p_block ); + block_Release( p_block ); return p_block_out; } static block_t *S16toS8( filter_t *p_filter, block_t *p_block ) { + VLC_UNUSED(p_filter); int i; int16_t *p_in = (int16_t *)p_block->p_buffer; int8_t *p_out = (int8_t *)p_in; - for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) + for( i = p_block->i_buffer / 2; i--; ) *p_out++ = (*p_in++) >> 8; p_block->i_buffer /= 2; @@ -504,11 +519,12 @@ static block_t *S16toS8( filter_t *p_filter, block_t *p_block ) } static block_t *S16toU8( filter_t *p_filter, block_t *p_block ) { + VLC_UNUSED(p_filter); int i; int16_t *p_in = (int16_t *)p_block->p_buffer; uint8_t *p_out = (uint8_t *)p_in; - for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) + for( i = p_block->i_buffer / 2; i--; ) *p_out++ = ((*p_in++) + 32768) >> 8; p_block->i_buffer /= 2; @@ -516,11 +532,12 @@ static block_t *S16toU8( filter_t *p_filter, block_t *p_block ) } static block_t *S16toU16( filter_t *p_filter, block_t *p_block ) { + VLC_UNUSED(p_filter); int i; int16_t *p_in = (int16_t *)p_block->p_buffer; uint16_t *p_out = (uint16_t *)p_in; - for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) + for( i = p_block->i_buffer / 2; i--; ) *p_out++ = (*p_in++) + 32768; return p_block; @@ -528,11 +545,12 @@ static block_t *S16toU16( filter_t *p_filter, block_t *p_block ) static block_t *U16toS8( filter_t *p_filter, block_t *p_block ) { + VLC_UNUSED(p_filter); int i; uint16_t *p_in = (uint16_t *)p_block->p_buffer; int8_t *p_out = (int8_t *)p_in; - for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) + for( i = p_block->i_buffer / 2; i--; ) *p_out++ = ((int)(*p_in++) - 32768) >> 8; p_block->i_buffer /= 2; @@ -540,11 +558,12 @@ static block_t *U16toS8( filter_t *p_filter, block_t *p_block ) } static block_t *U16toU8( filter_t *p_filter, block_t *p_block ) { + VLC_UNUSED(p_filter); int i; uint16_t *p_in = (uint16_t *)p_block->p_buffer; uint8_t *p_out = (uint8_t *)p_in; - for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) + for( i = p_block->i_buffer / 2; i--; ) *p_out++ = (*p_in++) >> 8; p_block->i_buffer /= 2; @@ -552,11 +571,12 @@ static block_t *U16toU8( filter_t *p_filter, block_t *p_block ) } static block_t *U16toS16( filter_t *p_filter, block_t *p_block ) { + VLC_UNUSED(p_filter); int i; - int16_t *p_in = (int16_t *)p_block->p_buffer; - uint16_t *p_out = (uint16_t *)p_in; + uint16_t *p_in = (uint16_t *)p_block->p_buffer; + int16_t *p_out = (int16_t *)p_in; - for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) + for( i = p_block->i_buffer / 2; i--; ) *p_out++ = (int)(*p_in++) - 32768; return p_block; @@ -564,22 +584,24 @@ static block_t *U16toS16( filter_t *p_filter, block_t *p_block ) static block_t *S8toU8( filter_t *p_filter, block_t *p_block ) { + VLC_UNUSED(p_filter); int i; int8_t *p_in = (int8_t *)p_block->p_buffer; uint8_t *p_out = (uint8_t *)p_in; - for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) + for( i = p_block->i_buffer; i--; ) *p_out++ = ((*p_in++) + 128); return p_block; } static block_t *U8toS8( filter_t *p_filter, block_t *p_block ) { + VLC_UNUSED(p_filter); int i; uint8_t *p_in = (uint8_t *)p_block->p_buffer; int8_t *p_out = (int8_t *)p_in; - for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) + for( i = p_block->i_buffer; i--; ) *p_out++ = ((*p_in++) - 128); return p_block; @@ -604,7 +626,7 @@ static block_t *S8toU16( filter_t *p_filter, block_t *p_block ) p_in = (int8_t *)p_block->p_buffer; p_out = (uint16_t *)p_block_out->p_buffer; - for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) + for( i = p_block->i_buffer; i--; ) *p_out++ = ((*p_in++) + 128) << 8; p_block_out->i_samples = p_block->i_samples; @@ -613,7 +635,7 @@ static block_t *S8toU16( filter_t *p_filter, block_t *p_block ) p_block_out->i_length = p_block->i_length; p_block_out->i_rate = p_block->i_rate; - p_block->pf_release( p_block ); + block_Release( p_block ); return p_block_out; } @@ -635,7 +657,7 @@ static block_t *U8toS16( filter_t *p_filter, block_t *p_block ) p_in = (uint8_t *)p_block->p_buffer; p_out = (int16_t *)p_block_out->p_buffer; - for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) + for( i = p_block->i_buffer; i--; ) *p_out++ = ((*p_in++) - 128) << 8; p_block_out->i_samples = p_block->i_samples; @@ -644,7 +666,7 @@ static block_t *U8toS16( filter_t *p_filter, block_t *p_block ) p_block_out->i_length = p_block->i_length; p_block_out->i_rate = p_block->i_rate; - p_block->pf_release( p_block ); + block_Release( p_block ); return p_block_out; } @@ -667,7 +689,7 @@ static block_t *S8toS16( filter_t *p_filter, block_t *p_block ) p_in = (int8_t *)p_block->p_buffer; p_out = (int16_t *)p_block_out->p_buffer; - for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) + for( i = p_block->i_buffer; i--; ) *p_out++ = (*p_in++) << 8; p_block_out->i_samples = p_block->i_samples; @@ -676,7 +698,7 @@ static block_t *S8toS16( filter_t *p_filter, block_t *p_block ) p_block_out->i_length = p_block->i_length; p_block_out->i_rate = p_block->i_rate; - p_block->pf_release( p_block ); + block_Release( p_block ); return p_block_out; } @@ -698,7 +720,7 @@ static block_t *U8toU16( filter_t *p_filter, block_t *p_block ) p_in = (uint8_t *)p_block->p_buffer; p_out = (uint16_t *)p_block_out->p_buffer; - for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) + for( i = p_block->i_buffer; i--; ) *p_out++ = (*p_in++) << 8; p_block_out->i_samples = p_block->i_samples; @@ -707,7 +729,7 @@ static block_t *U8toU16( filter_t *p_filter, block_t *p_block ) p_block_out->i_length = p_block->i_length; p_block_out->i_rate = p_block->i_rate; - p_block->pf_release( p_block ); + block_Release( p_block ); return p_block_out; } @@ -716,7 +738,8 @@ static block_t *U8toU16( filter_t *p_filter, block_t *p_block ) *****************************************************************************/ static block_t *Swap16( filter_t *p_filter, block_t *p_block ) { - int i; + VLC_UNUSED(p_filter); + size_t i; uint8_t *p_in = (uint8_t *)p_block->p_buffer; uint8_t tmp; @@ -733,7 +756,8 @@ static block_t *Swap16( filter_t *p_filter, block_t *p_block ) static block_t *Swap24( filter_t *p_filter, block_t *p_block ) { - int i; + VLC_UNUSED(p_filter); + size_t i; uint8_t *p_in = (uint8_t *)p_block->p_buffer; uint8_t tmp;