libobs: Add obs_source_copy_filters function

Allows copying filters from one source to another.

Closes jp9000/obs-studio#860
This commit is contained in:
cg2121 2017-03-12 21:54:55 -05:00 committed by jp9000
parent e07cb71130
commit 1ef7a48e9c
2 changed files with 38 additions and 2 deletions

View file

@ -365,6 +365,27 @@ obs_source_t *obs_source_create_private(const char *id, const char *name,
return obs_source_create_internal(id, name, settings, NULL, true);
}
static char *get_new_filter_name(obs_source_t *dst, const char *name)
{
struct dstr new_name = {0};
int inc = 0;
dstr_copy(&new_name, name);
for (;;) {
obs_source_t *existing_filter = obs_source_get_filter_by_name(
dst, new_name.array);
if (!existing_filter)
break;
obs_source_release(existing_filter);
dstr_printf(&new_name, "%s %d", name, ++inc + 1);
}
return new_name.array;
}
static void duplicate_filters(obs_source_t *dst, obs_source_t *src,
bool private)
{
@ -380,9 +401,13 @@ static void duplicate_filters(obs_source_t *dst, obs_source_t *src,
for (size_t i = filters.num; i > 0; i--) {
obs_source_t *src_filter = filters.array[i - 1];
obs_source_t *dst_filter = obs_source_duplicate(src_filter,
src_filter->context.name, private);
char *new_name = get_new_filter_name(dst,
src_filter->context.name);
obs_source_t *dst_filter = obs_source_duplicate(src_filter,
new_name, private);
bfree(new_name);
obs_source_filter_add(dst, dst_filter);
obs_source_release(dst_filter);
obs_source_release(src_filter);
@ -391,6 +416,15 @@ static void duplicate_filters(obs_source_t *dst, obs_source_t *src,
da_free(filters);
}
void obs_source_copy_filters(obs_source_t *dst, obs_source_t *src)
{
duplicate_filters(dst, src, dst->context.private ?
OBS_SCENE_DUP_PRIVATE_COPY :
OBS_SCENE_DUP_COPY);
obs_source_release(src);
}
obs_source_t *obs_source_duplicate(obs_source_t *source,
const char *new_name, bool create_private)
{

View file

@ -869,6 +869,8 @@ EXPORT void obs_source_enum_filters(obs_source_t *source,
EXPORT obs_source_t *obs_source_get_filter_by_name(obs_source_t *source,
const char *name);
EXPORT void obs_source_copy_filters(obs_source_t *dst, obs_source_t *src);
EXPORT bool obs_source_enabled(const obs_source_t *source);
EXPORT void obs_source_set_enabled(obs_source_t *source, bool enabled);