[vlc-commits] prefetch: clear the error flag when seeking (fixes #17458)

Rémi Denis-Courmont git at videolan.org
Tue Oct 4 16:40:50 CEST 2016


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Tue Oct  4 17:30:38 2016 +0300| [7d4a89a30fe46471b176f470733bb39d2ac1c520] | committer: Rémi Denis-Courmont

prefetch: clear the error flag when seeking (fixes #17458)

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=7d4a89a30fe46471b176f470733bb39d2ac1c520
---

 modules/stream_filter/prefetch.c | 54 +++++++++++++++++++---------------------
 1 file changed, 26 insertions(+), 28 deletions(-)

diff --git a/modules/stream_filter/prefetch.c b/modules/stream_filter/prefetch.c
index 104d761..90d806a 100644
--- a/modules/stream_filter/prefetch.c
+++ b/modules/stream_filter/prefetch.c
@@ -137,8 +137,8 @@ static void *Thread(void *data)
             continue;
         }
 
-        if (paused)
-        {   /* Wait for resumption */
+        if (paused || sys->eof || sys->error)
+        {   /* Wait for not paused, not at EOF and not failed state */
             vlc_cond_wait(&sys->wait_space, &sys->lock);
             continue;
         }
@@ -146,17 +146,14 @@ static void *Thread(void *data)
         if (sys->stream_offset < sys->buffer_offset)
         {   /* Need to seek backward */
             if (ThreadSeek(stream, sys->stream_offset))
-                break;
+            {
+                sys->error = true;
+                vlc_cond_signal(&sys->wait_data);
+                continue;
+            }
 
             sys->buffer_offset = sys->stream_offset;
             sys->buffer_length = 0;
-            sys->eof = false;
-            continue;
-        }
-
-        if (sys->eof)
-        {   /* At EOF, wait for backward seek */
-            vlc_cond_wait(&sys->wait_space, &sys->lock);
             continue;
         }
 
@@ -167,15 +164,17 @@ static void *Thread(void *data)
          * Unread data is however given precedence if the buffer is full. */
         uint64_t history = sys->stream_offset - sys->buffer_offset;
 
+        /* If upstream supports seeking and if the downstream offset is far
+         * beyond the upstream offset, then attempt to skip forward.
+         * If it fails, assume upstream is well-behaved such that the failed
+         * seek is a no-op, and continue as if seeking was not supported.
+         * WARNING: Except problems with misbehaving access plug-ins. */
         if (sys->can_seek
-         && history >= (sys->buffer_length + sys->seek_threshold))
-        {   /* Large skip: seek forward */
-            if (ThreadSeek(stream, sys->stream_offset))
-                break;
-
+         && history >= (sys->buffer_length + sys->seek_threshold)
+         && ThreadSeek(stream, sys->stream_offset) == 0)
+        {
             sys->buffer_offset = sys->stream_offset;
             sys->buffer_length = 0;
-            sys->eof = false;
             continue;
         }
 
@@ -231,11 +230,8 @@ static void *Thread(void *data)
         //        sys->buffer_size);
         vlc_cond_signal(&sys->wait_data);
     }
+    vlc_assert_unreachable();
     vlc_cleanup_pop();
-
-    sys->error = true;
-    vlc_cond_signal(&sys->wait_data);
-    vlc_mutex_unlock(&sys->lock);
     return NULL;
 }
 
@@ -244,11 +240,10 @@ static int Seek(stream_t *stream, uint64_t offset)
     stream_sys_t *sys = stream->p_sys;
 
     vlc_mutex_lock(&sys->lock);
-    if (sys->stream_offset != offset)
-    {
-        sys->stream_offset = offset;
-        vlc_cond_signal(&sys->wait_space);
-    }
+    sys->stream_offset = offset;
+    sys->eof = false;
+    sys->error = false;
+    vlc_cond_signal(&sys->wait_space);
     vlc_mutex_unlock(&sys->lock);
     return 0;
 }
@@ -277,13 +272,15 @@ static ssize_t Read(stream_t *stream, void *buf, size_t buflen)
 
     if (buflen == 0)
         return buflen;
+
+    vlc_mutex_lock(&sys->lock);
     if (buf == NULL)
     {
-        Seek(stream, sys->stream_offset + buflen);
-        return buflen;
+        sys->stream_offset += buflen;
+        copy = buflen;
+        goto out;
     }
 
-    vlc_mutex_lock(&sys->lock);
     if (sys->paused)
     {
         msg_Err(stream, "reading while paused (buggy demux?)");
@@ -315,6 +312,7 @@ static ssize_t Read(stream_t *stream, void *buf, size_t buflen)
 
     memcpy(buf, sys->buffer + offset, copy);
     sys->stream_offset += copy;
+out:
     vlc_cond_signal(&sys->wait_space);
     vlc_mutex_unlock(&sys->lock);
     return copy;



More information about the vlc-commits mailing list