[MPlayer-dev-eng] [PATCH] Automatic downmix
Clément Bœsch
ubitux at gmail.com
Sun Sep 26 10:55:51 CEST 2010
On Sun, Sep 26, 2010 at 10:49:29AM +0200, Nicolas George wrote:
> Le quintidi 5 vendémiaire, an CCXIX, Clément Bœsch a écrit :
> > It's "historical"; there was a time where I needed to check the return
> > value in order to reinit or not the chain list. As I said in a previous
> > mail, I can remove it but I'm not sure it's harmless to keep it (if it
> > needs to be checked later).
>
> I committed the patch with the return value removed. If someone needs to
> check it, it takes a few seconds to add it back, and in the meantime,
> someone who reads the code will not wonder what it is there for.
>
OK. Then I attach two versions of the patch:
- patch-auto-downmix-pan.diff: my naive/arbitrary values
- patch-auto-downmix-pan-new-coeff.diff: with better values :)
I'm fine with both, but I think the second one is better. You to judge.
> Thanks for your efforts.
>
> Regards,
>
Thanks to you,
Regards,
--
Clément B.
-------------- next part --------------
Index: libaf/af.c
===================================================================
--- libaf/af.c (revision 32355)
+++ libaf/af.c (working copy)
@@ -21,6 +21,7 @@
#include <stdlib.h>
#include <string.h>
#include "osdep/strsep.h"
+#include "libmpcodecs/dec_audio.h"
#include "af.h"
@@ -412,6 +413,26 @@
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
@@ -438,6 +459,9 @@
// 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 != audio_output_channels && 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]){
-------------- next part --------------
Index: libaf/af.c
===================================================================
--- libaf/af.c (revision 32355)
+++ libaf/af.c (working copy)
@@ -21,6 +21,7 @@
#include <stdlib.h>
#include <string.h>
#include "osdep/strsep.h"
+#include "libmpcodecs/dec_audio.h"
#include "af.h"
@@ -412,6 +413,26 @@
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 LFE AL AR */
+ [3] = "pan=2:" ".586:0:" "0:.586:" ".414:.414",
+ [4] = "pan=2:" ".500:0:" "0:.500:" ".500:0:" "0:.500",
+ [5] = "pan=2:" ".369:0:" "0:.369:" ".369:0:" "0:.369:" ".261:.261",
+ [6] = "pan=2:" ".293:0:" "0:.293:" ".293:0:" "0:.293:" ".207:.207:" ".207:.207",
+ [7] = "pan=2:" ".270:0:" "0:.270:" ".270:0:" "0:.270:" ".191:.191:" ".270:0:" "0:.270",
+ [8] = "pan=2:" ".227:0:" "0:.227:" ".227:0:" "0:.227:" ".160:.160:" ".160:.160:" ".227:0:" "0:.227",
+ };
+ 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
@@ -438,6 +459,9 @@
// 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 != audio_output_channels && 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]){
More information about the MPlayer-dev-eng
mailing list