OSDN Git Service

fix lockup in reader when importing srt's
[handbrake-jp/handbrake-jp-git.git] / libhb / work.c
index 21232de..2209b15 100644 (file)
@@ -204,10 +204,22 @@ void hb_display_job_info( hb_job_t * job )
 
     if( job->anamorphic.mode )
     {
-        hb_log( "   + %s anamorphic", job->anamorphic.mode == 1 ? "strict" : "loose" );
+        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 );
@@ -244,10 +256,6 @@ void hb_display_job_info( hb_job_t * job )
                 hb_log( "   + encoder: FFmpeg" );
                 break;
 
-            case HB_VCODEC_XVID:
-                hb_log( "   + encoder: XviD" );
-                break;
-
             case HB_VCODEC_X264:
                 hb_log( "   + encoder: x264" );
                 if( job->x264opts != NULL && *job->x264opts != '\0' )
@@ -265,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
         {
@@ -284,7 +292,7 @@ void hb_display_job_info( hb_job_t * job )
                     subtitle->source == VOBSUB ? "VOBSUB" : 
                     ((subtitle->source == CC608SUB ||
                       subtitle->source == CC708SUB) ? "CC" : "SRT"),
-                    subtitle->dest == RENDERSUB ? "Render/Burn in" : "Pass-Through");
+                    subtitle->config.dest == RENDERSUB ? "Render/Burn in" : "Pass-Through");
         }
     }
 
@@ -339,6 +347,26 @@ void hb_display_job_info( hb_job_t * job )
     }
 }
 
+/* Corrects framerates when actual duration and frame count numbers are known. */
+void correct_framerate( hb_job_t * job )
+{
+    int real_frames;
+
+    hb_interjob_t * interjob = hb_interjob_get( job->h );
+
+    if( ( job->sequence_id & 0xFFFFFF ) != ( interjob->last_job & 0xFFFFFF) )
+        return; // Interjob information is for a different encode.
+
+    /* Cache the original framerate before altering it. */
+    interjob->vrate = job->vrate;
+    interjob->vrate_base = job->vrate_base;
+
+    real_frames = interjob->frame_count - interjob->render_dropped;
+
+    job->vrate = job->vrate_base * ( (double)real_frames * 90000 / interjob->total_time );
+}
+
+
 /**
  * Job initialization rountine.
  * Initializes fifos.
@@ -355,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;
@@ -366,6 +395,12 @@ 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 )
+    {
+        correct_framerate( job );
+    }
 
     job->list_work = hb_list_init();
 
@@ -456,9 +491,6 @@ static void do_job( hb_job_t * job, int cpu_count )
         case HB_VCODEC_FFMPEG:
             w = hb_get_work( WORK_ENCAVCODEC );
             break;
-        case HB_VCODEC_XVID:
-            w = hb_get_work( WORK_ENCXVID );
-            break;
         case HB_VCODEC_X264:
             w = hb_get_work( WORK_ENCX264 );
             break;
@@ -473,19 +505,59 @@ static void do_job( hb_job_t * job, int cpu_count )
         hb_list_add( job->list_work, w );
     }
 
-    if( job->select_subtitle && !job->indepth_scan )
+    /*
+     * Look for the scanned subtitle in the existing subtitle list
+     */
+    if ( !job->indepth_scan && interjob->select_subtitle &&
+         ( job->pass == 0 || job->pass == 2 ) )
     {
         /*
-         * Must be second pass of a two pass with subtitle scan enabled, so
-         * add the subtitle that we found on the first pass for use in this
-         * pass.
+         * Disable forced subtitles if we didn't find any in the scan
+         * so that we display normal subtitles instead.
+         *
+         * select_subtitle implies that we did a scan.
          */
-        if (*(job->select_subtitle))
+        if( interjob->select_subtitle->config.force && 
+            interjob->select_subtitle->forced_hits == 0 )
+        {
+            interjob->select_subtitle->config.force = 0;
+        }
+        for( i=0; i < hb_list_count(title->list_subtitle); i++ )
         {
-            hb_list_add( title->list_subtitle, *( job->select_subtitle ) );
+            subtitle =  hb_list_item( title->list_subtitle, i );
+
+            if( subtitle )
+            {
+                /*
+                * Disable forced subtitles if we didn't find any in the scan
+                * so that we display normal subtitles instead.
+                *
+                * select_subtitle implies that we did a scan.
+                */
+                if( interjob->select_subtitle->id == subtitle->id )
+                {
+                    *subtitle = *(interjob->select_subtitle);
+                    free( interjob->select_subtitle );
+                    interjob->select_subtitle = NULL;
+                }
+            }
+        }
+
+        if( interjob->select_subtitle )
+        {
+            /*
+             * Its not in the existing list
+             *
+             * Must be second pass of a two pass with subtitle scan enabled, so
+             * add the subtitle that we found on the first pass for use in this
+             * pass.
+             */
+            hb_list_add( title->list_subtitle, interjob->select_subtitle );
+            interjob->select_subtitle = NULL;
         }
     }
 
+
     for( i=0; i < hb_list_count(title->list_subtitle); i++ )
     {
         subtitle =  hb_list_item( title->list_subtitle, i );
@@ -497,22 +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 );
 
-            /*
-             * Disable forced subtitles if we didn't find any in the scan
-             * so that we display normal subtitles instead.
-             *
-             * select_subtitle implies that we did a scan.
-             */
-            if( !job->indepth_scan && subtitle->force &&
-                job->select_subtitle )
-            {
-                if( subtitle->forced_hits == 0 )
-                {
-                    subtitle->force = 0;
-                }
-            }
-
-            if( (!job->indepth_scan || subtitle->force) && 
+            if( (!job->indepth_scan || job->select_subtitle_config.force) && 
                 subtitle->source == VOBSUB ) {
                 /*
                  * Don't add threads for subtitles when we are scanning, unless
@@ -533,9 +590,18 @@ 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->dest == PASSTHRUSUB )
+                && subtitle->config.dest == PASSTHRUSUB )
             {
                 /*
                  * Passing through a subtitle picture, this will have to
@@ -917,9 +983,14 @@ cleanup:
         for( i=0; i < hb_list_count( title->list_subtitle ); i++ )
         {
             subtitle =  hb_list_item( title->list_subtitle, i );
+
             hb_log( "Subtitle stream 0x%x '%s': %d hits (%d forced)",
                     subtitle->id, subtitle->lang, subtitle->hits,
                     subtitle->forced_hits );
+
+            if( subtitle->hits == 0 )
+                continue;
+
             if( subtitle->hits > subtitle_highest )
             {
                 subtitle_highest = subtitle->hits;
@@ -941,67 +1012,48 @@ 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 )
-                {
-                    hb_list_rem( title->list_subtitle, subtitle );
-                    *( job->select_subtitle ) = subtitle;
-                }
+                subtitle->config = job->select_subtitle_config;
+                hb_list_rem( title->list_subtitle, subtitle );
+                interjob->select_subtitle = subtitle;
+                break;
             }
-        } else {
-            /*
-             * Must be the end of pass 0 or 2 - we don't need this anymore.
-             *
-             * Have to put the subtitle list back together in the title though
-             * or the GUI will have a hissy fit.
-             */
-            free( job->select_subtitle );
-            job->select_subtitle = NULL;
         }
     }