summaryrefslogtreecommitdiff
path: root/vp9/decoder
diff options
context:
space:
mode:
authorRonald S. Bultje <rbultje@google.com>2012-11-21 12:39:55 -0800
committerRonald S. Bultje <rbultje@google.com>2012-11-21 12:39:55 -0800
commita5e542e74b30cbc8cb98b7badc93d7614930a76a (patch)
tree546d2cd5411fc108b7c41748f3c426f8395185a0 /vp9/decoder
parente25bd474ad6d8a719c7cc82ddc1b41f901dc3a61 (diff)
downloadlibvpx-a5e542e74b30cbc8cb98b7badc93d7614930a76a.tar
libvpx-a5e542e74b30cbc8cb98b7badc93d7614930a76a.tar.gz
libvpx-a5e542e74b30cbc8cb98b7badc93d7614930a76a.tar.bz2
libvpx-a5e542e74b30cbc8cb98b7badc93d7614930a76a.zip
Fix enc/dec mismatch with b_context_pred experiment enabled.
Change-Id: I1272ae3f0fdfb7ed8eb364ef0c6dd1818d3179d7
Diffstat (limited to 'vp9/decoder')
-rw-r--r--vp9/decoder/decodframe.c6
-rw-r--r--vp9/decoder/detokenize.c27
-rw-r--r--vp9/decoder/detokenize.h7
3 files changed, 30 insertions, 10 deletions
diff --git a/vp9/decoder/decodframe.c b/vp9/decoder/decodframe.c
index e7d5667f8..46821073f 100644
--- a/vp9/decoder/decodframe.c
+++ b/vp9/decoder/decodframe.c
@@ -395,7 +395,7 @@ static void decode_macroblock(VP9D_COMP *pbi, MACROBLOCKD *xd,
eobtotal = vp9_decode_mb_tokens_16x16(pbi, xd, bc);
} else if (tx_size == TX_8X8) {
eobtotal = vp9_decode_mb_tokens_8x8(pbi, xd, bc);
- } else {
+ } else if (mode != B_PRED) {
eobtotal = vp9_decode_mb_tokens_4x4(pbi, xd, bc);
}
}
@@ -491,6 +491,8 @@ static void decode_macroblock(VP9D_COMP *pbi, MACROBLOCKD *xd,
xd->mode_info_context->bmi[i].as_mode.context = b->bmi.as_mode.context =
vp9_find_bpred_context(b);
#endif
+ if (!xd->mode_info_context->mbmi.mb_skip_coeff)
+ eobtotal += vp9_decode_coefs_4x4(pbi, xd, bc, PLANE_TYPE_Y_WITH_DC, i);
#if CONFIG_COMP_INTRA_PRED
b_mode2 = xd->mode_info_context->bmi[i].as_mode.second;
@@ -513,6 +515,8 @@ static void decode_macroblock(VP9D_COMP *pbi, MACROBLOCKD *xd,
*(b->base_dst) + b->dst, 16, b->dst_stride);
}
}
+ if (!xd->mode_info_context->mbmi.mb_skip_coeff)
+ vp9_decode_mb_tokens_4x4_uv(pbi, xd, bc);
} else if (mode == SPLITMV) {
if (tx_size == TX_8X8) {
vp9_dequant_idct_add_y_block_8x8(xd->qcoeff, xd->block[0].dequant,
diff --git a/vp9/decoder/detokenize.c b/vp9/decoder/detokenize.c
index 16e85a0e1..1194aa82c 100644
--- a/vp9/decoder/detokenize.c
+++ b/vp9/decoder/detokenize.c
@@ -389,9 +389,9 @@ int vp9_decode_mb_tokens_8x8(VP9D_COMP* const pbi,
return eobtotal;
}
-static int decode_coefs_4x4(VP9D_COMP *dx, MACROBLOCKD *xd,
- BOOL_DECODER* const bc,
- PLANE_TYPE type, int i) {
+int vp9_decode_coefs_4x4(VP9D_COMP *dx, MACROBLOCKD *xd,
+ BOOL_DECODER* const bc,
+ PLANE_TYPE type, int i) {
ENTROPY_CONTEXT *const A = (ENTROPY_CONTEXT *)xd->above_context;
ENTROPY_CONTEXT *const L = (ENTROPY_CONTEXT *)xd->left_context;
ENTROPY_CONTEXT *const a = A + vp9_block2above[i];
@@ -424,6 +424,17 @@ static int decode_coefs_4x4(VP9D_COMP *dx, MACROBLOCKD *xd,
return c;
}
+int vp9_decode_mb_tokens_4x4_uv(VP9D_COMP* const dx,
+ MACROBLOCKD* const xd,
+ BOOL_DECODER* const bc) {
+ int eobtotal = 0, i;
+
+ for (i = 16; i < 24; i++)
+ eobtotal += vp9_decode_coefs_4x4(dx, xd, bc, PLANE_TYPE_UV, i);
+
+ return eobtotal;
+}
+
int vp9_decode_mb_tokens_4x4(VP9D_COMP* const dx,
MACROBLOCKD* const xd,
BOOL_DECODER* const bc) {
@@ -433,17 +444,15 @@ int vp9_decode_mb_tokens_4x4(VP9D_COMP* const dx,
if (xd->mode_info_context->mbmi.mode != B_PRED &&
xd->mode_info_context->mbmi.mode != I8X8_PRED &&
xd->mode_info_context->mbmi.mode != SPLITMV) {
- eobtotal += decode_coefs_4x4(dx, xd, bc, PLANE_TYPE_Y2, 24) - 16;
+ eobtotal += vp9_decode_coefs_4x4(dx, xd, bc, PLANE_TYPE_Y2, 24) - 16;
type = PLANE_TYPE_Y_NO_DC;
} else {
type = PLANE_TYPE_Y_WITH_DC;
}
for (i = 0; i < 16; ++i) {
- eobtotal += decode_coefs_4x4(dx, xd, bc, type, i);
+ eobtotal += vp9_decode_coefs_4x4(dx, xd, bc, type, i);
}
- do {
- eobtotal += decode_coefs_4x4(dx, xd, bc, PLANE_TYPE_UV, i);
- } while (++i < 24);
- return eobtotal;
+
+ return eobtotal + vp9_decode_mb_tokens_4x4_uv(dx, xd, bc);
}
diff --git a/vp9/decoder/detokenize.h b/vp9/decoder/detokenize.h
index 5a7d354ce..a8f78f4cc 100644
--- a/vp9/decoder/detokenize.h
+++ b/vp9/decoder/detokenize.h
@@ -16,9 +16,16 @@
void vp9_reset_mb_tokens_context(MACROBLOCKD* const);
+int vp9_decode_coefs_4x4(VP9D_COMP *dx, MACROBLOCKD *xd,
+ BOOL_DECODER* const bc,
+ PLANE_TYPE type, int i);
+
int vp9_decode_mb_tokens_4x4(VP9D_COMP* const, MACROBLOCKD* const,
BOOL_DECODER* const);
+int vp9_decode_mb_tokens_4x4_uv(VP9D_COMP* const dx, MACROBLOCKD* const xd,
+ BOOL_DECODER* const bc);
+
int vp9_decode_mb_tokens_8x8(VP9D_COMP* const, MACROBLOCKD* const,
BOOL_DECODER* const);