diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index dfcbec959..c985caf37 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -2731,6 +2731,8 @@ OBSBasic::~OBSBasic() delete cef; cef = nullptr; #endif + + OBSBasicVCamConfig::DestroyView(); } void OBSBasic::SaveProjectNow() diff --git a/UI/window-basic-vcam-config.cpp b/UI/window-basic-vcam-config.cpp index 1a55cd8a7..59dc47f35 100644 --- a/UI/window-basic-vcam-config.cpp +++ b/UI/window-basic-vcam-config.cpp @@ -180,12 +180,14 @@ static void EventCallback(enum obs_frontend_event event, void *) OBSBasicVCamConfig::UpdateOutputSource(); } +static auto staticConfig = VCamConfig{}; + void OBSBasicVCamConfig::Init() { if (vCamConfig) return; - vCamConfig = new VCamConfig; + vCamConfig = &staticConfig; obs_frontend_add_save_callback(SaveCallback, nullptr); obs_frontend_add_event_callback(EventCallback, nullptr); @@ -196,25 +198,30 @@ static video_t *video = nullptr; video_t *OBSBasicVCamConfig::StartVideo() { - if (!video) { + if (!view) view = obs_view_create(); - video = obs_view_add(view); - } + UpdateOutputSource(); + + if (!video) + video = obs_view_add(view); return video; } void OBSBasicVCamConfig::StopVideo() { - if (view) { - obs_view_remove(view); - obs_view_set_source(view, 0, nullptr); - obs_view_destroy(view); - view = nullptr; - } + obs_view_remove(view); + obs_view_set_source(view, 0, nullptr); video = nullptr; } +void OBSBasicVCamConfig::DestroyView() +{ + StopVideo(); + obs_view_destroy(view); + view = nullptr; +} + void OBSBasicVCamConfig::UpdateOutputSource() { if (!view) diff --git a/UI/window-basic-vcam-config.hpp b/UI/window-basic-vcam-config.hpp index 7426d2e03..bc3639976 100644 --- a/UI/window-basic-vcam-config.hpp +++ b/UI/window-basic-vcam-config.hpp @@ -14,6 +14,8 @@ public: static video_t *StartVideo(); static void StopVideo(); + static void DestroyView(); + static void UpdateOutputSource(); explicit OBSBasicVCamConfig(QWidget *parent = 0); diff --git a/libobs/obs-view.c b/libobs/obs-view.c index 9fd29d4bd..591b944bf 100644 --- a/libobs/obs-view.c +++ b/libobs/obs-view.c @@ -162,6 +162,9 @@ static inline void set_main_mix() video_t *obs_view_add(obs_view_t *view) { + if (!view) + return NULL; + struct obs_core_video_mix *mix = obs_create_video_mix(&obs->video.ovi); if (!mix) { return NULL; @@ -178,6 +181,9 @@ video_t *obs_view_add(obs_view_t *view) void obs_view_remove(obs_view_t *view) { + if (!view) + return; + pthread_mutex_lock(&obs->video.mixes_mutex); size_t idx = find_mix_for_view(view); if (idx != DARRAY_INVALID)