X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=libhb%2Fsync.c;h=36017801b7f34c86ebce9681aa9779e3436a37b9;hb=0884cb45aeeb60a46effe1d1056a61fe68300ea7;hp=31c9583aba32a4d25771fa6ece1b36adf0654049;hpb=26994c5dfa15420b1b821fdbc3b9601de59cbcd2;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/libhb/sync.c b/libhb/sync.c index 31c9583a..36017801 100644 --- a/libhb/sync.c +++ b/libhb/sync.c @@ -100,7 +100,7 @@ static hb_buffer_t * OutputAudioFrame( hb_audio_t *audio, hb_buffer_t *buf, *********************************************************************** * Initialize the work object **********************************************************************/ -int hb_sync_init( hb_job_t * job ) +hb_work_object_t * hb_sync_init( hb_job_t * job ) { hb_title_t * title = job->title; hb_chapter_t * chapter; @@ -109,6 +109,7 @@ int hb_sync_init( hb_job_t * job ) hb_work_private_t * pv; hb_sync_video_t * sync; hb_work_object_t * w; + hb_work_object_t * ret = NULL; pv = calloc( 1, sizeof( hb_work_private_t ) ); sync = &pv->type.video; @@ -127,7 +128,7 @@ int hb_sync_init( hb_job_t * job ) pv->common->start_found = 1; } - w = hb_get_work( WORK_SYNC_VIDEO ); + ret = w = hb_get_work( WORK_SYNC_VIDEO ); w->private_data = pv; w->fifo_in = job->fifo_raw; w->fifo_out = job->fifo_sync; @@ -167,7 +168,6 @@ int hb_sync_init( hb_job_t * job ) } sync->count_frames_max = duration * title->rate / title->rate_base / 90000; } - hb_list_add( job->list_work, w ); hb_log( "sync: expecting %d video frames", sync->count_frames_max ); @@ -183,7 +183,7 @@ int hb_sync_init( hb_job_t * job ) for ( i = 0; i < pv->common->pts_count; i++ ) pv->common->first_pts[i] = INT64_MAX; - return 0; + return ret; } /*********************************************************************** @@ -281,7 +281,10 @@ int syncVideoWork( hb_work_object_t * w, hb_buffer_t ** buf_in, subtitle = hb_list_item( job->list_subtitle, i ); if( subtitle->config.dest == PASSTHRUSUB ) { - hb_fifo_push( subtitle->fifo_out, hb_buffer_init( 0 ) ); + if( subtitle->source == VOBSUB ) + hb_fifo_push( subtitle->fifo_sync, hb_buffer_init( 0 ) ); + else + hb_fifo_push( subtitle->fifo_out, hb_buffer_init( 0 ) ); } } return HB_WORK_DONE; @@ -365,7 +368,10 @@ int syncVideoWork( hb_work_object_t * w, hb_buffer_t ** buf_in, subtitle = hb_list_item( job->list_subtitle, i ); if( subtitle->config.dest == PASSTHRUSUB ) { - hb_fifo_push( subtitle->fifo_out, hb_buffer_init( 0 ) ); + if( subtitle->source == VOBSUB ) + hb_fifo_push( subtitle->fifo_sync, hb_buffer_init( 0 ) ); + else + hb_fifo_push( subtitle->fifo_out, hb_buffer_init( 0 ) ); } } return HB_WORK_DONE; @@ -384,6 +390,9 @@ int syncVideoWork( hb_work_object_t * w, hb_buffer_t ** buf_in, cur->start = sync->next_start; cur->stop = cur->start + 90000. / ((double)job->vrate / (double)job->vrate_base); + /* Make sure last frame is reflected in frame count */ + pv->common->count_frames++; + /* Push the frame to the renderer */ hb_fifo_push( job->fifo_sync, cur ); sync->cur = NULL; @@ -423,6 +432,21 @@ int syncVideoWork( hb_work_object_t * w, hb_buffer_t ** buf_in, *buf_out = hb_buffer_init( 0 ); hb_log( "sync: reached %d frames, exiting early", pv->common->count_frames ); + + /* + * Push through any subtitle EOFs in case they were not synced through. + */ + for( i = 0; i < hb_list_count( job->list_subtitle ); i++) + { + subtitle = hb_list_item( job->list_subtitle, i ); + if( subtitle->config.dest == PASSTHRUSUB ) + { + if( subtitle->source == VOBSUB ) + hb_fifo_push( subtitle->fifo_sync, hb_buffer_init( 0 ) ); + else + hb_fifo_push( subtitle->fifo_out, hb_buffer_init( 0 ) ); + } + } return HB_WORK_DONE; } @@ -436,6 +460,21 @@ int syncVideoWork( hb_work_object_t * w, hb_buffer_t ** buf_in, hb_buffer_close( &sync->cur ); hb_buffer_close( &next ); *buf_out = hb_buffer_init( 0 ); + + /* + * Push through any subtitle EOFs in case they were not synced through. + */ + for( i = 0; i < hb_list_count( job->list_subtitle ); i++) + { + subtitle = hb_list_item( job->list_subtitle, i ); + if( subtitle->config.dest == PASSTHRUSUB ) + { + if( subtitle->source == VOBSUB ) + hb_fifo_push( subtitle->fifo_sync, hb_buffer_init( 0 ) ); + else + hb_fifo_push( subtitle->fifo_out, hb_buffer_init( 0 ) ); + } + } return HB_WORK_DONE; } @@ -525,7 +564,9 @@ int syncVideoWork( hb_work_object_t * w, hb_buffer_t ** buf_in, */ if( subtitle->source == CC608SUB || subtitle->source == CC708SUB || - subtitle->source == SRTSUB ) + subtitle->source == SRTSUB || + subtitle->source == UTF8SUB || + subtitle->source == TX3GSUB) { /* * Rewrite timestamps on subtitles that came from Closed Captions @@ -592,7 +633,7 @@ int syncVideoWork( hb_work_object_t * w, hb_buffer_t ** buf_in, sub->stop = sub2->start; } - // hb_log("0x%x: video seq: %lld subtitle sequence: %lld", + // hb_log("0x%x: video seq: %"PRId64" subtitle sequence: %"PRId64, // sub, cur->sequence, sub->sequence); if( sub->sequence > cur->sequence ) @@ -800,7 +841,7 @@ int syncVideoWork( hb_work_object_t * w, hb_buffer_t ** buf_in, /* Update UI */ UpdateState( w ); - + return HB_WORK_OK; } @@ -872,7 +913,6 @@ static int syncAudioWork( hb_work_object_t * w, hb_buffer_t ** buf_in, hb_job_t * job = pv->job; hb_sync_audio_t * sync = &pv->type.audio; hb_buffer_t * buf; - //hb_fifo_t * fifo; int64_t start; *buf_out = NULL; @@ -1017,8 +1057,6 @@ static int syncAudioWork( hb_work_object_t * w, hb_buffer_t ** buf_in, (int)((start - sync->next_pts) / 90), w->audio->id, start, sync->next_pts ); InsertSilence( w, start - sync->next_pts ); - *buf_out = buf; - return HB_WORK_OK; } /*