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;
- }
}
}
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->config.dest != PASSTHRUSUB)
+ continue;
+ add_mux_track( mux, subtitle->fifo_out, subtitle->mux_data, 0 );
+ }
// The following 'while' is the main muxing loop.
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
+
if( m )
{
m->end( m );
if( !stat( job->file, &sb ) )
{
- hb_deep_log( 2, "mux: file size, %lld bytes", (uint64_t) sb.st_size );
+ hb_deep_log( 2, "mux: file size, %"PRId64" bytes", (uint64_t) sb.st_size );
bytes_total = 0;
frames_total = 0;
for( i = 0; i < mux->ntracks; ++i )
{
track = mux->track[i];
- hb_log( "mux: track %d, %lld frames, %lld bytes, %.2f kbps, fifo %d",
+ hb_log( "mux: track %d, %"PRId64" frames, %"PRId64" bytes, %.2f kbps, fifo %d",
i, track->frames, track->bytes,
90000.0 * track->bytes / mux->pts / 125,
track->mf.flen );
if( !i && ( job->vquality < 0.0 || job->vquality > 1.0 ) )
{
/* Video */
- hb_deep_log( 2, "mux: video bitrate error, %+lld bytes",
- track->bytes - mux->pts * job->vbitrate *
- 125 / 90000 );
+ hb_deep_log( 2, "mux: video bitrate error, %+"PRId64" bytes",
+ (int64_t)(track->bytes - mux->pts * job->vbitrate * 125 / 90000) );
}
bytes_total += track->bytes;
frames_total += track->frames;