diff --git a/vp10/encoder/block.h b/vp10/encoder/block.h index 22f9723fb6cae179ac3eacc0a6939b5f2d7bc12a..9ee499c8fa3b04ba01b7c8b3b3176cdcacbdb7fc 100644 --- a/vp10/encoder/block.h +++ b/vp10/encoder/block.h @@ -165,14 +165,6 @@ struct macroblock { // use fast quantization process int quant_fp; - // skip forward transform and quantization - uint8_t skip_txfm[MAX_MB_PLANE][MAX_TX_BLOCKS_IN_MAX_SB]; - #define SKIP_TXFM_NONE 0 - #define SKIP_TXFM_AC_DC 1 - #define SKIP_TXFM_AC_ONLY 2 - - int64_t bsse[MAX_MB_PLANE][MAX_TX_BLOCKS_IN_MAX_SB]; - // Used to store sub partition's choices. MV pred_mv[MAX_REF_FRAMES]; diff --git a/vp10/encoder/encodeframe.c b/vp10/encoder/encodeframe.c index caca295766a257bf72d594b42afebe15b6516cb6..06be7b7733f85c137f297c02e0584a0dcb65030c 100644 --- a/vp10/encoder/encodeframe.c +++ b/vp10/encoder/encodeframe.c @@ -2294,8 +2294,6 @@ static void encode_sb(VP10_COMP *cpi, ThreadData *td, set_segment_id_supertx(cpi, x, mi_row, mi_col, bsize); if (!x->skip) { - memset(x->skip_txfm, 0, sizeof(x->skip_txfm)); - x->skip_optimize = 0; x->use_lp32x32fdct = cpi->sf.use_lp32x32fdct; @@ -4608,7 +4606,6 @@ static void encode_frame_internal(VP10_COMP *cpi) { cm->prev_mip + cm->mi_stride + 1 : NULL; x->quant_fp = cpi->sf.use_quant_fp; - vp10_zero(x->skip_txfm); #if CONFIG_VAR_TX #if CONFIG_REF_MV vp10_zero(x->blk_skip_drl); @@ -4990,8 +4987,6 @@ static void encode_superblock(VP10_COMP *cpi, ThreadData *td, const int mi_width = num_8x8_blocks_wide_lookup[bsize]; const int mi_height = num_8x8_blocks_high_lookup[bsize]; - memset(x->skip_txfm, 0, sizeof(x->skip_txfm)); - x->skip_optimize = ctx->is_coded; ctx->is_coded = 1; x->use_lp32x32fdct = cpi->sf.use_lp32x32fdct; @@ -6107,13 +6102,6 @@ static void rd_supertx_sb(VP10_COMP *cpi, ThreadData *td, set_offsets_without_segment_id(cpi, tile, x, mi_row, mi_col, bsize); set_segment_id_supertx(cpi, x, mi_row, mi_col, bsize); - // These skip_txfm flags are previously set by the non-supertx RD search. - // vp10_txfm_rd_in_plane_supertx calls block_rd_txfm, which checks these - // to reuse distortion values from the RD estimation, so we reset these - // flags here before evaluating RD for supertx coding. - for (plane = 0 ; plane < MAX_MB_PLANE ; plane++) - x->skip_txfm[plane][0] = SKIP_TXFM_NONE; - mbmi = &xd->mi[0]->mbmi; best_tx_nostx = mbmi->tx_type; diff --git a/vp10/encoder/encodemb.c b/vp10/encoder/encodemb.c index fcacf3a097a7488d70129d02b41cd5023a44c87c..65493a094a7471107b0b3db9e987cede7014e546 100644 --- a/vp10/encoder/encodemb.c +++ b/vp10/encoder/encodemb.c @@ -998,61 +998,13 @@ static void encode_block(int plane, int block, int blk_row, int blk_col, #else { #endif - if (x->quant_fp) { - // Encoding process for rtc mode - if (x->skip_txfm[0][0] == SKIP_TXFM_AC_DC && plane == 0) { - // skip forward transform - p->eobs[block] = 0; - *a = *l = 0; - return; - } else { -#if CONFIG_NEW_QUANT - vp10_xform_quant_fp_nuq(x, plane, block, blk_row, blk_col, plane_bsize, - tx_size, ctx); -#else - vp10_xform_quant(x, plane, block, blk_row, blk_col, plane_bsize, - tx_size, VP10_XFORM_QUANT_FP); -#endif - } - } else { - if (max_txsize_lookup[plane_bsize] == tx_size) { - int blk_index = (block >> (tx_size << 1)); - if (x->skip_txfm[plane][blk_index] == SKIP_TXFM_NONE) { - // full forward transform and quantization -#if CONFIG_NEW_QUANT - vp10_xform_quant_fp_nuq(x, plane, block, blk_row, blk_col, - plane_bsize, tx_size, ctx); -#else - vp10_xform_quant(x, plane, block, blk_row, blk_col, plane_bsize, - tx_size, VP10_XFORM_QUANT_FP); -#endif // CONFIG_NEW_QUANT - } else if (x->skip_txfm[plane][blk_index] == SKIP_TXFM_AC_ONLY) { - // fast path forward transform and quantization #if CONFIG_NEW_QUANT - vp10_xform_quant_dc_fp_nuq(x, plane, block, blk_row, blk_col, - plane_bsize, tx_size, ctx); + vp10_xform_quant_fp_nuq(x, plane, block, blk_row, blk_col, plane_bsize, + tx_size, ctx); #else - vp10_xform_quant(x, plane, block, blk_row, blk_col, plane_bsize, - tx_size, VP10_XFORM_QUANT_DC); + vp10_xform_quant(x, plane, block, blk_row, blk_col, plane_bsize, + tx_size, VP10_XFORM_QUANT_FP); #endif // CONFIG_NEW_QUANT - } else { - // skip forward transform - p->eobs[block] = 0; - *a = *l = 0; -#if !CONFIG_VAR_TX - return; -#endif - } - } else { -#if CONFIG_NEW_QUANT - vp10_xform_quant_fp_nuq(x, plane, block, blk_row, blk_col, plane_bsize, - tx_size, ctx); -#else - vp10_xform_quant(x, plane, block, blk_row, blk_col, plane_bsize, - tx_size, VP10_XFORM_QUANT_FP); -#endif // CONFIG_NEW_QUANT - } - } } #if CONFIG_VAR_TX else { diff --git a/vp10/encoder/rdopt.c b/vp10/encoder/rdopt.c index e0c79bce3424154a69e4eb5e0307975e1c06b243..a91af70dbd1d87bd3e7ff98b2f3dbe4b193f59d7 100644 --- a/vp10/encoder/rdopt.c +++ b/vp10/encoder/rdopt.c @@ -824,66 +824,41 @@ static void model_rd_for_sb(const VP10_COMP *const cpi, BLOCK_SIZE bsize, // Note our transform coeffs are 8 times an orthogonal transform. // Hence quantizer step is also 8 times. To get effective quantizer // we need to divide by 8 before sending to modeling function. - int i; + int plane; + const int ref = xd->mi[0]->mbmi.ref_frame[0]; + int64_t rate_sum = 0; int64_t dist_sum = 0; - const int ref = xd->mi[0]->mbmi.ref_frame[0]; - unsigned int sse; - unsigned int sum_sse = 0; int64_t total_sse = 0; - int skip_flag = 1; - int rate; - int64_t dist; x->pred_sse[ref] = 0; - for (i = plane_from; i <= plane_to; ++i) { - struct macroblock_plane *const p = &x->plane[i]; - struct macroblockd_plane *const pd = &xd->plane[i]; + for (plane = plane_from; plane <= plane_to; ++plane) { + struct macroblock_plane *const p = &x->plane[plane]; + struct macroblockd_plane *const pd = &xd->plane[plane]; const BLOCK_SIZE bs = get_plane_block_size(bsize, pd); - const TX_SIZE max_tx_size = max_txsize_lookup[bs]; - const BLOCK_SIZE unit_size = txsize_to_bsize[max_tx_size]; - int bw_shift = (b_width_log2_lookup[bs] - b_width_log2_lookup[unit_size]); - int bh_shift = (b_height_log2_lookup[bs] - b_width_log2_lookup[unit_size]); - int bw = 1 << bw_shift; - int bh = 1 << bh_shift; - int idx, idy; - int lw = b_width_log2_lookup[unit_size] + 2; - int lh = b_height_log2_lookup[unit_size] + 2; - sum_sse = 0; + unsigned int sse; + int rate; + int64_t dist; - for (idy = 0; idy < bh; ++idy) { - for (idx = 0; idx < bw; ++idx) { - uint8_t *src = p->src.buf + (idy * p->src.stride << lh) + (idx << lw); - uint8_t *dst = pd->dst.buf + (idy * pd->dst.stride << lh) + (idx << lh); - int block_idx = (idy << bw_shift) + idx; - int low_err_skip = 0; + // TODO(geza): Write direct sse functions that do not compute + // variance as well. + cpi->fn_ptr[bs].vf(p->src.buf, p->src.stride, + pd->dst.buf, pd->dst.stride, &sse); - cpi->fn_ptr[unit_size].vf(src, p->src.stride, - dst, pd->dst.stride, &sse); - x->bsse[i][block_idx] = sse; - sum_sse += sse; + if (plane == 0) + x->pred_sse[ref] = sse; - x->skip_txfm[i][block_idx] = SKIP_TXFM_NONE; + total_sse += sse; - if (skip_flag && !low_err_skip) - skip_flag = 0; - - if (i == 0) - x->pred_sse[ref] += sse; - } - } - - total_sse += sum_sse; - - model_rd_from_sse(cpi, xd, bs, i, sum_sse, &rate, &dist); + model_rd_from_sse(cpi, xd, bs, plane, sse, &rate, &dist); rate_sum += rate; dist_sum += dist; } - *skip_txfm_sb = skip_flag; + *skip_txfm_sb = total_sse == 0; *skip_sse_sb = total_sse << 4; *out_rate_sum = (int)rate_sum; *out_dist_sum = dist_sum; @@ -1246,56 +1221,6 @@ static void block_rd_txfm(int plane, int block, int blk_row, int blk_col, variance(src, src_stride, dst, dst_stride, &tmp); dist = (int64_t)tmp * 16; } - } else if (max_txsize_lookup[plane_bsize] == tx_size) { - if (x->skip_txfm[plane][block >> (tx_size << 1)] == - SKIP_TXFM_NONE) { - // full forward transform and quantization -#if CONFIG_NEW_QUANT - vp10_xform_quant_fp_nuq(x, plane, block, blk_row, blk_col, - plane_bsize, tx_size, ctx); -#else - vp10_xform_quant(x, plane, block, blk_row, blk_col, - plane_bsize, tx_size, VP10_XFORM_QUANT_FP); -#endif // CONFIG_NEW_QUANT - if (x->plane[plane].eobs[block]) - vp10_optimize_b(x, plane, block, tx_size, coeff_ctx); - dist_block(args->cpi, x, plane, block, blk_row, blk_col, - tx_size, &dist, &sse); - } else if (x->skip_txfm[plane][block >> (tx_size << 1)] == - SKIP_TXFM_AC_ONLY) { - // compute DC coefficient - tran_low_t *const coeff = BLOCK_OFFSET(x->plane[plane].coeff, block); - tran_low_t *const dqcoeff = BLOCK_OFFSET(xd->plane[plane].dqcoeff, block); -#if CONFIG_NEW_QUANT - vp10_xform_quant_dc_fp_nuq(x, plane, block, blk_row, blk_col, - plane_bsize, tx_size, ctx); -#else - vp10_xform_quant(x, plane, block, blk_row, blk_col, - plane_bsize, tx_size, VP10_XFORM_QUANT_DC); -#endif // CONFIG_NEW_QUANT - sse = x->bsse[plane][block >> (tx_size << 1)] << 4; - dist = sse; - if (x->plane[plane].eobs[block]) { - const int64_t orig_sse = (int64_t)coeff[0] * coeff[0]; - const int64_t resd_sse = coeff[0] - dqcoeff[0]; - int64_t dc_correct = orig_sse - resd_sse * resd_sse; - const struct macroblockd_plane *const pd = &xd->plane[plane]; - TX_TYPE tx_type = get_tx_type(pd->plane_type, xd, block, tx_size); - int shift = (MAX_TX_SCALE - get_tx_scale(xd, tx_type, tx_size)) * 2; -#if CONFIG_VP9_HIGHBITDEPTH - dc_correct >>= ((xd->bd - 8) * 2); -#endif - dc_correct >>= shift; - - dist = VPXMAX(0, sse - dc_correct); - } - } else { - // SKIP_TXFM_AC_DC - // skip forward transform - x->plane[plane].eobs[block] = 0; - sse = x->bsse[plane][block >> (tx_size << 1)] << 4; - dist = sse; - } } else { // full forward transform and quantization #if CONFIG_NEW_QUANT @@ -2876,7 +2801,6 @@ static int64_t rd_pick_intra_sby_mode(VP10_COMP *cpi, MACROBLOCK *x, #endif angle_estimation(src, src_stride, rows, cols, directional_mode_skip_mask); #endif // CONFIG_EXT_INTRA - memset(x->skip_txfm, SKIP_TXFM_NONE, sizeof(x->skip_txfm)); palette_mode_info.palette_size[0] = 0; pmi->palette_size[0] = 0; if (above_mi) @@ -4104,7 +4028,6 @@ static int64_t rd_pick_intra_sbuv_mode(VP10_COMP *cpi, MACROBLOCK *x, ext_intra_mode_info.use_ext_intra_mode[1] = 0; mbmi->ext_intra_mode_info.use_ext_intra_mode[1] = 0; #endif // CONFIG_EXT_INTRA - memset(x->skip_txfm, SKIP_TXFM_NONE, sizeof(x->skip_txfm)); palette_mode_info.palette_size[1] = 0; pmi->palette_size[1] = 0; for (mode = DC_PRED; mode <= TM_PRED; ++mode) { @@ -4209,7 +4132,6 @@ static int64_t rd_sbuv_dcpred(const VP10_COMP *cpi, MACROBLOCK *x, int64_t unused; x->e_mbd.mi[0]->mbmi.uv_mode = DC_PRED; - memset(x->skip_txfm, SKIP_TXFM_NONE, sizeof(x->skip_txfm)); super_block_uvrd(cpi, x, rate_tokenonly, distortion, skippable, &unused, bsize, INT64_MAX); *rate = *rate_tokenonly + @@ -6960,8 +6882,6 @@ static int64_t handle_inter_mode(VP10_COMP *cpi, MACROBLOCK *x, #else INTERP_FILTER best_filter = SWITCHABLE; #endif - uint8_t skip_txfm[MAX_MB_PLANE][MAX_TX_BLOCKS_IN_MAX_SB] = {{0}}; - int64_t bsse[MAX_MB_PLANE][MAX_TX_BLOCKS_IN_MAX_SB] = {{0}}; int skip_txfm_sb = 0; int64_t skip_sse_sb = INT64_MAX; @@ -7371,8 +7291,6 @@ static int64_t handle_inter_mode(VP10_COMP *cpi, MACROBLOCK *x, skip_txfm_sb = tmp_skip_sb; skip_sse_sb = tmp_skip_sse; - memcpy(skip_txfm, x->skip_txfm, sizeof(skip_txfm)); - memcpy(bsse, x->bsse, sizeof(bsse)); } else { pred_exists = 0; } @@ -7740,8 +7658,6 @@ static int64_t handle_inter_mode(VP10_COMP *cpi, MACROBLOCK *x, model_rd_for_sb(cpi, bsize, x, xd, 0, MAX_MB_PLANE - 1, &tmp_rate, &tmp_dist, &skip_txfm_sb, &skip_sse_sb); rd = RDCOST(x->rdmult, x->rddiv, rs + tmp_rate, tmp_dist); - memcpy(skip_txfm, x->skip_txfm, sizeof(skip_txfm)); - memcpy(bsse, x->bsse, sizeof(bsse)); } #if CONFIG_DUAL_FILTER @@ -7752,72 +7668,6 @@ static int64_t handle_inter_mode(VP10_COMP *cpi, MACROBLOCK *x, single_filter[this_mode][refs[0]] = mbmi->interp_filter; #endif - if (cpi->sf.adaptive_mode_search) - if (is_comp_pred) -#if CONFIG_EXT_INTER - switch (this_mode) { - case NEAREST_NEARESTMV: - if (single_skippable[NEARESTMV][refs[0]] && - single_skippable[NEARESTMV][refs[1]]) - memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm)); - break; - case ZERO_ZEROMV: - if (single_skippable[ZEROMV][refs[0]] && - single_skippable[ZEROMV][refs[1]]) - memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm)); - break; - case NEW_NEWMV: - if (single_skippable[NEWMV][refs[0]] && - single_skippable[NEWMV][refs[1]]) - memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm)); - break; - case NEAREST_NEWMV: - if (single_skippable[NEARESTMV][refs[0]] && - single_skippable[NEWMV][refs[1]]) - memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm)); - break; - case NEAR_NEWMV: - if (single_skippable[NEARMV][refs[0]] && - single_skippable[NEWMV][refs[1]]) - memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm)); - break; - case NEW_NEARESTMV: - if (single_skippable[NEWMV][refs[0]] && - single_skippable[NEARESTMV][refs[1]]) - memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm)); - break; - case NEW_NEARMV: - if (single_skippable[NEWMV][refs[0]] && - single_skippable[NEARMV][refs[1]]) - memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm)); - break; - case NEAREST_NEARMV: - if (single_skippable[NEARESTMV][refs[0]] && - single_skippable[NEARMV][refs[1]]) - memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm)); - break; - case NEAR_NEARMV: - if (single_skippable[NEARMV][refs[0]] && - single_skippable[NEARMV][refs[1]]) - memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm)); - break; - case NEAR_NEARESTMV: - if (single_skippable[NEARMV][refs[0]] && - single_skippable[NEARESTMV][refs[1]]) - memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm)); - break; - default: - if (single_skippable[this_mode][refs[0]] && - single_skippable[this_mode][refs[1]]) - memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm)); - break; - } -#else - if (single_skippable[this_mode][refs[0]] && - single_skippable[this_mode][refs[1]]) - memset(skip_txfm, SKIP_TXFM_AC_DC, sizeof(skip_txfm)); -#endif // CONFIG_EXT_INTER - if (cpi->sf.use_rd_breakout && ref_best_rd < INT64_MAX) { // if current pred_error modeled rd is substantially more than the best // so far, do not bother doing full rd @@ -7833,9 +7683,6 @@ static int64_t handle_inter_mode(VP10_COMP *cpi, MACROBLOCK *x, rate2_nocoeff = *rate2; #endif // CONFIG_OBMC - memcpy(x->skip_txfm, skip_txfm, sizeof(skip_txfm)); - memcpy(x->bsse, bsse, sizeof(bsse)); - #if CONFIG_OBMC || CONFIG_WARPED_MOTION best_rd = INT64_MAX; for (mbmi->motion_variation = SIMPLE_TRANSLATION; @@ -8395,7 +8242,6 @@ static void pick_ext_intra_iframe(VP10_COMP *cpi, MACROBLOCK *x, mbmi->uv_mode = DC_PRED; mbmi->ref_frame[0] = INTRA_FRAME; mbmi->ref_frame[1] = NONE; - memset(x->skip_txfm, SKIP_TXFM_NONE, sizeof(x->skip_txfm)); if (!rd_pick_ext_intra_sby(cpi, x, &rate_dummy, &rate_y, &distortion_y, &skippable, bsize, intra_mode_cost[mbmi->mode], &this_rd, 0)) @@ -9118,7 +8964,6 @@ void vp10_rd_pick_inter_mode_sb(VP10_COMP *cpi, if (ref_frame == INTRA_FRAME) { TX_SIZE uv_tx; struct macroblockd_plane *const pd = &xd->plane[1]; - memset(x->skip_txfm, 0, sizeof(x->skip_txfm)); #if CONFIG_EXT_INTRA is_directional_mode = (mbmi->mode != DC_PRED && mbmi->mode != TM_PRED); if (is_directional_mode) { @@ -9838,7 +9683,6 @@ void vp10_rd_pick_inter_mode_sb(VP10_COMP *cpi, mbmi->uv_mode = DC_PRED; mbmi->ref_frame[0] = INTRA_FRAME; mbmi->ref_frame[1] = NONE; - memset(x->skip_txfm, SKIP_TXFM_NONE, sizeof(x->skip_txfm)); palette_mode_info.palette_size[0] = 0; rate_overhead = rd_pick_palette_intra_sby(cpi, x, bsize, palette_ctx, @@ -10904,7 +10748,6 @@ void vp10_rd_pick_inter_mode_sub8x8(struct VP10_COMP *cpi, // then dont bother looking at UV vp10_build_inter_predictors_sbuv(&x->e_mbd, mi_row, mi_col, BLOCK_8X8); - memset(x->skip_txfm, SKIP_TXFM_NONE, sizeof(x->skip_txfm)); #if CONFIG_VAR_TX if (!inter_block_uvrd(cpi, x, &rate_uv, &distortion_uv, &uv_skippable, &uv_sse, BLOCK_8X8, tmp_best_rdu))