use RageSemaphore

This commit is contained in:
Glenn Maynard
2004-06-14 05:36:42 +00:00
parent 22fe9d6841
commit 4459d84a17
6 changed files with 30 additions and 50 deletions
@@ -20,7 +20,6 @@
#include "RageException.h"
#include "RageSurface.h"
#include "arch/Dialog/Dialog.h"
#include "SDL_utils.h"
#include <vfw.h> /* for GetVideoCodecDebugInfo */
#pragma comment(lib, "vfw32.lib")
@@ -123,7 +122,9 @@ static void GetVideoCodecDebugInfo()
// MovieTexture_DShow constructor
//-----------------------------------------------------------------------------
MovieTexture_DShow::MovieTexture_DShow( RageTextureID ID ) :
RageMovieTexture( ID )
RageMovieTexture( ID ),
buffer_lock( "buffer_lock", 1 ),
buffer_finished( "buffer_finished", 0 )
{
LOG->Trace( "RageBitmapTexture::RageBitmapTexture()" );
@@ -139,8 +140,6 @@ MovieTexture_DShow::MovieTexture_DShow( RageTextureID ID ) :
m_uTexHandle = 0;
buffer = NULL;
buffer_lock = SDL_CreateSemaphore(1);
buffer_finished = SDL_CreateSemaphore(0);
Create();
CreateFrameRects();
@@ -154,13 +153,13 @@ MovieTexture_DShow::MovieTexture_DShow( RageTextureID ID ) :
* for us to process a frame; do so. */
void MovieTexture_DShow::SkipUpdates()
{
while(SDL_SemTryWait(buffer_lock))
while( buffer_lock.TryWait() )
CheckFrame();
}
void MovieTexture_DShow::StopSkippingUpdates()
{
SDL_SemPost(buffer_lock);
buffer_lock.Post();
}
MovieTexture_DShow::~MovieTexture_DShow()
@@ -190,9 +189,6 @@ MovieTexture_DShow::~MovieTexture_DShow()
LOG->Flush();
if(m_uTexHandle)
DISPLAY->DeleteTexture( m_uTexHandle );
SDL_DestroySemaphore(buffer_lock);
SDL_DestroySemaphore(buffer_finished);
}
void MovieTexture_DShow::Reload()
@@ -247,7 +243,7 @@ void MovieTexture_DShow::CheckFrame()
CHECKPOINT;
/* Start the decoding thread again. */
SDL_SemPost(buffer_finished);
buffer_finished.Post();
CHECKPOINT;
}
@@ -403,7 +399,7 @@ void MovieTexture_DShow::Create()
Pause();
CHECKPOINT;
SDL_SemWait( pCTR->m_OneFrameDecoded );
pCTR->m_OneFrameDecoded.Wait();
CHECKPOINT;
CheckFrame();
CHECKPOINT;
@@ -418,7 +414,7 @@ void MovieTexture_DShow::NewData(const char *data)
ASSERT(data);
/* Try to lock. */
if(SDL_SemTryWait(buffer_lock))
if( buffer_lock.TryWait() )
{
/* The main thread is doing something uncommon, such as pausing.
* Drop this frame. */
@@ -427,11 +423,11 @@ void MovieTexture_DShow::NewData(const char *data)
buffer = data;
SDL_SemWait(buffer_finished);
buffer_finished.Wait();
ASSERT(buffer == NULL);
SDL_SemPost(buffer_lock);
buffer_lock.Post();
}
@@ -27,8 +27,6 @@ typedef char TCHAR, *PTCHAR;
#include "RageTexture.h"
#include "RageThreads.h"
#include "SDL_mutex.h"
//-----------------------------------------------------------------------------
// RageMovieTexture Class Declarations
//-----------------------------------------------------------------------------
@@ -55,7 +53,7 @@ public:
private:
const char *buffer;
SDL_sem *buffer_lock, *buffer_finished;
RageSemaphore buffer_lock, buffer_finished;
void Create();
@@ -10,21 +10,19 @@
struct __declspec(uuid("{71771540-2017-11cf-ae26-0020afd79767}")) CLSID_TextureRenderer;
static HRESULT CBV_ret;
CTextureRenderer::CTextureRenderer()
: CBaseVideoRenderer(__uuidof(CLSID_TextureRenderer),
NAME("Texture Renderer"), NULL, &CBV_ret)
CTextureRenderer::CTextureRenderer():
CBaseVideoRenderer(__uuidof(CLSID_TextureRenderer),
NAME("Texture Renderer"), NULL, &CBV_ret),
m_OneFrameDecoded( "m_OneFrameDecoded", 0 )
{
if( FAILED(CBV_ret) )
RageException::Throw( hr_ssprintf(CBV_ret, "Could not create texture renderer object!") );
m_pTexture = NULL;
m_OneFrameDecoded = SDL_CreateSemaphore(0);
}
CTextureRenderer::~CTextureRenderer()
{
SDL_DestroySemaphore( m_OneFrameDecoded );
}
@@ -90,8 +88,8 @@ HRESULT CTextureRenderer::DoRenderSample( IMediaSample * pSample )
void CTextureRenderer::OnReceiveFirstSample( IMediaSample * pSample )
{
/* If the main thread is in MovieTexture_DShow::Create, kick: */
if( SDL_SemValue(m_OneFrameDecoded) == 0 )
SDL_SemPost( m_OneFrameDecoded );
if( m_OneFrameDecoded.GetValue() == 0 )
m_OneFrameDecoded.Post();
DoRenderSample( pSample );
}
@@ -35,7 +35,7 @@ public:
long GetVidHeight() const { return m_lVidHeight; }
void SetRenderTarget( MovieTexture_DShow* pTexture );
SDL_sem *m_OneFrameDecoded;
RageSemaphore m_OneFrameDecoded;
protected:
// Video width, height, and pitch.
@@ -7,11 +7,14 @@
#include "RageTimer.h"
#include "RageFile.h"
#include "RageSurface.h"
#include "SDL_utils.h"
#include "PrefsManager.h"
#include <cerrno>
#if defined(WIN32)
#include <windows.h>
#endif
namespace avcodec
{
#if defined(_WIN32)
@@ -409,7 +412,8 @@ static avcodec::AVStream *FindVideoStream( avcodec::AVFormatContext *m_fctx )
}
MovieTexture_FFMpeg::MovieTexture_FFMpeg( RageTextureID ID ):
RageMovieTexture( ID )
RageMovieTexture( ID ),
m_BufferFinished( "BufferFinished", 0 )
{
try {
LOG->Trace( "MovieTexture_FFMpeg::MovieTexture_FFMpeg(%s)", ID.filename.c_str() );
@@ -429,8 +433,6 @@ try {
m_FrameSkipMode = false;
m_bThreaded = PREFSMAN->m_bThreadedMovieDecode;
m_BufferFinished = SDL_CreateSemaphore(0);
CreateDecoder();
LOG->Trace("Bitrate: %i", decoder->m_stream->codec.bit_rate );
LOG->Trace("Codec pixel format: %s", avcodec::avcodec_get_pix_fmt_name(decoder->m_stream->codec.pix_fmt) );
@@ -470,7 +472,6 @@ catch(...)
delete decoder;
SDL_DestroySemaphore( m_BufferFinished );
throw;
};
}
@@ -482,8 +483,6 @@ MovieTexture_FFMpeg::~MovieTexture_FFMpeg()
DestroyTexture();
delete decoder;
SDL_DestroySemaphore( m_BufferFinished );
}
@@ -882,25 +881,14 @@ void MovieTexture_FFMpeg::DecoderThread()
{
/* The only reason m_BufferFinished might be non-zero right now (before
* ConvertFrame()) is if we're quitting. */
int n = SDL_SemValue( m_BufferFinished );
int n = m_BufferFinished.GetValue();
ASSERT_M( n == 0 || m_State == DECODER_QUIT, ssprintf("%i, %i", n, m_State) );
}
ConvertFrame();
/* We just went into FRAME_WAITING. Don't actually check; the main thread
* will change us back to FRAME_NONE without locking, and poke m_BufferFinished. */
/* SDL_SemWait does not properly retry sem_wait in Linux on EINTR. */
int ret;
do
{
CHECKPOINT;
errno = 0;
ret = SDL_SemWait( m_BufferFinished );
}
while( ret == -1 && errno == EINTR );
ASSERT_M( ret != -1, ssprintf("%s, %s", SDL_GetError(), strerror(errno)) );
m_BufferFinished.Wait();
/* If the frame wasn't used, then we must be shutting down. */
ASSERT_M( m_ImageWaiting == FRAME_NONE || m_State == DECODER_QUIT, ssprintf("%i, %i", m_ImageWaiting, m_State) );
@@ -941,7 +929,7 @@ void MovieTexture_FFMpeg::Update(float fDeltaTime)
UpdateFrame();
if( m_bThreaded )
SDL_SemPost(m_BufferFinished);
m_BufferFinished.Post();
}
/* Call from the main thread when m_ImageWaiting == FRAME_WAITING to update the
@@ -988,7 +976,7 @@ void MovieTexture_FFMpeg::StopThread()
m_State = DECODER_QUIT;
/* Make sure we don't deadlock waiting for m_BufferFinished. */
SDL_SemPost(m_BufferFinished);
m_BufferFinished.Post();
CHECKPOINT;
m_DecoderThread.Wait();
CHECKPOINT;
@@ -996,7 +984,7 @@ void MovieTexture_FFMpeg::StopThread()
m_ImageWaiting = FRAME_NONE;
/* Clear the above post, if the thread didn't. */
SDL_SemTryWait(m_BufferFinished);
m_BufferFinished.TryWait();
LOG->Trace("Decoder thread shut down.");
}
@@ -68,7 +68,7 @@ private:
RageSurface *m_img;
int m_AVTexfmt; /* AVPixelFormat_t of m_img */
SDL_sem *m_BufferFinished;
RageSemaphore m_BufferFinished;
RageTimer m_Timer;
float m_Clock;