diff --git a/CMakeLists.txt b/CMakeLists.txt index f7b5121746fd488fa670727861278dab95ccaa70..55b127e984220fbb25acbf2f542277a6f4e0b5eb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -205,7 +205,6 @@ SET( libringclient_LIB_SRCS src/video/sourcesmodel.cpp src/video/channel.cpp src/video/resolution.cpp - src/video/manager.cpp src/audio/alsapluginmodel.cpp src/audio/inputdevicemodel.cpp src/audio/managermodel.cpp @@ -241,6 +240,8 @@ SET( libringclient_LIB_SRCS src/categorizedcompositenode.cpp src/hookmanager.cpp src/vcardutils.cpp + src/private/videorenderermanager.cpp + src/video/previewmanager.cpp #Extension src/extensions/presencecollectionextension.cpp @@ -316,11 +317,11 @@ SET(libringclient_video_LIB_HDRS src/video/device.h src/video/devicemodel.h src/video/sourcesmodel.h - src/video/manager.h src/video/renderer.h src/video/resolution.h src/video/channel.h src/video/rate.h + src/video/previewmanager.h #The renderer implementations are not exported on purpose ) diff --git a/src/call.cpp b/src/call.cpp index cf89a3c289a457c5b2c41a94d4ca8371d8d0f651..9133aa3b416e0a2c8465684b601936499f4e1321 100644 --- a/src/call.cpp +++ b/src/call.cpp @@ -41,7 +41,7 @@ #include "account.h" #include "accountmodel.h" #include "availableaccountmodel.h" -#include "video/manager.h" +#include "private/videorenderermanager.h" #include "historymodel.h" #include "instantmessagingmodel.h" #include "useractionmodel.h" @@ -755,7 +755,7 @@ bool Call::hasRemote() const bool Call::hasVideo() const { #ifdef ENABLE_VIDEO - return Video::Manager::instance()->getRenderer(this) != nullptr; + return VideoRendererManager::instance()->getRenderer(this) != nullptr; #else return false; #endif @@ -810,7 +810,17 @@ bool Call::isSecure() const Video::Renderer* Call::videoRenderer() const { #ifdef ENABLE_VIDEO - return Video::Manager::instance()->getRenderer(this); + return VideoRendererManager::instance()->getRenderer(this); + #else + return nullptr; + #endif +} + + +void CallPrivate::registerRenderer(Video::Renderer* renderer) +{ + #ifdef ENABLE_VIDEO + emit q_ptr->videoStarted(renderer); #else return nullptr; #endif diff --git a/src/call.h b/src/call.h index 0a9cda95821c098491513ef2f8cb90ac0ce31f64..7d17005ff5deb09d65b6084766477b5152bc7c9e 100644 --- a/src/call.h +++ b/src/call.h @@ -42,6 +42,7 @@ class Certificate ; namespace Video { class Manager; class Renderer; + class ManagerPrivate; } class Call; @@ -72,7 +73,8 @@ public: friend class HistoryModel ; friend class CallModelPrivate ; friend class IMConversationManager; - friend class Video::Manager ; + friend class VideoRendererManager; + friend class VideoRendererManagerPrivate; //Enum @@ -329,6 +331,8 @@ Q_SIGNALS: void startTimeStampChanged(time_t newTimeStamp); ///The dial number has changed void dialNumberChanged(const QString& number); + ///Announce a new video renderer + void videoStarted(Video::Renderer* renderer); }; Q_DECLARE_METATYPE(Call*) diff --git a/src/callmodel.cpp b/src/callmodel.cpp index fbee91a2bf8cb7723b93fa09bb913897a4ba1740..6a2a20eb25bc22d280a0d77f87406e5dc8a7b46f 100644 --- a/src/callmodel.cpp +++ b/src/callmodel.cpp @@ -34,6 +34,7 @@ #include "dbus/callmanager.h" #include "dbus/configurationmanager.h" #include "dbus/instancemanager.h" +#include "private/videorenderermanager.h" #include "mime.h" #include "typedefs.h" #include "collectioninterface.h" @@ -42,6 +43,7 @@ #include "delegates/phonenumberselectordelegate.h" #include "personmodel.h" #include "useractionmodel.h" +#include "video/renderer.h" //Other #include <unistd.h> @@ -137,6 +139,9 @@ CallModel::CallModel() : QAbstractItemModel(QCoreApplication::instance()),d_ptr( //Register with the daemon InstanceInterface& instance = DBus::InstanceManager::instance(); setObjectName("CallModel"); + #ifdef ENABLE_VIDEO + VideoRendererManager::instance(); + #endif } //CallModel ///Constructor (there fix an initializationn loop) @@ -411,6 +416,9 @@ Call* CallModelPrivate::addCall2(Call* call, Call* parentCall) emit q_ptr->dataChanged(idx, idx); connect(call,SIGNAL(changed(Call*)),this,SLOT(slotCallChanged(Call*))); connect(call,SIGNAL(dtmfPlayed(QString)),this,SLOT(slotDTMFPlayed(QString))); + connect(call,&Call::videoStarted,[this,call](Video::Renderer* r){ + emit q_ptr->rendererAdded(call, r); + }); emit q_ptr->layoutChanged(); } return call; diff --git a/src/callmodel.h b/src/callmodel.h index 60c7084f5df8b492b528952b740abb689845505c..303a9ba71462d8708e0180fd039338292af1b7c3 100644 --- a/src/callmodel.h +++ b/src/callmodel.h @@ -34,6 +34,11 @@ class ContactMethod; class CallModelPrivate; class CallPrivate; +namespace Video { + class ManagerPrivate; + class Renderer; +} + //Typedef typedef QMap<uint, Call*> CallMap; typedef QList<Call*> CallList; @@ -50,6 +55,8 @@ Q_OBJECT friend class IMConversationManagerPrivate; //Now that the ID is set at a later time, this model need to be notified friend class CallPrivate; + //The renderer use DringId as identifiers and have to be matched to calls + friend class VideoRendererManagerPrivate; public: ///Accepted (mime) payload types @@ -95,6 +102,7 @@ public: bool hasConference () const; bool isConnected () const; UserActionModel* userActionModel () const; + QItemSelectionModel* selectionModel () const; Q_INVOKABLE Call* getCall ( const QModelIndex& idx ) const; @@ -112,7 +120,6 @@ public: virtual bool dropMimeData ( const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent ) override; virtual QHash<int,QByteArray> roleNames() const override; - QItemSelectionModel* selectionModel() const; //Singleton static CallModel* instance(); @@ -144,6 +151,8 @@ Q_SIGNALS: void conferenceRemoved ( Call* conf ); ///Emitted when a call is added void callAdded ( Call* call , Call* parent ); + ///Emitted when a new Video::Renderer is available + void rendererAdded ( Call* call, Video::Renderer* renderer ); }; Q_DECLARE_METATYPE(CallModel*) diff --git a/src/private/call_p.h b/src/private/call_p.h index 096b364a85cf34deeb41e9a3a9f2ea0567bd25d9..17585cadf7ac4814cc98fe91a39bcf032f1e35b2 100644 --- a/src/private/call_p.h +++ b/src/private/call_p.h @@ -219,6 +219,7 @@ public: void changeCurrentState(Call::State newState); void setStartTimeStamp(time_t stamp); void initTimer(); + void registerRenderer(Video::Renderer* renderer); //Static getters static Call::State startStateFromDaemonCallState ( const QString& daemonCallState, const QString& daemonCallType ); diff --git a/src/private/directrenderer.cpp b/src/private/directrenderer.cpp index e5611ccac020a7d0f90ff410122b9221c1793036..fea4ed26d0c3044fb5f8dafe995b99463ec41590 100644 --- a/src/private/directrenderer.cpp +++ b/src/private/directrenderer.cpp @@ -27,7 +27,7 @@ #define CLOCK_REALTIME 0 #endif -#include "video/manager.h" +#include "private/videorenderermanager.h" #include "video/resolution.h" #include "private/videorenderer_p.h" diff --git a/src/private/shmrenderer.cpp b/src/private/shmrenderer.cpp index 44e4ef10696d72fc55eb8183a84341f6a330e4de..9a327dab16fd8cedfd69c62fd3cf3717b4a2e7de 100644 --- a/src/private/shmrenderer.cpp +++ b/src/private/shmrenderer.cpp @@ -37,7 +37,7 @@ #endif #include <QtCore/QTimer> -#include "video/manager.h" +#include "private/videorenderermanager.h" #include "video/resolution.h" #include "private/videorenderer_p.h" @@ -128,7 +128,7 @@ bool Video::ShmRendererPrivate::renderToBitmap() return false; } - if(!Video::Manager::instance()->startStopMutex()->tryLock()) + if(!VideoRendererManager::instance()->startStopMutex()->tryLock()) return false; // wait for a new buffer @@ -160,7 +160,7 @@ bool Video::ShmRendererPrivate::renderToBitmap() // break; // } if ((err < 0) || (!shmLock())) { - Video::Manager::instance()->startStopMutex()->unlock(); + VideoRendererManager::instance()->startStopMutex()->unlock(); return false; } usleep((1/60.0)*100); @@ -168,7 +168,7 @@ bool Video::ShmRendererPrivate::renderToBitmap() if (!q_ptr->resizeShm()) { qDebug() << "Could not resize shared memory"; - Video::Manager::instance()->startStopMutex()->unlock(); + VideoRendererManager::instance()->startStopMutex()->unlock(); return false; } @@ -179,7 +179,7 @@ bool Video::ShmRendererPrivate::renderToBitmap() shmUnlock(); static_cast<Video::Renderer*>(q_ptr)->d_ptr->updateFrameIndex(); - Video::Manager::instance()->startStopMutex()->unlock(); + VideoRendererManager::instance()->startStopMutex()->unlock(); return true; #else return false; @@ -306,7 +306,7 @@ void Video::ShmRendererPrivate::timedEvents() ///Start the rendering loop void Video::ShmRenderer::startRendering() { - Video::Manager::instance()->startStopMutex()->lock(); + VideoRendererManager::instance()->startStopMutex()->lock(); QMutexLocker locker(mutex()); startShm(); if (!d_ptr->m_pTimer) { @@ -325,21 +325,21 @@ void Video::ShmRenderer::startRendering() qDebug() << "Timer already started!"; setRendering(true); - Video::Manager::instance()->startStopMutex()->unlock(); + VideoRendererManager::instance()->startStopMutex()->unlock(); } ///Stop the rendering loop void Video::ShmRenderer::stopRendering() { - Video::Manager::instance()->startStopMutex()->lock(); + VideoRendererManager::instance()->startStopMutex()->lock(); QMutexLocker locker(mutex()); setRendering(false); - qDebug() << "Stopping rendering on" << id(); + qDebug() << "Stopping rendering on" << this; if (d_ptr->m_pTimer) d_ptr->m_pTimer->stop(); emit stopped(); stopShm(); - Video::Manager::instance()->startStopMutex()->unlock(); + VideoRendererManager::instance()->startStopMutex()->unlock(); } diff --git a/src/video/manager.cpp b/src/private/videorenderermanager.cpp similarity index 76% rename from src/video/manager.cpp rename to src/private/videorenderermanager.cpp index 672c625fcf0450bc28f56e8dd0cd576d4e9fb89e..4086b791f3d60c68bbd010fd415330f12aa1d03d 100644 --- a/src/video/manager.cpp +++ b/src/private/videorenderermanager.cpp @@ -16,22 +16,23 @@ * You should have received a copy of the GNU General Public License * * along with this program. If not, see <http://www.gnu.org/licenses/>. * ***************************************************************************/ -#include "manager.h" +#include "videorenderermanager.h" //Qt #include <QtCore/QMutex> //Ring #include "../dbus/videomanager.h" -#include "device.h" +#include "video/device.h" #include <call.h> #include <callmodel.h> -#include "renderer.h" -#include "devicemodel.h" -#include "channel.h" -#include "rate.h" -#include "resolution.h" +#include "video/renderer.h" +#include "video/devicemodel.h" +#include "video/channel.h" +#include "video/rate.h" +#include "video/resolution.h" #include "private/videorate_p.h" +#include "private/call_p.h" #if defined(Q_OS_DARWIN) #include "private/directrenderer.h" #else @@ -40,15 +41,14 @@ //Static member -Video::Manager* Video::Manager::m_spInstance = nullptr; +VideoRendererManager* VideoRendererManager::m_spInstance = nullptr; -namespace Video { -class ManagerPrivate : public QObject +class VideoRendererManagerPrivate : public QObject { Q_OBJECT public: - ManagerPrivate(Video::Manager* parent); + VideoRendererManagerPrivate(VideoRendererManager* parent); //Attributes bool m_PreviewState; @@ -57,7 +57,7 @@ public: QHash<QByteArray,Video::Renderer*> m_lRenderers; private: - Video::Manager* q_ptr; + VideoRendererManager* q_ptr; private Q_SLOTS: void startedDecoding(const QString& id, const QString& shmPath, int width, int height); @@ -65,16 +65,15 @@ private Q_SLOTS: void deviceEvent(); }; -} -Video::ManagerPrivate::ManagerPrivate(Video::Manager* parent) : QObject(parent), q_ptr(parent), +VideoRendererManagerPrivate::VideoRendererManagerPrivate(VideoRendererManager* parent) : QObject(parent), q_ptr(parent), m_BufferSize(0),m_PreviewState(false),m_SSMutex(new QMutex()) { } ///Constructor -Video::Manager::Manager():QThread(), d_ptr(new Video::ManagerPrivate(this)) +VideoRendererManager::VideoRendererManager():QThread(), d_ptr(new VideoRendererManagerPrivate(this)) { VideoManagerInterface& interface = DBus::VideoManager::instance(); connect( &interface , SIGNAL(deviceEvent()) , d_ptr.data(), SLOT(deviceEvent()) ); @@ -83,29 +82,29 @@ Video::Manager::Manager():QThread(), d_ptr(new Video::ManagerPrivate(this)) } -Video::Manager::~Manager() +VideoRendererManager::~VideoRendererManager() { // delete d_ptr; } ///Singleton -Video::Manager* Video::Manager::instance() +VideoRendererManager* VideoRendererManager::instance() { if (!m_spInstance) { - m_spInstance = new Video::Manager(); + m_spInstance = new VideoRendererManager(); } return m_spInstance; } ///Return the call Renderer or nullptr -Video::Renderer* Video::Manager::getRenderer(const Call* call) const +Video::Renderer* VideoRendererManager::getRenderer(const Call* call) const { if (!call) return nullptr; return d_ptr->m_lRenderers[call->dringId().toLatin1()]; } ///Get the video preview Renderer -Video::Renderer* Video::Manager::previewRenderer() +Video::Renderer* VideoRendererManager::previewRenderer() { if (!d_ptr->m_lRenderers["local"]) { Video::Resolution* res = Video::DeviceModel::instance()->activeDevice()->activeChannel()->activeResolution(); @@ -124,7 +123,7 @@ Video::Renderer* Video::Manager::previewRenderer() } ///Stop video preview -void Video::Manager::stopPreview() +void VideoRendererManager::stopPreview() { VideoManagerInterface& interface = DBus::VideoManager::instance(); interface.stopCamera(); @@ -132,7 +131,7 @@ void Video::Manager::stopPreview() } ///Start video preview -void Video::Manager::startPreview() +void VideoRendererManager::startPreview() { if (d_ptr->m_PreviewState) return; VideoManagerInterface& interface = DBus::VideoManager::instance(); @@ -141,28 +140,28 @@ void Video::Manager::startPreview() } ///Is the video model fetching preview from a camera -bool Video::Manager::isPreviewing() +bool VideoRendererManager::isPreviewing() { return d_ptr->m_PreviewState; } ///@todo Set the video buffer size -void Video::Manager::setBufferSize(uint size) +void VideoRendererManager::setBufferSize(uint size) { d_ptr->m_BufferSize = size; } ///Event callback -void Video::ManagerPrivate::deviceEvent() +void VideoRendererManagerPrivate::deviceEvent() { //TODO is there anything useful to do? } ///A video is not being rendered -void Video::ManagerPrivate::startedDecoding(const QString& id, const QString& shmPath, int width, int height) +void VideoRendererManagerPrivate::startedDecoding(const QString& id, const QString& shmPath, int width, int height) { - QSize res = QSize(width,height); + const QSize res = QSize(width,height); if (m_lRenderers[id.toLatin1()] == nullptr ) { #if defined(Q_OS_DARWIN) @@ -179,7 +178,7 @@ void Video::ManagerPrivate::startedDecoding(const QString& id, const QString& sh //TODO: do direct renderer stuff here m_lRenderers[id.toLatin1()]->setSize(res); #if !defined(Q_OS_DARWIN) - static_cast<ShmRenderer*>(m_lRenderers[id.toLatin1()])->setShmPath(shmPath); + static_cast<Video::ShmRenderer*>(m_lRenderers[id.toLatin1()])->setShmPath(shmPath); #endif } @@ -190,7 +189,9 @@ void Video::ManagerPrivate::startedDecoding(const QString& id, const QString& sh } if (id != "local") { qDebug() << "Starting video for call" << id; - emit q_ptr->videoCallInitiated(m_lRenderers[id.toLatin1()]); + Call* c = CallModel::instance()->getCall(id); + if (c) + c->d_ptr->registerRenderer(m_lRenderers[id.toLatin1()]); } else { m_PreviewState = true; @@ -200,7 +201,7 @@ void Video::ManagerPrivate::startedDecoding(const QString& id, const QString& sh } ///A video stopped being rendered -void Video::ManagerPrivate::stoppedDecoding(const QString& id, const QString& shmPath) +void VideoRendererManagerPrivate::stoppedDecoding(const QString& id, const QString& shmPath) { Q_UNUSED(shmPath) Video::Renderer* r = m_lRenderers[id.toLatin1()]; @@ -224,15 +225,15 @@ void Video::ManagerPrivate::stoppedDecoding(const QString& id, const QString& sh delete r; } -void Video::Manager::switchDevice(const Video::Device* device) const +void VideoRendererManager::switchDevice(const Video::Device* device) const { VideoManagerInterface& interface = DBus::VideoManager::instance(); interface.switchInput(device->id()); } -QMutex* Video::Manager::startStopMutex() const +QMutex* VideoRendererManager::startStopMutex() const { return d_ptr->m_SSMutex; } -#include <manager.moc> +#include <videorenderermanager.moc> diff --git a/src/video/manager.h b/src/private/videorenderermanager.h similarity index 77% rename from src/video/manager.h rename to src/private/videorenderermanager.h index 9e127bc3a4c1c70a27e8017cdfe784c5ce75a3b8..1bcf167d116c0b3eb9763c8d0058bb74fba478cc 100644 --- a/src/video/manager.h +++ b/src/private/videorenderermanager.h @@ -15,8 +15,8 @@ * You should have received a copy of the Lesser GNU General Public License * * along with this program. If not, see <http://www.gnu.org/licenses/>. * *****************************************************************************/ -#ifndef MANAGER_H -#define MANAGER_H +#ifndef VIDEORENDERERMANAGER_H +#define VIDEORENDERERMANAGER_H //Base #include <typedefs.h> #include <QtCore/QThread> @@ -25,7 +25,7 @@ #include <QtCore/QHash> //Ring -#include "device.h" +#include "video/device.h" namespace Video { class Renderer; } @@ -33,55 +33,45 @@ class Call; class QMutex; struct SHMHeader; -namespace Video { -class ManagerPrivate; +class VideoRendererManagerPrivate; ///VideoModel: Video event dispatcher -class LIB_EXPORT Manager : public QThread { +class VideoRendererManager : public QThread { #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" Q_OBJECT #pragma GCC diagnostic pop public: //Singleton - static Manager* instance(); + static VideoRendererManager* instance(); //Getters - bool isPreviewing (); - Video::Renderer* getRenderer(const Call* call) const; + bool isPreviewing (); Video::Renderer* previewRenderer(); - QMutex* startStopMutex() const; - //Setters + //Helpers + Video::Renderer* getRenderer(const Call* call) const; + QMutex* startStopMutex() const; void setBufferSize(uint size); void switchDevice(const Video::Device* device) const; -protected: -// void run(); - private: //Constructor - explicit Manager(); - virtual ~Manager(); + explicit VideoRendererManager(); + virtual ~VideoRendererManager(); - QScopedPointer<ManagerPrivate> d_ptr; - Q_DECLARE_PRIVATE(Manager) + QScopedPointer<VideoRendererManagerPrivate> d_ptr; + Q_DECLARE_PRIVATE(VideoRendererManager) //Static attributes - static Manager* m_spInstance; + static VideoRendererManager* m_spInstance; public Q_SLOTS: void stopPreview (); void startPreview(); Q_SIGNALS: - ///Emitted when a new frame is ready -// void frameUpdated(); - ///Emmitted when the video is stopped, before the framebuffer become invalid -// void videoStopped(); - ///Emmitted when a call make video available - void videoCallInitiated(Video::Renderer*); ///The preview started/stopped void previewStateChanged(bool startStop); void previewStarted(Video::Renderer* Renderer); @@ -89,6 +79,5 @@ Q_SIGNALS: }; -} #endif diff --git a/src/video/device.h b/src/video/device.h index 8ebbca85fb7c8b68f69c7bd105ee22fb56bb39a6..123faea9a9c53c00079bf5ea855b4112c9de4dc5 100644 --- a/src/video/device.h +++ b/src/video/device.h @@ -46,8 +46,8 @@ namespace Video { ///Device: V4L devices used to record video for video call class LIB_EXPORT Device : public QAbstractListModel { Q_OBJECT - friend class Video::Manager; - friend class Video::ManagerPrivate; + friend class VideoRendererManager; + friend class VideoRendererManagerPrivate; friend class Video::DeviceModel; friend class VideoDevicePrivate; diff --git a/src/video/previewmanager.cpp b/src/video/previewmanager.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5bf05c7b6d55468f972827637ee5a146a7fc39b3 --- /dev/null +++ b/src/video/previewmanager.cpp @@ -0,0 +1,71 @@ +/****************************************************************************** + * Copyright (C) 2012-2015 by Savoir-Faire Linux * + * Author : Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the Lesser GNU General Public License * + * along with this program. If not, see <http://www.gnu.org/licenses/>. * + *****************************************************************************/ +#include "previewmanager.h" + +#include "private/videorenderermanager.h" +#include "video/renderer.h" + +Video::PreviewManager* Video::PreviewManager::m_spInstance = nullptr; + + +Video::PreviewManager* Video::PreviewManager::instance() +{ + if (!m_spInstance) + m_spInstance = new PreviewManager(); + + return m_spInstance; +} + +//Getters +bool Video::PreviewManager::isPreviewing() +{ + return VideoRendererManager::instance()->isPreviewing(); +} + +Video::Renderer* Video::PreviewManager::previewRenderer() +{ + return VideoRendererManager::instance()->previewRenderer(); +} + +Video::PreviewManager::PreviewManager() : QObject(VideoRendererManager::instance()) +{ + connect(VideoRendererManager::instance(), &VideoRendererManager::previewStateChanged, [this](bool startStop) { + emit previewStateChanged(startStop); + }); + connect(VideoRendererManager::instance(), &VideoRendererManager::previewStarted , [this](Video::Renderer* renderer) { + emit previewStarted(renderer); + }); + connect(VideoRendererManager::instance(), &VideoRendererManager::previewStopped , [this](Video::Renderer* renderer) { + emit previewStopped(renderer); + }); +} + +Video::PreviewManager::~PreviewManager() +{ + +} + +void Video::PreviewManager::stopPreview() +{ + return VideoRendererManager::instance()->stopPreview(); +} + +void Video::PreviewManager::startPreview() +{ + return VideoRendererManager::instance()->startPreview(); +} diff --git a/src/video/previewmanager.h b/src/video/previewmanager.h new file mode 100644 index 0000000000000000000000000000000000000000..c9c198041ee1116f8c4d4eda93dc77984d2f716e --- /dev/null +++ b/src/video/previewmanager.h @@ -0,0 +1,67 @@ +/****************************************************************************** + * Copyright (C) 2012-2015 by Savoir-Faire Linux * + * Author : Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the Lesser GNU General Public License * + * along with this program. If not, see <http://www.gnu.org/licenses/>. * + *****************************************************************************/ +#ifndef PREVIEWMANGER_H +#define PREVIEWMANGER_H + +#include <QtCore/QObject> + +#include <typedefs.h> + +namespace Video { + + class Renderer; + +/** + * This class is used to enable, disable and use the video preview. + * + * The preview can be embedded into video widgets or used for configuration. + */ +class LIB_EXPORT PreviewManager : public QObject +{ + Q_OBJECT + +public: + //Singleton + static PreviewManager* instance(); + + //Getters + bool isPreviewing (); + Video::Renderer* previewRenderer(); + +private: + //Constructor + explicit PreviewManager(); + virtual ~PreviewManager(); + + //Static attributes + static PreviewManager* m_spInstance; + +public Q_SLOTS: + void stopPreview (); + void startPreview(); + +Q_SIGNALS: + ///The preview started/stopped + void previewStateChanged(bool startStop); + void previewStarted(Video::Renderer* renderer); + void previewStopped(Video::Renderer* renderer); +}; + +} + +#endif \ No newline at end of file diff --git a/src/video/renderer.cpp b/src/video/renderer.cpp index c7c640c3516e8f98139a4f62a5aa11d70b98c8c5..4f136e9ccf648aed88e9b9738df89b02e56e9725 100644 --- a/src/video/renderer.cpp +++ b/src/video/renderer.cpp @@ -30,8 +30,9 @@ m_pMutex(new QMutex()), m_FrameIdx(false) Video::Renderer::Renderer(const QByteArray& id, const QSize& res) : d_ptr(new RendererPrivate(this)) { - d_ptr->m_pSize = res; - d_ptr->m_Id = id; + setObjectName("Renderer:"+id); + d_ptr->m_pSize = res; + d_ptr->m_Id = id; } Video::Renderer::~Renderer() @@ -61,12 +62,6 @@ const QByteArray& Video::Renderer::currentFrame() const return isRendering()?d_ptr->m_Frame[d_ptr->m_FrameIdx]:empty; } -///Get id of this renderer -QString Video::Renderer::id() const -{ - return d_ptr->m_Id; -} - ///Get mutex, in case renderer and views are not in the same thread QMutex* Video::Renderer::mutex() const { diff --git a/src/video/renderer.h b/src/video/renderer.h index 9374ca43d45e47649281167cda5e8541f1cda242..6b6e05ec813ba7e1b0a8a29f9d7d6a4a186e30aa 100644 --- a/src/video/renderer.h +++ b/src/video/renderer.h @@ -61,7 +61,6 @@ public: virtual const QByteArray& currentFrame () const; virtual QSize size () const; virtual QMutex* mutex () const; - virtual QString id () const; //Setters void setRendering(bool rendering) const;