riff: add channel masks for all formats

Add the channel masks for all the extensible formats
Pass the number of channels instead of reading them from caps.
This commit is contained in:
Wim Taymans 2012-12-21 14:03:32 +01:00
parent d2c68e602d
commit ca456ec6f9

View File

@ -966,18 +966,13 @@ static const struct
#define MAX_CHANNEL_POSITIONS G_N_ELEMENTS (layout_mapping) #define MAX_CHANNEL_POSITIONS G_N_ELEMENTS (layout_mapping)
static gboolean static gboolean
gst_riff_wavext_add_channel_mask (GstCaps * caps, guint32 layout, gst_riff_wavext_add_channel_mask (GstCaps * caps, gint num_channels,
gint channel_reorder_map[18]) guint32 layout, gint channel_reorder_map[18])
{ {
GstStructure *s; gint i, p;
gint num_channels, i, p;
guint64 channel_mask = 0; guint64 channel_mask = 0;
GstAudioChannelPosition from[18], to[18]; GstAudioChannelPosition from[18], to[18];
s = gst_caps_get_structure (caps, 0);
if (!gst_structure_get_int (s, "channels", &num_channels))
g_return_val_if_reached (FALSE);
if (num_channels < 1 || num_channels > MAX_CHANNEL_POSITIONS) { if (num_channels < 1 || num_channels > MAX_CHANNEL_POSITIONS) {
GST_DEBUG ("invalid number of channels: %d", num_channels); GST_DEBUG ("invalid number of channels: %d", num_channels);
return FALSE; return FALSE;
@ -1026,10 +1021,8 @@ gst_riff_wavext_add_channel_mask (GstCaps * caps, guint32 layout,
static gboolean static gboolean
gst_riff_wave_add_default_channel_mask (GstCaps * caps, gst_riff_wave_add_default_channel_mask (GstCaps * caps,
gint channel_reorder_map[18]) gint nchannels, gint channel_reorder_map[18])
{ {
GstStructure *s;
gint nchannels;
guint64 channel_mask = 0; guint64 channel_mask = 0;
static const gint reorder_maps[8][11] = { static const gint reorder_maps[8][11] = {
{0,}, {0,},
@ -1042,11 +1035,6 @@ gst_riff_wave_add_default_channel_mask (GstCaps * caps,
{0, 1, 4, 5, 2, 3, 6, 7} {0, 1, 4, 5, 2, 3, 6, 7}
}; };
s = gst_caps_get_structure (caps, 0);
if (!gst_structure_get_int (s, "channels", &nchannels))
g_return_val_if_reached (FALSE);
if (nchannels > 8) { if (nchannels > 8) {
GST_DEBUG ("invalid number of channels: %d", nchannels); GST_DEBUG ("invalid number of channels: %d", nchannels);
return FALSE; return FALSE;
@ -1195,7 +1183,7 @@ gst_riff_create_audio_caps (guint16 codec_id,
* 8 channels. */ * 8 channels. */
if (ch > 8) if (ch > 8)
GST_WARNING ("don't know default layout for %d channels", ch); GST_WARNING ("don't know default layout for %d channels", ch);
else if (gst_riff_wave_add_default_channel_mask (caps, else if (gst_riff_wave_add_default_channel_mask (caps, ch,
channel_reorder_map)) channel_reorder_map))
GST_DEBUG ("using default channel layout for %d channels", ch); GST_DEBUG ("using default channel layout for %d channels", ch);
else else
@ -1237,7 +1225,7 @@ gst_riff_create_audio_caps (guint16 codec_id,
* 8 channels. */ * 8 channels. */
if (ch > 8) if (ch > 8)
GST_WARNING ("don't know default layout for %d channels", ch); GST_WARNING ("don't know default layout for %d channels", ch);
else if (gst_riff_wave_add_default_channel_mask (caps, else if (gst_riff_wave_add_default_channel_mask (caps, ch,
channel_reorder_map)) channel_reorder_map))
GST_DEBUG ("using default channel layout for %d channels", ch); GST_DEBUG ("using default channel layout for %d channels", ch);
else else
@ -1553,22 +1541,6 @@ gst_riff_create_audio_caps (guint16 codec_id,
"channels", G_TYPE_INT, strf->channels, "channels", G_TYPE_INT, strf->channels,
"rate", G_TYPE_INT, strf->rate, NULL); "rate", G_TYPE_INT, strf->rate, NULL);
/* If channel_mask == 0 and channels > 2 let's
* assume default layout as some wav files don't have the
* channel mask set. Don't set the layout for 1 channel. */
if (channel_mask == 0 && strf->channels > 1)
channel_mask =
gst_riff_wavext_get_default_channel_mask (strf->channels);
if ((channel_mask != 0 || strf->channels > 1) &&
!gst_riff_wavext_add_channel_mask (caps, channel_mask,
channel_reorder_map)) {
GST_WARNING ("failed to add channel layout");
gst_caps_unref (caps);
caps = NULL;
}
rate_chan = FALSE;
if (codec_name) { if (codec_name) {
*codec_name = g_strdup_printf ("Uncompressed %d-bit PCM audio", *codec_name = g_strdup_printf ("Uncompressed %d-bit PCM audio",
strf->bits_per_sample); strf->bits_per_sample);
@ -1586,22 +1558,6 @@ gst_riff_create_audio_caps (guint16 codec_id,
"channels", G_TYPE_INT, strf->channels, "channels", G_TYPE_INT, strf->channels,
"rate", G_TYPE_INT, strf->rate, NULL); "rate", G_TYPE_INT, strf->rate, NULL);
/* If channel_mask == 0 and channels > 1 let's
* assume default layout as some wav files don't have the
* channel mask set. Don't set the layout for 1 channel. */
if (channel_mask == 0 && strf->channels > 1)
channel_mask =
gst_riff_wavext_get_default_channel_mask (strf->channels);
if ((channel_mask != 0 || strf->channels > 1) &&
!gst_riff_wavext_add_channel_mask (caps, channel_mask,
channel_reorder_map)) {
GST_WARNING ("failed to add channel layout");
gst_caps_unref (caps);
caps = NULL;
}
rate_chan = FALSE;
if (codec_name) { if (codec_name) {
*codec_name = *codec_name =
g_strdup_printf ("Uncompressed %d-bit IEEE float audio", g_strdup_printf ("Uncompressed %d-bit IEEE float audio",
@ -1662,6 +1618,7 @@ gst_riff_create_audio_caps (guint16 codec_id,
if (codec_name) if (codec_name)
*codec_name = g_strdup ("AC-3 audio"); *codec_name = g_strdup ("AC-3 audio");
} }
} else if (subformat_guid[0] == 0x6ba47966 && } else if (subformat_guid[0] == 0x6ba47966 &&
subformat_guid[1] == 0x41783f83 && subformat_guid[1] == 0x41783f83 &&
subformat_guid[2] == 0xf0006596 && subformat_guid[3] == 0xe59262bf) { subformat_guid[2] == 0xf0006596 && subformat_guid[3] == 0xe59262bf) {
@ -1670,6 +1627,24 @@ gst_riff_create_audio_caps (guint16 codec_id,
*codec_name = g_strdup ("Ogg-AVI"); *codec_name = g_strdup ("Ogg-AVI");
} }
if (strf != NULL) {
/* If channel_mask == 0 and channels > 1 let's
* assume default layout as some wav files don't have the
* channel mask set. Don't set the layout for 1 channel. */
if (channel_mask == 0 && strf->channels > 1)
channel_mask =
gst_riff_wavext_get_default_channel_mask (strf->channels);
if ((channel_mask != 0 || strf->channels > 1) &&
!gst_riff_wavext_add_channel_mask (caps, strf->channels,
channel_mask, channel_reorder_map)) {
GST_WARNING ("failed to add channel layout");
gst_caps_unref (caps);
caps = NULL;
}
rate_chan = FALSE;
}
if (caps == NULL) { if (caps == NULL) {
GST_WARNING ("Unknown WAVE_FORMAT_EXTENSIBLE audio format"); GST_WARNING ("Unknown WAVE_FORMAT_EXTENSIBLE audio format");
return NULL; return NULL;