OSDN Git Service

fix lockup in reader when importing srt's
[handbrake-jp/handbrake-jp-git.git] / libhb / work.c
index e99feaa..2209b15 100644 (file)
@@ -205,9 +205,21 @@ void hb_display_job_info( hb_job_t * job )
     if( job->anamorphic.mode )
     {
         hb_log( "   + %s anamorphic", job->anamorphic.mode == 1 ? "strict" : job->anamorphic.mode == 2? "loose" : "custom" );
+        if( job->anamorphic.mode == 3 && job->anamorphic.keep_display_aspect )
+        {
+            hb_log( "     + keeping source display aspect ratio"); 
+        }
+        if( job->anamorphic.modulus != 16 )
+        {
+            hb_log( "     + modulus: %i", job->anamorphic.modulus ); 
+        }
         hb_log( "     + storage dimensions: %d * %d -> %d * %d, crop %d/%d/%d/%d",
                     title->width, title->height, job->width, job->height,
                     job->crop[0], job->crop[1], job->crop[2], job->crop[3] );
+        if( job->anamorphic.itu_par )
+        {
+            hb_log( "     + using ITU pixel aspect ratio values"); 
+        }
         hb_log( "     + pixel aspect ratio: %i / %i", job->anamorphic.par_width, job->anamorphic.par_height );
         hb_log( "     + display dimensions: %.0f * %i",
             (float)( job->width * job->anamorphic.par_width / job->anamorphic.par_height ), job->height );
@@ -261,7 +273,7 @@ void hb_display_job_info( hb_job_t * job )
         }
         else if( job->vquality > 1 )
         {
-            hb_log( "     + quality: %.2f %s", job->vquality, job->crf && job->vcodec == HB_VCODEC_X264 ? "(RF)" : "(QP)" ); 
+            hb_log( "     + quality: %.2f %s", job->vquality, job->vcodec == HB_VCODEC_X264 ? "(RF)" : "(QP)" ); 
         }
         else
         {
@@ -342,7 +354,7 @@ void correct_framerate( hb_job_t * job )
 
     hb_interjob_t * interjob = hb_interjob_get( job->h );
 
-    if( ( job->sequence_id & 0xFFFFFF ) != ( interjob->last_job ) )
+    if( ( job->sequence_id & 0xFFFFFF ) != ( interjob->last_job & 0xFFFFFF) )
         return; // Interjob information is for a different encode.
 
     /* Cache the original framerate before altering it. */
@@ -350,7 +362,8 @@ void correct_framerate( hb_job_t * job )
     interjob->vrate_base = job->vrate_base;
 
     real_frames = interjob->frame_count - interjob->render_dropped;
-    job->vrate = job->vrate_base * ( real_frames / ( interjob->total_time / 90000 ) );
+
+    job->vrate = job->vrate_base * ( (double)real_frames * 90000 / interjob->total_time );
 }
 
 
@@ -370,6 +383,7 @@ static void do_job( hb_job_t * job, int cpu_count )
     hb_title_t    * title;
     int             i, j;
     hb_work_object_t * w;
+    hb_interjob_t * interjob;
 
     hb_audio_t   * audio;
     hb_subtitle_t * subtitle;
@@ -381,6 +395,7 @@ static void do_job( hb_job_t * job, int cpu_count )
     unsigned int subtitle_hit = 0;
 
     title = job->title;
+    interjob = hb_interjob_get( job->h );
 
     if( job->pass == 2 && !job->cfr )
     {
@@ -493,7 +508,8 @@ static void do_job( hb_job_t * job, int cpu_count )
     /*
      * Look for the scanned subtitle in the existing subtitle list
      */
-    if ( !job->indepth_scan && job->select_subtitle && *(job->select_subtitle) )
+    if ( !job->indepth_scan && interjob->select_subtitle &&
+         ( job->pass == 0 || job->pass == 2 ) )
     {
         /*
          * Disable forced subtitles if we didn't find any in the scan
@@ -501,10 +517,10 @@ static void do_job( hb_job_t * job, int cpu_count )
          *
          * select_subtitle implies that we did a scan.
          */
-        if( (*job->select_subtitle)->config.force && 
-            (*job->select_subtitle)->forced_hits == 0 )
+        if( interjob->select_subtitle->config.force && 
+            interjob->select_subtitle->forced_hits == 0 )
         {
-            (*job->select_subtitle)->config.force = 0;
+            interjob->select_subtitle->config.force = 0;
         }
         for( i=0; i < hb_list_count(title->list_subtitle); i++ )
         {
@@ -518,17 +534,16 @@ static void do_job( hb_job_t * job, int cpu_count )
                 *
                 * select_subtitle implies that we did a scan.
                 */
-                if( (*job->select_subtitle)->id == subtitle->id )
+                if( interjob->select_subtitle->id == subtitle->id )
                 {
-                    *subtitle = *(*job->select_subtitle);
-                    free( *job->select_subtitle );
-                    free( job->select_subtitle );
-                    job->select_subtitle = NULL;
+                    *subtitle = *(interjob->select_subtitle);
+                    free( interjob->select_subtitle );
+                    interjob->select_subtitle = NULL;
                 }
             }
         }
 
-        if( job->select_subtitle )
+        if( interjob->select_subtitle )
         {
             /*
              * Its not in the existing list
@@ -537,16 +552,10 @@ static void do_job( hb_job_t * job, int cpu_count )
              * add the subtitle that we found on the first pass for use in this
              * pass.
              */
-            hb_list_add( title->list_subtitle, *job->select_subtitle );
-            free( job->select_subtitle );
-            job->select_subtitle = NULL;
+            hb_list_add( title->list_subtitle, interjob->select_subtitle );
+            interjob->select_subtitle = NULL;
         }
     }
-    else if ( !job->indepth_scan && job->select_subtitle )
-    {
-        free( job->select_subtitle );
-        job->select_subtitle = NULL;
-    }
 
 
     for( i=0; i < hb_list_count(title->list_subtitle); i++ )
@@ -560,7 +569,7 @@ static void do_job( hb_job_t * job, int cpu_count )
             subtitle->fifo_sync = hb_fifo_init( FIFO_CPU_MULT * cpu_count );
             subtitle->fifo_out  = hb_fifo_init( FIFO_CPU_MULT * cpu_count );
 
-            if( (!job->indepth_scan || subtitle->config.force) && 
+            if( (!job->indepth_scan || job->select_subtitle_config.force) && 
                 subtitle->source == VOBSUB ) {
                 /*
                  * Don't add threads for subtitles when we are scanning, unless
@@ -581,6 +590,15 @@ static void do_job( hb_job_t * job, int cpu_count )
                 hb_list_add( job->list_work, w );
             }
 
+            if( !job->indepth_scan && subtitle->source == SRTSUB )
+            {
+                w = hb_get_work( WORK_DECSRTSUB );
+                w->fifo_in  = subtitle->fifo_in;
+                w->fifo_out = subtitle->fifo_raw;
+                w->subtitle = subtitle;
+                hb_list_add( job->list_work, w );
+            }
+
             if( !job->indepth_scan && 
                 subtitle->format == PICTURESUB
                 && subtitle->config.dest == PASSTHRUSUB )
@@ -994,59 +1012,47 @@ cleanup:
             }
         }
 
-        if( job->native_language ) {
+        
+        if( subtitle_forced_id )
+        {
             /*
-             * We still have a native_language, so the audio and subtitles are
-             * different, so in this case it is a foreign film and we want to
-             * select the subtitle with the highest hits in our language.
+             * If there are any subtitle streams with forced subtitles
+             * then select it in preference to the lowest.
              */
-            subtitle_hit = subtitle_highest_id;
-            hb_log( "Found a native-language subtitle id 0x%x", subtitle_hit);
-        } else {
-            if( subtitle_forced_id )
-            {
-                /*
-                 * If there are any subtitle streams with forced subtitles
-                 * then select it in preference to the lowest.
-                 */
-                subtitle_hit = subtitle_forced_id;
-                hb_log("Found a subtitle candidate id 0x%x (contains forced subs)",
-                       subtitle_hit);
-            } else if( subtitle_lowest < subtitle_highest )
+            subtitle_hit = subtitle_forced_id;
+            hb_log("Found a subtitle candidate id 0x%x (contains forced subs)",
+                   subtitle_hit);
+        } else if( subtitle_lowest < subtitle_highest )
+        {
+            /*
+             * OK we have more than one, and the lowest is lower,
+             * but how much lower to qualify for turning it on by
+             * default?
+             *
+             * Let's say 10% as a default.
+             */
+            if( subtitle_lowest < ( subtitle_highest * 0.1 ) )
             {
-                /*
-                 * OK we have more than one, and the lowest is lower,
-                 * but how much lower to qualify for turning it on by
-                 * default?
-                 *
-                 * Let's say 10% as a default.
-                 */
-                if( subtitle_lowest < ( subtitle_highest * 0.1 ) )
-                {
-                    subtitle_hit = subtitle_lowest_id;
-                    hb_log( "Found a subtitle candidate id 0x%x",
-                            subtitle_hit );
-                } else {
-                    hb_log( "No candidate subtitle detected during subtitle-scan");
-                }
+                subtitle_hit = subtitle_lowest_id;
+                hb_log( "Found a subtitle candidate id 0x%x",
+                        subtitle_hit );
+            } else {
+                hb_log( "No candidate subtitle detected during subtitle-scan");
             }
         }
     }
 
-    if( job->select_subtitle )
+    if( job->indepth_scan )
     {
-        if( job->indepth_scan )
+        for( i=0; i < hb_list_count( title->list_subtitle ); i++ )
         {
-            for( i=0; i < hb_list_count( title->list_subtitle ); i++ )
+            subtitle =  hb_list_item( title->list_subtitle, i );
+            if( subtitle->id == subtitle_hit )
             {
-                subtitle =  hb_list_item( title->list_subtitle, i );
-                if( subtitle->id == subtitle_hit )
-                {
-                    subtitle->config = job->select_subtitle_config;
-                    hb_list_rem( title->list_subtitle, subtitle );
-                    *job->select_subtitle = subtitle;
-                    break;
-                }
+                subtitle->config = job->select_subtitle_config;
+                hb_list_rem( title->list_subtitle, subtitle );
+                interjob->select_subtitle = subtitle;
+                break;
             }
         }
     }