return b;
}
+static hb_buffer_t *mf_peek( hb_track_t *track )
+{
+ return track->mf.out == track->mf.in ?
+ NULL : track->mf.fifo[track->mf.out & (track->mf.flen - 1)];
+}
+
static void MoveToInternalFifos( hb_mux_t *mux )
{
int i;
{
hb_buffer_t *buf;
- while ( ( buf = mf_pull( track ) ) != NULL )
+ while ( ( buf = mf_peek( track ) ) != NULL && buf->start < mux->pts )
{
- m->mux( m, track->mux_data, buf );
+ m->mux( m, track->mux_data, mf_pull( track ) );
track->frames += 1;
track->bytes += buf->size;
-
- uint64_t pts = buf->stop;
hb_buffer_close( &buf );
- if ( pts >= mux->pts )
- {
- break;
- }
}
}
{
switch( job->mux )
{
- case HB_MUX_MP4:
- case HB_MUX_PSP:
- case HB_MUX_IPOD:
- m = hb_mux_mp4_init( job );
- break;
- case HB_MUX_AVI:
- m = hb_mux_avi_init( job );
- break;
- case HB_MUX_OGM:
- m = hb_mux_ogm_init( job );
- break;
- case HB_MUX_MKV:
- m = hb_mux_mkv_init( job );
+ case HB_MUX_MP4:
+ case HB_MUX_PSP:
+ case HB_MUX_IPOD:
+ m = hb_mux_mp4_init( job );
+ break;
+ case HB_MUX_AVI:
+ m = hb_mux_avi_init( job );
+ break;
+ case HB_MUX_OGM:
+ m = hb_mux_ogm_init( job );
+ break;
+ case HB_MUX_MKV:
+ m = hb_mux_mkv_init( job );
+ break;
+ default:
+ hb_error( "No muxer selected, exiting" );
+ *job->die = 1;
}
/* Create file, write headers */
- m->init( m );
+ if( m )
+ {
+ m->init( m );
+ }
}
/* Build list of fifos we're interested in */
add_mux_track( mux, audio->priv.fifo_out, audio->priv.mux_data, 1 );
}
+ for( i = 0; i < hb_list_count( title->list_subtitle ); i++ )
+ {
+ hb_subtitle_t *subtitle = hb_list_item( title->list_subtitle, i );
+
+ if (subtitle->dest != PASSTHRUSUB)
+ continue;
+ add_mux_track( mux, subtitle->fifo_out, subtitle->mux_data, 0 );
+ }
// The following 'while' is the main muxing loop.
- int thread_sleep_interval = 50;
- while( !*job->die )
+ int thread_sleep_interval = 50;
+ while( !*job->die )
{
MoveToInternalFifos( mux );
- if ( mux->rdy != mux->allRdy )
+ if ( ( mux->rdy & mux->allRdy ) != mux->allRdy )
{
hb_snooze( thread_sleep_interval );
continue;
// all tracks have at least 'interleave' ticks of data. Output
// all that we can in 'interleave' size chunks.
- while ( mux->rdy == mux->allRdy )
+ while ( ( mux->rdy & mux->allRdy ) == mux->allRdy )
{
for ( i = 0; i < mux->ntracks; ++i )
{
struct stat sb;
uint64_t bytes_total, frames_total;
-#define p state.param.muxing
/* Update the UI */
hb_state_t state;
- state.state = HB_STATE_MUXING;
- p.progress = 0;
+ state.state = HB_STATE_MUXING;
+ state.param.muxing.progress = 0;
hb_set_state( job->h, &state );
-#undef p
- m->end( m );
+
+ if( m )
+ {
+ m->end( m );
+ }
if( !stat( job->file, &sb ) )
{
}
}
}
-
- free( m );
+
+ if( m )
+ {
+ free( m );
+ }
for( i = 0; i < mux->ntracks; ++i )
{