UI: Free virtual cam memory on shutdown

This commit is contained in:
Chip Bradford 2022-08-17 12:02:11 -07:00 committed by Jim
parent 57a24c540f
commit 590fa1ffe6
4 changed files with 27 additions and 10 deletions

View File

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

View File

@ -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)

View File

@ -14,6 +14,8 @@ public:
static video_t *StartVideo();
static void StopVideo();
static void DestroyView();
static void UpdateOutputSource();
explicit OBSBasicVCamConfig(QWidget *parent = 0);

View File

@ -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)