/* A conflict between C++ global objects, atexit, and dynamic loading requires
* us to register our own atexit handler to prevent double freeing. */
-static AviSynthLibrary *avs_library = NULL;
+static AviSynthLibrary avs_library;
static int avs_atexit_called = 0;
/* Linked list of AviSynthContexts. An atexit handler destroys this list. */
static av_cold int avisynth_load_library(void)
{
- avs_library = av_mallocz(sizeof(AviSynthLibrary));
- if (!avs_library)
+ avs_library.library = LoadLibrary(AVISYNTH_LIB);
+ if (!avs_library.library)
return AVERROR_UNKNOWN;
- avs_library->library = LoadLibrary(AVISYNTH_LIB);
- if (!avs_library->library)
- goto init_fail;
-
-#define LOAD_AVS_FUNC(name, continue_on_fail) \
- avs_library->name = \
- (void *)GetProcAddress(avs_library->library, #name); \
- if (!continue_on_fail && !avs_library->name) \
+#define LOAD_AVS_FUNC(name, continue_on_fail) \
+ avs_library.name = \
+ (void *)GetProcAddress(avs_library.library, #name); \
+ if (!continue_on_fail && !avs_library.name) \
goto fail;
LOAD_AVS_FUNC(avs_bit_blt, 0);
return 0;
fail:
- FreeLibrary(avs_library->library);
-init_fail:
- av_freep(&avs_library);
+ FreeLibrary(avs_library.library);
return AVERROR_UNKNOWN;
}
AviSynthContext *avs = s->priv_data;
int ret;
- if (!avs_library)
+ if (!avs_library.library)
if (ret = avisynth_load_library())
return ret;
- avs->env = avs_library->avs_create_script_environment(3);
- if (avs_library->avs_get_error) {
- const char *error = avs_library->avs_get_error(avs->env);
+ avs->env = avs_library.avs_create_script_environment(3);
+ if (avs_library.avs_get_error) {
+ const char *error = avs_library.avs_get_error(avs->env);
if (error) {
av_log(s, AV_LOG_ERROR, "%s\n", error);
return AVERROR_UNKNOWN;
}
if (avs->clip) {
- avs_library->avs_release_clip(avs->clip);
+ avs_library.avs_release_clip(avs->clip);
avs->clip = NULL;
}
if (avs->env) {
- avs_library->avs_delete_script_environment(avs->env);
+ avs_library.avs_delete_script_environment(avs->env);
avs->env = NULL;
}
}
avisynth_context_destroy(avs);
avs = next;
}
- FreeLibrary(avs_library->library);
- av_freep(&avs_library);
+ FreeLibrary(avs_library.library);
avs_atexit_called = 1;
}
#else
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)) {
av_log(s, AV_LOG_ERROR, "%s\n", avs_as_error(val));
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);
+ 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);
+ avs_library.avs_release_value(val);
if (ret = avisynth_create_stream(s))
goto fail;
return AVERROR(ENOMEM);
}
- frame = avs_library->avs_get_frame(avs->clip, n);
- error = avs_library->avs_clip_get_error(avs->clip);
+ frame = avs_library.avs_get_frame(avs->clip, n);
+ error = avs_library.avs_clip_get_error(avs->clip);
if (error) {
av_log(s, AV_LOG_ERROR, "%s\n", error);
avs->error = 1;
pitch = avs_get_pitch_p(frame, plane);
#ifdef USING_AVISYNTH
- if (avs_library->avs_get_version(avs->clip) == 3) {
+ if (avs_library.avs_get_version(avs->clip) == 3) {
rowsize = avs_get_row_size_p_25(frame, plane);
planeheight = avs_get_height_p_25(frame, plane);
} else {
pitch = -pitch;
}
- avs_library->avs_bit_blt(avs->env, dst_p, rowsize, src_p, pitch,
+ avs_library.avs_bit_blt(avs->env, dst_p, rowsize, src_p, pitch,
rowsize, planeheight);
dst_p += rowsize * planeheight;
}
- avs_library->avs_release_video_frame(frame);
+ avs_library.avs_release_video_frame(frame);
return 0;
}
if (!pkt->data)
return AVERROR(ENOMEM);
- avs_library->avs_get_audio(avs->clip, pkt->data, n, samples);
- error = avs_library->avs_clip_get_error(avs->clip);
+ avs_library.avs_get_audio(avs->clip, pkt->data, n, samples);
+ error = avs_library.avs_clip_get_error(avs->clip);
if (error) {
av_log(s, AV_LOG_ERROR, "%s\n", error);
avs->error = 1;