audio: Add public functions to check channel positions validity and to get a reorder map

This commit is contained in:
Sebastian Dröge 2011-12-24 10:37:28 +01:00
parent ee80a97a2a
commit c9c12372a5
2 changed files with 58 additions and 26 deletions

View file

@ -943,42 +943,28 @@ gst_audio_buffer_reorder_channels (GstBuffer * buffer,
} }
gboolean gboolean
gst_audio_reorder_channels (gpointer data, gsize size, GstAudioFormat format, gst_audio_check_valid_channel_positions (const GstAudioChannelPosition *
gint channels, const GstAudioChannelPosition * from, position, gint channels, gboolean force_order)
const GstAudioChannelPosition * to)
{ {
const GstAudioFormatInfo *info; return check_valid_channel_positions (position, channels, force_order, NULL);
gint i, j, n; }
gint reorder_map[64] = { 0, };
guint8 *ptr;
gint bpf, bps;
guint8 tmp[64 * 8];
info = gst_audio_format_get_info (format); gboolean
gst_audio_get_channel_reorder_map (gint channels,
const GstAudioChannelPosition * from, const GstAudioChannelPosition * to,
gint * reorder_map)
{
gint i, j;
g_return_val_if_fail (data != NULL, FALSE); g_return_val_if_fail (reorder_map != NULL, FALSE);
g_return_val_if_fail (from != NULL, FALSE);
g_return_val_if_fail (info != NULL && info->width > 0, FALSE);
g_return_val_if_fail (info->width > 0, FALSE);
g_return_val_if_fail (info->width <= 8 * 64, FALSE);
g_return_val_if_fail (size % ((info->width * channels) / 8) != 0, FALSE);
g_return_val_if_fail (channels > 0, FALSE); g_return_val_if_fail (channels > 0, FALSE);
g_return_val_if_fail (channels <= 64, FALSE); g_return_val_if_fail (from != NULL, FALSE);
g_return_val_if_fail (to != NULL, FALSE); g_return_val_if_fail (to != NULL, FALSE);
g_return_val_if_fail (check_valid_channel_positions (from, channels, FALSE, g_return_val_if_fail (check_valid_channel_positions (from, channels, FALSE,
NULL), FALSE); NULL), FALSE);
g_return_val_if_fail (check_valid_channel_positions (to, channels, FALSE, g_return_val_if_fail (check_valid_channel_positions (to, channels, FALSE,
NULL), FALSE); NULL), FALSE);
if (size == 0)
return TRUE;
if (memcmp (from, to, channels * sizeof (from[0])) == 0)
return TRUE;
bps = info->width / 8;
bpf = bps * channels;
/* Build reorder map and check compatibility */ /* Build reorder map and check compatibility */
for (i = 0; i < channels; i++) { for (i = 0; i < channels; i++) {
if (from[i] == GST_AUDIO_CHANNEL_POSITION_NONE if (from[i] == GST_AUDIO_CHANNEL_POSITION_NONE
@ -1003,6 +989,44 @@ gst_audio_reorder_channels (gpointer data, gsize size, GstAudioFormat format,
return FALSE; return FALSE;
} }
return TRUE;
}
gboolean
gst_audio_reorder_channels (gpointer data, gsize size, GstAudioFormat format,
gint channels, const GstAudioChannelPosition * from,
const GstAudioChannelPosition * to)
{
const GstAudioFormatInfo *info;
gint i, j, n;
gint reorder_map[64] = { 0, };
guint8 *ptr;
gint bpf, bps;
guint8 tmp[64 * 8];
info = gst_audio_format_get_info (format);
g_return_val_if_fail (data != NULL, FALSE);
g_return_val_if_fail (from != NULL, FALSE);
g_return_val_if_fail (to != NULL, FALSE);
g_return_val_if_fail (info != NULL && info->width > 0, FALSE);
g_return_val_if_fail (info->width > 0, FALSE);
g_return_val_if_fail (info->width <= 8 * 64, FALSE);
g_return_val_if_fail (size % ((info->width * channels) / 8) != 0, FALSE);
g_return_val_if_fail (channels > 0, FALSE);
g_return_val_if_fail (channels <= 64, FALSE);
if (size == 0)
return TRUE;
if (memcmp (from, to, channels * sizeof (from[0])) == 0)
return TRUE;
if (!gst_audio_get_channel_reorder_map (channels, from, to, reorder_map))
return FALSE;
bps = info->width / 8;
bpf = bps * channels;
ptr = data; ptr = data;
n = size / bpf; n = size / bpf;

View file

@ -532,6 +532,14 @@ gboolean gst_audio_reorder_channels (gpointer data, gsize size,
const GstAudioChannelPosition * from, const GstAudioChannelPosition * from,
const GstAudioChannelPosition * to); const GstAudioChannelPosition * to);
gboolean gst_audio_check_valid_channel_positions (const GstAudioChannelPosition *position,
gint channels, gboolean force_order);
gboolean gst_audio_get_channel_reorder_map (gint channels,
const GstAudioChannelPosition * from,
const GstAudioChannelPosition * to,
gint *reorder_map);
G_END_DECLS G_END_DECLS
#endif /* __GST_AUDIO_AUDIO_H__ */ #endif /* __GST_AUDIO_AUDIO_H__ */