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,42 @@ } /* 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 &&+ audio->lang.type != 3 && // Directors 1+ audio->lang.type != 4) // Directors 2+ {+ /*+ * 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 +1711,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 +1726,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 +1753,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 +1761,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 );@@ -1738,17 +1775,78 @@ if( native_language ) {- 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;+ if( native_dub )+ {+ fprintf( stderr, "Warning: no matching audio for native language - using subtitles instead.\n");+ }+ 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 +2401,7 @@ #define KEEP_DISPLAY_ASPECT 265 #define SUB_BURNED 266 #define SUB_DEFAULT 267+ #define NATIVE_DUB 268 for( ;; ) {@@ -2334,6 +2433,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 +2648,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