Index: source/libvpx/vp9/encoder/vp9_pickmode.c |
=================================================================== |
--- source/libvpx/vp9/encoder/vp9_pickmode.c (revision 290053) |
+++ source/libvpx/vp9/encoder/vp9_pickmode.c (working copy) |
@@ -212,11 +212,11 @@ |
*sse_y = sse; |
if (sse < dc_quant * dc_quant >> 6) |
- x->skip_txfm = 1; |
+ x->skip_txfm[0] = 1; |
else if (var < ac_quant * ac_quant >> 6) |
- x->skip_txfm = 2; |
+ x->skip_txfm[0] = 2; |
else |
- x->skip_txfm = 0; |
+ x->skip_txfm[0] = 0; |
if (cpi->common.tx_mode == TX_MODE_SELECT) { |
if (sse > (var << 2)) |
@@ -394,7 +394,8 @@ |
INTERP_FILTER filter_ref = cm->interp_filter; |
int bsl = mi_width_log2(bsize); |
const int pred_filter_search = cm->interp_filter == SWITCHABLE ? |
- (((mi_row + mi_col) >> bsl) + get_chessboard_index(cm)) % 2 : 0; |
+ (((mi_row + mi_col) >> bsl) + |
+ get_chessboard_index(cm->current_video_frame)) & 0x1 : 0; |
int const_motion[MAX_REF_FRAMES] = { 0 }; |
int bh = num_4x4_blocks_high_lookup[bsize] << 2; |
int bw = num_4x4_blocks_wide_lookup[bsize] << 2; |
@@ -409,6 +410,10 @@ |
PRED_BUFFER *this_mode_pred = NULL; |
int i; |
+ // CTX is used by the temporal denoiser which is currently being developed. |
+ // TODO(jbb): when temporal denoiser is finished and in the default build |
+ // remove the following line; |
+ (void) ctx; |
if (cpi->sf.reuse_inter_pred_sby) { |
for (i = 0; i < 3; i++) { |
tmp[i].data = &pred_buf[pixels_in_block * i]; |
@@ -453,7 +458,7 @@ |
vp9_setup_pred_block(xd, yv12_mb[ref_frame], yv12, mi_row, mi_col, |
sf, sf); |
- if (cm->coding_use_prev_mi) |
+ if (!cm->error_resilient_mode) |
vp9_find_mv_refs(cm, xd, tile, xd->mi[0], ref_frame, |
candidates, mi_row, mi_col); |
else |
@@ -553,7 +558,7 @@ |
if (cost < best_cost) { |
best_filter = filter; |
best_cost = cost; |
- skip_txfm = x->skip_txfm; |
+ skip_txfm = x->skip_txfm[0]; |
if (cpi->sf.reuse_inter_pred_sby) { |
if (this_mode_pred != current_pred) { |
@@ -579,7 +584,7 @@ |
dist = pf_dist[mbmi->interp_filter]; |
var_y = pf_var[mbmi->interp_filter]; |
sse_y = pf_sse[mbmi->interp_filter]; |
- x->skip_txfm = skip_txfm; |
+ x->skip_txfm[0] = skip_txfm; |
} else { |
mbmi->interp_filter = (filter_ref == SWITCHABLE) ? EIGHTTAP: filter_ref; |
vp9_build_inter_predictors_sby(xd, mi_row, mi_col, bsize); |
@@ -602,7 +607,7 @@ |
} |
} |
-#if CONFIG_DENOISING |
+#if CONFIG_VP9_TEMPORAL_DENOISING |
if (cpi->oxcf.noise_sensitivity > 0) { |
vp9_denoiser_update_frame_stats(&cpi->denoiser, mbmi, sse_y, |
this_mode, ctx); |
@@ -617,7 +622,7 @@ |
best_pred_filter = mbmi->interp_filter; |
best_tx_size = mbmi->tx_size; |
best_ref_frame = ref_frame; |
- skip_txfm = x->skip_txfm; |
+ skip_txfm = x->skip_txfm[0]; |
if (cpi->sf.reuse_inter_pred_sby) { |
if (best_pred != NULL) |
@@ -659,7 +664,7 @@ |
mbmi->ref_frame[0] = best_ref_frame; |
mbmi->mv[0].as_int = frame_mv[best_mode][best_ref_frame].as_int; |
xd->mi[0]->bmi[0].as_mv[0].as_int = mbmi->mv[0].as_int; |
- x->skip_txfm = skip_txfm; |
+ x->skip_txfm[0] = skip_txfm; |
// Perform intra prediction search, if the best SAD is above a certain |
// threshold. |
@@ -668,7 +673,6 @@ |
int i, j; |
const int width = num_4x4_blocks_wide_lookup[bsize]; |
const int height = num_4x4_blocks_high_lookup[bsize]; |
- const BLOCK_SIZE bsize_tx = txsize_to_bsize[mbmi->tx_size]; |
int rate2 = 0; |
int64_t dist2 = 0; |
@@ -678,28 +682,36 @@ |
TX_SIZE tmp_tx_size = MIN(max_txsize_lookup[bsize], |
tx_mode_to_biggest_tx_size[cpi->common.tx_mode]); |
+ const BLOCK_SIZE bsize_tx = txsize_to_bsize[tmp_tx_size]; |
const int step = 1 << tmp_tx_size; |
+ if (cpi->sf.reuse_inter_pred_sby) { |
+ pd->dst.buf = tmp[0].data; |
+ pd->dst.stride = bw; |
+ } |
+ |
for (this_mode = DC_PRED; this_mode <= DC_PRED; ++this_mode) { |
- if (cpi->sf.reuse_inter_pred_sby) { |
- pd->dst.buf = tmp[0].data; |
- pd->dst.stride = bw; |
- } |
- |
+ uint8_t *const src_buf_base = p->src.buf; |
+ uint8_t *const dst_buf_base = pd->dst.buf; |
for (j = 0; j < height; j += step) { |
for (i = 0; i < width; i += step) { |
+ p->src.buf = &src_buf_base[4 * (j * src_stride + i)]; |
+ pd->dst.buf = &dst_buf_base[4 * (j * dst_stride + i)]; |
+ // Use source buffer as an approximation for the fully reconstructed |
+ // buffer |
vp9_predict_intra_block(xd, block_idx, b_width_log2(bsize), |
tmp_tx_size, this_mode, |
- &p->src.buf[4 * (j * dst_stride + i)], |
- src_stride, |
- &pd->dst.buf[4 * (j * dst_stride + i)], |
- dst_stride, i, j, 0); |
+ p->src.buf, src_stride, |
+ pd->dst.buf, dst_stride, |
+ i, j, 0); |
model_rd_for_sb_y(cpi, bsize_tx, x, xd, &rate, &dist, &var_y, &sse_y); |
rate2 += rate; |
dist2 += dist; |
++block_idx; |
} |
} |
+ p->src.buf = src_buf_base; |
+ pd->dst.buf = dst_buf_base; |
rate = rate2; |
dist = dist2; |
@@ -721,7 +733,7 @@ |
mbmi->uv_mode = this_mode; |
mbmi->mv[0].as_int = INVALID_MV; |
} else { |
- x->skip_txfm = skip_txfm; |
+ x->skip_txfm[0] = skip_txfm; |
} |
} |
} |