diff options
author | Jan Ekström <jeebjp@gmail.com> | 2017-09-18 20:25:34 +0300 |
---|---|---|
committer | Jan Ekström <jeebjp@gmail.com> | 2017-09-18 20:28:46 +0300 |
commit | f4c80d44021dd917aee64f58b0e2a79f20610057 (patch) | |
tree | 646a89c7a3cadfc90c7bc484c246413f9b80ee21 /osdep/io.h | |
parent | 8810c1fc050347e1bef0d3eb89edd30c8e840648 (diff) | |
download | mpv-f4c80d44021dd917aee64f58b0e2a79f20610057.tar.bz2 mpv-f4c80d44021dd917aee64f58b0e2a79f20610057.tar.xz |
osdep/io: add android related bullshit
This fixes >2GiB files with at least API level 21.
See: https://android.googlesource.com/platform/bionic/+/master/docs/32-bit-abi.md
for the gritty details.
* Based on libavformat's things, except we do not care about API
versions or NDKs without unistd.h, which contains all sorts of
things that we utilize.
* Redefines lseek to always point to the 64bit version.
* Redefines fseeko to always point towards an inlined static
implementation that utilizes the 64bit version of lseek underneath.
Diffstat (limited to 'osdep/io.h')
-rw-r--r-- | osdep/io.h | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/osdep/io.h b/osdep/io.h index 35c7c52691..70ba5ac1ae 100644 --- a/osdep/io.h +++ b/osdep/io.h @@ -32,6 +32,33 @@ #include <glob.h> #endif +#ifdef __ANDROID__ +# include <unistd.h> +# include <stdio.h> + +// replace lseek with the 64bit variant +#ifdef lseek +# undef lseek +#endif +#define lseek(f,p,w) lseek64((f), (p), (w)) + +// replace possible fseeko with a +// lseek64 based solution. +#ifdef fseeko +# undef fseeko +#endif +static inline int mp_fseeko(FILE* fp, off64_t offset, int whence) { + int ret = -1; + if ((ret = fflush(fp)) != 0) { + return ret; + } + + return lseek64(fileno(fp), offset, whence) >= 0 ? 0 : -1; +} +#define fseeko(f,p,w) mp_fseeko((f), (p), (w)) + +#endif // __ANDROID__ + #ifndef O_BINARY #define O_BINARY 0 #endif |