Always start calls with camera disabled

Simplifies the code quite a bit
WIP: Renegotiate to enable camera
This commit is contained in:
Tobias Fella
2023-06-13 14:23:18 +02:00
parent 5e533b8e03
commit 481f12337a
4 changed files with 35 additions and 44 deletions

View File

@@ -277,9 +277,7 @@ void CallManager::acceptCall()
updateTurnServers();
// TODO wait until candidates are here
// TODO make video configurable
// change true to false if you don't have a camera
m_session = CallSession::acceptCall(true, m_incomingSdp, m_incomingCandidates, m_cachedTurnUris, m_remoteUser->id(), this);
m_session = CallSession::acceptCall(m_incomingSdp, m_incomingCandidates, m_cachedTurnUris, m_remoteUser->id(), this);
m_participants->clear();
connect(m_session, &CallSession::stateChanged, this, [this] {
Q_EMIT stateChanged();
@@ -350,7 +348,7 @@ void CallManager::ignoreCall()
setRemoteUser(nullptr);
}
void CallManager::startCall(NeoChatRoom *room, bool sendVideo)
void CallManager::startCall(NeoChatRoom *room)
{
if (m_session) {
// Don't start calls if there already is one
@@ -363,7 +361,7 @@ void CallManager::startCall(NeoChatRoom *room, bool sendVideo)
return;
}
auto missingPlugins = m_session->missingPlugins(sendVideo);
auto missingPlugins = m_session->missingPlugins();
if (!missingPlugins.isEmpty()) {
qCCritical(voip) << "Missing GStreamer plugins:" << missingPlugins;
Q_EMIT Controller::instance().errorOccured("Missing GStreamer plugins.");
@@ -377,6 +375,7 @@ void CallManager::startCall(NeoChatRoom *room, bool sendVideo)
updateTurnServers();
setCallId(generateCallId());
setPartyId(generatePartyId());
for (const auto &user : m_room->users()) {
auto participant = new CallParticipant(m_session);
@@ -384,7 +383,7 @@ void CallManager::startCall(NeoChatRoom *room, bool sendVideo)
m_participants->addParticipant(participant);
}
m_session = CallSession::startCall(sendVideo, m_cachedTurnUris, this);
m_session = CallSession::startCall(m_cachedTurnUris, this);
setGlobalState(OUTGOING);
connect(m_session, &CallSession::stateChanged, this, [this] {
Q_EMIT stateChanged();
@@ -393,7 +392,6 @@ void CallManager::startCall(NeoChatRoom *room, bool sendVideo)
}
});
qWarning() << "waiting for createoffer";
connectSingleShot(m_session, &CallSession::offerCreated, this, [this](const QString &_sdp, const QVector<Candidate> &candidates) {
const auto &[uuids, sdp] = mangleSdp(_sdp);
QVector<std::pair<QString, QString>> msidToPurpose;
@@ -415,10 +413,11 @@ void CallManager::startCall(NeoChatRoom *room, bool sendVideo)
msidToPurpose += {uuid, "m.usermedia"}; // TODO
}
QJsonObject json{
{QStringLiteral("lifetime"), 6000},
{QStringLiteral("lifetime"), 60000},
{QStringLiteral("version"), 1},
{QStringLiteral("description"), QJsonObject{{QStringLiteral("type"), QStringLiteral("answer")}, {QStringLiteral("sdp"), _sdp}}},
{QStringLiteral("party_id"), "todopartyid"},
{QStringLiteral("party_id"), m_partyId},
{QStringLiteral("call_id"), m_callId},
};
QJsonObject metadata;
for (const auto &[stream, purpose] : msidToPurpose) {
@@ -608,7 +607,7 @@ QString CallManager::partyId() const
bool CallManager::checkPlugins() const
{
auto missingPlugins = m_session->missingPlugins(true);
auto missingPlugins = m_session->missingPlugins();
if (!missingPlugins.isEmpty()) {
qCCritical(voip) << "Missing GStreamer plugins:" << missingPlugins;
Q_EMIT Controller::instance().errorOccured("Missing GStreamer plugins.");

View File

@@ -74,7 +74,7 @@ public:
void handleCallEvent(NeoChatRoom *room, const RoomEvent *event);
Q_INVOKABLE void startCall(NeoChatRoom *room, bool camera);
Q_INVOKABLE void startCall(NeoChatRoom *room);
Q_INVOKABLE void acceptCall();
Q_INVOKABLE void hangupCall();
Q_INVOKABLE void ignoreCall();

View File

@@ -509,7 +509,7 @@ void CallSession::renegotiateOffer(const QString &_offer, const QString &userId)
g_signal_emit_by_name(webrtcbin, "create-answer", nullptr, promise);
}
void CallSession::acceptOffer(bool sendVideo, const QString &sdp, const QVector<Candidate> remoteCandidates, const QString &userId)
void CallSession::acceptOffer(const QString &sdp, const QVector<Candidate> remoteCandidates, const QString &userId)
{
Q_ASSERT(!sdp.isEmpty());
Q_ASSERT(!remoteCandidates.isEmpty());
@@ -539,7 +539,7 @@ void CallSession::acceptOffer(bool sendVideo, const QString &sdp, const QVector<
gst_webrtc_session_description_free(offer);
return;
}
startPipeline(sendVideo);
startPipeline();
QThread::msleep(1000); // ?
@@ -550,14 +550,14 @@ void CallSession::acceptOffer(bool sendVideo, const QString &sdp, const QVector<
gst_webrtc_session_description_free(offer);
}
void CallSession::createCall(bool sendVideo)
void CallSession::createCall()
{
qCDebug(voip) << "Creating call";
m_isOffering = true;
startPipeline(sendVideo);
startPipeline();
}
void CallSession::startPipeline(bool sendVideo)
void CallSession::startPipeline()
{
qCDebug(voip) << "Starting Pipeline";
if (m_state != CallSession::DISCONNECTED) {
@@ -566,7 +566,7 @@ void CallSession::startPipeline(bool sendVideo)
m_state = CallSession::INITIATING;
Q_EMIT stateChanged();
createPipeline(sendVideo);
createPipeline();
auto webrtcbin = binGetByName(m_pipe, "webrtcbin");
Q_ASSERT(webrtcbin);
@@ -633,7 +633,7 @@ void CallSession::end()
}
}
void CallSession::createPipeline(bool sendVideo)
void CallSession::createPipeline()
{
qCWarning(voip) << "Creating Pipeline";
auto device = AudioSources::instance().currentDevice();
@@ -677,9 +677,9 @@ void CallSession::createPipeline(bool sendVideo)
return;
}
if (sendVideo) {
addVideoPipeline();
}
// if (sendVideo) {
// TODO where? addVideoPipeline();
// }
}
void CallSession::toggleCamera()
@@ -822,7 +822,7 @@ void CallSession::acceptCandidates(const QVector<Candidate> &candidates)
}
}
QStringList CallSession::missingPlugins(bool video) const
QStringList CallSession::missingPlugins() const
{
GstRegistry *registry = gst_registry_get();
static const QVector<QString> videoPlugins = {
@@ -847,7 +847,7 @@ QStringList CallSession::missingPlugins(bool video) const
QStringLiteral("webrtc"),
};
QStringList missingPlugins;
for (const auto &pluginName : video ? videoPlugins + audioPlugins : audioPlugins) {
for (const auto &pluginName : videoPlugins + audioPlugins) {
auto plugin = gst_registry_find_plugin(registry, pluginName.toLatin1().data());
if (!plugin) {
missingPlugins << pluginName;
@@ -883,25 +883,21 @@ bool CallSession::muted() const
return muted;
}
CallSession *CallSession::acceptCall(bool sendVideo,
const QString &sdp,
const QVector<Candidate> &candidates,
const QStringList &turnUris,
const QString &userId,
QObject *parent)
CallSession *
CallSession::acceptCall(const QString &sdp, const QVector<Candidate> &candidates, const QStringList &turnUris, const QString &userId, QObject *parent)
{
auto instance = new CallSession(parent);
instance->setTurnServers(turnUris);
instance->acceptOffer(sendVideo, sdp, candidates, userId);
instance->acceptOffer(sdp, candidates, userId);
return instance;
}
CallSession *CallSession::startCall(bool sendVideo, const QStringList &turnUris, QObject *parent)
CallSession *CallSession::startCall(const QStringList &turnUris, QObject *parent)
{
auto instance = new CallSession(parent);
instance->setTurnServers(turnUris);
instance->createCall(sendVideo);
instance->createCall();
return instance;
}

View File

@@ -53,23 +53,19 @@ public:
Q_PROPERTY(bool muted READ muted WRITE setMuted NOTIFY mutedChanged)
// For outgoing calls
static CallSession *startCall(bool sendVideo, const QStringList &turnUris, QObject *parent = nullptr);
static CallSession *startCall(const QStringList &turnUris, QObject *parent = nullptr);
void acceptAnswer(const QString &sdp, const QVector<Candidate> &candidates, const QString &parent);
// For incoming calls
static CallSession *acceptCall(bool sendVideo,
const QString &sdp,
const QVector<Candidate> &candidates,
const QStringList &turnUris,
const QString &userId,
QObject *parent = nullptr);
static CallSession *
acceptCall(const QString &sdp, const QVector<Candidate> &candidates, const QStringList &turnUris, const QString &userId, QObject *parent = nullptr);
void end();
void renegotiateOffer(const QString &offer, const QString &userId);
void setTurnServers(QStringList servers);
QStringList missingPlugins(bool video) const;
QStringList missingPlugins() const;
CallSession::State state() const;
@@ -93,12 +89,12 @@ Q_SIGNALS:
private:
CallSession(QObject *parent = nullptr);
void acceptOffer(bool sendVideo, const QString &sdp, const QVector<Candidate> remoteCandidates, const QString &userId);
void createCall(bool sendVideo);
void acceptOffer(const QString &sdp, const QVector<Candidate> remoteCandidates, const QString &userId);
void createCall();
void setRemoteDescription(GstWebRTCSessionDescription *remote, const QString &userId, GstPromise *promise = nullptr);
void startPipeline(bool sendVideo);
void createPipeline(bool sendVideo);
void startPipeline();
void createPipeline();
bool addVideoPipeline();
void setState(CallSession::State state);