diff options
Diffstat (limited to 'core/Fifo.h')
-rw-r--r-- | core/Fifo.h | 85 |
1 files changed, 74 insertions, 11 deletions
diff --git a/core/Fifo.h b/core/Fifo.h index 758125ebd..d9240fb25 100644 --- a/core/Fifo.h +++ b/core/Fifo.h @@ -1,4 +1,4 @@ -/* $Id: Fifo.h,v 1.3 2003/11/06 13:07:52 titer Exp $ +/* $Id: Fifo.h,v 1.10 2004/01/16 19:04:04 titer Exp $ This file is part of the HandBrake source code. Homepage: <http://handbrake.m0k.org/>. @@ -12,16 +12,27 @@ struct HBBuffer { + /* Members used everywhere */ int alloc; int size; uint8_t * data; - float position; + int pass; + + /* Only used for PStoES */ int streamId; - int keyFrame; uint64_t pts; - int pass; - int last; + + /* NTSC suxx */ + int repeat; + + /* Only used for raw audio buffers */ + int samples; /* Number of samples for each track */ + float * left; + float * right; + + /* Only used for MPEG-4, MP3 and AAC buffers */ + int keyFrame; }; HBBuffer * HBBufferInit( int size ); @@ -30,24 +41,40 @@ void HBBufferClose( HBBuffer ** ); struct HBFifo { + int die; int capacity; int whereToPush; int whereToPop; HBBuffer ** buffers; HBLock * lock; + HBCond * cond; }; HBFifo * HBFifoInit( int capacity ); -int HBFifoSize( HBFifo * ); +static inline int HBFifoSize( HBFifo * ); static inline int HBFifoPush( HBFifo *, HBBuffer ** ); static inline HBBuffer * HBFifoPop( HBFifo * ); +static inline int HBFifoWait( HBFifo * ); +static inline float HBFifoPosition( HBFifo * ); +void HBFifoDie( HBFifo * ); void HBFifoClose( HBFifo ** ); -static inline int HBFifoPush( HBFifo * f, HBBuffer ** b ) +static inline int HBFifoSize( HBFifo * f ) { + int size; HBLockLock( f->lock ); + size = ( f->capacity + 1 + f->whereToPush - f->whereToPop ) % + ( f->capacity + 1 ); + HBLockUnlock( f->lock ); + return size; +} - if( HBFifoSize( f ) < f->capacity ) +static inline int HBFifoPush( HBFifo * f, HBBuffer ** b ) +{ + HBLockLock( f->lock ); + HBCondSignal( f->cond ); + if( ( f->capacity + 1 + f->whereToPush - f->whereToPop ) % + ( f->capacity + 1 ) != f->capacity ) { f->buffers[f->whereToPush] = *b; f->whereToPush++; @@ -56,7 +83,6 @@ static inline int HBFifoPush( HBFifo * f, HBBuffer ** b ) *b = NULL; return 1; } - HBLockUnlock( f->lock ); return 0; } @@ -64,7 +90,6 @@ static inline int HBFifoPush( HBFifo * f, HBBuffer ** b ) static inline HBBuffer * HBFifoPop( HBFifo * f ) { HBLockLock( f->lock ); - if( f->whereToPush != f->whereToPop ) { HBBuffer * b = f->buffers[f->whereToPop]; @@ -73,9 +98,47 @@ static inline HBBuffer * HBFifoPop( HBFifo * f ) HBLockUnlock( f->lock ); return b; } - HBLockUnlock( f->lock ); return NULL; } +static inline int HBFifoWait( HBFifo * f ) +{ + HBLockLock( f->lock ); + if( f->whereToPush != f->whereToPop ) + { + HBLockUnlock( f->lock ); + return 1; + } + if( f->die ) + { + HBLockUnlock( f->lock ); + return 0; + } + HBCondWait( f->cond, f->lock ); + if( f->whereToPush != f->whereToPop ) + { + HBLockUnlock( f->lock ); + return 1; + } + HBLockUnlock( f->lock ); + return 0; +} + +static inline float HBFifoPosition( HBFifo * f ) +{ + float pos; + HBLockLock( f->lock ); + if( f->whereToPush != f->whereToPop ) + { + pos = f->buffers[f->whereToPop]->position; + } + else + { + pos = 0.0; + } + HBLockUnlock( f->lock ); + return pos; +} + #endif |