X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faudio_filter%2Fconverter%2Ffloat.c;h=b92717511dd5d2f77c858ba7f42a7bc412f88364;hb=cee16ae6950abf905ac800018108e0dc610619ef;hp=83239bf2d71a7c4d757dcf7c6e27156f000244cd;hpb=99fab9089e9e1709d9c3a4bc5ced0c137ac59134;p=vlc diff --git a/modules/audio_filter/converter/float.c b/modules/audio_filter/converter/float.c index 83239bf2d7..b92717511d 100644 --- a/modules/audio_filter/converter/float.c +++ b/modules/audio_filter/converter/float.c @@ -33,16 +33,13 @@ # include "config.h" #endif -#include +#include +#include #ifdef HAVE_UNISTD_H # include #endif -#ifdef HAVE_ALLOCA_H -# include -#endif - #include /***************************************************************************** @@ -73,13 +70,17 @@ static void Do_FL32ToU8( aout_instance_t *, aout_filter_t *, aout_buffer_t *, static int Create_S16ToFL32( vlc_object_t * ); static void Do_S16ToFL32( aout_instance_t *, aout_filter_t *, aout_buffer_t *, aout_buffer_t * ); -static void Do_S16ToFL24( aout_instance_t *, aout_filter_t *, aout_buffer_t *, +static void Do_S24ToFL32( aout_instance_t *, aout_filter_t *, aout_buffer_t *, + aout_buffer_t * ); +static void Do_S32ToFL32( aout_instance_t *, aout_filter_t *, aout_buffer_t *, aout_buffer_t * ); static int Create_S16ToFL32_SW( vlc_object_t * ); static void Do_S16ToFL32_SW( aout_instance_t *, aout_filter_t *, aout_buffer_t *, aout_buffer_t * ); -static void Do_S16ToFL24_SW( aout_instance_t *, aout_filter_t *, aout_buffer_t *, +static void Do_S24ToFL32_SW( aout_instance_t *, aout_filter_t *, aout_buffer_t *, + aout_buffer_t * ); +static void Do_S32ToFL32_SW( aout_instance_t *, aout_filter_t *, aout_buffer_t *, aout_buffer_t * ); static int Create_S8ToFL32( vlc_object_t * ); @@ -93,36 +94,36 @@ static void Do_U8ToFL32( aout_instance_t *, aout_filter_t *, aout_buffer_t *, /***************************************************************************** * Module descriptor *****************************************************************************/ -vlc_module_begin(); - set_description( _("Floating-point audio format conversions") ); - add_submodule(); - set_capability( "audio filter", 10 ); - set_callbacks( Create_F32ToFL32, NULL ); - add_submodule(); - set_capability( "audio filter", 1 ); - set_callbacks( Create_FL32ToS16, NULL ); - add_submodule(); - set_capability( "audio filter", 1 ); - set_callbacks( Create_FL32ToS8, NULL ); - add_submodule(); - set_capability( "audio filter", 1 ); - set_callbacks( Create_FL32ToU16, NULL ); - add_submodule(); - set_capability( "audio filter", 1 ); - set_callbacks( Create_FL32ToU8, NULL ); - add_submodule(); - set_capability( "audio filter", 1 ); - set_callbacks( Create_S16ToFL32, NULL ); - add_submodule(); - set_capability( "audio filter", 1 ); - set_callbacks( Create_S16ToFL32_SW, NULL ); /* Endianness conversion*/ - add_submodule(); - set_capability( "audio filter", 1 ); - set_callbacks( Create_S8ToFL32, NULL ); - add_submodule(); - set_capability( "audio filter", 1 ); - set_callbacks( Create_U8ToFL32, NULL ); -vlc_module_end(); +vlc_module_begin () + set_description( N_("Floating-point audio format conversions") ) + add_submodule () + set_capability( "audio filter", 10 ) + set_callbacks( Create_F32ToFL32, NULL ) + add_submodule () + set_capability( "audio filter", 1 ) + set_callbacks( Create_FL32ToS16, NULL ) + add_submodule () + set_capability( "audio filter", 1 ) + set_callbacks( Create_FL32ToS8, NULL ) + add_submodule () + set_capability( "audio filter", 1 ) + set_callbacks( Create_FL32ToU16, NULL ) + add_submodule () + set_capability( "audio filter", 1 ) + set_callbacks( Create_FL32ToU8, NULL ) + add_submodule () + set_capability( "audio filter", 1 ) + set_callbacks( Create_S16ToFL32, NULL ) + add_submodule () + set_capability( "audio filter", 1 ) + set_callbacks( Create_S16ToFL32_SW, NULL ) /* Endianness conversion*/ + add_submodule () + set_capability( "audio filter", 1 ) + set_callbacks( Create_S8ToFL32, NULL ) + add_submodule () + set_capability( "audio filter", 1 ) + set_callbacks( Create_U8ToFL32, NULL ) +vlc_module_end () /***************************************************************************** * Fixed 32 to Float 32 and backwards @@ -131,10 +132,10 @@ static int Create_F32ToFL32( vlc_object_t *p_this ) { aout_filter_t * p_filter = (aout_filter_t *)p_this; - if( ( p_filter->input.i_format != VLC_FOURCC('f','i','3','2') - || p_filter->output.i_format != VLC_FOURCC('f','l','3','2') ) - && ( p_filter->input.i_format != VLC_FOURCC('f','l','3','2') - || p_filter->output.i_format != VLC_FOURCC('f','i','3','2') ) ) + if( ( p_filter->input.i_format != VLC_CODEC_FI32 + || p_filter->output.i_format != VLC_CODEC_FL32 ) + && ( p_filter->input.i_format != VLC_CODEC_FL32 + || p_filter->output.i_format != VLC_CODEC_FI32 ) ) { return -1; } @@ -144,7 +145,7 @@ static int Create_F32ToFL32( vlc_object_t *p_this ) return -1; } - if( p_filter->input.i_format == VLC_FOURCC('f','i','3','2') ) + if( p_filter->input.i_format == VLC_CODEC_FI32 ) { p_filter->pf_do_work = Do_F32ToFL32; } @@ -161,6 +162,7 @@ static int Create_F32ToFL32( vlc_object_t *p_this ) static void Do_F32ToFL32( aout_instance_t * p_aout, aout_filter_t * p_filter, aout_buffer_t * p_in_buf, aout_buffer_t * p_out_buf ) { + VLC_UNUSED(p_aout); int i; vlc_fixed_t * p_in = (vlc_fixed_t *)p_in_buf->p_buffer; float * p_out = (float *)p_out_buf->p_buffer; @@ -178,6 +180,7 @@ static void Do_F32ToFL32( aout_instance_t * p_aout, aout_filter_t * p_filter, static void Do_FL32ToF32( aout_instance_t * p_aout, aout_filter_t * p_filter, aout_buffer_t * p_in_buf, aout_buffer_t * p_out_buf ) { + VLC_UNUSED(p_aout); int i; float * p_in = (float *)p_in_buf->p_buffer; vlc_fixed_t * p_out = (vlc_fixed_t *)p_out_buf->p_buffer; @@ -199,8 +202,8 @@ static int Create_FL32ToS16( vlc_object_t *p_this ) { aout_filter_t * p_filter = (aout_filter_t *)p_this; - if ( p_filter->input.i_format != VLC_FOURCC('f','l','3','2') - || p_filter->output.i_format != AOUT_FMT_S16_NE ) + if ( p_filter->input.i_format != VLC_CODEC_FL32 + || p_filter->output.i_format != VLC_CODEC_S16N ) { return -1; } @@ -219,6 +222,7 @@ static int Create_FL32ToS16( vlc_object_t *p_this ) static void Do_FL32ToS16( aout_instance_t * p_aout, aout_filter_t * p_filter, aout_buffer_t * p_in_buf, aout_buffer_t * p_out_buf ) { + VLC_UNUSED(p_aout); int i; float * p_in = (float *)p_in_buf->p_buffer; int16_t * p_out = (int16_t *)p_out_buf->p_buffer; @@ -253,8 +257,8 @@ static int Create_FL32ToS8( vlc_object_t *p_this ) { aout_filter_t * p_filter = (aout_filter_t *)p_this; - if ( p_filter->input.i_format != VLC_FOURCC('f','l','3','2') - || p_filter->output.i_format != VLC_FOURCC('s','8',' ',' ') ) + if ( p_filter->input.i_format != VLC_CODEC_FL32 + || p_filter->output.i_format != VLC_CODEC_S8 ) { return -1; } @@ -273,6 +277,7 @@ static int Create_FL32ToS8( vlc_object_t *p_this ) static void Do_FL32ToS8( aout_instance_t * p_aout, aout_filter_t * p_filter, aout_buffer_t * p_in_buf, aout_buffer_t * p_out_buf ) { + VLC_UNUSED(p_aout); int i; float * p_in = (float *)p_in_buf->p_buffer; int8_t * p_out = (int8_t *)p_out_buf->p_buffer; @@ -297,8 +302,8 @@ static int Create_FL32ToU16( vlc_object_t *p_this ) { aout_filter_t * p_filter = (aout_filter_t *)p_this; - if ( p_filter->input.i_format != VLC_FOURCC('f','l','3','2') - || p_filter->output.i_format != AOUT_FMT_U16_NE ) + if ( p_filter->input.i_format != VLC_CODEC_FL32 + || p_filter->output.i_format != VLC_CODEC_U16N ) { return -1; } @@ -317,6 +322,7 @@ static int Create_FL32ToU16( vlc_object_t *p_this ) static void Do_FL32ToU16( aout_instance_t * p_aout, aout_filter_t * p_filter, aout_buffer_t * p_in_buf, aout_buffer_t * p_out_buf ) { + VLC_UNUSED(p_aout); int i; float * p_in = (float *)p_in_buf->p_buffer; uint16_t * p_out = (uint16_t *)p_out_buf->p_buffer; @@ -341,8 +347,8 @@ static int Create_FL32ToU8( vlc_object_t *p_this ) { aout_filter_t * p_filter = (aout_filter_t *)p_this; - if ( p_filter->input.i_format != VLC_FOURCC('f','l','3','2') - || p_filter->output.i_format != VLC_FOURCC('u','8',' ',' ') ) + if ( p_filter->input.i_format != VLC_CODEC_FL32 + || p_filter->output.i_format != VLC_CODEC_U8 ) { return -1; } @@ -361,6 +367,7 @@ static int Create_FL32ToU8( vlc_object_t *p_this ) static void Do_FL32ToU8( aout_instance_t * p_aout, aout_filter_t * p_filter, aout_buffer_t * p_in_buf, aout_buffer_t * p_out_buf ) { + VLC_UNUSED(p_aout); int i; float * p_in = (float *)p_in_buf->p_buffer; uint8_t * p_out = (uint8_t *)p_out_buf->p_buffer; @@ -385,9 +392,10 @@ static int Create_S16ToFL32( vlc_object_t *p_this ) { aout_filter_t * p_filter = (aout_filter_t *)p_this; - if ( ( p_filter->input.i_format != AOUT_FMT_S16_NE && - p_filter->input.i_format != AOUT_FMT_S24_NE ) - || p_filter->output.i_format != VLC_FOURCC('f','l','3','2') ) + if ( ( p_filter->input.i_format != VLC_CODEC_S16N && + p_filter->input.i_format != VLC_CODEC_S24N && + p_filter->input.i_format != VLC_CODEC_S32N ) + || p_filter->output.i_format != VLC_CODEC_FL32 ) { return -1; } @@ -397,12 +405,14 @@ static int Create_S16ToFL32( vlc_object_t *p_this ) return -1; } - if( p_filter->input.i_format == AOUT_FMT_S24_NE ) - p_filter->pf_do_work = Do_S16ToFL24; + if( p_filter->input.i_format == VLC_CODEC_S32N ) + p_filter->pf_do_work = Do_S32ToFL32; + else if( p_filter->input.i_format == VLC_CODEC_S24N ) + p_filter->pf_do_work = Do_S24ToFL32; else p_filter->pf_do_work = Do_S16ToFL32; - p_filter->b_in_place = VLC_TRUE; + p_filter->b_in_place = true; return 0; } @@ -410,6 +420,7 @@ static int Create_S16ToFL32( vlc_object_t *p_this ) static void Do_S16ToFL32( aout_instance_t * p_aout, aout_filter_t * p_filter, aout_buffer_t * p_in_buf, aout_buffer_t * p_out_buf ) { + VLC_UNUSED(p_aout); int i = p_in_buf->i_nb_samples * aout_FormatNbChannels( &p_filter->input ); /* We start from the end because b_in_place is true */ @@ -434,12 +445,13 @@ static void Do_S16ToFL32( aout_instance_t * p_aout, aout_filter_t * p_filter, } p_out_buf->i_nb_samples = p_in_buf->i_nb_samples; - p_out_buf->i_nb_bytes = p_in_buf->i_nb_bytes * 2; + p_out_buf->i_nb_bytes = p_in_buf->i_nb_bytes * 4 / 2; } -static void Do_S16ToFL24( aout_instance_t * p_aout, aout_filter_t * p_filter, +static void Do_S24ToFL32( aout_instance_t * p_aout, aout_filter_t * p_filter, aout_buffer_t * p_in_buf, aout_buffer_t * p_out_buf ) { + VLC_UNUSED(p_aout); int i = p_in_buf->i_nb_samples * aout_FormatNbChannels( &p_filter->input ); /* We start from the end because b_in_place is true */ @@ -462,6 +474,25 @@ static void Do_S16ToFL24( aout_instance_t * p_aout, aout_filter_t * p_filter, p_out_buf->i_nb_bytes = p_in_buf->i_nb_bytes * 4 / 3; } +static void Do_S32ToFL32( aout_instance_t * p_aout, aout_filter_t * p_filter, + aout_buffer_t * p_in_buf, aout_buffer_t * p_out_buf ) +{ + VLC_UNUSED(p_aout); + int i = p_in_buf->i_nb_samples * aout_FormatNbChannels( &p_filter->input ); + + /* We start from the end because b_in_place is true */ + int32_t * p_in = (int32_t *)p_in_buf->p_buffer + i - 1; + float * p_out = (float *)p_out_buf->p_buffer + i - 1; + + while( i-- ) + { + *p_out-- = (float)*p_in-- / 2147483648.0; + } + + p_out_buf->i_nb_samples = p_in_buf->i_nb_samples; + p_out_buf->i_nb_bytes = p_in_buf->i_nb_bytes * 4 / 4; +} + /***************************************************************************** * S16 To Float32 with endianness conversion *****************************************************************************/ @@ -474,86 +505,76 @@ static int Create_S16ToFL32_SW( vlc_object_t *p_this ) return -1; } - if ( (p_filter->input.i_format == VLC_FOURCC('s','1','6','l') || - p_filter->input.i_format == VLC_FOURCC('s','1','6','b')) - && p_filter->output.i_format == VLC_FOURCC('f','l','3','2') - && p_filter->input.i_format != AOUT_FMT_S16_NE ) + if ( (p_filter->input.i_format == VLC_CODEC_S16L || + p_filter->input.i_format == VLC_CODEC_S16B) + && p_filter->output.i_format == VLC_CODEC_FL32 + && p_filter->input.i_format != VLC_CODEC_S16N ) { p_filter->pf_do_work = Do_S16ToFL32_SW; - p_filter->b_in_place = VLC_TRUE; + p_filter->b_in_place = true; + + return 0; + } + + if ( (p_filter->input.i_format == VLC_CODEC_S24L || + p_filter->input.i_format == VLC_CODEC_S24B) + && p_filter->output.i_format == VLC_CODEC_FL32 + && p_filter->input.i_format != VLC_CODEC_S24N ) + { + p_filter->pf_do_work = Do_S24ToFL32_SW; + p_filter->b_in_place = true; return 0; } - if ( (p_filter->input.i_format == VLC_FOURCC('s','2','4','l') || - p_filter->input.i_format == VLC_FOURCC('s','2','4','b')) - && p_filter->output.i_format == VLC_FOURCC('f','l','3','2') - && p_filter->input.i_format != AOUT_FMT_S24_NE ) + if ( (p_filter->input.i_format == VLC_CODEC_S32L || + p_filter->input.i_format == VLC_CODEC_S32B) + && p_filter->output.i_format == VLC_CODEC_FL32 + && p_filter->input.i_format != VLC_CODEC_S32N ) { - p_filter->pf_do_work = Do_S16ToFL24_SW; - p_filter->b_in_place = VLC_TRUE; + p_filter->pf_do_work = Do_S32ToFL32_SW; + p_filter->b_in_place = true; return 0; } + return -1; } static void Do_S16ToFL32_SW( aout_instance_t * p_aout, aout_filter_t * p_filter, - aout_buffer_t * p_in_buf, aout_buffer_t * p_out_buf ) + aout_buffer_t * p_in_buf, aout_buffer_t * p_out_buf ) { + VLC_UNUSED(p_aout); int i = p_in_buf->i_nb_samples * aout_FormatNbChannels( &p_filter->input ); /* We start from the end because b_in_place is true */ int16_t * p_in; float * p_out = (float *)p_out_buf->p_buffer + i - 1; -#ifdef HAVE_SWAB -# ifdef HAVE_ALLOCA - int16_t * p_swabbed = alloca( i * sizeof(int16_t) ); -# else - int16_t * p_swabbed = malloc( i * sizeof(int16_t) ); -# endif + int16_t p_swabbed[i]; - swab( p_in_buf->p_buffer, (void *)p_swabbed, i * sizeof(int16_t) ); + swab( p_in_buf->p_buffer, p_swabbed, i * sizeof(int16_t) ); p_in = p_swabbed + i - 1; -#else - byte_t p_tmp[2]; - p_in = (int16_t *)p_in_buf->p_buffer + i - 1; -#endif while( i-- ) - { -#ifndef HAVE_SWAB - p_tmp[0] = ((byte_t *)p_in)[1]; - p_tmp[1] = ((byte_t *)p_in)[0]; - *p_out = (float)( *(int16_t *)p_tmp ) / 32768.0; -#else - *p_out = (float)*p_in / 32768.0; -#endif - p_in--; p_out--; - } - -#ifdef HAVE_SWAB -# ifndef HAVE_ALLOCA - free( p_swabbed ); -# endif -#endif + *p_out-- = (float)*p_in-- / 32768.0; p_out_buf->i_nb_samples = p_in_buf->i_nb_samples; - p_out_buf->i_nb_bytes = p_in_buf->i_nb_bytes * 2; + p_out_buf->i_nb_bytes = p_in_buf->i_nb_bytes * 4 / 2; } -static void Do_S16ToFL24_SW( aout_instance_t * p_aout, aout_filter_t * p_filter, - aout_buffer_t * p_in_buf, aout_buffer_t * p_out_buf ) +static void Do_S24ToFL32_SW( aout_instance_t * p_aout, aout_filter_t * p_filter, + aout_buffer_t * p_in_buf, aout_buffer_t * p_out_buf ) { + VLC_UNUSED(p_aout); int i = p_in_buf->i_nb_samples * aout_FormatNbChannels( &p_filter->input ); /* We start from the end because b_in_place is true */ uint8_t * p_in = (uint8_t *)p_in_buf->p_buffer + (i - 1) * 3; float * p_out = (float *)p_out_buf->p_buffer + i - 1; - byte_t p_tmp[3]; + uint8_t p_tmp[3]; while( i-- ) { @@ -575,6 +596,26 @@ static void Do_S16ToFL24_SW( aout_instance_t * p_aout, aout_filter_t * p_filter, p_out_buf->i_nb_bytes = p_in_buf->i_nb_bytes * 4 / 3; } +static void Do_S32ToFL32_SW( aout_instance_t * p_aout, aout_filter_t * p_filter, + aout_buffer_t * p_in_buf, aout_buffer_t * p_out_buf ) +{ + VLC_UNUSED(p_aout); + int i = p_in_buf->i_nb_samples * aout_FormatNbChannels( &p_filter->input ); + + /* We start from the end because b_in_place is true */ + int32_t * p_in = (int32_t *)p_in_buf->p_buffer + i - 1; + float * p_out = (float *)p_out_buf->p_buffer + i - 1; + + while( i-- ) + { + *p_out-- = (float)*p_in-- / 2147483648.0; + } + + p_out_buf->i_nb_samples = p_in_buf->i_nb_samples; + p_out_buf->i_nb_bytes = p_in_buf->i_nb_bytes * 4 / 4; +} + + /***************************************************************************** * S8 To FL32 *****************************************************************************/ @@ -582,8 +623,8 @@ static int Create_S8ToFL32( vlc_object_t *p_this ) { aout_filter_t * p_filter = (aout_filter_t *)p_this; - if ( p_filter->input.i_format != VLC_FOURCC('s','8',' ',' ') - || p_filter->output.i_format != VLC_FOURCC('f','l','3','2') ) + if ( p_filter->input.i_format != VLC_CODEC_S8 + || p_filter->output.i_format != VLC_CODEC_FL32 ) { return -1; } @@ -594,7 +635,7 @@ static int Create_S8ToFL32( vlc_object_t *p_this ) } p_filter->pf_do_work = Do_S8ToFL32; - p_filter->b_in_place = VLC_TRUE; + p_filter->b_in_place = true; return 0; } @@ -602,6 +643,7 @@ static int Create_S8ToFL32( vlc_object_t *p_this ) static void Do_S8ToFL32( aout_instance_t * p_aout, aout_filter_t * p_filter, aout_buffer_t * p_in_buf, aout_buffer_t * p_out_buf ) { + VLC_UNUSED(p_aout); int i = p_in_buf->i_nb_samples * aout_FormatNbChannels( &p_filter->input ); /* We start from the end because b_in_place is true */ @@ -625,8 +667,8 @@ static int Create_U8ToFL32( vlc_object_t *p_this ) { aout_filter_t * p_filter = (aout_filter_t *)p_this; - if ( p_filter->input.i_format != VLC_FOURCC('u','8',' ',' ') - || p_filter->output.i_format != VLC_FOURCC('f','l','3','2') ) + if ( p_filter->input.i_format != VLC_CODEC_U8 + || p_filter->output.i_format != VLC_CODEC_FL32 ) { return -1; } @@ -637,7 +679,7 @@ static int Create_U8ToFL32( vlc_object_t *p_this ) } p_filter->pf_do_work = Do_U8ToFL32; - p_filter->b_in_place = VLC_TRUE; + p_filter->b_in_place = true; return 0; } @@ -645,6 +687,7 @@ static int Create_U8ToFL32( vlc_object_t *p_this ) static void Do_U8ToFL32( aout_instance_t * p_aout, aout_filter_t * p_filter, aout_buffer_t * p_in_buf, aout_buffer_t * p_out_buf ) { + VLC_UNUSED(p_aout); int i = p_in_buf->i_nb_samples * aout_FormatNbChannels( &p_filter->input ); /* We start from the end because b_in_place is true */