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