aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Oliver <protogonoi@gmail.com>2016-06-06 17:04:39 +1000
committerMatt Oliver <protogonoi@gmail.com>2016-06-13 13:47:32 +1000
commit37787f261639c53998487400e874741c17e85fc6 (patch)
tree6be7c8bf0bf36e8e192220794c0e665576e1815a
parentbe37a669714094b9321f9f6f2947a296fe020483 (diff)
downloadffmpeg-37787f261639c53998487400e874741c17e85fc6.tar.gz
lavf/os_support.h: Fix for unicode filenames on windows.
Fixes #819 #5256 #5281 Signed-off-by: Matt Oliver <protogonoi@gmail.com>
-rw-r--r--libavformat/file.c4
-rw-r--r--libavformat/os_support.h24
2 files changed, 28 insertions, 0 deletions
diff --git a/libavformat/file.c b/libavformat/file.c
index 5765ce7e48..264542a36a 100644
--- a/libavformat/file.c
+++ b/libavformat/file.c
@@ -148,7 +148,11 @@ static int file_check(URLContext *h, int mask)
ret |= AVIO_FLAG_WRITE;
#else
struct stat st;
+# ifndef _WIN32
ret = stat(filename, &st);
+# else
+ ret = win32_stat(filename, &st);
+# endif
if (ret < 0)
return AVERROR(errno);
diff --git a/libavformat/os_support.h b/libavformat/os_support.h
index a3329119c0..9e312a5740 100644
--- a/libavformat/os_support.h
+++ b/libavformat/os_support.h
@@ -182,6 +182,29 @@ DEF_FS_FUNCTION(unlink, _wunlink, _unlink)
DEF_FS_FUNCTION(mkdir, _wmkdir, _mkdir)
DEF_FS_FUNCTION(rmdir, _wrmdir , _rmdir)
+#define DEF_FS_FUNCTION2(name, wfunc, afunc, partype) \
+static inline int win32_##name(const char *filename_utf8, partype par) \
+{ \
+ wchar_t *filename_w; \
+ int ret; \
+ \
+ if (utf8towchar(filename_utf8, &filename_w)) \
+ return -1; \
+ if (!filename_w) \
+ goto fallback; \
+ \
+ ret = wfunc(filename_w, par); \
+ av_free(filename_w); \
+ return ret; \
+ \
+fallback: \
+ /* filename may be be in CP_ACP */ \
+ return afunc(filename_utf8, par); \
+}
+
+DEF_FS_FUNCTION2(access, _waccess, _access, int)
+DEF_FS_FUNCTION2(stat, _wstat64, _stat64, struct stat*)
+
static inline int win32_rename(const char *src_utf8, const char *dest_utf8)
{
wchar_t *src_w, *dest_w;
@@ -231,6 +254,7 @@ fallback:
#define rename win32_rename
#define rmdir win32_rmdir
#define unlink win32_unlink
+#define access win32_access
#endif