Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 36 additions & 24 deletions src/draw.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,10 +80,38 @@ void draw_source_get_defaults(obs_data_t *settings)
obs_data_set_default_bool(settings, "preview_input", false);
}

void switch_source(draw_source_data_t *context, obs_source_t *source)
{
if (context->source) {
obs_source_t *prev_source = obs_weak_source_get_source(context->source);
if (prev_source) {
obs_source_release(prev_source);
}
obs_weak_source_release(context->source);
}
context->source = obs_source_get_weak_source(source);
}
void resolve_source(draw_source_data_t *context)
{
if (!context->source_name || !*context->source_name)
return;
obs_source_t *source = obs_get_source_by_name(context->source_name);
if (source) {
if (!obs_weak_source_references_source(context->source, source)) {
switch_source(context, source);
}
context->source_width = obs_source_get_width(source);
context->source_height = obs_source_get_height(source);
init_shared_memory(context);
obs_source_release(source);
}
}
void draw_source_video_render(void *data, gs_effect_t *effect)
{
UNUSED_PARAMETER(effect);
draw_source_data_t *context = data;
if (!context->source)
resolve_source(context);
if (!context->source)
return;

Expand Down Expand Up @@ -126,6 +154,8 @@ void draw_source_video_render(void *data, gs_effect_t *effect)
gs_texrender_destroy(context->render);
context->render = gs_texrender_create(GS_RGBA, GS_ZS_NONE);
obs_leave_graphics();
context->source_width = width;
context->source_height = height;
}

gs_texrender_reset(context->render);
Expand Down Expand Up @@ -311,17 +341,6 @@ obs_properties_t *draw_source_get_properties(void *data)
return props;
}

void switch_source(draw_source_data_t *context, obs_source_t *source)
{
if (context->source) {
obs_source_t *prev_source = obs_weak_source_get_source(context->source);
if (prev_source) {
obs_source_release(prev_source);
}
obs_weak_source_release(context->source);
}
context->source = obs_source_get_weak_source(source);
}
void draw_source_update(void *data, obs_data_t *settings)
{
draw_source_data_t *context = data;
Expand Down Expand Up @@ -352,24 +371,17 @@ void draw_source_update(void *data, obs_data_t *settings)
}
// To use if preview interfere with detection in the future
// draw_dock_set_preview(context, context->preview_input);
const char *source_name = obs_data_get_string(settings, "input_selection");
obs_source_t *source = obs_get_source_by_name(source_name);
if (source) {
if (!obs_weak_source_references_source(context->source, source)) {
switch_source(context, source);
}
context->source_width = obs_source_get_width(source);
context->source_height = obs_source_get_height(source);
init_shared_memory(context);
obs_source_release(source);
}
bfree(context->source_name);
context->source_name = bstrdup(obs_data_get_string(settings, "input_selection"));
resolve_source(context);

// Debug mode: log the resolved capture config to the OBS log (Help > Log
// Files), so framing/crop issues are easy to spot.
if (draw_feature_enabled(FEATURE_DEBUG)) {
blog(LOG_INFO, "[draw2] debug: input='%s' source=%ux%u crop(l=%u t=%u r=%u b=%u) channel=%d",
source_name ? source_name : "", context->source_width, context->source_height, context->crop_left,
context->crop_top, context->crop_right, context->crop_bottom, context->channel);
context->source_name ? context->source_name : "", context->source_width, context->source_height,
context->crop_left, context->crop_top, context->crop_right, context->crop_bottom,
context->channel);
}
}

Expand Down
1 change: 1 addition & 0 deletions src/draw.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ struct draw_source_data {
bool preview_input;

obs_weak_source_t *source;
char *source_name;

void *region;
void *shared_frame;
Expand Down
Loading