OSDN Git Service

Bump libmkv to 0.6.4.1
[handbrake-jp/handbrake-jp-git.git] / libhb / sync.c
index e4d7a30..9c36ee3 100644 (file)
@@ -116,7 +116,7 @@ hb_work_object_t * hb_sync_init( hb_job_t * job )
     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 )
@@ -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 )
@@ -889,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 );