summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2011-12-31 13:33:01 +0100
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2012-01-05 10:34:24 +0100
commite2c6b8ec4d04520ae5329da2cf3a7b3bb9d7a40e (patch)
treea2f0099e3a4e0497629b26fe7d2b1c2e87fef5e3
parentbd409364092fe7c79b08d392a0ac756885ee81ab (diff)
audio: Add function to reorder channel positions from any order to the GStreamer order
-rw-r--r--gst-libs/gst/audio/audio.c45
-rw-r--r--gst-libs/gst/audio/audio.h3
2 files changed, 48 insertions, 0 deletions
diff --git a/gst-libs/gst/audio/audio.c b/gst-libs/gst/audio/audio.c
index 8e0de022a..e8c62bab7 100644
--- a/gst-libs/gst/audio/audio.c
+++ b/gst-libs/gst/audio/audio.c
@@ -1103,3 +1103,48 @@ gst_audio_get_channel_reorder_map (gint channels,
return TRUE;
}
+
+/**
+ * gst_audio_channel_positions_to_valid_order:
+ * @position: The channel positions to reorder to.
+ * @channels: The number of channels.
+ *
+ * Reorders the channel positions in @position from any order to
+ * the GStreamer channel order.
+ *
+ * Returns: %TRUE if the channel positions are valid and reordering
+ * was successful.
+ */
+gboolean
+gst_audio_channel_positions_to_valid_order (GstAudioChannelPosition * position,
+ gint channels)
+{
+ GstAudioChannelPosition tmp[64];
+ guint64 channel_mask = 0;
+ gint i, j;
+
+ g_return_val_if_fail (channels > 0, FALSE);
+ g_return_val_if_fail (position != NULL, FALSE);
+ g_return_val_if_fail (check_valid_channel_positions (position, channels,
+ FALSE, NULL), FALSE);
+
+ if (channels == 1 && position[0] == GST_AUDIO_CHANNEL_POSITION_MONO)
+ return TRUE;
+ if (position[0] == GST_AUDIO_CHANNEL_POSITION_NONE)
+ return TRUE;
+
+ check_valid_channel_positions (position, channels, FALSE, &channel_mask);
+
+ memset (tmp, 0xff, sizeof (tmp));
+ j = 0;
+ for (i = 0; i < 64; i++) {
+ if ((channel_mask & (G_GUINT64_CONSTANT (1) << i))) {
+ tmp[j] = i;
+ j++;
+ }
+ }
+
+ memcpy (position, tmp, sizeof (tmp[0]) * channels);
+
+ return TRUE;
+}
diff --git a/gst-libs/gst/audio/audio.h b/gst-libs/gst/audio/audio.h
index c8068184d..f2e45224f 100644
--- a/gst-libs/gst/audio/audio.h
+++ b/gst-libs/gst/audio/audio.h
@@ -532,6 +532,9 @@ gboolean gst_audio_reorder_channels (gpointer data, gsize size,
const GstAudioChannelPosition * from,
const GstAudioChannelPosition * to);
+gboolean gst_audio_channel_positions_to_valid_order (GstAudioChannelPosition *position,
+ gint channels);
+
gboolean gst_audio_check_valid_channel_positions (const GstAudioChannelPosition *position,
gint channels, gboolean force_order);