diff options
author | Mohammad AlSaleh <CE.Mohammad.AlSaleh@gmail.com> | 2024-04-04 10:23:00 +0300 |
---|---|---|
committer | Kacper Michajłow <kasper93@gmail.com> | 2024-05-07 12:22:09 +0200 |
commit | bb7a485c0932375b888a61966970696c06851a15 (patch) | |
tree | 0bffd104d6360e229d605fc8b49fb0c07a8d0733 /stream | |
parent | 4e59a568963ba3a41d92d863786b88cb6ee17348 (diff) | |
download | mpv-bb7a485c0932375b888a61966970696c06851a15.tar.bz2 mpv-bb7a485c0932375b888a61966970696c06851a15.tar.xz |
stream: don't try to read from all-sparse/no-data files
```
dd if=/dev/zero of=/tmp/10g.empty bs=1 seek=10G count=0
dd if=/dev/zero of=/tmp/10m.empty bs=1 seek=10M count=0
time mpv /tmp/10{g,m}.empty
```
I keep files with the name format `${name}-${hash}.${ext}.empty`
around, where the original is removed, and a sparse file with
the size of the original is created instead.
A lot of time is wasted on such files when going through
playlists/directories that include some of them.
This admittedly may not be that common of a use-case.
Signed-off-by: Mohammad AlSaleh <CE.Mohammad.AlSaleh@gmail.com>
Diffstat (limited to 'stream')
-rw-r--r-- | stream/stream_file.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/stream/stream_file.c b/stream/stream_file.c index 1744fc13a4..0a6a697ff6 100644 --- a/stream/stream_file.c +++ b/stream/stream_file.c @@ -358,6 +358,17 @@ static int open_f(stream_t *stream, const struct stream_open_args *args) setmode(p->fd, O_BINARY); #endif +#if HAVE_SEEK_DATA + if (stream->mode == STREAM_READ) { + off_t first_data = lseek(p->fd, 0, SEEK_DATA); + if (first_data == (off_t)-1 && errno == ENXIO) { + MP_ERR(stream, "File is empty or all sparse (has no data).\n"); + s_close(stream); + return STREAM_ERROR; + } + } +#endif + off_t len = lseek(p->fd, 0, SEEK_END); lseek(p->fd, 0, SEEK_SET); if (len != (off_t)-1) { |