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