avisynth: Make sure the filename passed to Avisynth is in the right code page
authorOka Motofumi <chikuzen.mo@gmail.com>
Fri, 21 Jun 2013 13:57:03 +0000 (22:57 +0900)
committerDerek Buitenhuis <derek.buitenhuis@gmail.com>
Sat, 22 Jun 2013 20:41:43 +0000 (16:41 -0400)
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>
libavformat/avisynth.c

index a5a4fcc6c982fece935983317e2b42fcc186fb15..35b66f1ff83db55c728bd95e470d4ecd59d1f2d7 100644 (file)
@@ -355,11 +355,22 @@ static int avisynth_open_file(AVFormatContext *s) {
     AviSynthContext *avs = (AviSynthContext *)s->priv_data;
     AVS_Value arg, val;
     int ret;
+#ifdef _WIN32
+    char filename_ansi[MAX_PATH * 4];
+    wchar_t filename_wc[MAX_PATH * 4];
+#endif
 
     if (ret = avisynth_context_create(s))
         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);
+#endif
     val = avs_library->avs_invoke(avs->env, "Import", arg, 0);
     if (avs_is_error(val)) {
         av_log(s, AV_LOG_ERROR, "%s\n", avs_as_error(val));