souphttpsrc: Set caps for audio/L16 content-type
authorZeeshan Ali (Khattak) <zeeshanak@gnome.org>
Wed, 20 May 2009 14:57:59 +0000 (17:57 +0300)
committerZeeshan Ali (Khattak) <zeeshanak@gnome.org>
Thu, 21 May 2009 21:55:08 +0000 (00:55 +0300)
When "Content-Type" header is "audio/L16", we need to set the caps on the
outgoing buffers so that downstream elements can have means to detect the
stream type and handle it appropriately. Tested with HTTP stream provided
by pulse-audio's http module (git master).

ext/soup/gstsouphttpsrc.c

index 12cd8fb..ac2007a 100644 (file)
@@ -744,6 +744,8 @@ gst_soup_http_src_got_headers_cb (SoupMessage * msg, GstSoupHTTPSrc * src)
 
   guint64 newsize;
 
+  GHashTable *params = NULL;
+
   GST_DEBUG_OBJECT (src, "got headers");
 
   if (src->automatic_redirect && SOUP_STATUS_IS_REDIRECTION (msg->status_code)) {
@@ -792,8 +794,39 @@ gst_soup_http_src_got_headers_cb (SoupMessage * msg, GstSoupHTTPSrc * src)
       src->src_caps = gst_caps_new_simple ("application/x-icy",
           "metadata-interval", G_TYPE_INT, icy_metaint, NULL);
     }
+  } else if ((value =
+          soup_message_headers_get_content_type (msg->response_headers,
+              &params)) != NULL) {
+    GST_DEBUG_OBJECT (src, "Content-Type: %s", value);
+    if (g_ascii_strcasecmp (value, "audio/L16") == 0) {
+      gint channels = 2;
+      gint rate = 44100;
+      char *param;
+
+      if (src->src_caps)
+        gst_caps_unref (src->src_caps);
+
+      param = g_hash_table_lookup (params, "channels");
+      if (param != NULL)
+        channels = atol (param);
+
+      param = g_hash_table_lookup (params, "rate");
+      if (param != NULL)
+        rate = atol (param);
+
+      src->src_caps = gst_caps_new_simple ("audio/x-raw-int",
+          "channels", G_TYPE_INT, channels,
+          "rate", G_TYPE_INT, rate,
+          "width", G_TYPE_INT, 16,
+          "depth", G_TYPE_INT, 16,
+          "signed", G_TYPE_BOOLEAN, TRUE,
+          "endianness", G_TYPE_INT, G_BIG_ENDIAN, NULL);
+    }
   }
 
+  if (params != NULL)
+    g_hash_table_destroy (params);
+
   if ((value =
           soup_message_headers_get (msg->response_headers,
               "icy-name")) != NULL) {