From e84ed0fc80f5d15742ccfedfd98f8b7df04724b3 Mon Sep 17 00:00:00 2001
From: Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>
Date: Fri, 20 Sep 2013 16:58:51 -0400
Subject: [PATCH] [ #30280 ] Drop QImage conversion with pure OpenGL backend,
 move rederer to a QThread

---
 src/phonedirectorymodel.cpp |  6 +++---
 src/videomodel.cpp          | 10 +++++++++-
 src/videomodel.h            | 11 +++++++----
 src/videorenderer.cpp       | 13 +++++++++++--
 src/videorenderer.h         |  7 +++++--
 5 files changed, 35 insertions(+), 12 deletions(-)

diff --git a/src/phonedirectorymodel.cpp b/src/phonedirectorymodel.cpp
index b8d46f97..838b6395 100644
--- a/src/phonedirectorymodel.cpp
+++ b/src/phonedirectorymodel.cpp
@@ -109,9 +109,9 @@ QVariant PhoneDirectoryModel::data(const QModelIndex& index, int role ) const
                break;
             case Qt::ToolTipRole: {
                QString out = "<table>";
-               QHash<QString,int>::iterator i,beg(number->m_hNames.begin()),end(number->m_hNames.end());
-               for (i = beg; i != end; ++i)
-                  out += QString("<tr><td>%1</td><td>%2</td></tr>").arg(i.value()).arg(i.key());
+               QMutableHashIterator<QString, int> iter(const_cast<PhoneNumber*>(number)->m_hNames);
+               while (iter.hasNext())
+                  out += QString("<tr><td>%1</td><td>%2</td></tr>").arg(iter.value()).arg(iter.key());
                out += "</table>";
                return out;
             }
diff --git a/src/videomodel.cpp b/src/videomodel.cpp
index be5f59df..cdc4dd6d 100644
--- a/src/videomodel.cpp
+++ b/src/videomodel.cpp
@@ -28,7 +28,7 @@
 VideoModel* VideoModel::m_spInstance = nullptr;
 
 ///Constructor
-VideoModel::VideoModel():m_BufferSize(0),m_ShmKey(0),m_SemKey(0),m_PreviewState(false)
+VideoModel::VideoModel():QThread(),m_BufferSize(0),m_ShmKey(0),m_SemKey(0),m_PreviewState(false)
 {
    VideoInterface& interface = DBus::VideoManager::instance();
    connect( &interface , SIGNAL(deviceEvent())                           , this, SLOT(deviceEvent())                           );
@@ -104,6 +104,9 @@ void VideoModel::startedDecoding(QString id, QString shmPath, int width, int hei
 
    if (m_lRenderers[id] == nullptr ) {
       m_lRenderers[id] = new VideoRenderer(shmPath,Resolution(width,height));
+      m_lRenderers[id]->moveToThread(this);
+      if (!isRunning())
+         start();
    }
    else {
       VideoRenderer* renderer = m_lRenderers[id];
@@ -127,3 +130,8 @@ void VideoModel::stoppedDecoding(QString id, QString shmPath)
    qDebug() << "Video stopped for call" << id;
    emit videoStopped();
 }
+
+void VideoModel::run()
+{
+   exec();
+}
diff --git a/src/videomodel.h b/src/videomodel.h
index cac4435d..a6103a6a 100644
--- a/src/videomodel.h
+++ b/src/videomodel.h
@@ -19,7 +19,7 @@
 #define VIDEO_MODEL_H
 //Base
 #include "typedefs.h"
-#include <QtCore/QObject>
+#include <QtCore/QThread>
 
 //Qt
 #include <QtCore/QHash>
@@ -31,7 +31,7 @@ class Call;
 struct SHMHeader;
 
 ///VideoModel: Video event dispatcher
-class LIB_EXPORT VideoModel : public QObject {
+class LIB_EXPORT VideoModel : public QThread {
    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant"
    Q_OBJECT
@@ -44,17 +44,20 @@ public:
    bool       isPreviewing       ();
    VideoRenderer* getRenderer(Call* call);
    VideoRenderer* previewRenderer();
-   
+
    //Setters
    void       setBufferSize(uint size);
 
+protected:
+   void run();
+
 private:
    //Constructor
    VideoModel();
 
    //Static attributes
    static VideoModel* m_spInstance;
-   
+
    //Attributes
    bool           m_PreviewState;
    uint           m_BufferSize  ;
diff --git a/src/videorenderer.cpp b/src/videorenderer.cpp
index 539776f1..b553476e 100644
--- a/src/videorenderer.cpp
+++ b/src/videorenderer.cpp
@@ -18,6 +18,7 @@
 #include "videorenderer.h"
 
 #include <QtCore/QDebug>
+#include <QtCore/QMutex>
 
 #include <sys/ipc.h>
 #include <sys/sem.h>
@@ -56,7 +57,7 @@ struct SHMHeader{
 VideoRenderer::VideoRenderer(QString shmPath, Resolution res): QObject(nullptr),
    m_Width(res.width()), m_Height(res.height()), m_ShmPath(shmPath), fd(-1),
    m_pShmArea((SHMHeader*)MAP_FAILED), m_ShmAreaLen(0), m_BufferGen(0),
-   m_isRendering(false),m_pTimer(nullptr),m_Res(res)
+   m_isRendering(false),m_pTimer(nullptr),m_Res(res),m_pMutex(new QMutex())
 {
 }
 
@@ -240,8 +241,9 @@ timespec VideoRenderer::createTimeout()
 void VideoRenderer::timedEvents()
 {
    bool ok = true;
-   QByteArray ba;
+//    m_pMutex->lock();
    renderToBitmap(m_Frame,ok);
+//    m_pMutex->unlock();
    if (ok == true) {
       emit frameUpdated();
    }
@@ -306,6 +308,13 @@ Resolution VideoRenderer::activeResolution()
    return m_Res;
 }
 
+///Get mutex, in case renderer and views are not in the same thread
+QMutex* VideoRenderer::mutex()
+{
+   return m_pMutex;
+}
+
+
 /*****************************************************************************
  *                                                                           *
  *                                 Setters                                   *
diff --git a/src/videorenderer.h b/src/videorenderer.h
index 6a489cee..369e9318 100644
--- a/src/videorenderer.h
+++ b/src/videorenderer.h
@@ -24,6 +24,7 @@
 
 //Qt
 class QTimer;
+class QMutex;
 
 //SFLPhone
 #include "videodevice.h"
@@ -48,10 +49,11 @@ class LIB_EXPORT VideoRenderer : public QObject {
 
       //Getters
       QByteArray  renderToBitmap(QByteArray& data, bool& ok);
-      const char* rawData            ();
-      bool        isRendering        ();
+      const char* rawData         ();
+      bool        isRendering     ();
       QByteArray  currentFrame    ();
       Resolution  activeResolution();
+      QMutex*     mutex           ();
 
       //Setters
       void setResolution(QSize   size);
@@ -70,6 +72,7 @@ class LIB_EXPORT VideoRenderer : public QObject {
       QTimer*    m_pTimer     ;
       QByteArray m_Frame      ;
       Resolution m_Res        ;
+      QMutex*    m_pMutex     ;
 
       //Constants
       static const int TIMEOUT_SEC = 1; // 1 second
-- 
GitLab