summaryrefslogtreecommitdiff
path: root/vp9
diff options
context:
space:
mode:
Diffstat (limited to 'vp9')
-rw-r--r--vp9/decoder/vp9_detokenize.c92
1 files changed, 63 insertions, 29 deletions
diff --git a/vp9/decoder/vp9_detokenize.c b/vp9/decoder/vp9_detokenize.c
index 46ccf627f..7434bd5f9 100644
--- a/vp9/decoder/vp9_detokenize.c
+++ b/vp9/decoder/vp9_detokenize.c
@@ -429,62 +429,92 @@ static int vp9_decode_mb_tokens_8x8(VP9D_COMP* const pbi,
return eobtotal;
}
-int vp9_decode_coefs_4x4(VP9D_COMP *dx, MACROBLOCKD *xd,
- BOOL_DECODER* const bc,
- PLANE_TYPE type, int i) {
+static int decode_coefs_4x4(VP9D_COMP *dx, MACROBLOCKD *xd,
+ BOOL_DECODER* const bc,
+ PLANE_TYPE type, int i, int seg_eob,
+ TX_TYPE tx_type, const int *scan) {
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];
ENTROPY_CONTEXT *const l = L + vp9_block2left[i];
- INT16 *qcoeff_ptr = &xd->qcoeff[0];
- const int *scan = vp9_default_zig_zag1d;
unsigned short *const eobs = xd->eobs;
- int segment_id = xd->mode_info_context->mbmi.segment_id;
- int c, seg_eob = get_eob(xd, segment_id, 16);
- TX_TYPE tx_type = DCT_DCT;
+ int c;
+
+ c = decode_coefs(dx, xd, bc, a, l, type, tx_type, seg_eob,
+ xd->block[i].qcoeff, scan, TX_4X4, vp9_coef_bands);
+ eobs[i] = c;
+
+ return c;
+}
+
+static int decode_coefs_4x4_y(VP9D_COMP *dx, MACROBLOCKD *xd,
+ BOOL_DECODER* const bc,
+ PLANE_TYPE type, int i, int seg_eob) {
+ const TX_TYPE tx_type = (type == PLANE_TYPE_Y_WITH_DC) ?
+ get_tx_type(xd, &xd->block[i]) : DCT_DCT;
+ const int *scan;
- if (type == PLANE_TYPE_Y_WITH_DC)
- tx_type = get_tx_type_4x4(xd, &xd->block[i]);
switch (tx_type) {
- case ADST_DCT :
+ case ADST_DCT:
scan = vp9_row_scan;
break;
-
- case DCT_ADST :
+ case DCT_ADST:
scan = vp9_col_scan;
break;
-
- default :
+ default:
scan = vp9_default_zig_zag1d;
break;
}
- eobs[i] = c = decode_coefs(dx, xd, bc, a, l, type,
- tx_type, seg_eob, qcoeff_ptr + i * 16,
- scan, TX_4X4, vp9_coef_bands);
- return c;
+
+ return decode_coefs_4x4(dx, xd, bc, type, i, seg_eob, tx_type, scan);
}
-int vp9_decode_mb_tokens_4x4_uv(VP9D_COMP* const dx,
- MACROBLOCKD* const xd,
- BOOL_DECODER* const bc) {
+int vp9_decode_coefs_4x4(VP9D_COMP *dx, MACROBLOCKD *xd,
+ BOOL_DECODER* const bc,
+ PLANE_TYPE type, int i) {
+ const int segment_id = xd->mode_info_context->mbmi.segment_id;
+ const int seg_eob = get_eob(xd, segment_id, 16);
+
+ return decode_coefs_4x4_y(dx, xd, bc, type, i, seg_eob);
+}
+
+static int decode_mb_tokens_4x4_uv(VP9D_COMP* const dx,
+ MACROBLOCKD* const xd,
+ BOOL_DECODER* const bc,
+ int seg_eob) {
int eobtotal = 0, i;
- for (i = 16; i < 24; i++)
- eobtotal += vp9_decode_coefs_4x4(dx, xd, bc, PLANE_TYPE_UV, i);
+ // chroma blocks
+ for (i = 16; i < 24; i++) {
+ eobtotal += decode_coefs_4x4(dx, xd, bc, PLANE_TYPE_UV, i, seg_eob,
+ DCT_DCT, vp9_default_zig_zag1d);
+ }
return eobtotal;
}
+int vp9_decode_mb_tokens_4x4_uv(VP9D_COMP* const dx,
+ MACROBLOCKD* const xd,
+ BOOL_DECODER* const bc) {
+ const int segment_id = xd->mode_info_context->mbmi.segment_id;
+ const int seg_eob = get_eob(xd, segment_id, 16);
+
+ return decode_mb_tokens_4x4_uv(dx, xd, bc, seg_eob);
+}
+
static int vp9_decode_mb_tokens_4x4(VP9D_COMP* const dx,
MACROBLOCKD* const xd,
BOOL_DECODER* const bc) {
int i, eobtotal = 0;
PLANE_TYPE type;
+ const int segment_id = xd->mode_info_context->mbmi.segment_id;
+ const int seg_eob = get_eob(xd, segment_id, 16);
+ const int has_2nd_order = get_2nd_order_usage(xd);
- int has_2nd_order = get_2nd_order_usage(xd);
-
+ // 2nd order DC block
if (has_2nd_order) {
- eobtotal += vp9_decode_coefs_4x4(dx, xd, bc, PLANE_TYPE_Y2, 24) - 16;
+ eobtotal += decode_coefs_4x4(dx, xd, bc, PLANE_TYPE_Y2, 24, seg_eob,
+ DCT_DCT, vp9_default_zig_zag1d) - 16;
type = PLANE_TYPE_Y_NO_DC;
} else {
xd->above_context->y2 = 1;
@@ -493,11 +523,15 @@ static int vp9_decode_mb_tokens_4x4(VP9D_COMP* const dx,
type = PLANE_TYPE_Y_WITH_DC;
}
+ // luma blocks
for (i = 0; i < 16; ++i) {
- eobtotal += vp9_decode_coefs_4x4(dx, xd, bc, type, i);
+ eobtotal += decode_coefs_4x4_y(dx, xd, bc, type, i, seg_eob);
}
- return eobtotal + vp9_decode_mb_tokens_4x4_uv(dx, xd, bc);
+ // chroma blocks
+ eobtotal += decode_mb_tokens_4x4_uv(dx, xd, bc, seg_eob);
+
+ return eobtotal;
}
int vp9_decode_mb_tokens(VP9D_COMP* const dx,