mux->allRdy |= is_continuous << t;
}
-static void mf_push( hb_track_t *track, hb_buffer_t *buf )
+static void mf_push( hb_mux_t * mux, int tk, hb_buffer_t *buf )
{
+ hb_track_t * track = mux->track[tk];
uint32_t mask = track->mf.flen - 1;
uint32_t in = track->mf.in;
+
+ if ( ( ( in + 2 ) & mask ) == ( track->mf.out & mask ) )
+ {
+ if ( track->mf.flen >= 256 )
+ {
+ mux->rdy = mux->allRdy;
+ }
+ }
if ( ( ( in + 1 ) & mask ) == ( track->mf.out & mask ) )
{
// fifo is full - expand it to double the current size.
static void MoveToInternalFifos( int tk, hb_mux_t *mux, hb_buffer_t * buf )
{
- hb_track_t *track = mux->track[tk];
-
// move all the buffers on the track's fifo to our internal
// fifo so that (a) we don't deadlock in the reader and
// (b) we can control how data from multiple tracks is
// interleaved in the output file.
- mf_push( track, buf );
+ mf_push( mux, tk, buf );
if ( buf->stop >= mux->pts )
{
// buffer is past our next interleave point so
while ( ( buf = mf_peek( track ) ) != NULL && buf->start < mux->pts )
{
- m->mux( m, track->mux_data, mf_pull( track ) );
+ buf = mf_pull( track );
track->frames += 1;
track->bytes += buf->size;
+ m->mux( m, track->mux_data, buf );
}
}
}
w->status = w->work( w, &buf_in, NULL );
+ if( buf_in )
+ {
+ hb_buffer_close( &buf_in );
+ }
}
}
muxer->private_data->track = mux->ntracks;
muxer->fifo_in = job->fifo_mpeg4;
add_mux_track( mux, job->mux_data, 1 );
- muxer->done = &job->done;
- muxer->thread = hb_thread_init( muxer->name, mux_loop, muxer, HB_NORMAL_PRIORITY );
+ muxer->done = &muxer->private_data->mux->done;
for( i = 0; i < hb_list_count( title->list_audio ); i++ )
{