summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorTim Blechmann <tim@klingt.org>2024-04-25 13:37:50 +0800
committerTim Blechmann <tim@klingt.org>2024-04-25 15:58:24 +0800
commitb3d89c64f7c77a1871e6381caae84ecfcae85565 (patch)
tree22831ff85ec87683d6b7b816af8ce78355a5c4fc /src/plugins
parent5aa9f991c22f580d3d937b77cded6f6b2f3ffd08 (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>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgstvideorenderersink.cpp39
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgstvideorenderersink_p.h3
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;