[FFmpeg-devel] [PATCH] Support for UTF8 filenames on Windows

Måns Rullgård mans
Fri Jun 26 09:50:32 CEST 2009


Karl Blomster <thefluff at uppcon.com> writes:

> Ramiro Polla wrote:
>> Hi,
>> On Thu, Jun 25, 2009 at 8:59 AM, Michael
>> Niedermayer<michaelni at gmx.at> wrote:
>>> On Sat, Jun 20, 2009 at 11:56:37PM +0200, Kalle Blomster wrote:
>>>> Currently, ffmpeg on Windows does not support opening files whose names
>>>> contain characters that cannot be expressed in the current locale, because
>>>> on Windows you can't pass UTF8 in a char* to _open() and have it work. You
>>>> have to convert the filename to UTF16 and use _wopen(), which takes a
>>>> wchar_t instead.
>>>>
>>>> I have attached a patch that attempts to solve the problem with a rather
>>>> ugly hack. It Works For Me(tm) under mingw at least. Comments are
>>>> appreciated.
>>>>
>>>> Regards,
>>>> Karl Blomster
>>>>  os_support.c |   17 +++++++++++++++++
>>>>  os_support.h |    5 +++++
>>>>  2 files changed, 22 insertions(+)
>>>> 9afa6887f1f6998c37d75efaae5d589918dc752b  ffmpeg_win_utf8_paths.patch
>>>> Index: libavformat/os_support.c
>>>> ===================================================================
>>>> --- libavformat/os_support.c  (revision 19242)
>>>> +++ libavformat/os_support.c  (working copy)
>>>> @@ -30,6 +30,23 @@
>>>>  #include <sys/time.h>
>>>>  #include "os_support.h"
>>>>
>>>> +#ifdef HAVE_WIN_UTF8_PATHS
>>>> +#define WIN32_LEAN_AND_MEAN
>>>> +#include <windows.h>
>>>> +#endif
>>>> +
>>>> +#ifdef HAVE_WIN_UTF8_PATHS
>> Where is HAVE_WIN_UTF8_PATHS defined?
>
> Nowhere, right now. My thought is to let configure set it with some
> --enable parameter, or you just pass -DHAVE_WIN_UTF8_PATHS in your
> CFLAGS. The point was that I thought it might be a good idea to let
> the user compile with it disabled, if he wanted to, like if someone
> wanted to build on Win9x (heh) or something where unicode support
> might not be available.

Can we simply test for the existence of _wopen()?  Is there any reason
to disable this if the function exists?

>>>> +int winutf8_open(const char *filename, int oflag, int pmode)
>>>> +{
>>>> +     wchar_t wfilename[MAX_PATH * 2];
>>>> +
>>>> +     if (MultiByteToWideChar(CP_UTF8,MB_ERR_INVALID_CHARS,filename,-1,wfilename,MAX_PATH) > 0)
>>>> +             return _wopen(wfilename, oflag, pmode);
>>>> +     else
>>>> +             return open(filename, oflag, pmode);
>>>> +}
>>>> +#endif

What might cause MultiByteToWideChar() to fail?  What will plain
open() do with such input?  Also, what is the value of MAX_PATH?
It is probably a bad idea to silently truncate the filename at
MAX_PATH characters.  This could turn an invalid name into the name of
an existing file.

-- 
M?ns Rullg?rd
mans at mansr.com



More information about the ffmpeg-devel mailing list