diff options
-rw-r--r-- | vp8/common/reconintra4x4.c | 6 | ||||
-rw-r--r-- | vp8/common/reconintra4x4.h | 2 | ||||
-rw-r--r-- | vp8/common/rtcd_defs.sh | 6 | ||||
-rw-r--r-- | vp8/common/x86/sadmxn_x86.c | 92 | ||||
-rw-r--r-- | vp8/decoder/decodframe.c | 5 | ||||
-rw-r--r-- | vp8/encoder/encodeframe.c | 6 | ||||
-rw-r--r-- | vp8/encoder/rdopt.c | 4 | ||||
-rw-r--r-- | vp8/encoder/tokenize.c | 818 | ||||
-rw-r--r-- | vp8/vp8_common.mk | 3 |
9 files changed, 314 insertions, 628 deletions
diff --git a/vp8/common/reconintra4x4.c b/vp8/common/reconintra4x4.c index dfbaf137b..1e40168ec 100644 --- a/vp8/common/reconintra4x4.c +++ b/vp8/common/reconintra4x4.c @@ -295,7 +295,7 @@ void vp8_comp_intra4x4_predict_c(BLOCKD *x, /* copy 4 bytes from the above right down so that the 4x4 prediction modes using pixels above and * to the right prediction have filled in pixels to use. */ -void vp8_intra_prediction_down_copy(MACROBLOCKD *xd) { +void vp8_intra_prediction_down_copy(MACROBLOCKD *xd, int extend_edge) { unsigned char *above_right = *(xd->block[0].base_dst) + xd->block[0].dst - xd->block[0].dst_stride + 16; unsigned int *src_ptr = (unsigned int *) @@ -309,6 +309,10 @@ void vp8_intra_prediction_down_copy(MACROBLOCKD *xd) { unsigned int *dst_ptr3 = (unsigned int *)(above_right + 12 * xd->block[0].dst_stride); + if (extend_edge) { + *src_ptr = ((uint8_t *) src_ptr)[-1] * 0x01010101U; + } + *dst_ptr0 = *src_ptr; *dst_ptr1 = *src_ptr; *dst_ptr2 = *src_ptr; diff --git a/vp8/common/reconintra4x4.h b/vp8/common/reconintra4x4.h index a8cdea47c..771e0b2eb 100644 --- a/vp8/common/reconintra4x4.h +++ b/vp8/common/reconintra4x4.h @@ -12,6 +12,6 @@ #ifndef __INC_RECONINTRA4x4_H #define __INC_RECONINTRA4x4_H -extern void vp8_intra_prediction_down_copy(MACROBLOCKD *xd); +extern void vp8_intra_prediction_down_copy(MACROBLOCKD *xd, int extend_edge); #endif diff --git a/vp8/common/rtcd_defs.sh b/vp8/common/rtcd_defs.sh index ea64c9682..d7e5b5b25 100644 --- a/vp8/common/rtcd_defs.sh +++ b/vp8/common/rtcd_defs.sh @@ -177,11 +177,13 @@ vp8_loop_filter_simple_bh_neon=vp8_loop_filter_bhs_neon # # sad 16x3, 3x16 # +if [ "$CONFIG_NEWBESTREFMV" = "yes" ]; then prototype unsigned int vp8_sad16x3 "const unsigned char *src_ptr, int src_stride, const unsigned char *ref_ptr, int ref_stride, int max_sad" -specialize vp8_sad16x3 +specialize vp8_sad16x3 sse2 prototype unsigned int vp8_sad3x16 "const unsigned char *src_ptr, int src_stride, const unsigned char *ref_ptr, int ref_stride, int max_sad" -specialize vp8_sad3x16 +specialize vp8_sad3x16 sse2 +fi # # Encoder functions below this point. diff --git a/vp8/common/x86/sadmxn_x86.c b/vp8/common/x86/sadmxn_x86.c new file mode 100644 index 000000000..46f388247 --- /dev/null +++ b/vp8/common/x86/sadmxn_x86.c @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2012 The WebM project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include <emmintrin.h> // SSE2 +#include "./vpx_config.h" +#include "./vpx_rtcd.h" + + +#if CONFIG_NEWBESTREFMV + + +#if HAVE_SSE2 +unsigned int vp8_sad16x3_sse2( + const unsigned char *src_ptr, + int src_stride, + const unsigned char *ref_ptr, + int ref_stride, + int max_sad) { + __m128i s0, s1, s2; + __m128i r0, r1, r2; + __m128i sad; + + (void)max_sad; + + s0 = _mm_loadu_si128((const __m128i *)(src_ptr + 0 * src_stride)); + s1 = _mm_loadu_si128((const __m128i *)(src_ptr + 1 * src_stride)); + s2 = _mm_loadu_si128((const __m128i *)(src_ptr + 2 * src_stride)); + + r0 = _mm_loadu_si128((const __m128i *)(ref_ptr + 0 * src_stride)); + r1 = _mm_loadu_si128((const __m128i *)(ref_ptr + 1 * src_stride)); + r2 = _mm_loadu_si128((const __m128i *)(ref_ptr + 2 * src_stride)); + + sad = _mm_sad_epu8(s0, r0); + sad = _mm_add_epi16(sad, _mm_sad_epu8(s1, r1)); + sad = _mm_add_epi16(sad, _mm_sad_epu8(s2, r2)); + sad = _mm_add_epi16(sad, _mm_srli_si128(sad, 8)); + + return _mm_cvtsi128_si32(sad); +} + +unsigned int vp8_sad3x16_sse2( + const unsigned char *src_ptr, + int src_stride, + const unsigned char *ref_ptr, + int ref_stride, + int max_sad) { + int r; + __m128i s0, s1, s2, s3; + __m128i r0, r1, r2, r3; + __m128i sad = _mm_set1_epi16(0); + for (r = 0; r < 16; r += 4) { + s0 = _mm_cvtsi32_si128 (*(const int *)(src_ptr + 0 * src_stride)); + s1 = _mm_cvtsi32_si128 (*(const int *)(src_ptr + 1 * src_stride)); + s2 = _mm_cvtsi32_si128 (*(const int *)(src_ptr + 2 * src_stride)); + s3 = _mm_cvtsi32_si128 (*(const int *)(src_ptr + 3 * src_stride)); + r0 = _mm_cvtsi32_si128 (*(const int *)(ref_ptr + 0 * src_stride)); + r1 = _mm_cvtsi32_si128 (*(const int *)(ref_ptr + 1 * src_stride)); + r2 = _mm_cvtsi32_si128 (*(const int *)(ref_ptr + 2 * src_stride)); + r3 = _mm_cvtsi32_si128 (*(const int *)(ref_ptr + 3 * src_stride)); + + s0 = _mm_unpacklo_epi8(s0, s1); + r0 = _mm_unpacklo_epi8(r0, r1); + s2 = _mm_unpacklo_epi8(s2, s3); + r2 = _mm_unpacklo_epi8(r2, r3); + s0 = _mm_unpacklo_epi64(s0, s2); + r0 = _mm_unpacklo_epi64(r0, r2); + + // throw out byte 3 + s0 = _mm_slli_epi64(s0, 16); + r0 = _mm_slli_epi64(r0, 16); + + sad = _mm_add_epi16(sad, _mm_sad_epu8(s0, r0)); + + src_ptr += src_stride*4; + ref_ptr += ref_stride*4; + } + + sad = _mm_add_epi16(sad, _mm_srli_si128(sad, 8)); + return _mm_cvtsi128_si32(sad); +} + +#endif + + +#endif // CONFIG_NEWBESTREFMV diff --git a/vp8/decoder/decodframe.c b/vp8/decoder/decodframe.c index 2f0af2925..78ba590e0 100644 --- a/vp8/decoder/decodframe.c +++ b/vp8/decoder/decodframe.c @@ -209,8 +209,8 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, int i; int tx_size; TX_TYPE tx_type; -#if CONFIG_SUPERBLOCKS VP8_COMMON *pc = &pbi->common; +#if CONFIG_SUPERBLOCKS int orig_skip_flag = xd->mode_info_context->mbmi.mb_skip_coeff; #endif @@ -355,7 +355,6 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, b->dst_stride); } } else if (mode == B_PRED) { - vp8_intra_prediction_down_copy(xd); for (i = 0; i < 16; i++) { BLOCKD *b = &xd->block[i]; int b_mode = xd->mode_info_context->bmi[i].as_mode.first; @@ -659,6 +658,8 @@ decode_sb_row(VP8D_COMP *pbi, VP8_COMMON *pc, int mbrow, MACROBLOCKD *xd, mi[pc->mode_info_stride + 1] = mi[0]; } #endif + vp8_intra_prediction_down_copy(xd, mb_col == pc->mb_cols - 1 && + !(mb_row & 1)); decode_macroblock(pbi, xd, mb_col, bc); #if CONFIG_SUPERBLOCKS if (xd->mode_info_context->mbmi.encoded_as_sb) { diff --git a/vp8/encoder/encodeframe.c b/vp8/encoder/encodeframe.c index f1bed4cc5..7cb52a815 100644 --- a/vp8/encoder/encodeframe.c +++ b/vp8/encoder/encodeframe.c @@ -19,6 +19,7 @@ #include "vp8/common/quant_common.h" #include "segmentation.h" #include "vp8/common/setupintrarecon.h" +#include "vp8/common/reconintra4x4.h" #include "encodeintra.h" #include "vp8/common/reconinter.h" #include "vp8/common/invtrans.h" @@ -612,6 +613,9 @@ static void pick_mb_modes(VP8_COMP *cpi, cpi->update_context = 0; // TODO Do we need this now?? + vp8_intra_prediction_down_copy(xd, mb_col == cm->mb_cols - 1 && + (mb_row & 1) == 0); + // Find best coding mode & reconstruct the MB so it is available // as a predictor for MBs that follow in the SB if (cm->frame_type == KEY_FRAME) { @@ -1909,7 +1913,6 @@ void vp8cx_encode_intra_macro_block(VP8_COMP *cpi, vp8_encode_intra8x8mby(IF_RTCD(&cpi->rtcd), x); vp8_encode_intra8x8mbuv(IF_RTCD(&cpi->rtcd), x); } else if (mbmi->mode == B_PRED) { - vp8_intra_prediction_down_copy(&x->e_mbd); vp8_encode_intra4x4mby(IF_RTCD(&cpi->rtcd), x); } else { vp8_encode_intra16x16mby(IF_RTCD(&cpi->rtcd), x); @@ -2007,7 +2010,6 @@ void vp8cx_encode_inter_macroblock (VP8_COMP *cpi, MACROBLOCK *x, if (mbmi->ref_frame == INTRA_FRAME) { if (mbmi->mode == B_PRED) { - vp8_intra_prediction_down_copy(xd); vp8_encode_intra16x16mbuv(IF_RTCD(&cpi->rtcd), x); vp8_encode_intra4x4mby(IF_RTCD(&cpi->rtcd), x); } else if (mbmi->mode == I8X8_PRED) { diff --git a/vp8/encoder/rdopt.c b/vp8/encoder/rdopt.c index eeabfb6e1..f72697728 100644 --- a/vp8/encoder/rdopt.c +++ b/vp8/encoder/rdopt.c @@ -1212,8 +1212,6 @@ static int64_t rd_pick_intra4x4mby_modes(VP8_COMP *cpi, MACROBLOCK *mb, int *Rat xd->mode_info_context->mbmi.mode = B_PRED; bmode_costs = mb->inter_bmode_costs; - vp8_intra_prediction_down_copy(xd); - for (i = 0; i < 16; i++) { MODE_INFO *const mic = xd->mode_info_context; const int mis = xd->mode_info_stride; @@ -2226,7 +2224,7 @@ static int64_t encode_inter_mb_segment_8x8(MACROBLOCK *x, } *distortion >>= 2; if (otherrd) { - othercost >>= 2; + otherdist >>= 2; *otherrd = RDCOST(x->rdmult, x->rddiv, othercost, otherdist); } return RDCOST(x->rdmult, x->rddiv, *labelyrate, *distortion); diff --git a/vp8/encoder/tokenize.c b/vp8/encoder/tokenize.c index 2ddae1cbd..a96b8e455 100644 --- a/vp8/encoder/tokenize.c +++ b/vp8/encoder/tokenize.c @@ -109,380 +109,113 @@ static void fill_value_tokens() { vp8_dct_value_cost_ptr = dct_value_cost + DCT_MAX_VALUE; } -static void tokenize1st_order_b_16x16(MACROBLOCKD *xd, - const BLOCKD *const b, - TOKENEXTRA **tp, - PLANE_TYPE type, - ENTROPY_CONTEXT *a, - ENTROPY_CONTEXT *l, - VP8_COMP *cpi, - int dry_run) { +static void tokenize_b(VP8_COMP *cpi, + MACROBLOCKD *xd, + const BLOCKD * const b, + TOKENEXTRA **tp, + PLANE_TYPE type, + ENTROPY_CONTEXT *a, + ENTROPY_CONTEXT *l, + TX_SIZE tx_size, + int dry_run) { int pt; /* near block/prev token context index */ int c = (type == PLANE_TYPE_Y_NO_DC) ? 1 : 0; const int eob = b->eob; /* one beyond last nonzero coeff */ TOKENEXTRA *t = *tp; /* store tokens starting here */ const short *qcoeff_ptr = b->qcoeff; - TX_TYPE tx_type = get_tx_type(xd, b); - int seg_eob = 256; + int seg_eob; int segment_id = xd->mode_info_context->mbmi.segment_id; - - if (segfeature_active(xd, segment_id, SEG_LVL_EOB)) - seg_eob = get_segdata(xd, segment_id, SEG_LVL_EOB); + const int *bands, *scan; + unsigned int (*counts)[COEF_BANDS][PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS]; + vp8_prob (*probs)[COEF_BANDS][PREV_COEF_CONTEXTS][ENTROPY_NODES]; + const TX_TYPE tx_type = (type == PLANE_TYPE_Y_WITH_DC) ? + get_tx_type(xd, b) : DCT_DCT; VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); - - do { - const int band = vp8_coef_bands_16x16[c]; - int x; - - if (c < eob) { - const int rc = vp8_default_zig_zag1d_16x16[c]; - const int v = qcoeff_ptr[rc]; - - assert(-DCT_MAX_VALUE <= v && v < (DCT_MAX_VALUE)); - - t->Extra = vp8_dct_value_tokens_ptr[v].Extra; - x = vp8_dct_value_tokens_ptr[v].Token; - } else { - x = DCT_EOB_TOKEN; - } - - t->Token = x; - if (tx_type != DCT_DCT) - t->context_tree = cpi->common.fc.hybrid_coef_probs_16x16[type][band][pt]; - else - t->context_tree = cpi->common.fc.coef_probs_16x16[type][band][pt]; - - t->skip_eob_node = pt == 0 && ((band > 0 && type != PLANE_TYPE_Y_NO_DC) || - (band > 1 && type == PLANE_TYPE_Y_NO_DC)); - assert(vp8_coef_encodings[t->Token].Len - t->skip_eob_node > 0); - if (!dry_run) { - if (tx_type != DCT_DCT) - ++cpi->hybrid_coef_counts_16x16[type][band][pt][x]; - else - ++cpi->coef_counts_16x16[type][band][pt][x]; - } - pt = vp8_prev_token_class[x]; - ++t; - } while (c < eob && ++c < seg_eob); - - *tp = t; - pt = (c != !type); /* 0 <-> all coeff data is zero */ - *a = *l = pt; -} - -static void tokenize2nd_order_b_8x8(MACROBLOCKD *xd, - const BLOCKD *const b, - TOKENEXTRA **tp, - ENTROPY_CONTEXT *a, - ENTROPY_CONTEXT *l, - VP8_COMP *cpi, - int dry_run) { - int pt; /* near block/prev token context index */ - int c = 0; /* start at DC */ - const int eob = b->eob; /* one beyond last nonzero coeff */ - TOKENEXTRA *t = *tp; /* store tokens starting here */ - const short *qcoeff_ptr = b->qcoeff; - int seg_eob = 4; - int segment_id = xd->mode_info_context->mbmi.segment_id; - - if (segfeature_active(xd, segment_id, SEG_LVL_EOB)) { - seg_eob = get_segdata(xd, segment_id, SEG_LVL_EOB); + switch (tx_size) { + default: + case TX_4X4: + seg_eob = 16; + bands = vp8_coef_bands; + scan = vp8_default_zig_zag1d; + if (tx_type != DCT_DCT) { + counts = cpi->hybrid_coef_counts; + probs = cpi->common.fc.hybrid_coef_probs; + if (tx_type == ADST_DCT) { + scan = vp8_row_scan; + } else if (tx_type == DCT_ADST) { + scan = vp8_col_scan; + } + } else { + counts = cpi->coef_counts; + probs = cpi->common.fc.coef_probs; + } + break; + case TX_8X8: + if (type == PLANE_TYPE_Y2) { + seg_eob = 4; + bands = vp8_coef_bands; + scan = vp8_default_zig_zag1d; + } else { + seg_eob = 64; + bands = vp8_coef_bands_8x8; + scan = vp8_default_zig_zag1d_8x8; + } + if (tx_type != DCT_DCT) { + counts = cpi->hybrid_coef_counts_8x8; + probs = cpi->common.fc.hybrid_coef_probs_8x8; + } else { + counts = cpi->coef_counts_8x8; + probs = cpi->common.fc.coef_probs_8x8; + } + break; + case TX_16X16: + seg_eob = 256; + bands = vp8_coef_bands_16x16; + scan = vp8_default_zig_zag1d_16x16; + if (tx_type != DCT_DCT) { + counts = cpi->hybrid_coef_counts_16x16; + probs = cpi->common.fc.hybrid_coef_probs_16x16; + } else { + counts = cpi->coef_counts_16x16; + probs = cpi->common.fc.coef_probs_16x16; + } + break; } - VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); - - assert(eob <= 4); - - do { - const int band = vp8_coef_bands[c]; - int x; - - if (c < eob) { - const int rc = vp8_default_zig_zag1d[c]; - const int v = qcoeff_ptr[rc]; - - assert(-DCT_MAX_VALUE <= v && v < (DCT_MAX_VALUE)); - - t->Extra = vp8_dct_value_tokens_ptr[v].Extra; - x = vp8_dct_value_tokens_ptr[v].Token; - } else { - x = DCT_EOB_TOKEN; - } - - t->Token = x; - t->context_tree = cpi->common.fc.coef_probs_8x8[PLANE_TYPE_Y2][band][pt]; - - t->skip_eob_node = ((pt == 0) && (band > 0)); - assert(vp8_coef_encodings[t->Token].Len - t->skip_eob_node > 0); - - if (!dry_run) - ++cpi->coef_counts_8x8[PLANE_TYPE_Y2][band][pt][x]; - pt = vp8_prev_token_class[x]; - ++t; - } while (c < eob && ++c < seg_eob); - - *tp = t; - pt = (c != 0); /* 0 <-> all coeff data is zero */ - *a = *l = pt; -} - -static void tokenize2nd_order_b_4x4(MACROBLOCKD *xd, - TOKENEXTRA **tp, - VP8_COMP *cpi, - int dry_run) { - int pt; /* near block/prev token context index */ - int c = 0; /* start at DC */ - TOKENEXTRA *t = *tp;/* store tokens starting here */ - const BLOCKD *b = xd->block + 24; - const short *qcoeff_ptr = b->qcoeff; - ENTROPY_CONTEXT *a; - ENTROPY_CONTEXT *l; - const int eob = b->eob; - int seg_eob = 16; - int segment_id = xd->mode_info_context->mbmi.segment_id; - if (segfeature_active(xd, segment_id, SEG_LVL_EOB)) seg_eob = get_segdata(xd, segment_id, SEG_LVL_EOB); - a = (ENTROPY_CONTEXT *)xd->above_context + 8; - l = (ENTROPY_CONTEXT *)xd->left_context + 8; - - VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); - do { - const int band = vp8_coef_bands[c]; + const int band = bands[c]; int token; if (c < eob) { - const int rc = vp8_default_zig_zag1d[c]; + const int rc = scan[c]; const int v = qcoeff_ptr[rc]; + assert(-DCT_MAX_VALUE <= v && v < DCT_MAX_VALUE); + t->Extra = vp8_dct_value_tokens_ptr[v].Extra; token = vp8_dct_value_tokens_ptr[v].Token; - } else - token = DCT_EOB_TOKEN; + } else { + token = DCT_EOB_TOKEN; + } t->Token = token; - t->context_tree = cpi->common.fc.coef_probs[PLANE_TYPE_Y2][band][pt]; - - t->skip_eob_node = ((pt == 0) && (band > 0)); - assert(vp8_coef_encodings[t->Token].Len - t->skip_eob_node > 0); - - if (!dry_run) - ++cpi->coef_counts[PLANE_TYPE_Y2][band][pt][token]; - pt = vp8_prev_token_class[token]; - ++t; - } while (c < eob && ++c < seg_eob); - - *tp = t; - pt = (c != 0); /* 0 <-> all coeff data is zero */ - *a = *l = pt; -} - -static void tokenize1st_order_b_8x8(MACROBLOCKD *xd, - const BLOCKD *const b, - TOKENEXTRA **tp, - PLANE_TYPE type, - ENTROPY_CONTEXT *a, - ENTROPY_CONTEXT *l, - VP8_COMP *cpi, - int dry_run) { - int pt; /* near block/prev token context index */ - int c = (type == PLANE_TYPE_Y_NO_DC) ? 1 : 0; /* start at DC unless type 0 */ - TOKENEXTRA *t = *tp; /* store tokens starting here */ - const short *qcoeff_ptr = b->qcoeff; - TX_TYPE tx_type = get_tx_type(xd, b); - const int eob = b->eob; - int seg_eob = 64; - int segment_id = xd->mode_info_context->mbmi.segment_id; - - if (segfeature_active(xd, segment_id, SEG_LVL_EOB)) - seg_eob = get_segdata(xd, segment_id, SEG_LVL_EOB); - - VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); - - do { - const int band = vp8_coef_bands_8x8[c]; - int x; - - if (c < eob) { - const int rc = vp8_default_zig_zag1d_8x8[c]; - const int v = qcoeff_ptr[rc]; - - assert(-DCT_MAX_VALUE <= v && v < (DCT_MAX_VALUE)); - - t->Extra = vp8_dct_value_tokens_ptr[v].Extra; - x = vp8_dct_value_tokens_ptr[v].Token; - } else - x = DCT_EOB_TOKEN; - - t->Token = x; - if (tx_type != DCT_DCT) - t->context_tree = cpi->common.fc.hybrid_coef_probs_8x8[type][band][pt]; - else - t->context_tree = cpi->common.fc.coef_probs_8x8[type][band][pt]; - - t->skip_eob_node = pt == 0 && ((band > 0 && type != PLANE_TYPE_Y_NO_DC) || - (band > 1 && type == PLANE_TYPE_Y_NO_DC)); + t->context_tree = probs[type][band][pt]; + t->skip_eob_node = (pt == 0) && ((band > 0 && type != PLANE_TYPE_Y_NO_DC) || + (band > 1 && type == PLANE_TYPE_Y_NO_DC)); assert(vp8_coef_encodings[t->Token].Len - t->skip_eob_node > 0); - if (!dry_run) { - if (tx_type != DCT_DCT) - ++cpi->hybrid_coef_counts_8x8[type][band][pt][x]; - else - ++cpi->coef_counts_8x8[type][band][pt][x]; + ++counts[type][band][pt][token]; } - pt = vp8_prev_token_class[x]; + pt = vp8_prev_token_class[token]; ++t; } while (c < eob && ++c < seg_eob); *tp = t; - pt = (c != !type); /* 0 <-> all coeff data is zero */ - *a = *l = pt; -} - -static void tokenize1st_order_chroma_4x4(MACROBLOCKD *xd, - TOKENEXTRA **tp, - VP8_COMP *cpi, - int dry_run) { - unsigned int block; - const BLOCKD *b = xd->block + 16; - int pt; /* near block/prev token context index */ - TOKENEXTRA *t = *tp;/* store tokens starting here */ - ENTROPY_CONTEXT *a; - ENTROPY_CONTEXT *l; - int seg_eob = 16; - int segment_id = xd->mode_info_context->mbmi.segment_id; - - if (segfeature_active(xd, segment_id, SEG_LVL_EOB)) { - seg_eob = get_segdata(xd, segment_id, SEG_LVL_EOB); - } - - /* Chroma */ - for (block = 16; block < 24; block++, b++) { - const int eob = b->eob; - const int tmp1 = vp8_block2above[block]; - const int tmp2 = vp8_block2left[block]; - const int16_t *qcoeff_ptr = b->qcoeff; - int c = 0; - - a = (ENTROPY_CONTEXT *)xd->above_context + tmp1; - l = (ENTROPY_CONTEXT *)xd->left_context + tmp2; - - VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); - - do { - const int band = vp8_coef_bands[c]; - int token; - - if (c < eob) { - const int rc = vp8_default_zig_zag1d[c]; - const int v = qcoeff_ptr[rc]; - - t->Extra = vp8_dct_value_tokens_ptr[v].Extra; - token = vp8_dct_value_tokens_ptr[v].Token; - } else - token = DCT_EOB_TOKEN; - - t->Token = token; - t->context_tree = cpi->common.fc.coef_probs[PLANE_TYPE_UV][band][pt]; - - t->skip_eob_node = ((pt == 0) && (band > 0)); - assert(vp8_coef_encodings[t->Token].Len - t->skip_eob_node > 0); - - if (!dry_run) - ++cpi->coef_counts[PLANE_TYPE_UV][band][pt][token]; - pt = vp8_prev_token_class[token]; - ++t; - } while (c < eob && ++c < seg_eob); - - *tp = t; - pt = (c != 0); /* 0 <-> all coeff data is zero */ - *a = *l = pt; - } -} - -static void tokenize1st_order_b_4x4(MACROBLOCKD *xd, - TOKENEXTRA **tp, - PLANE_TYPE type, - VP8_COMP *cpi, - int dry_run) { - unsigned int block; - const BLOCKD *b = xd->block; - int pt; /* near block/prev token context index */ - TOKENEXTRA *t = *tp;/* store tokens starting here */ - ENTROPY_CONTEXT *a, *l; - int seg_eob = 16; - int segment_id = xd->mode_info_context->mbmi.segment_id; - int const *pt_scan = vp8_default_zig_zag1d; - - if (segfeature_active(xd, segment_id, SEG_LVL_EOB)) { - seg_eob = get_segdata(xd, segment_id, SEG_LVL_EOB); - } - - /* Luma */ - for (block = 0; block < 16; block++, b++) { - const int eob = b->eob; - const int16_t *qcoeff_ptr = b->qcoeff; - int c = (type == PLANE_TYPE_Y_NO_DC) ? 1 : 0; - - TX_TYPE tx_type = get_tx_type(xd, &xd->block[block]); - switch (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; - } - a = (ENTROPY_CONTEXT *)xd->above_context + vp8_block2above[block]; - l = (ENTROPY_CONTEXT *)xd->left_context + vp8_block2left[block]; - VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); - - assert(b->eob <= 16); - - do { - const int band = vp8_coef_bands[c]; - int token; - - if (c < eob) { - const int rc = pt_scan[c]; - const int v = qcoeff_ptr[rc]; - - t->Extra = vp8_dct_value_tokens_ptr[v].Extra; - token = vp8_dct_value_tokens_ptr[v].Token; - } else - token = DCT_EOB_TOKEN; - - t->Token = token; - if (tx_type != DCT_DCT) - t->context_tree = cpi->common.fc.hybrid_coef_probs[type][band][pt]; - else - t->context_tree = cpi->common.fc.coef_probs[type][band][pt]; - - t->skip_eob_node = pt == 0 && ((band > 0 && type != PLANE_TYPE_Y_NO_DC) || - (band > 1 && type == PLANE_TYPE_Y_NO_DC)); - assert(vp8_coef_encodings[t->Token].Len - t->skip_eob_node > 0); - if (!dry_run) { - if (tx_type != DCT_DCT) - ++cpi->hybrid_coef_counts[type][band][pt][token]; - else - ++cpi->coef_counts[type][band][pt][token]; - } - pt = vp8_prev_token_class[token]; - ++t; - } while (c < eob && ++c < seg_eob); - - *tp = t; - pt = (c != !type); /* 0 <-> all coeff data is zero */ - *a = *l = pt; - } - - tokenize1st_order_chroma_4x4(xd, tp, cpi, dry_run); + *a = *l = (c != !type); /* 0 <-> all coeff data is zero */ } int mby_is_skippable_4x4(MACROBLOCKD *xd, int has_y2_block) { @@ -566,6 +299,8 @@ void vp8_tokenize_mb(VP8_COMP *cpi, int tx_size = xd->mode_info_context->mbmi.txfm_size; int mb_skip_context = get_pred_context(&cpi->common, xd, PRED_MBSKIP); TOKENEXTRA *t_backup = *t; + ENTROPY_CONTEXT * A = (ENTROPY_CONTEXT *) xd->above_context; + ENTROPY_CONTEXT * L = (ENTROPY_CONTEXT *) xd->left_context; // If the MB is going to be skipped because of a segment level flag // exclude this from the skip count stats used to calculate the @@ -619,65 +354,70 @@ void vp8_tokenize_mb(VP8_COMP *cpi, if (has_y2_block) { if (tx_size == TX_8X8) { - ENTROPY_CONTEXT *A = (ENTROPY_CONTEXT *)xd->above_context; - ENTROPY_CONTEXT *L = (ENTROPY_CONTEXT *)xd->left_context; - tokenize2nd_order_b_8x8(xd, - xd->block + 24, t, - A + vp8_block2above_8x8[24], - L + vp8_block2left_8x8[24], - cpi, dry_run); - } else - tokenize2nd_order_b_4x4(xd, t, cpi, dry_run); + tokenize_b(cpi, xd, xd->block + 24, t, PLANE_TYPE_Y2, + A + vp8_block2above_8x8[24], L + vp8_block2left_8x8[24], + TX_8X8, dry_run); + } else { + tokenize_b(cpi, xd, xd->block + 24, t, PLANE_TYPE_Y2, + A + vp8_block2above[24], L + vp8_block2left[24], + TX_4X4, dry_run); + } plane_type = PLANE_TYPE_Y_NO_DC; } else plane_type = PLANE_TYPE_Y_WITH_DC; if (tx_size == TX_16X16) { - ENTROPY_CONTEXT * A = (ENTROPY_CONTEXT *)xd->above_context; - ENTROPY_CONTEXT * L = (ENTROPY_CONTEXT *)xd->left_context; - - tokenize1st_order_b_16x16(xd, xd->block, t, PLANE_TYPE_Y_WITH_DC, - A, L, cpi, dry_run); + tokenize_b(cpi, xd, xd->block, t, PLANE_TYPE_Y_WITH_DC, + A, L, TX_16X16, dry_run); A[1] = A[2] = A[3] = A[0]; L[1] = L[2] = L[3] = L[0]; for (b = 16; b < 24; b += 4) { - tokenize1st_order_b_8x8(xd, xd->block + b, t, PLANE_TYPE_UV, - A + vp8_block2above_8x8[b], - L + vp8_block2left_8x8[b], cpi, dry_run); + tokenize_b(cpi, xd, xd->block + b, t, PLANE_TYPE_UV, + A + vp8_block2above_8x8[b], L + vp8_block2left_8x8[b], + TX_8X8, dry_run); A[vp8_block2above_8x8[b] + 1] = A[vp8_block2above_8x8[b]]; L[vp8_block2left_8x8[b] + 1] = L[vp8_block2left_8x8[b]]; } vpx_memset(&A[8], 0, sizeof(A[8])); vpx_memset(&L[8], 0, sizeof(L[8])); - } - else if (tx_size == TX_8X8) { - ENTROPY_CONTEXT *A = (ENTROPY_CONTEXT *)xd->above_context; - ENTROPY_CONTEXT *L = (ENTROPY_CONTEXT *)xd->left_context; + } else if (tx_size == TX_8X8) { for (b = 0; b < 16; b += 4) { - tokenize1st_order_b_8x8(xd, - xd->block + b, t, plane_type, - A + vp8_block2above_8x8[b], - L + vp8_block2left_8x8[b], - cpi, dry_run); + tokenize_b(cpi, xd, xd->block + b, t, plane_type, + A + vp8_block2above_8x8[b], L + vp8_block2left_8x8[b], + TX_8X8, dry_run); A[vp8_block2above_8x8[b] + 1] = A[vp8_block2above_8x8[b]]; L[vp8_block2left_8x8[b] + 1] = L[vp8_block2left_8x8[b]]; } if (xd->mode_info_context->mbmi.mode == I8X8_PRED || xd->mode_info_context->mbmi.mode == SPLITMV) { - tokenize1st_order_chroma_4x4(xd, t, cpi, dry_run); + for (b = 16; b < 24; b++) { + tokenize_b(cpi, xd, xd->block + b, t, PLANE_TYPE_UV, + A + vp8_block2above[b], L + vp8_block2left[b], + TX_4X4, dry_run); + } } else { for (b = 16; b < 24; b += 4) { - tokenize1st_order_b_8x8(xd, xd->block + b, t, PLANE_TYPE_UV, - A + vp8_block2above_8x8[b], - L + vp8_block2left_8x8[b], cpi, dry_run); + tokenize_b(cpi, xd, xd->block + b, t, PLANE_TYPE_UV, + A + vp8_block2above_8x8[b], L + vp8_block2left_8x8[b], + TX_8X8, dry_run); A[vp8_block2above_8x8[b] + 1] = A[vp8_block2above_8x8[b]]; L[vp8_block2left_8x8[b] + 1] = L[vp8_block2left_8x8[b]]; } } } else { - tokenize1st_order_b_4x4(xd, t, plane_type, cpi, dry_run); + for (b = 0; b < 16; b++) { + tokenize_b(cpi, xd, xd->block + b, t, plane_type, + A + vp8_block2above[b], L + vp8_block2left[b], + TX_4X4, dry_run); + } + + for (b = 16; b < 24; b++) { + tokenize_b(cpi, xd, xd->block + b, t, PLANE_TYPE_UV, + A + vp8_block2above[b], L + vp8_block2left[b], + TX_4X4, dry_run); + } } if (dry_run) *t = t_backup; @@ -930,87 +670,67 @@ void vp8_tokenize_initialize() { fill_value_tokens(); } -static __inline void stuff2nd_order_b_8x8(MACROBLOCKD *xd, - const BLOCKD *const b, - TOKENEXTRA **tp, - ENTROPY_CONTEXT *a, - ENTROPY_CONTEXT *l, - VP8_COMP *cpi, - int dry_run) { - int pt; /* near block/prev token context index */ - TOKENEXTRA *t = *tp; /* store tokens starting here */ - VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); - (void) b; - - t->Token = DCT_EOB_TOKEN; - t->context_tree = cpi->common.fc.coef_probs_8x8[PLANE_TYPE_Y2][0][pt]; - // t->section = 11; - t->skip_eob_node = 0; - ++t; - - *tp = t; - if (!dry_run) - ++cpi->coef_counts_8x8[PLANE_TYPE_Y2][0][pt][DCT_EOB_TOKEN]; - pt = 0; - *a = *l = pt; -} - -static __inline void stuff1st_order_b_8x8(MACROBLOCKD *xd, - const BLOCKD *const b, - TOKENEXTRA **tp, - PLANE_TYPE type, - ENTROPY_CONTEXT *a, - ENTROPY_CONTEXT *l, - VP8_COMP *cpi, - int dry_run) { - int pt; /* near block/prev token context index */ - TOKENEXTRA *t = *tp; /* store tokens starting here */ - TX_TYPE tx_type = get_tx_type(xd, b); - const int band = vp8_coef_bands_8x8[(type == PLANE_TYPE_Y_NO_DC) ? 1 : 0]; +static __inline void stuff_b(VP8_COMP *cpi, + MACROBLOCKD *xd, + const BLOCKD * const b, + TOKENEXTRA **tp, + PLANE_TYPE type, + ENTROPY_CONTEXT *a, + ENTROPY_CONTEXT *l, + TX_SIZE tx_size, + int dry_run) { + const int *bands; + unsigned int (*counts)[COEF_BANDS][PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS]; + vp8_prob (*probs)[COEF_BANDS][PREV_COEF_CONTEXTS][ENTROPY_NODES]; + int pt, band; + TOKENEXTRA *t = *tp; + const TX_TYPE tx_type = (type == PLANE_TYPE_Y_WITH_DC) ? + get_tx_type(xd, b) : DCT_DCT; VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); - (void) b; + switch (tx_size) { + default: + case TX_4X4: + bands = vp8_coef_bands; + if (tx_type != DCT_DCT) { + counts = cpi->hybrid_coef_counts; + probs = cpi->common.fc.hybrid_coef_probs; + } else { + counts = cpi->coef_counts; + probs = cpi->common.fc.coef_probs; + } + break; + case TX_8X8: + bands = vp8_coef_bands_8x8; + if (tx_type != DCT_DCT) { + counts = cpi->hybrid_coef_counts_8x8; + probs = cpi->common.fc.hybrid_coef_probs_8x8; + } else { + counts = cpi->coef_counts_8x8; + probs = cpi->common.fc.coef_probs_8x8; + } + break; + case TX_16X16: + bands = vp8_coef_bands_16x16; + if (tx_type != DCT_DCT) { + counts = cpi->hybrid_coef_counts_16x16; + probs = cpi->common.fc.hybrid_coef_probs_16x16; + } else { + counts = cpi->coef_counts_16x16; + probs = cpi->common.fc.coef_probs_16x16; + } + break; + } + band = bands[(type == PLANE_TYPE_Y_NO_DC) ? 1 : 0]; t->Token = DCT_EOB_TOKEN; - if (tx_type != DCT_DCT) - t->context_tree = cpi->common.fc.hybrid_coef_probs_8x8[type][band][pt]; - else - t->context_tree = cpi->common.fc.coef_probs_8x8[type][band][pt]; - // t->section = 8; + t->context_tree = probs[type][band][pt]; t->skip_eob_node = 0; ++t; *tp = t; + *a = *l = 0; if (!dry_run) { - if (tx_type == DCT_DCT) - ++cpi->hybrid_coef_counts_8x8[type][band][pt][DCT_EOB_TOKEN]; - else - ++cpi->coef_counts_8x8[type][band][pt][DCT_EOB_TOKEN]; + ++counts[type][band][pt][DCT_EOB_TOKEN]; } - pt = 0; /* 0 <-> all coeff data is zero */ - *a = *l = pt; -} - -static __inline void stuff1st_order_buv_8x8(MACROBLOCKD *xd, - const BLOCKD *const b, - TOKENEXTRA **tp, - ENTROPY_CONTEXT *a, - ENTROPY_CONTEXT *l, - VP8_COMP *cpi, - int dry_run) { - int pt; /* near block/prev token context index */ - TOKENEXTRA *t = *tp; /* store tokens starting here */ - VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); - (void) b; - - t->Token = DCT_EOB_TOKEN; - t->context_tree = cpi->common.fc.coef_probs_8x8[PLANE_TYPE_UV][0][pt]; - // t->section = 13; - t->skip_eob_node = 0; - ++t; - *tp = t; - if (!dry_run) - ++cpi->coef_counts_8x8[PLANE_TYPE_UV][0][pt][DCT_EOB_TOKEN]; - pt = 0; /* 0 <-> all coeff data is zero */ - *a = *l = pt; } static void vp8_stuff_mb_8x8(VP8_COMP *cpi, MACROBLOCKD *xd, @@ -1019,174 +739,52 @@ static void vp8_stuff_mb_8x8(VP8_COMP *cpi, MACROBLOCKD *xd, ENTROPY_CONTEXT *L = (ENTROPY_CONTEXT *)xd->left_context; PLANE_TYPE plane_type; int b; - TOKENEXTRA *t_backup = *t; - const int has_y2_block = (xd->mode_info_context->mbmi.mode != B_PRED - && xd->mode_info_context->mbmi.mode != I8X8_PRED - && xd->mode_info_context->mbmi.mode != SPLITMV); + const int has_y2_block = (xd->mode_info_context->mbmi.mode != B_PRED && + xd->mode_info_context->mbmi.mode != I8X8_PRED && + xd->mode_info_context->mbmi.mode != SPLITMV); if (has_y2_block) { - stuff2nd_order_b_8x8(xd, xd->block + 24, t, - A + vp8_block2above_8x8[24], - L + vp8_block2left_8x8[24], cpi, dry_run); + stuff_b(cpi, xd, xd->block + 24, t, PLANE_TYPE_Y2, + A + vp8_block2above_8x8[24], L + vp8_block2left_8x8[24], + TX_8X8, dry_run); plane_type = PLANE_TYPE_Y_NO_DC; } else { plane_type = PLANE_TYPE_Y_WITH_DC; } for (b = 0; b < 16; b += 4) { - stuff1st_order_b_8x8(xd, xd->block + b, t, plane_type, - A + vp8_block2above_8x8[b], - L + vp8_block2left_8x8[b], - cpi, dry_run); + stuff_b(cpi, xd, xd->block + b, t, plane_type, A + vp8_block2above_8x8[b], + L + vp8_block2left_8x8[b], TX_8X8, dry_run); A[vp8_block2above_8x8[b] + 1] = A[vp8_block2above_8x8[b]]; L[vp8_block2left_8x8[b] + 1] = L[vp8_block2left_8x8[b]]; } for (b = 16; b < 24; b += 4) { - stuff1st_order_buv_8x8(xd, xd->block + b, t, - A + vp8_block2above[b], - L + vp8_block2left[b], - cpi, dry_run); + stuff_b(cpi, xd, xd->block + b, t, PLANE_TYPE_UV, + A + vp8_block2above_8x8[b], L + vp8_block2left_8x8[b], + TX_8X8, dry_run); A[vp8_block2above_8x8[b] + 1] = A[vp8_block2above_8x8[b]]; L[vp8_block2left_8x8[b] + 1] = L[vp8_block2left_8x8[b]]; } - if (dry_run) - *t = t_backup; -} - -static __inline void stuff1st_order_b_16x16(MACROBLOCKD *xd, - const BLOCKD *const b, - TOKENEXTRA **tp, - PLANE_TYPE type, - ENTROPY_CONTEXT *a, - ENTROPY_CONTEXT *l, - VP8_COMP *cpi, - int dry_run) { - int pt; /* near block/prev token context index */ - TOKENEXTRA *t = *tp; /* store tokens starting here */ - TX_TYPE tx_type = get_tx_type(xd, b); - const int band = vp8_coef_bands_16x16[(type == PLANE_TYPE_Y_NO_DC) ? 1 : 0]; - VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); - (void) b; - - t->Token = DCT_EOB_TOKEN; - if (tx_type != DCT_DCT) - t->context_tree = cpi->common.fc.hybrid_coef_probs_16x16[type][band][pt]; - else - t->context_tree = cpi->common.fc.coef_probs_16x16[type][band][pt]; - t->skip_eob_node = 0; - ++t; - *tp = t; - if (!dry_run) { - if (tx_type != DCT_DCT) - ++cpi->hybrid_coef_counts_16x16[type][band][pt][DCT_EOB_TOKEN]; - else - ++cpi->coef_counts_16x16[type][band][pt][DCT_EOB_TOKEN]; - } - pt = 0; /* 0 <-> all coeff data is zero */ - *a = *l = pt; } static void vp8_stuff_mb_16x16(VP8_COMP *cpi, MACROBLOCKD *xd, TOKENEXTRA **t, int dry_run) { ENTROPY_CONTEXT * A = (ENTROPY_CONTEXT *)xd->above_context; ENTROPY_CONTEXT * L = (ENTROPY_CONTEXT *)xd->left_context; - int b, i; - TOKENEXTRA *t_backup = *t; + int b; - stuff1st_order_b_16x16(xd, xd->block, t, PLANE_TYPE_Y_WITH_DC, - A, L, cpi, dry_run); + stuff_b(cpi, xd, xd->block, t, PLANE_TYPE_Y_WITH_DC, A, L, TX_16X16, dry_run); A[1] = A[2] = A[3] = A[0]; L[1] = L[2] = L[3] = L[0]; for (b = 16; b < 24; b += 4) { - stuff1st_order_buv_8x8(xd, xd->block + b, t, - A + vp8_block2above[b], - L + vp8_block2left[b], - cpi, dry_run); + stuff_b(cpi, xd, xd->block + b, t, PLANE_TYPE_UV, A + vp8_block2above[b], + L + vp8_block2above_8x8[b], TX_8X8, dry_run); A[vp8_block2above_8x8[b] + 1] = A[vp8_block2above_8x8[b]]; L[vp8_block2left_8x8[b] + 1] = L[vp8_block2left_8x8[b]]; } vpx_memset(&A[8], 0, sizeof(A[8])); vpx_memset(&L[8], 0, sizeof(L[8])); - if (dry_run) - *t = t_backup; -} - -static __inline void stuff2nd_order_b_4x4(MACROBLOCKD *xd, - const BLOCKD *const b, - TOKENEXTRA **tp, - ENTROPY_CONTEXT *a, - ENTROPY_CONTEXT *l, - VP8_COMP *cpi, - int dry_run) { - int pt; /* near block/prev token context index */ - TOKENEXTRA *t = *tp; /* store tokens starting here */ - VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); - - t->Token = DCT_EOB_TOKEN; - t->context_tree = cpi->common.fc.coef_probs[PLANE_TYPE_Y2][0][pt]; - t->skip_eob_node = 0; - ++t; - *tp = t; - if (!dry_run) - ++cpi->coef_counts[PLANE_TYPE_Y2][0][pt] [DCT_EOB_TOKEN]; - - pt = 0; - *a = *l = pt; -} - -static __inline void stuff1st_order_b_4x4(MACROBLOCKD *xd, - const BLOCKD *const b, - TOKENEXTRA **tp, - PLANE_TYPE type, - ENTROPY_CONTEXT *a, - ENTROPY_CONTEXT *l, - VP8_COMP *cpi, - int dry_run) { - int pt; /* near block/prev token context index */ - TOKENEXTRA *t = *tp; /* store tokens starting here */ - TX_TYPE tx_type = get_tx_type(xd, b); - const int band = vp8_coef_bands[(type == PLANE_TYPE_Y_NO_DC) ? 1 : 0]; - VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); - - t->Token = DCT_EOB_TOKEN; - if (tx_type != DCT_DCT) - t->context_tree = cpi->common.fc.hybrid_coef_probs[type][band][pt]; - else - t->context_tree = cpi->common.fc.coef_probs[type][band][pt]; - t->skip_eob_node = 0; - ++t; - *tp = t; - if (!dry_run) { - if (tx_type != DCT_DCT) - ++cpi->hybrid_coef_counts[type][band][pt][DCT_EOB_TOKEN]; - else - ++cpi->coef_counts[type][band][pt][DCT_EOB_TOKEN]; - } - pt = 0; /* 0 <-> all coeff data is zero */ - *a = *l = pt; -} - -static __inline void stuff1st_order_buv_4x4(MACROBLOCKD *xd, - const BLOCKD *const b, - TOKENEXTRA **tp, - ENTROPY_CONTEXT *a, - ENTROPY_CONTEXT *l, - VP8_COMP *cpi, - int dry_run) { - int pt; /* near block/prev token context index */ - TOKENEXTRA *t = *tp; /* store tokens starting here */ - VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); - - t->Token = DCT_EOB_TOKEN; - t->context_tree = cpi->common.fc.coef_probs[PLANE_TYPE_UV][0][pt]; - t->skip_eob_node = 0; - ++t; - *tp = t; - if (!dry_run) - ++cpi->coef_counts[PLANE_TYPE_UV][0][pt][DCT_EOB_TOKEN]; - pt = 0; /* 0 <-> all coeff data is zero */ - *a = *l = pt; } static void vp8_stuff_mb_4x4(VP8_COMP *cpi, MACROBLOCKD *xd, @@ -1194,36 +792,26 @@ static void vp8_stuff_mb_4x4(VP8_COMP *cpi, MACROBLOCKD *xd, ENTROPY_CONTEXT *A = (ENTROPY_CONTEXT *)xd->above_context; ENTROPY_CONTEXT *L = (ENTROPY_CONTEXT *)xd->left_context; int b; - TOKENEXTRA *t_backup = *t; PLANE_TYPE plane_type; - const int has_y2_block = (xd->mode_info_context->mbmi.mode != B_PRED - && xd->mode_info_context->mbmi.mode != I8X8_PRED - && xd->mode_info_context->mbmi.mode != SPLITMV); + const int has_y2_block = (xd->mode_info_context->mbmi.mode != B_PRED && + xd->mode_info_context->mbmi.mode != I8X8_PRED && + xd->mode_info_context->mbmi.mode != SPLITMV); if (has_y2_block) { - stuff2nd_order_b_4x4(xd, xd->block + 24, t, - A + vp8_block2above[24], - L + vp8_block2left[24], - cpi, dry_run); + stuff_b(cpi, xd, xd->block + 24, t, PLANE_TYPE_Y2, A + vp8_block2above[24], + L + vp8_block2left[24], TX_4X4, dry_run); plane_type = PLANE_TYPE_Y_NO_DC; } else { plane_type = PLANE_TYPE_Y_WITH_DC; } for (b = 0; b < 16; b++) - stuff1st_order_b_4x4(xd, xd->block + b, t, plane_type, - A + vp8_block2above[b], - L + vp8_block2left[b], - cpi, dry_run); + stuff_b(cpi, xd, xd->block + b, t, plane_type, A + vp8_block2above[b], + L + vp8_block2left[b], TX_4X4, dry_run); for (b = 16; b < 24; b++) - stuff1st_order_buv_4x4(xd, xd->block + b, t, - A + vp8_block2above[b], - L + vp8_block2left[b], - cpi, dry_run); - - if (dry_run) - *t = t_backup; + stuff_b(cpi, xd, xd->block + b, t, PLANE_TYPE_UV, A + vp8_block2above[b], + L + vp8_block2left[b], TX_4X4, dry_run); } static void vp8_stuff_mb_8x8_4x4uv(VP8_COMP *cpi, MACROBLOCKD *xd, @@ -1231,29 +819,23 @@ static void vp8_stuff_mb_8x8_4x4uv(VP8_COMP *cpi, MACROBLOCKD *xd, ENTROPY_CONTEXT *A = (ENTROPY_CONTEXT *)xd->above_context; ENTROPY_CONTEXT *L = (ENTROPY_CONTEXT *)xd->left_context; int b; - TOKENEXTRA *t_backup = *t; for (b = 0; b < 16; b += 4) { - stuff1st_order_b_8x8(xd, xd->block + b, t, PLANE_TYPE_Y_WITH_DC, - A + vp8_block2above_8x8[b], - L + vp8_block2left_8x8[b], - cpi, dry_run); + stuff_b(cpi, xd, xd->block + b, t, PLANE_TYPE_Y_WITH_DC, + A + vp8_block2above_8x8[b], L + vp8_block2left_8x8[b], + TX_8X8, dry_run); A[vp8_block2above_8x8[b] + 1] = A[vp8_block2above_8x8[b]]; L[vp8_block2left_8x8[b] + 1] = L[vp8_block2left_8x8[b]]; } for (b = 16; b < 24; b++) - stuff1st_order_buv_4x4(xd, xd->block + b, t, - A + vp8_block2above[b], - L + vp8_block2left[b], - cpi, dry_run); - - if (dry_run) - *t = t_backup; + stuff_b(cpi, xd, xd->block + b, t, PLANE_TYPE_UV, A + vp8_block2above[b], + L + vp8_block2left[b], TX_4X4, dry_run); } void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCKD *xd, TOKENEXTRA **t, int dry_run) { TX_SIZE tx_size = xd->mode_info_context->mbmi.txfm_size; + TOKENEXTRA * const t_backup = *t; if (tx_size == TX_16X16) { vp8_stuff_mb_16x16(cpi, xd, t, dry_run); @@ -1267,6 +849,10 @@ void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCKD *xd, TOKENEXTRA **t, int dry_run) { } else { vp8_stuff_mb_4x4(cpi, xd, t, dry_run); } + + if (dry_run) { + *t = t_backup; + } } void vp8_fix_contexts(MACROBLOCKD *xd) { diff --git a/vp8/vp8_common.mk b/vp8/vp8_common.mk index fbbdec145..d6f31ed79 100644 --- a/vp8/vp8_common.mk +++ b/vp8/vp8_common.mk @@ -118,10 +118,11 @@ vp8/common/x86/filter_sse4.c.o: CFLAGS += -msse4 endif VP8_COMMON_SRCS-$(HAVE_SSE2) += common/x86/filter_sse2.c +VP8_COMMON_SRCS-$(HAVE_SSE2) += common/x86/sadmxn_x86.c ifeq ($(HAVE_SSE2),yes) vp8/common/x86/filter_sse2.c.o: CFLAGS += -msse2 vp8/common/x86/loopfilter_x86.c.o: CFLAGS += -msse2 -vp8/common/loopfilter_filters.c.o: CFLAGS += -msse2 +vp8/common/x86/sadmxn_x86.c.o: CFLAGS += -msse2 endif VP8_COMMON_SRCS-$(ARCH_ARM) += common/arm/arm_systemdependent.c |