[vlmc-devel] [PATCH 5/8] MainWorkflow: Don't use TrackHandler
Hugo Beauzée-Luyssen
hugo at beauzee.fr
Fri May 13 11:13:45 CEST 2016
On 05/03/2016 07:24 AM, Yikai Lu wrote:
> ---
> src/CMakeLists.txt | 1 -
> src/Gui/timeline/AbstractGraphicsMediaItem.cpp | 6 +-
> src/Gui/timeline/GraphicsTrack.cpp | 6 +-
> src/Gui/timeline/TracksView.cpp | 35 +++---
> src/Workflow/MainWorkflow.cpp | 150 ++++++++++++++-----------
> src/Workflow/MainWorkflow.h | 29 ++---
> src/Workflow/TrackWorkflow.cpp | 36 ++++--
> src/Workflow/TrackWorkflow.h | 4 +-
> 8 files changed, 142 insertions(+), 125 deletions(-)
>
> diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
> index 238bffa..75d6679 100644
> --- a/src/CMakeLists.txt
> +++ b/src/CMakeLists.txt
> @@ -84,7 +84,6 @@ SET(VLMC_SRCS
> Workflow/Helper.cpp
> Workflow/ImageClipWorkflow.cpp
> Workflow/MainWorkflow.cpp
> - Workflow/TrackHandler.cpp
> Workflow/TrackWorkflow.cpp
> Workflow/Types.cpp
> Workflow/VideoClipWorkflow.cpp
> diff --git a/src/Gui/timeline/AbstractGraphicsMediaItem.cpp b/src/Gui/timeline/AbstractGraphicsMediaItem.cpp
> index be683d0..270757c 100644
> --- a/src/Gui/timeline/AbstractGraphicsMediaItem.cpp
> +++ b/src/Gui/timeline/AbstractGraphicsMediaItem.cpp
> @@ -111,14 +111,12 @@ AbstractGraphicsMediaItem::contextMenuEvent( QGraphicsSceneContextMenuEvent* eve
> if ( ( m_muted = muteAction->isChecked() ) )
> {
> tracksView()->m_mainWorkflow->muteClip( uuid(),
> - trackId,
> - trackType() );
> + trackId );
> }
> else
> {
> tracksView()->m_mainWorkflow->unmuteClip( uuid(),
> - trackId,
> - trackType() );
> + trackId );
> }
> }
> else if ( selectedAction == linkAction )
> diff --git a/src/Gui/timeline/GraphicsTrack.cpp b/src/Gui/timeline/GraphicsTrack.cpp
> index 7036ad3..b8a85ea 100644
> --- a/src/Gui/timeline/GraphicsTrack.cpp
> +++ b/src/Gui/timeline/GraphicsTrack.cpp
> @@ -36,7 +36,7 @@ GraphicsTrack::GraphicsTrack( Workflow::TrackType type, quint32 trackNumber,
> m_type = type;
> m_trackNumber = trackNumber;
> m_enabled = true;
> - m_trackWorkflow = Core::instance()->workflow()->track( type, trackNumber );
> + m_trackWorkflow = Core::instance()->workflow()->track( trackNumber );
>
> setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
> setContentsMargins( 0, 0, 0, 0 );
> @@ -65,9 +65,9 @@ GraphicsTrack::setTrackEnabled( bool enabled )
> m_enabled = enabled;
>
> if( enabled )
> - Core::instance()->workflow()->unmuteTrack( m_trackNumber, m_type );
> + Core::instance()->workflow()->unmuteTrack( m_trackNumber );
> else
> - Core::instance()->workflow()->muteTrack( m_trackNumber, m_type );
> + Core::instance()->workflow()->muteTrack( m_trackNumber );
> }
>
> bool
> diff --git a/src/Gui/timeline/TracksView.cpp b/src/Gui/timeline/TracksView.cpp
> index 39d69b2..514eb2c 100644
> --- a/src/Gui/timeline/TracksView.cpp
> +++ b/src/Gui/timeline/TracksView.cpp
> @@ -89,27 +89,24 @@ TracksView::TracksView( QGraphicsScene *scene, MainWorkflow *mainWorkflow,
> connect( m_cursorLine, SIGNAL( cursorMoved(qint64) ),
> this, SLOT( ensureCursorVisible() ) );
>
> - for ( quint32 type = Workflow::VideoTrack; type < Workflow::NbTrackType; ++type )
> + for ( quint32 i = 0; i < m_mainWorkflow->trackCount(); ++i )
> {
> - for ( quint32 i = 0; i < m_mainWorkflow->trackCount(); ++i )
> - {
> - TrackWorkflow *tw = m_mainWorkflow->track( static_cast<Workflow::TrackType>( type ), i );
> - //Clips part:
> - connect( tw, SIGNAL( clipAdded( TrackWorkflow*, Workflow::Helper*, qint64 ) ),
> - this, SLOT( addItem( TrackWorkflow*, Workflow::Helper*, qint64 ) ) );
> - connect( tw, SIGNAL( clipRemoved( TrackWorkflow*, const QUuid& ) ),
> - this, SLOT( removeItem( TrackWorkflow*, const QUuid& ) ) );
> - connect( tw, SIGNAL( clipMoved( TrackWorkflow*, const QUuid&, qint64 ) ),
> - this, SLOT( moveItem( TrackWorkflow*, const QUuid&, qint64 ) ) );
> - //Effect part:
> - connect( tw, SIGNAL( effectAdded( TrackWorkflow*, Workflow::Helper*, qint64 ) ),
> - this, SLOT(addItem( TrackWorkflow*, Workflow::Helper*, qint64 ) ), Qt::QueuedConnection );
> - connect( tw, SIGNAL( effectRemoved( TrackWorkflow*, QUuid ) ),
> - this, SLOT( removeItem( TrackWorkflow*, QUuid ) ), Qt::QueuedConnection );
> - connect( tw, SIGNAL( effectMoved( TrackWorkflow*, QUuid, qint64 ) ),
> - this, SLOT( moveItem( TrackWorkflow*, QUuid, qint64 ) ), Qt::QueuedConnection );
> + TrackWorkflow *tw = m_mainWorkflow->track( i );
> + //Clips part:
> + connect( tw, SIGNAL( clipAdded( TrackWorkflow*, Workflow::Helper*, qint64 ) ),
> + this, SLOT( addItem( TrackWorkflow*, Workflow::Helper*, qint64 ) ) );
> + connect( tw, SIGNAL( clipRemoved( TrackWorkflow*, const QUuid& ) ),
> + this, SLOT( removeItem( TrackWorkflow*, const QUuid& ) ) );
> + connect( tw, SIGNAL( clipMoved( TrackWorkflow*, const QUuid&, qint64 ) ),
> + this, SLOT( moveItem( TrackWorkflow*, const QUuid&, qint64 ) ) );
> + //Effect part:
> + connect( tw, SIGNAL( effectAdded( TrackWorkflow*, Workflow::Helper*, qint64 ) ),
> + this, SLOT(addItem( TrackWorkflow*, Workflow::Helper*, qint64 ) ), Qt::QueuedConnection );
> + connect( tw, SIGNAL( effectRemoved( TrackWorkflow*, QUuid ) ),
> + this, SLOT( removeItem( TrackWorkflow*, QUuid ) ), Qt::QueuedConnection );
> + connect( tw, SIGNAL( effectMoved( TrackWorkflow*, QUuid, qint64 ) ),
> + this, SLOT( moveItem( TrackWorkflow*, QUuid, qint64 ) ), Qt::QueuedConnection );
>
> - }
> }
> }
>
> diff --git a/src/Workflow/MainWorkflow.cpp b/src/Workflow/MainWorkflow.cpp
> index 264982b..ceb06fa 100644
> --- a/src/Workflow/MainWorkflow.cpp
> +++ b/src/Workflow/MainWorkflow.cpp
> @@ -30,7 +30,6 @@
> #include "MainWorkflow.h"
> #include "Project/Project.h"
> #include "TrackWorkflow.h"
> -#include "TrackHandler.h"
> #include "Settings/Settings.h"
> #include "Tools/VlmcDebug.h"
> #include "Workflow/Types.h"
> @@ -48,21 +47,19 @@ MainWorkflow::MainWorkflow( Settings* projectSettings, int trackCount ) :
> {
> m_currentFrameLock = new QReadWriteLock;
>
> - m_tracks = new TrackHandler*[Workflow::NbTrackType];
> - QVariantList l;
> for ( unsigned int i = 0; i < Workflow::NbTrackType; ++i )
> - {
> - Workflow::TrackType trackType = static_cast<Workflow::TrackType>(i);
> - m_tracks[i] = new TrackHandler( trackCount, trackType );
> - connect( m_tracks[i], SIGNAL( tracksEndReached() ),
> - this, SLOT( tracksEndReached() ) );
> - connect( m_tracks[i], SIGNAL( lengthChanged(qint64) ),
> - this, SLOT( lengthUpdated( qint64 ) ) );
> m_currentFrame[i] = 0;
> - l << QVariantHash();
> +
> + for ( int i = 0; i < trackCount; ++i )
> + {
> + Toggleable<TrackWorkflow*> track;
> + m_tracks << track;
> + m_tracks[i].setPtr( new TrackWorkflow( i ) );
> + connect( m_tracks[i], SIGNAL( lengthChanged( qint64 ) ),
> + this, SLOT( lengthUpdated(qint64) ) );
> }
>
> - m_settings->createVar( SettingValue::List, "tracks", l, "", "", SettingValue::Nothing );
> + m_settings->createVar( SettingValue::List, "tracks", QVariantList(), "", "", SettingValue::Nothing );
> connect( m_settings, &Settings::postLoad, this, &MainWorkflow::postLoad, Qt::DirectConnection );
> connect( m_settings, &Settings::preSave, this, &MainWorkflow::preSave, Qt::DirectConnection );
> projectSettings->addSettings( "Workspace", *m_settings );
> @@ -70,10 +67,10 @@ MainWorkflow::MainWorkflow( Settings* projectSettings, int trackCount ) :
>
> MainWorkflow::~MainWorkflow()
> {
> + for ( auto track : m_tracks )
> + delete track;
> + m_tracks.clear();
> delete m_currentFrameLock;
> - for ( unsigned int i = 0; i < Workflow::NbTrackType; ++i )
> - delete m_tracks[i];
> - delete[] m_tracks;
> delete m_blackOutput;
> delete m_settings;
> }
> @@ -83,10 +80,10 @@ MainWorkflow::computeLength()
> {
> qint64 maxLength = 0;
>
> - for ( unsigned int i = 0; i < Workflow::NbTrackType; ++i )
> + for ( auto track : m_tracks )
> {
> - if ( m_tracks[i]->getLength() > maxLength )
> - maxLength = m_tracks[i]->getLength();
> + if ( track->getLength() > maxLength )
> + maxLength = track->getLength();
> }
> if ( m_lengthFrame != maxLength )
> {
> @@ -107,8 +104,10 @@ MainWorkflow::startRender( quint32 width, quint32 height )
> delete m_blackOutput;
> m_blackOutput = new Workflow::Frame( m_width, m_height );
> memset( m_blackOutput->buffer(), 0, m_blackOutput->size() );
> - for ( unsigned int i = 0; i < Workflow::NbTrackType; ++i )
> - m_tracks[i]->startRender( width, height );
> + m_endReached = ( m_lengthFrame == 0 ) ? true : false;
> + if ( m_lengthFrame > 0 )
> + for ( auto track : m_tracks )
> + track->initRender( width, height );
> computeLength();
> }
>
> @@ -126,8 +125,26 @@ MainWorkflow::getOutput( Workflow::TrackType trackType, bool paused )
> subFrame = m_currentFrame[trackType];
> }
>
> - Workflow::OutputBuffer *ret = m_tracks[trackType]->getOutput( currentFrame,
> - subFrame, paused );
> + bool validTrack = false;
> + Workflow::OutputBuffer *ret = nullptr;
> +
> + for ( int i = m_trackCount - 1; i >= 0; --i )
> + {
> + if ( m_tracks[i].activated() == false || m_tracks[i]->hasNoMoreFrameToRender( currentFrame ) )
> + continue ;
> + validTrack = true;
> + ret = m_tracks[i]->getOutput( trackType, currentFrame, subFrame, paused );
> + if ( ret == nullptr )
> + continue ;
> + else
> + break ;
> + }
> + if ( validTrack == false )
> + {
> + m_endReached = true;
> + emit mainWorkflowEndReached();
> + }
> +
> if ( trackType == Workflow::VideoTrack )
> {
> if ( ret == nullptr )
> @@ -165,10 +182,10 @@ MainWorkflow::getLengthFrame() const
> }
>
> qint64
> -MainWorkflow::getClipPosition( const QUuid& uuid, unsigned int trackId,
> - Workflow::TrackType trackType ) const
> +MainWorkflow::getClipPosition( const QUuid& uuid, unsigned int trackId ) const
> {
> - return m_tracks[trackType]->getClipPosition( uuid, trackId );
> + Q_ASSERT( trackId < m_trackCount );
> + return m_tracks[trackId]->getClipPosition( uuid );
> }
>
> void
> @@ -181,44 +198,45 @@ MainWorkflow::stop()
> */
> m_renderStarted = false;
> for (unsigned int i = 0; i < Workflow::NbTrackType; ++i)
> - {
> - m_tracks[i]->stop();
> m_currentFrame[i] = 0;
> - }
> + for ( auto track : m_tracks )
> + track->stop();
> emit frameChanged( 0, Vlmc::Renderer );
> }
>
> void
> MainWorkflow::stopFrameComputing()
> {
> - for ( qint32 type = 0; type < Workflow::NbTrackType; ++type )
> - m_tracks[type]->stopFrameComputing();
> + for ( auto track : m_tracks )
> + track->stopFrameComputing();
> }
>
> void
> -MainWorkflow::muteTrack( unsigned int trackId, Workflow::TrackType trackType )
> +MainWorkflow::muteTrack( unsigned int trackId )
> {
> - m_tracks[trackType]->muteTrack( trackId );
> + Q_ASSERT( trackId < m_trackCount );
> + m_tracks[trackId].deactivate();
> }
>
> void
> -MainWorkflow::unmuteTrack( unsigned int trackId, Workflow::TrackType trackType )
> +MainWorkflow::unmuteTrack( unsigned int trackId )
> {
> - m_tracks[trackType]->unmuteTrack( trackId );
> + Q_ASSERT( trackId < m_trackCount );
> + m_tracks[trackId].activate();
> }
>
> void
> -MainWorkflow::muteClip( const QUuid& uuid, unsigned int trackId,
> - Workflow::TrackType trackType )
> +MainWorkflow::muteClip( const QUuid& uuid, unsigned int trackId )
> {
> - m_tracks[trackType]->muteClip( uuid, trackId );
> + Q_ASSERT( trackId < m_trackCount );
> + m_tracks[trackId]->muteClip( uuid );
> }
>
> void
> -MainWorkflow::unmuteClip( const QUuid& uuid, unsigned int trackId,
> - Workflow::TrackType trackType )
> +MainWorkflow::unmuteClip( const QUuid& uuid, unsigned int trackId )
> {
> - m_tracks[trackType]->unmuteClip( uuid, trackId );
> + Q_ASSERT( trackId < m_trackCount );
> + m_tracks[trackId]->unmuteClip( uuid );
> }
>
> void
> @@ -232,35 +250,32 @@ MainWorkflow::setCurrentFrame( qint64 currentFrame, Vlmc::FrameChangedReason rea
> }
>
> ClipHelper*
> -MainWorkflow::getClipHelper( const QUuid &uuid, unsigned int trackId,
> - Workflow::TrackType trackType )
> +MainWorkflow::getClipHelper( const QUuid &uuid, unsigned int trackId )
> {
> - return m_tracks[trackType]->getClipHelper( uuid, trackId );
> + Q_ASSERT( trackId < m_trackCount );
> + return m_tracks[trackId]->getClipHelper( uuid );
> }
>
> void
> MainWorkflow::clear()
> {
> - for ( unsigned int i = 0; i < Workflow::NbTrackType; ++i )
> - m_tracks[i]->clear();
> + for ( auto track : m_tracks )
> + track->clear();
> emit cleared();
> }
>
> void
> MainWorkflow::tracksEndReached()
> {
> - for ( unsigned int i = 0; i < Workflow::NbTrackType; ++i )
> - {
> - if ( m_tracks[i]->endIsReached() == false )
> - return ;
> - }
> + if ( m_endReached == false )
> + return ;
> emit mainWorkflowEndReached();
> }
>
> int
> -MainWorkflow::getTrackCount( Workflow::TrackType trackType ) const
> +MainWorkflow::getTrackCount() const
> {
> - return m_tracks[trackType]->getTrackCount();
> + return m_trackCount;
> }
>
> qint64
> @@ -291,8 +306,9 @@ MainWorkflow::getHeight() const
> void
> MainWorkflow::renderOneFrame()
> {
> - for ( unsigned int i = 0; i < Workflow::NbTrackType; ++i )
> - m_tracks[i]->renderOneFrame();
> + for ( auto track : m_tracks )
> + if ( track.activated() == true )
> + track->renderOneFrame();
> nextFrame( Workflow::VideoTrack );
> nextFrame( Workflow::AudioTrack );
> }
> @@ -300,15 +316,15 @@ MainWorkflow::renderOneFrame()
> void
> MainWorkflow::setFullSpeedRender( bool val )
> {
> - for ( unsigned int i = 0; i < Workflow::NbTrackType; ++i )
> - m_tracks[i]->setFullSpeedRender( val );
> + for ( auto track : m_tracks )
> + track->setFullSpeedRender( val );
> }
>
> bool
> MainWorkflow::contains( const QUuid &uuid ) const
> {
> - for ( qint32 type = 0; type < Workflow::NbTrackType; ++type )
> - if ( m_tracks[type]->contains( uuid ) == true )
> + for ( auto track : m_tracks )
> + if ( track->contains( uuid ) == true )
> return true;
> return false;
> }
> @@ -329,8 +345,8 @@ void
> MainWorkflow::preSave()
> {
> QVariantList l;
> - for ( unsigned int i = 0; i < Workflow::NbTrackType; ++i )
> - l << m_tracks[i]->toVariant();
> + for ( auto track : m_tracks )
> + l << track->toVariant();
> m_settings->value( "tracks" )->set( l );
> }
>
> @@ -338,7 +354,7 @@ void
> MainWorkflow::postLoad()
> {
> QVariantList l = m_settings->value( "tracks" )->get().toList();
> - for ( unsigned int i = 0; i < Workflow::NbTrackType; ++i )
> + for ( int i = 0; i < l.size(); ++i )
> m_tracks[i]->loadFromVariant( l[i] );
> }
>
> @@ -347,20 +363,20 @@ MainWorkflow::lengthUpdated( qint64 )
> {
> qint64 maxLength = 0;
>
> - for ( unsigned int i = 0; i < Workflow::NbTrackType; ++i )
> + for ( auto track : m_tracks )
> {
> - if ( m_tracks[i]->getLength() > maxLength )
> - maxLength = m_tracks[i]->getLength();
> + if ( track->getLength() > maxLength )
> + maxLength = track->getLength();
> }
> if ( m_lengthFrame != maxLength )
> {
> m_lengthFrame = maxLength;
> - emit lengthChanged( m_lengthFrame );
> + emit ( m_lengthFrame );
> }
> }
>
> TrackWorkflow*
> -MainWorkflow::track( Workflow::TrackType type, quint32 trackId )
> +MainWorkflow::track( quint32 trackId )
> {
> - return m_tracks[type]->track( trackId );
> + return m_tracks[ trackId ];
> }
> diff --git a/src/Workflow/MainWorkflow.h b/src/Workflow/MainWorkflow.h
> index 4f6a2bd..09c2a0b 100644
> --- a/src/Workflow/MainWorkflow.h
> +++ b/src/Workflow/MainWorkflow.h
> @@ -27,6 +27,7 @@
> #include "EffectsEngine/EffectsEngine.h"
> #include <QXmlStreamWriter>
> #include "Types.h"
> +#include "Tools/Toggleable.hpp"
>
> class Clip;
> class ClipHelper;
> @@ -145,8 +146,7 @@ class MainWorkflow : public QObject
> * \return The given clip position, in frame. If not found, -1
> * is returned.
> */
> - qint64 getClipPosition( const QUuid& uuid, unsigned int trackId,
> - Workflow::TrackType trackType ) const;
> + qint64 getClipPosition( const QUuid& uuid, unsigned int trackId ) const;
>
> /**
> * \brief Mute a track.
> @@ -157,8 +157,7 @@ class MainWorkflow : public QObject
> * \param trackType The type of the track to mute.
> * \sa unmuteTrack( unsigned int, Workflow::TrackType );
> */
> - void muteTrack( unsigned int trackId,
> - Workflow::TrackType trackType );
> + void muteTrack( unsigned int trackId );
> /**
> * \brief Unmute a track.
> *
> @@ -166,8 +165,7 @@ class MainWorkflow : public QObject
> * \param trackType The type of the track to unmute.
> * \sa muteTrack( unsigned int, Workflow::TrackType );
> */
> - void unmuteTrack( unsigned int trackId,
> - Workflow::TrackType trackType );
> + void unmuteTrack( unsigned int trackId );
>
> /**
> * \brief Mute a clip.
> @@ -176,8 +174,7 @@ class MainWorkflow : public QObject
> * \param trackId The id of the track containing the clip.
> * \param trackType The type of the track containing the clip.
> */
> - void muteClip( const QUuid& uuid, unsigned int trackId,
> - Workflow::TrackType trackType );
> + void muteClip( const QUuid& uuid, unsigned int trackId );
>
> /**
> * \brief Unmute a clip.
> @@ -186,8 +183,7 @@ class MainWorkflow : public QObject
> * \param trackId The id of the track containing the clip.
> * \param trackType The type of the track containing the clip.
> */
> - void unmuteClip( const QUuid& uuid, unsigned int trackId,
> - Workflow::TrackType trackType );
> + void unmuteClip( const QUuid& uuid, unsigned int trackId );
>
> /**
> * \brief Get the number of track for a specific type
> @@ -195,7 +191,7 @@ class MainWorkflow : public QObject
> * \param trackType The type of the tracks to count
> * \return The number of track for the type trackType
> */
> - int getTrackCount( Workflow::TrackType trackType ) const;
> + int getTrackCount() const;
>
> /**
> * \brief Get the width used for rendering.
> @@ -251,7 +247,7 @@ class MainWorkflow : public QObject
> */
> void stopFrameComputing();
>
> - TrackWorkflow *track( Workflow::TrackType type, quint32 trackId );
> + TrackWorkflow *track( quint32 trackId );
>
> const Workflow::Frame *blackOutput() const;
>
> @@ -276,13 +272,13 @@ class MainWorkflow : public QObject
> * \param trackType : the track type (audio or video)
> * \returns The clip helper that matches the given UUID, or nullptr.
> */
> - ClipHelper* getClipHelper( const QUuid& uuid, unsigned int trackId,
> - Workflow::TrackType trackType );
> + ClipHelper* getClipHelper( const QUuid& uuid, unsigned int trackId );
>
> void preSave();
> void postLoad();
>
> private:
> + QList<Toggleable<TrackWorkflow*>> m_tracks;
> /// Pre-filled buffer used when there's nothing to render
> Workflow::Frame *m_blackOutput;
>
> @@ -304,9 +300,6 @@ class MainWorkflow : public QObject
> /// This boolean describe is a render has been started
> bool m_renderStarted;
>
> - /// Contains the trackhandler, indexed by Workflow::TrackType
> - TrackHandler** m_tracks;
> -
> /// Width used for the render
> quint32 m_width;
> /// Height used for the render
> @@ -314,6 +307,8 @@ class MainWorkflow : public QObject
> /// Store the number of track for each track type.
> const quint32 m_trackCount;
>
> + bool m_endReached;
> +
> Settings* m_settings;
>
> private slots:
> diff --git a/src/Workflow/TrackWorkflow.cpp b/src/Workflow/TrackWorkflow.cpp
> index acb2e2d..295fc75 100644
> --- a/src/Workflow/TrackWorkflow.cpp
> +++ b/src/Workflow/TrackWorkflow.cpp
> @@ -44,10 +44,9 @@
> #include <QReadLocker>
> #include <QMutex>
>
> -TrackWorkflow::TrackWorkflow( Workflow::TrackType type, quint32 trackId ) :
> +TrackWorkflow::TrackWorkflow( quint32 trackId ) :
> m_length( 0 ),
> - m_trackType( type ),
> - m_lastFrame( 0 ),
> + m_trackType( Workflow::NbTrackType ),
> m_trackId( trackId )
> {
> m_clipsLock = new QReadWriteLock;
> @@ -80,15 +79,21 @@ void
> TrackWorkflow::addClip( ClipHelper* ch, qint64 start )
> {
> ClipWorkflow* cw;
> - if ( m_trackType == Workflow::VideoTrack )
> - {
> - if ( ch->clip()->media()->fileType() == Media::Video )
> + if ( ch->clip()->media()->fileType() == Media::FileType::Video )
> + // FIXME: This whole if statement will be gone as soon as I implement a united ClipWorkflow,
> + // which can generate both audio and video buffers.
> + if ( ch->formats() & ClipHelper::Video )
> cw = new VideoClipWorkflow( ch );
> + else if ( ch->formats() & ClipHelper::Audio )
> + cw = new AudioClipWorkflow( ch );
> else
> - cw = new ImageClipWorkflow( ch );
> - }
> - else
> + vlmcFatal( "Nothing to render from this clip!" );
> + else if ( ch->clip()->media()->fileType() == Media::FileType::Audio )
> cw = new AudioClipWorkflow( ch );
> + else if ( ch->clip()->media()->fileType() == Media::FileType::Image )
> + cw = new ImageClipWorkflow( ch );
> + else
> + vlmcFatal( "Unknown file type!" );
> ch->setClipWorkflow( cw );
> addClip( cw, start );
> }
> @@ -268,7 +273,7 @@ TrackWorkflow::stop()
> }
>
> Workflow::OutputBuffer*
> -TrackWorkflow::getOutput( qint64 currentFrame, qint64 subFrame, bool paused )
> +TrackWorkflow::getOutput( Workflow::TrackType trackType, qint64 currentFrame, qint64 subFrame, bool paused )
> {
> QReadLocker lock( m_clipsLock );
>
> @@ -301,12 +306,19 @@ TrackWorkflow::getOutput( qint64 currentFrame, qint64 subFrame, bool paused )
> {
> qint64 start = it.key();
> ClipWorkflow* cw = it.value();
> +
> + if ( trackType != cw->type() )
> + {
> + ++it;
> + continue ;
> + }
> +
> //Is the clip supposed to render now?
> if ( start <= currentFrame && currentFrame <= start + cw->getClipHelper()->length() )
> {
> ret = renderClip( cw, currentFrame, start, needRepositioning,
> renderOneFrame, paused );
> - if ( m_trackType == Workflow::VideoTrack )
> + if ( trackType == Workflow::VideoTrack )
> {
> frames[frameId] = static_cast<Workflow::Frame*>( ret );
> ++frameId;
> @@ -322,7 +334,7 @@ TrackWorkflow::getOutput( qint64 currentFrame, qint64 subFrame, bool paused )
> ++it;
> }
> //Handle mixers:
> - if ( m_trackType == Workflow::VideoTrack )
> + if ( trackType == Workflow::VideoTrack )
> {
> EffectHelper* mixer = getMixer( currentFrame );
> if ( mixer != nullptr && frames[0] != nullptr ) //There's no point using the mixer if there's no frame rendered.
> diff --git a/src/Workflow/TrackWorkflow.h b/src/Workflow/TrackWorkflow.h
> index 4569c75..6f51cb6 100644
> --- a/src/Workflow/TrackWorkflow.h
> +++ b/src/Workflow/TrackWorkflow.h
> @@ -49,10 +49,10 @@ class TrackWorkflow : public EffectUser
> Q_OBJECT
>
> public:
> - TrackWorkflow( Workflow::TrackType type, quint32 trackId );
> + TrackWorkflow( quint32 trackId );
> ~TrackWorkflow();
>
> - Workflow::OutputBuffer *getOutput( qint64 currentFrame,
> + Workflow::OutputBuffer *getOutput( Workflow::TrackType trackType, qint64 currentFrame,
> qint64 subFrame, bool paused );
> qint64 getLength() const;
> void stop();
>
Hey!
So, just for the sake of sureness, starting from this commit, we have
tracks that can contain audio & video, and the separation is gone. Correct?
I assume the UI must behave in funny ways now, but that's ok for now :)
More information about the Vlmc-devel
mailing list