diff options
author | John Koleszar <jkoleszar@google.com> | 2010-05-18 11:58:33 -0400 |
---|---|---|
committer | John Koleszar <jkoleszar@google.com> | 2010-05-18 11:58:33 -0400 |
commit | 0ea50ce9cb4b65eee6afa1d041fe8beb5abda667 (patch) | |
tree | 1f3b9019f28bc56fd3156f96e5a9653a983ee61b /vp8/common/entropy.c | |
download | libvpx-0ea50ce9cb4b65eee6afa1d041fe8beb5abda667.tar libvpx-0ea50ce9cb4b65eee6afa1d041fe8beb5abda667.tar.gz libvpx-0ea50ce9cb4b65eee6afa1d041fe8beb5abda667.tar.bz2 libvpx-0ea50ce9cb4b65eee6afa1d041fe8beb5abda667.zip |
Initial WebM release
Diffstat (limited to 'vp8/common/entropy.c')
-rw-r--r-- | vp8/common/entropy.c | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/vp8/common/entropy.c b/vp8/common/entropy.c new file mode 100644 index 000000000..e524c2acc --- /dev/null +++ b/vp8/common/entropy.c @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2010 The VP8 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. + */ + + +#include <stdio.h> + +#include "entropy.h" +#include "string.h" +#include "blockd.h" +#include "onyxc_int.h" + +#define uchar unsigned char /* typedefs can clash */ +#define uint unsigned int + +typedef const uchar cuchar; +typedef const uint cuint; + +typedef vp8_prob Prob; + +#include "coefupdateprobs.h" + +DECLARE_ALIGNED(16, cuchar, vp8_coef_bands[16]) = { 0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7}; +DECLARE_ALIGNED(16, cuchar, vp8_prev_token_class[MAX_ENTROPY_TOKENS]) = { 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0}; +DECLARE_ALIGNED(16, const int, vp8_default_zig_zag1d[16]) = +{ + 0, 1, 4, 8, + 5, 2, 3, 6, + 9, 12, 13, 10, + 7, 11, 14, 15, +}; + +DECLARE_ALIGNED(16, short, vp8_default_zig_zag_mask[16]); + +const int vp8_mb_feature_data_bits[MB_LVL_MAX] = {7, 6}; + +/* Array indices are identical to previously-existing CONTEXT_NODE indices */ + +const vp8_tree_index vp8_coef_tree[ 22] = /* corresponding _CONTEXT_NODEs */ +{ + -DCT_EOB_TOKEN, 2, /* 0 = EOB */ + -ZERO_TOKEN, 4, /* 1 = ZERO */ + -ONE_TOKEN, 6, /* 2 = ONE */ + 8, 12, /* 3 = LOW_VAL */ + -TWO_TOKEN, 10, /* 4 = TWO */ + -THREE_TOKEN, -FOUR_TOKEN, /* 5 = THREE */ + 14, 16, /* 6 = HIGH_LOW */ + -DCT_VAL_CATEGORY1, -DCT_VAL_CATEGORY2, /* 7 = CAT_ONE */ + 18, 20, /* 8 = CAT_THREEFOUR */ + -DCT_VAL_CATEGORY3, -DCT_VAL_CATEGORY4, /* 9 = CAT_THREE */ + -DCT_VAL_CATEGORY5, -DCT_VAL_CATEGORY6 /* 10 = CAT_FIVE */ +}; + +struct vp8_token_struct vp8_coef_encodings[vp8_coef_tokens]; + +/* Trees for extra bits. Probabilities are constant and + do not depend on previously encoded bits */ + +static const Prob Pcat1[] = { 159}; +static const Prob Pcat2[] = { 165, 145}; +static const Prob Pcat3[] = { 173, 148, 140}; +static const Prob Pcat4[] = { 176, 155, 140, 135}; +static const Prob Pcat5[] = { 180, 157, 141, 134, 130}; +static const Prob Pcat6[] = +{ 254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129}; + +static vp8_tree_index cat1[2], cat2[4], cat3[6], cat4[8], cat5[10], cat6[22]; + +void vp8_init_scan_order_mask() +{ + int i; + + for (i = 0; i < 16; i++) + { + vp8_default_zig_zag_mask[vp8_default_zig_zag1d[i]] = 1 << i; + } + +} + +static void init_bit_tree(vp8_tree_index *p, int n) +{ + int i = 0; + + while (++i < n) + { + p[0] = p[1] = i << 1; + p += 2; + } + + p[0] = p[1] = 0; +} + +static void init_bit_trees() +{ + init_bit_tree(cat1, 1); + init_bit_tree(cat2, 2); + init_bit_tree(cat3, 3); + init_bit_tree(cat4, 4); + init_bit_tree(cat5, 5); + init_bit_tree(cat6, 11); +} + + +static vp8bc_index_t bcc1[1], bcc2[2], bcc3[3], bcc4[4], bcc5[5], bcc6[11]; + +vp8_extra_bit_struct vp8_extra_bits[12] = +{ + { 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 1}, + { 0, 0, 0, 0, 2}, + { 0, 0, 0, 0, 3}, + { 0, 0, 0, 0, 4}, + { cat1, Pcat1, bcc1, 1, 5}, + { cat2, Pcat2, bcc2, 2, 7}, + { cat3, Pcat3, bcc3, 3, 11}, + { cat4, Pcat4, bcc4, 4, 19}, + { cat5, Pcat5, bcc5, 5, 35}, + { cat6, Pcat6, bcc6, 11, 67}, + { 0, 0, 0, 0, 0} +}; +#include "defaultcoefcounts.h" + +void vp8_default_coef_probs(VP8_COMMON *pc) +{ + int h = 0; + + do + { + int i = 0; + + do + { + int k = 0; + + do + { + unsigned int branch_ct [vp8_coef_tokens-1] [2]; + vp8_tree_probs_from_distribution( + vp8_coef_tokens, vp8_coef_encodings, vp8_coef_tree, + pc->fc.coef_probs [h][i][k], branch_ct, default_coef_counts [h][i][k], + 256, 1); + + } + while (++k < PREV_COEF_CONTEXTS); + } + while (++i < COEF_BANDS); + } + while (++h < BLOCK_TYPES); +} + + +void vp8_coef_tree_initialize() +{ + init_bit_trees(); + vp8_tokens_from_tree(vp8_coef_encodings, vp8_coef_tree); +} |