/*
 *  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 "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);
}
