Support desktop screen sharing on X11
This commit is contained in:
parent
0d971f543b
commit
8df10eeeca
15 changed files with 376 additions and 90 deletions
|
|
@ -2,6 +2,7 @@
|
|||
#include <cctype>
|
||||
#include <chrono>
|
||||
#include <cstdint>
|
||||
#include <cstdlib>
|
||||
|
||||
#include <QMediaPlaylist>
|
||||
#include <QUrl>
|
||||
|
|
@ -24,6 +25,8 @@ Q_DECLARE_METATYPE(mtx::responses::TurnServer)
|
|||
using namespace mtx::events;
|
||||
using namespace mtx::events::msg;
|
||||
|
||||
using webrtc::CallType;
|
||||
|
||||
namespace {
|
||||
std::vector<std::string>
|
||||
getTurnURIs(const mtx::responses::TurnServer &turnServer);
|
||||
|
|
@ -148,10 +151,12 @@ CallManager::CallManager(QObject *parent)
|
|||
}
|
||||
|
||||
void
|
||||
CallManager::sendInvite(const QString &roomid, bool isVideo)
|
||||
CallManager::sendInvite(const QString &roomid, CallType callType)
|
||||
{
|
||||
if (isOnCall())
|
||||
return;
|
||||
if (callType == CallType::SCREEN && !screenShareSupported())
|
||||
return;
|
||||
|
||||
auto roomInfo = cache::singleRoomInfo(roomid.toStdString());
|
||||
if (roomInfo.member_count != 2) {
|
||||
|
|
@ -161,17 +166,20 @@ CallManager::sendInvite(const QString &roomid, bool isVideo)
|
|||
|
||||
std::string errorMessage;
|
||||
if (!session_.havePlugins(false, &errorMessage) ||
|
||||
(isVideo && !session_.havePlugins(true, &errorMessage))) {
|
||||
((callType == CallType::VIDEO || callType == CallType::SCREEN) &&
|
||||
!session_.havePlugins(true, &errorMessage))) {
|
||||
emit ChatPage::instance()->showNotification(QString::fromStdString(errorMessage));
|
||||
return;
|
||||
}
|
||||
|
||||
isVideo_ = isVideo;
|
||||
roomid_ = roomid;
|
||||
callType_ = callType;
|
||||
roomid_ = roomid;
|
||||
session_.setTurnServers(turnURIs_);
|
||||
generateCallID();
|
||||
nhlog::ui()->debug(
|
||||
"WebRTC: call id: {} - creating {} invite", callid_, isVideo ? "video" : "voice");
|
||||
std::string strCallType = callType_ == CallType::VOICE
|
||||
? "voice"
|
||||
: (callType_ == CallType::VIDEO ? "video" : "screen");
|
||||
nhlog::ui()->debug("WebRTC: call id: {} - creating {} invite", callid_, strCallType);
|
||||
std::vector<RoomMember> members(cache::getMembers(roomid.toStdString()));
|
||||
const RoomMember &callee =
|
||||
members.front().user_id == utils::localUser() ? members.back() : members.front();
|
||||
|
|
@ -179,7 +187,7 @@ CallManager::sendInvite(const QString &roomid, bool isVideo)
|
|||
callPartyAvatarUrl_ = QString::fromStdString(roomInfo.avatar_url);
|
||||
emit newInviteState();
|
||||
playRingtone(QUrl("qrc:/media/media/ringback.ogg"), true);
|
||||
if (!session_.createOffer(isVideo)) {
|
||||
if (!session_.createOffer(callType)) {
|
||||
emit ChatPage::instance()->showNotification("Problem setting up call.");
|
||||
endCall();
|
||||
}
|
||||
|
|
@ -280,7 +288,7 @@ CallManager::handleEvent(const RoomEvent<CallInvite> &callInviteEvent)
|
|||
callPartyAvatarUrl_ = QString::fromStdString(roomInfo.avatar_url);
|
||||
|
||||
haveCallInvite_ = true;
|
||||
isVideo_ = isVideo;
|
||||
callType_ = isVideo ? CallType::VIDEO : CallType::VOICE;
|
||||
inviteSDP_ = callInviteEvent.content.sdp;
|
||||
CallDevices::instance().refresh();
|
||||
emit newInviteState();
|
||||
|
|
@ -295,7 +303,7 @@ CallManager::acceptInvite()
|
|||
stopRingtone();
|
||||
std::string errorMessage;
|
||||
if (!session_.havePlugins(false, &errorMessage) ||
|
||||
(isVideo_ && !session_.havePlugins(true, &errorMessage))) {
|
||||
(callType_ == CallType::VIDEO && !session_.havePlugins(true, &errorMessage))) {
|
||||
emit ChatPage::instance()->showNotification(QString::fromStdString(errorMessage));
|
||||
hangUp();
|
||||
return;
|
||||
|
|
@ -383,7 +391,7 @@ CallManager::toggleMicMute()
|
|||
}
|
||||
|
||||
bool
|
||||
CallManager::callsSupported() const
|
||||
CallManager::callsSupported()
|
||||
{
|
||||
#ifdef GSTREAMER_AVAILABLE
|
||||
return true;
|
||||
|
|
@ -392,6 +400,21 @@ CallManager::callsSupported() const
|
|||
#endif
|
||||
}
|
||||
|
||||
bool
|
||||
CallManager::screenShareSupported()
|
||||
{
|
||||
return std::getenv("DISPLAY") != nullptr;
|
||||
}
|
||||
|
||||
bool
|
||||
CallManager::haveVideo() const
|
||||
{
|
||||
return callType() == CallType::VIDEO ||
|
||||
(callType() == CallType::SCREEN &&
|
||||
(ChatPage::instance()->userSettings()->screenShareRemoteVideo() &&
|
||||
!session_.isRemoteVideoRecvOnly()));
|
||||
}
|
||||
|
||||
QStringList
|
||||
CallManager::devices(bool isVideo) const
|
||||
{
|
||||
|
|
@ -424,7 +447,7 @@ CallManager::clear()
|
|||
callParty_.clear();
|
||||
callPartyAvatarUrl_.clear();
|
||||
callid_.clear();
|
||||
isVideo_ = false;
|
||||
callType_ = CallType::VOICE;
|
||||
haveCallInvite_ = false;
|
||||
emit newInviteState();
|
||||
inviteSDP_.clear();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue