diff options
-rw-r--r-- | vp9/common/vp9_blockd.h | 3 | ||||
-rw-r--r-- | vp9/common/vp9_reconintra.c | 4 | ||||
-rw-r--r-- | vp9/decoder/vp9_decodeframe.c | 2 | ||||
-rw-r--r-- | vp9/encoder/vp9_encodeframe.c | 27 | ||||
-rw-r--r-- | vp9/encoder/vp9_encoder.c | 5 | ||||
-rw-r--r-- | vp9/encoder/vp9_firstpass.c | 3 |
6 files changed, 31 insertions, 13 deletions
diff --git a/vp9/common/vp9_blockd.h b/vp9/common/vp9_blockd.h index 504342fdf..2ceb5dbb4 100644 --- a/vp9/common/vp9_blockd.h +++ b/vp9/common/vp9_blockd.h @@ -165,6 +165,9 @@ typedef struct macroblockd { unsigned int max_blocks_wide; unsigned int max_blocks_high; + int mi_row; + int mi_col; + const vpx_prob (*partition_probs)[PARTITION_TYPES - 1]; /* Distance of MB away from frame edges */ diff --git a/vp9/common/vp9_reconintra.c b/vp9/common/vp9_reconintra.c index 3e5ed616d..7d3eec1c5 100644 --- a/vp9/common/vp9_reconintra.c +++ b/vp9/common/vp9_reconintra.c @@ -408,8 +408,8 @@ void vp9_predict_intra_block(const MACROBLOCKD *xd, int bwl_in, TX_SIZE tx_size, int aoff, int loff, int plane) { const int bw = (1 << bwl_in); const int txw = (1 << tx_size); - const int have_top = loff || (xd->above_mi != NULL); - const int have_left = aoff || (xd->left_mi != NULL); + const int have_top = loff || xd->mi_row > 0; + const int have_left = aoff || xd->mi_col > xd->tile.mi_col_start; const int have_right = (aoff + txw) < bw; const int x = aoff * 4; const int y = loff * 4; diff --git a/vp9/decoder/vp9_decodeframe.c b/vp9/decoder/vp9_decodeframe.c index c75c3d9a4..8873c3c17 100644 --- a/vp9/decoder/vp9_decodeframe.c +++ b/vp9/decoder/vp9_decodeframe.c @@ -815,6 +815,8 @@ static MODE_INFO *set_offsets(VP9_COMMON *const cm, MACROBLOCKD *const xd, // TODO(slavarnway): Generate sb_type based on bwl and bhl, instead of // passing bsize from decode_partition(). xd->mi[0]->sb_type = bsize; + xd->mi_row = mi_row; + xd->mi_col = mi_col; for (y = 0; y < y_mis; ++y) for (x = !y; x < x_mis; ++x) { xd->mi[y * cm->mi_stride + x] = xd->mi[0]; diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c index 57d74b031..a0e531e3d 100644 --- a/vp9/encoder/vp9_encodeframe.c +++ b/vp9/encoder/vp9_encodeframe.c @@ -252,6 +252,8 @@ static INLINE void set_mode_info_offsets(VP9_COMMON *const cm, const int idx_str = xd->mi_stride * mi_row + mi_col; xd->mi = cm->mi_grid_visible + idx_str; xd->mi[0] = cm->mi + idx_str; + xd->mi_row = mi_row; + xd->mi_col = mi_col; x->mbmi_ext = x->mbmi_ext_base + (mi_row * cm->mi_cols + mi_col); } @@ -5873,6 +5875,20 @@ static void encode_frame_internal(VP9_COMP *cpi) { cpi->rd.r0 = (double)intra_cost_base / mc_dep_cost_base; } + // Frame segmentation + if (cpi->sf.enable_wiener_variance && cm->show_frame) { + int mi_row, mi_col; + cpi->kmeans_data_size = 0; + cpi->kmeans_ctr_num = 5; + + for (mi_row = 0; mi_row < cm->mi_rows; mi_row += MI_BLOCK_SIZE) + for (mi_col = 0; mi_col < cm->mi_cols; mi_col += MI_BLOCK_SIZE) + wiener_var_rdmult(cpi, BLOCK_64X64, mi_row, mi_col, cpi->rd.RDMULT); + + vp9_kmeans(cpi->kmeans_ctr_ls, cpi->kmeans_boundary_ls, cpi->kmeans_ctr_num, + cpi->kmeans_data_arr, cpi->kmeans_data_size); + } + { struct vpx_usec_timer emr_timer; vpx_usec_timer_start(&emr_timer); @@ -5884,11 +5900,6 @@ static void encode_frame_internal(VP9_COMP *cpi) { } #endif - if (cpi->sf.enable_wiener_variance && cm->show_frame) { - cpi->kmeans_data_size = 0; - cpi->kmeans_ctr_num = 5; - } - if (!cpi->row_mt) { cpi->row_mt_sync_read_ptr = vp9_row_mt_sync_read_dummy; cpi->row_mt_sync_write_ptr = vp9_row_mt_sync_write_dummy; @@ -5904,12 +5915,6 @@ static void encode_frame_internal(VP9_COMP *cpi) { vp9_encode_tiles_row_mt(cpi); } - if (cpi->sf.enable_wiener_variance && cm->show_frame) { - vp9_kmeans(cpi->kmeans_ctr_ls, cpi->kmeans_boundary_ls, - cpi->kmeans_ctr_num, cpi->kmeans_data_arr, - cpi->kmeans_data_size); - } - vpx_usec_timer_mark(&emr_timer); cpi->time_encode_sb_row += vpx_usec_timer_elapsed(&emr_timer); } diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index edad53d31..ccaa0815d 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -6020,6 +6020,8 @@ static void mode_estimation(VP9_COMP *cpi, MACROBLOCK *x, MACROBLOCKD *xd, xd->mb_to_right_edge = ((cm->mi_cols - 1 - mi_col) * MI_SIZE) * 8; xd->above_mi = (mi_row > 0) ? &mi_above : NULL; xd->left_mi = (mi_col > 0) ? &mi_left : NULL; + xd->mi_row = mi_row; + xd->mi_col = mi_col; // Intra prediction search for (mode = DC_PRED; mode <= TM_PRED; ++mode) { @@ -6787,6 +6789,9 @@ static void mc_flow_dispenser(VP9_COMP *cpi, GF_PICTURE *gf_picture, xd->mi[0] = cm->mi; xd->cur_buf = this_frame; + xd->tile.mi_row_start = 0; + xd->tile.mi_col_start = 0; + // Get rd multiplier set up. rdmult = vp9_compute_rd_mult_based_on_qindex(cpi, tpl_frame->base_qindex); set_error_per_bit(&cpi->td.mb, rdmult); diff --git a/vp9/encoder/vp9_firstpass.c b/vp9/encoder/vp9_firstpass.c index 620d21f5a..11c607cc6 100644 --- a/vp9/encoder/vp9_firstpass.c +++ b/vp9/encoder/vp9_firstpass.c @@ -851,6 +851,7 @@ void vp9_first_pass_encode_tile_mb_row(VP9_COMP *cpi, ThreadData *td, xd->mi = cm->mi_grid_visible + xd->mi_stride * (mb_row << 1) + mb_col_start; xd->mi[0] = cm->mi + xd->mi_stride * (mb_row << 1) + mb_col_start; + xd->tile = tile; for (i = 0; i < MAX_MB_PLANE; ++i) { p[i].coeff = ctx->coeff_pbuf[i][1]; @@ -915,6 +916,8 @@ void vp9_first_pass_encode_tile_mb_row(VP9_COMP *cpi, ThreadData *td, // are available. Required by vp9_predict_intra_block(). xd->above_mi = (mb_row != 0) ? &mi_above : NULL; xd->left_mi = ((mb_col << 1) > tile.mi_col_start) ? &mi_left : NULL; + xd->mi_row = mb_row << 1; + xd->mi_col = mb_col << 1; // Do intra 16x16 prediction. x->skip_encode = 0; |