summaryrefslogtreecommitdiffstats
path: root/osdep
diff options
context:
space:
mode:
authorJan Ekström <jeebjp@gmail.com>2017-09-18 20:25:34 +0300
committerJan Ekström <jeebjp@gmail.com>2017-09-18 20:28:46 +0300
commitf4c80d44021dd917aee64f58b0e2a79f20610057 (patch)
tree646a89c7a3cadfc90c7bc484c246413f9b80ee21 /osdep
parent8810c1fc050347e1bef0d3eb89edd30c8e840648 (diff)
downloadmpv-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')
-rw-r--r--osdep/io.h27
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