diff options
author | Tim Blechmann <tim@klingt.org> | 2024-04-25 13:37:50 +0800 |
---|---|---|
committer | Tim Blechmann <tim@klingt.org> | 2024-04-25 15:58:24 +0800 |
commit | b3d89c64f7c77a1871e6381caae84ecfcae85565 (patch) | |
tree | 22831ff85ec87683d6b7b816af8ce78355a5c4fc | |
parent | 5aa9f991c22f580d3d937b77cded6f6b2f3ffd08 (diff) |
GStreamer: QGstVideoRenderer - stop on EOS
This causes the widget to be cleared instead of remaining on the final
frame. This brings the behavior in line with the ffmpeg/darwin
backends.
Pick-to: 6.5 6.7
Change-Id: Ieee834fadf831695891c13d4fc393bf626d19c04
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
-rw-r--r-- | src/plugins/multimedia/gstreamer/common/qgstvideorenderersink.cpp | 39 | ||||
-rw-r--r-- | src/plugins/multimedia/gstreamer/common/qgstvideorenderersink_p.h | 3 |
2 files changed, 36 insertions, 6 deletions
diff --git a/src/plugins/multimedia/gstreamer/common/qgstvideorenderersink.cpp b/src/plugins/multimedia/gstreamer/common/qgstvideorenderersink.cpp index 0a2de1228..ec4cbb468 100644 --- a/src/plugins/multimedia/gstreamer/common/qgstvideorenderersink.cpp +++ b/src/plugins/multimedia/gstreamer/common/qgstvideorenderersink.cpp @@ -224,9 +224,22 @@ bool QGstVideoRenderer::query(GstQuery *query) void QGstVideoRenderer::gstEvent(GstEvent *event) { - if (GST_EVENT_TYPE(event) != GST_EVENT_TAG) + switch (GST_EVENT_TYPE(event)) { + case GST_EVENT_TAG: + qCDebug(qLcGstVideoRenderer) << "QGstVideoRenderer::gstEvent: Tag"; + return gstEventHandleTag(event); + case GST_EVENT_EOS: + qCDebug(qLcGstVideoRenderer) << "QGstVideoRenderer::gstEvent: EOS"; + return gstEventHandleEOS(event); + + default: + qCDebug(qLcGstVideoRenderer) << "QGstVideoRenderer::gstEvent: unhandled event - " << event; return; + } +} +void QGstVideoRenderer::gstEventHandleTag(GstEvent *event) +{ GstTagList *taglist = nullptr; gst_event_parse_tag(event, &taglist); if (!taglist) @@ -256,14 +269,28 @@ void QGstVideoRenderer::gstEvent(GstEvent *event) QMutexLocker locker(&m_mutex); m_frameMirrored = mirrored; switch (rotationAngle) { - case 0: m_frameRotationAngle = QtVideo::Rotation::None; break; - case 90: m_frameRotationAngle = QtVideo::Rotation::Clockwise90; break; - case 180: m_frameRotationAngle = QtVideo::Rotation::Clockwise180; break; - case 270: m_frameRotationAngle = QtVideo::Rotation::Clockwise270; break; - default: m_frameRotationAngle = QtVideo::Rotation::None; + case 0: + m_frameRotationAngle = QtVideo::Rotation::None; + break; + case 90: + m_frameRotationAngle = QtVideo::Rotation::Clockwise90; + break; + case 180: + m_frameRotationAngle = QtVideo::Rotation::Clockwise180; + break; + case 270: + m_frameRotationAngle = QtVideo::Rotation::Clockwise270; + break; + default: + m_frameRotationAngle = QtVideo::Rotation::None; } } +void QGstVideoRenderer::gstEventHandleEOS(GstEvent *) +{ + stop(); +} + bool QGstVideoRenderer::event(QEvent *event) { if (event->type() == QEvent::UpdateRequest) { diff --git a/src/plugins/multimedia/gstreamer/common/qgstvideorenderersink_p.h b/src/plugins/multimedia/gstreamer/common/qgstvideorenderersink_p.h index 6a923ed32..e381e48e1 100644 --- a/src/plugins/multimedia/gstreamer/common/qgstvideorenderersink_p.h +++ b/src/plugins/multimedia/gstreamer/common/qgstvideorenderersink_p.h @@ -61,6 +61,9 @@ private: bool waitForAsyncEvent(QMutexLocker<QMutex> *locker, QWaitCondition *condition, unsigned long time); static QGstCaps createSurfaceCaps(QGstreamerVideoSink *); + void gstEventHandleTag(GstEvent *); + void gstEventHandleEOS(GstEvent *); + QPointer<QGstreamerVideoSink> m_sink; QMutex m_mutex; |