From: Daniel Kang Date: Mon, 6 Aug 2012 19:15:24 +0000 (-0700) Subject: Combine cost_coeffs functions. X-Git-Tag: v1.3.0~1217^2~342 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6630895daf020374ab3e708b61036b94eb7a5962;p=platform%2Fupstream%2Flibvpx.git Combine cost_coeffs functions. Change-Id: I3421d07fdcf2148d75c8dbfc8c44bc2d96a3a8f6 --- diff --git a/vp8/encoder/rdopt.c b/vp8/encoder/rdopt.c index ca49fda..b165c30 100644 --- a/vp8/encoder/rdopt.c +++ b/vp8/encoder/rdopt.c @@ -589,120 +589,80 @@ static int cost_coeffs_2x2(MACROBLOCK *mb, return cost; } -static int cost_coeffs(MACROBLOCK *mb, BLOCKD *b, int type, ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l) { +static int cost_coeffs(MACROBLOCK *mb, BLOCKD *b, int type, + ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l, + int tx_type) { + const int eob = b->eob; int c = !type; /* start at coef 0, unless Y with Y2 */ - int eob = b->eob; - int pt; /* surrounding block/prev coef predictor */ - int cost = 0; + int cost = 0, default_eob; + int pt; /* surrounding block/prev coef predictor */ + int const *scan, *band; short *qcoeff_ptr = b->qcoeff; + switch (tx_type) { + case TX_4X4: + scan = vp8_default_zig_zag1d; + band = vp8_coef_bands; + default_eob = 16; #if CONFIG_HYBRIDTRANSFORM - int QIndex = mb->q_index; - int active_ht = (QIndex < ACTIVE_HT) && - (mb->e_mbd.mode_info_context->mbmi.mode_rdopt == B_PRED); - - int const *pt_scan; - - if((type == PLANE_TYPE_Y_WITH_DC) && active_ht) { - switch (b->bmi.as_mode.tx_type) { - case ADST_DCT: - pt_scan = vp8_row_scan; - break; - - case DCT_ADST: - pt_scan = vp8_col_scan; - break; - - default: - pt_scan = vp8_default_zig_zag1d; - break; - } + { + int active_ht = (mb->q_index < ACTIVE_HT) && + (mb->e_mbd.mode_info_context->mbmi.mode_rdopt == B_PRED); + + if((type == PLANE_TYPE_Y_WITH_DC) && active_ht) { + switch (b->bmi.as_mode.tx_type) { + case ADST_DCT: + pt_scan = vp8_row_scan; + break; + + case DCT_ADST: + pt_scan = vp8_col_scan; + break; + + default: + pt_scan = vp8_default_zig_zag1d; + break; + } - } else { - pt_scan = vp8_default_zig_zag1d; - } -#define QC(I) ( qcoeff_ptr [pt_scan[I]] ) -#else -#define QC(I) ( qcoeff_ptr [vp8_default_zig_zag1d[I]] ) + } else + pt_scan = vp8_default_zig_zag1d; + } #endif - - VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); - - for (; c < eob; c++) { - int v = QC(c); - int t = vp8_dct_value_tokens_ptr[v].Token; - cost += mb->token_costs[TX_4X4][type][vp8_coef_bands[c]][pt][t]; - cost += vp8_dct_value_cost_ptr[v]; - pt = vp8_prev_token_class[t]; - } -# undef QC - - if (c < 16) - cost += mb->token_costs[TX_4X4][type][vp8_coef_bands[c]] - [pt][DCT_EOB_TOKEN]; - - pt = (c != !type); // is eob first coefficient; - *a = *l = pt; - - return cost; -} - -static int cost_coeffs_8x8(MACROBLOCK *mb, - BLOCKD *b, int type, - ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l) { - int c = !type; /* start at coef 0, unless Y with Y2 */ - int eob = b->eob; - int pt; /* surrounding block/prev coef predictor */ - int cost = 0; - short *qcoeff_ptr = b->qcoeff; - - VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); - - for (; c < eob; c++) { - int v = qcoeff_ptr[vp8_default_zig_zag1d_8x8[c]]; - int t = vp8_dct_value_tokens_ptr[v].Token; - cost += mb->token_costs[TX_8X8][type][vp8_coef_bands_8x8[c]][pt][t]; - cost += vp8_dct_value_cost_ptr[v]; - pt = vp8_prev_token_class[t]; - } - - if (c < 64) - cost += mb->token_costs[TX_8X8][type][vp8_coef_bands_8x8[c]] - [pt][DCT_EOB_TOKEN]; - - pt = (c != !type); // is eob first coefficient; - *a = *l = pt; - return cost; -} - + break; + case TX_8X8: + scan = vp8_default_zig_zag1d_8x8; + band = vp8_coef_bands_8x8; + default_eob = 64; + break; #if CONFIG_TX16X16 -static int cost_coeffs_16x16(MACROBLOCK *mb, BLOCKD *b, int type, - ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l) { - const int eob = b->eob; - int c = !type; /* start at coef 0, unless Y with Y2 */ - int cost = 0; - int pt; /* surrounding block/prev coef predictor */ - short *qcoeff_ptr = b->qcoeff; + case TX_16X16: + scan = vp8_default_zig_zag1d_16x16; + band = vp8_coef_bands_16x16; + default_eob = 256; + break; +#endif + default: + break; + } VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); for (; c < eob; c++) { - int v = qcoeff_ptr[vp8_default_zig_zag1d_16x16[c]]; + int v = qcoeff_ptr[scan[c]]; int t = vp8_dct_value_tokens_ptr[v].Token; - cost += mb->token_costs[TX_16X16][type][vp8_coef_bands_16x16[c]][pt][t]; + cost += mb->token_costs[tx_type][type][band[c]][pt][t]; cost += vp8_dct_value_cost_ptr[v]; pt = vp8_prev_token_class[t]; } - if (c < 256) - cost += mb->token_costs[TX_16X16][type][vp8_coef_bands_16x16[c]] + if (c < default_eob) + cost += mb->token_costs[tx_type][type][band[c]] [pt][DCT_EOB_TOKEN]; pt = (c != !type); // is eob first coefficient; *a = *l = pt; return cost; } -#endif static int vp8_rdcost_mby(MACROBLOCK *mb) { int cost = 0; @@ -720,10 +680,12 @@ static int vp8_rdcost_mby(MACROBLOCK *mb) { for (b = 0; b < 16; b++) cost += cost_coeffs(mb, x->block + b, PLANE_TYPE_Y_NO_DC, - ta + vp8_block2above[b], tl + vp8_block2left[b]); + ta + vp8_block2above[b], tl + vp8_block2left[b], + TX_4X4); cost += cost_coeffs(mb, x->block + 24, PLANE_TYPE_Y2, - ta + vp8_block2above[24], tl + vp8_block2left[24]); + ta + vp8_block2above[24], tl + vp8_block2left[24], + TX_4X4); return cost; } @@ -789,8 +751,9 @@ static int vp8_rdcost_mby_8x8(MACROBLOCK *mb) { tl = (ENTROPY_CONTEXT *)&t_left; for (b = 0; b < 16; b += 4) - cost += cost_coeffs_8x8(mb, x->block + b, PLANE_TYPE_Y_NO_DC, - ta + vp8_block2above_8x8[b], tl + vp8_block2left_8x8[b]); + cost += cost_coeffs(mb, x->block + b, PLANE_TYPE_Y_NO_DC, + ta + vp8_block2above_8x8[b], tl + vp8_block2left_8x8[b], + TX_8X8); cost += cost_coeffs_2x2(mb, x->block + 24, PLANE_TYPE_Y2, ta + vp8_block2above[24], tl + vp8_block2left[24]); @@ -846,7 +809,7 @@ static int vp8_rdcost_mby_16x16(MACROBLOCK *mb) { ta = (ENTROPY_CONTEXT *)&t_above; tl = (ENTROPY_CONTEXT *)&t_left; - cost = cost_coeffs_16x16(mb, x->block, PLANE_TYPE_Y_WITH_DC, ta, tl); + cost = cost_coeffs(mb, x->block, PLANE_TYPE_Y_WITH_DC, ta, tl, TX_16X16); return cost; } @@ -989,7 +952,7 @@ static int64_t rd_pick_intra4x4block( tempa = ta; templ = tl; - ratey = cost_coeffs(x, b, PLANE_TYPE_Y_WITH_DC, &tempa, &templ); + ratey = cost_coeffs(x, b, PLANE_TYPE_Y_WITH_DC, &tempa, &templ, TX_4X4); rate += ratey; distortion = ENCODEMB_INVOKE(IF_RTCD(&cpi->rtcd.encodemb), berr)( be->coeff, b->dqcoeff) >> 2; @@ -1278,9 +1241,8 @@ static int64_t rd_pick_intra8x8block( ta0 = *(a + vp8_block2above_8x8[idx]); tl0 = *(l + vp8_block2left_8x8 [idx]); - rate_t = cost_coeffs_8x8(x, xd->block + idx, PLANE_TYPE_Y_WITH_DC, - &ta0, - &tl0); + rate_t = cost_coeffs(x, xd->block + idx, PLANE_TYPE_Y_WITH_DC, + &ta0, &tl0, TX_8X8); rate += rate_t; ta1 = ta0; tl1 = tl0; @@ -1307,13 +1269,13 @@ static int64_t rd_pick_intra8x8block( tl0 = *(l + vp8_block2above[ib]); tl1 = *(l + vp8_block2above[ib + 4]); rate_t = cost_coeffs(x, xd->block + ib, PLANE_TYPE_Y_WITH_DC, - &ta0, &tl0); + &ta0, &tl0, TX_4X4); rate_t += cost_coeffs(x, xd->block + ib + 1, PLANE_TYPE_Y_WITH_DC, - &ta1, &tl0); + &ta1, &tl0, TX_4X4); rate_t += cost_coeffs(x, xd->block + ib + 4, PLANE_TYPE_Y_WITH_DC, - &ta0, &tl1); + &ta0, &tl1, TX_4X4); rate_t += cost_coeffs(x, xd->block + ib + 5, PLANE_TYPE_Y_WITH_DC, - &ta1, &tl1); + &ta1, &tl1, TX_4X4); rate += rate_t; #endif @@ -1430,7 +1392,8 @@ static int rd_cost_mbuv(MACROBLOCK *mb) { for (b = 16; b < 24; b++) cost += cost_coeffs(mb, x->block + b, PLANE_TYPE_UV, - ta + vp8_block2above[b], tl + vp8_block2left[b]); + ta + vp8_block2above[b], tl + vp8_block2left[b], + TX_4X4); return cost; } @@ -1465,9 +1428,9 @@ static int rd_cost_mbuv_8x8(MACROBLOCK *mb) { tl = (ENTROPY_CONTEXT *)&t_left; for (b = 16; b < 24; b += 4) - cost += cost_coeffs_8x8(mb, x->block + b, PLANE_TYPE_UV, - ta + vp8_block2above_8x8[b], - tl + vp8_block2left_8x8[b]); + cost += cost_coeffs(mb, x->block + b, PLANE_TYPE_UV, + ta + vp8_block2above_8x8[b], + tl + vp8_block2left_8x8[b], TX_8X8); return cost; } @@ -1769,7 +1732,7 @@ static int rdcost_mbsegment_y(MACROBLOCK *mb, const int *labels, if (labels[ b] == which_label) cost += cost_coeffs(mb, x->block + b, PLANE_TYPE_Y_WITH_DC, ta + vp8_block2above[b], - tl + vp8_block2left[b]); + tl + vp8_block2left[b], TX_4X4); return cost;