OSDN Git Service

Bump libmkv to 0.6.4.1
[handbrake-jp/handbrake-jp-git.git] / libhb / sync.c
index 31c9583..9c36ee3 100644 (file)
@@ -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,13 +109,14 @@ 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;
     pv->common = calloc( 1, sizeof( hb_sync_common_t ) );
     pv->common->ref++;
     pv->common->mutex = hb_lock_init();
-    pv->common->audio_pts_thresh = 0;
+    pv->common->audio_pts_thresh = -1;
     pv->common->next_frame = hb_cond_init();
     pv->common->pts_count = 1;
     if ( job->frame_to_start || job->pts_to_start )
@@ -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,10 @@ 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 ||
+            subtitle->source == SSASUB)
         {
             /*
              * Rewrite timestamps on subtitles that came from Closed Captions
@@ -592,7 +634,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 +842,7 @@ int syncVideoWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
 
     /* Update UI */
     UpdateState( w );
-        
+
     return HB_WORK_OK;
 }
 
@@ -872,7 +914,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;
@@ -890,6 +931,13 @@ static int syncAudioWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
     hb_lock( pv->common->mutex );
     while ( !pv->common->start_found )
     {
+        if ( pv->common->audio_pts_thresh < 0 )
+        {
+            // I would initialize this in hb_sync_init, but 
+            // job->pts_to_start can be modified by reader 
+            // after hb_sync_init is called.
+            pv->common->audio_pts_thresh = job->pts_to_start;
+        }
         if ( buf->start < pv->common->audio_pts_thresh )
         {
             hb_buffer_close( &buf );
@@ -1017,8 +1065,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;
     }
 
     /*