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