diff --git a/ext/soup/gstsouphttpsrc.c b/ext/soup/gstsouphttpsrc.c index 6c7f837bbd..aa2d0ad3fc 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; }