From: Thiago Santos Date: Mon, 16 Sep 2013 16:53:45 +0000 (-0300) Subject: souphttpsrc: do not do http requests in READY X-Git-Tag: 1.19.3~509^2~5303 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c84282b9a6bfe9383172c4f8ed28b655cfe84f2f;p=platform%2Fupstream%2Fgstreamer.git souphttpsrc: do not do http requests in READY 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 --- diff --git a/ext/soup/gstsouphttpsrc.c b/ext/soup/gstsouphttpsrc.c index 6c7f837..aa2d0ad 100644 --- a/ext/soup/gstsouphttpsrc.c +++ b/ext/soup/gstsouphttpsrc.c @@ -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; }