summaryrefslogtreecommitdiffstats
path: root/src/gsttools
diff options
context:
space:
mode:
authorYoann Lopes <yoann.lopes@theqtcompany.com>2015-03-24 16:50:31 +0100
committerYoann Lopes <yoann.lopes@theqtcompany.com>2015-04-07 11:59:19 +0000
commit7bb8b763732bebb9f73aaa2c3fc0a3e574009979 (patch)
tree9833e8310c39c36b68ca3a1a05544aec2261ff71 /src/gsttools
parentde700906a19a6b0b0aa465cf2767c4f8041ea88e (diff)
GStreamer 1.0: fix frames being presented too many times.
Presenting a frame originates from a gstreamer thread, we block there until the frame is actually presented in the main thread. The problem is that it was presented over and over again until the gstreamer thread was unblocked. Make sure a given frame is presented only once. Change-Id: I46f246740313968637add802f509ebffcc5c19b8 Reviewed-by: Andrew den Exter <andrew.den.exter@qinetic.com.au>
Diffstat (limited to 'src/gsttools')
-rw-r--r--src/gsttools/qgstvideorenderersink.cpp17
1 files changed, 8 insertions, 9 deletions
diff --git a/src/gsttools/qgstvideorenderersink.cpp b/src/gsttools/qgstvideorenderersink.cpp
index e44379220..615348c14 100644
--- a/src/gsttools/qgstvideorenderersink.cpp
+++ b/src/gsttools/qgstvideorenderersink.cpp
@@ -300,8 +300,11 @@ bool QVideoSurfaceGstDelegate::handleEvent(QMutexLocker *locker)
gst_caps_unref(startCaps);
} else if (m_renderBuffer) {
+ GstBuffer *buffer = m_renderBuffer;
+ m_renderBuffer = 0;
+ m_renderReturn = GST_FLOW_ERROR;
+
if (m_activeRenderer && m_surface) {
- GstBuffer *buffer = m_renderBuffer;
gst_buffer_ref(buffer);
locker->unlock();
@@ -312,15 +315,11 @@ bool QVideoSurfaceGstDelegate::handleEvent(QMutexLocker *locker)
locker->relock();
- m_renderReturn = rendered
- ? GST_FLOW_OK
- : GST_FLOW_ERROR;
-
- m_renderCondition.wakeAll();
- } else {
- m_renderReturn = GST_FLOW_ERROR;
- m_renderCondition.wakeAll();
+ if (rendered)
+ m_renderReturn = GST_FLOW_OK;
}
+
+ m_renderCondition.wakeAll();
} else {
m_setupCondition.wakeAll();