From a310054a718b75168a5b6ee100d6e39037583e02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Beauz=C3=A9e-Luyssen?= Date: Sun, 22 Aug 2010 17:25:57 +0200 Subject: [PATCH] Workflow: Getting rid of void*. Buffers are now hard typed. --- src/Renderer/WorkflowRenderer.cpp | 17 ++++++++--------- src/Workflow/AudioClipWorkflow.cpp | 2 +- src/Workflow/AudioClipWorkflow.h | 2 +- src/Workflow/ClipWorkflow.h | 3 ++- src/Workflow/ImageClipWorkflow.cpp | 2 +- src/Workflow/ImageClipWorkflow.h | 2 +- src/Workflow/MainWorkflow.cpp | 21 +++++++-------------- src/Workflow/MainWorkflow.h | 14 +------------- src/Workflow/TrackHandler.cpp | 4 ++-- src/Workflow/TrackHandler.h | 2 +- src/Workflow/TrackWorkflow.cpp | 14 +++++--------- src/Workflow/TrackWorkflow.h | 4 ++-- src/Workflow/Types.cpp | 2 ++ src/Workflow/Types.h | 12 ++++++++++-- src/Workflow/VideoClipWorkflow.cpp | 2 +- src/Workflow/VideoClipWorkflow.h | 2 +- 16 files changed, 46 insertions(+), 59 deletions(-) diff --git a/src/Renderer/WorkflowRenderer.cpp b/src/Renderer/WorkflowRenderer.cpp index 95f86a13c..913c0d4f3 100644 --- a/src/Renderer/WorkflowRenderer.cpp +++ b/src/Renderer/WorkflowRenderer.cpp @@ -159,13 +159,13 @@ int WorkflowRenderer::lockVideo( EsHandler *handler, qint64 *pts, size_t *bufferSize, const void **buffer ) { qint64 ptsDiff = 0; - MainWorkflow::OutputBuffers* ret; + Workflow::Frame *ret; if ( m_stopping == true ) return 1; - ret = m_mainWorkflow->getOutput( Workflow::VideoTrack, m_paused ); - ptsDiff = ret->video->ptsDiff; + ret = static_cast( m_mainWorkflow->getOutput( Workflow::VideoTrack, m_paused ) ); + ptsDiff = ret->ptsDiff; if ( ptsDiff == 0 ) { //If no ptsDiff has been computed, we have to fake it, so we compute @@ -175,13 +175,13 @@ WorkflowRenderer::lockVideo( EsHandler *handler, qint64 *pts, size_t *bufferSize } { QReadLocker lock( m_effectsLock ); - EffectsEngine::applyFilters( m_filters, ret->video, + EffectsEngine::applyFilters( m_filters, ret, m_mainWorkflow->getCurrentFrame(), m_mainWorkflow->getCurrentFrame() * 1000.0 / handler->fps ); } m_pts = *pts = ptsDiff + m_pts; - *buffer = ret->video->buffer(); - *bufferSize = ret->video->size(); + *buffer = ret->buffer(); + *bufferSize = ret->size(); return 0; } @@ -194,9 +194,8 @@ WorkflowRenderer::lockAudio( EsHandler *handler, qint64 *pts, size_t *bufferSize if ( m_stopping == false && m_paused == false ) { - MainWorkflow::OutputBuffers* ret = m_mainWorkflow->getOutput( Workflow::AudioTrack, - m_paused ); - renderAudioSample = ret->audio; + renderAudioSample = static_cast( m_mainWorkflow->getOutput( Workflow::AudioTrack, + m_paused ) ); } else renderAudioSample = NULL; diff --git a/src/Workflow/AudioClipWorkflow.cpp b/src/Workflow/AudioClipWorkflow.cpp index f32e4294e..9eb865266 100644 --- a/src/Workflow/AudioClipWorkflow.cpp +++ b/src/Workflow/AudioClipWorkflow.cpp @@ -77,7 +77,7 @@ AudioClipWorkflow::getUnlockCallback() const return reinterpret_cast( &AudioClipWorkflow::unlock ); } -void* +Workflow::OutputBuffer* AudioClipWorkflow::getOutput( ClipWorkflow::GetMode mode ) { QMutexLocker lock( m_renderLock ); diff --git a/src/Workflow/AudioClipWorkflow.h b/src/Workflow/AudioClipWorkflow.h index 88be4bcdc..2d40d3068 100644 --- a/src/Workflow/AudioClipWorkflow.h +++ b/src/Workflow/AudioClipWorkflow.h @@ -42,7 +42,7 @@ class AudioClipWorkflow : public ClipWorkflow ~AudioClipWorkflow(); void *getLockCallback() const; void *getUnlockCallback() const; - virtual void *getOutput( ClipWorkflow::GetMode mode ); + virtual Workflow::OutputBuffer *getOutput( ClipWorkflow::GetMode mode ); virtual void saveEffects( QXmlStreamWriter & ) const {} //Nothing to do here now. virtual bool appendEffect( Effect *, qint64, qint64 ) { return false; } //Nothing to do here now. protected: diff --git a/src/Workflow/ClipWorkflow.h b/src/Workflow/ClipWorkflow.h index 20b87e952..c51911937 100644 --- a/src/Workflow/ClipWorkflow.h +++ b/src/Workflow/ClipWorkflow.h @@ -25,6 +25,7 @@ #include "mdate.h" #include "ClipHelper.h" +#include "Types.h" #include #include @@ -106,7 +107,7 @@ class ClipWorkflow : public QObject * therefore, you can call this method blindly, without taking care * of the rendering process advancement. */ - virtual void* getOutput( ClipWorkflow::GetMode mode ) = 0; + virtual Workflow::OutputBuffer *getOutput( ClipWorkflow::GetMode mode ) = 0; void postGetOutput(); virtual void initVlcOutput() = 0; void initialize(); diff --git a/src/Workflow/ImageClipWorkflow.cpp b/src/Workflow/ImageClipWorkflow.cpp index da10b0fe0..68ee030be 100644 --- a/src/Workflow/ImageClipWorkflow.cpp +++ b/src/Workflow/ImageClipWorkflow.cpp @@ -84,7 +84,7 @@ ImageClipWorkflow::getUnlockCallback() const return reinterpret_cast( &ImageClipWorkflow::unlock ); } -void* +Workflow::OutputBuffer* ImageClipWorkflow::getOutput( ClipWorkflow::GetMode ) { QMutexLocker lock( m_renderLock ); diff --git a/src/Workflow/ImageClipWorkflow.h b/src/Workflow/ImageClipWorkflow.h index 36482d20b..7c18c8a33 100644 --- a/src/Workflow/ImageClipWorkflow.h +++ b/src/Workflow/ImageClipWorkflow.h @@ -35,7 +35,7 @@ class ImageClipWorkflow : public ClipWorkflow void *getLockCallback() const; void *getUnlockCallback() const; - virtual void *getOutput( ClipWorkflow::GetMode mode ); + virtual Workflow::OutputBuffer *getOutput( ClipWorkflow::GetMode mode ); virtual void saveEffects( QXmlStreamWriter & ) const {} //Nothing to do here now. virtual bool appendEffect( Effect *, qint64, qint64 ) { return false; } //Nothing to do here now. protected: diff --git a/src/Workflow/MainWorkflow.cpp b/src/Workflow/MainWorkflow.cpp index e1493eb80..86df24b06 100644 --- a/src/Workflow/MainWorkflow.cpp +++ b/src/Workflow/MainWorkflow.cpp @@ -59,7 +59,6 @@ MainWorkflow::MainWorkflow( int trackCount ) : this, SLOT( tracksEndReached() ) ); m_currentFrame[i] = 0; } - m_outputBuffers = new OutputBuffers; } MainWorkflow::~MainWorkflow() @@ -125,7 +124,7 @@ MainWorkflow::startRender( quint32 width, quint32 height, double fps ) computeLength(); } -MainWorkflow::OutputBuffers* +Workflow::OutputBuffer* MainWorkflow::getOutput( Workflow::TrackType trackType, bool paused ) { QMutexLocker lock( m_renderStartedMutex ); @@ -134,22 +133,16 @@ MainWorkflow::getOutput( Workflow::TrackType trackType, bool paused ) { QReadLocker lock2( m_currentFrameLock ); - void* ret = m_tracks[trackType]->getOutput( m_currentFrame[Workflow::VideoTrack], - m_currentFrame[trackType], paused ); + Workflow::OutputBuffer *ret = m_tracks[trackType]->getOutput( m_currentFrame[Workflow::VideoTrack], + m_currentFrame[trackType], paused ); if ( trackType == Workflow::VideoTrack ) { - Workflow::Frame* frame = static_cast( ret ); - if ( frame == NULL ) - m_outputBuffers->video = MainWorkflow::blackOutput; - else - m_outputBuffers->video = frame; - } - else - { - m_outputBuffers->audio = static_cast( ret ); + if ( ret == NULL ) + return MainWorkflow::blackOutput; } + return ret; } - return m_outputBuffers; + return NULL; } void diff --git a/src/Workflow/MainWorkflow.h b/src/Workflow/MainWorkflow.h index 2bd201ab6..0b2cccfc7 100644 --- a/src/Workflow/MainWorkflow.h +++ b/src/Workflow/MainWorkflow.h @@ -56,16 +56,6 @@ class MainWorkflow : public QObject, public Singleton Q_OBJECT public: - /** - * \struct Represents an output, with both audio and video buffers. - * Note that an OutputBuffers will not necessarly have its both - * fields filed out. - */ - struct OutputBuffers - { - Workflow::Frame *video; - Workflow::AudioSample *audio; - }; /** * \enum Used to know which part required a change of rendered frame. * The main use of this enum is to avoid infinite information propagation @@ -125,7 +115,7 @@ class MainWorkflow : public QObject, public Singleton * \param trackType The type of track you wish to get the render from. * \param paused The paused state of the renderer */ - OutputBuffers* getOutput( Workflow::TrackType trackType, bool paused ); + Workflow::OutputBuffer *getOutput( Workflow::TrackType trackType, bool paused ); /** * \brief Set the workflow position by the desired frame * \param currentFrame: The desired frame to render from @@ -395,8 +385,6 @@ class MainWorkflow : public QObject, public Singleton /// Contains the trackhandler, indexed by Workflow::TrackType TrackHandler** m_tracks; - /// Pre-allocated buffer, that will contain every computed outputs. - OutputBuffers* m_outputBuffers; /// Width used for the render quint32 m_width; diff --git a/src/Workflow/TrackHandler.cpp b/src/Workflow/TrackHandler.cpp index 2b7ff8110..199f33498 100644 --- a/src/Workflow/TrackHandler.cpp +++ b/src/Workflow/TrackHandler.cpp @@ -100,7 +100,7 @@ TrackHandler::getLength() const return m_length; } -void* +Workflow::OutputBuffer* TrackHandler::getOutput( qint64 currentFrame, qint64 subFrame, bool paused ) { bool validTrack = false; @@ -110,7 +110,7 @@ TrackHandler::getOutput( qint64 currentFrame, qint64 subFrame, bool paused ) if ( m_tracks[i].activated() == false || m_tracks[i]->hasFrameToRender( currentFrame ) ) continue ; validTrack = true; - void* ret = m_tracks[i]->getOutput( currentFrame, subFrame, paused ); + Workflow::OutputBuffer *ret = m_tracks[i]->getOutput( currentFrame, subFrame, paused ); if ( ret == NULL ) continue ; else diff --git a/src/Workflow/TrackHandler.h b/src/Workflow/TrackHandler.h index 285c11539..f50f8bb8f 100644 --- a/src/Workflow/TrackHandler.h +++ b/src/Workflow/TrackHandler.h @@ -62,7 +62,7 @@ class TrackHandler : public QObject * track, it will be different. * \param paused The renderer paused state */ - void *getOutput( qint64 currentFrame, qint64 subFrame, + Workflow::OutputBuffer *getOutput( qint64 currentFrame, qint64 subFrame, bool paused ); qint64 getClipPosition( const QUuid& uuid, unsigned int trackId ) const; void stop(); diff --git a/src/Workflow/TrackWorkflow.cpp b/src/Workflow/TrackWorkflow.cpp index 87ca37812..241d1bdf1 100644 --- a/src/Workflow/TrackWorkflow.cpp +++ b/src/Workflow/TrackWorkflow.cpp @@ -152,7 +152,7 @@ TrackWorkflow::getClip( const QUuid& uuid ) return NULL; } -void* +Workflow::OutputBuffer* TrackWorkflow::renderClip( ClipWorkflow* cw, qint64 currentFrame, qint64 start , bool needRepositioning, bool renderOneFrame, bool paused ) @@ -265,7 +265,7 @@ TrackWorkflow::stop() m_lastFrame = 0; } -void* +Workflow::OutputBuffer* TrackWorkflow::getOutput( qint64 currentFrame, qint64 subFrame, bool paused ) { QReadLocker lock( m_clipsLock ); @@ -273,7 +273,7 @@ TrackWorkflow::getOutput( qint64 currentFrame, qint64 subFrame, bool paused ) QMap::iterator it = m_clips.begin(); QMap::iterator end = m_clips.end(); bool needRepositioning; - void *ret = NULL; + Workflow::OutputBuffer *ret = NULL; Workflow::Frame *frames[EffectsEngine::MaxFramesForMixer]; quint32 frameId = 0; bool renderOneFrame = false; @@ -312,7 +312,7 @@ TrackWorkflow::getOutput( qint64 currentFrame, qint64 subFrame, bool paused ) renderOneFrame, paused ); if ( m_trackType == Workflow::VideoTrack ) { - frames[frameId] = reinterpret_cast( ret ); + frames[frameId] = static_cast( ret ); ++frameId; } } @@ -344,11 +344,7 @@ TrackWorkflow::getOutput( qint64 currentFrame, qint64 subFrame, bool paused ) ret = frames[0]; } m_lastFrame = subFrame; - if ( ret == NULL ) - return NULL; - if ( m_trackType == Workflow::VideoTrack ) - return reinterpret_cast( ret ); - return reinterpret_cast( ret ); + return ret; } void TrackWorkflow::moveClip( const QUuid& id, qint64 startingFrame ) diff --git a/src/Workflow/TrackWorkflow.h b/src/Workflow/TrackWorkflow.h index 18f4463d9..9863bd174 100644 --- a/src/Workflow/TrackWorkflow.h +++ b/src/Workflow/TrackWorkflow.h @@ -49,7 +49,7 @@ class TrackWorkflow : public QObject TrackWorkflow( Workflow::TrackType type ); ~TrackWorkflow(); - void* getOutput( qint64 currentFrame, + Workflow::OutputBuffer *getOutput( qint64 currentFrame, qint64 subFrame, bool paused ); qint64 getLength() const; void stop(); @@ -94,7 +94,7 @@ class TrackWorkflow : public QObject private: void computeLength(); - void* renderClip( ClipWorkflow* cw, qint64 currentFrame, + Workflow::OutputBuffer *renderClip( ClipWorkflow* cw, qint64 currentFrame, qint64 start, bool needRepositioning, bool renderOneFrame, bool paused ); void preloadClip( ClipWorkflow* cw ); diff --git a/src/Workflow/Types.cpp b/src/Workflow/Types.cpp index 97a99dda5..216eac28d 100644 --- a/src/Workflow/Types.cpp +++ b/src/Workflow/Types.cpp @@ -27,6 +27,7 @@ using namespace Workflow; #include //memcpy Frame::Frame() : + OutputBuffer( VideoTrack ), ptsDiff( 0 ), m_width( 0 ), m_height( 0 ), @@ -37,6 +38,7 @@ Frame::Frame() : } Frame::Frame( quint32 width, quint32 height ) : + OutputBuffer( VideoTrack ), ptsDiff( 0 ), m_width( width ), m_height( height ) diff --git a/src/Workflow/Types.h b/src/Workflow/Types.h index a0fbbf184..95b3a252b 100644 --- a/src/Workflow/Types.h +++ b/src/Workflow/Types.h @@ -39,7 +39,14 @@ namespace Workflow NbTrackType, ///< Used to know how many types we have }; - class Frame + struct OutputBuffer + { + TrackType type; + protected: + OutputBuffer( TrackType _type ) : type( _type ) {} + }; + + class Frame : public OutputBuffer { public: explicit Frame(); @@ -83,8 +90,9 @@ namespace Workflow quint32 m_size; quint32 m_nbPixels; }; - struct AudioSample + struct AudioSample : public OutputBuffer { + AudioSample() : OutputBuffer( AudioTrack ){} unsigned char* buff; size_t size; quint32 nbSample; diff --git a/src/Workflow/VideoClipWorkflow.cpp b/src/Workflow/VideoClipWorkflow.cpp index 308561fb1..3902eb23e 100644 --- a/src/Workflow/VideoClipWorkflow.cpp +++ b/src/Workflow/VideoClipWorkflow.cpp @@ -118,7 +118,7 @@ VideoClipWorkflow::getUnlockCallback() const return reinterpret_cast( &VideoClipWorkflow::unlock ); } -void* +Workflow::OutputBuffer* VideoClipWorkflow::getOutput( ClipWorkflow::GetMode mode ) { QMutexLocker lock( m_renderLock ); diff --git a/src/Workflow/VideoClipWorkflow.h b/src/Workflow/VideoClipWorkflow.h index 558f9f6a0..7646f931b 100644 --- a/src/Workflow/VideoClipWorkflow.h +++ b/src/Workflow/VideoClipWorkflow.h @@ -39,7 +39,7 @@ class VideoClipWorkflow : public ClipWorkflow ~VideoClipWorkflow(); void *getLockCallback() const; void *getUnlockCallback() const; - virtual void *getOutput( ClipWorkflow::GetMode mode ); + virtual Workflow::OutputBuffer *getOutput( ClipWorkflow::GetMode mode ); virtual bool appendEffect( Effect *effect, qint64 start = 0, qint64 end = -1 ); virtual void setTime( qint64 time, qint64 frame ); virtual void saveEffects( QXmlStreamWriter &project ) const; -- GitLab