diff --git a/common/base.c b/common/base.c index 5b35a2e3..9d572c90 100644 --- a/common/base.c +++ b/common/base.c @@ -1334,6 +1334,8 @@ REALIGN_STACK int x264_param_parse( x264_param_t *p, const char *name, const cha 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 ); @@ -1442,7 +1444,10 @@ char *x264_param2string( x264_param_t *p, int b_res ) 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 --git a/encoder/encoder.c b/encoder/encoder.c index b946cddf..9e43ad7c 100644 --- a/encoder/encoder.c +++ b/encoder/encoder.c @@ -1189,10 +1189,15 @@ static int validate_parameters( x264_t *h, int b_open ) 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 --git a/encoder/slicetype.c b/encoder/slicetype.c index 0315ba6b..527287a8 100644 --- a/encoder/slicetype.c +++ b/encoder/slicetype.c @@ -459,7 +459,7 @@ void x264_weights_analyse( x264_t *h, x264_frame_t *fenc, x264_frame_t *ref, int 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; } @@ -1031,7 +1031,7 @@ static void macroblock_tree_finish( x264_t *h, x264_frame_t *frame, float averag int fps_factor = round( CLIP_DURATION(average_duration) / CLIP_DURATION(frame->f_duration) * 256 / MBTREE_PRECISION ); 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 --git a/x264.c b/x264.c index 4765973a..e06d622d 100644 --- a/x264.c +++ b/x264.c @@ -751,6 +751,8 @@ static void help( x264_param_t *defaults, int longhelp ) " - 3: Auto-variance AQ with bias to dark scenes\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" @@ -1092,6 +1094,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 --git a/x264.h b/x264.h index d9644b6f..a2aeb769 100644 --- a/x264.h +++ b/x264.h @@ -454,6 +454,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;