diff -uNrp src/common/common.c src.new/common/common.c --- src/common/common.c 2011-04-13 18:54:13 +0300 +++ src.new/common/common.c 2011-04-13 18:54:58 +0300 @@ -940,6 +940,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 ); @@ -1264,7 +1266,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 2011-04-13 18:54:13 +0300 +++ src.new/encoder/encoder.c 2011-04-13 18:56:31 +0300 @@ -749,10 +749,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; } if( !h->param.analyse.i_trellis ) h->param.analyse.f_psy_trellis = 0; diff -uNrp src/encoder/slicetype.c src.new/encoder/slicetype.c --- src/encoder/slicetype.c 2011-04-13 14:46:31 +0300 +++ src.new/encoder/slicetype.c 2011-04-13 18:57:20 +0300 @@ -326,7 +326,7 @@ void x264_weights_analyse( x264_t *h, x2 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; } @@ -756,7 +756,7 @@ static void x264_macroblock_tree_finish( int fps_factor_propagate = round( CLIP_DURATION( average_duration) / BASE_FRAME_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 2011-04-13 18:54:14 +0300 +++ src.new/x264.c 2011-04-13 18:57:45 +0300 @@ -660,6 +660,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" @@ -966,6 +968,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 2011-04-13 18:54:13 +0300 +++ src.new/x264.h 2011-04-13 18:57:57 +0300 @@ -366,6 +366,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;