diff options
author | John Koleszar <jkoleszar@google.com> | 2010-11-05 12:30:33 -0400 |
---|---|---|
committer | John Koleszar <jkoleszar@google.com> | 2010-11-05 12:30:33 -0400 |
commit | 7a590c902b9a77d9792d3a2497d28302eb0e0834 (patch) | |
tree | b1f735eee5d5a6fbc633b11eecf90dc47f8d7e42 /vp8/encoder/tokenize.c | |
parent | f4020e2338a1786b1db0f67075ceb7d9c01be6a3 (diff) | |
parent | 5551ef0ef4fd3271330fa5a2fbdfe70d4d2a1d2e (diff) | |
download | libvpx-7a590c902b9a77d9792d3a2497d28302eb0e0834.tar libvpx-7a590c902b9a77d9792d3a2497d28302eb0e0834.tar.gz libvpx-7a590c902b9a77d9792d3a2497d28302eb0e0834.tar.bz2 libvpx-7a590c902b9a77d9792d3a2497d28302eb0e0834.zip |
Merge remote branch 'origin/master' into experimental
Conflicts:
configure
ivfenc.c
vp8/common/alloccommon.c
vp8/common/onyxc_int.h
vp8/vp8_cx_iface.c
Diffstat (limited to 'vp8/encoder/tokenize.c')
-rw-r--r-- | vp8/encoder/tokenize.c | 209 |
1 files changed, 62 insertions, 147 deletions
diff --git a/vp8/encoder/tokenize.c b/vp8/encoder/tokenize.c index 33ddd64e7..e4da83379 100644 --- a/vp8/encoder/tokenize.c +++ b/vp8/encoder/tokenize.c @@ -1,10 +1,11 @@ /* - * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * Copyright (c) 2010 The WebM project authors. All Rights Reserved. * - * Use of this source code is governed by a BSD-style license and patent - * grant that can be found in the LICENSE file in the root of the source - * tree. All contributing project authors may be found in the AUTHORS - * file in the root of the source tree. + * 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. */ @@ -23,12 +24,12 @@ _int64 context_counters[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [vp8_coef_tokens]; #endif void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) ; -void vp8_fix_contexts(VP8_COMP *cpi, MACROBLOCKD *x); +void vp8_fix_contexts(MACROBLOCKD *x); -TOKENEXTRA vp8_dct_value_tokens[DCT_MAX_VALUE*2]; -TOKENEXTRA *vp8_dct_value_tokens_ptr; +TOKENVALUE vp8_dct_value_tokens[DCT_MAX_VALUE*2]; +const TOKENVALUE *vp8_dct_value_tokens_ptr; int vp8_dct_value_cost[DCT_MAX_VALUE*2]; -int *vp8_dct_value_cost_ptr; +const int *vp8_dct_value_cost_ptr; #if 0 int skip_true_count = 0; int skip_false_count = 0; @@ -36,7 +37,7 @@ int skip_false_count = 0; static void fill_value_tokens() { - TOKENEXTRA *const t = vp8_dct_value_tokens + DCT_MAX_VALUE; + TOKENVALUE *const t = vp8_dct_value_tokens + DCT_MAX_VALUE; vp8_extra_bit_struct *const e = vp8_extra_bits; int i = -DCT_MAX_VALUE; @@ -196,86 +197,40 @@ static void tokenize1st_order_b *a = *l = pt; } -#if 0 -void vp8_tokenize_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) -{ - //int i; - ENTROPY_CONTEXT **const A = x->above_context; - ENTROPY_CONTEXT(* const L)[4] = x->left_context; - int plane_type; - int b; - TOKENEXTRA *start = *t; - TOKENEXTRA *tp = *t; - - x->mbmi.dc_diff = 1; - vpx_memcpy(cpi->coef_counts_backup, cpi->coef_counts, sizeof(cpi->coef_counts)); +static int mb_is_skippable(MACROBLOCKD *x) +{ + int has_y2_block; + int skip = 1; + int i = 0; - if (x->mbmi.mode == B_PRED || x->mbmi.mode == SPLITMV) + has_y2_block = (x->mode_info_context->mbmi.mode != B_PRED + && x->mode_info_context->mbmi.mode != SPLITMV); + if (has_y2_block) { - plane_type = 3; - } - else - { - tokenize2nd_order_b(x->block + 24, t, 1, x->frame_type, - A[Y2CONTEXT] + vp8_block2above[24], L[Y2CONTEXT] + vp8_block2left[24], cpi); - plane_type = 0; - + for (i = 0; i < 16; i++) + skip &= (x->block[i].eob < 2); } - for (b = 0; b < 16; b++) - tokenize1st_order_b(x->block + b, t, plane_type, x->frame_type, - A[vp8_block2context[b]] + vp8_block2above[b], - L[vp8_block2context[b]] + vp8_block2left[b], cpi); - - for (b = 16; b < 24; b++) - tokenize1st_order_b(x->block + b, t, 2, x->frame_type, - A[vp8_block2context[b]] + vp8_block2above[b], - L[vp8_block2context[b]] + vp8_block2left[b], cpi); - - if (cpi->common.mb_no_coeff_skip) - { - x->mbmi.mb_skip_coeff = 1; - - while ((tp != *t) && x->mbmi.mb_skip_coeff) - { - x->mbmi.mb_skip_coeff = (x->mbmi.mb_skip_coeff && (tp->Token == DCT_EOB_TOKEN)); - tp ++; - } - - if (x->mbmi.mb_skip_coeff == 1) - { - x->mbmi.dc_diff = 0; - //redo the coutnts - vpx_memcpy(cpi->coef_counts, cpi->coef_counts_backup, sizeof(cpi->coef_counts)); + for (; i < 24 + has_y2_block; i++) + skip &= (!x->block[i].eob); - *t = start; - cpi->skip_true_count++; + return skip; +} - //skip_true_count++; - } - else - { - cpi->skip_false_count++; - //skip_false_count++; - } - } -} -#else void vp8_tokenize_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) { - //int i; - ENTROPY_CONTEXT **const A = x->above_context; - ENTROPY_CONTEXT(* const L)[4] = x->left_context; + ENTROPY_CONTEXT * A = (ENTROPY_CONTEXT *)x->above_context; + ENTROPY_CONTEXT * L = (ENTROPY_CONTEXT *)x->left_context; int plane_type; int b; TOKENEXTRA *start = *t; TOKENEXTRA *tp = *t; - x->mbmi.dc_diff = 1; + x->mode_info_context->mbmi.dc_diff = 1; #if 0 @@ -290,7 +245,8 @@ void vp8_tokenize_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) #if 1 - if (x->mbmi.mb_skip_coeff) + x->mode_info_context->mbmi.mb_skip_coeff = mb_is_skippable(x); + if (x->mode_info_context->mbmi.mb_skip_coeff) { cpi->skip_true_count++; @@ -299,13 +255,13 @@ void vp8_tokenize_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) vp8_stuff_mb(cpi, x, t) ; else { - vp8_fix_contexts(cpi, x); + vp8_fix_contexts(x); } - if (x->mbmi.mode != B_PRED && x->mbmi.mode != SPLITMV) - x->mbmi.dc_diff = 0; + if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.mode != SPLITMV) + x->mode_info_context->mbmi.dc_diff = 0; else - x->mbmi.dc_diff = 1; + x->mode_info_context->mbmi.dc_diff = 1; return; @@ -314,59 +270,30 @@ void vp8_tokenize_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) cpi->skip_false_count++; #endif #if 0 - - if (x->mbmi.mode == B_PRED || x->mbmi.mode == SPLITMV) - { - int i, skip = 1; - - for (i = 0; i < 24; i++) - skip &= (!x->block[i].eob); - - if (skip != x->mbmi.mb_skip_coeff) - skip += 0; - - x->mbmi.mb_skip_coeff = skip; - } - else - { - int i, skip = 1; - - for (i = 0; i < 16; i++) - skip &= (x->block[i].eob < 2); - - for (i = 16; i < 25; i++) - skip &= (!x->block[i].eob); - - if (skip != x->mbmi.mb_skip_coeff) - skip += 0; - - x->mbmi.mb_skip_coeff = skip; - } - vpx_memcpy(cpi->coef_counts_backup, cpi->coef_counts, sizeof(cpi->coef_counts)); #endif - if (x->mbmi.mode == B_PRED || x->mbmi.mode == SPLITMV) + if (x->mode_info_context->mbmi.mode == B_PRED || x->mode_info_context->mbmi.mode == SPLITMV) { plane_type = 3; } else { tokenize2nd_order_b(x->block + 24, t, 1, x->frame_type, - A[Y2CONTEXT] + vp8_block2above[24], L[Y2CONTEXT] + vp8_block2left[24], cpi); + A + vp8_block2above[24], L + vp8_block2left[24], cpi); plane_type = 0; } for (b = 0; b < 16; b++) tokenize1st_order_b(x->block + b, t, plane_type, x->frame_type, - A[vp8_block2context[b]] + vp8_block2above[b], - L[vp8_block2context[b]] + vp8_block2left[b], cpi); + A + vp8_block2above[b], + L + vp8_block2left[b], cpi); for (b = 16; b < 24; b++) tokenize1st_order_b(x->block + b, t, 2, x->frame_type, - A[vp8_block2context[b]] + vp8_block2above[b], - L[vp8_block2context[b]] + vp8_block2left[b], cpi); + A + vp8_block2above[b], + L + vp8_block2left[b], cpi); #if 0 @@ -405,7 +332,7 @@ void vp8_tokenize_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) #endif } -#endif + #ifdef ENTROPY_STATS @@ -580,57 +507,45 @@ void stuff1st_order_buv void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) { - //int i; - ENTROPY_CONTEXT **const A = x->above_context; - ENTROPY_CONTEXT(* const L)[4] = x->left_context; + ENTROPY_CONTEXT * A = (ENTROPY_CONTEXT *)x->above_context; + ENTROPY_CONTEXT * L = (ENTROPY_CONTEXT *)x->left_context; int plane_type; int b; stuff2nd_order_b(x->block + 24, t, 1, x->frame_type, - A[Y2CONTEXT] + vp8_block2above[24], L[Y2CONTEXT] + vp8_block2left[24], cpi); + A + vp8_block2above[24], L + vp8_block2left[24], cpi); plane_type = 0; - if (x->mbmi.mode != B_PRED && x->mbmi.mode != SPLITMV) - x->mbmi.dc_diff = 0; + if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.mode != SPLITMV) + x->mode_info_context->mbmi.dc_diff = 0; else - x->mbmi.dc_diff = 1; + x->mode_info_context->mbmi.dc_diff = 1; for (b = 0; b < 16; b++) stuff1st_order_b(x->block + b, t, plane_type, x->frame_type, - A[vp8_block2context[b]] + vp8_block2above[b], - L[vp8_block2context[b]] + vp8_block2left[b], cpi); + A + vp8_block2above[b], + L + vp8_block2left[b], cpi); for (b = 16; b < 24; b++) stuff1st_order_buv(x->block + b, t, 2, x->frame_type, - A[vp8_block2context[b]] + vp8_block2above[b], - L[vp8_block2context[b]] + vp8_block2left[b], cpi); + A + vp8_block2above[b], + L + vp8_block2left[b], cpi); } -void vp8_fix_contexts(VP8_COMP *cpi, MACROBLOCKD *x) +void vp8_fix_contexts(MACROBLOCKD *x) { - x->left_context[Y1CONTEXT][0] = 0; - x->left_context[Y1CONTEXT][1] = 0; - x->left_context[Y1CONTEXT][2] = 0; - x->left_context[Y1CONTEXT][3] = 0; - x->left_context[UCONTEXT][0] = 0; - x->left_context[VCONTEXT][0] = 0; - x->left_context[UCONTEXT][1] = 0; - x->left_context[VCONTEXT][1] = 0; - - x->above_context[Y1CONTEXT][0] = 0; - x->above_context[Y1CONTEXT][1] = 0; - x->above_context[Y1CONTEXT][2] = 0; - x->above_context[Y1CONTEXT][3] = 0; - x->above_context[UCONTEXT][0] = 0; - x->above_context[VCONTEXT][0] = 0; - x->above_context[UCONTEXT][1] = 0; - x->above_context[VCONTEXT][1] = 0; - - if (x->mbmi.mode != B_PRED && x->mbmi.mode != SPLITMV) + /* Clear entropy contexts for Y2 blocks */ + if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.mode != SPLITMV) { - x->left_context[Y2CONTEXT][0] = 0; - x->above_context[Y2CONTEXT][0] = 0; + vpx_memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)); + vpx_memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)); } + else + { + vpx_memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1); + vpx_memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1); + } + } |