Skip to content
Snippets Groups Projects
Select Git revision
  • 84427f24ec720826ab8cd0c1cd2f1a90cf1336f6
  • master default protected
  • release/202005
  • release/202001
  • release/201912
  • release/201911
  • release/releaseWindowsTestOne
  • release/releaseTest
  • release/releaseWindowsTest
  • release/windowsReleaseTest
  • release/201910
  • release/qt/201910
  • release/windows-test/201910
  • release/201908
  • release/201906
  • release/201905
  • release/201904
  • release/201903
  • release/201902
  • release/201901
  • release/201812
  • 1.0.0
  • 0.3.0
  • 0.2.1
  • 0.2.0
  • 0.1.0
26 results

videomodel.cpp

Blame
  • user avatar
    Emmanuel Lepage Vallee authored
    84427f24
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    videomodel.cpp 4.44 KiB
    /****************************************************************************
     *   Copyright (C) 2012-2013 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 GNU General Public License      *
     *   along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
     ***************************************************************************/
    #include "videomodel.h"
    
    //SFLPhone
    #include "dbus/videomanager.h"
    #include "videodevice.h"
    #include "call.h"
    #include "callmodel.h"
    #include "videorenderer.h"
    
    //Static member
    VideoModel* VideoModel::m_spInstance = nullptr;
    
    ///Constructor
    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())                           );
       connect( &interface , SIGNAL(startedDecoding(QString,QString,int,int)), this, SLOT(startedDecoding(QString,QString,int,int)));
       connect( &interface , SIGNAL(stoppedDecoding(QString,QString))        , this, SLOT(stoppedDecoding(QString,QString))        );
    }
    
    ///Singleton
    VideoModel* VideoModel::instance()
    {
       if (!m_spInstance) {
          m_spInstance = new VideoModel();
       }
       return m_spInstance;
    }
    
    ///Return the call renderer or nullptr
    VideoRenderer* VideoModel::getRenderer(const Call* call) const
    {
       if (!call) return nullptr;
       return m_lRenderers[call->id()];
    }
    
    ///Get the video preview renderer
    VideoRenderer* VideoModel::previewRenderer()
    {
       if (!m_lRenderers["local"]) {
          VideoInterface& interface = DBus::VideoManager::instance();
          m_lRenderers["local"] = new VideoRenderer("local","", Resolution(interface.getActiveDeviceSize()));
       }
       return m_lRenderers["local"];
    }
    
    ///Stop video preview
    void VideoModel::stopPreview()
    {
       VideoInterface& interface = DBus::VideoManager::instance();
       interface.stopPreview();
       m_PreviewState = false;
    }
    
    ///Start video preview
    void VideoModel::startPreview()
    {
       if (m_PreviewState) return;
       VideoInterface& interface = DBus::VideoManager::instance();
       interface.startPreview();
       m_PreviewState = true;
    }
    
    ///Is the video model fetching preview from a camera
    bool VideoModel::isPreviewing()
    {
       return m_PreviewState;
    }
    
    ///@todo Set the video buffer size
    void VideoModel::setBufferSize(uint size)
    {
       m_BufferSize = size;
    }
    
    ///Event callback
    void VideoModel::deviceEvent()
    {
       
    }
    
    ///A video is not being rendered
    void VideoModel::startedDecoding(const QString& id, const QString& shmPath, int width, int height)
    {
       Q_UNUSED(id)
    
       if (m_lRenderers[id] == nullptr ) {
          m_lRenderers[id] = new VideoRenderer(id,shmPath,Resolution(width,height));
          m_lRenderers[id]->moveToThread(this);
          if (!isRunning())
             start();
       }
       else {
          VideoRenderer* renderer = m_lRenderers[id];
          renderer->setShmPath(shmPath);
          renderer->setResolution(QSize(width,height));
       }
    
       m_lRenderers[id]->startRendering();
       if (id != "local") {
          qDebug() << "Starting video for call" << id;
          emit videoCallInitiated(m_lRenderers[id]);
       }
    }
    
    ///A video stopped being rendered
    void VideoModel::stoppedDecoding(const QString& id, const QString& shmPath)
    {
       Q_UNUSED(shmPath)
       VideoRenderer* r = m_lRenderers[id];
       if ( r ) {
          r->stopRendering();
       }
       qDebug() << "Video stopped for call" << id <<  "Renderer found:" << (m_lRenderers[id] != nullptr);
       m_lRenderers[id] = nullptr;
       delete r;
       emit videoStopped();
    }
    
    void VideoModel::run()
    {
       exec();
    }