stream: try to reset stream once if read fails

When reading from a stream fails, try one more time after a reset.
This should re-establish for example timed-out network connections.
Fixes bug #1841.

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@32954 b3059339-0415-0410-9bf9-f77b7e298cf2

100l, fix incorrect len when retrying read.

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@32957 b3059339-0415-0410-9bf9-f77b7e298cf2

Improve stream reset on read error, should now fix bug #1841 in more
cases, e.g. also with -cache.

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@32977 b3059339-0415-0410-9bf9-f77b7e298cf2

Add ugly hack to compensate DVDNAV's ugly hacks and fix seeking.

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@33122 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
reimar 2011-02-22 22:27:01 +00:00 committed by Uoti Urpala
parent 989694678d
commit 67f5ef670c
1 changed files with 21 additions and 1 deletions

View File

@ -278,6 +278,7 @@ void stream_capture_do(stream_t *s)
int stream_read_internal(stream_t *s, void *buf, int len)
{
int orig_len = len;
// we will retry even if we already reached EOF previously.
switch(s->type){
case STREAMTYPE_STREAM:
@ -299,7 +300,26 @@ int stream_read_internal(stream_t *s, void *buf, int len)
default:
len= s->fill_buffer ? s->fill_buffer(s, buf, len) : 0;
}
if(len<=0){ s->eof=1; return 0; }
if(len<=0){
// dvdnav has some horrible hacks to "suspend" reads,
// we need to skip this code or seeks will hang.
if (!s->eof && s->type != STREAMTYPE_DVDNAV) {
// 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
off_t pos = s->pos;
s->eof=1;
stream_reset(s);
stream_seek_internal(s, pos);
// make sure EOF is set to ensure no endless loops
s->eof=1;
return stream_read_internal(s, buf, orig_len);
}
s->eof=1;
return 0;
}
// When reading succeeded we are obviously not at eof.
// This e.g. avoids issues with eof getting stuck when lavf seeks in MPEG-TS
s->eof=0;