From 8cfc8c969c4052f104b06816fc85cf4f8c7a3037 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= <remi@remlab.net> Date: Wed, 3 Aug 2011 17:23:39 +0300 Subject: [PATCH] aout: support indirect sample format conversion (fix #5150) --- src/audio_output/filters.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/audio_output/filters.c b/src/audio_output/filters.c index 3e8904f7ab8d..64e3983496c6 100644 --- a/src/audio_output/filters.c +++ b/src/audio_output/filters.c @@ -36,6 +36,7 @@ #include <vlc_aout.h> #include <vlc_filter.h> +#include <vlc_cpu.h> #include "aout_internal.h" #include <libvlc.h> @@ -100,7 +101,20 @@ static int SplitConversion( const audio_sample_format_t *restrict infmt, midfmt->i_original_channels = infmt->i_original_channels; } else - return -1; + { + assert( infmt->i_format != outfmt->i_format ); + if( AOUT_FMT_NON_LINEAR( infmt ) ) + { + if( AOUT_FMT_NON_LINEAR( outfmt ) ) + return -1; /* no indirect non-linear -> non-linear */ + /* NOTE: our non-linear -> linear filters always output 32-bits */ + midfmt->i_format = HAVE_FPU ? VLC_CODEC_FL32 : VLC_CODEC_FI32; + } + else + /* NOTE: Use S16N as intermediate. We have all conversions to S16N, + * and all useful conversions from S16N. TODO: FL32 if HAVE_FPU. */ + midfmt->i_format = VLC_CODEC_S16N; + } aout_FormatPrepare( midfmt ); return AOUT_FMTS_IDENTICAL( infmt, midfmt ) ? -1 : 0; -- GitLab