diff options
author | John Koleszar <jkoleszar@google.com> | 2012-11-27 13:59:17 -0800 |
---|---|---|
committer | John Koleszar <jkoleszar@google.com> | 2012-11-27 14:12:30 -0800 |
commit | fcccbcbb395ce4cf31b54ce1245cc28e5e3ef4c1 (patch) | |
tree | 68e128e48e3f5ab1de1c163fa3a12ea47f5d8d51 /vp9/common/vp9_treecoder.c | |
parent | 3bf7b131c8ebb6b4d63a8b70d69066dcbc4ed896 (diff) | |
download | libvpx-fcccbcbb395ce4cf31b54ce1245cc28e5e3ef4c1.tar libvpx-fcccbcbb395ce4cf31b54ce1245cc28e5e3ef4c1.tar.gz libvpx-fcccbcbb395ce4cf31b54ce1245cc28e5e3ef4c1.tar.bz2 libvpx-fcccbcbb395ce4cf31b54ce1245cc28e5e3ef4c1.zip |
Add vp9_ prefix to all vp9 files
Support for gyp which doesn't support multiple objects in the same
static library having the same basename.
Change-Id: Ib947eefbaf68f8b177a796d23f875ccdfa6bc9dc
Diffstat (limited to 'vp9/common/vp9_treecoder.c')
-rw-r--r-- | vp9/common/vp9_treecoder.c | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/vp9/common/vp9_treecoder.c b/vp9/common/vp9_treecoder.c new file mode 100644 index 000000000..096dd59e5 --- /dev/null +++ b/vp9/common/vp9_treecoder.c @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2010 The WebM project authors. All Rights Reserved. + * + * 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. + */ + + +#include "vpx_config.h" + +#if defined(CONFIG_DEBUG) && CONFIG_DEBUG +#include <assert.h> +#endif +#include <stdio.h> + +#include "vp9_treecoder.h" + +static void tree2tok( + struct vp9_token_struct *const p, + vp9_tree t, + int i, + int v, + int L +) { + v += v; + ++L; + + do { + const vp9_tree_index j = t[i++]; + + if (j <= 0) { + p[-j].value = v; + p[-j].Len = L; + } else + tree2tok(p, t, j, v, L); + } while (++v & 1); +} + +void vp9_tokens_from_tree(struct vp9_token_struct *p, vp9_tree t) { + tree2tok(p, t, 0, 0, 0); +} + +void vp9_tokens_from_tree_offset(struct vp9_token_struct *p, vp9_tree t, + int offset) { + tree2tok(p - offset, t, 0, 0, 0); +} + +static void branch_counts( + int n, /* n = size of alphabet */ + vp9_token tok [ /* n */ ], + vp9_tree tree, + unsigned int branch_ct [ /* n-1 */ ] [2], + const unsigned int num_events[ /* n */ ] +) { + const int tree_len = n - 1; + int t = 0; + +#if CONFIG_DEBUG + assert(tree_len); +#endif + + do { + branch_ct[t][0] = branch_ct[t][1] = 0; + } while (++t < tree_len); + + t = 0; + + do { + int L = tok[t].Len; + const int enc = tok[t].value; + const unsigned int ct = num_events[t]; + + vp9_tree_index i = 0; + + do { + const int b = (enc >> --L) & 1; + const int j = i >> 1; +#if CONFIG_DEBUG + assert(j < tree_len && 0 <= L); +#endif + + branch_ct [j] [b] += ct; + i = tree[ i + b]; + } while (i > 0); + +#if CONFIG_DEBUG + assert(!L); +#endif + } while (++t < n); + +} + + +void vp9_tree_probs_from_distribution( + int n, /* n = size of alphabet */ + vp9_token tok [ /* n */ ], + vp9_tree tree, + vp9_prob probs [ /* n-1 */ ], + unsigned int branch_ct [ /* n-1 */ ] [2], + const unsigned int num_events[ /* n */ ], + unsigned int Pfac, + int rd +) { + const int tree_len = n - 1; + int t = 0; + + branch_counts(n, tok, tree, branch_ct, num_events); + + do { + const unsigned int *const c = branch_ct[t]; + const unsigned int tot = c[0] + c[1]; + +#if CONFIG_DEBUG + assert(tot < (1 << 24)); /* no overflow below */ +#endif + + if (tot) { + const unsigned int p = ((c[0] * Pfac) + (rd ? tot >> 1 : 0)) / tot; + probs[t] = p < 256 ? (p ? p : 1) : 255; /* agree w/old version for now */ + } else + probs[t] = vp9_prob_half; + } while (++t < tree_len); +} + +vp9_prob vp9_bin_prob_from_distribution(const unsigned int counts[2]) { + int tot_count = counts[0] + counts[1]; + vp9_prob prob; + if (tot_count) { + prob = (counts[0] * 255 + (tot_count >> 1)) / tot_count; + prob += !prob; + } else { + prob = 128; + } + return prob; +} |