ref: 3536ad5bb9a630e58bd6503423023b16b40b201e
parent: 023304e4fe75d0799b1e9d79e839ea9e70b48e50
parent: 35358320e33b6602c5dd728367cf3db77f1f9af9
author: Paul Wilkins <paulwilkins@google.com>
date: Tue May 15 06:05:16 EDT 2012
Merge "First pass overhaul preparatory change." into experimental
--- a/vp8/encoder/firstpass.c
+++ b/vp8/encoder/firstpass.c
@@ -64,8 +64,6 @@
#define POW1 (double)cpi->oxcf.two_pass_vbrbias/100.0
#define POW2 (double)cpi->oxcf.two_pass_vbrbias/100.0
-#define NEW_BOOST 1
-
static int vscale_lookup[7] = {0, 1, 1, 2, 2, 3, 3};
static int hscale_lookup[7] = {0, 0, 1, 1, 2, 2, 3};
@@ -157,12 +155,13 @@
FILE *fpfile;
fpfile = fopen("firstpass.stt", "a");
- fprintf(fpfile, "%12.0f %12.0f %12.0f %12.4f %12.4f %12.4f %12.4f"
- " %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f"
- " %12.0f %12.0f %12.4f\n",
+ fprintf(fpfile, "%12.0f %12.0f %12.0f %12.0f %12.0f %12.4f %12.4f"
+ "%12.4f %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f"
+ "%12.0f %12.0f %12.4f %12.0f %12.0f %12.4f\n",
stats->frame,
stats->intra_error,
stats->coded_error,
+ stats->sr_coded_error,
stats->ssim_weighted_pred_err,
stats->pcnt_inter,
stats->pcnt_motion,
@@ -188,6 +187,7 @@
section->frame = 0.0;
section->intra_error = 0.0;
section->coded_error = 0.0;
+ section->sr_coded_error = 0.0;
section->ssim_weighted_pred_err = 0.0;
section->pcnt_inter = 0.0;
section->pcnt_motion = 0.0;
@@ -210,6 +210,7 @@
section->frame += frame->frame;
section->intra_error += frame->intra_error;
section->coded_error += frame->coded_error;
+ section->sr_coded_error += frame->sr_coded_error;
section->ssim_weighted_pred_err += frame->ssim_weighted_pred_err;
section->pcnt_inter += frame->pcnt_inter;
section->pcnt_motion += frame->pcnt_motion;
@@ -232,6 +233,7 @@
section->frame -= frame->frame;
section->intra_error -= frame->intra_error;
section->coded_error -= frame->coded_error;
+ section->sr_coded_error -= frame->sr_coded_error;
section->ssim_weighted_pred_err -= frame->ssim_weighted_pred_err;
section->pcnt_inter -= frame->pcnt_inter;
section->pcnt_motion -= frame->pcnt_motion;
@@ -256,6 +258,7 @@
section->intra_error /= section->count;
section->coded_error /= section->count;
+ section->sr_coded_error /= section->count;
section->ssim_weighted_pred_err /= section->count;
section->pcnt_inter /= section->count;
section->pcnt_second_ref /= section->count;
@@ -481,6 +484,7 @@
int recon_uv_stride = lst_yv12->uv_stride;
int64_t intra_error = 0;
int64_t coded_error = 0;
+ int64_t sr_coded_error = 0;
int sum_mvr = 0, sum_mvc = 0;
int sum_mvr_abs = 0, sum_mvc_abs = 0;
@@ -614,9 +618,12 @@
// Experimental search in a second reference frame ((0,0) based only)
if (cm->current_video_frame > 1)
{
- first_pass_motion_search(cpi, x, &zero_ref_mv, &tmp_mv.as_mv, gld_yv12, &gf_motion_error, recon_yoffset);
+ first_pass_motion_search(cpi, x, &zero_ref_mv,
+ &tmp_mv.as_mv, gld_yv12,
+ &gf_motion_error, recon_yoffset);
- if ((gf_motion_error < motion_error) && (gf_motion_error < this_error))
+ if ( (gf_motion_error < motion_error) &&
+ (gf_motion_error < this_error))
{
second_ref_count++;
}
@@ -625,7 +632,11 @@
xd->pre.y_buffer = lst_yv12->y_buffer + recon_yoffset;
xd->pre.u_buffer = lst_yv12->u_buffer + recon_uvoffset;
xd->pre.v_buffer = lst_yv12->v_buffer + recon_uvoffset;
+
+ sr_coded_error += gf_motion_error;
}
+ else
+ sr_coded_error += motion_error;
/* Intra assumed best */
best_ref_mv.as_int = 0;
@@ -702,6 +713,8 @@
}
}
}
+ else
+ sr_coded_error += (int64_t)this_error;
coded_error += (int64_t)this_error;
@@ -733,6 +746,7 @@
fps.frame = cm->current_video_frame ;
fps.intra_error = intra_error >> 8;
fps.coded_error = coded_error >> 8;
+ fps.sr_coded_error = sr_coded_error >> 8;
weight = simple_weight(cpi->Source);
@@ -1549,7 +1563,6 @@
return frame_boost;
}
-#if NEW_BOOST
static int calc_arf_boost(
VP8_COMP *cpi,
int offset,
@@ -1664,7 +1677,6 @@
return (*f_boost + *b_boost);
}
-#endif
// Analyse and define a gf/arf group .
static void define_gf_group(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame)
@@ -1700,7 +1712,6 @@
BOOL flash_detected;
cpi->twopass.gf_group_bits = 0;
- cpi->twopass.gf_decay_rate = 0;
vp8_clear_system_state(); //__asm emms;
@@ -1802,9 +1813,6 @@
old_boost_score = boost_score;
}
- cpi->twopass.gf_decay_rate =
- (i > 0) ? (int)(100.0 * (1.0 - decay_accumulator)) / i : 0;
-
// Dont allow conventional gf too near the next kf
if ((cpi->twopass.frames_to_key - i) < MIN_GF_INTERVAL)
{
@@ -1825,10 +1833,8 @@
cpi->gfu_boost = (int)(boost_score * 100.0) >> 4;
-#if NEW_BOOST
// Alterrnative boost calculation for alt ref
alt_boost = calc_arf_boost( cpi, 0, (i-1), (i-1), &f_boost, &b_boost );
-#endif
// Should we use the alternate refernce frame
if (allow_alt_ref &&
@@ -1836,7 +1842,6 @@
(i >= MIN_GF_INTERVAL) &&
// dont use ARF very near next kf
(i <= (cpi->twopass.frames_to_key - MIN_GF_INTERVAL)) &&
-#if NEW_BOOST
((next_frame.pcnt_inter > 0.75) ||
(next_frame.pcnt_second_ref > 0.5)) &&
((mv_in_out_accumulator / (double)i > -0.2) ||
@@ -1843,14 +1848,6 @@
(mv_in_out_accumulator > -2.0)) &&
(b_boost > 100) &&
(f_boost > 100) )
-#else
- (next_frame.pcnt_inter > 0.75) &&
- ((mv_in_out_accumulator / (double)i > -0.2) ||
- (mv_in_out_accumulator > -2.0)) &&
- (cpi->gfu_boost > 100) &&
- (cpi->twopass.gf_decay_rate <=
- (ARF_DECAY_THRESH + (cpi->gfu_boost / 200))) )
-#endif
{
int Boost;
int allocation_chunks;
@@ -1860,9 +1857,7 @@
int arf_frame_bits = 0;
int group_bits;
-#if NEW_BOOST
cpi->gfu_boost = alt_boost;
-#endif
// Estimate the bits to be allocated to the group as a whole
if ((cpi->twopass.kf_group_bits > 0) &&
@@ -1875,11 +1870,7 @@
group_bits = 0;
// Boost for arf frame
-#if NEW_BOOST
Boost = (alt_boost * vp8_gfboost_qadjust(Q)) / 100;
-#else
- Boost = (cpi->gfu_boost * 3 * vp8_gfboost_qadjust(Q)) / (2 * 100);
-#endif
Boost += (i * 50);
// Set max and minimum boost and hence minimum allocation
@@ -2042,11 +2033,7 @@
// For ARF frames
if (cpi->source_alt_ref_pending && i == 0)
{
-#if NEW_BOOST
Boost = (alt_boost * vp8_gfboost_qadjust(Q)) / 100;
-#else
- Boost = (cpi->gfu_boost * 3 * vp8_gfboost_qadjust(Q)) / (2 * 100);
-#endif
Boost += (cpi->baseline_gf_interval * 50);
// Set max and minimum boost and hence minimum allocation
@@ -2165,12 +2152,9 @@
// calculation of cpi->twopass.alt_extra_bits.
if ( cpi->baseline_gf_interval >= 3 )
{
-#if NEW_BOOST
int boost = (cpi->source_alt_ref_pending)
? b_boost : cpi->gfu_boost;
-#else
- int boost = cpi->gfu_boost;
-#endif
+
if ( boost >= 150 )
{
int pct_extra;
--- a/vp8/encoder/onyx_if.c
+++ b/vp8/encoder/onyx_if.c
@@ -1680,7 +1680,6 @@
// Set reference frame sign bias for ALTREF frame to 1 (for now)
cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
- cpi->twopass.gf_decay_rate = 0;
cpi->baseline_gf_interval = DEFAULT_GF_INTERVAL;
cpi->gold_is_last = 0 ;
--- a/vp8/encoder/onyx_int.h
+++ b/vp8/encoder/onyx_int.h
@@ -105,6 +105,7 @@
double frame;
double intra_error;
double coded_error;
+ double sr_coded_error;
double ssim_weighted_pred_err;
double pcnt_inter;
double pcnt_motion;
@@ -570,7 +571,6 @@
int frames_to_key;
int maxq_max_limit;
int maxq_min_limit;
- int gf_decay_rate;
int static_scene_max_gf_interval;
int kf_bits;
int gf_group_error_left; // Remaining error from uncoded frames in a gf group. Two pass use only
--
⑨