/*
 *  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/common/vp9_treecoder.h"

static void tree2tok(struct vp9_token *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 *p, vp9_tree t) {
  tree2tok(p, t, 0, 0, 0);
}

void vp9_tokens_from_tree_offset(struct vp9_token *p, vp9_tree t,
                                 int offset) {
  tree2tok(p - offset, t, 0, 0, 0);
}

static unsigned int convert_distribution(unsigned int i,
                                         vp9_tree tree,
                                         vp9_prob probs[],
                                         unsigned int branch_ct[][2],
                                         const unsigned int num_events[],
                                         unsigned int tok0_offset) {
  unsigned int left, right;

  if (tree[i] <= 0) {
    left = num_events[-tree[i] - tok0_offset];
  } else {
    left = convert_distribution(tree[i], tree, probs, branch_ct,
                                num_events, tok0_offset);
  }
  if (tree[i + 1] <= 0) {
    right = num_events[-tree[i + 1] - tok0_offset];
  } else {
    right = convert_distribution(tree[i + 1], tree, probs, branch_ct,
                                num_events, tok0_offset);
  }
  probs[i>>1] = get_binary_prob(left, right);
  branch_ct[i>>1][0] = left;
  branch_ct[i>>1][1] = right;
  return left + right;
}

void vp9_tree_probs_from_distribution(
  vp9_tree tree,
  vp9_prob probs          [ /* n-1 */ ],
  unsigned int branch_ct       [ /* n-1 */ ] [2],
  const unsigned int num_events[ /* n */ ],
  unsigned int tok0_offset) {
  convert_distribution(0, tree, probs, branch_ct, num_events, tok0_offset);
}
