source-mirror: Don't render scene items with 0 size

libOBS will simply forget to unlock a mutex if you set the boundary size to zero, resulting in the filters dialog for that source simply getting stuck. Why video rendering can affect the audio filter dialogs is a question for another time, but it's best to just accept it and move on.
This commit is contained in:
Michael Fabian 'Xaymar' Dirks 2019-04-02 22:10:23 +02:00
parent 5738e51e73
commit 4fc25cfd8d

View file

@ -347,7 +347,7 @@ void source::mirror::mirror_instance::acquire_input(std::string source_name)
} }
// If everything worked fine, we now set everything up. // If everything worked fine, we now set everything up.
this->m_source = std::move(new_source); this->m_source = new_source;
this->m_source->events.rename += std::bind(&source::mirror::mirror_instance::on_source_rename, this, this->m_source->events.rename += std::bind(&source::mirror::mirror_instance::on_source_rename, this,
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
if ((obs_source_get_output_flags(this->m_source->get()) & OBS_SOURCE_AUDIO) != 0) { if ((obs_source_get_output_flags(this->m_source->get()) & OBS_SOURCE_AUDIO) != 0) {
@ -395,25 +395,26 @@ source::mirror::mirror_instance::~mirror_instance()
uint32_t source::mirror::mirror_instance::get_width() uint32_t source::mirror::mirror_instance::get_width()
{ {
if (this->m_rescale_enabled && this->m_rescale_width > 0 && !this->m_rescale_keep_orig_size) { if (m_source) {
return this->m_rescale_width; if (this->m_rescale_enabled && this->m_rescale_width > 0 && !this->m_rescale_keep_orig_size) {
return this->m_rescale_width;
} else {
return m_source->width();
}
} }
obs_source_t* source = obs_sceneitem_get_source(this->m_source_item); return 0;
if (source) {
return obs_source_get_width(source);
}
return 1;
} }
uint32_t source::mirror::mirror_instance::get_height() uint32_t source::mirror::mirror_instance::get_height()
{ {
if (this->m_rescale_enabled && this->m_rescale_height > 0 && !this->m_rescale_keep_orig_size) if (m_source) {
return this->m_rescale_height; if (this->m_rescale_enabled && this->m_rescale_height > 0 && !this->m_rescale_keep_orig_size) {
obs_source_t* source = obs_sceneitem_get_source(this->m_source_item); return this->m_rescale_height;
if (source) { } else {
return obs_source_get_height(source); return m_source->height();
}
} }
return 1; return 0;
} }
void source::mirror::mirror_instance::update(obs_data_t* data) void source::mirror::mirror_instance::update(obs_data_t* data)
@ -471,7 +472,7 @@ void source::mirror::mirror_instance::activate()
this->m_active = true; this->m_active = true;
// No source, delayed acquire. // No source, delayed acquire.
if (!this->m_source_item) { if (!this->m_source_item && this->m_source_name.length() > 0) {
this->acquire_input(this->m_source_name.c_str()); this->acquire_input(this->m_source_name.c_str());
} }
} }
@ -498,33 +499,30 @@ void source::mirror::mirror_instance::video_tick(float time)
this->m_tick -= 0.1f; this->m_tick -= 0.1f;
// No source, delayed acquire. // No source, delayed acquire.
if (!this->m_source_item) { if (!this->m_source_item && this->m_source_name.length() > 0) {
this->acquire_input(this->m_source_name.c_str()); this->acquire_input(this->m_source_name.c_str());
} }
} }
// Update Scene Item Boundaries // Update Scene Item Boundaries
if (this->m_source_item) { if ((this->m_source_item && this->m_source)
&& ((obs_source_get_output_flags(this->m_source->get()) & OBS_SOURCE_VIDEO) != 0)) {
obs_transform_info info; obs_transform_info info;
obs_sceneitem_get_info(this->m_source_item, &info); info.pos.x = 0;
info.pos.y = 0;
info.pos.x = 0; info.rot = 0;
info.pos.y = 0; info.scale.x = 1.f;
info.rot = 0; info.scale.y = 1.f;
info.scale.x = 1.f; info.alignment = 4;
info.scale.y = 1.f; info.bounds.x = this->get_width();
info.bounds.x = float_t(this->m_source->width()); info.bounds.y = this->get_height();
info.bounds.y = float_t(this->m_source->height()); info.bounds_alignment = 4;
info.bounds_type = obs_bounds_type::OBS_BOUNDS_STRETCH; info.bounds_type = obs_bounds_type::OBS_BOUNDS_STRETCH;
if (this->m_rescale_enabled) { if (this->m_rescale_enabled) {
info.bounds.x = float_t(this->m_rescale_width);
info.bounds.y = float_t(this->m_rescale_height);
info.bounds_type = this->m_rescale_bounds; info.bounds_type = this->m_rescale_bounds;
} }
obs_sceneitem_set_info(this->m_source_item, &info); obs_sceneitem_set_info(this->m_source_item, &info);
obs_sceneitem_force_update_transform(this->m_source_item); obs_sceneitem_force_update_transform(this->m_source_item);
obs_sceneitem_set_scale_filter(this->m_source_item, this->m_rescale_enabled ? this->m_rescale_type obs_sceneitem_set_scale_filter(this->m_source_item, this->m_rescale_enabled ? this->m_rescale_type
: obs_scale_type::OBS_SCALE_POINT); : obs_scale_type::OBS_SCALE_POINT);
} }
@ -535,7 +533,7 @@ void source::mirror::mirror_instance::video_tick(float time)
void source::mirror::mirror_instance::video_render(gs_effect_t* effect) void source::mirror::mirror_instance::video_render(gs_effect_t* effect)
{ {
if ((this->m_rescale_width == 0) || (this->m_rescale_height == 0) || !this->m_source_item if ((this->m_rescale_width == 0) || (this->m_rescale_height == 0) || !this->m_source_item
|| !this->m_scene_texture_renderer) { || !this->m_scene_texture_renderer || !this->m_source) {
return; return;
} }
@ -563,15 +561,17 @@ void source::mirror::mirror_instance::video_render(gs_effect_t* effect)
} }
} }
// Use default effect unless we are provided a different effect. if (m_scene_texture) {
if (!effect) { // Use default effect unless we are provided a different effect.
effect = obs_get_base_effect(OBS_EFFECT_DEFAULT); if (!effect) {
} effect = obs_get_base_effect(OBS_EFFECT_DEFAULT);
}
// Render the cached scene texture. // Render the cached scene texture.
gs_effect_set_texture(gs_effect_get_param_by_name(effect, "image"), m_scene_texture->get_object()); gs_effect_set_texture(gs_effect_get_param_by_name(effect, "image"), m_scene_texture->get_object());
while (gs_effect_loop(effect, "Draw")) { while (gs_effect_loop(effect, "Draw")) {
gs_draw_sprite(m_scene_texture->get_object(), 0, this->get_width(), this->get_height()); gs_draw_sprite(m_scene_texture->get_object(), 0, this->get_width(), this->get_height());
}
} }
} }
@ -602,9 +602,10 @@ void source::mirror::mirror_instance::load(obs_data_t* data)
void source::mirror::mirror_instance::save(obs_data_t* data) void source::mirror::mirror_instance::save(obs_data_t* data)
{ {
if (this->m_source_item) { if (!this->m_source_item || !this->m_source) {
obs_data_set_string(data, P_SOURCE, obs_source_get_name(m_source->get())); return;
} }
obs_data_set_string(data, P_SOURCE, obs_source_get_name(m_source->get()));
} }
void source::mirror::mirror_instance::on_source_rename(obs::source* source, std::string, std::string) void source::mirror::mirror_instance::on_source_rename(obs::source* source, std::string, std::string)