GF_EXPORT GF_Err gf_modules_close_interface(GF_BaseInterface *ifce) { ModuleInstance *par; s32 i; if (!ifce) return GF_BAD_PARAM; par = (ModuleInstance *) ifce->HPLUG; if (!par || !ifce->InterfaceType) return GF_BAD_PARAM; i = gf_list_find(par->plugman->plug_list, par); if (i<0) return GF_BAD_PARAM; i = gf_list_find(par->interfaces, ifce); if (i<0) return GF_BAD_PARAM; gf_list_rem(par->interfaces, (u32) i); par->destroy_func(ifce); gf_modules_unload_library(par); //GF_LOG(GF_LOG_DEBUG, GF_LOG_CORE, ("[Core] interface %s unloaded\n", ifce->module_name)); return GF_OK; }
GF_EXPORT GF_BaseInterface *gf_modules_load_interface(GF_ModuleManager *pm, u32 whichplug, u32 InterfaceFamily) { const char *opt; char szKey[32]; ModuleInstance *inst; GF_BaseInterface *ifce; if (!pm){ GF_LOG(GF_LOG_ERROR, GF_LOG_CORE, ("[Core] gf_modules_load_interface() : No Module Manager set\n")); return NULL; } inst = (ModuleInstance *) gf_list_get(pm->plug_list, whichplug); if (!inst){ GF_LOG(GF_LOG_ERROR, GF_LOG_CORE, ("[Core] gf_modules_load_interface() : no module %d exist.\n", whichplug)); return NULL; } GF_LOG(GF_LOG_DEBUG, GF_LOG_CORE, ("[Core] Load interface...%s\n", inst->name)); /*look in cache*/ if (!pm->cfg){ GF_LOG(GF_LOG_ERROR, GF_LOG_CORE, ("[Core] No pm->cfg has been set !!!\n")); return NULL; } opt = gf_cfg_get_key(pm->cfg, "PluginsCache", inst->name); if (opt) { const char * ifce_str = gf_4cc_to_str(InterfaceFamily); snprintf(szKey, 32, "%s:yes", ifce_str ? ifce_str : "(null)"); if (!strstr(opt, szKey)){ return NULL; } } if (!gf_modules_load_library(inst)) { GF_LOG(GF_LOG_ERROR, GF_LOG_CORE, ("[Core] Cannot load library %s\n", inst->name)); gf_cfg_set_key(pm->cfg, "PluginsCache", inst->name, "Invalid Plugin"); return NULL; } if (!inst->query_func) { GF_LOG(GF_LOG_ERROR, GF_LOG_CORE, ("[Core] Library %s missing GPAC export symbols\n", inst->name)); gf_cfg_set_key(pm->cfg, "PluginsCache", inst->name, "Invalid Plugin"); goto err_exit; } /*build cache*/ if (!opt) { u32 i; Bool found = 0; char *key; const u32 *si = inst->query_func(); if (!si) { GF_LOG(GF_LOG_WARNING, GF_LOG_CORE, ("[Core] GPAC module %s has no supported interfaces - disabling\n", inst->name)); gf_cfg_set_key(pm->cfg, "PluginsCache", inst->name, "Invalid Plugin"); goto err_exit; } i=0; while (si[i]) i++; key = gf_malloc(sizeof(char) * 10 * i); key[0] = 0; i=0; while (si[i]) { snprintf(szKey, 32, "%s:yes ", gf_4cc_to_str(si[i])); strcat(key, szKey); if (InterfaceFamily==si[i]) found = 1; i++; } gf_cfg_set_key(pm->cfg, "PluginsCache", inst->name, key); gf_free(key); if (!found) goto err_exit; } if (!inst->query_func || !inst->query_func(InterfaceFamily) ) goto err_exit; ifce = (GF_BaseInterface *) inst->load_func(InterfaceFamily); /*sanity check*/ if (!ifce) goto err_exit; #if defined(TARGET_OS_IPHONE) || defined(TARGET_IPHONE_SIMULATOR) if (!strcmp(inst->name, "gm_sdl_out.dylib")) { if (InterfaceFamily == GF_VIDEO_OUTPUT_INTERFACE) { ifce = SDL_Module_Load_Video(); fprintf(stderr, "*** Loading SDL Video: %p ***\n", ifce); } else if (InterfaceFamily == GF_AUDIO_OUTPUT_INTERFACE) { ifce = SDL_Module_Load_Audio(); fprintf(stderr, "*** Loading SDL Audio: %p ***\n", ifce); } } #endif if (!ifce->module_name || (ifce->InterfaceType != InterfaceFamily)) { inst->destroy_func(ifce); goto err_exit; } gf_list_add(inst->interfaces, ifce); /*keep track of parent*/ ifce->HPLUG = inst; GF_LOG(GF_LOG_DEBUG, GF_LOG_CORE, ("[Core] Load interface %s DONE.\n", inst->name)); return ifce; err_exit: GF_LOG(GF_LOG_DEBUG, GF_LOG_CORE, ("[Core] Load interface %s exit label, freing library...\n", inst->name)); gf_modules_unload_library(inst); GF_LOG(GF_LOG_DEBUG, GF_LOG_CORE, ("[Core] Load interface %s EXIT.\n", inst->name)); return NULL; }