提交 8d63845d 编写于 作者: J jp9000

Use macros to improve safety loading callbacks

Just a minor fix mostly because I noticed that I kept accidentally
forgetting to add checks to the code properly.  This is one of those
cases where macros come in useful, as macros can automate the process
and help prevent these mistakes from happening by accident.
上级 ff1afac5
......@@ -32,6 +32,14 @@
#include "obs-service.h"
#include "obs-encoder.h"
#define LOAD_MODULE_SUBFUNC(name, required) \
do { \
info->name = load_module_subfunc(module, module_name, \
id, #name, required); \
if (required && !info->name) \
return false; \
} while (false)
#define NUM_TEXTURES 2
struct obs_display {
......
......@@ -19,33 +19,20 @@
#include "obs-data.h"
bool load_encoder_info(void *module, const char *module_name,
const char *encoder_id, struct encoder_info *info)
const char *id, struct encoder_info *info)
{
info->getname = load_module_subfunc(module, module_name,
encoder_id, "getname", true);
info->create = load_module_subfunc(module, module_name,
encoder_id, "create", true);
info->destroy = load_module_subfunc(module, module_name,
encoder_id, "destroy", true);
info->update = load_module_subfunc(module, module_name,
encoder_id, "update", true);
info->reset = load_module_subfunc(module, module_name,
encoder_id, "reset", true);
info->encode = load_module_subfunc(module, module_name,
encoder_id, "encode", true);
info->getheader = load_module_subfunc(module, module_name,
encoder_id, "getheader", true);
if (!info->getname || !info->create || !info->destroy ||
!info->reset || !info->encode || !info->getheader)
return false;
info->setbitrate = load_module_subfunc(module, module_name,
encoder_id, "setbitrate", false);
info->request_keyframe = load_module_subfunc(module, module_name,
encoder_id, "request_keyframe", false);
info->id = encoder_id;
LOAD_MODULE_SUBFUNC(getname, true);
LOAD_MODULE_SUBFUNC(create, true);
LOAD_MODULE_SUBFUNC(destroy, true);
LOAD_MODULE_SUBFUNC(update, true);
LOAD_MODULE_SUBFUNC(reset, true);
LOAD_MODULE_SUBFUNC(encode, true);
LOAD_MODULE_SUBFUNC(getheader, true);
LOAD_MODULE_SUBFUNC(setbitrate, false);
LOAD_MODULE_SUBFUNC(request_keyframe, false);
info->id = id;
return true;
}
......
......@@ -19,31 +19,19 @@
#include "obs-data.h"
bool load_output_info(void *module, const char *module_name,
const char *output_id, struct output_info *info)
const char *id, struct output_info *info)
{
info->getname = load_module_subfunc(module, module_name,
output_id, "getname", true);
info->create = load_module_subfunc(module, module_name,
output_id, "create", true);
info->destroy = load_module_subfunc(module, module_name,
output_id, "destroy", true);
info->update = load_module_subfunc(module, module_name,
output_id, "update", true);
info->start = load_module_subfunc(module, module_name,
output_id, "start", true);
info->stop = load_module_subfunc(module, module_name,
output_id, "stop", true);
info->active = load_module_subfunc(module, module_name,
output_id, "active", true);
if (!info->getname || !info->create || !info->destroy ||
!info->start || !info->stop || !info->active)
return false;
info->pause = load_module_subfunc(module, module_name,
output_id, "pause", false);
info->id = output_id;
LOAD_MODULE_SUBFUNC(getname, true);
LOAD_MODULE_SUBFUNC(create, true);
LOAD_MODULE_SUBFUNC(destroy, true);
LOAD_MODULE_SUBFUNC(update, true);
LOAD_MODULE_SUBFUNC(start, true);
LOAD_MODULE_SUBFUNC(stop, true);
LOAD_MODULE_SUBFUNC(active, true);
LOAD_MODULE_SUBFUNC(pause, false);
info->id = id;
return true;
}
......
......@@ -27,47 +27,26 @@
static void obs_source_destroy(obs_source_t source);
bool load_source_info(void *module, const char *module_name,
const char *source_id, struct source_info *info)
{
info->getname = load_module_subfunc(module, module_name,
source_id, "getname", true);
info->create = load_module_subfunc(module, module_name,
source_id,"create", true);
info->destroy = load_module_subfunc(module, module_name,
source_id, "destroy", true);
info->get_output_flags = load_module_subfunc(module, module_name,
source_id, "get_output_flags", true);
if (!info->getname || !info->create || !info->destroy ||
!info->get_output_flags)
return false;
info->config = load_module_subfunc(module, module_name,
source_id, "config", false);
info->activate = load_module_subfunc(module, module_name,
source_id, "activate", false);
info->deactivate = load_module_subfunc(module, module_name,
source_id, "deactivate", false);
info->video_tick = load_module_subfunc(module, module_name,
source_id, "video_tick", false);
info->video_render = load_module_subfunc(module, module_name,
source_id, "video_render", false);
info->getwidth = load_module_subfunc(module, module_name,
source_id, "getwidth", false);
info->getheight = load_module_subfunc(module, module_name,
source_id, "getheight", false);
info->getparam = load_module_subfunc(module, module_name,
source_id, "getparam", false);
info->setparam = load_module_subfunc(module, module_name,
source_id, "setparam", false);
info->filter_video = load_module_subfunc(module, module_name,
source_id, "filter_video", false);
info->filter_audio = load_module_subfunc(module, module_name,
source_id, "filter_audio", false);
info->id = source_id;
const char *id, struct source_info *info)
{
LOAD_MODULE_SUBFUNC(getname, true);
LOAD_MODULE_SUBFUNC(create, true);
LOAD_MODULE_SUBFUNC(destroy, true);
LOAD_MODULE_SUBFUNC(get_output_flags, true);
LOAD_MODULE_SUBFUNC(update, false);
LOAD_MODULE_SUBFUNC(activate, false);
LOAD_MODULE_SUBFUNC(deactivate, false);
LOAD_MODULE_SUBFUNC(video_tick, false);
LOAD_MODULE_SUBFUNC(video_render, false);
LOAD_MODULE_SUBFUNC(getwidth, false);
LOAD_MODULE_SUBFUNC(getheight, false);
LOAD_MODULE_SUBFUNC(getparam, false);
LOAD_MODULE_SUBFUNC(setparam, false);
LOAD_MODULE_SUBFUNC(filter_video, false);
LOAD_MODULE_SUBFUNC(filter_audio, false);
info->id = id;
return true;
}
......@@ -292,15 +271,10 @@ uint32_t obs_source_get_output_flags(obs_source_t source)
return source->callbacks.get_output_flags(source->data);
}
bool obs_source_hasconfig(obs_source_t source)
{
return source->callbacks.config != NULL;
}
void obs_source_config(obs_source_t source, void *parent)
void obs_source_update(obs_source_t source, const char *settings)
{
if (source->callbacks.config)
source->callbacks.config(source->data, parent);
if (source->callbacks.update)
source->callbacks.update(source->data, settings);
}
void obs_source_activate(obs_source_t source)
......
......@@ -40,15 +40,20 @@
* + mysource_getname
* + mysource_create
* + mysource_destroy
* + mysource_getflags
* + mysource_get_output_flags
*
* [and optionally]
* + mysource_update
* + mysource_config
* + mysource_activate
* + mysource_deactivate
* + mysource_video_tick
* + mysource_video_render
* + mysource_getwidth
* + mysource_getheight
* + mysource_getparam
* + mysource_setparam
* + mysource_filtervideo
* + mysource_filteraudio
*
* ===========================================
* Primary Exports
......@@ -77,7 +82,7 @@
* Destroys the source.
*
* ---------------------------------------------------------
* uint32_t [name]_getflags(void *data);
* uint32_t [name]_get_output_flags(void *data);
* Returns a combination of one of the following values:
* + SOURCE_VIDEO: source has video
* + SOURCE_AUDIO: source has audio
......@@ -85,23 +90,11 @@
* + SOURCE_DEFAULT_EFFECT: source uses default effect
* + SOURCE_YUV: source is in YUV color space
*
* ---------------------------------------------------------
* uint32_t [name]_getwidth(void *data);
* Returns the width of a source, or -1 for maximum width. If you render
* video, this is required.
*
* ---------------------------------------------------------
* uint32_t [name]_getheight(void *data);
* Returns the height of a source, or -1 for maximum height. If you
* render video, this is required.
*
* ===========================================
* Optional Source Exports
* ===========================================
* void [name]_config(void *data, void *parent);
* Called to configure the source.
*
* parent: Parent window pointer
* void [name]_update(void *data, const char *settings);
* Called to update the settings of the source.
*
* ---------------------------------------------------------
* void [name]_video_activate(void *data);
......@@ -121,6 +114,16 @@
* Called to render the source.
*
* ---------------------------------------------------------
* uint32_t [name]_getwidth(void *data);
* Returns the width of a source, or -1 for maximum width. If you render
* video, this is required.
*
* ---------------------------------------------------------
* uint32_t [name]_getheight(void *data);
* Returns the height of a source, or -1 for maximum height. If you
* render video, this is required.
*
* ---------------------------------------------------------
* void [name]_getparam(void *data, const char *param, void *buf,
* size_t buf_size);
* Gets a source parameter value.
......@@ -171,7 +174,7 @@ struct source_info {
/* ----------------------------------------------------------------- */
/* optional implementations */
bool (*config)(void *data, void *parent);
void (*update)(void *data, const char *settings);
void (*activate)(void *data);
void (*deactivate)(void *data);
......
......@@ -377,8 +377,8 @@ EXPORT uint32_t obs_source_get_output_flags(obs_source_t source);
/** Specifies whether the source can be configured */
EXPORT bool obs_source_hasconfig(obs_source_t source);
/** Opens a configuration panel and attaches it to the parent window */
EXPORT void obs_source_config(obs_source_t source, void *parent);
/** Updates settings for this source */
EXPORT void obs_source_update(obs_source_t source, const char *settings);
/** Renders a video source. */
EXPORT void obs_source_video_render(obs_source_t source);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册