changeset 34783:1d4795fbdb67

Retry reconnecting several times. Also add a delay, otherwise a server closing any incoming connection immediately would make MPlayer stop even if it happens only for 1 second or so. With this change, no server/network outage of any kind shorter than 5 seconds should cause MPlayer to give up anymore.
author reimar
date Sun, 22 Apr 2012 12:10:49 +0000
parents 5e946a81746c
children d180a74b1a89
files stream/stream.c
diffstat 1 files changed, 22 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/stream/stream.c	Fri Apr 20 18:30:40 2012 +0000
+++ b/stream/stream.c	Sun Apr 22 12:10:49 2012 +0000
@@ -281,6 +281,26 @@
   }
 }
 
+static int stream_reconnect(stream_t *s)
+{
+#define MAX_RECONNECT_RETRIES 5
+#define RECONNECT_SLEEP_MS 1000
+    int retry = 0;
+    off_t pos = s->pos;
+    // Seeking is used as a hack to make network streams
+    // reopen the connection, ideally they would implement
+    // e.g. a STREAM_CTRL_RECONNECT to do this
+    do {
+        if (retry >= MAX_RECONNECT_RETRIES)
+            return 0;
+        if (retry) usec_sleep(RECONNECT_SLEEP_MS * 1000);
+        retry++;
+        s->eof=1;
+        stream_reset(s);
+    } while (stream_seek_internal(s, pos) >= 0 || s->pos != pos); // seek failed
+    return 1;
+}
+
 int stream_read_internal(stream_t *s, void *buf, int len)
 {
   int orig_len = len;
@@ -308,9 +328,8 @@
     len= s->fill_buffer ? s->fill_buffer(s, buf, len) : 0;
   }
   if(len<=0){
-    off_t pos = s->pos;
     // do not retry if this looks like proper eof
-    if (s->eof || (s->end_pos && pos == s->end_pos))
+    if (s->eof || (s->end_pos && s->pos == s->end_pos))
       goto eof_out;
     // dvdnav has some horrible hacks to "suspend" reads,
     // we need to skip this code or seeks will hang.
@@ -319,12 +338,7 @@
 
     // just in case this is an error e.g. due to network
     // timeout reset and retry
-    // Seeking is used as a hack to make network streams
-    // reopen the connection, ideally they would implement
-    // e.g. a STREAM_CTRL_RECONNECT to do this
-    s->eof=1;
-    stream_reset(s);
-    if (stream_seek_internal(s, pos) >= 0 || s->pos != pos) // seek failed
+    if (!stream_reconnect(s))
       goto eof_out;
     // make sure EOF is set to ensure no endless loops
     s->eof=1;