diff options
Diffstat (limited to 'src/kitlib.c')
-rw-r--r-- | src/kitlib.c | 61 |
1 files changed, 45 insertions, 16 deletions
diff --git a/src/kitlib.c b/src/kitlib.c index e5f1277..2daf44d 100644 --- a/src/kitlib.c +++ b/src/kitlib.c @@ -1,35 +1,63 @@ +#include <assert.h> +#include <SDL2/SDL_loadso.h> + +#include <libavformat/avformat.h> + +#include "kitchensink/internal/utils/kitlog.h" #include "kitchensink/kitchensink.h" #include "kitchensink/internal/kitlibstate.h" -#include <libavformat/avformat.h> -#include <ass/ass.h> -#include <assert.h> -// No-op -void _libass_msg_callback(int level, const char *fmt, va_list va, void *data) {} +static void _libass_msg_callback(int level, const char *fmt, va_list va, void *data) {} + +int Kit_InitASS(Kit_LibraryState *state) { +#ifdef USE_DYNAMIC_LIBASS + state->ass_so_handle = SDL_LoadObject(DYNAMIC_LIBASS_NAME); + if(state->ass_so_handle == NULL) { + Kit_SetError("Unable to load ASS library"); + return 1; + } + load_libass(state->ass_so_handle); +#endif + state->libass_handle = ass_library_init(); + ass_set_message_cb(state->libass_handle, _libass_msg_callback, NULL); + return 0; +} + +void Kit_CloseASS(Kit_LibraryState *state) { + ass_library_done(state->libass_handle); + state->libass_handle = NULL; +#ifdef USE_DYNAMIC_LIBASS + SDL_UnloadObject(state->ass_so_handle); + state->ass_so_handle = NULL; +#endif +} int Kit_Init(unsigned int flags) { Kit_LibraryState *state = Kit_GetLibraryState(); if(state->init_flags != 0) { Kit_SetError("Kitchensink is already initialized."); - return 1; + goto exit_0; } + av_register_all(); + if(flags & KIT_INIT_NETWORK) { avformat_network_init(); } - if(flags & KIT_INIT_FORMATS) { - av_register_all(); + if(flags & KIT_INIT_ASS) { + if(Kit_InitASS(state) != 0) { + goto exit_1; + } } state->init_flags = flags; + return 0; - // Init libass - state->libass_handle = ass_library_init(); +exit_1: + avformat_network_deinit(); - // Make libass message spam go away - ass_set_message_cb(state->libass_handle, _libass_msg_callback, NULL); - - return 0; +exit_0: + return 1; } void Kit_Quit() { @@ -38,9 +66,10 @@ void Kit_Quit() { if(state->init_flags & KIT_INIT_NETWORK) { avformat_network_deinit(); } + if(state->init_flags & KIT_INIT_ASS) { + Kit_CloseASS(state); + } state->init_flags = 0; - - ass_library_done(state->libass_handle); } void Kit_GetVersion(Kit_Version *version) { |