From 29828468387c5be8b5d5467d6db085659614aede Mon Sep 17 00:00:00 2001
From: Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>
Date: Fri, 1 May 2015 14:08:10 -0400
Subject: [PATCH] video: Lower the risk of accidental invalid memory access

Refs #70533
---
 src/call.cpp                |  8 ++++----
 src/private/shmrenderer.cpp | 33 +++++++++++++++++++++++++++++++--
 2 files changed, 35 insertions(+), 6 deletions(-)

diff --git a/src/call.cpp b/src/call.cpp
index 633bb8ce..417e3a91 100644
--- a/src/call.cpp
+++ b/src/call.cpp
@@ -867,6 +867,9 @@ void CallPrivate::registerRenderer(Video::Renderer* renderer)
 {
    #ifdef ENABLE_VIDEO
    emit q_ptr->videoStarted(renderer);
+   connect(renderer,&Video::Renderer::stopped,[this,renderer]() {
+      emit q_ptr->videoStopped(renderer);
+   });
    #else
    return;
    #endif
@@ -874,11 +877,8 @@ void CallPrivate::registerRenderer(Video::Renderer* renderer)
 
 void CallPrivate::removeRenderer(Video::Renderer* renderer)
 {
-   #ifdef ENABLE_VIDEO
-   emit q_ptr->videoStopped(renderer);
-   #else
+   //TODO handle removing the renderer during the call
    return;
-   #endif
 }
 
 
diff --git a/src/private/shmrenderer.cpp b/src/private/shmrenderer.cpp
index 7a422ac4..2dd9d3f0 100644
--- a/src/private/shmrenderer.cpp
+++ b/src/private/shmrenderer.cpp
@@ -89,6 +89,7 @@ public:
    int        m_fpsC          ;
    int        m_Fps           ;
    TimePoint  m_lastFrameDebug;
+   QTimer*    m_pTimer        ;
 
    // Constants
    constexpr static const int FPS_RATE_SEC        = 1  ;
@@ -114,6 +115,7 @@ ShmRendererPrivate::ShmRendererPrivate(ShmRenderer* parent)
    , m_pShmArea  ( (SHMHeader*)MAP_FAILED              )
    , m_ShmAreaLen( 0                                   )
    , m_FrameGen  ( 0                                   )
+   , m_pTimer    ( nullptr                             )
 #ifdef DEBUG_FPS
    , m_frameCount( 0                                   )
    , m_lastFrameDebug(std::chrono::system_clock::now() )
@@ -133,6 +135,10 @@ ShmRenderer::ShmRenderer(const QByteArray& id, const QString& shmPath, const QSi
 /// Destructor
 ShmRenderer::~ShmRenderer()
 {
+   if (d_ptr->m_pTimer) {
+      d_ptr->m_pTimer->stop();
+      d_ptr->m_pTimer = nullptr;
+   }
    stopShm();
 }
 
@@ -190,7 +196,6 @@ bool ShmRendererPrivate::getNewFrame(bool wait)
 #endif
    }
 
-   emit q_ptr->frameUpdated();
    return true;
 }
 
@@ -264,6 +269,15 @@ void ShmRenderer::stopShm()
    if (d_ptr->m_fd < 0)
       return;
 
+   if (d_ptr->m_pTimer) {
+      d_ptr->m_pTimer->stop();
+      d_ptr->m_pTimer = nullptr;
+   }
+
+   //Emit the signal before closing the file, this lower the risk of invalid
+   //memory access
+   emit stopped();
+
    ::close(d_ptr->m_fd);
    d_ptr->m_fd = -1;
 
@@ -302,6 +316,17 @@ void ShmRenderer::startRendering()
       return;
 
    Video::Renderer::d_ptr->m_isRendering = true;
+
+   if (!d_ptr->m_pTimer) {
+      d_ptr->m_pTimer = new QTimer(this);
+      d_ptr->m_pTimer->setInterval(33);
+      connect(d_ptr->m_pTimer,&QTimer::timeout,[this]() {
+         emit this->frameUpdated();
+      });
+   }
+   //FIXME This is a temporary hack as frameUpdated() is no longer emitted
+   d_ptr->m_pTimer->start();
+
    emit started();
 }
 
@@ -311,7 +336,11 @@ void ShmRenderer::stopRendering()
    QMutexLocker locker {mutex()};
    Video::Renderer::d_ptr->m_isRendering = false;
 
-   emit stopped();
+   if (d_ptr->m_pTimer) {
+      d_ptr->m_pTimer->stop();
+      d_ptr->m_pTimer = nullptr;
+   }
+
    stopShm();
 }
 
-- 
GitLab