static struct obs_encoder *create_encoder(const char *id, enum obs_encoder_type type, const char *name, obs_data_t settings) { struct obs_encoder *encoder; struct obs_encoder_info *ei = get_encoder_info(id); bool success; if (!ei || ei->type != type) return NULL; encoder = bzalloc(sizeof(struct obs_encoder)); encoder->info = *ei; success = init_encoder(encoder, name, settings); if (!success) { obs_encoder_destroy(encoder); encoder = NULL; } obs_context_data_insert(&encoder->context, &obs->data.encoders_mutex, &obs->data.first_encoder); return encoder; }
obs_encoder_t obs_encoder_create(const char *id, const char *name, obs_data_t settings) { struct obs_encoder *encoder; struct obs_encoder_info *ei = get_encoder_info(id); if (!ei) return NULL; encoder = bzalloc(sizeof(struct obs_encoder)); encoder->info = *ei; if (pthread_mutex_init(&encoder->data_callbacks_mutex, NULL) != 0) { bfree(encoder); return NULL; } encoder->settings = obs_data_newref(settings); encoder->data = ei->create(encoder->settings, encoder); if (!encoder->data) { pthread_mutex_destroy(&encoder->data_callbacks_mutex); obs_data_release(encoder->settings); bfree(encoder); return NULL; } pthread_mutex_lock(&obs->data.encoders_mutex); da_push_back(obs->data.encoders, &encoder); pthread_mutex_unlock(&obs->data.encoders_mutex); encoder->name = bstrdup(name); return encoder; }
obs_properties_t obs_encoder_properties(const char *id, const char *locale) { const struct obs_encoder_info *ei = get_encoder_info(id); if (ei && ei->properties) return ei->properties(locale); return NULL; }
const char *obs_encoder_getdisplayname(const char *id, const char *locale) { struct obs_encoder_info *ei = get_encoder_info(id); if (!ei) return NULL; return ei->getname(locale); }
obs_data_t obs_encoder_defaults(const char *id) { const struct obs_encoder_info *info = get_encoder_info(id); if (info) { obs_data_t settings = obs_data_create(); if (info->defaults) info->defaults(settings); return settings; } return NULL; }
obs_properties_t obs_get_encoder_properties(const char *id, const char *locale) { const struct obs_encoder_info *ei = get_encoder_info(id); if (ei && ei->properties) { obs_data_t defaults = get_defaults(ei); obs_properties_t properties; properties = ei->properties(locale); obs_properties_apply_settings(properties, defaults); obs_data_release(defaults); return properties; } return NULL; }
obs_data_t obs_encoder_defaults(const char *id) { const struct obs_encoder_info *info = get_encoder_info(id); return (info) ? get_defaults(info) : NULL; }
const char *obs_encoder_getdisplayname(const char *id) { struct obs_encoder_info *ei = get_encoder_info(id); return ei ? ei->getname() : NULL; }