Message ID | 20220415080748.18517-2-nil-admirari@mailo.com |
---|---|
State | New |
Headers | show |
Series | [FFmpeg-devel,v9,1/6] libavutil/wchar_filename.h: Add whcartoutf8, wchartoansi and utf8toansi | expand |
Context | Check | Description |
---|---|---|
yinshiyou/make_loongarch64 | success | Make finished |
yinshiyou/make_fate_loongarch64 | success | Make fate finished |
andriy/make_x86 | success | Make finished |
andriy/make_fate_x86 | success | Make fate finished |
On Fri, 15 Apr 2022, Nil Admirari wrote: > --- > libavformat/avisynth.c | 12 +++++++----- > 1 file changed, 7 insertions(+), 5 deletions(-) > > diff --git a/libavformat/avisynth.c b/libavformat/avisynth.c > index 8ba2bdea..f7bea8c3 100644 > --- a/libavformat/avisynth.c > +++ b/libavformat/avisynth.c > @@ -34,6 +34,7 @@ > /* Platform-specific directives. */ > #ifdef _WIN32 > #include "compat/w32dlfcn.h" > + #include "libavutil/wchar_filename.h" > #undef EXTERN_C > #define AVISYNTH_LIB "avisynth" > #else > @@ -810,8 +811,7 @@ static int avisynth_open_file(AVFormatContext *s) > AVS_Value arg, val; > int ret; > #ifdef _WIN32 > - char filename_ansi[MAX_PATH * 4]; > - wchar_t filename_wc[MAX_PATH * 4]; > + char *filename_ansi = NULL; > #endif > > if (ret = avisynth_context_create(s)) > @@ -819,10 +819,12 @@ static int avisynth_open_file(AVFormatContext *s) > > #ifdef _WIN32 > /* Convert UTF-8 to ANSI code page */ > - MultiByteToWideChar(CP_UTF8, 0, s->url, -1, filename_wc, MAX_PATH * 4); > - WideCharToMultiByte(CP_THREAD_ACP, 0, filename_wc, -1, filename_ansi, > - MAX_PATH * 4, NULL, NULL); > + if (utf8toansi(s->url, &filename_ansi)) { > + ret = AVERROR_UNKNOWN; > + goto fail; > + } > arg = avs_new_value_string(filename_ansi); > + av_free(filename_ansi); > #else > arg = avs_new_value_string(s->url); > #endif This looks ok to me, but as mentioned in the other patch, I think CP_ACP actually would be more correct than the current CP_THREAD_ACP (https://github.com/ocaml/ocaml/issues/7854), so it could be worthwhile to change that at the same time (either just as part of this refactoring, or as a totally separate patch for clarity). // Martin
> This looks ok to me, but as mentioned in the other patch, I think CP_ACP > actually would be more correct than the current CP_THREAD_ACP utf8toansi was changed to use CP_ACP in https://ffmpeg.org/pipermail/ffmpeg-devel/2022-April/295569.html, so avisynth.c now uses CP_ACP as well.
diff --git a/libavformat/avisynth.c b/libavformat/avisynth.c index 8ba2bdea..f7bea8c3 100644 --- a/libavformat/avisynth.c +++ b/libavformat/avisynth.c @@ -34,6 +34,7 @@ /* Platform-specific directives. */ #ifdef _WIN32 #include "compat/w32dlfcn.h" + #include "libavutil/wchar_filename.h" #undef EXTERN_C #define AVISYNTH_LIB "avisynth" #else @@ -810,8 +811,7 @@ static int avisynth_open_file(AVFormatContext *s) AVS_Value arg, val; int ret; #ifdef _WIN32 - char filename_ansi[MAX_PATH * 4]; - wchar_t filename_wc[MAX_PATH * 4]; + char *filename_ansi = NULL; #endif if (ret = avisynth_context_create(s)) @@ -819,10 +819,12 @@ static int avisynth_open_file(AVFormatContext *s) #ifdef _WIN32 /* Convert UTF-8 to ANSI code page */ - MultiByteToWideChar(CP_UTF8, 0, s->url, -1, filename_wc, MAX_PATH * 4); - WideCharToMultiByte(CP_THREAD_ACP, 0, filename_wc, -1, filename_ansi, - MAX_PATH * 4, NULL, NULL); + if (utf8toansi(s->url, &filename_ansi)) { + ret = AVERROR_UNKNOWN; + goto fail; + } arg = avs_new_value_string(filename_ansi); + av_free(filename_ansi); #else arg = avs_new_value_string(s->url); #endif