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