summaryrefslogtreecommitdiffstats
path: root/core/Fifo.h
diff options
context:
space:
mode:
Diffstat (limited to 'core/Fifo.h')
-rw-r--r--core/Fifo.h85
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