mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-22 19:08:58 +03:00
Fix required plugin check on gstreamer 1.22
GStreamer 1.22 merged the videoscale plugin into the videoconvertscale plugin. So we should check if the Element is still loadable instead of checking the plugin name. fixes #1352
This commit is contained in:
parent
50f5fc6637
commit
fc7937c73d
3 changed files with 78 additions and 50 deletions
|
@ -193,9 +193,8 @@ CallManager::sendInvite(const QString &roomid, CallType callType, unsigned int w
|
||||||
auto roomInfo = cache::singleRoomInfo(roomid.toStdString());
|
auto roomInfo = cache::singleRoomInfo(roomid.toStdString());
|
||||||
|
|
||||||
std::string errorMessage;
|
std::string errorMessage;
|
||||||
if (!session_.havePlugins(false, &errorMessage) ||
|
if (!session_.havePlugins(
|
||||||
((callType == CallType::VIDEO || callType == CallType::SCREEN) &&
|
callType != CallType::VOICE, callType == CallType::SCREEN, &errorMessage)) {
|
||||||
!session_.havePlugins(true, &errorMessage))) {
|
|
||||||
emit ChatPage::instance()->showNotification(QString::fromStdString(errorMessage));
|
emit ChatPage::instance()->showNotification(QString::fromStdString(errorMessage));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -469,8 +468,8 @@ CallManager::acceptInvite()
|
||||||
|
|
||||||
stopRingtone();
|
stopRingtone();
|
||||||
std::string errorMessage;
|
std::string errorMessage;
|
||||||
if (!session_.havePlugins(false, &errorMessage) ||
|
if (!session_.havePlugins(
|
||||||
(callType_ == CallType::VIDEO && !session_.havePlugins(true, &errorMessage))) {
|
callType_ != CallType::VOICE, callType_ == CallType::SCREEN, &errorMessage)) {
|
||||||
emit ChatPage::instance()->showNotification(QString::fromStdString(errorMessage));
|
emit ChatPage::instance()->showNotification(QString::fromStdString(errorMessage));
|
||||||
hangUp(CallHangUp::Reason::UserMediaFailed);
|
hangUp(CallHangUp::Reason::UserMediaFailed);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -580,53 +580,81 @@ getMediaAttributes(const GstSDPMessage *sdp,
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
WebRTCSession::havePlugins(bool isVideo, std::string *errorMessage)
|
WebRTCSession::havePlugins(bool isVideo, bool isX11Screenshare, std::string *errorMessage)
|
||||||
{
|
{
|
||||||
if (!initialised_ && !init(errorMessage))
|
if (!initialised_ && !init(errorMessage))
|
||||||
return false;
|
return false;
|
||||||
if (!isVideo && haveVoicePlugins_)
|
if (haveVoicePlugins_ && (!isVideo || haveVideoPlugins_) &&
|
||||||
return true;
|
(!isX11Screenshare || haveX11ScreensharePlugins_))
|
||||||
if (isVideo && haveVideoPlugins_)
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
const gchar *voicePlugins[] = {"audioconvert",
|
static constexpr std::initializer_list<const char *> audio_elements = {
|
||||||
|
"audioconvert",
|
||||||
"audioresample",
|
"audioresample",
|
||||||
"autodetect",
|
"autoaudiosink",
|
||||||
"dtls",
|
"capsfilter",
|
||||||
"nice",
|
"decodebin",
|
||||||
"opus",
|
"opusenc",
|
||||||
"playback",
|
"queue",
|
||||||
"rtpmanager",
|
"rtpopuspay",
|
||||||
"srtp",
|
|
||||||
"volume",
|
"volume",
|
||||||
"webrtc",
|
"webrtcbin",
|
||||||
nullptr};
|
};
|
||||||
|
|
||||||
const gchar *videoPlugins[] = {
|
static constexpr std::initializer_list<const char *> video_elements = {
|
||||||
"compositor", "opengl", "qmlgl", "rtp", "videoconvert", "vpx", nullptr};
|
"compositor",
|
||||||
|
"glcolorconvert",
|
||||||
|
"glsinkbin",
|
||||||
|
"glupload",
|
||||||
|
"qmlglsink",
|
||||||
|
"rtpvp8pay",
|
||||||
|
"tee",
|
||||||
|
"videoconvert",
|
||||||
|
"videoscale",
|
||||||
|
"vp8enc",
|
||||||
|
};
|
||||||
|
static constexpr std::initializer_list<const char *> screenshare_elements = {
|
||||||
|
"ximagesink",
|
||||||
|
"ximagesrc",
|
||||||
|
};
|
||||||
|
|
||||||
std::string strError("Missing GStreamer plugins: ");
|
std::string strError("Missing GStreamer elements: ");
|
||||||
const gchar **needed = isVideo ? videoPlugins : voicePlugins;
|
|
||||||
bool &havePlugins = isVideo ? haveVideoPlugins_ : haveVoicePlugins_;
|
|
||||||
havePlugins = true;
|
|
||||||
GstRegistry *registry = gst_registry_get();
|
GstRegistry *registry = gst_registry_get();
|
||||||
for (guint i = 0; i < g_strv_length((gchar **)needed); i++) {
|
|
||||||
GstPlugin *plugin = gst_registry_find_plugin(registry, needed[i]);
|
auto check_plugins = [&strError,
|
||||||
|
registry](const std::initializer_list<const char *> &elements) {
|
||||||
|
bool havePlugins = true;
|
||||||
|
for (const auto &element : elements) {
|
||||||
|
GstPluginFeature *plugin =
|
||||||
|
gst_registry_find_feature(registry, element, GST_TYPE_ELEMENT_FACTORY);
|
||||||
if (!plugin) {
|
if (!plugin) {
|
||||||
havePlugins = false;
|
havePlugins = false;
|
||||||
strError += std::string(needed[i]) + " ";
|
strError += std::string(element) + " ";
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
gst_object_unref(plugin);
|
gst_object_unref(plugin);
|
||||||
}
|
}
|
||||||
if (!havePlugins) {
|
|
||||||
|
return havePlugins;
|
||||||
|
};
|
||||||
|
|
||||||
|
haveVoicePlugins_ = check_plugins(audio_elements);
|
||||||
|
|
||||||
|
// check both elements at once
|
||||||
|
if (isVideo)
|
||||||
|
haveVideoPlugins_ = check_plugins(video_elements);
|
||||||
|
if (isX11Screenshare)
|
||||||
|
haveX11ScreensharePlugins_ = check_plugins(screenshare_elements);
|
||||||
|
|
||||||
|
if (!haveVoicePlugins_ || (isVideo && !haveVideoPlugins_) ||
|
||||||
|
(isX11Screenshare && !haveX11ScreensharePlugins_)) {
|
||||||
nhlog::ui()->error(strError);
|
nhlog::ui()->error(strError);
|
||||||
if (errorMessage)
|
if (errorMessage)
|
||||||
*errorMessage = strError;
|
*errorMessage = strError;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isVideo) {
|
if (isVideo || isX11Screenshare) {
|
||||||
// load qmlglsink to register GStreamer's GstGLVideoItem QML type
|
// load qmlglsink to register GStreamer's GstGLVideoItem QML type
|
||||||
GstElement *qmlglsink = gst_element_factory_make("qmlglsink", nullptr);
|
GstElement *qmlglsink = gst_element_factory_make("qmlglsink", nullptr);
|
||||||
gst_object_unref(qmlglsink);
|
gst_object_unref(qmlglsink);
|
||||||
|
|
|
@ -54,7 +54,7 @@ public:
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool havePlugins(bool isVideo, std::string *errorMessage = nullptr);
|
bool havePlugins(bool isVideo, bool isX11Screenshare, std::string *errorMessage = nullptr);
|
||||||
webrtc::CallType callType() const { return callType_; }
|
webrtc::CallType callType() const { return callType_; }
|
||||||
webrtc::State state() const { return state_; }
|
webrtc::State state() const { return state_; }
|
||||||
bool haveLocalPiP() const;
|
bool haveLocalPiP() const;
|
||||||
|
@ -96,6 +96,7 @@ private:
|
||||||
bool initialised_ = false;
|
bool initialised_ = false;
|
||||||
bool haveVoicePlugins_ = false;
|
bool haveVoicePlugins_ = false;
|
||||||
bool haveVideoPlugins_ = false;
|
bool haveVideoPlugins_ = false;
|
||||||
|
bool haveX11ScreensharePlugins_ = false;
|
||||||
webrtc::CallType callType_ = webrtc::CallType::VOICE;
|
webrtc::CallType callType_ = webrtc::CallType::VOICE;
|
||||||
webrtc::State state_ = webrtc::State::DISCONNECTED;
|
webrtc::State state_ = webrtc::State::DISCONNECTED;
|
||||||
bool isOffering_ = false;
|
bool isOffering_ = false;
|
||||||
|
|
Loading…
Reference in a new issue