Browse Source

filter: add a function to load filters

The activate function should match exactly vlc_filter_open, rather than use
a generic vlc_object_t loader. Then we don't have any dirty cast.

The code is similar to module_need, with better typing.

It's not possible to inline this because we need to call vlc_objres_clear()
for each module loaded unsuccessfully. It's not a public API.
pull/164/head
Steve Lhomme 2 years ago
parent
commit
3021f0dc9f
  1. 3
      include/vlc_filter.h
  2. 1
      src/libvlccore.sym
  3. 27
      src/misc/filter_chain.c

3
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

1
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

27
src/misc/filter_chain.c

@ -33,6 +33,33 @@
#include <libvlc.h>
#include <assert.h>
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 */

Loading…
Cancel
Save