New upstream version 24.0.1+dfsg1
This commit is contained in:
parent
b14f9eae6d
commit
5a730d6ec3
842 changed files with 42245 additions and 33385 deletions
229
deps/obs-scripting/obs-scripting-lua-source.c
vendored
229
deps/obs-scripting/obs-scripting-lua-source.c
vendored
|
|
@ -23,7 +23,7 @@
|
|||
/* ========================================================================= */
|
||||
|
||||
static inline const char *get_table_string_(lua_State *script, int idx,
|
||||
const char *name, const char *func)
|
||||
const char *name, const char *func)
|
||||
{
|
||||
const char *str = "";
|
||||
|
||||
|
|
@ -38,8 +38,8 @@ static inline const char *get_table_string_(lua_State *script, int idx,
|
|||
return str;
|
||||
}
|
||||
|
||||
static inline int get_table_int_(lua_State *script, int idx,
|
||||
const char *name, const char *func)
|
||||
static inline int get_table_int_(lua_State *script, int idx, const char *name,
|
||||
const char *func)
|
||||
{
|
||||
int val = 0;
|
||||
|
||||
|
|
@ -54,7 +54,8 @@ static inline int get_table_int_(lua_State *script, int idx,
|
|||
}
|
||||
|
||||
static inline void get_callback_from_table_(lua_State *script, int idx,
|
||||
const char *name, int *p_reg_idx, const char *func)
|
||||
const char *name, int *p_reg_idx,
|
||||
const char *func)
|
||||
{
|
||||
*p_reg_idx = LUA_REFNIL;
|
||||
|
||||
|
|
@ -77,22 +78,14 @@ static inline void get_callback_from_table_(lua_State *script, int idx,
|
|||
#define get_callback_from_table(script, idx, name, p_reg_idx) \
|
||||
get_callback_from_table_(script, idx, name, p_reg_idx, __FUNCTION__)
|
||||
|
||||
bool ls_get_libobs_obj_(lua_State * script,
|
||||
const char *type,
|
||||
int lua_idx,
|
||||
void * libobs_out,
|
||||
const char *id,
|
||||
const char *func,
|
||||
int line)
|
||||
bool ls_get_libobs_obj_(lua_State *script, const char *type, int lua_idx,
|
||||
void *libobs_out, const char *id, const char *func,
|
||||
int line)
|
||||
{
|
||||
swig_type_info *info = SWIG_TypeQuery(script, type);
|
||||
if (info == NULL) {
|
||||
warn("%s:%d: SWIG could not find type: %s%s%s",
|
||||
func,
|
||||
line,
|
||||
id ? id : "",
|
||||
id ? "::" : "",
|
||||
type);
|
||||
warn("%s:%d: SWIG could not find type: %s%s%s", func, line,
|
||||
id ? id : "", id ? "::" : "", type);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -100,37 +93,25 @@ bool ls_get_libobs_obj_(lua_State * script,
|
|||
if (!SWIG_IsOK(ret)) {
|
||||
warn("%s:%d: SWIG failed to convert lua object to obs "
|
||||
"object: %s%s%s",
|
||||
func,
|
||||
line,
|
||||
id ? id : "",
|
||||
id ? "::" : "",
|
||||
type);
|
||||
func, line, id ? id : "", id ? "::" : "", type);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#define ls_get_libobs_obj(type, lua_index, obs_obj) \
|
||||
ls_get_libobs_obj_(ls->script, #type " *", lua_index, obs_obj, \
|
||||
ls->id, __FUNCTION__, __LINE__)
|
||||
#define ls_get_libobs_obj(type, lua_index, obs_obj) \
|
||||
ls_get_libobs_obj_(ls->script, #type " *", lua_index, obs_obj, ls->id, \
|
||||
__FUNCTION__, __LINE__)
|
||||
|
||||
bool ls_push_libobs_obj_(lua_State * script,
|
||||
const char *type,
|
||||
void * libobs_in,
|
||||
bool ownership,
|
||||
const char *id,
|
||||
const char *func,
|
||||
int line)
|
||||
bool ls_push_libobs_obj_(lua_State *script, const char *type, void *libobs_in,
|
||||
bool ownership, const char *id, const char *func,
|
||||
int line)
|
||||
{
|
||||
swig_type_info *info = SWIG_TypeQuery(script, type);
|
||||
if (info == NULL) {
|
||||
warn("%s:%d: SWIG could not find type: %s%s%s",
|
||||
func,
|
||||
line,
|
||||
id ? id : "",
|
||||
id ? "::" : "",
|
||||
type);
|
||||
warn("%s:%d: SWIG could not find type: %s%s%s", func, line,
|
||||
id ? id : "", id ? "::" : "", type);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -138,9 +119,9 @@ bool ls_push_libobs_obj_(lua_State * script,
|
|||
return true;
|
||||
}
|
||||
|
||||
#define ls_push_libobs_obj(type, obs_obj, ownership) \
|
||||
#define ls_push_libobs_obj(type, obs_obj, ownership) \
|
||||
ls_push_libobs_obj_(ls->script, #type " *", obs_obj, ownership, \
|
||||
ls->id, __FUNCTION__, __LINE__)
|
||||
ls->id, __FUNCTION__, __LINE__)
|
||||
|
||||
/* ========================================================================= */
|
||||
|
||||
|
|
@ -149,24 +130,24 @@ struct obs_lua_data;
|
|||
struct obs_lua_source {
|
||||
struct obs_lua_script *data;
|
||||
|
||||
lua_State * script;
|
||||
lua_State *script;
|
||||
const char *id;
|
||||
const char *display_name;
|
||||
int func_create;
|
||||
int func_destroy;
|
||||
int func_get_width;
|
||||
int func_get_height;
|
||||
int func_get_defaults;
|
||||
int func_get_properties;
|
||||
int func_update;
|
||||
int func_activate;
|
||||
int func_deactivate;
|
||||
int func_show;
|
||||
int func_hide;
|
||||
int func_video_tick;
|
||||
int func_video_render;
|
||||
int func_save;
|
||||
int func_load;
|
||||
int func_create;
|
||||
int func_destroy;
|
||||
int func_get_width;
|
||||
int func_get_height;
|
||||
int func_get_defaults;
|
||||
int func_get_properties;
|
||||
int func_update;
|
||||
int func_activate;
|
||||
int func_deactivate;
|
||||
int func_show;
|
||||
int func_hide;
|
||||
int func_video_tick;
|
||||
int func_video_render;
|
||||
int func_save;
|
||||
int func_load;
|
||||
|
||||
pthread_mutex_t definition_mutex;
|
||||
struct obs_lua_data *first_source;
|
||||
|
|
@ -179,29 +160,27 @@ extern pthread_mutex_t lua_source_def_mutex;
|
|||
struct obs_lua_source *first_source_def = NULL;
|
||||
|
||||
struct obs_lua_data {
|
||||
obs_source_t * source;
|
||||
obs_source_t *source;
|
||||
struct obs_lua_source *ls;
|
||||
int lua_data_ref;
|
||||
int lua_data_ref;
|
||||
|
||||
struct obs_lua_data *next;
|
||||
struct obs_lua_data **p_prev_next;
|
||||
};
|
||||
|
||||
#define call_func(name, args, rets) \
|
||||
call_func_(ls->script, ls->func_ ## name, args, rets, #name, \
|
||||
ls->display_name)
|
||||
#define have_func(name) \
|
||||
(ls->func_ ## name != LUA_REFNIL)
|
||||
#define call_func(name, args, rets) \
|
||||
call_func_(ls->script, ls->func_##name, args, rets, #name, \
|
||||
ls->display_name)
|
||||
#define have_func(name) (ls->func_##name != LUA_REFNIL)
|
||||
#define ls_push_data() \
|
||||
lua_rawgeti(ls->script, LUA_REGISTRYINDEX, ld->lua_data_ref)
|
||||
#define ls_pop(count) \
|
||||
lua_pop(ls->script, count)
|
||||
#define lock_script() \
|
||||
struct obs_lua_script *__data = ls->data; \
|
||||
#define ls_pop(count) lua_pop(ls->script, count)
|
||||
#define lock_script() \
|
||||
struct obs_lua_script *__data = ls->data; \
|
||||
struct obs_lua_script *__prev_script = current_lua_script; \
|
||||
current_lua_script = __data; \
|
||||
current_lua_script = __data; \
|
||||
pthread_mutex_lock(&__data->mutex);
|
||||
#define unlock_script() \
|
||||
#define unlock_script() \
|
||||
pthread_mutex_unlock(&__data->mutex); \
|
||||
current_lua_script = __prev_script;
|
||||
|
||||
|
|
@ -230,9 +209,9 @@ static void *obs_lua_source_create(obs_data_t *settings, obs_source_t *source)
|
|||
|
||||
int lua_data_ref = luaL_ref(ls->script, LUA_REGISTRYINDEX);
|
||||
if (lua_data_ref != LUA_REFNIL) {
|
||||
data = bmalloc(sizeof(*data));
|
||||
data->source = source;
|
||||
data->ls = ls;
|
||||
data = bmalloc(sizeof(*data));
|
||||
data->source = source;
|
||||
data->ls = ls;
|
||||
data->lua_data_ref = lua_data_ref;
|
||||
}
|
||||
|
||||
|
|
@ -242,7 +221,8 @@ static void *obs_lua_source_create(obs_data_t *settings, obs_source_t *source)
|
|||
struct obs_lua_data *next = ls->first_source;
|
||||
data->next = next;
|
||||
data->p_prev_next = &ls->first_source;
|
||||
if (next) next->p_prev_next = &data->next;
|
||||
if (next)
|
||||
next->p_prev_next = &data->next;
|
||||
ls->first_source = data;
|
||||
}
|
||||
|
||||
|
|
@ -263,9 +243,9 @@ static void call_destroy(struct obs_lua_data *ld)
|
|||
|
||||
static void obs_lua_source_destroy(void *data)
|
||||
{
|
||||
struct obs_lua_data * ld = data;
|
||||
struct obs_lua_data *ld = data;
|
||||
struct obs_lua_source *ls = ld->ls;
|
||||
struct obs_lua_data * next;
|
||||
struct obs_lua_data *next;
|
||||
|
||||
pthread_mutex_lock(&ls->definition_mutex);
|
||||
if (!ls->script)
|
||||
|
|
@ -280,7 +260,8 @@ static void obs_lua_source_destroy(void *data)
|
|||
fail:
|
||||
next = ld->next;
|
||||
*ld->p_prev_next = next;
|
||||
if (next) next->p_prev_next = ld->p_prev_next;
|
||||
if (next)
|
||||
next->p_prev_next = ld->p_prev_next;
|
||||
|
||||
bfree(data);
|
||||
pthread_mutex_unlock(&ls->definition_mutex);
|
||||
|
|
@ -288,9 +269,9 @@ fail:
|
|||
|
||||
static uint32_t obs_lua_source_get_width(void *data)
|
||||
{
|
||||
struct obs_lua_data * ld = data;
|
||||
struct obs_lua_source *ls = ld->ls;
|
||||
uint32_t width = 0;
|
||||
struct obs_lua_data *ld = data;
|
||||
struct obs_lua_source *ls = ld->ls;
|
||||
uint32_t width = 0;
|
||||
|
||||
pthread_mutex_lock(&ls->definition_mutex);
|
||||
if (!ls->script)
|
||||
|
|
@ -315,9 +296,9 @@ fail:
|
|||
|
||||
static uint32_t obs_lua_source_get_height(void *data)
|
||||
{
|
||||
struct obs_lua_data * ld = data;
|
||||
struct obs_lua_source *ls = ld->ls;
|
||||
uint32_t height = 0;
|
||||
struct obs_lua_data *ld = data;
|
||||
struct obs_lua_source *ls = ld->ls;
|
||||
uint32_t height = 0;
|
||||
|
||||
pthread_mutex_lock(&ls->definition_mutex);
|
||||
if (!ls->script)
|
||||
|
|
@ -363,9 +344,9 @@ fail:
|
|||
|
||||
static obs_properties_t *obs_lua_source_get_properties(void *data)
|
||||
{
|
||||
struct obs_lua_data * ld = data;
|
||||
struct obs_lua_source *ls = ld->ls;
|
||||
obs_properties_t * props = NULL;
|
||||
struct obs_lua_data *ld = data;
|
||||
struct obs_lua_source *ls = ld->ls;
|
||||
obs_properties_t *props = NULL;
|
||||
|
||||
pthread_mutex_lock(&ls->definition_mutex);
|
||||
if (!ls->script)
|
||||
|
|
@ -390,7 +371,7 @@ fail:
|
|||
|
||||
static void obs_lua_source_update(void *data, obs_data_t *settings)
|
||||
{
|
||||
struct obs_lua_data * ld = data;
|
||||
struct obs_lua_data *ld = data;
|
||||
struct obs_lua_source *ls = ld->ls;
|
||||
|
||||
pthread_mutex_lock(&ls->definition_mutex);
|
||||
|
|
@ -411,17 +392,17 @@ fail:
|
|||
pthread_mutex_unlock(&ls->definition_mutex);
|
||||
}
|
||||
|
||||
#define DEFINE_VOID_DATA_CALLBACK(name) \
|
||||
static void obs_lua_source_ ## name(void *data) \
|
||||
{ \
|
||||
struct obs_lua_data * ld = data; \
|
||||
struct obs_lua_source *ls = ld->ls; \
|
||||
if (!have_func(name)) \
|
||||
return; \
|
||||
lock_script(); \
|
||||
ls_push_data(); \
|
||||
call_func(name, 1, 0); \
|
||||
unlock_script(); \
|
||||
#define DEFINE_VOID_DATA_CALLBACK(name) \
|
||||
static void obs_lua_source_##name(void *data) \
|
||||
{ \
|
||||
struct obs_lua_data *ld = data; \
|
||||
struct obs_lua_source *ls = ld->ls; \
|
||||
if (!have_func(name)) \
|
||||
return; \
|
||||
lock_script(); \
|
||||
ls_push_data(); \
|
||||
call_func(name, 1, 0); \
|
||||
unlock_script(); \
|
||||
}
|
||||
DEFINE_VOID_DATA_CALLBACK(activate)
|
||||
DEFINE_VOID_DATA_CALLBACK(deactivate)
|
||||
|
|
@ -431,7 +412,7 @@ DEFINE_VOID_DATA_CALLBACK(hide)
|
|||
|
||||
static void obs_lua_source_video_tick(void *data, float seconds)
|
||||
{
|
||||
struct obs_lua_data * ld = data;
|
||||
struct obs_lua_data *ld = data;
|
||||
struct obs_lua_source *ls = ld->ls;
|
||||
|
||||
pthread_mutex_lock(&ls->definition_mutex);
|
||||
|
|
@ -454,7 +435,7 @@ fail:
|
|||
|
||||
static void obs_lua_source_video_render(void *data, gs_effect_t *effect)
|
||||
{
|
||||
struct obs_lua_data * ld = data;
|
||||
struct obs_lua_data *ld = data;
|
||||
struct obs_lua_source *ls = ld->ls;
|
||||
|
||||
pthread_mutex_lock(&ls->definition_mutex);
|
||||
|
|
@ -477,7 +458,7 @@ fail:
|
|||
|
||||
static void obs_lua_source_save(void *data, obs_data_t *settings)
|
||||
{
|
||||
struct obs_lua_data * ld = data;
|
||||
struct obs_lua_data *ld = data;
|
||||
struct obs_lua_source *ls = ld->ls;
|
||||
|
||||
pthread_mutex_lock(&ls->definition_mutex);
|
||||
|
|
@ -500,7 +481,7 @@ fail:
|
|||
|
||||
static void obs_lua_source_load(void *data, obs_data_t *settings)
|
||||
{
|
||||
struct obs_lua_data * ld = data;
|
||||
struct obs_lua_data *ld = data;
|
||||
struct obs_lua_source *ls = ld->ls;
|
||||
|
||||
pthread_mutex_lock(&ls->definition_mutex);
|
||||
|
|
@ -523,7 +504,7 @@ fail:
|
|||
|
||||
static void source_type_unload(struct obs_lua_source *ls)
|
||||
{
|
||||
#define unref(name) \
|
||||
#define unref(name) \
|
||||
luaL_unref(ls->script, LUA_REGISTRYINDEX, name); \
|
||||
name = LUA_REFNIL
|
||||
|
||||
|
|
@ -614,9 +595,9 @@ static int obs_lua_register_source(lua_State *script)
|
|||
v = existing ? existing : &ls;
|
||||
|
||||
v->script = script;
|
||||
v->id = id;
|
||||
v->id = id;
|
||||
|
||||
info.id = v->id;
|
||||
info.id = v->id;
|
||||
info.type = (enum obs_source_type)get_table_int(script, -1, "type");
|
||||
|
||||
info.output_flags = get_table_int(script, -1, "output_flags");
|
||||
|
|
@ -628,16 +609,14 @@ static int obs_lua_register_source(lua_State *script)
|
|||
lua_pop(script, 1);
|
||||
}
|
||||
|
||||
if (!v->display_name ||
|
||||
!*v->display_name ||
|
||||
!*info.id ||
|
||||
if (!v->display_name || !*v->display_name || !*info.id ||
|
||||
!info.output_flags)
|
||||
goto fail;
|
||||
|
||||
#define get_callback(val) \
|
||||
do { \
|
||||
get_callback_from_table(script, -1, #val, &v->func_ ## val); \
|
||||
info.val = obs_lua_source_ ## val; \
|
||||
#define get_callback(val) \
|
||||
do { \
|
||||
get_callback_from_table(script, -1, #val, &v->func_##val); \
|
||||
info.val = obs_lua_source_##val; \
|
||||
} while (false)
|
||||
|
||||
get_callback(create);
|
||||
|
|
@ -657,16 +636,21 @@ static int obs_lua_register_source(lua_State *script)
|
|||
#undef get_callback
|
||||
|
||||
get_callback_from_table(script, -1, "get_defaults",
|
||||
&v->func_get_defaults);
|
||||
&v->func_get_defaults);
|
||||
|
||||
if (!existing) {
|
||||
ls.data = current_lua_script;
|
||||
|
||||
pthread_mutex_init(&ls.definition_mutex, NULL);
|
||||
info.type_data = bmemdup(&ls, sizeof(ls));
|
||||
pthread_mutexattr_t mutexattr;
|
||||
pthread_mutexattr_init(&mutexattr);
|
||||
pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_RECURSIVE);
|
||||
pthread_mutex_init(&ls.definition_mutex, &mutexattr);
|
||||
pthread_mutexattr_destroy(&mutexattr);
|
||||
|
||||
info.type_data = bmemdup(&ls, sizeof(ls));
|
||||
info.free_type_data = obs_lua_source_free_type_data;
|
||||
info.get_name = obs_lua_source_get_name;
|
||||
info.get_defaults2 = obs_lua_source_get_defaults;
|
||||
info.get_name = obs_lua_source_get_name;
|
||||
info.get_defaults2 = obs_lua_source_get_defaults;
|
||||
obs_register_source(&info);
|
||||
|
||||
pthread_mutex_lock(&lua_source_def_mutex);
|
||||
|
|
@ -674,7 +658,8 @@ static int obs_lua_register_source(lua_State *script)
|
|||
|
||||
struct obs_lua_source *next = first_source_def;
|
||||
v->next = next;
|
||||
if (next) next->p_prev_next = &v->next;
|
||||
if (next)
|
||||
next->p_prev_next = &v->next;
|
||||
v->p_prev_next = &first_source_def;
|
||||
first_source_def = v;
|
||||
|
||||
|
|
@ -690,15 +675,15 @@ static int obs_lua_register_source(lua_State *script)
|
|||
|
||||
if (have_func(create)) {
|
||||
obs_source_t *source = ld->source;
|
||||
obs_data_t *settings = obs_source_get_settings(
|
||||
source);
|
||||
obs_data_t *settings =
|
||||
obs_source_get_settings(source);
|
||||
|
||||
ls_push_libobs_obj(obs_data_t, settings, false);
|
||||
ls_push_libobs_obj(obs_source_t, source, false);
|
||||
call_func(create, 2, 1);
|
||||
|
||||
ld->lua_data_ref = luaL_ref(ls->script,
|
||||
LUA_REGISTRYINDEX);
|
||||
ld->lua_data_ref =
|
||||
luaL_ref(ls->script, LUA_REGISTRYINDEX);
|
||||
obs_data_release(settings);
|
||||
}
|
||||
|
||||
|
|
@ -727,7 +712,7 @@ void add_lua_source_functions(lua_State *script)
|
|||
}
|
||||
|
||||
static inline void undef_source_type(struct obs_lua_script *data,
|
||||
struct obs_lua_source *ls)
|
||||
struct obs_lua_source *ls)
|
||||
{
|
||||
pthread_mutex_lock(&ls->definition_mutex);
|
||||
pthread_mutex_lock(&data->mutex);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue