diff --git a/include/vlc_filter.h b/include/vlc_filter.h index 588d4dc2ce..2f7235322d 100644 --- a/include/vlc_filter.h +++ b/include/vlc_filter.h @@ -243,6 +243,9 @@ static inline void filter_Close( filter_t *p_filter ) p_filter->ops->close( p_filter ); } +VLC_API module_t *vlc_filter_LoadModule(filter_t *, const char *cap, + const char *name, bool strict); + /** * This function will return a new picture usable by p_filter as an output * buffer. You have to release it using picture_Release or by returning diff --git a/src/libvlccore.sym b/src/libvlccore.sym index 1114d5fd7b..82cdbbe731 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -135,6 +135,7 @@ filter_chain_ForEach filter_ConfigureBlend filter_DeleteBlend filter_NewBlend +vlc_filter_LoadModule FromCharset vlc_find_iso639 vlc_http_auth_Init diff --git a/src/misc/filter_chain.c b/src/misc/filter_chain.c index 8446eac7c8..e53acd7811 100644 --- a/src/misc/filter_chain.c +++ b/src/misc/filter_chain.c @@ -33,6 +33,33 @@ #include #include +static int vlc_filter_Activate(void *func, bool forced, va_list ap) +{ + filter_t *p_filter = va_arg(ap, filter_t *); + vlc_filter_open activate = func; + + p_filter->obj.force = forced; + int ret = activate(p_filter); + if (ret != VLC_SUCCESS) + vlc_objres_clear(&p_filter->obj); + return ret; +} + +module_t *vlc_filter_LoadModule(filter_t *p_filter, const char *capability, + const char *name, bool strict) +{ + const bool b_force_backup = p_filter->obj.force; /* FIXME: remove this */ + p_filter->p_module = vlc_module_load(p_filter->obj.logger, capability, name, strict, + vlc_filter_Activate, p_filter); + if (p_filter->p_module != NULL) { + var_Create(p_filter, "module-name", VLC_VAR_STRING); + var_SetString(p_filter, "module-name", module_get_object(p_filter->p_module)); + } + + p_filter->obj.force = b_force_backup; + return p_filter->p_module; +} + typedef struct chained_filter_t { /* Public part of the filter structure */