fdkaacenc: Add missing SURROUND mappings
authorVivia Nikolaidou <vivia@ahiru.eu>
Thu, 18 Jun 2020 09:15:09 +0000 (12:15 +0300)
committerSebastian Dröge <slomo@coaxion.net>
Mon, 22 Jun 2020 07:14:20 +0000 (07:14 +0000)
SURROUND is more to spec according to the FIXME comments, so add this.

Also add SIDE for 5 and 5.1 because of ffmpeg compatibility, because the
following pipeline downmixes to mono otherwise:

gst-launch-1.0 audiotestsrc num-buffers=1 ! audio/x-raw, channels=6 !
avenc_ac3 ! avdec_ac3 ! audioconvert ! fdkaacenc ! fakesink -v

Fixes #1327

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1352>

ext/fdkaac/gstfdkaacenc.c

index 9871c45..3310f53 100644 (file)
@@ -55,6 +55,7 @@ enum
                     "88200, " \
                     "96000"
 
+/* *INDENT-OFF* */
 static const struct
 {
   gint channels;
@@ -64,111 +65,188 @@ static const struct
   {
     /* MPEG 1: Mono */
     1, MODE_1, {
-  GST_AUDIO_CHANNEL_POSITION_MONO}}, {
+          GST_AUDIO_CHANNEL_POSITION_MONO}}, {
     /* MPEG 2: Stereo */
     2, MODE_2, {
-  GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
           GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}}, {
     /* MPEG 3: Stereo + Center */
     3, MODE_1_2, {
-  GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
           GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
           GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}}, {
     /* MPEG 4: Stereo + Center + Rear center */
     4, MODE_1_2_1, {
-  GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
           GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
           GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
           GST_AUDIO_CHANNEL_POSITION_REAR_CENTER}}, {
     /* MPEG 5: 5.0 Surround */
     5, MODE_1_2_2, {
-      GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
           GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
           GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
-          /* FIXME: SURROUND instead of REAR is more to spec */
-  GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
           GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}}, {
+    5, MODE_1_2_2, {
+          GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+          GST_AUDIO_CHANNEL_POSITION_SURROUND_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_SURROUND_RIGHT}}, {
+    /* MPEG 5: 5.0 Surround with SIDE (ffmpeg produces this) */
+    5, MODE_1_2_2, {
+  GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+          GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT}}, {
     /* MPEG 6: 5.1 Surround */
     6, MODE_1_2_2_1, {
-      GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
           GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
           GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
-          /* FIXME: SURROUND instead of REAR is more to spec */
-  GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
           GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
           GST_AUDIO_CHANNEL_POSITION_LFE1}}, {
+    6, MODE_1_2_2_1, {
+          GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+          GST_AUDIO_CHANNEL_POSITION_SURROUND_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_SURROUND_RIGHT,
+          GST_AUDIO_CHANNEL_POSITION_LFE1}}, {
+    /* MPEG 6: 5.1 Surround with SIDE (ffmpeg produces this) */
+    6, MODE_1_2_2_1, {
+          GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+          GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT,
+          GST_AUDIO_CHANNEL_POSITION_LFE1}}, {
+    /* Note: 8-channel layouts might also have informal variants with
+     * SIDE instead of SURROUND, but they are more complicated. They
+     * can be added here if the need arises */
     /* MPEG 7: SDDS for cinema */
     8, MODE_1_2_2_2_1, {
-      GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
           GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
           GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER,
           GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
           GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
-          /* FIXME: SURROUND instead of REAR is more to spec */
-  GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
           GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
+          GST_AUDIO_CHANNEL_POSITION_LFE1}}, {
+    8, MODE_1_2_2_2_1, {
+          GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+          GST_AUDIO_CHANNEL_POSITION_SURROUND_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_SURROUND_RIGHT,
           GST_AUDIO_CHANNEL_POSITION_LFE1}}
 #ifdef HAVE_FDK_AAC_2_0_0
   , {
     /* MPEG 11: 6.1 Surround */
     7, MODE_6_1, {
-      GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
           GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
           GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
-          /* FIXME: SURROUND instead of REAR is more to spec */
-  GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
           GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
           GST_AUDIO_CHANNEL_POSITION_REAR_CENTER,
           GST_AUDIO_CHANNEL_POSITION_LFE1}}, {
+    7, MODE_6_1, {
+          GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+          GST_AUDIO_CHANNEL_POSITION_SURROUND_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_SURROUND_RIGHT,
+          GST_AUDIO_CHANNEL_POSITION_REAR_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_LFE1}}, {
     /* MPEG 12: 7.1 Surround */
     8, MODE_7_1_BACK, {
-      GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
           GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
           GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
-          /* FIXME: SURROUND instead of SIDE is more to spec */
-  GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
           GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT,
           GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
           GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
           GST_AUDIO_CHANNEL_POSITION_LFE1}}, {
+    8, MODE_7_1_BACK, {
+          GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+          GST_AUDIO_CHANNEL_POSITION_SURROUND_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_SURROUND_RIGHT,
+          GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
+          GST_AUDIO_CHANNEL_POSITION_LFE1}}, {
     /* MPEG 14: 5.1.2 Surround */
     8, MODE_7_1_TOP_FRONT, {
-      GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
           GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
           GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
-          /* FIXME: SURROUND instead of REAR is more to spec */
-  GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
           GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
           GST_AUDIO_CHANNEL_POSITION_LFE1,
           GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_RIGHT}}, {
+    8, MODE_7_1_TOP_FRONT, {
+          GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+          GST_AUDIO_CHANNEL_POSITION_SURROUND_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_SURROUND_RIGHT,
+          GST_AUDIO_CHANNEL_POSITION_LFE1,
+          GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_LEFT,
           GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_RIGHT}}
 #endif
 #ifdef HAVE_FDK_AAC_0_1_4
   , {
     /* Non-standard PCE clone of mode 12 */
     8, MODE_7_1_REAR_SURROUND, {
-      GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
           GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
           GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
-          /* FIXME: SURROUND instead of SIDE is more to spec */
-  GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
           GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT,
           GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
           GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
           GST_AUDIO_CHANNEL_POSITION_LFE1}}, {
+    8, MODE_7_1_REAR_SURROUND, {
+          GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+          GST_AUDIO_CHANNEL_POSITION_SURROUND_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_SURROUND_RIGHT,
+          GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
+          GST_AUDIO_CHANNEL_POSITION_LFE1}}, {
     /* Non-standard PCE clone of mode 7 */
     8, MODE_7_1_FRONT_CENTER, {
-      GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
           GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
           GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER,
           GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
           GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
-          /* FIXME: SURROUND instead of REAR is more to spec */
-  GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
           GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
+          GST_AUDIO_CHANNEL_POSITION_LFE1}}, {
+    8, MODE_7_1_FRONT_CENTER, {
+          GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+          GST_AUDIO_CHANNEL_POSITION_SURROUND_LEFT,
+          GST_AUDIO_CHANNEL_POSITION_SURROUND_RIGHT,
           GST_AUDIO_CHANNEL_POSITION_LFE1}}
 #endif
 };
+/* *INDENT-ON* */
 
 static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
     GST_PAD_SINK,