1
0
Fork 0
mirror of https://git.jami.net/savoirfairelinux/jami-client-qt.git synced 2025-08-05 07:15:40 +02:00
jami-client-qt/src/libclient/renderer.h
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

121 lines
2.7 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/>.
*/
#pragma once
#include "api/video.h"
#include "typedefs.h"
#include <QObject>
#include <QSize>
#include <map>
#include <memory>
#include <string>
#include <vector>
namespace lrc {
namespace video {
class FpsTracker;
class Renderer : public QObject
{
Q_OBJECT
public:
constexpr static const char RENDERER_ID[] = "RENDERER_ID";
constexpr static const char FPS[] = "FPS";
constexpr static const char RES[] = "RES";
Renderer(const QString& id, const QSize& res);
virtual ~Renderer();
/**
* @return renderer's fps
*/
double fps() const;
/**
* @return renderer's id
*/
QString id() const;
/**
* @return current renderer dimensions
*/
QSize size() const;
/**
* @return current rendered frame
*/
virtual lrc::api::video::Frame currentFrame() const = 0;
/**
* set fps
*/
void setFPS(double fps);
/**
* Update the FPS tracker.
*/
void updateFpsTracker();
MapStringString getInfos() const;
public Q_SLOTS:
virtual void startRendering() = 0;
virtual void stopRendering() = 0;
Q_SIGNALS:
void frameUpdated();
void stopped();
void started(const QSize& size);
void frameBufferRequested(AVFrame* avFrame);
void fpsChanged();
private:
QString id_;
QSize size_;
double fps_;
FpsTracker* fpsTracker_;
};
// Helper that counts ticks, and notifies of FPS changes.
class FpsTracker : public QObject
{
Q_OBJECT
public:
FpsTracker(QObject* parent = nullptr);
~FpsTracker() = default;
// Call this function every frame.
void update();
// Emitted after every checkInterval_ when update() is called.
Q_SIGNAL void fpsUpdated(double fps);
private:
using clock_type = std::chrono::high_resolution_clock;
const double checkInterval_ {1.0};
unsigned frameCount_ {0};
std::chrono::time_point<clock_type> lastTime_;
};
} // namespace video
} // namespace lrc