1
0
Fork 0
mirror of https://git.jami.net/savoirfairelinux/jami-client-qt.git synced 2025-08-04 23:05:48 +02:00
jami-client-qt/src/libclient/renderer.cpp
Andreas Traczyk 02d25db786 video: shm: replace fixed timer with waiting on producer
Removes the fixed rate QTimer that was used to query shm frames, and waits on the producer in a thread loop.

Also factors FPS value tracking into the Renderer base class.

Gitlab: #938
Change-Id: Icf44c8399d70c4127c512802b6cf6c6dccdccfd6
2023-05-11 11:48:51 -04:00

111 lines
2.5 KiB
C++

/*
* Copyright (C) 2018-2023 Savoir-faire Linux Inc.
* Author: Sébastien Blin <sebastien.blin@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 "renderer.h"
#include <QSize>
#include <QMutex>
// Uncomment following line to output in console the FPS value for the
// current renderer type (DirectRenderer, ShmRenderer, etc.).
// #define DEBUG_FPS
namespace lrc {
namespace video {
using namespace lrc::api::video;
Renderer::Renderer(const QString& id, const QSize& res)
: QObject(nullptr)
, id_(id)
, size_(res)
, fps_(0.0)
, fpsTracker_(new FpsTracker(this))
{
// Subscribe to frame rate updates.
connect(fpsTracker_, &FpsTracker::fpsUpdated, this, [this](double fps) {
setFPS(fps);
#ifdef DEBUG_FPS
qDebug() << this << ": FPS " << fps;
#endif
});
}
Renderer::~Renderer() {}
double
Renderer::fps() const
{
return fps_;
}
QString
Renderer::id() const
{
return id_;
}
QSize
Renderer::size() const
{
return size_;
}
void
Renderer::setFPS(double fps)
{
fps_ = fps;
Q_EMIT fpsChanged();
}
void
Renderer::updateFpsTracker()
{
fpsTracker_->update();
}
MapStringString
Renderer::getInfos() const
{
MapStringString map;
map[RENDERER_ID] = id();
map[FPS] = QString::number(fps());
map[RES] = QString::number(size().width()) + " * " + QString::number(size().height());
return map;
}
FpsTracker::FpsTracker(QObject* parent)
: QObject(parent)
, lastTime_(clock_type::now())
{}
void
FpsTracker::update()
{
frameCount_++;
auto now = clock_type::now();
const std::chrono::duration<double> elapsed = now - lastTime_;
if (elapsed.count() >= checkInterval_) {
double fps = static_cast<double>(frameCount_) / elapsed.count();
Q_EMIT fpsUpdated(fps);
frameCount_ = 0;
lastTime_ = now;
}
}
} // namespace video
} // namespace lrc