X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=libhb%2Fmuxcommon.c;h=1f39df11d92ab52c14ac5fa398aca98ae72dab46;hb=033e32de9c380f54c7d1362a3979da205ebc3a29;hp=b6008dc3c954cf60943cb6e2d37b5b6e4ede6c3c;hpb=24a1d785adbfa78958f9229dde36f9041ac4f43e;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/libhb/muxcommon.c b/libhb/muxcommon.c index b6008dc3..1f39df11 100644 --- a/libhb/muxcommon.c +++ b/libhb/muxcommon.c @@ -141,6 +141,12 @@ static hb_buffer_t *mf_pull( hb_track_t *track ) 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; @@ -188,18 +194,12 @@ static void OutputTrackChunk( hb_mux_t *mux, hb_track_t *track, hb_mux_object_t { 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; - } } } @@ -223,22 +223,29 @@ static void MuxerFunc( void * _mux ) { 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 */ @@ -251,14 +258,22 @@ static void MuxerFunc( void * _mux ) 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. - 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; @@ -266,7 +281,7 @@ static void MuxerFunc( void * _mux ) // 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 ) { @@ -312,34 +327,35 @@ finished: 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 ) ) { - 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; @@ -353,8 +369,11 @@ finished: } } } - - free( m ); + + if( m ) + { + free( m ); + } for( i = 0; i < mux->ntracks; ++i ) {