1
0
Fork 0
mirror of https://git.jami.net/savoirfairelinux/jami-client-qt.git synced 2025-08-26 17:53:57 +02:00
jami-client-qt/src/libclient/directrenderer.cpp
Amin Bandali e0b3b4adec misc: vendor libjamiclient into 'src/libclient/'
This is libjamiclient from the jami-libclient.git repository as of
767c45b8b09806ac05cbada720864df93588c047, with the following changes:

* src/libclient/newaccountmodel.cpp:
(NewAccountModelPimpl::removeFromAccounts): The lock wait inside
'#ifdef CHK_FREEABLE_BEFORE_ERASE_ACCOUNT' was not updated when the
type of 'accounts' was changed over the years from this:
std::map<std::string, account::Info>
to this:
std::map<QString, std::pair<account::Info, std::shared_ptr<Database>>>
Basically we need to get the 'first' of the pair for 'account::Info'.
So we now do that.

* src/libclient/avmodel.cpp:
* src/libclient/callbackshandler.cpp:
* src/libclient/contactmodel.cpp:
* src/libclient/conversationmodel.cpp:
* src/libclient/database.cpp:
* src/libclient/namedirectory.cpp:
* src/libclient/newaccountmodel.cpp:
* src/libclient/newcallmodel.cpp:
* src/libclient/newdevicemodel.cpp:
* src/libclient/peerdiscoverymodel.cpp:
* src/libclient/pluginmodel.cpp:
* src/libclient/smartinfohub.cpp:
* src/libclient/vcard.h:
* src/libclient/authority/storagehelper.cpp:  Replace Qt's 'foreach'
with 'Q_FOREACH' and its 'emit' with 'Q_EMIT' because in the client-qt
code base we have '-DQT_NO_KEYWORDS' to avoid conflicts with other
libraries we use.

* cmake/FindLibJami.cmake: Import cmake/FindRing.cmake from the
jami-libclient.git repository.  Then, rename RING_BUILD_DIR to
LIBJAMI_BUILD_DIR (though the old name is still supported for now).
Also update other references of Ring to Jami.  Further, add additional
calls to 'find_library' to make sure specified local paths for libjami
are checked before system-wide ones (in case of older/obsolete libjami
being available system-wide, which might happen on GNU/Linux systems).

* translations/lrc_*.ts: Import translation files from the libclient
repository.  The message location paths were corrected by running
"sed -i 's|../src|&/libclient|g' lrc_*.ts" in 'translations/'.

.tx/config: Add section for the newly-imported libclient translations.

* CMakeLists.txt: Reformat, plus various fixes and cleanups, such as
changing indentation to 2 spaces and wrapping lines at 70 characters,
renaming the parent directory of translations from 'ring' to 'jami',
and using all lowercase function calls.  Also add copyright headers.

* src/app/appsettingsmanager.cpp:
(AppSettingsManager::loadTranslations):
* src/app/utilsadapter.cpp (UtilsAdapter::supportedLang): Update to
adapt to the renaming of the parent directory of translations from
'ring' to 'jami'.

GitLab: #748
Change-Id: I86e3b0fb30e554755023e7b858b6a0d132cd59ab
2022-06-08 16:28:57 -04:00

135 lines
3.3 KiB
C++

/*
* Copyright (C) 2012-2022 Savoir-faire Linux Inc.
* Author: Alexandre Lision <alexandre.lision@savoirfairelinux.com>
* Author: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com>
* Author: Andreas Traczyk <andreas.traczyk@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 "directrenderer.h"
#include "dbus/videomanager.h"
#include "videomanager_interface.h"
#include <QMutex>
namespace lrc {
namespace video {
using namespace lrc::api::video;
struct DirectRenderer::Impl : public QObject
{
Q_OBJECT
public:
Impl(DirectRenderer* parent)
: QObject(nullptr)
, parent_(parent)
{
configureTarget();
VideoManager::instance().registerSinkTarget(parent_->id(), target);
};
~Impl()
{
parent_->stopRendering();
VideoManager::instance().registerSinkTarget(parent_->id(), {});
}
// sink target callbacks
void configureTarget()
{
using namespace std::placeholders;
target.pull = std::bind(&Impl::pullCallback, this);
target.push = std::bind(&Impl::pushCallback, this, _1);
};
DRing::FrameBuffer pullCallback()
{
QMutexLocker lk(&mutex);
if (!frameBufferPtr) {
frameBufferPtr.reset(av_frame_alloc());
}
// A response to this signal should be used to provide client
// allocated buffer specs via the AVFrame structure.
// Important: Subscription to this signal MUST be synchronous(Qt::DirectConnection).
Q_EMIT parent_->frameBufferRequested(frameBufferPtr.get());
if (frameBufferPtr->data[0] == nullptr) {
return nullptr;
}
return std::move(frameBufferPtr);
};
void pushCallback(DRing::FrameBuffer buf)
{
{
QMutexLocker lk(&mutex);
frameBufferPtr = std::move(buf);
}
Q_EMIT parent_->frameUpdated();
};
private:
DirectRenderer* parent_;
public:
DRing::SinkTarget target;
QMutex mutex;
DRing::FrameBuffer frameBufferPtr;
};
DirectRenderer::DirectRenderer(const QString& id, const QSize& res)
: Renderer(id, res)
, pimpl_(std::make_unique<DirectRenderer::Impl>(this))
{}
DirectRenderer::~DirectRenderer() {}
void
DirectRenderer::startRendering()
{
Q_EMIT started();
}
void
DirectRenderer::stopRendering()
{
Q_EMIT stopped();
}
void
DirectRenderer::update(const QSize& res, const QString&)
{
stopRendering();
Renderer::update(res);
VideoManager::instance().registerSinkTarget(id(), pimpl_->target);
startRendering();
}
Frame
DirectRenderer::currentFrame() const
{
return {};
}
} // namespace video
} // namespace lrc
#include "moc_directrenderer.cpp"
#include "directrenderer.moc"