bool obs_transition_init(obs_source_t *transition) { pthread_mutex_init_value(&transition->transition_mutex); pthread_mutex_init_value(&transition->transition_tex_mutex); if (pthread_mutex_init(&transition->transition_mutex, NULL) != 0) return false; if (pthread_mutex_init(&transition->transition_tex_mutex, NULL) != 0) return false; transition->transition_alignment = OBS_ALIGN_LEFT | OBS_ALIGN_TOP; transition->transition_texrender[0] = gs_texrender_create(GS_RGBA, GS_ZS_NONE); transition->transition_texrender[1] = gs_texrender_create(GS_RGBA, GS_ZS_NONE); transition->transition_source_active[0] = true; return transition->transition_texrender[0] != NULL && transition->transition_texrender[1] != NULL; }
void set_deinterlace_texture_size(obs_source_t *source) { if (source->async_gpu_conversion) { source->async_prev_texrender = gs_texrender_create(GS_BGRX, GS_ZS_NONE); source->async_prev_texture = gs_texture_create( source->async_convert_width, source->async_convert_height, source->async_texture_format, 1, NULL, GS_DYNAMIC); } else { enum gs_color_format format = convert_video_format( source->async_format); source->async_prev_texture = gs_texture_create( source->async_width, source->async_height, format, 1, NULL, GS_DYNAMIC); } }
static void scene_load_item(struct obs_scene *scene, obs_data_t *item_data) { const char *name = obs_data_get_string(item_data, "name"); obs_source_t *source = obs_get_source_by_name(name); const char *scale_filter_str; struct obs_scene_item *item; bool visible; if (!source) { blog(LOG_WARNING, "[scene_load_item] Source %s not found!", name); return; } item = obs_scene_add(scene, source); if (!item) { blog(LOG_WARNING, "[scene_load_item] Could not add source '%s' " "to scene '%s'!", name, obs_source_get_name(scene->source)); obs_source_release(source); return; } obs_data_set_default_int(item_data, "align", OBS_ALIGN_TOP | OBS_ALIGN_LEFT); item->rot = (float)obs_data_get_double(item_data, "rot"); item->align = (uint32_t)obs_data_get_int(item_data, "align"); visible = obs_data_get_bool(item_data, "visible"); obs_data_get_vec2(item_data, "pos", &item->pos); obs_data_get_vec2(item_data, "scale", &item->scale); set_visibility(item, visible); item->bounds_type = (enum obs_bounds_type)obs_data_get_int(item_data, "bounds_type"); item->bounds_align = (uint32_t)obs_data_get_int(item_data, "bounds_align"); obs_data_get_vec2(item_data, "bounds", &item->bounds); item->crop.left = (uint32_t)obs_data_get_int(item_data, "crop_left"); item->crop.top = (uint32_t)obs_data_get_int(item_data, "crop_top"); item->crop.right = (uint32_t)obs_data_get_int(item_data, "crop_right"); item->crop.bottom = (uint32_t)obs_data_get_int(item_data, "crop_bottom"); scale_filter_str = obs_data_get_string(item_data, "scale_filter"); item->scale_filter = OBS_SCALE_DISABLE; if (scale_filter_str) { if (astrcmpi(scale_filter_str, "point") == 0) item->scale_filter = OBS_SCALE_POINT; else if (astrcmpi(scale_filter_str, "bilinear") == 0) item->scale_filter = OBS_SCALE_BILINEAR; else if (astrcmpi(scale_filter_str, "bicubic") == 0) item->scale_filter = OBS_SCALE_BICUBIC; else if (astrcmpi(scale_filter_str, "lanczos") == 0) item->scale_filter = OBS_SCALE_LANCZOS; } if (item->item_render && !item_texture_enabled(item)) { obs_enter_graphics(); gs_texrender_destroy(item->item_render); item->item_render = NULL; obs_leave_graphics(); } else if (!item->item_render && item_texture_enabled(item)) { obs_enter_graphics(); item->item_render = gs_texrender_create(GS_RGBA, GS_ZS_NONE); obs_leave_graphics(); } obs_source_release(source); update_item_transform(item); }