X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=libhb%2Fwork.c;h=752839bce0b7259dee24817f7462cb51ff60e630;hb=1c9c75d452c8d15ee972b4c4612763f9b95b1790;hp=848c798e4a944697a5bbc5adf858b3358dbe46ed;hpb=0d4f5926142be762389f82f1c560c67cfd4129b1;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/libhb/work.c b/libhb/work.c index 848c798e..752839bc 100644 --- a/libhb/work.c +++ b/libhb/work.c @@ -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 ); @@ -280,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"); } } @@ -335,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. @@ -351,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; @@ -362,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(); @@ -466,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 ) { - hb_list_add( title->list_subtitle, *( job->select_subtitle ) ); + interjob->select_subtitle->config.force = 0; + } + for( i=0; i < hb_list_count(title->list_subtitle); i++ ) + { + 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 ); @@ -490,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 @@ -526,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 @@ -910,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; @@ -934,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; } }