X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=modules%2Faudio_filter%2Fconverter%2Ffloat.c;h=223aa1e3ad82eb065f614647d08a915624f42c47;hb=63980c43dd72fe0f6909f61304a5384743e452ee;hp=04d887694a4963e008963a903b116528b8d4d395;hpb=2ea3b5fc8afa530afc65d520b33ef7edc354f775;p=vlc diff --git a/modules/audio_filter/converter/float.c b/modules/audio_filter/converter/float.c index 04d887694a..223aa1e3ad 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 @@ -392,7 +393,8 @@ 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->input.i_format != AOUT_FMT_S24_NE && + p_filter->input.i_format != AOUT_FMT_S32_NE ) || p_filter->output.i_format != VLC_FOURCC('f','l','3','2') ) { return -1; @@ -403,8 +405,10 @@ 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 == AOUT_FMT_S32_NE ) + p_filter->pf_do_work = Do_S32ToFL32; + else if( p_filter->input.i_format == AOUT_FMT_S24_NE ) + p_filter->pf_do_work = Do_S24ToFL32; else p_filter->pf_do_work = Do_S16ToFL32; @@ -441,10 +445,10 @@ 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); @@ -470,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 *****************************************************************************/ @@ -498,16 +521,28 @@ static int Create_S16ToFL32_SW( vlc_object_t *p_this ) && p_filter->output.i_format == VLC_FOURCC('f','l','3','2') && p_filter->input.i_format != AOUT_FMT_S24_NE ) { - p_filter->pf_do_work = Do_S16ToFL24_SW; + 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','3','2','l') || + p_filter->input.i_format == VLC_FOURCC('s','3','2','b')) + && p_filter->output.i_format == VLC_FOURCC('f','l','3','2') + && p_filter->input.i_format != AOUT_FMT_S32_NE ) + { + 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 ); @@ -516,45 +551,21 @@ static void Do_S16ToFL32_SW( aout_instance_t * p_aout, aout_filter_t * p_filter, 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 - uint8_t p_tmp[2]; - p_in = (int16_t *)p_in_buf->p_buffer + i - 1; -#endif while( i-- ) - { -#ifndef HAVE_SWAB - p_tmp[0] = ((uint8_t *)p_in)[1]; - p_tmp[1] = ((uint8_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 ); @@ -585,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 *****************************************************************************/