avisynth: Make sure the filename passed to Avisynth is in the right code page

Avisynth is a non-unicode application and cannot accept UTF-8
characters. Therefore, the input filename should be converted to
the code page that it expects.

Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
This commit is contained in:
Oka Motofumi 2013-06-21 22:57:03 +09:00 committed by Derek Buitenhuis
parent 8bdbabfaa4
commit 81c5ceeda2

View File

@ -355,11 +355,22 @@ static int avisynth_open_file(AVFormatContext *s) {
AviSynthContext *avs = (AviSynthContext *)s->priv_data; AviSynthContext *avs = (AviSynthContext *)s->priv_data;
AVS_Value arg, val; AVS_Value arg, val;
int ret; int ret;
#ifdef _WIN32
char filename_ansi[MAX_PATH * 4];
wchar_t filename_wc[MAX_PATH * 4];
#endif
if (ret = avisynth_context_create(s)) if (ret = avisynth_context_create(s))
return ret; return ret;
#ifdef _WIN32
// Convert UTF-8 to ANSI code page
MultiByteToWideChar(CP_UTF8, 0, s->filename, -1, filename_wc, MAX_PATH * 4);
WideCharToMultiByte(CP_THREAD_ACP, 0, filename_wc, -1, filename_ansi, MAX_PATH * 4, NULL, NULL);
arg = avs_new_value_string(filename_ansi);
#else
arg = avs_new_value_string(s->filename); arg = avs_new_value_string(s->filename);
#endif
val = avs_library->avs_invoke(avs->env, "Import", arg, 0); val = avs_library->avs_invoke(avs->env, "Import", arg, 0);
if (avs_is_error(val)) { if (avs_is_error(val)) {
av_log(s, AV_LOG_ERROR, "%s\n", avs_as_error(val)); av_log(s, AV_LOG_ERROR, "%s\n", avs_as_error(val));