From 579d743159c665b643e5c53d7e0cf27e89043ac4 Mon Sep 17 00:00:00 2001 From: cigaes Date: Sun, 26 Sep 2010 08:45:40 +0000 Subject: [PATCH] audio: auto-add downmix filter when stereo output is requested MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When -channels 2 [default] is specified and the audio decoder used does not support internal downmixing, automatically add a pan filter after the decoder to downmix to stereo. Patch by Clément Bœsch, ubitux gmail com git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@32356 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libaf/af.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/libaf/af.c b/libaf/af.c index 5238e6bc85..0190a75f5e 100644 --- a/libaf/af.c +++ b/libaf/af.c @@ -410,6 +410,26 @@ static int fixup_output_format(af_stream_t* s) return AF_OK; } +/** + * Automatic downmix to stereo in case the codec does not implement it. + */ +static void af_downmix(af_stream_t* s) +{ + static const char * const downmix_strs[AF_NCH + 1] = { + /* FL FR RL RR FC LF AL AR */ + [3] = "pan=2:" "0.6:0:" "0:0.6:" "0.4:0.4", + [4] = "pan=2:" "0.6:0:" "0:0.6:" "0.4:0:" "0:0.4", + [5] = "pan=2:" "0.5:0:" "0:0.5:" "0.2:0:" "0:0.2:" "0.3:0.3", + [6] = "pan=2:" "0.4:0:" "0:0.4:" "0.2:0:" "0:0.2:" "0.3:0.3:" "0.1:0.1", + [7] = "pan=2:" "0.4:0:" "0:0.4:" "0.2:0:" "0:0.2:" "0.3:0.3:" "0.1:0:" "0:0.1", + [8] = "pan=2:" "0.4:0:" "0:0.4:" "0.15:0:" "0:0.15:" "0.25:0.25:" "0.1:0.1:" "0.1:0:" "0:0.1", + }; + const char *af_pan_str = downmix_strs[s->input.nch]; + + if (af_pan_str) + af_append(s, s->first, af_pan_str); +} + /* Initialize the stream "s". This function creates a new filter list if necessary according to the values set in input and output. Input and output should contain the format of the current movie and the @@ -421,6 +441,7 @@ static int fixup_output_format(af_stream_t* s) The return value is 0 if success and -1 if failure */ int af_init(af_stream_t* s) { + struct MPOpts *opts = s->opts; int i=0; // Sanity check @@ -436,6 +457,10 @@ int af_init(af_stream_t* s) // Check if this is the first call if(!s->first){ + // Append a downmix pan filter at the beginning of the chain if needed + if (s->input.nch != opts->audio_output_channels + && opts->audio_output_channels == 2) + af_downmix(s); // Add all filters in the list (if there are any) if (s->cfg.list) { while(s->cfg.list[i]){