Index: source/libvpx/vp9/encoder/vp9_firstpass.c |
=================================================================== |
--- source/libvpx/vp9/encoder/vp9_firstpass.c (revision 284462) |
+++ source/libvpx/vp9/encoder/vp9_firstpass.c (working copy) |
@@ -98,34 +98,6 @@ |
return &p->stats_in[offset]; |
} |
-#if CONFIG_FP_MB_STATS |
-static int input_mb_stats(FIRSTPASS_FRAME_MB_STATS *fp_frame_stats, |
- const VP9_COMMON *const cm) { |
- FILE *fpfile; |
- int ret; |
- |
- fpfile = fopen("firstpass_mb.stt", "r"); |
- fseek(fpfile, cm->current_video_frame * cm->MBs * sizeof(FIRSTPASS_MB_STATS), |
- SEEK_SET); |
- ret = fread(fp_frame_stats->mb_stats, sizeof(FIRSTPASS_MB_STATS), cm->MBs, |
- fpfile); |
- fclose(fpfile); |
- if (ret < cm->MBs) { |
- return EOF; |
- } |
- return 1; |
-} |
- |
-static void output_mb_stats(FIRSTPASS_FRAME_MB_STATS *fp_frame_stats, |
- const VP9_COMMON *const cm) { |
- FILE *fpfile; |
- |
- fpfile = fopen("firstpass_mb.stt", "a"); |
- fwrite(fp_frame_stats->mb_stats, sizeof(FIRSTPASS_MB_STATS), cm->MBs, fpfile); |
- fclose(fpfile); |
-} |
-#endif |
- |
static int input_stats(TWO_PASS *p, FIRSTPASS_STATS *fps) { |
if (p->stats_in >= p->stats_in_end) |
return EOF; |
@@ -175,6 +147,17 @@ |
#endif |
} |
+#if CONFIG_FP_MB_STATS |
+static void output_fpmb_stats(uint8_t *this_frame_mb_stats, VP9_COMMON *cm, |
+ struct vpx_codec_pkt_list *pktlist) { |
+ struct vpx_codec_cx_pkt pkt; |
+ pkt.kind = VPX_CODEC_FPMB_STATS_PKT; |
+ pkt.data.firstpass_mb_stats.buf = this_frame_mb_stats; |
+ pkt.data.firstpass_mb_stats.sz = cm->MBs * sizeof(uint8_t); |
+ vpx_codec_pkt_list_add(pktlist, &pkt); |
+} |
+#endif |
+ |
static void zero_stats(FIRSTPASS_STATS *section) { |
section->frame = 0.0; |
section->intra_error = 0.0; |
@@ -473,7 +456,9 @@ |
const YV12_BUFFER_CONFIG *first_ref_buf = lst_yv12; |
#if CONFIG_FP_MB_STATS |
- FIRSTPASS_FRAME_MB_STATS *this_frame_mb_stats = &twopass->this_frame_mb_stats; |
+ if (cpi->use_fp_mb_stats) { |
+ vp9_zero_array(cpi->twopass.frame_mb_stats_buf, cm->MBs); |
+ } |
#endif |
vp9_clear_system_state(); |
@@ -486,25 +471,34 @@ |
const YV12_BUFFER_CONFIG *scaled_ref_buf = NULL; |
twopass = &cpi->svc.layer_context[cpi->svc.spatial_layer_id].twopass; |
+ if (cpi->common.current_video_frame == 0) { |
+ cpi->ref_frame_flags = 0; |
+ } else { |
+ LAYER_CONTEXT *lc = &cpi->svc.layer_context[cpi->svc.spatial_layer_id]; |
+ if (lc->current_video_frame_in_layer == 0) |
+ cpi->ref_frame_flags = VP9_GOLD_FLAG; |
+ else |
+ cpi->ref_frame_flags = VP9_LAST_FLAG | VP9_GOLD_FLAG; |
+ } |
+ |
vp9_scale_references(cpi); |
// Use either last frame or alt frame for motion search. |
if (cpi->ref_frame_flags & VP9_LAST_FLAG) { |
scaled_ref_buf = vp9_get_scaled_ref_frame(cpi, LAST_FRAME); |
ref_frame = LAST_FRAME; |
- } else if (cpi->ref_frame_flags & VP9_ALT_FLAG) { |
- scaled_ref_buf = vp9_get_scaled_ref_frame(cpi, ALTREF_FRAME); |
- ref_frame = ALTREF_FRAME; |
+ } else if (cpi->ref_frame_flags & VP9_GOLD_FLAG) { |
+ scaled_ref_buf = vp9_get_scaled_ref_frame(cpi, GOLDEN_FRAME); |
+ ref_frame = GOLDEN_FRAME; |
} |
- if (scaled_ref_buf != NULL) { |
- // Update the stride since we are using scaled reference buffer |
+ if (scaled_ref_buf != NULL) |
first_ref_buf = scaled_ref_buf; |
- recon_y_stride = first_ref_buf->y_stride; |
- recon_uv_stride = first_ref_buf->uv_stride; |
- uv_mb_height = 16 >> (first_ref_buf->y_height > first_ref_buf->uv_height); |
- } |
+ recon_y_stride = new_yv12->y_stride; |
+ recon_uv_stride = new_yv12->uv_stride; |
+ uv_mb_height = 16 >> (new_yv12->y_height > new_yv12->uv_height); |
+ |
// Disable golden frame for svc first pass for now. |
gld_yv12 = NULL; |
set_ref_ptrs(cm, xd, ref_frame, NONE); |
@@ -605,12 +599,7 @@ |
#if CONFIG_FP_MB_STATS |
if (cpi->use_fp_mb_stats) { |
- this_frame_mb_stats->mb_stats[mb_row * cm->mb_cols + mb_col].mode = |
- DC_PRED; |
- this_frame_mb_stats->mb_stats[mb_row * cm->mb_cols + mb_col].err = |
- this_error; |
- this_frame_mb_stats->mb_stats[mb_row * cm->mb_cols + mb_col].mv.as_int |
- = 0; |
+ // TODO(pengchong): store some related block statistics here |
} |
#endif |
@@ -741,12 +730,7 @@ |
#if CONFIG_FP_MB_STATS |
if (cpi->use_fp_mb_stats) { |
- this_frame_mb_stats->mb_stats[mb_row * cm->mb_cols + mb_col].mode = |
- NEWMV; |
- this_frame_mb_stats->mb_stats[mb_row * cm->mb_cols + mb_col].err = |
- motion_error; |
- this_frame_mb_stats->mb_stats[mb_row * cm->mb_cols + mb_col].mv. |
- as_int = mv.as_int; |
+ // TODO(pengchong): save some related block statistics here |
} |
#endif |
@@ -857,7 +841,7 @@ |
#if CONFIG_FP_MB_STATS |
if (cpi->use_fp_mb_stats) { |
- output_mb_stats(this_frame_mb_stats, cm); |
+ output_fpmb_stats(twopass->frame_mb_stats_buf, cm, cpi->output_pkt_list); |
} |
#endif |
} |
@@ -909,6 +893,8 @@ |
} |
++cm->current_video_frame; |
+ if (cpi->use_svc) |
+ vp9_inc_frame_in_layer(&cpi->svc); |
} |
static double calc_correction_factor(double err_per_mb, |
@@ -1506,7 +1492,7 @@ |
double mv_in_out_accumulator = 0.0; |
double abs_mv_in_out_accumulator = 0.0; |
double mv_ratio_accumulator_thresh; |
- unsigned int allow_alt_ref = is_altref_enabled(oxcf); |
+ unsigned int allow_alt_ref = is_altref_enabled(cpi); |
int f_boost = 0; |
int b_boost = 0; |
@@ -2080,6 +2066,11 @@ |
default: |
assert(0); |
} |
+ if (cpi->use_svc && cpi->svc.number_temporal_layers == 1) { |
+ cpi->refresh_golden_frame = 0; |
+ if (cpi->alt_ref_source == NULL) |
+ cpi->refresh_alt_ref_frame = 0; |
+ } |
} |
@@ -2122,6 +2113,18 @@ |
#endif |
vp9_rc_set_frame_target(cpi, target_rate); |
cm->frame_type = INTER_FRAME; |
+ |
+ if (is_spatial_svc) { |
+ if (cpi->svc.spatial_layer_id == 0) { |
+ lc->is_key_frame = 0; |
+ } else { |
+ lc->is_key_frame = cpi->svc.layer_context[0].is_key_frame; |
+ |
+ if (lc->is_key_frame) |
+ cpi->ref_frame_flags &= (~VP9_LAST_FLAG); |
+ } |
+ } |
+ |
return; |
} |
@@ -2189,17 +2192,10 @@ |
} |
rc->frames_till_gf_update_due = rc->baseline_gf_interval; |
- cpi->refresh_golden_frame = 1; |
+ if (!is_spatial_svc) |
+ cpi->refresh_golden_frame = 1; |
} |
- { |
- FIRSTPASS_STATS next_frame; |
- if (lookup_next_frame_stats(twopass, &next_frame) != EOF) { |
- twopass->next_iiratio = (int)(next_frame.intra_error / |
- DOUBLE_DIVIDE_CHECK(next_frame.coded_error)); |
- } |
- } |
- |
configure_buffer_updates(cpi); |
target_rate = twopass->gf_group.bit_allocation[twopass->gf_group.index]; |
@@ -2218,12 +2214,6 @@ |
// Update the total stats remaining structure. |
subtract_stats(&twopass->total_left_stats, &this_frame); |
- |
-#if CONFIG_FP_MB_STATS |
- if (cpi->use_fp_mb_stats) { |
- input_mb_stats(&twopass->this_frame_mb_stats, cm); |
- } |
-#endif |
} |
void vp9_twopass_postencode_update(VP9_COMP *cpi) { |