flvdemux: Use aac codec-data to adjust channels if needed
authorYeongjin Jeong <gingerbk247@gmail.com>
Thu, 11 Oct 2018 07:36:17 +0000 (16:36 +0900)
committerOlivier CrĂȘte <olivier.crete@collabora.com>
Fri, 12 Oct 2018 18:35:37 +0000 (14:35 -0400)
Flv does not support various channels in AAC stream format, for example
flvdemux detect an audio channels of 2(stereo) when the AAC really is 1(mono).

https://bugzilla.gnome.org/show_bug.cgi?id=797275

gst/flv/gstflvdemux.c

index 2a0fa45..1f53888 100644 (file)
@@ -723,6 +723,7 @@ gst_flv_demux_audio_negotiate (GstFlvDemux * demux, guint32 codec_tag,
   GstCaps *caps = NULL, *old_caps;
   gboolean ret = FALSE;
   guint adjusted_rate = rate;
+  guint adjusted_channels = channels;
   GstEvent *event;
   gchar *stream_id;
 
@@ -784,6 +785,16 @@ gst_flv_demux_audio_negotiate (GstFlvDemux * demux, guint32 codec_tag,
         } else {
           adjusted_rate = rate;
         }
+
+        adjusted_channels =
+            gst_codec_utils_aac_get_channels (map.data, map.size);
+
+        if (adjusted_channels && (channels != adjusted_channels)) {
+          GST_LOG_OBJECT (demux, "Ajusting AAC channels %d -> %d", channels,
+              adjusted_channels);
+        } else {
+          adjusted_channels = channels;
+        }
       }
       gst_buffer_unmap (demux->audio_codec_data, &map);
 
@@ -866,7 +877,7 @@ gst_flv_demux_audio_negotiate (GstFlvDemux * demux, guint32 codec_tag,
   }
 
   gst_caps_set_simple (caps, "rate", G_TYPE_INT, adjusted_rate,
-      "channels", G_TYPE_INT, channels, NULL);
+      "channels", G_TYPE_INT, adjusted_channels, NULL);
 
   if (demux->audio_codec_data) {
     gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER,