Fix offset handling in GStreamer WebKitWebSource.
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 9 Mar 2013 16:34:13 +0000 (16:34 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 9 Mar 2013 16:34:13 +0000 (16:34 +0000)
https://bugs.webkit.org/show_bug.cgi?id=111888

Patch by Sebastian Dröge <sebastian.droege@collabora.co.uk> on 2013-03-09
Reviewed by Philippe Normand.

* platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:
(webKitWebSrcSeekDataCb):
(StreamingClient::didReceiveData):
The offset handling in WebKitWebSource was completely wrong
before and caused wrong offsets to be set on the GStreamer buffers
after a seek.

Apart from that there was also a race condition that happens
when a downstream element causes seeks in very short succession
and is switching between two different parts of the stream.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@145318 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp

index 170cd6d..2bce72b 100644 (file)
@@ -1,3 +1,21 @@
+2013-03-09  Sebastian Dröge  <sebastian.droege@collabora.co.uk>
+
+        Fix offset handling in GStreamer WebKitWebSource.
+        https://bugs.webkit.org/show_bug.cgi?id=111888
+
+        Reviewed by Philippe Normand.
+
+        * platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:
+        (webKitWebSrcSeekDataCb):
+        (StreamingClient::didReceiveData):
+        The offset handling in WebKitWebSource was completely wrong
+        before and caused wrong offsets to be set on the GStreamer buffers
+        after a seek.
+
+        Apart from that there was also a race condition that happens
+        when a downstream element causes seeks in very short succession
+        and is switching between two different parts of the stream.
+
 2013-03-09  Keishi Hattori  <keishi@webkit.org>
 
         Month transition animation is missing in some places
index fcebb3d..5b2adf2 100644 (file)
@@ -464,6 +464,7 @@ static bool webKitWebSrcStart(WebKitWebSrc* src)
         val.set(g_strdup_printf("bytes=%" G_GUINT64_FORMAT "-", priv->requestedOffset));
         request.setHTTPHeaderField("Range", val.get());
     }
+    priv->offset = priv->requestedOffset;
 
     if (priv->iradioMode)
         request.setHTTPHeaderField("icy-metadata", "1");
@@ -746,7 +747,7 @@ static gboolean webKitWebSrcSeekDataCb(GstAppSrc*, guint64 offset, gpointer user
     WebKitWebSrcPrivate* priv = src->priv;
 
     GST_DEBUG_OBJECT(src, "Seeking to offset: %" G_GUINT64_FORMAT, offset);
-    if (offset == priv->offset)
+    if (offset == priv->offset && priv->requestedOffset == priv->offset)
         return TRUE;
 
     if (!priv->seekable)
@@ -909,6 +910,8 @@ void StreamingClient::didReceiveData(ResourceHandle* handle, const char* data, i
         setGstBufferSize(priv->buffer.get(), length);
 
     GST_BUFFER_OFFSET(priv->buffer.get()) = priv->offset;
+    if (priv->requestedOffset == priv->offset)
+        priv->requestedOffset += length;
     priv->offset += length;
     GST_BUFFER_OFFSET_END(priv->buffer.get()) = priv->offset;