[MPlayer-cvslog] r34871 - trunk/stream/stream.c
reimar
subversion at mplayerhq.hu
Sun Apr 22 14:10:49 CEST 2012
Author: reimar
Date: Sun Apr 22 14:10:49 2012
New Revision: 34871
Log:
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.
Modified:
trunk/stream/stream.c
Modified: trunk/stream/stream.c
==============================================================================
--- trunk/stream/stream.c Fri Apr 20 20:30:40 2012 (r34870)
+++ trunk/stream/stream.c Sun Apr 22 14:10:49 2012 (r34871)
@@ -281,6 +281,26 @@ void stream_capture_do(stream_t *s)
}
}
+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 @@ int stream_read_internal(stream_t *s, vo
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 @@ int stream_read_internal(stream_t *s, vo
// 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;
More information about the MPlayer-cvslog
mailing list