summaryrefslogtreecommitdiffstats
path: root/libhb
diff options
context:
space:
mode:
Diffstat (limited to 'libhb')
-rw-r--r--libhb/fifo.c39
-rw-r--r--libhb/internal.h1
2 files changed, 39 insertions, 1 deletions
diff --git a/libhb/fifo.c b/libhb/fifo.c
index 1bf2a9de6..ea2a29287 100644
--- a/libhb/fifo.c
+++ b/libhb/fifo.c
@@ -190,7 +190,7 @@ void hb_buffer_close( hb_buffer_t ** _b )
if( buffer_pool && b->data && !hb_fifo_is_full( buffer_pool ) )
{
- hb_fifo_push( buffer_pool, b );
+ hb_fifo_push_head( buffer_pool, b );
return;
}
/* either the pool is full or this size doesn't use a pool - free the buf */
@@ -334,6 +334,43 @@ void hb_fifo_push( hb_fifo_t * f, hb_buffer_t * b )
hb_unlock( f->lock );
}
+void hb_fifo_push_head( hb_fifo_t * f, hb_buffer_t * b )
+{
+ hb_buffer_t * tmp;
+ uint32_t size = 0;
+
+ if( !b )
+ {
+ return;
+ }
+
+ hb_lock( f->lock );
+
+ /*
+ * If there are a chain of buffers prepend the lot
+ */
+ tmp = b;
+ while( tmp->next )
+ {
+ tmp = tmp->next;
+ size += 1;
+ }
+
+ if( f->size > 0 )
+ {
+ tmp->next = f->first;
+ }
+ else
+ {
+ f->last = tmp;
+ }
+
+ f->first = b;
+ f->size += ( size + 1 );
+
+ hb_unlock( f->lock );
+}
+
void hb_fifo_close( hb_fifo_t ** _f )
{
hb_fifo_t * f = *_f;
diff --git a/libhb/internal.h b/libhb/internal.h
index 36dca0d80..5f04e3852 100644
--- a/libhb/internal.h
+++ b/libhb/internal.h
@@ -85,6 +85,7 @@ hb_buffer_t * hb_fifo_get( hb_fifo_t * );
hb_buffer_t * hb_fifo_see( hb_fifo_t * );
hb_buffer_t * hb_fifo_see2( hb_fifo_t * );
void hb_fifo_push( hb_fifo_t *, hb_buffer_t * );
+void hb_fifo_push_head( hb_fifo_t *, hb_buffer_t * );
void hb_fifo_close( hb_fifo_t ** );
/***********************************************************************