avcodecmap: Add special mapping for mono channel layouts
authorSebastian Dröge <sebastian@centricular.com>
Thu, 24 Dec 2015 12:06:13 +0000 (13:06 +0100)
committerSebastian Dröge <sebastian@centricular.com>
Thu, 24 Dec 2015 12:10:55 +0000 (13:10 +0100)
In ffmpeg this is the same as FRONT_CENTER, but we distinguish between
FRONT_CENTER and MONO in GStreamer. Add an explicit mapping for this special
case in the translations functions.

https://bugzilla.gnome.org/show_bug.cgi?id=759846

ext/libav/gstavcodecmap.c

index 14686dd..11a9ed2 100644 (file)
@@ -99,6 +99,9 @@ gst_ffmpeg_channel_positions_to_layout (GstAudioChannelPosition * pos,
   if (!pos)
     return 0;
 
+  if (channels == 1 && pos[0] == GST_AUDIO_CHANNEL_POSITION_MONO)
+    return AV_CH_LAYOUT_MONO;
+
   for (i = 0; i < channels; i++) {
     for (j = 0; j < G_N_ELEMENTS (_ff_to_gst_layout); j++) {
       if (_ff_to_gst_layout[j].gst == pos[i]) {
@@ -127,6 +130,15 @@ gst_ffmpeg_channel_layout_to_gst (guint64 channel_layout, gint channels,
   } else {
     guint i, j;
 
+    /* Special path for mono, as AV_CH_LAYOUT_MONO is the same
+     * as FRONT_CENTER but we distinguish between the two in
+     * GStreamer
+     */
+    if (channels == 1 && channel_layout == AV_CH_LAYOUT_MONO) {
+      pos[0] = GST_AUDIO_CHANNEL_POSITION_MONO;
+      return TRUE;
+    }
+
     for (i = 0; i < 64; i++) {
       if ((channel_layout & (G_GUINT64_CONSTANT (1) << i)) != 0) {
         nchannels++;