16fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org/* 26fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 36fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * 46fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * Use of this source code is governed by a BSD-style license 56fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * that can be found in the LICENSE file in the root of the source 66fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * tree. An additional intellectual property rights grant can be found 76fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * in the file PATENTS. All contributing project authors may 86fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * be found in the AUTHORS file in the root of the source tree. 96fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org */ 106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vp9/encoder/vp9_treewriter.h" 126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 13d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgstatic void tree2tok(struct vp9_token *tokens, const vp9_tree_index *tree, 14d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org int i, int v, int l) { 15d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org v += v; 16d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org ++l; 17d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 18d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org do { 19d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org const vp9_tree_index j = tree[i++]; 20d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org if (j <= 0) { 21d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org tokens[-j].value = v; 22d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org tokens[-j].len = l; 23d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org } else { 24d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org tree2tok(tokens, tree, j, v, l); 25d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org } 26d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org } while (++v & 1); 27d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org} 28d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 29d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgvoid vp9_tokens_from_tree(struct vp9_token *tokens, 30d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org const vp9_tree_index *tree) { 31d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org tree2tok(tokens, tree, 0, 0, 0); 32d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org} 33d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 34d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgstatic unsigned int convert_distribution(unsigned int i, vp9_tree tree, 35d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org unsigned int branch_ct[][2], 36d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org const unsigned int num_events[]) { 37d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org unsigned int left, right; 38d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 39d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org if (tree[i] <= 0) 40d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org left = num_events[-tree[i]]; 41d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org else 42d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org left = convert_distribution(tree[i], tree, branch_ct, num_events); 43d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 44d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org if (tree[i + 1] <= 0) 45d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org right = num_events[-tree[i + 1]]; 46d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org else 47d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org right = convert_distribution(tree[i + 1], tree, branch_ct, num_events); 48d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 49d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org branch_ct[i >> 1][0] = left; 50d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org branch_ct[i >> 1][1] = right; 51d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org return left + right; 52d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org} 53d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 54d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgvoid vp9_tree_probs_from_distribution(vp9_tree tree, 55d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org unsigned int branch_ct[/* n-1 */][2], 56d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org const unsigned int num_events[/* n */]) { 57d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org convert_distribution(0, tree, branch_ct, num_events); 58d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org} 59