瀏覽代碼

UI: Free virtual cam memory on shutdown

Chip Bradford 3 年之前
父節點
當前提交
590fa1ffe6
共有 4 個文件被更改,包括 27 次插入10 次删除
  1. 2 0
      UI/window-basic-main.cpp
  2. 17 10
      UI/window-basic-vcam-config.cpp
  3. 2 0
      UI/window-basic-vcam-config.hpp
  4. 6 0
      libobs/obs-view.c

+ 2 - 0
UI/window-basic-main.cpp

@@ -2731,6 +2731,8 @@ OBSBasic::~OBSBasic()
 	delete cef;
 	cef = nullptr;
 #endif
+
+	OBSBasicVCamConfig::DestroyView();
 }
 
 void OBSBasic::SaveProjectNow()

+ 17 - 10
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)

+ 2 - 0
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);

+ 6 - 0
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)