summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vp8/common/reconintra4x4.c6
-rw-r--r--vp8/common/reconintra4x4.h2
-rw-r--r--vp8/common/rtcd_defs.sh6
-rw-r--r--vp8/common/x86/sadmxn_x86.c92
-rw-r--r--vp8/decoder/decodframe.c5
-rw-r--r--vp8/encoder/encodeframe.c6
-rw-r--r--vp8/encoder/rdopt.c4
-rw-r--r--vp8/encoder/tokenize.c818
-rw-r--r--vp8/vp8_common.mk3
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