[FFmpeg-devel] [FFmpeg-cvslog] lavf/os_support.h: Fix for unicode filenames on windows.

Benoit Fouet benoit.fouet at free.fr
Mon Jun 13 10:29:37 CEST 2016


Hi,


On 13/06/2016 10:21, Clément Bœsch wrote:
> On Mon, Jun 13, 2016 at 05:50:18AM +0200, Matt Oliver wrote:
>> ffmpeg | branch: master | Matt Oliver <protogonoi at gmail.com> | Mon Jun  6 17:04:39 2016 +1000| [37787f261639c53998487400e874741c17e85fc6] | committer: Matt Oliver
>>
>> lavf/os_support.h: Fix for unicode filenames on windows.
>>
>> Fixes #819 #5256 #5281
>>
>> Signed-off-by: Matt Oliver <protogonoi at gmail.com>
>>
>>> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=37787f261639c53998487400e874741c17e85fc6
>> ---
>>
>>   libavformat/file.c       |    4 ++++
>>   libavformat/os_support.h |   24 ++++++++++++++++++++++++
>>   2 files changed, 28 insertions(+)
>>
>> diff --git a/libavformat/file.c b/libavformat/file.c
>> index 5765ce7..264542a 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
> why this chunk?
>
>>       if (ret < 0)
>>           return AVERROR(errno);
>>   
>> diff --git a/libavformat/os_support.h b/libavformat/os_support.h
>> index a332911..9e312a5 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
>>   
> ...instead of #define stat win32_stat here?

as already noted by someone else, this should be
#define stat(a, b) win32_stat((a), (b))
in order not to conflict with "struct stat" definition.

-- 
Ben



More information about the ffmpeg-devel mailing list