static struct obs_encoder *create_encoder(const char *id, enum obs_encoder_type type, const char *name, obs_data_t *settings, size_t mixer_idx, obs_data_t *hotkey_data) { struct obs_encoder *encoder; struct obs_encoder_info *ei = find_encoder(id); bool success; if (!ei || ei->type != type) return NULL; encoder = bzalloc(sizeof(struct obs_encoder)); encoder->info = *ei; encoder->mixer_idx = mixer_idx; success = init_encoder(encoder, name, settings, hotkey_data); if (!success) { obs_encoder_destroy(encoder); encoder = NULL; } encoder->control = bzalloc(sizeof(obs_weak_encoder_t)); encoder->control->encoder = encoder; obs_context_data_insert(&encoder->context, &obs->data.encoders_mutex, &obs->data.first_encoder); blog(LOG_INFO, "encoder '%s' (%s) created", name, id); return encoder; }
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; }
void obs_encoder_release(obs_encoder_t *encoder) { if (!encoder) return; obs_weak_encoder_t *control = encoder->control; if (obs_ref_release(&control->ref)) { // The order of operations is important here since // get_context_by_name in obs.c relies on weak refs // being alive while the context is listed obs_encoder_destroy(encoder); obs_weak_encoder_release(control); } }
static struct obs_encoder *create_encoder(const char *id, enum obs_encoder_type type, const char *name, obs_data_t *settings, size_t mixer_idx, obs_data_t *hotkey_data) { struct obs_encoder *encoder; struct obs_encoder_info *ei = find_encoder(id); bool success; if (ei && ei->type != type) return NULL; encoder = bzalloc(sizeof(struct obs_encoder)); encoder->mixer_idx = mixer_idx; if (!ei) { blog(LOG_ERROR, "Encoder ID '%s' not found", id); encoder->info.id = bstrdup(id); encoder->info.type = type; encoder->owns_info_id = true; } else { encoder->info = *ei; } success = init_encoder(encoder, name, settings, hotkey_data); if (!success) { blog(LOG_ERROR, "creating encoder '%s' (%s) failed", name, id); obs_encoder_destroy(encoder); return NULL; } encoder->control = bzalloc(sizeof(obs_weak_encoder_t)); encoder->control->encoder = encoder; obs_context_data_insert(&encoder->context, &obs->data.encoders_mutex, &obs->data.first_encoder); blog(LOG_INFO, "encoder '%s' (%s) created", name, id); return encoder; }