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