summaryrefslogtreecommitdiffstats
path: root/libhb/muxcommon.c
diff options
context:
space:
mode:
Diffstat (limited to 'libhb/muxcommon.c')
-rw-r--r--libhb/muxcommon.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/libhb/muxcommon.c b/libhb/muxcommon.c
index 34836b6cb..05f49d40f 100644
--- a/libhb/muxcommon.c
+++ b/libhb/muxcommon.c
@@ -6,6 +6,8 @@
#include "hb.h"
+#define MAX_BUFFERING (1024*1024*50)
+
struct hb_mux_object_s
{
HB_MUX_COMMON;
@@ -25,6 +27,7 @@ typedef struct
uint64_t frames;
uint64_t bytes;
mux_fifo_t mf;
+ int buffered_size;
} hb_track_t;
typedef struct
@@ -105,16 +108,9 @@ static void add_mux_track( hb_mux_t *mux, hb_mux_data_t *mux_data,
static int mf_full( hb_track_t * track )
{
- uint32_t mask = track->mf.flen - 1;
- uint32_t in = track->mf.in;
+ if ( track->buffered_size > MAX_BUFFERING )
+ return 1;
- if ( ( ( in + 1 ) & mask ) == ( track->mf.out & mask ) )
- {
- if ( track->mf.flen >= 256 )
- {
- return 1;
- }
- }
return 0;
}
@@ -124,12 +120,9 @@ static void mf_push( hb_mux_t * mux, int tk, hb_buffer_t *buf )
uint32_t mask = track->mf.flen - 1;
uint32_t in = track->mf.in;
- if ( ( ( in + 2 ) & mask ) == ( track->mf.out & mask ) )
+ if ( track->buffered_size > MAX_BUFFERING )
{
- if ( track->mf.flen >= 256 )
- {
- mux->rdy = mux->allRdy;
- }
+ mux->rdy = mux->allRdy;
}
if ( ( ( in + 1 ) & mask ) == ( track->mf.out & mask ) )
{
@@ -159,6 +152,7 @@ static void mf_push( hb_mux_t * mux, int tk, hb_buffer_t *buf )
}
track->mf.fifo[in & mask] = buf;
track->mf.in = in + 1;
+ track->buffered_size += buf->alloc;
}
static hb_buffer_t *mf_pull( hb_track_t *track )
@@ -169,6 +163,8 @@ static hb_buffer_t *mf_pull( hb_track_t *track )
// the fifo isn't empty
b = track->mf.fifo[track->mf.out & (track->mf.flen - 1)];
++track->mf.out;
+
+ track->buffered_size -= b->alloc;
}
return b;
}
@@ -370,7 +366,12 @@ void muxClose( hb_work_object_t * w )
for( i = 0; i < mux->ntracks; ++i )
{
+ hb_buffer_t * b;
track = mux->track[i];
+ while ( (b = mf_pull( track )) != NULL )
+ {
+ hb_buffer_close( &b );
+ }
if( track->mux_data )
{
free( track->mux_data );