Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
VLMC
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
21
Issues
21
List
Boards
Labels
Service Desk
Milestones
Merge Requests
2
Merge Requests
2
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
VideoLAN
VLMC
Commits
373d7a68
Commit
373d7a68
authored
Jul 30, 2009
by
Hugo Beauzee-Luyssen
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
More work on next frame process, though it kinda crash/don't work/warps...
parent
72a5bf84
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
131 additions
and
61 deletions
+131
-61
src/LibVLCpp/VLCMediaPlayer.cpp
src/LibVLCpp/VLCMediaPlayer.cpp
+0
-1
src/Workflow/ClipWorkflow.cpp
src/Workflow/ClipWorkflow.cpp
+34
-6
src/Workflow/ClipWorkflow.h
src/Workflow/ClipWorkflow.h
+8
-3
src/Workflow/MainWorkflow.cpp
src/Workflow/MainWorkflow.cpp
+9
-9
src/Workflow/MainWorkflow.h
src/Workflow/MainWorkflow.h
+1
-0
src/Workflow/TrackWorkflow.cpp
src/Workflow/TrackWorkflow.cpp
+29
-25
src/renderer/WorkflowRenderer.cpp
src/renderer/WorkflowRenderer.cpp
+46
-17
src/renderer/WorkflowRenderer.h
src/renderer/WorkflowRenderer.h
+4
-0
No files found.
src/LibVLCpp/VLCMediaPlayer.cpp
View file @
373d7a68
...
...
@@ -84,7 +84,6 @@ void MediaPlayer::callbacks( const libvlc_event_t* ev
MediaPlayer
*
self
=
reinterpret_cast
<
MediaPlayer
*>
(
ptr
);
switch
(
event
->
type
)
{
qDebug
()
<<
"Event received"
<<
event
->
type
;
case
libvlc_MediaPlayerPlaying
:
qDebug
()
<<
"Media player playing"
;
self
->
emit
playing
();
...
...
src/Workflow/ClipWorkflow.cpp
View file @
373d7a68
...
...
@@ -43,6 +43,7 @@ ClipWorkflow::ClipWorkflow( Clip::Clip* clip ) :
m_initWaitCond
=
new
WaitCondition
;
m_renderWaitCond
=
new
WaitCondition
;
m_pausingStateWaitCond
=
new
WaitCondition
;
m_pausedThreadCondWait
=
new
WaitCondition
;
// m_backBufferLock = new QReadWriteLock;
}
...
...
@@ -50,6 +51,7 @@ ClipWorkflow::~ClipWorkflow()
{
// delete[] m_backBuffer;
// delete m_backBufferLock;
delete
m_pausedThreadCondWait
;
delete
m_pausingStateWaitCond
;
delete
m_initWaitCond
;
delete
m_condMutex
;
...
...
@@ -73,7 +75,7 @@ void ClipWorkflow::checkStateChange()
QWriteLocker
lock2
(
m_stateLock
);
if
(
m_requiredState
!=
ClipWorkflow
::
None
)
{
//
qDebug() << "Changed state from" << m_state << "to state" << m_requiredState;
qDebug
()
<<
"Changed state from"
<<
m_state
<<
"to state"
<<
m_requiredState
;
m_state
=
m_requiredState
;
m_requiredState
=
ClipWorkflow
::
None
;
checkSynchronisation
(
m_state
);
...
...
@@ -91,12 +93,13 @@ void ClipWorkflow::lock( ClipWorkflow* cw, void** pp_ret )
// else
// {
*
pp_ret
=
cw
->
m_buffer
;
//
qDebug() << "Clip workflow locking <<<<<<<<<<<<<<<<<<<<<<<<<<";
qDebug
()
<<
"Clip workflow locking <<<<<<<<<<<<<<<<<<<<<<<<<<"
;
// }
}
void
ClipWorkflow
::
unlock
(
ClipWorkflow
*
cw
)
{
qDebug
()
<<
"ClipWorkflow::unlock()"
;
cw
->
m_stateLock
->
lockForWrite
();
// if ( cw->m_oneFrameOnly )
...
...
@@ -116,10 +119,10 @@ void ClipWorkflow::unlock( ClipWorkflow* cw )
cw
->
m_stateLock
->
unlock
();
//Signal that render has been completed.
cw
->
m_renderWaitCond
->
wake
();
qDebug
()
<<
"
R
ender completed"
;
qDebug
()
<<
"
Clip r
ender completed"
;
cw
->
emit
renderComplete
(
cw
);
qDebug
()
<<
"Entering condwait"
;
//
qDebug() << "Entering condwait";
cw
->
m_waitCond
->
wait
(
cw
->
m_condMutex
);
// qDebug() << "Leaved condwait";
cw
->
m_stateLock
->
lockForWrite
();
...
...
@@ -132,11 +135,19 @@ void ClipWorkflow::unlock( ClipWorkflow* cw )
}
else
if
(
cw
->
m_state
==
Paused
)
{
QMutexLocker
lock
(
cw
->
m_condMutex
);
cw
->
m_stateLock
->
unlock
();
qDebug
()
<<
"Entering forced pause condwait"
;
cw
->
setState
(
ClipWorkflow
::
ThreadPaused
);
cw
->
m_pausedThreadCondWait
->
wake
();
cw
->
m_waitCond
->
wait
(
cw
->
m_condMutex
);
qDebug
()
<<
"Leaving forced pause condwait"
;
cw
->
setState
(
ClipWorkflow
::
Paused
);
}
else
cw
->
m_stateLock
->
unlock
();
qDebug
()
<<
"End of the ClipWorkflow::unlock()"
;
cw
->
checkStateChange
();
}
...
...
@@ -209,6 +220,12 @@ bool ClipWorkflow::isPausing() const
return
m_state
==
ClipWorkflow
::
Pausing
;
}
bool
ClipWorkflow
::
isThreadPaused
()
const
{
QReadLocker
lock
(
m_stateLock
);
return
m_state
==
ClipWorkflow
::
ThreadPaused
;
}
bool
ClipWorkflow
::
isEndReached
()
const
{
QReadLocker
lock
(
m_stateLock
);
...
...
@@ -337,7 +354,10 @@ void ClipWorkflow::unpause( bool wakeRenderThread /*= true*/ )
// QMutexLocker lock( m_requiredStateLock );
// m_requiredState = ClipWorkflow::None;
if
(
wakeRenderThread
==
true
)
{
qDebug
()
<<
"Unpausing and waking thread"
;
wake
();
}
}
//void ClipWorkflow::activateOneFrameOnly()
...
...
@@ -346,10 +366,12 @@ void ClipWorkflow::unpause( bool wakeRenderThread /*= true*/ )
// m_oneFrameOnly = 1;
//}
void
ClipWorkflow
::
waitForCompleteRender
()
void
ClipWorkflow
::
waitForCompleteRender
(
bool
dontCheckRenderStarted
/*= false*/
)
{
if
(
isRendering
()
==
true
)
if
(
isRendering
()
==
true
||
dontCheckRenderStarted
==
true
)
m_renderWaitCond
->
wait
();
else
qDebug
()
<<
"waitForCompleteRender(), not rendering. State == "
<<
getState
();
}
void
ClipWorkflow
::
waitForCompleteInit
()
...
...
@@ -364,6 +386,12 @@ void ClipWorkflow::waitForPausingState()
m_pausingStateWaitCond
->
wait
();
}
void
ClipWorkflow
::
waitForPausedThread
()
{
if
(
isThreadPaused
()
==
false
)
m_pausedThreadCondWait
->
wait
();
}
QMutex
*
ClipWorkflow
::
getSleepMutex
()
{
return
m_condMutex
;
...
...
src/Workflow/ClipWorkflow.h
View file @
373d7a68
...
...
@@ -52,8 +52,9 @@ class ClipWorkflow : public QObject
Sleeping
,
//4
Pausing
,
//5
Paused
,
//6
Stopping
,
//7
EndReached
,
//8
ThreadPaused
,
//7
Stopping
,
//8
EndReached
,
//9
};
int
debugId
;
...
...
@@ -93,6 +94,8 @@ class ClipWorkflow : public QObject
bool
isPausing
()
const
;
bool
isThreadPaused
()
const
;
/**
* Returns the current workflow state.
* Be carrefull, as this function is NOT thread safe, and return the
...
...
@@ -150,8 +153,9 @@ class ClipWorkflow : public QObject
void
unpause
(
bool
wakeRenderThread
=
true
);
void
waitForCompleteInit
();
void
waitForCompleteRender
();
void
waitForCompleteRender
(
bool
dontCheckRenderStarted
=
false
);
void
waitForPausingState
();
void
waitForPausedThread
();
QMutex
*
getSleepMutex
();
LibVLCpp
::
MediaPlayer
*
getMediaPlayer
();
...
...
@@ -205,6 +209,7 @@ class ClipWorkflow : public QObject
WaitCondition
*
m_initWaitCond
;
WaitCondition
*
m_renderWaitCond
;
WaitCondition
*
m_pausingStateWaitCond
;
WaitCondition
*
m_pausedThreadCondWait
;
private
slots
:
void
pauseAfterPlaybackStarted
();
...
...
src/Workflow/MainWorkflow.cpp
View file @
373d7a68
...
...
@@ -134,14 +134,10 @@ unsigned char* MainWorkflow::getOutput()
if
(
ret
==
NULL
)
ret
=
MainWorkflow
::
blackOutput
;
nextFrame
();
qDebug
()
<<
"Getoutput complete"
;
return
ret
;
}
else
{
qDebug
()
<<
"Getoutput empty"
;
return
MainWorkflow
::
blackOutput
;
}
}
void
MainWorkflow
::
pause
()
...
...
@@ -161,6 +157,7 @@ void MainWorkflow::pause()
void
MainWorkflow
::
nextFrame
()
{
qDebug
()
<<
"Going to the next frame"
;
++
m_currentFrame
;
//FIXME: This is probably a bit much...
emit
frameChanged
(
m_currentFrame
);
...
...
@@ -169,6 +166,7 @@ void MainWorkflow::nextFrame()
void
MainWorkflow
::
previousFrame
()
{
qDebug
()
<<
"Going to the previous frame"
;
--
m_currentFrame
;
//FIXME: This is probably a bit much...
emit
frameChanged
(
m_currentFrame
);
...
...
@@ -266,7 +264,7 @@ void MainWorkflow::clipMoved( QUuid clipUuid, int oldTrack, int newTra
void
MainWorkflow
::
activateOneFrameOnly
()
{
for
(
unsigned
int
i
=
0
;
i
<
m_trackCount
;
++
i
)
for
(
unsigned
int
i
=
0
;
i
<
m_trackCount
;
++
i
)
{
//FIXME: After debugging period, this should'nt be necessary --
if
(
m_tracks
[
i
].
activated
()
==
true
)
...
...
@@ -277,8 +275,9 @@ void MainWorkflow::activateOneFrameOnly()
void
MainWorkflow
::
trackPaused
()
{
m_nbTracksToPause
.
fetchAndAddAcquire
(
-
1
);
if
(
m_nbTracksToPause
=
=
0
)
if
(
m_nbTracksToPause
<
=
0
)
{
qDebug
()
<<
"MainWorkflow is paused"
;
emit
mainWorkflowPaused
();
}
}
...
...
@@ -299,15 +298,16 @@ void MainWorkflow::tracksRenderCompleted( unsigned int trackId )
//therefore, m_nbTracksToRender will be equal to -1
if
(
m_nbTracksToRender
<=
0
)
{
qDebug
()
<<
"MainWorkflow render
completed
"
;
qDebug
()
<<
"MainWorkflow render
is completed. Acquiring synchronization lock
"
;
//Just a synchronisation barriere
{
QMutexLocker
lock
(
m_synchroneRenderWaitConditionMutex
);
}
qDebug
()
<<
"Waking synchronisation threads"
;
m_synchroneRenderWaitCondition
->
wakeAll
();
}
else
qDebug
()
<<
m_nbTracksToRender
<<
"tracks left to render"
;
//
else
//
qDebug() << m_nbTracksToRender << "tracks left to render";
}
unsigned
char
*
MainWorkflow
::
getSynchroneOutput
()
...
...
src/Workflow/MainWorkflow.h
View file @
373d7a68
...
...
@@ -83,6 +83,7 @@ class MainWorkflow : public QObject, public Singleton<MainWorkflow>
private:
static
MainWorkflow
*
m_instance
;
// QAtomicInt m_oneFrameOnly;
private:
void
computeLength
();
...
...
src/Workflow/TrackWorkflow.cpp
View file @
373d7a68
...
...
@@ -90,7 +90,7 @@ unsigned char* TrackWorkflow::renderClip( ClipWorkflow* cw, qint64 currentF
cw
->
getStateLock
()
->
lockForRead
();
//
qDebug() << "Rendering clip";
qDebug
()
<<
"Rendering clip"
;
if
(
cw
->
getState
()
==
ClipWorkflow
::
Paused
&&
pauseAfterRender
==
false
)
{
cw
->
getStateLock
()
->
unlock
();
...
...
@@ -102,7 +102,7 @@ unsigned char* TrackWorkflow::renderClip( ClipWorkflow* cw, qint64 currentF
}
if
(
cw
->
getState
()
==
ClipWorkflow
::
Rendering
)
{
qDebug
()
<<
"Rendering a 'Rendering' ClipWorkflow"
;
//
qDebug() << "Rendering a 'Rendering' ClipWorkflow";
//The rendering state meens... whell it means that the frame is
//beeing rendered, so we wait.
cw
->
getStateLock
()
->
unlock
();
...
...
@@ -116,7 +116,9 @@ unsigned char* TrackWorkflow::renderClip( ClipWorkflow* cw, qint64 currentF
//If frame has been rendered :
if
(
cw
->
getState
()
==
ClipWorkflow
::
Sleeping
||
pauseAfterRender
==
true
)
{
qDebug
()
<<
"renderign a sleeping clip worjkflow"
;
// qDebug() << "rendering a sleeping clip workflow";
if
(
pauseAfterRender
==
true
)
qDebug
()
<<
"Rendering only one frame"
;
cw
->
getStateLock
()
->
unlock
();
if
(
needRepositioning
==
true
)
...
...
@@ -125,16 +127,26 @@ unsigned char* TrackWorkflow::renderClip( ClipWorkflow* cw, qint64 currentF
cw
->
setPosition
(
pos
);
}
ret
=
cw
->
getOutput
();
if
(
pauseAfterRender
==
tru
e
)
if
(
pauseAfterRender
==
fals
e
)
{
cw
->
unpause
(
false
);
// qDebug() << "Querying state back to pause after render";
cw
->
queryStateChange
(
ClipWorkflow
::
Paused
);
QMutexLocker
lock
(
cw
->
getSleepMutex
()
);
cw
->
wake
();
}
else
{
QMutexLocker
lock
(
cw
->
getSleepMutex
()
);
cw
->
queryStateChange
(
ClipWorkflow
::
Rendering
);
// cw->unpause( true );
cw
->
getMediaPlayer
()
->
pause
();
cw
->
wake
();
qDebug
()
<<
"Waiting for render now..."
;
cw
->
waitForCompleteRender
(
true
);
{
QMutexLocker
lock
(
cw
->
getSleepMutex
()
);
}
qDebug
()
<<
"Querying state back to pause after render"
;
cw
->
queryStateChange
(
ClipWorkflow
::
Paused
);
cw
->
wake
();
}
cw
->
wake
();
}
else
if
(
cw
->
getState
()
==
ClipWorkflow
::
Stopped
)
{
...
...
@@ -267,7 +279,6 @@ void TrackWorkflow::stop()
unsigned
char
*
TrackWorkflow
::
getOutput
(
qint64
currentFrame
)
{
qDebug
()
<<
"Getting track output"
;
QReadLocker
lock
(
m_clipsLock
);
unsigned
char
*
ret
=
NULL
;
...
...
@@ -278,7 +289,10 @@ unsigned char* TrackWorkflow::getOutput( qint64 currentFrame )
bool
oneFrameOnlyFlag
=
false
;
if
(
m_oneFrameOnly
==
1
)
{
qDebug
()
<<
"Activating oneFrameOnlyFlag"
;
oneFrameOnlyFlag
=
true
;
}
if
(
checkEnd
(
currentFrame
)
==
true
)
{
emit
trackEndReached
(
m_trackId
);
...
...
@@ -330,14 +344,7 @@ unsigned char* TrackWorkflow::getOutput( qint64 currentFrame )
m_oneFrameOnly
=
0
;
}
if
(
ret
==
NULL
)
{
qDebug
()
<<
"No output"
;
clipWorkflowRenderCompleted
(
NULL
);
}
else
{
qDebug
()
<<
"Got output"
;
}
return
ret
;
}
...
...
@@ -381,6 +388,9 @@ void TrackWorkflow::pauseClipWorkflow( ClipWorkflow* cw )
}
cw
->
waitForPausingState
();
cw
->
pause
();
qDebug
()
<<
"Wait for pausedthread state"
;
cw
->
waitForPausedThread
();
qDebug
()
<<
"Ok thread is paused"
;
}
void
TrackWorkflow
::
pause
()
...
...
@@ -493,15 +503,9 @@ void TrackWorkflow::clipWorkflowRenderCompleted( ClipWorkflow* cw )
//When there is nothing to render, m_nbClipToRender will be equal to one here, so we check for minus
//or equal to 0
if
(
m_nbClipToRender
<=
0
)
{
qDebug
()
<<
"TrackWorkflow render is completed. Buffer ="
<<
(
void
*
)
m_synchroneRenderBuffer
;
emit
renderCompleted
(
m_trackId
);
}
else
{
qDebug
()
<<
"Trackworfklow render isn't complete yet."
<<
m_nbClipToRender
<<
"cw remaining"
;
}
qDebug
()
<<
"End of method"
;
// else
// qDebug() << "Trackworfklow render isn't complete yet." << m_nbClipToRender << "cw remaining";
}
unsigned
char
*
TrackWorkflow
::
getSynchroneOutput
()
...
...
src/renderer/WorkflowRenderer.cpp
View file @
373d7a68
...
...
@@ -84,7 +84,6 @@ WorkflowRenderer::~WorkflowRenderer()
void
*
WorkflowRenderer
::
lock
(
void
*
datas
)
{
qDebug
()
<<
"WorkflowRenderer::lock()"
;
WorkflowRenderer
*
self
=
reinterpret_cast
<
WorkflowRenderer
*>
(
datas
);
//If we're not playing, then where in a paused media player.
...
...
@@ -95,7 +94,14 @@ void* WorkflowRenderer::lock( void* datas )
}
if
(
self
->
m_oneFrameOnly
<
2
)
{
void
*
ret
=
self
->
m_mainWorkflow
->
getSynchroneOutput
();
void
*
ret
;
// if ( self->m_oneFrameOnly == 0 )
// ret = self->m_mainWorkflow->getOutput();
// else
// {
// qDebug() << "Asking synchrone frame";
ret
=
self
->
m_mainWorkflow
->
getSynchroneOutput
();
// }
self
->
m_lastFrame
=
static_cast
<
unsigned
char
*>
(
ret
);
qDebug
()
<<
"Returning new frame"
;
return
ret
;
...
...
@@ -109,11 +115,11 @@ void* WorkflowRenderer::lock( void* datas )
void
WorkflowRenderer
::
unlock
(
void
*
datas
)
{
qDebug
()
<<
__func__
;
WorkflowRenderer
*
self
=
reinterpret_cast
<
WorkflowRenderer
*>
(
datas
);
if
(
self
->
m_oneFrameOnly
==
1
)
{
self
->
m_mediaPlayer
->
pause
();
qDebug
()
<<
"Pausing back"
;
self
->
togglePlayPause
(
true
);
qDebug
()
<<
"Switching m_oneFrameOnly flag to 2"
;
self
->
m_oneFrameOnly
=
2
;
}
...
...
@@ -174,19 +180,45 @@ void WorkflowRenderer::setPosition( float newPos )
m_mainWorkflow
->
setPosition
(
newPos
);
}
void
WorkflowRenderer
::
nextFrame
()
void
WorkflowRenderer
::
frameByFrameAfterPaused
()
{
// qDebug() << "Next frame :";
qDebug
()
<<
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
;
qDebug
()
<<
"Activatin one frame only"
;
m_oneFrameOnly
=
1
;
m_mainWorkflow
->
nextFrame
();
// qDebug() << "Activatign one frame only";
m_mainWorkflow
->
activateOneFrameOnly
();
//Both media players should be stopped now... restauring playback
// m_framePlayed = 0;
m_mediaPlayer
->
pause
();
// while ( m_framePlayed == 0 )
// SleepMS( 1 );
// m_mediaPlayer->pause();
// m_mainWorkflow->nextFrame();
qDebug
()
<<
"Unpausing everything"
;
togglePlayPause
(
false
);
}
void
WorkflowRenderer
::
frameByFramePausingProxy
()
{
static
unsigned
int
nbPaused
=
0
;
++
nbPaused
;
if
(
nbPaused
==
2
)
{
nbPaused
=
0
;
frameByFrameAfterPaused
();
}
}
void
WorkflowRenderer
::
nextFrame
()
{
qDebug
()
<<
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
;
if
(
m_pausedMediaPlayer
==
true
)
{
qDebug
()
<<
"Already paused media player"
;
frameByFrameAfterPaused
();
}
else
{
qDebug
()
<<
"Waiting for paused media player"
;
connect
(
m_mediaPlayer
,
SIGNAL
(
paused
()
),
this
,
SLOT
(
frameByFramePausingProxy
()
),
Qt
::
QueuedConnection
);
connect
(
m_mainWorkflow
,
SIGNAL
(
mainWorkflowPaused
()
),
this
,
SLOT
(
frameByFramePausingProxy
()
),
Qt
::
QueuedConnection
);
togglePlayPause
(
true
);
}
}
void
WorkflowRenderer
::
previousFrame
()
...
...
@@ -196,10 +228,8 @@ void WorkflowRenderer::previousFrame()
void
WorkflowRenderer
::
pauseMainWorkflow
()
{
qDebug
()
<<
"Pausing main workflow, setting m_pausedMediaPlayer to true... ?"
;
if
(
m_paused
==
true
)
return
;
qDebug
()
<<
"Indeed. Setting m_pausedMediaPlayer to true"
;
m_pausedMediaPlayer
=
true
;
m_mainWorkflow
->
pause
();
}
...
...
@@ -274,7 +304,6 @@ void WorkflowRenderer::__videoPaused()
void
WorkflowRenderer
::
__videoPlaying
()
{
emit
playing
();
qDebug
()
<<
"Setting m_pausedMediaPlayer to false"
;
m_pausedMediaPlayer
=
false
;
m_paused
=
false
;
}
...
...
src/renderer/WorkflowRenderer.h
View file @
373d7a68
...
...
@@ -66,6 +66,7 @@ class WorkflowRenderer : public GenericRenderer
void
pauseMainWorkflow
();
virtual
void
startPreview
();
void
checkActions
();
void
frameByFrameAfterPaused
();
private:
MainWorkflow
*
m_mainWorkflow
;
...
...
@@ -83,6 +84,9 @@ class WorkflowRenderer : public GenericRenderer
*/
bool
m_pausedMediaPlayer
;
private
slots
:
void
frameByFramePausingProxy
();
public
slots
:
void
setMedia
(
const
Media
*
){}
void
mediaUnloaded
(
const
QUuid
&
)
{}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment