mirror of
https://github.com/mpv-player/mpv
synced 2024-12-23 15:22:09 +00:00
stream: improve EOF handling in seeks
Reset stream 'eof' flag when a seek succeeds, and allow seeking to a position at or past EOF (in the sense that the seek succeeds and stream_tell() then returns that position). This fixes at least some demuxer problems where an attempt to read the index from the end of an incomplete file would set the 'eof' flag and cause subsequent reads to fail, even if failure to read the index would otherwise be nonfatal and demuxing could continue after seeking back. Partially based on a patch from Laurent <laurent.aml@gmail.com>.
This commit is contained in:
parent
1f126fc60c
commit
a0f08fbebb
@ -355,18 +355,22 @@ if(newpos==0 || newpos!=s->pos){
|
||||
// putchar('%');fflush(stdout);
|
||||
}
|
||||
|
||||
while(stream_fill_buffer(s) > 0 && pos >= 0) {
|
||||
s->eof = 0; // EOF reset when seek succeeds.
|
||||
while (stream_fill_buffer(s) > 0) {
|
||||
if(pos<=s->buf_len){
|
||||
s->buf_pos=pos; // byte position in sector
|
||||
return 1;
|
||||
}
|
||||
pos -= s->buf_len;
|
||||
}
|
||||
// Fill failed, but seek still is a success.
|
||||
s->pos += pos;
|
||||
s->buf_pos = 0;
|
||||
s->buf_len = 0;
|
||||
|
||||
// if(pos==s->buf_len) printf("XXX Seek to last byte of file -> EOF\n");
|
||||
|
||||
mp_msg(MSGT_STREAM,MSGL_V,"stream_seek: WARNING! Can't seek to 0x%"PRIX64" !\n",(int64_t)(pos+newpos));
|
||||
return 0;
|
||||
mp_msg(MSGT_STREAM,MSGL_V,
|
||||
"stream_seek: Seek to/past EOF: no buffer preloaded.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
@ -269,6 +269,7 @@ inline static int stream_seek(stream_t *s,off_t pos){
|
||||
off_t x=pos-(s->pos-s->buf_len);
|
||||
if(x>=0){
|
||||
s->buf_pos=x;
|
||||
s->eof = 0;
|
||||
// putchar('*');fflush(stdout);
|
||||
return 1;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user