void obs_output_destroy(obs_output_t output) { if (output) { obs_context_data_remove(&output->context); if (output->valid && output->active) obs_output_stop(output); if (output->service) output->service->output = NULL; free_packets(output); if (output->context.data) output->info.destroy(output->context.data); if (output->video_encoder) { obs_encoder_remove_output(output->video_encoder, output); } if (output->audio_encoder) { obs_encoder_remove_output(output->audio_encoder, output); } pthread_mutex_destroy(&output->interleaved_mutex); os_event_destroy(output->reconnect_stop_event); obs_context_data_free(&output->context); bfree(output); } }
static void obs_encoder_actually_destroy(obs_encoder_t *encoder) { if (encoder) { pthread_mutex_lock(&encoder->outputs_mutex); for (size_t i = 0; i < encoder->outputs.num; i++) { struct obs_output *output = encoder->outputs.array[i]; obs_output_remove_encoder(output, encoder); } da_free(encoder->outputs); pthread_mutex_unlock(&encoder->outputs_mutex); blog(LOG_INFO, "encoder '%s' destroyed", encoder->context.name); free_audio_buffers(encoder); if (encoder->context.data) encoder->info.destroy(encoder->context.data); da_free(encoder->callbacks); pthread_mutex_destroy(&encoder->init_mutex); pthread_mutex_destroy(&encoder->callbacks_mutex); pthread_mutex_destroy(&encoder->outputs_mutex); obs_context_data_free(&encoder->context); if (encoder->owns_info_id) bfree((void*)encoder->info.id); bfree(encoder); } }
bool obs_context_data_init( struct obs_context_data *context, obs_data_t *settings, const char *name) { if (obs_context_data_init_wrap(context, settings, name)) { return true; } else { obs_context_data_free(context); return false; } }
static void actually_destroy_service(struct obs_service *service) { if (service->context.data) service->info.destroy(service->context.data); if (service->output) service->output->service = NULL; blog(LOG_INFO, "service '%s' destroyed", service->context.name); obs_context_data_free(&service->context); bfree(service); }
void obs_output_destroy(obs_output_t *output) { if (output) { obs_context_data_remove(&output->context); blog(LOG_INFO, "output '%s' destroyed", output->context.name); if (output->valid && active(output)) obs_output_actual_stop(output, true, 0); os_event_wait(output->stopping_event); if (data_capture_ending(output)) pthread_join(output->end_data_capture_thread, NULL); if (output->service) output->service->output = NULL; if (output->context.data) output->info.destroy(output->context.data); free_packets(output); if (output->video_encoder) { obs_encoder_remove_output(output->video_encoder, output); } for (size_t i = 0; i < MAX_AUDIO_MIXES; i++) { if (output->audio_encoders[i]) { obs_encoder_remove_output( output->audio_encoders[i], output); } } os_event_destroy(output->stopping_event); pthread_mutex_destroy(&output->interleaved_mutex); pthread_mutex_destroy(&output->delay_mutex); os_event_destroy(output->reconnect_stop_event); obs_context_data_free(&output->context); circlebuf_free(&output->delay_data); if (output->owns_info_id) bfree((void*)output->info.id); bfree(output); } }
void obs_source_destroy(struct obs_source *source) { size_t i; if (!source) return; obs_context_data_remove(&source->context); obs_source_dosignal(source, "source_destroy", "destroy"); if (source->context.data) source->info.destroy(source->context.data); if (source->filter_parent) obs_source_filter_remove(source->filter_parent, source); for (i = 0; i < source->filters.num; i++) obs_source_release(source->filters.array[i]); for (i = 0; i < source->video_frames.num; i++) source_frame_destroy(source->video_frames.array[i]); gs_entercontext(obs->video.graphics); texrender_destroy(source->async_convert_texrender); texture_destroy(source->async_texture); gs_leavecontext(); for (i = 0; i < MAX_AV_PLANES; i++) bfree(source->audio_data.data[i]); audio_line_destroy(source->audio_line); audio_resampler_destroy(source->resampler); texrender_destroy(source->filter_texrender); da_free(source->video_frames); da_free(source->filters); pthread_mutex_destroy(&source->filter_mutex); pthread_mutex_destroy(&source->audio_mutex); pthread_mutex_destroy(&source->video_mutex); obs_context_data_free(&source->context); bfree(source); }
static void obs_encoder_actually_destroy(obs_encoder_t encoder) { if (encoder) { pthread_mutex_lock(&encoder->outputs_mutex); for (size_t i = 0; i < encoder->outputs.num; i++) { struct obs_output *output = encoder->outputs.array[i]; obs_output_remove_encoder(output, encoder); } da_free(encoder->outputs); pthread_mutex_unlock(&encoder->outputs_mutex); free_audio_buffers(encoder); if (encoder->context.data) encoder->info.destroy(encoder->context.data); da_free(encoder->callbacks); pthread_mutex_destroy(&encoder->callbacks_mutex); pthread_mutex_destroy(&encoder->outputs_mutex); obs_context_data_free(&encoder->context); bfree(encoder); } }
void obs_output_destroy(obs_output_t *output) { if (output) { obs_context_data_remove(&output->context); blog(LOG_INFO, "output '%s' destroyed", output->context.name); if (output->valid && output->active) obs_output_stop(output); if (output->service) output->service->output = NULL; free_packets(output); if (output->context.data) output->info.destroy(output->context.data); if (output->video_encoder) { obs_encoder_remove_output(output->video_encoder, output); } for (size_t i = 0; i < MAX_AUDIO_MIXES; i++) { if (output->audio_encoders[i]) { obs_encoder_remove_output( output->audio_encoders[i], output); } } pthread_mutex_destroy(&output->interleaved_mutex); os_event_destroy(output->reconnect_stop_event); obs_context_data_free(&output->context); bfree(output); } }