dvdlpcmdec: set channel positions using the appropriate API
authorVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Fri, 6 Jun 2014 12:59:57 +0000 (13:59 +0100)
committerVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Wed, 12 Nov 2014 14:23:30 +0000 (14:23 +0000)
https://bugzilla.gnome.org/show_bug.cgi?id=731038

gst/dvdlpcmdec/gstdvdlpcmdec.c

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