All pastes #1465683 Raw Edit

HB native language in CLI

public diff v1 · immutable
#1465683 ·published 2009-06-19 03:23 UTC
rendered paste body
Index: test/test.c===================================================================--- test/test.c	(revision 2563)+++ test/test.c	(working copy)@@ -39,6 +39,7 @@ static int    titleindex  = 1; static int    longest_title = 0; static char * native_language = NULL;+static int    native_dub  = 0; static int    twoPass     = 0; static int    deinterlace           = 0; static char * deinterlace_opt       = 0;@@ -368,7 +369,6 @@ static void PrintTitleInfo( hb_title_t * title ) {     hb_chapter_t  * chapter;-    hb_audio_config_t    * audio;     hb_subtitle_t * subtitle;     int i; @@ -1319,8 +1319,40 @@             }              /* Parse audio tracks */+            if( native_language && native_dub )+            {+                if( hb_list_count(audios) == 0 )+                {+                    for( i = 0; i < hb_list_count( title->list_audio ); i++ )+                    {+                        char audio_lang[4];+                        +                        audio = hb_list_audio_config_item( title->list_audio, i );+                        +                        strncpy( audio_lang, audio->lang.iso639_2, sizeof( audio_lang ) );+                        +                        if( strncasecmp( native_language, audio_lang, +                                         sizeof( audio_lang ) ) == 0 ) +                        {+                            /*+                             * Matched an audio to our native language - use it.+                             */+                            audio = calloc(1, sizeof(*audio));+                            hb_audio_config_init(audio);+                            audio->in.track = i;+                            audio->out.track = num_audio_tracks++;+                            /* Add it to our audios */+                            hb_list_add(audios, audio);+                            break;+                        }+                    }+                } else {+                    fprintf( stderr, "Warning: Native language (dubbing) selection ignored since an audio track has already been selected\n");+                }+            }+             if( hb_list_count(audios) == 0 )-            {+            {                         /* Create a new audio track with default settings */                 audio = calloc(1, sizeof(*audio));                 hb_audio_config_init(audio);@@ -1677,6 +1709,8 @@                             job->select_subtitle_config.force = force;                             job->select_subtitle_config.default_track = def;                             subtitle_scan = 1;+                        } else {+                            fprintf( stderr, "Warning: Subtitle Scan for MP4 requires the '--subtitle-burn' option to be selected\n");                         }                     }                     else@@ -1690,7 +1724,7 @@                         subtitle = hb_list_item(title->list_subtitle, track);                         if( subtitle == NULL )                          {-                            fprintf( stderr, "Could not find subtitle track %d, skipped\n", track );+                            fprintf( stderr, "Warning: Could not find subtitle track %d, skipped\n", track+1 );                             continue;                         }                         sub_config = subtitle->config;@@ -1717,6 +1751,7 @@                              subtitle->format == PICTURESUB)                         {                             // Skip any non-burned vobsubs when output is mp4+                            fprintf( stderr, "Warning: Skipping subtitle track %d, can't pass-through VOBSUBs in an MP4 container,\nadd '--subtitle-burn %d' to the command line\n", track+1, track+1 );                             continue;                         }                         else if ( burn && subtitle->format == PICTURESUB )@@ -1724,11 +1759,11 @@                             // Only allow one subtitle to be burned into video                             if ( sub_burned )                             {+                                fprintf( stderr, "Warning: Skipping subtitle track %d, can't have more than one track burnt in\n", track+1 );                                 continue;                             }                             sub_burned = 1;                         }-                         sub_config.force = force;                         sub_config.default_track = def;                         hb_subtitle_add( job, &sub_config, track );@@ -1736,19 +1771,76 @@                 }             } -            if( native_language )+            if( native_language && !native_dub )             {-                job->native_language = strdup( native_language );-                if ( subtracks == NULL )+                char audio_lang[4];+                //job->native_language = strdup( native_language );+                +                audio = hb_list_audio_config_item(job->list_audio, 0);+                +                if( audio )                  {-                    if ( subforce )-                        job->select_subtitle_config.force = 1;+                    strncpy( audio_lang, audio->lang.iso639_2, sizeof( audio_lang ) );+                    +                    if( strncasecmp( native_language, audio_lang, +                                     sizeof( audio_lang ) ) != 0 )+                    {+                        /*+                         * Audio language is not the same as our native language. +                         * If we have any subtitles in our native language they+                         * should be selected here if they haven't already been.+                         */+                        hb_subtitle_t *subtitle, *subtitle2 = NULL;+                        int matched_track = 0; -                    if ( subburn == NULL && mux != HB_MUX_MP4 )-                        job->select_subtitle_config.force = 1;+                        for( i = 0; i < hb_list_count( title->list_subtitle ); i++ )+                        {+                            subtitle = hb_list_item( title->list_subtitle, i );+                            matched_track = i;+                            if( strcmp( subtitle->iso639_2, native_language ) == 0 )+                            {  +                                /*+                                 * Found the first matching subtitle in our+                                 * native language. Is it already selected?+                                 */+                                for( i = 0; i < hb_list_count( job->list_subtitle ); i++ )+                                {+                                    subtitle2 =  hb_list_item( job->list_subtitle, i );+                                    +                                    if( subtitle2->track == subtitle->track) {+                                        /*+                                         * Already selected+                                         */+                                        break;+                                    }+                                    subtitle2 = NULL;+                                }+                                +                                if( subtitle2 == NULL ) +                                {+                                    /*+                                     * Not already selected, so select it.+                                     */+                                    hb_subtitle_config_t sub_config; -                    if ( subdefault )-                        job->select_subtitle_config.default_track = 1;+                                    sub_config = subtitle->config;++                                    if( mux == HB_MUX_MKV || subtitle->format == TEXTSUB)+                                    {+                                        sub_config.dest = PASSTHRUSUB;+                                    }++                                    sub_config.force = 0;+                                    sub_config.default_track = 1;+                                    hb_subtitle_add( job, &sub_config, matched_track);+                                }+                                /*+                                 * Stop searching.+                                 */+                                break;+                            }+                        }+                    }                 }             } @@ -2303,6 +2395,7 @@     #define KEEP_DISPLAY_ASPECT 265     #define SUB_BURNED          266     #define SUB_DEFAULT         267+    #define NATIVE_DUB          268          for( ;; )     {@@ -2334,6 +2427,7 @@             { "subtitle-burned", optional_argument,   NULL,    SUB_BURNED },             { "subtitle-default", optional_argument,   NULL,    SUB_DEFAULT },             { "native-language", required_argument, NULL,'N' },+            { "native-dub",  no_argument,       NULL,    NATIVE_DUB },              { "encoder",     required_argument, NULL,    'e' },             { "aencoder",    required_argument, NULL,    'E' },@@ -2548,6 +2642,9 @@             case 'N':                 native_language = strdup( optarg );                 break;+            case NATIVE_DUB:+                native_dub = 1;+                break;             case '2':                 twoPass = 1;                 break;Index: libhb/deccc608sub.c===================================================================--- libhb/deccc608sub.c	(revision 2563)+++ libhb/deccc608sub.c	(working copy)@@ -15,7 +15,7 @@ static int nofontcolor = 0; static enum encoding_type encoding = ENC_UTF_8; static int cc_channel = 1;-static enum output_format write_format = OF_SRT;+static enum output_format write_format = OF_TRANSCRIPT; static int sentence_cap = 1; static int subs_delay = 0; static LLONG screens_to_process = -1;@@ -1478,6 +1478,8 @@ void write_cc_line_as_transcript (struct eia608_screen *data, struct s_write *wb, int line_number) {     hb_buffer_t *buffer;+    LLONG ms_start = wb->data608->current_visible_start_ms;+    LLONG ms_end = get_fts(wb)+subs_delay;      if (sentence_cap)     {@@ -1497,8 +1499,8 @@          * Put this subtitle in a hb_buffer_t and shove it into the subtitle fifo          */         buffer = hb_buffer_init( length + 1 );-        buffer->start = wb->data608->current_visible_start_ms;-        buffer->stop = get_fts(wb);+        buffer->start = ms_start;+        buffer->stop = ms_end;         memcpy( buffer->data, wb->subline, length + 1 );         //hb_log("CC %lld: %s", buffer->stop, wb->subline); Index: libhb/hb.c===================================================================--- libhb/hb.c	(revision 2563)+++ libhb/hb.c	(working copy)@@ -1014,7 +1014,7 @@     title_copy->list_subtitle = hb_list_init();      /*-     * The following code is confusing, there are three ways in which+     * The following code is confusing, there are two ways in which      * we select subtitles and it depends on whether this is single or      * two pass mode.      *@@ -1022,17 +1022,13 @@      * 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->indepth_scan || job->native_language ) {+    if ( job->indepth_scan ) {          /*          * Find the first audio language that is being encoded@@ -1045,35 +1041,6 @@                 break;             }         }--        /*-         * 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 )-            {--                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.-                 */-                strncpy( audio_lang, job->native_language, sizeof( audio_lang ) );-            } else {-                /*-                 * native language is irrelevent, free it.-                 */-                free( job->native_language );-                job->native_language = NULL;-            }-        }     }      /*@@ -1098,14 +1065,6 @@                 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->native_language ) {-                    /*-                     * With native language just select the-                     * first match in our langiage, not all of-                     * them. Subsequent ones are likely to be commentary-                     */-                    break;-                }             }         }     } else {@@ -1113,48 +1072,19 @@          * Not doing a subtitle scan in this pass, but maybe we are in the          * first pass?          */-        if( job->pass != 1 && job->native_language )+        if( job->pass != 1 )         {             /*-             * 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.+             * Copy all of them from the input job, to the title_copy/job_copy.              */-            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 )+            for(  i = 0; i < hb_list_count(job->list_subtitle); i++ ) {+                if( ( subtitle = hb_list_item( job->list_subtitle, i ) ) )                 {-                    /*-                     * 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 subtitles, in which case only-             * bother adding them for pass 0 or pass 2 of a two-             * pass.-             */-            if( job->pass != 1 )-            {-                /*-                 * Copy all of them from the input job, to the title_copy/job_copy.-                 */-                for(  i = 0; i < hb_list_count(job->list_subtitle); i++ ) {-                    if( ( subtitle = hb_list_item( job->list_subtitle, i ) ) )-                    {-                        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: libhb/work.c===================================================================--- libhb/work.c	(revision 2563)+++ libhb/work.c	(working copy)@@ -1002,41 +1002,32 @@             }         } -        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 )+            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 ) )             {-                /*-                 * 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 )-            {-                /*-                 * 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");             }         }     }Index: libhb/common.h===================================================================--- libhb/common.h	(revision 2563)+++ libhb/common.h	(working copy)@@ -248,7 +248,6 @@      int                     indepth_scan;     hb_subtitle_config_t    select_subtitle_config;-    char                  * native_language;      int             angle;              // dvd angle to encode     int             frame_to_stop;       // declare eof when we hit this frame