OSDN Git Service

Native language subtitle scan improvements. Thanks, eddyg!
authorjbrjake <jbrjake@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Thu, 26 Jul 2007 04:44:08 +0000 (04:44 +0000)
committerjbrjake <jbrjake@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Thu, 26 Jul 2007 04:44:08 +0000 (04:44 +0000)
git-svn-id: svn://localhost/HandBrake/trunk@741 b64f7644-9d1e-0410-96f1-a4d463321fa5

libhb/hb.c
libhb/work.c
test/test.c

index a956e95..f3ec1bb 100644 (file)
@@ -557,7 +557,21 @@ void hb_add( hb_handle_t * h, hb_job_t * job )
 
     title_copy->list_subtitle = hb_list_init();
 
-
+    /*
+     * The following code is confusing, there are three ways in which we select subtitles
+     * and it depends on whether this is single or two pass mode.
+     *
+     * subtitle_scan may be enabled, in which case the first pass scans all subtitles
+     * of that language. The second pass does not select any because they are set at the
+     * end of the first pass.
+     *
+     * native_language may have a preferred language, in which case we may be switching
+     * the language we want for the subtitles in the first pass of a single pass, or the
+     * second pass of a two pass.
+     *
+     * We may have manually selected a subtitle, in which case that is selected in the
+     * first pass of a single pass, or the second of a two pass.
+     */
     memset( audio_lang, 0, sizeof( audio_lang ) );
 
     if ( job->subtitle_scan || job->native_language ) {
@@ -578,15 +592,21 @@ void hb_add( hb_handle_t * h, hb_job_t * job )
             }
         }
 
-        
+        /*
+         * In all cases switch the language if we need to to our native
+         * language.
+         */
         if( job->native_language ) 
         {
             if( strncasecmp( job->native_language, audio_lang, 
                              sizeof( audio_lang ) ) != 0 )
             {             
                 
-                hb_log( "Enabled subtitles in native language '%s', audio is in '%s'",
-                        job->native_language, audio_lang);
+                if( job->pass != 2 )
+                {
+                    hb_log( "Enabled subtitles in native language '%s', audio is in '%s'",
+                            job->native_language, audio_lang);
+                }
                 /*
                  * The main audio track is not in our native language, so switch
                  * the subtitles to use our native language instead.
@@ -601,12 +621,13 @@ void hb_add( hb_handle_t * h, hb_job_t * job )
             }
         }
     }
-    
-    if ( job->subtitle_scan || job->native_language ) 
+
+    /*
+     * If doing a subtitle scan then add all the matching subtitles for this
+     * language.
+     */
+    if ( job->subtitle_scan ) 
     {
-        /*
-         * Select subtitles that match the language we want
-         */
         for( i=0; i < hb_list_count( title->list_subtitle ); i++ ) 
         {
             subtitle = hb_list_item( title->list_subtitle, i );
@@ -615,15 +636,18 @@ void hb_add( hb_handle_t * h, hb_job_t * job )
                 /*
                  * Matched subtitle language with audio language, so
                  * add this to our list to scan.
+                 *
+                 * We will update the subtitle list on the second pass
+                 * later after the first pass has completed.
                  */
                 subtitle_copy = malloc( sizeof( hb_subtitle_t ) );
                 memcpy( subtitle_copy, subtitle, sizeof( hb_subtitle_t ) );
                 hb_list_add( title_copy->list_subtitle, subtitle_copy );
-                if ( !job->subtitle_scan ) {
+                if ( job->native_language ) {
                     /*
                      * With native language just select the
                      * first match in our langiage, not all of
-                     * them.
+                     * them. Subsequent ones are likely to be commentary
                      */
                     break;
                 }
@@ -631,16 +655,56 @@ void hb_add( hb_handle_t * h, hb_job_t * job )
         }
     } else {
         /*
-         * Manually selected subtitle, in which case only bother adding them
-         * for pass 0 or pass 2 of a two pass.
+         * Not doing a subtitle scan in this pass, but maybe we are in the
+         * first pass?
          */
-        if( job->pass != 1 ) 
+        if( job->select_subtitle )
         {
-            if( ( subtitle = hb_list_item( title->list_subtitle, job->subtitle ) ) )
+            /*
+             * Don't add subtitles here, we'll add them via select_subtitle
+             * at the end of pass 1
+             */
+        } else {
+            /*
+             * Definitely not doing a subtitle scan.
+             */
+            if( job->pass != 1 && job->native_language ) 
             {
-                subtitle_copy = malloc( sizeof( hb_subtitle_t ) );
-                memcpy( subtitle_copy, subtitle, sizeof( hb_subtitle_t ) );
-                hb_list_add( title_copy->list_subtitle, subtitle_copy );
+                /*
+                 * We are not doing a subtitle scan but do want the
+                 * native langauge subtitle selected, so select it 
+                 * for pass 0 or pass 2 of a two pass.
+                 */
+                for( i=0; i < hb_list_count( title->list_subtitle ); i++ ) 
+                {
+                    subtitle = hb_list_item( title->list_subtitle, i );
+                    if( strcmp( subtitle->iso639_2, audio_lang ) == 0 ) 
+                    {
+                        /*
+                         * Matched subtitle language with audio language, so
+                         * add this to our list to scan.
+                         */
+                        subtitle_copy = malloc( sizeof( hb_subtitle_t ) );
+                        memcpy( subtitle_copy, subtitle, sizeof( hb_subtitle_t ) );
+                        hb_list_add( title_copy->list_subtitle, subtitle_copy );
+                        break;
+                    }
+                }
+            } else {
+                /*
+                 * Manually selected subtitle, in which case only
+                 * bother adding them for pass 0 or pass 2 of a two
+                 * pass.
+                 */
+                if( job->pass != 1 ) 
+                {
+                    if( ( subtitle = hb_list_item( title->list_subtitle, job->subtitle ) ) )
+                    {
+                        subtitle_copy = malloc( sizeof( hb_subtitle_t ) );
+                        memcpy( subtitle_copy, subtitle, sizeof( hb_subtitle_t ) );
+                        hb_list_add( title_copy->list_subtitle, subtitle_copy );
+                    }
+                }
             }
         }
     }
index 92707cc..49ac70c 100644 (file)
@@ -199,6 +199,11 @@ static void do_job( hb_job_t * job, int cpu_count )
 
     if( job->select_subtitle && !job->subtitle_scan ) 
     {
+        /*
+         * 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, *( job->select_subtitle ) );
     }
 
@@ -535,54 +540,56 @@ static void do_job( hb_job_t * job, int cpu_count )
         hb_fifo_close( &audio->fifo_sync );
         hb_fifo_close( &audio->fifo_out );
     }
-    
-    /*
-     * Before closing the title print out our subtitle stats if we need to
-     * Find the highest and lowest.
-     */
-    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",
-               subtitle->id, subtitle->lang, subtitle->hits );
-        if( subtitle->hits > subtitle_highest ) 
-        {
-            subtitle_highest = subtitle->hits;
-            subtitle_highest_id = subtitle->id;
-        } 
-
-        if( subtitle->hits < subtitle_lowest ) 
-        {
-            subtitle_lowest = subtitle->hits;
-            subtitle_lowest_id = subtitle->id;
-        }
-    }
 
-    if( job->native_language ) {
+    if( job->subtitle_scan )
+    {
         /*
-         * 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 first subtitle in our language.
+         * Before closing the title print out our subtitle stats if we need to
+         * Find the highest and lowest.
          */
-        subtitle =  hb_list_item( title->list_subtitle, 0 );
-        subtitle_hit = subtitle->id;
-        hb_log( "Found a native-language subtitle id 0x%x", subtitle_hit);
-    } else {
-        if( subtitle_lowest < subtitle_highest ) 
+        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",
+                    subtitle->id, subtitle->lang, subtitle->hits );
+            if( subtitle->hits > subtitle_highest ) 
+            {
+                subtitle_highest = subtitle->hits;
+                subtitle_highest_id = subtitle->id;
+            } 
+            
+            if( subtitle->hits < subtitle_lowest ) 
+            {
+                subtitle_lowest = subtitle->hits;
+                subtitle_lowest_id = subtitle->id;
+            }
+        }
+        
+        if( job->native_language ) {
             /*
-             * 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.
+             * 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( subtitle_lowest < ( subtitle_highest * 0.1 ) ) 
+            subtitle_hit = subtitle_highest_id;
+            hb_log( "Found a native-language subtitle id 0x%x", subtitle_hit);
+        } else {
+            if( subtitle_lowest < subtitle_highest ) 
             {
-                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");
+                /*
+                 * 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");
+                }
             }
         }
     }
index 9c85e31..929e3eb 100644 (file)
@@ -635,12 +635,9 @@ static int HandleEvents( hb_handle_t * h )
                  * Turn on subtitle scan if requested, note that this option
                  * precludes encoding of any actual subtitles.
                  */
-                job->subtitle_scan = subtitle_scan;
                 if ( subtitle_scan ) 
                 {
-                    fprintf( stderr, "Subtitle Scan Enabled, will scan all "
-                             "subtitles matching the audio language for any\n"
-                             "that meet our auto-selection criteria.\n");
+                    fprintf( stderr, "Warning: Subtitle Scan only works in two-pass, disabling\n");
                 }
                 job->pass = 0;
                 hb_add( h, job );