summaryrefslogtreecommitdiff
path: root/vp8/encoder/tokenize.c
diff options
context:
space:
mode:
Diffstat (limited to 'vp8/encoder/tokenize.c')
-rw-r--r--vp8/encoder/tokenize.c108
1 files changed, 104 insertions, 4 deletions
diff --git a/vp8/encoder/tokenize.c b/vp8/encoder/tokenize.c
index 50a31643d..81ba6f2be 100644
--- a/vp8/encoder/tokenize.c
+++ b/vp8/encoder/tokenize.c
@@ -334,9 +334,8 @@ static void tokenize1st_order_ht( MACROBLOCKD *xd,
}
// assign scanning order for luma components coded in intra4x4 mode
- if( ( ( xd->mode_info_context->mbmi.mode == B_PRED ) ||
- ( xd->mode_info_context->mbmi.mode == I8X8_PRED ) ) &&
- ( type == PLANE_TYPE_Y_WITH_DC) ) {
+ if( (xd->mode_info_context->mbmi.mode == B_PRED) &&
+ (type == PLANE_TYPE_Y_WITH_DC) ) {
switch(b_mode) {
case B_VE_PRED :
case B_VR_PRED :
@@ -455,6 +454,84 @@ static void tokenize1st_order_ht( MACROBLOCKD *xd,
}
#endif
+
+#if CONFIG_HTRANS8X8
+static void tokenize1st_order_chroma
+(
+ MACROBLOCKD *xd,
+ TOKENEXTRA **tp,
+ int type, /* which plane: 0=Y no DC, 1=Y2, 2=UV, 3=Y with DC */
+ VP8_COMP *cpi
+) {
+ unsigned int block;
+ const BLOCKD *b;
+ int pt; /* near block/prev token context index */
+ int c;
+ int token;
+ TOKENEXTRA *t = *tp;/* store tokens starting here */
+ const short *qcoeff_ptr;
+ ENTROPY_CONTEXT *a;
+ ENTROPY_CONTEXT *l;
+ int band, rc, v;
+ int tmp1, tmp2;
+
+ 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);
+ }
+
+ b = xd->block;
+ b += 16;
+
+ /* Chroma */
+ for (block = 16; block < 24; block++, b++) {
+ tmp1 = vp8_block2above[block];
+ tmp2 = vp8_block2left[block];
+ qcoeff_ptr = b->qcoeff;
+ a = (ENTROPY_CONTEXT *)xd->above_context + tmp1;
+ l = (ENTROPY_CONTEXT *)xd->left_context + tmp2;
+
+ VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
+
+ for (c = 0; c < b->eob; c++) {
+ rc = vp8_default_zig_zag1d[c];
+ band = vp8_coef_bands[c];
+ v = qcoeff_ptr[rc];
+
+ t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
+ token = vp8_dct_value_tokens_ptr[v].Token;
+
+ t->Token = token;
+ t->context_tree = cpi->common.fc.coef_probs [2] [band] [pt];
+
+ t->skip_eob_node = ((pt == 0) && (band > 0));
+
+ ++cpi->coef_counts [2] [band] [pt] [token];
+
+ pt = vp8_prev_token_class[token];
+ t++;
+ }
+
+ if (c < seg_eob) {
+ band = vp8_coef_bands[c];
+ t->Token = DCT_EOB_TOKEN;
+ t->context_tree = cpi->common.fc.coef_probs [2] [band] [pt];
+
+ t->skip_eob_node = ((pt == 0) && (band > 0));
+
+ ++cpi->coef_counts [2] [band] [pt] [DCT_EOB_TOKEN];
+
+ t++;
+ }
+ *tp = t;
+ pt = (c != 0); /* 0 <-> all coeff data is zero */
+ *a = *l = pt;
+ }
+}
+#endif
+
static void tokenize1st_order_b
(
MACROBLOCKD *xd,
@@ -640,7 +717,8 @@ void vp8_tokenize_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) {
#if CONFIG_HYBRIDTRANSFORM
int QIndex = cpi->mb.q_index;
- int active_ht = (QIndex < ACTIVE_HT);
+ int active_ht = (QIndex < ACTIVE_HT) &&
+ (x->mode_info_context->mbmi.mode == B_PRED);
#endif
if (!segfeature_active(x, segment_id, SEG_LVL_EOB) ||
@@ -717,7 +795,29 @@ void vp8_tokenize_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) {
if(active_ht) {
tokenize1st_order_ht(x, t, plane_type, cpi);
} else {
+
+#if CONFIG_HTRANS8X8
+ if (x->mode_info_context->mbmi.mode == I8X8_PRED) {
+ ENTROPY_CONTEXT *A = (ENTROPY_CONTEXT *)x->above_context;
+ ENTROPY_CONTEXT *L = (ENTROPY_CONTEXT *)x->left_context;
+ for (b = 0; b < 16; b += 4) {
+ tokenize1st_order_b_8x8(x,
+ x->block + b, t, PLANE_TYPE_Y_WITH_DC,
+ x->frame_type,
+ A + vp8_block2above_8x8[b],
+ L + vp8_block2left_8x8[b],
+ cpi);
+ *(A + vp8_block2above_8x8[b] + 1) = *(A + vp8_block2above_8x8[b]);
+ *(L + vp8_block2left_8x8[b] + 1) = *(L + vp8_block2left_8x8[b]);
+ }
+ tokenize1st_order_chroma(x, t, PLANE_TYPE_UV, cpi);
+ } else {
+ tokenize1st_order_b(x, t, plane_type, cpi);
+ }
+#else
tokenize1st_order_b(x, t, plane_type, cpi);
+#endif
+
}
#else
tokenize1st_order_b(x, t, plane_type, cpi);