souphttpsrc: do not do http requests in READY
authorThiago Santos <thiago.sousa.santos@collabora.com>
Mon, 16 Sep 2013 16:53:45 +0000 (13:53 -0300)
committerSebastian Dröge <slomo@circular-chaos.org>
Wed, 18 Sep 2013 16:36:38 +0000 (18:36 +0200)
HEAD requests to discover if the server is seekable shouldn't be done in
READY as it might lock the main thread that is doing the state change.

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

ext/soup/gstsouphttpsrc.c

index 6c7f837..aa2d0ad 100644 (file)
@@ -1384,17 +1384,16 @@ gst_soup_http_src_get_size (GstBaseSrc * bsrc, guint64 * size)
   return FALSE;
 }
 
-static gboolean
-gst_soup_http_src_is_seekable (GstBaseSrc * bsrc)
+static void
+gst_soup_http_src_check_seekable (GstSoupHTTPSrc * src)
 {
-  GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (bsrc);
   GstFlowReturn ret = GST_FLOW_OK;
 
   /* Special case to check if the server allows range requests
    * before really starting to get data in the buffer creation
    * loops.
    */
-  if (!src->got_headers && GST_STATE (src) != GST_STATE_NULL) {
+  if (!src->got_headers && GST_STATE (src) >= GST_STATE_PAUSED) {
     g_mutex_lock (&src->mutex);
     while (!src->got_headers && !src->interrupted && ret == GST_FLOW_OK) {
       if ((src->msg && src->msg->method != SOUP_METHOD_HEAD) &&
@@ -1416,6 +1415,15 @@ gst_soup_http_src_is_seekable (GstBaseSrc * bsrc)
     g_mutex_unlock (&src->mutex);
   }
 
+}
+
+static gboolean
+gst_soup_http_src_is_seekable (GstBaseSrc * bsrc)
+{
+  GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (bsrc);
+
+  gst_soup_http_src_check_seekable (src);
+
   return src->seekable;
 }
 
@@ -1434,7 +1442,11 @@ gst_soup_http_src_do_seek (GstBaseSrc * bsrc, GstSegment * segment)
     return TRUE;
   }
 
-  if (!src->seekable) {
+  gst_soup_http_src_check_seekable (src);
+
+  /* If we have no headers we don't know yet if it is seekable or not.
+   * Store the start position and error out later if it isn't */
+  if (src->got_headers && !src->seekable) {
     GST_WARNING_OBJECT (src, "Not seekable");
     return FALSE;
   }