handle decoding multiple frames in one Update() when not threaded
This commit is contained in:
@@ -893,36 +893,45 @@ void MovieTexture_FFMpeg::DecoderThread()
|
|||||||
|
|
||||||
void MovieTexture_FFMpeg::Update(float fDeltaTime)
|
void MovieTexture_FFMpeg::Update(float fDeltaTime)
|
||||||
{
|
{
|
||||||
if( !m_bThreaded )
|
/* We might need to decode more than one frame per update. However, there
|
||||||
|
* have been bugs in ffmpeg that cause it to not handle EOF properly, which
|
||||||
|
* could make this never return, so let's play it safe. */
|
||||||
|
int iMax = 4;
|
||||||
|
while( --iMax )
|
||||||
{
|
{
|
||||||
/* If we don't have a frame decoded, decode one. */
|
if( !m_bThreaded )
|
||||||
if( m_ImageWaiting == FRAME_NONE )
|
|
||||||
DecodeFrame();
|
|
||||||
|
|
||||||
/* If we have a frame decoded, see if it's time to display it. */
|
|
||||||
if( m_ImageWaiting == FRAME_DECODED )
|
|
||||||
{
|
{
|
||||||
float fTime = CheckFrameTime();
|
/* If we don't have a frame decoded, decode one. */
|
||||||
if( fTime > 0 )
|
if( m_ImageWaiting == FRAME_NONE )
|
||||||
return;
|
DecodeFrame();
|
||||||
else if( fTime == -1 )
|
|
||||||
DiscardFrame();
|
/* If we have a frame decoded, see if it's time to display it. */
|
||||||
else
|
if( m_ImageWaiting == FRAME_DECODED )
|
||||||
ConvertFrame();
|
{
|
||||||
|
float fTime = CheckFrameTime();
|
||||||
|
if( fTime > 0 )
|
||||||
|
return;
|
||||||
|
else if( fTime == -1 )
|
||||||
|
DiscardFrame();
|
||||||
|
else
|
||||||
|
ConvertFrame();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Note that if there's an image waiting, we *must* signal m_BufferFinished, or
|
||||||
|
* the decoder thread may sit around waiting for it, even though Pause and Play
|
||||||
|
* calls, causing the clock to keep running. */
|
||||||
|
if( m_ImageWaiting != FRAME_WAITING )
|
||||||
|
return;
|
||||||
|
CHECKPOINT;
|
||||||
|
|
||||||
|
UpdateFrame();
|
||||||
|
|
||||||
|
if( m_bThreaded )
|
||||||
|
m_BufferFinished.Post();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Note that if there's an image waiting, we *must* signal m_BufferFinished, or
|
LOG->MapLog( "ffmpeg_looping", "MovieTexture_FFMpeg::Update looping" );
|
||||||
* the decoder thread may sit around waiting for it, even though Pause and Play
|
|
||||||
* calls, causing the clock to keep running. */
|
|
||||||
if( m_ImageWaiting != FRAME_WAITING )
|
|
||||||
return;
|
|
||||||
CHECKPOINT;
|
|
||||||
|
|
||||||
UpdateFrame();
|
|
||||||
|
|
||||||
if( m_bThreaded )
|
|
||||||
m_BufferFinished.Post();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Call from the main thread when m_ImageWaiting == FRAME_WAITING to update the
|
/* Call from the main thread when m_ImageWaiting == FRAME_WAITING to update the
|
||||||
|
|||||||
Reference in New Issue
Block a user