From 1b2736620a0cf76cf6195cf802f4d9b3ba38919f Mon Sep 17 00:00:00 2001
From: philippegorley <philippe.gorley@savoirfairelinux.com>
Date: Mon, 4 Feb 2019 16:50:52 -0500
Subject: [PATCH] avmodel: don't stop camera if active video calls

If, during a call, the user goes to the media settings and back to the
call, a SIP renegotiation was triggered, stopping the camera. If there
are existing calls (active renderers), don't stop the camera.

Change-Id: If3875157f7f27a55af4bfc3f08e08a78c951bd26
---
 src/avmodel.cpp                      | 11 ++++++++++-
 src/private/videorenderermanager.cpp | 15 +++++++++++----
 2 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/src/avmodel.cpp b/src/avmodel.cpp
index d0ffa4c9..2f0dc34d 100644
--- a/src/avmodel.cpp
+++ b/src/avmodel.cpp
@@ -404,7 +404,16 @@ AVModel::stopPreview()
         qWarning() << "Can't find preview renderer!";
         return;
     }
-    VideoManager::instance().stopCamera();
+    // If an active call does not have video muted, don't stop the camera
+    // stopCamera() calls switchInput(""), which disables the camera
+    bool previewShouldBeStopped = true;
+    for (auto it = pimpl_->renderers_.cbegin(); it != pimpl_->renderers_.cend(); ++it) {
+        if (it->second->getId() != video::PREVIEW_RENDERER_ID)
+            // If rendering, don't stop preview
+            previewShouldBeStopped &= !it->second->isRendering();
+    }
+    if (previewShouldBeStopped)
+        VideoManager::instance().stopCamera();
     pimpl_->renderers_[video::PREVIEW_RENDERER_ID]->stopRendering();
 }
 
diff --git a/src/private/videorenderermanager.cpp b/src/private/videorenderermanager.cpp
index 9859606b..0ea7aeef 100644
--- a/src/private/videorenderermanager.cpp
+++ b/src/private/videorenderermanager.cpp
@@ -95,7 +95,6 @@ VideoRendererManager::deactivate()
     disconnect( &interface , &VideoManagerInterface::stoppedDecoding, d_ptr.data(), &VideoRendererManagerPrivate::stoppedDecoding);
 }
 
-
 VideoRendererManager::~VideoRendererManager()
 {
 //    delete d_ptr;
@@ -170,9 +169,18 @@ Video::Renderer* VideoRendererManager::previewRenderer()
 ///Stop video preview
 void VideoRendererManager::stopPreview()
 {
-   VideoManager::instance().stopCamera();
+    // If an active call does not have video muted, don't stop the camera
+    // stopCamera() calls switchInput(""), which disables the camera
+    bool previewShouldBeStopped = true;
+    for (auto it = d_ptr->m_hRenderers.begin(); it != d_ptr->m_hRenderers.end(); ++it) {
+        if (it.key() != PREVIEW_RENDERER_ID)
+            // If rendering, don't stop preview
+            previewShouldBeStopped &= !it.value()->isRendering();
+    }
+    if (previewShouldBeStopped)
+        VideoManager::instance().stopCamera();
 
-   d_ptr->m_PreviewState = false;
+    d_ptr->m_PreviewState = false;
 }
 
 ///Start video preview
@@ -229,7 +237,6 @@ void VideoRendererManagerPrivate::startedDecoding(const QString& id, const QStri
 
 #endif
 
-
       QThread* t = new QThread(this);
       m_hThreads[r] = t;
 
-- 
GitLab