From 4d251f072c6f97b4cf4618103e4e857e499c5ed7 Mon Sep 17 00:00:00 2001 From: VaL Doroshchuk Date: Tue, 5 Nov 2019 13:39:55 +0100 Subject: GStreamer: Fix crash when video sink is used when it has been destroyed When custom pipeline is requested, all playbin related elements must be cleared. Also when QMediaPlayer is destroying, it disables showing preroll frames, property of the video sink, which was already destroyed. Destroying of m_videoOutputBin decreases refcounter for m_videoSink, since the video sink is owned by m_videoOutputBin. Fixes: QTBUG-79753 Change-Id: I2fcbd19372caf46adf2ae1ed2e5a7d0ee70040ad Reviewed-by: Timur Pocheptsov --- src/gsttools/qgstreamerplayersession.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/gsttools') diff --git a/src/gsttools/qgstreamerplayersession.cpp b/src/gsttools/qgstreamerplayersession.cpp index c0998d7ae..05e419b10 100644 --- a/src/gsttools/qgstreamerplayersession.cpp +++ b/src/gsttools/qgstreamerplayersession.cpp @@ -252,8 +252,11 @@ void QGstreamerPlayerSession::resetElements() resetGstObject(m_nullVideoSink); resetGstObject(m_videoOutputBin); + m_audioSink = nullptr; m_volumeElement = nullptr; m_videoIdentity = nullptr; + m_pendingVideoSink = nullptr; + m_videoSink = nullptr; } GstElement *QGstreamerPlayerSession::playbin() const -- cgit v1.2.3 From 3d33ebd547d5cdc16e6f8700282035ac3b96e604 Mon Sep 17 00:00:00 2001 From: Rolf Eike Beer Date: Wed, 18 Sep 2019 17:21:16 +0200 Subject: QGstreamerPlayerControl: do not touch m_mediaStatus if it is EndOfMedia It would be reset to this state at the end of updateMediaStatus() anyway, so simply leave it alone. Change-Id: I7fa24773ebb1dd43ecfa8d7eb28d6f8e7862fa75 Reviewed-by: VaL Doroshchuk --- src/gsttools/qgstreamerplayercontrol.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/gsttools') diff --git a/src/gsttools/qgstreamerplayercontrol.cpp b/src/gsttools/qgstreamerplayercontrol.cpp index 7c96b682f..c6fd184ef 100644 --- a/src/gsttools/qgstreamerplayercontrol.cpp +++ b/src/gsttools/qgstreamerplayercontrol.cpp @@ -454,6 +454,10 @@ void QGstreamerPlayerControl::updateSessionState(QMediaPlayer::State state) void QGstreamerPlayerControl::updateMediaStatus() { + //EndOfMedia status should be kept, until reset by pause, play or setMedia + if (m_mediaStatus == QMediaPlayer::EndOfMedia) + return; + pushState(); QMediaPlayer::MediaStatus oldStatus = m_mediaStatus; @@ -481,10 +485,6 @@ void QGstreamerPlayerControl::updateMediaStatus() if (m_currentState == QMediaPlayer::PlayingState && !m_resources->isGranted()) m_mediaStatus = QMediaPlayer::StalledMedia; - //EndOfMedia status should be kept, until reset by pause, play or setMedia - if (oldStatus == QMediaPlayer::EndOfMedia) - m_mediaStatus = QMediaPlayer::EndOfMedia; - popAndNotifyState(); } -- cgit v1.2.3