From 59d07523adb4278bdaf9492fca13ef5bfe6f8a34 Mon Sep 17 00:00:00 2001 From: Hugo Beauzee-Luyssen Date: Wed, 17 Mar 2010 17:29:46 +0100 Subject: [PATCH] Workflow: Making frame rendering synchrone IE wait for a frame to be ready when calling getOutput --- src/Workflow/ClipWorkflow.cpp | 6 ++++-- src/Workflow/ClipWorkflow.h | 5 +++-- src/Workflow/VideoClipWorkflow.cpp | 22 +++++++++++++++++----- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/Workflow/ClipWorkflow.cpp b/src/Workflow/ClipWorkflow.cpp index 53e755555..6284d71da 100644 --- a/src/Workflow/ClipWorkflow.cpp +++ b/src/Workflow/ClipWorkflow.cpp @@ -45,16 +45,18 @@ ClipWorkflow::ClipWorkflow( Clip::Clip* clip ) : m_renderLock = new QMutex; m_availableBuffersMutex = new QMutex; m_computedBuffersMutex = new QMutex; + m_renderWaitCond = new WaitCondition; } ClipWorkflow::~ClipWorkflow() { + delete m_renderWaitCond; + delete m_computedBuffersMutex; + delete m_availableBuffersMutex; delete m_renderLock; delete m_pausingStateWaitCond; delete m_initWaitCond; delete m_stateLock; - delete m_availableBuffersMutex; - delete m_computedBuffersMutex; } void ClipWorkflow::initialize() diff --git a/src/Workflow/ClipWorkflow.h b/src/Workflow/ClipWorkflow.h index e85191f5b..f689c797e 100644 --- a/src/Workflow/ClipWorkflow.h +++ b/src/Workflow/ClipWorkflow.h @@ -210,8 +210,8 @@ class ClipWorkflow : public QObject virtual void releasePrealocated() = 0; private: - WaitCondition* m_initWaitCond; - WaitCondition* m_pausingStateWaitCond; + WaitCondition *m_initWaitCond; + WaitCondition *m_pausingStateWaitCond; /** * \brief Used by the trackworkflow to query a clipworkflow resync. * @@ -243,6 +243,7 @@ class ClipWorkflow : public QObject qint64 m_pauseDuration; bool m_fullSpeedRender; int debugType; + WaitCondition *m_renderWaitCond; private slots: void loadingComplete(); diff --git a/src/Workflow/VideoClipWorkflow.cpp b/src/Workflow/VideoClipWorkflow.cpp index b7d54b820..414991f5a 100644 --- a/src/Workflow/VideoClipWorkflow.cpp +++ b/src/Workflow/VideoClipWorkflow.cpp @@ -20,12 +20,13 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ -#include "VideoClipWorkflow.h" +#include "Clip.h" +#include "LightVideoFrame.h" #include "MainWorkflow.h" #include "StackedBuffer.hpp" -#include "LightVideoFrame.h" -#include "Clip.h" +#include "VideoClipWorkflow.h" #include "VLCMedia.h" +#include "WaitCondition.hpp" #include @@ -113,10 +114,19 @@ VideoClipWorkflow::getOutput( ClipWorkflow::GetMode mode ) QMutexLocker lock( m_renderLock ); QMutexLocker lock2( m_computedBuffersMutex ); - if ( preGetOutput() == false ) - return NULL; if ( isEndReached() == true ) return NULL; + if ( preGetOutput() == false ) + { + QMutexLocker waitLock( m_renderWaitCond->getMutex() ); + m_computedBuffersMutex->unlock(); + m_renderLock->unlock(); + + m_renderWaitCond->waitLocked(); + + m_renderLock->lock(); + m_computedBuffersMutex->lock(); + } ::StackedBuffer* buff; if ( mode == ClipWorkflow::Pop ) buff = new StackedBuffer( m_computedBuffers.dequeue(), this, true ); @@ -161,6 +171,8 @@ VideoClipWorkflow::unlock( VideoClipWorkflow *cw, void *buffer, int width, cw->commonUnlock(); cw->m_renderLock->unlock(); cw->m_computedBuffersMutex->unlock(); + QMutexLocker lock( cw->m_renderWaitCond->getMutex() ); + cw->m_renderWaitCond->wake(); } uint32_t -- GitLab