diff options
author | Yoann Lopes <yoann.lopes@theqtcompany.com> | 2015-03-24 16:50:31 +0100 |
---|---|---|
committer | Yoann Lopes <yoann.lopes@theqtcompany.com> | 2015-04-07 11:59:19 +0000 |
commit | 7bb8b763732bebb9f73aaa2c3fc0a3e574009979 (patch) | |
tree | 9833e8310c39c36b68ca3a1a05544aec2261ff71 /src/gsttools/qgstvideorenderersink.cpp | |
parent | de700906a19a6b0b0aa465cf2767c4f8041ea88e (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/qgstvideorenderersink.cpp')
-rw-r--r-- | src/gsttools/qgstvideorenderersink.cpp | 17 |
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(); |