diff options
author | Matt Oliver | 2016-06-06 17:04:39 +1000 |
---|---|---|
committer | Matt Oliver | 2016-06-13 13:47:32 +1000 |
commit | 37787f261639c53998487400e874741c17e85fc6 (patch) | |
tree | 6be7c8bf0bf36e8e192220794c0e665576e1815a | |
parent | be37a669714094b9321f9f6f2947a296fe020483 (diff) |
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.c | 4 | ||||
-rw-r--r-- | libavformat/os_support.h | 24 |
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 |