dvdlpcmdec: set channel positions using the appropriate API

https://bugzilla.gnome.org/show_bug.cgi?id=731038
This commit is contained in:
Vincent Penquerc'h 2014-06-06 13:59:57 +01:00
parent 3afe2b7bd1
commit 86562f56e2

View File

@ -246,6 +246,7 @@ gst_dvdlpcmdec_setcaps (GstPad * pad, GstCaps * caps)
GstAudioFormat format; GstAudioFormat format;
gint rate, channels, width; gint rate, channels, width;
const GstAudioChannelPosition *position; const GstAudioChannelPosition *position;
GstAudioChannelPosition sorted_position[8];
g_return_val_if_fail (caps != NULL, FALSE); g_return_val_if_fail (caps != NULL, FALSE);
g_return_val_if_fail (pad != NULL, FALSE); g_return_val_if_fail (pad != NULL, FALSE);
@ -288,17 +289,18 @@ gst_dvdlpcmdec_setcaps (GstPad * pad, GstCaps * caps)
break; break;
} }
gst_audio_info_set_format (&dvdlpcmdec->info, format, rate, channels, NULL);
if (channels < 9 if (channels < 9
&& channel_positions[channels - 1][0] != && channel_positions[channels - 1][0] !=
GST_AUDIO_CHANNEL_POSITION_INVALID) { GST_AUDIO_CHANNEL_POSITION_INVALID) {
dvdlpcmdec->info.flags &= ~GST_AUDIO_FLAG_UNPOSITIONED;
position = channel_positions[channels - 1]; position = channel_positions[channels - 1];
dvdlpcmdec->lpcm_layout = position; dvdlpcmdec->lpcm_layout = position;
memcpy (dvdlpcmdec->info.position, position, memcpy (sorted_position, channel_positions[channels - 1],
sizeof (GstAudioChannelPosition) * channels); sizeof (sorted_position));
gst_audio_channel_positions_to_valid_order (dvdlpcmdec->info.position, gst_audio_channel_positions_to_valid_order (sorted_position, channels);
channels); gst_audio_info_set_format (&dvdlpcmdec->info, format, rate, channels,
sorted_position);
} else {
gst_audio_info_set_format (&dvdlpcmdec->info, format, rate, channels, NULL);
} }
dvdlpcmdec->width = width; dvdlpcmdec->width = width;
@ -411,18 +413,20 @@ parse_header (GstDvdLpcmDec * dec, guint32 header)
/* And, of course, the number of channels (up to 8) */ /* And, of course, the number of channels (up to 8) */
channels = ((header >> 8) & 0x7) + 1; channels = ((header >> 8) & 0x7) + 1;
gst_audio_info_set_format (&dec->info, format, rate, channels, NULL);
if (channels < 9 if (channels < 9
&& channel_positions[channels - 1][0] != && channel_positions[channels - 1][0] !=
GST_AUDIO_CHANNEL_POSITION_INVALID) { GST_AUDIO_CHANNEL_POSITION_INVALID) {
const GstAudioChannelPosition *position; const GstAudioChannelPosition *position;
GstAudioChannelPosition sorted_position[8];
dec->info.flags &= ~GST_AUDIO_FLAG_UNPOSITIONED;
position = channel_positions[channels - 1]; position = channel_positions[channels - 1];
dec->lpcm_layout = position; dec->lpcm_layout = position;
memcpy (dec->info.position, position, memcpy (sorted_position, position, sizeof (sorted_position));
sizeof (GstAudioChannelPosition) * channels); gst_audio_channel_positions_to_valid_order (sorted_position, channels);
gst_audio_channel_positions_to_valid_order (dec->info.position, channels); gst_audio_info_set_format (&dec->info, format, rate, channels,
sorted_position);
} else {
gst_audio_info_set_format (&dec->info, format, rate, channels, NULL);
} }
} }