[MPlayer-dev-eng] [PATCH] Automatic downmix
Clément Bœsch
ubitux at gmail.com
Thu Sep 16 21:31:39 CEST 2010
On Tue, Sep 14, 2010 at 08:29:07PM +0200, Clément Bœsch wrote:
> So here is a new version of the patch.
And here is a new one with a small design changement you may prefer.
Regards,
--
Clément B.
-------------- next part --------------
Index: libaf/af.c
===================================================================
--- libaf/af.c (revision 32278)
+++ 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,24 @@
return AF_OK;
}
+/**
+ * Automatic downmix to stereo in case the codec does not implement it.
+ */
+static af_instance_t *af_downmix(af_stream_t* s)
+{
+ static 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",
+ };
+ char *af_pan_str = downmix_strs[s->last->data->nch];
+ return af_pan_str ? af_append(s, s->last, af_pan_str) : NULL;
+}
+
/* 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
@@ -460,6 +479,13 @@
if (!af_append(s,s->first,"dummy") || AF_OK != af_reinit(s,s->first))
return -1;
+ // Append a downmix pan filter to the end of the chain if needed
+ if (audio_output_channels == 2) {
+ af_instance_t *filter = af_downmix(s);
+ if (filter && AF_OK != af_reinit(s, filter))
+ return -1;
+ }
+
// Check output format
if((AF_INIT_TYPE_MASK & s->cfg.force) != AF_INIT_FORCE){
af_instance_t* af = NULL; // New filter
More information about the MPlayer-dev-eng
mailing list