/*
 *  Copyright (c) 2016 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 "vp10/encoder/variance_tree.h"
#include "vp10/encoder/encoder.h"



void vp10_setup_var_tree(struct VP10Common *cm, ThreadData *td) {
  int i, j;
#if CONFIG_EXT_PARTITION
  const int leaf_nodes = 1024;
  const int tree_nodes = 1024 + 256 + 64 + 16 + 4 + 1;
#else
  const int leaf_nodes = 256;
  const int tree_nodes = 256 + 64 + 16 + 4 + 1;
#endif  // CONFIG_EXT_PARTITION
  int index = 0;
  VAR_TREE *this_var;
  int nodes;

  vpx_free(td->var_tree);
  CHECK_MEM_ERROR(cm, td->var_tree, vpx_calloc(tree_nodes,
                                              sizeof(*td->var_tree)));

  this_var = &td->var_tree[0];

  // Sets up all the leaf nodes in the tree.
  for (index = 0; index < leaf_nodes; ++index) {
    VAR_TREE *const leaf = &td->var_tree[index];
    leaf->split[0] = NULL;
  }

  // Each node has 4 leaf nodes, fill in the child pointers
  // from leafs to the root.
  for (nodes = leaf_nodes >> 2; nodes > 0; nodes >>= 2) {
    for (i = 0; i < nodes; ++i, ++index) {
      VAR_TREE *const node = &td->var_tree[index];
      for (j = 0; j < 4; j++)
        node->split[j] = this_var++;
    }
  }

  // Set up the root node for the largest superblock size
  i = MAX_MIB_SIZE_LOG2 - MIN_MIB_SIZE_LOG2;
  td->var_root[i] = &td->var_tree[tree_nodes - 1];
  // Set up the root nodes for the rest of the possible superblock sizes
  while (--i >= 0) {
    td->var_root[i] = td->var_root[i+1]->split[0];
  }
}

void vp10_free_var_tree(ThreadData *td) {
  vpx_free(td->var_tree);
  td->var_tree = NULL;
}
