- 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 )
- {
- MoveToInternalFifos( mux );
- 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 ) == mux->allRdy )
- {
- for ( i = 0; i < mux->ntracks; ++i )
- {
- track = mux->track[i];
- OutputTrackChunk( mux, track, m );
-
- // if the track is at eof or still has data that's past
- // our next interleave point then leave it marked as rdy.
- // Otherwise clear rdy.
- if ( ( mux->eof & (1 << i) ) == 0 &&
- ( track->mf.out == track->mf.in ||
- track->mf.fifo[(track->mf.in-1) & (track->mf.flen-1)]->stop
- < mux->pts + mux->interleave ) )
- {
- mux->rdy &=~ ( 1 << i );
- }
- }
-
- // if all the tracks are at eof we're just purging their
- // remaining data -- keep going until all internal fifos are empty.
- if ( mux->eof == mux->allEof )
- {
- for ( i = 0; i < mux->ntracks; ++i )
- {
- if ( mux->track[i]->mf.out != mux->track[i]->mf.in )
- {
- break;
- }
- }
- if ( i >= mux->ntracks )
- {
- goto finished;
- }
- }
- mux->pts += mux->interleave;
- }
- }
-
- // we're all done muxing -- print final stats and cleanup.
-finished:
- if( job->pass == 0 || job->pass == 2 )
- {
- struct stat sb;
- uint64_t bytes_total, frames_total;
-
- /* Update the UI */
- hb_state_t state;
- state.state = HB_STATE_MUXING;
- state.param.muxing.progress = 0;
- hb_set_state( job->h, &state );
-
- if( m )
- {
- m->end( m );
- }
-
- if( !stat( job->file, &sb ) )
- {
- 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, %"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, %+"PRId64" bytes",
- (int64_t)(track->bytes - mux->pts * job->vbitrate * 125 / 90000) );
- }
- bytes_total += track->bytes;
- frames_total += track->frames;
- }