libobs: Add get_defaults2 and get_properties2 for encoders

Adds optional alternate functions to allow passing the encoder type_data
to reduce code duplication.

Closes obsproject/obs-studio#1541
This commit is contained in:
Michael Fabian 'Xaymar' Dirks 2018-11-10 14:07:16 +01:00 committed by jp9000
parent 62935bfef9
commit 93549ea17c
2 changed files with 37 additions and 4 deletions

View File

@ -282,8 +282,11 @@ void obs_encoder_set_name(obs_encoder_t *encoder, const char *name)
static inline obs_data_t *get_defaults(const struct obs_encoder_info *info)
{
obs_data_t *settings = obs_data_create();
if (info->get_defaults)
if (info->get_defaults2) {
info->get_defaults2(settings, info->type_data);
} else if (info->get_defaults) {
info->get_defaults(settings);
}
return settings;
}
@ -304,11 +307,16 @@ obs_data_t *obs_encoder_get_defaults(const obs_encoder_t *encoder)
obs_properties_t *obs_get_encoder_properties(const char *id)
{
const struct obs_encoder_info *ei = find_encoder(id);
if (ei && ei->get_properties) {
if (ei && (ei->get_properties || ei->get_properties2)) {
obs_data_t *defaults = get_defaults(ei);
obs_properties_t *properties;
properties = ei->get_properties(NULL);
if (ei->get_properties2) {
properties = ei->get_properties2(NULL, ei->type_data);
} else if (ei->get_properties) {
properties = ei->get_properties(NULL);
}
obs_properties_apply_settings(properties, defaults);
obs_data_release(defaults);
return properties;
@ -321,12 +329,20 @@ obs_properties_t *obs_encoder_properties(const obs_encoder_t *encoder)
if (!obs_encoder_valid(encoder, "obs_encoder_properties"))
return NULL;
if (encoder->info.get_properties) {
if (encoder->info.get_properties2) {
obs_properties_t *props;
props = encoder->info.get_properties2(encoder->context.data,
encoder->info.type_data);
obs_properties_apply_settings(props, encoder->context.settings);
return props;
} else if (encoder->info.get_properties) {
obs_properties_t *props;
props = encoder->info.get_properties(encoder->context.data);
obs_properties_apply_settings(props, encoder->context.settings);
return props;
}
return NULL;
}

View File

@ -234,6 +234,23 @@ struct obs_encoder_info {
void (*free_type_data)(void *type_data);
uint32_t caps;
/**
* Gets the default settings for this encoder
*
* @param[out] settings Data to assign default settings to
* @param[in] typedata Type Data
*/
void (*get_defaults2)(obs_data_t *settings, void *type_data);
/**
* Gets the property information of this encoder
*
* @param[in] data Pointer from create (or null)
* @param[in] typedata Type Data
* @return The properties data
*/
obs_properties_t *(*get_properties2)(void *data, void *type_data);
};
EXPORT void obs_register_encoder_s(const struct obs_encoder_info *info,