diff -uNrp src/common/common.c src.new/common/common.c --- src/common/common.c 2012-07-19 16:39:07 +0300 +++ src.new/common/common.c 2012-07-19 16:40:10 +0300 @@ -993,6 +993,8 @@ int x264_param_parse( x264_param_t *p, c p->rc.i_aq_mode = atoi(value); OPT("aq-strength") p->rc.f_aq_strength = atof(value); + OPT("fade-compensate") + p->rc.f_fade_compensate = atof(value); OPT("pass") { int pass = x264_clip3( atoi(value), 0, 3 ); @@ -1340,7 +1342,10 @@ char *x264_param2string( x264_param_t *p s += sprintf( s, " subme=%d", p->analyse.i_subpel_refine ); s += sprintf( s, " psy=%d", p->analyse.b_psy ); if( p->analyse.b_psy ) + { + s += sprintf( s, " fade_compensate=%.2f", p->rc.f_fade_compensate ); s += sprintf( s, " psy_rd=%.2f:%.2f", p->analyse.f_psy_rd, p->analyse.f_psy_trellis ); + } s += sprintf( s, " mixed_ref=%d", p->analyse.b_mixed_references ); s += sprintf( s, " me_range=%d", p->analyse.i_me_range ); s += sprintf( s, " chroma_me=%d", p->analyse.b_chroma_me ); diff -uNrp src/encoder/encoder.c src.new/encoder/encoder.c --- src/encoder/encoder.c 2012-07-19 16:39:07 +0300 +++ src.new/encoder/encoder.c 2012-07-19 16:40:42 +0300 @@ -834,10 +834,15 @@ static int x264_validate_parameters( x26 x264_log( h, X264_LOG_WARNING, "--tune %s should be used if attempting to benchmark %s!\n", s, s ); } + if( h->param.analyse.i_weighted_pred == X264_WEIGHTP_NONE ) + h->param.rc.f_fade_compensate += 0.1; + if( !h->param.rc.b_mb_tree ) + h->param.rc.f_fade_compensate = 0; if( !h->param.analyse.b_psy ) { h->param.analyse.f_psy_rd = 0; h->param.analyse.f_psy_trellis = 0; + h->param.rc.f_fade_compensate = 0; } h->param.analyse.f_psy_rd = x264_clip3f( h->param.analyse.f_psy_rd, 0, 10 ); h->param.analyse.f_psy_trellis = x264_clip3f( h->param.analyse.f_psy_trellis, 0, 10 ); diff -uNrp src/encoder/slicetype.c src.new/encoder/slicetype.c --- src/encoder/slicetype.c 2012-05-23 13:16:44 +0300 +++ src.new/encoder/slicetype.c 2012-07-19 16:41:12 +0300 @@ -394,7 +394,7 @@ static void x264_weights_analyse( x264_t else SET_WEIGHT( weights[plane], 1, minscale, mindenom, minoff ); - if( h->param.analyse.i_weighted_pred == X264_WEIGHTP_FAKE && weights[0].weightfn && !plane ) + if( weights[0].weightfn && !plane ) fenc->f_weighted_cost_delta[i_delta_index] = (float)minscore / origscore; } @@ -928,7 +928,7 @@ static void x264_macroblock_tree_finish( int fps_factor = round( CLIP_DURATION(average_duration) / CLIP_DURATION(frame->f_duration) * 256 ); float weightdelta = 0.0; if( ref0_distance && frame->f_weighted_cost_delta[ref0_distance-1] > 0 ) - weightdelta = (1.0 - frame->f_weighted_cost_delta[ref0_distance-1]); + weightdelta = (1.0 - frame->f_weighted_cost_delta[ref0_distance-1]) * 10.0f * h->param.rc.f_fade_compensate; /* Allow the strength to be adjusted via qcompress, since the two * concepts are very similar. */ diff -uNrp src/x264.c src.new/x264.c --- src/x264.c 2012-07-19 16:39:08 +0300 +++ src.new/x264.c 2012-07-19 16:41:40 +0300 @@ -705,6 +705,8 @@ static void help( x264_param_t *defaults " - 2: Auto-variance AQ (experimental)\n", defaults->rc.i_aq_mode ); H1( " --aq-strength Reduces blocking and blurring in flat and\n" " textured areas. [%.1f]\n", defaults->rc.f_aq_strength ); + H1( " --fade-compensate Allocate more bits to fades [%.1f]\n", defaults->rc.f_fade_compensate ); + H2( " Approximate sane range: 0.0 - 1.0\n" ); H1( "\n" ); H0( " -p, --pass Enable multipass ratecontrol\n" " - 1: First pass, creates stats file\n" @@ -1021,6 +1023,7 @@ static struct option long_options[] = { "no-dct-decimate", no_argument, NULL, 0 }, { "aq-strength", required_argument, NULL, 0 }, { "aq-mode", required_argument, NULL, 0 }, + { "fade-compensate", required_argument, NULL, 0 }, { "deadzone-inter", required_argument, NULL, 0 }, { "deadzone-intra", required_argument, NULL, 0 }, { "level", required_argument, NULL, 0 }, diff -uNrp src/x264.h src.new/x264.h --- src/x264.h 2012-07-19 16:39:07 +0300 +++ src.new/x264.h 2012-07-19 16:41:54 +0300 @@ -399,6 +399,7 @@ typedef struct x264_param_t int i_aq_mode; /* psy adaptive QP. (X264_AQ_*) */ float f_aq_strength; + float f_fade_compensate; /* Give more bits to fades. */ int b_mb_tree; /* Macroblock-tree ratecontrol. */ int i_lookahead;