diff options
author | Lars Knoll <lars.knoll@qt.io> | 2021-04-12 14:41:49 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-04-16 10:50:20 +0000 |
commit | 1306531589d45a96a39db6e37706c30bf38934db (patch) | |
tree | 2d67305dc967c12351efc2146535d8e62830f08e /src | |
parent | 5a15455133dd760146e90125b6ec2d070a1cf846 (diff) |
Better error handling for gstreamer
Handle a couple of error cases without crashing.
Change-Id: Id4e2e1197bc7daa0351130117ed07e7a9c6fb9fa
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Reviewed-by: Doris Verria <doris.verria@qt.io>
Diffstat (limited to 'src')
4 files changed, 9 insertions, 3 deletions
diff --git a/src/multimedia/platform/gstreamer/common/qgst_p.h b/src/multimedia/platform/gstreamer/common/qgst_p.h index 906f0089e..6ee9a5f02 100644 --- a/src/multimedia/platform/gstreamer/common/qgst_p.h +++ b/src/multimedia/platform/gstreamer/common/qgst_p.h @@ -320,7 +320,7 @@ public: void connect(const char *name, GCallback callback, gpointer userData) { g_signal_connect(m_object, name, callback, userData); } GstObject *object() const { return m_object; } - const char *name() const { return GST_OBJECT_NAME(m_object); } + const char *name() const { return m_object ? GST_OBJECT_NAME(m_object) : "(null)"; } }; class QGstElement; diff --git a/src/multimedia/platform/gstreamer/common/qgstreamermediaplayer.cpp b/src/multimedia/platform/gstreamer/common/qgstreamermediaplayer.cpp index 5f5464505..0b914abbf 100644 --- a/src/multimedia/platform/gstreamer/common/qgstreamermediaplayer.cpp +++ b/src/multimedia/platform/gstreamer/common/qgstreamermediaplayer.cpp @@ -663,6 +663,8 @@ static QGstStructure endOfChain(const QGstStructure &s) void QGstreamerMediaPlayer::parseStreamsAndMetadata() { qCDebug(qLcMediaPlayer) << "============== parse topology ============"; + if (topology.isNull()) + return; auto caps = topology["caps"].toCaps(); auto structure = caps.at(0); auto fileFormat = QGstreamerFormatInfo::fileFormatForCaps(structure); @@ -709,7 +711,8 @@ void QGstreamerMediaPlayer::parseStreamsAndMetadata() } QGstPad sinkPad = inputSelector[VideoStream].getObject("active-pad"); - Q_ASSERT(!sinkPad.isNull()); + if (sinkPad.isNull()) + return; bool hasTags = g_object_class_find_property (G_OBJECT_GET_CLASS (sinkPad.object()), "tags") != NULL; GstTagList *tl = nullptr; diff --git a/src/multimedia/platform/gstreamer/common/qgstreamervideooverlay.cpp b/src/multimedia/platform/gstreamer/common/qgstreamervideooverlay.cpp index 7c017a108..e62b3a3da 100644 --- a/src/multimedia/platform/gstreamer/common/qgstreamervideooverlay.cpp +++ b/src/multimedia/platform/gstreamer/common/qgstreamervideooverlay.cpp @@ -277,6 +277,10 @@ static QGstElement findBestVideoSink() } gst_plugin_feature_list_free(list); + if (choice.isNull()) { + qWarning() << "Could not find a valid video sink"; + choice = QGstElement("fakesink", "fakesink"); + } return choice; } diff --git a/src/multimediawidgets/qvideowidget.cpp b/src/multimediawidgets/qvideowidget.cpp index 898226674..4e597a5af 100644 --- a/src/multimediawidgets/qvideowidget.cpp +++ b/src/multimediawidgets/qvideowidget.cpp @@ -108,7 +108,6 @@ QVideoWidget::QVideoWidget(QWidget *parent) { d_ptr->q_ptr = this; d_ptr->videoSink = new QVideoSink(this); - d_ptr->videoSink->setGraphicsType(QVideoSink::NativeWindow); d_ptr->videoSink->setTargetRect(rect()); d_ptr->videoSink->setNativeWindowId(winId()); |