/* internal initialization */ bool obs_source_init(struct obs_source *source, const struct obs_source_info *info) { source->refs = 1; source->user_volume = 1.0f; source->present_volume = 0.0f; source->sync_offset = 0; pthread_mutex_init_value(&source->filter_mutex); pthread_mutex_init_value(&source->video_mutex); pthread_mutex_init_value(&source->audio_mutex); memcpy(&source->info, info, sizeof(struct obs_source_info)); if (pthread_mutex_init(&source->filter_mutex, NULL) != 0) return false; if (pthread_mutex_init(&source->audio_mutex, NULL) != 0) return false; if (pthread_mutex_init(&source->video_mutex, NULL) != 0) return false; if (info->output_flags & OBS_SOURCE_AUDIO) { source->audio_line = audio_output_createline(obs->audio.audio, source->context.name); if (!source->audio_line) { blog(LOG_ERROR, "Failed to create audio line for " "source '%s'", source->context.name); return false; } } obs_context_data_insert(&source->context, &obs->data.sources_mutex, &obs->data.first_source); return true; }
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; }
obs_service_t *obs_service_create(const char *id, const char *name, obs_data_t *settings) { const struct obs_service_info *info = find_service(id); struct obs_service *service; if (!info) { blog(LOG_ERROR, "Service '%s' not found", id); return NULL; } service = bzalloc(sizeof(struct obs_service)); if (!obs_context_data_init(&service->context, settings, name)) { bfree(service); return NULL; } service->info = *info; service->context.data = service->info.create(service->context.settings, service); if (!service->context.data) { obs_service_destroy(service); return NULL; } obs_context_data_insert(&service->context, &obs->data.services_mutex, &obs->data.first_service); blog(LOG_INFO, "service '%s' (%s) created", name, id); return service; }
obs_output_t *obs_output_create(const char *id, const char *name, obs_data_t *settings, obs_data_t *hotkey_data) { const struct obs_output_info *info = find_output(id); struct obs_output *output; int ret; output = bzalloc(sizeof(struct obs_output)); pthread_mutex_init_value(&output->interleaved_mutex); pthread_mutex_init_value(&output->delay_mutex); if (pthread_mutex_init(&output->interleaved_mutex, NULL) != 0) goto fail; if (pthread_mutex_init(&output->delay_mutex, NULL) != 0) goto fail; if (!init_output_handlers(output, name, settings, hotkey_data)) goto fail; if (!info) { blog(LOG_ERROR, "Output ID '%s' not found", id); output->info.id = bstrdup(id); output->owns_info_id = true; } else { output->info = *info; } output->video = obs_get_video(); output->audio = obs_get_audio(); if (output->info.get_defaults) output->info.get_defaults(output->context.settings); ret = os_event_init(&output->reconnect_stop_event, OS_EVENT_TYPE_MANUAL); if (ret < 0) goto fail; if (info) output->context.data = info->create(output->context.settings, output); if (!output->context.data) blog(LOG_ERROR, "Failed to create output '%s'!", name); output->reconnect_retry_sec = 2; output->reconnect_retry_max = 20; output->valid = true; output->control = bzalloc(sizeof(obs_weak_output_t)); output->control->output = output; obs_context_data_insert(&output->context, &obs->data.outputs_mutex, &obs->data.first_output); blog(LOG_INFO, "output '%s' (%s) created", name, id); return output; fail: obs_output_destroy(output); return NULL; }
obs_output_t obs_output_create(const char *id, const char *name, obs_data_t settings) { const struct obs_output_info *info = find_output(id); struct obs_output *output; int ret; if (!info) { blog(LOG_ERROR, "Output '%s' not found", id); return NULL; } output = bzalloc(sizeof(struct obs_output)); pthread_mutex_init_value(&output->interleaved_mutex); if (pthread_mutex_init(&output->interleaved_mutex, NULL) != 0) goto fail; if (!init_output_handlers(output, name, settings)) goto fail; output->info = *info; output->video = obs_video(); output->audio = obs_audio(); if (output->info.defaults) output->info.defaults(output->context.settings); ret = os_event_init(&output->reconnect_stop_event, OS_EVENT_TYPE_MANUAL); if (ret < 0) goto fail; output->context.data = info->create(output->context.settings, output); if (!output->context.data) goto fail; output->reconnect_retry_sec = 2; output->reconnect_retry_max = 20; output->valid = true; obs_context_data_insert(&output->context, &obs->data.outputs_mutex, &obs->data.first_output); return output; fail: obs_output_destroy(output); return NULL; }
obs_service_t *obs_service_create(const char *id, const char *name, obs_data_t *settings, obs_data_t *hotkey_data) { const struct obs_service_info *info = find_service(id); struct obs_service *service; if (!info) { blog(LOG_ERROR, "Service '%s' not found", id); return NULL; } service = bzalloc(sizeof(struct obs_service)); if (!obs_context_data_init(&service->context, settings, name, hotkey_data)) { bfree(service); return NULL; } if (!info) { blog(LOG_ERROR, "Service ID '%s' not found", id); service->info.id = bstrdup(id); service->owns_info_id = true; } else { service->info = *info; } if (info) service->context.data = service->info.create( service->context.settings, service); if (!service->context.data) blog(LOG_ERROR, "Failed to create service '%s'!", name); service->control = bzalloc(sizeof(obs_weak_service_t)); service->control->service = service; obs_context_data_insert(&service->context, &obs->data.services_mutex, &obs->data.first_service); blog(LOG_INFO, "service '%s' (%s) created", name, id); return service; }
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; }