static av_cold int avisynth_read_close(AVFormatContext *s) { if (avpriv_lock_avformat()) return AVERROR_UNKNOWN; avisynth_context_destroy(s->priv_data); avpriv_unlock_avformat(); return 0; }
static av_cold void avisynth_atexit_handler(void) { AviSynthContext *avs = avs_ctx_list; while (avs) { AviSynthContext *next = avs->next; avisynth_context_destroy(avs); avs = next; } FreeLibrary(avs_library.library); avs_atexit_called = 1; }
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)); ret = AVERROR_UNKNOWN; goto fail; } if (!avs_is_clip(val)) { av_log(s, AV_LOG_ERROR, "%s\n", "AviSynth script did not return a clip"); ret = AVERROR_UNKNOWN; goto fail; } avs->clip = avs_library->avs_take_clip(val, avs->env); avs->vi = avs_library->avs_get_video_info(avs->clip); // Release the AVS_Value as it will go out of scope. avs_library->avs_release_value(val); if (ret = avisynth_create_stream(s)) goto fail; return 0; fail: avisynth_context_destroy(avs); return ret; }
static int avisynth_open_file(AVFormatContext *s) { AviSynthContext *avs = s->priv_data; AVS_Value arg, val; int ret; #ifdef USING_AVISYNTH char filename_ansi[MAX_PATH * 4]; wchar_t filename_wc[MAX_PATH * 4]; #endif if (ret = avisynth_context_create(s)) return ret; #ifdef USING_AVISYNTH /* 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)); ret = AVERROR_UNKNOWN; goto fail; } if (!avs_is_clip(val)) { av_log(s, AV_LOG_ERROR, "AviSynth script did not return a clip\n"); ret = AVERROR_UNKNOWN; goto fail; } avs->clip = avs_library.avs_take_clip(val, avs->env); avs->vi = avs_library.avs_get_video_info(avs->clip); #ifdef USING_AVISYNTH /* On Windows, FFmpeg supports AviSynth interface version 6 or higher. * This includes AviSynth 2.6 RC1 or higher, and AviSynth+ r1718 or higher, * and excludes 2.5 and the 2.6 alphas. Since AvxSynth identifies itself * as interface version 3 like 2.5.8, this needs to be special-cased. */ if (avs_library.avs_get_version(avs->clip) < 6) { av_log(s, AV_LOG_ERROR, "AviSynth version is too old. Please upgrade to either AviSynth 2.6 >= RC1 or AviSynth+ >= r1718.\n"); ret = AVERROR_UNKNOWN; goto fail; } #endif /* Release the AVS_Value as it will go out of scope. */ avs_library.avs_release_value(val); if (ret = avisynth_create_stream(s)) goto fail; return 0; fail: avisynth_context_destroy(avs); return ret; }