diff --git a/vp9/decoder/decodframe.c b/vp9/decoder/decodframe.c index e7d5667f8d17026d531f8f8b9fde94f082a0c907..46821073fba822d829f33f9469211e8af3398c88 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 16e85a0e10bb38932dca3841526717c1a6fe18d3..1194aa82cbcd237564c229c5ada15999134e53a5 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 5a7d354cefb1649f59f628280c6117ad61f7dc8b..a8f78f4ccce216cee4ba5c063080c9a999507e95 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);