diff --git a/src/Renderer/WorkflowRenderer.cpp b/src/Renderer/WorkflowRenderer.cpp index 1862423aeaaf66ff4837c9c0b95e5f20a0d4550f..b5c5dcdbd3d37fa7ccfaf4a9d1526334fe1cb3d8 100644 --- a/src/Renderer/WorkflowRenderer.cpp +++ b/src/Renderer/WorkflowRenderer.cpp @@ -39,7 +39,7 @@ WorkflowRenderer::WorkflowRenderer() : m_media = new LibVLCpp::Media( "fake://" ); sprintf( buffer, ":invmem-width=%i", VIDEOWIDTH ); - m_media->addOption( ":codec=invmem,inamem" ); + m_media->addOption( ":codec=invmem" ); m_media->addOption( buffer ); sprintf( buffer, ":invmem-height=%i", VIDEOHEIGHT ); m_media->addOption( buffer ); diff --git a/src/Workflow/MainWorkflow.cpp b/src/Workflow/MainWorkflow.cpp index 9a3b211926e85e5bce68f9fa725b906e8e1b66a4..2c251ec613d952a143d6b984fedf8d8232ca1220 100644 --- a/src/Workflow/MainWorkflow.cpp +++ b/src/Workflow/MainWorkflow.cpp @@ -39,17 +39,19 @@ MainWorkflow::MainWorkflow( int trackCount ) : m_renderMutex = new QMutex; m_synchroneRenderWaitCondition = new QWaitCondition; m_synchroneRenderWaitConditionMutex = new QMutex; - m_tracks = new TrackHandler*[2]; + + m_effectEngine = new EffectsEngine; + m_effectEngine->disable(); + + m_tracks = new TrackHandler*[TrackWorkflow::NbType]; for ( unsigned int i = 0; i < TrackWorkflow::NbType; ++i ) { TrackWorkflow::TrackType trackType = (i == 0 ? TrackWorkflow::Video : TrackWorkflow::Audio ); - m_tracks[i] = new TrackHandler( trackCount, trackType ); + m_tracks[i] = new TrackHandler( trackCount, trackType, m_effectEngine ); connect( m_tracks[i], SIGNAL( tracksPaused() ), this, SLOT( tracksPaused() ) ); connect( m_tracks[i], SIGNAL( allTracksRenderCompleted() ), this, SLOT( tracksRenderCompleted() ) ); } m_outputBuffers = new OutputBuffers; - m_effectEngine = new EffectsEngine; - m_effectEngine->disable(); } MainWorkflow::~MainWorkflow() @@ -212,6 +214,7 @@ MainWorkflow::OutputBuffers* MainWorkflow::getSynchroneOutput() m_synchroneRenderWaitConditionMutex->unlock(); m_outputBuffers->video = reinterpret_cast( m_tracks[TrackWorkflow::Video]->getSynchroneOutput() ); m_outputBuffers->audio = reinterpret_cast( m_tracks[TrackWorkflow::Audio]->getSynchroneOutput() ); + qDebug() << "video ptr:" << (void*) m_outputBuffers->video; return m_outputBuffers; } diff --git a/src/Workflow/TrackHandler.cpp b/src/Workflow/TrackHandler.cpp index 545627a4f5db21c41b4e991fc1776ca17e315a30..ae8359d2724b099c020d2dfec89a2ff069009267 100644 --- a/src/Workflow/TrackHandler.cpp +++ b/src/Workflow/TrackHandler.cpp @@ -22,11 +22,16 @@ #include "TrackHandler.h" -TrackHandler::TrackHandler( unsigned int nbTracks, TrackWorkflow::TrackType trackType ) : +LightVideoFrame* TrackHandler::nullOutput = NULL; + +TrackHandler::TrackHandler( unsigned int nbTracks, TrackWorkflow::TrackType trackType, EffectsEngine* effectsEngine ) : m_trackCount( nbTracks ), m_trackType( trackType ), - m_length( 0 ) + m_length( 0 ), + m_effectEngine( effectsEngine ) { + TrackHandler::nullOutput = new LightVideoFrame(); + m_tracks = new Toggleable[nbTracks]; for ( unsigned int i = 0; i < nbTracks; ++i ) { @@ -38,11 +43,11 @@ TrackHandler::TrackHandler( unsigned int nbTracks, TrackWorkflow::TrackType trac } m_highestTrackNumberMutex = new QMutex; m_nbTracksToRenderMutex = new QMutex; - } TrackHandler::~TrackHandler() { + delete nullOutput; delete m_highestTrackNumberMutex; delete m_nbTracksToRenderMutex; @@ -288,11 +293,20 @@ void TrackHandler::tracksRenderCompleted( unsigned int trackId ) { QMutexLocker lock( m_highestTrackNumberMutex ); - unsigned char* buff = m_tracks[trackId]->getSynchroneOutput(); - if ( m_highestTrackNumber <= trackId && buff != NULL ) + if ( m_trackType == TrackWorkflow::Video ) + { + LightVideoFrame* buff = reinterpret_cast( m_tracks[trackId]->getSynchroneOutput() ); + if ( buff == NULL ) + m_effectEngine->setInputFrame( *TrackHandler::nullOutput, trackId ); + else + { + qDebug() << "About to feed effect engine with frame" << (void*)buff; + m_effectEngine->setInputFrame( *buff, trackId ); + } + } + else { - m_highestTrackNumber = trackId; - m_synchroneRenderingBuffer = buff;; + qDebug() << "Audio isn't implemented yet !"; } } //We check for minus or equal, since we can have 0 frame to compute, diff --git a/src/Workflow/TrackHandler.h b/src/Workflow/TrackHandler.h index 591e6a20c64f6f8b9faae59c04a03bd457e28c7e..d21cc5d370d84bdef3f38b46e823ff64f47ba78a 100644 --- a/src/Workflow/TrackHandler.h +++ b/src/Workflow/TrackHandler.h @@ -26,13 +26,13 @@ #include #include "Toggleable.hpp" #include "TrackWorkflow.h" - +#include "EffectsEngine.h" class TrackHandler : public QObject { Q_OBJECT public: - TrackHandler( unsigned int nbTracks, TrackWorkflow::TrackType trackType ); + TrackHandler( unsigned int nbTracks, TrackWorkflow::TrackType trackType, EffectsEngine* effectsEngine ); ~TrackHandler(); void addClip( Clip* clip, unsigned int trackId, qint64 start ); @@ -66,6 +66,7 @@ class TrackHandler : public QObject void activateTrack( unsigned int tracKId ); private: + static LightVideoFrame* nullOutput; Toggleable* m_tracks; unsigned int m_trackCount; QAtomicInt m_nbTracksToPause; @@ -84,6 +85,7 @@ class TrackHandler : public QObject * This is for internal synchronisation only. */ bool m_renderCompleted; + EffectsEngine* m_effectEngine; private slots: diff --git a/src/Workflow/TrackWorkflow.cpp b/src/Workflow/TrackWorkflow.cpp index dc87b59b8a6ed4622f124e80e41ff9da8a5082f8..15698bad95f9f719992c87ba52531ee9adb11f75 100644 --- a/src/Workflow/TrackWorkflow.cpp +++ b/src/Workflow/TrackWorkflow.cpp @@ -461,7 +461,7 @@ void TrackWorkflow::clipWorkflowRenderCompleted( ClipWorkflow* cw ) // qDebug() << "Clip [" << QObject::sender() << "] render is completed on track" << m_trackId; if ( cw != NULL ) { - m_synchroneRenderBuffer = reinterpret_cast( cw->getOutput() ); + m_synchroneRenderBuffer = cw->getOutput(); } else { @@ -479,7 +479,7 @@ void TrackWorkflow::clipWorkflowRenderCompleted( ClipWorkflow* cw ) // qDebug() << "Track render not completed yet"; } -unsigned char* TrackWorkflow::getSynchroneOutput() +void* TrackWorkflow::getSynchroneOutput() { return m_synchroneRenderBuffer; } diff --git a/src/Workflow/TrackWorkflow.h b/src/Workflow/TrackWorkflow.h index ba92f529a45305945433b5da89f43eafabd41a31..e35ff4af4763e50c6225f5eff9c9ad6e03547b18 100644 --- a/src/Workflow/TrackWorkflow.h +++ b/src/Workflow/TrackWorkflow.h @@ -73,7 +73,7 @@ class TrackWorkflow : public QObject /** * Returns the output that has been computed in synchrone mode. */ - unsigned char* getSynchroneOutput(); + void* getSynchroneOutput(); //FIXME: this won't be reliable as soon as we change the fps from the configuration static const unsigned int nbFrameBeforePreload = 60; @@ -120,7 +120,7 @@ class TrackWorkflow : public QObject QAtomicInt m_nbClipToUnpause; QAtomicInt m_nbClipToRender; - unsigned char* m_synchroneRenderBuffer; + void* m_synchroneRenderBuffer; TrackType m_trackType; diff --git a/src/Workflow/VideoClipWorkflow.cpp b/src/Workflow/VideoClipWorkflow.cpp index f9fc3b0e9202e48da6f9065841dce91bf75c647b..799f1145949d199b69e19679ed7040b08f3a2ae3 100644 --- a/src/Workflow/VideoClipWorkflow.cpp +++ b/src/Workflow/VideoClipWorkflow.cpp @@ -81,7 +81,11 @@ void* VideoClipWorkflow::getOutput() QMutexLocker lock( m_renderLock ); if ( isEndReached() == true ) + { + qDebug()<< "End reached is true, returning NULL"; return NULL; + } + qDebug() << "ptr:" << (void*)m_buffer; return m_buffer; } @@ -90,7 +94,7 @@ void VideoClipWorkflow::lock( VideoClipWorkflow* cw, void** pp_ret, int size Q_UNUSED( size ); cw->m_renderLock->lock(); *pp_ret = (*(cw->m_buffer))->frame.pixels; -// qDebug() << '[' << (void*)cw << "] ClipWorkflow::lock"; + qDebug() << '[' << (void*)cw << "] ClipWorkflow::lock"; } void VideoClipWorkflow::unlock( VideoClipWorkflow* cw, void* buffer, int width, int height, int bpp, int size ) @@ -115,7 +119,7 @@ void VideoClipWorkflow::unlock( VideoClipWorkflow* cw, void* buffer, int widt cw->m_renderWaitCond->wake(); } cw->emit renderComplete( cw ); -// qDebug() << "Emmiting render completed"; + qDebug() << "Emmiting render completed"; // qDebug() << "Entering cond wait"; cw->m_waitCond->wait( cw->m_condMutex );