mirror of
https://github.com/mpv-player/mpv
synced 2025-01-30 19:52:14 +00:00
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:
parent
989694678d
commit
67f5ef670c
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user