audio-channels: make method to get default channel-mask
authorWim Taymans <wtaymans@redhat.com>
Thu, 5 Nov 2015 09:40:18 +0000 (10:40 +0100)
committerWim Taymans <wtaymans@redhat.com>
Thu, 5 Nov 2015 09:52:53 +0000 (10:52 +0100)
Add a new method to get the default channel-mask.
Use the new method on audiodecoder and audioconvert.

API: gst_audio_channel_get_default_mask()

gst-libs/gst/audio/audio-channels.c
gst-libs/gst/audio/audio-channels.h
gst-libs/gst/audio/gstaudiodecoder.c
gst/audioconvert/gstaudioconvert.c
win32/common/libgstaudio.def

index 515eb94..d648911 100644 (file)
@@ -459,3 +459,56 @@ gst_audio_channel_positions_to_valid_order (GstAudioChannelPosition * position,
 
   return TRUE;
 }
+
+#define _P(pos) (G_GUINT64_CONSTANT (1) << GST_AUDIO_CHANNEL_POSITION_ ##pos)
+
+static const guint64 default_masks[] = {
+  /* 1 channel */
+  0,
+  /* 2 channels */
+  _P (FRONT_LEFT) | _P (FRONT_RIGHT),
+  /* 3 channels (2.1) */
+  _P (FRONT_LEFT) | _P (FRONT_RIGHT) | _P (LFE1),
+  /* 4 channels (4.0) */
+  _P (FRONT_LEFT) | _P (FRONT_RIGHT) | _P (REAR_LEFT) | _P (REAR_RIGHT),
+  /* 5 channels */
+  _P (FRONT_LEFT) | _P (FRONT_RIGHT) | _P (REAR_LEFT) | _P (REAR_RIGHT)
+      | _P (FRONT_CENTER),
+  /* 6 channels (5.1) */
+  _P (FRONT_LEFT) |
+      _P (FRONT_RIGHT) |
+      _P (REAR_LEFT) | _P (REAR_RIGHT) | _P (FRONT_CENTER) | _P (LFE1),
+  /* 7 channels (6.1) */
+  _P (FRONT_LEFT) |
+      _P (FRONT_RIGHT) |
+      _P (REAR_LEFT) |
+      _P (REAR_RIGHT) | _P (FRONT_CENTER) | _P (LFE1) | _P (REAR_CENTER),
+  /* 8 channels (7.1) */
+  _P (FRONT_LEFT) |
+      _P (FRONT_RIGHT) |
+      _P (REAR_LEFT) |
+      _P (REAR_RIGHT) |
+      _P (FRONT_CENTER) | _P (LFE1) | _P (SIDE_LEFT) | _P (SIDE_RIGHT),
+};
+
+/**
+ * gst_audio_channel_get_default_mask:
+ * @channels: the number of channels
+ *
+ * Get the default channel-mask for the given number of channels.
+ *
+ * Returns: the default channel-mask for @channels or 0 when there is no default
+ * mask.
+ *
+ * Since: 1.8
+ */
+guint64
+gst_audio_channel_get_default_mask (gint channels)
+{
+  g_return_val_if_fail (channels > 0, 0);
+
+  if (channels > 8)
+    return 0;
+
+  return default_masks[channels - 1];
+}
index 9481839..342825b 100644 (file)
@@ -160,6 +160,7 @@ gboolean       gst_audio_get_channel_reorder_map (gint channels,
                                                   const GstAudioChannelPosition * from,
                                                   const GstAudioChannelPosition * to,
                                                   gint *reorder_map);
+guint64        gst_audio_channel_get_default_mask (gint channels);
 
 G_END_DECLS
 
index f4c663a..744e00e 100644 (file)
@@ -290,70 +290,6 @@ struct _GstAudioDecoderPrivate
   gboolean use_default_pad_acceptcaps;
 };
 
-//* Default channel layouts taken from audioconvert */
-static const GstAudioChannelPosition default_positions[8][8] = {
-  /* 1 channel */
-  {
-        GST_AUDIO_CHANNEL_POSITION_MONO,
-      },
-  /* 2 channels */
-  {
-        GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
-      },
-  /* 3 channels (2.1) */
-  {
-        GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
-        GST_AUDIO_CHANNEL_POSITION_LFE1,
-      },
-  /* 4 channels (4.0) */
-  {
-        GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
-        GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
-      },
-  /* 5 channels */
-  {
-        GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
-        GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
-        GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
-      },
-  /* 6 channels (5.1) */
-  {
-        GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
-        GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
-        GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
-        GST_AUDIO_CHANNEL_POSITION_LFE1,
-      },
-  /* 7 channels (6.1) */
-  {
-        GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
-        GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
-        GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
-        GST_AUDIO_CHANNEL_POSITION_LFE1,
-        GST_AUDIO_CHANNEL_POSITION_REAR_CENTER,
-      },
-  /* 8 channels (7.1) */
-  {
-        GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
-        GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
-        GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
-        GST_AUDIO_CHANNEL_POSITION_LFE1,
-        GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT,
-      }
-};
-
 static void gst_audio_decoder_finalize (GObject * object);
 static void gst_audio_decoder_set_property (GObject * object,
     guint prop_id, const GValue * value, GParamSpec * pspec);
@@ -2069,12 +2005,8 @@ gst_audio_decoder_negotiate_default_caps (GstAudioDecoder * dec)
   /* Need to add a channel-mask if channels > 2 */
   gst_structure_get_int (structure, "channels", &channels);
   if (channels > 2 && !gst_structure_has_field (structure, "channel-mask")) {
-    if (channels <= 8) {
-      channel_mask = 0;
-      for (i = 0; i < channels; i++)
-        channel_mask |=
-            G_GUINT64_CONSTANT (1) << default_positions[channels - 1][i];
-
+    channel_mask = gst_audio_channel_get_default_mask (channels);
+    if (channel_mask != 0) {
       gst_structure_set (structure, "channel-mask",
           GST_TYPE_BITMASK, channel_mask, NULL);
     } else {
index 896e293..707a07e 100644 (file)
@@ -346,69 +346,6 @@ gst_audio_convert_transform_caps (GstBaseTransform * btrans,
   return result;
 }
 
-static const GstAudioChannelPosition default_positions[8][8] = {
-  /* 1 channel */
-  {
-        GST_AUDIO_CHANNEL_POSITION_MONO,
-      },
-  /* 2 channels */
-  {
-        GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
-      },
-  /* 3 channels (2.1) */
-  {
-        GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
-        GST_AUDIO_CHANNEL_POSITION_LFE1,
-      },
-  /* 4 channels (4.0) */
-  {
-        GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
-        GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
-      },
-  /* 5 channels */
-  {
-        GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
-        GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
-        GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
-      },
-  /* 6 channels (5.1) */
-  {
-        GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
-        GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
-        GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
-        GST_AUDIO_CHANNEL_POSITION_LFE1,
-      },
-  /* 7 channels (6.1) */
-  {
-        GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
-        GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
-        GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
-        GST_AUDIO_CHANNEL_POSITION_LFE1,
-        GST_AUDIO_CHANNEL_POSITION_REAR_CENTER,
-      },
-  /* 8 channels (7.1) */
-  {
-        GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
-        GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
-        GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
-        GST_AUDIO_CHANNEL_POSITION_LFE1,
-        GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
-        GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT,
-      }
-};
-
 static gint
 n_bits_set (guint64 x)
 {
@@ -683,15 +620,9 @@ gst_audio_convert_fixate_channels (GstBaseTransform * base, GstStructure * ins,
    * and try to add/remove channels from the input layout, or pick a default
    * layout based on LFE-presence in input layout, but let's save that for
    * another day) */
-  if (out_chans > 0 && out_chans <= G_N_ELEMENTS (default_positions[0])) {
-    gint i;
-
+  if (out_chans > 0
+      && (out_mask = gst_audio_channel_get_default_mask (out_chans))) {
     GST_DEBUG_OBJECT (base, "using default channel layout as fallback");
-
-    out_mask = 0;
-    for (i = 0; i < out_chans; i++)
-      out_mask |= G_GUINT64_CONSTANT (1) << default_positions[out_chans - 1][i];
-
     gst_structure_set (outs, "channel-mask", GST_TYPE_BITMASK, out_mask, NULL);
   } else {
     GST_ERROR_OBJECT (base, "Have no default layout for %d channels",
index ea0ea84..3892ce5 100644 (file)
@@ -27,6 +27,7 @@ EXPORTS
        gst_audio_cd_src_add_track
        gst_audio_cd_src_get_type
        gst_audio_cd_src_mode_get_type
+       gst_audio_channel_get_default_mask
        gst_audio_channel_position_get_type
        gst_audio_channel_positions_from_mask
        gst_audio_channel_positions_to_mask