Add some more default channel layouts, these should be good for AAC at least
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Fri, 5 Oct 2012 13:09:17 +0000 (15:09 +0200)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Mon, 15 Oct 2012 14:28:42 +0000 (16:28 +0200)
sys/androidmedia/gstamc.c

index 122a79c..fb29c70 100644 (file)
@@ -2515,15 +2515,45 @@ gst_amc_audio_channel_mask_to_positions (guint32 channel_mask, gint channels)
   GstAudioChannelPosition *pos = g_new0 (GstAudioChannelPosition, channels);
   gint i, j;
 
-  if (channel_mask == 0 && channels == 1) {
-    pos[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_MONO;
-    return pos;
-  }
+  if (channel_mask == 0) {
+    if (channels == 1) {
+      pos[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_MONO;
+      return pos;
+    }
+    if (channels == 2) {
+      pos[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT;
+      pos[1] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT;
+      return pos;
+    }
 
-  if (channel_mask == 0 && channels == 2) {
-    pos[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT;
-    pos[1] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT;
-    return pos;
+    /* Now let the guesswork begin, these are the
+     * AAC default channel assignments for these numbers
+     * of channels */
+    if (channels == 3) {
+      channel_mask =
+          CHANNEL_OUT_FRONT_LEFT | CHANNEL_OUT_FRONT_RIGHT |
+          CHANNEL_OUT_FRONT_CENTER;
+    } else if (channels == 4) {
+      channel_mask =
+          CHANNEL_OUT_FRONT_LEFT | CHANNEL_OUT_FRONT_RIGHT |
+          CHANNEL_OUT_FRONT_CENTER | CHANNEL_OUT_BACK_CENTER;
+    } else if (channels == 5) {
+      channel_mask =
+          CHANNEL_OUT_FRONT_LEFT | CHANNEL_OUT_FRONT_RIGHT |
+          CHANNEL_OUT_FRONT_CENTER | CHANNEL_OUT_BACK_LEFT |
+          CHANNEL_OUT_BACK_RIGHT;
+    } else if (channels == 6) {
+      channel_mask =
+          CHANNEL_OUT_FRONT_LEFT | CHANNEL_OUT_FRONT_RIGHT |
+          CHANNEL_OUT_FRONT_CENTER | CHANNEL_OUT_BACK_LEFT |
+          CHANNEL_OUT_BACK_RIGHT | CHANNEL_OUT_LOW_FREQUENCY;
+    } else if (channels == 8) {
+      channel_mask =
+          CHANNEL_OUT_FRONT_LEFT | CHANNEL_OUT_FRONT_RIGHT |
+          CHANNEL_OUT_FRONT_CENTER | CHANNEL_OUT_BACK_LEFT |
+          CHANNEL_OUT_BACK_RIGHT | CHANNEL_OUT_LOW_FREQUENCY |
+          CHANNEL_OUT_FRONT_LEFT_OF_CENTER | CHANNEL_OUT_FRONT_RIGHT_OF_CENTER;
+    }
   }
 
   for (i = 0, j = 0; i < G_N_ELEMENTS (channel_mapping_table); i++) {