/*
 *  Copyright (c) 2014 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 "av1/encoder/context_tree.h"
#include "av1/encoder/encoder.h"

static const BLOCK_SIZE square[MAX_SB_SIZE_LOG2 - 2] = {
  BLOCK_8X8,     BLOCK_16X16, BLOCK_32X32, BLOCK_64X64,
#if CONFIG_EXT_PARTITION
  BLOCK_128X128,
#endif  // CONFIG_EXT_PARTITION
};

static void alloc_mode_context(AV1_COMMON *cm, int num_4x4_blk,
#if CONFIG_EXT_PARTITION_TYPES
                               PARTITION_TYPE partition,
#endif
                               PICK_MODE_CONTEXT *ctx) {
  const int num_blk = (num_4x4_blk < 4 ? 4 : num_4x4_blk);
  const int num_pix = num_blk << 4;
  int i, k;
  ctx->num_4x4_blk = num_blk;
#if CONFIG_EXT_PARTITION_TYPES
  ctx->partition = partition;
#endif

  for (i = 0; i < MAX_MB_PLANE; ++i) {
#if CONFIG_VAR_TX
    CHECK_MEM_ERROR(cm, ctx->blk_skip[i], aom_calloc(num_blk, sizeof(uint8_t)));
#endif
    for (k = 0; k < 3; ++k) {
      CHECK_MEM_ERROR(cm, ctx->coeff[i][k],
                      aom_memalign(32, num_pix * sizeof(*ctx->coeff[i][k])));
      CHECK_MEM_ERROR(cm, ctx->qcoeff[i][k],
                      aom_memalign(32, num_pix * sizeof(*ctx->qcoeff[i][k])));
      CHECK_MEM_ERROR(cm, ctx->dqcoeff[i][k],
                      aom_memalign(32, num_pix * sizeof(*ctx->dqcoeff[i][k])));
      CHECK_MEM_ERROR(cm, ctx->eobs[i][k],
                      aom_memalign(32, num_blk * sizeof(*ctx->eobs[i][k])));
    }
  }

  if (cm->allow_screen_content_tools) {
    for (i = 0; i < 2; ++i) {
      CHECK_MEM_ERROR(
          cm, ctx->color_index_map[i],
          aom_memalign(32, num_pix * sizeof(*ctx->color_index_map[i])));
    }
  }
}

static void free_mode_context(PICK_MODE_CONTEXT *ctx) {
  int i, k;
  for (i = 0; i < MAX_MB_PLANE; ++i) {
#if CONFIG_VAR_TX
    aom_free(ctx->blk_skip[i]);
    ctx->blk_skip[i] = 0;
#endif
    for (k = 0; k < 3; ++k) {
      aom_free(ctx->coeff[i][k]);
      ctx->coeff[i][k] = 0;
      aom_free(ctx->qcoeff[i][k]);
      ctx->qcoeff[i][k] = 0;
      aom_free(ctx->dqcoeff[i][k]);
      ctx->dqcoeff[i][k] = 0;
      aom_free(ctx->eobs[i][k]);
      ctx->eobs[i][k] = 0;
    }
  }

  for (i = 0; i < 2; ++i) {
    aom_free(ctx->color_index_map[i]);
    ctx->color_index_map[i] = 0;
  }
}

static void alloc_tree_contexts(AV1_COMMON *cm, PC_TREE *tree,
                                int num_4x4_blk) {
#if CONFIG_EXT_PARTITION_TYPES
  alloc_mode_context(cm, num_4x4_blk, PARTITION_NONE, &tree->none);
  alloc_mode_context(cm, num_4x4_blk / 2, PARTITION_HORZ, &tree->horizontal[0]);
  alloc_mode_context(cm, num_4x4_blk / 2, PARTITION_VERT, &tree->vertical[0]);
  alloc_mode_context(cm, num_4x4_blk / 2, PARTITION_VERT, &tree->horizontal[1]);
  alloc_mode_context(cm, num_4x4_blk / 2, PARTITION_VERT, &tree->vertical[1]);

  alloc_mode_context(cm, num_4x4_blk / 4, PARTITION_HORZ_A,
                     &tree->horizontala[0]);
  alloc_mode_context(cm, num_4x4_blk / 4, PARTITION_HORZ_A,
                     &tree->horizontala[1]);
  alloc_mode_context(cm, num_4x4_blk / 2, PARTITION_HORZ_A,
                     &tree->horizontala[2]);
  alloc_mode_context(cm, num_4x4_blk / 2, PARTITION_HORZ_B,
                     &tree->horizontalb[0]);
  alloc_mode_context(cm, num_4x4_blk / 4, PARTITION_HORZ_B,
                     &tree->horizontalb[1]);
  alloc_mode_context(cm, num_4x4_blk / 4, PARTITION_HORZ_B,
                     &tree->horizontalb[2]);
  alloc_mode_context(cm, num_4x4_blk / 4, PARTITION_VERT_A,
                     &tree->verticala[0]);
  alloc_mode_context(cm, num_4x4_blk / 4, PARTITION_VERT_A,
                     &tree->verticala[1]);
  alloc_mode_context(cm, num_4x4_blk / 2, PARTITION_VERT_A,
                     &tree->verticala[2]);
  alloc_mode_context(cm, num_4x4_blk / 2, PARTITION_VERT_B,
                     &tree->verticalb[0]);
  alloc_mode_context(cm, num_4x4_blk / 4, PARTITION_VERT_B,
                     &tree->verticalb[1]);
  alloc_mode_context(cm, num_4x4_blk / 4, PARTITION_VERT_B,
                     &tree->verticalb[2]);
#ifdef CONFIG_SUPERTX
  alloc_mode_context(cm, num_4x4_blk, PARTITION_HORZ,
                     &tree->horizontal_supertx);
  alloc_mode_context(cm, num_4x4_blk, PARTITION_VERT, &tree->vertical_supertx);
  alloc_mode_context(cm, num_4x4_blk, PARTITION_SPLIT, &tree->split_supertx);
  alloc_mode_context(cm, num_4x4_blk, PARTITION_HORZ_A,
                     &tree->horizontala_supertx);
  alloc_mode_context(cm, num_4x4_blk, PARTITION_HORZ_B,
                     &tree->horizontalb_supertx);
  alloc_mode_context(cm, num_4x4_blk, PARTITION_VERT_A,
                     &tree->verticala_supertx);
  alloc_mode_context(cm, num_4x4_blk, PARTITION_VERT_B,
                     &tree->verticalb_supertx);
#endif  // CONFIG_SUPERTX
#else
  alloc_mode_context(cm, num_4x4_blk, &tree->none);
  alloc_mode_context(cm, num_4x4_blk / 2, &tree->horizontal[0]);
  alloc_mode_context(cm, num_4x4_blk / 2, &tree->vertical[0]);
#ifdef CONFIG_SUPERTX
  alloc_mode_context(cm, num_4x4_blk, &tree->horizontal_supertx);
  alloc_mode_context(cm, num_4x4_blk, &tree->vertical_supertx);
  alloc_mode_context(cm, num_4x4_blk, &tree->split_supertx);
#endif

  if (num_4x4_blk > 4) {
    alloc_mode_context(cm, num_4x4_blk / 2, &tree->horizontal[1]);
    alloc_mode_context(cm, num_4x4_blk / 2, &tree->vertical[1]);
  } else {
    memset(&tree->horizontal[1], 0, sizeof(tree->horizontal[1]));
    memset(&tree->vertical[1], 0, sizeof(tree->vertical[1]));
  }
#endif  // CONFIG_EXT_PARTITION_TYPES
}

static void free_tree_contexts(PC_TREE *tree) {
#if CONFIG_EXT_PARTITION_TYPES
  int i;
  for (i = 0; i < 3; i++) {
    free_mode_context(&tree->horizontala[i]);
    free_mode_context(&tree->horizontalb[i]);
    free_mode_context(&tree->verticala[i]);
    free_mode_context(&tree->verticalb[i]);
  }
#endif  // CONFIG_EXT_PARTITION_TYPES
  free_mode_context(&tree->none);
  free_mode_context(&tree->horizontal[0]);
  free_mode_context(&tree->horizontal[1]);
  free_mode_context(&tree->vertical[0]);
  free_mode_context(&tree->vertical[1]);
#ifdef CONFIG_SUPERTX
  free_mode_context(&tree->horizontal_supertx);
  free_mode_context(&tree->vertical_supertx);
  free_mode_context(&tree->split_supertx);
#if CONFIG_EXT_PARTITION_TYPES
  free_mode_context(&tree->horizontala_supertx);
  free_mode_context(&tree->horizontalb_supertx);
  free_mode_context(&tree->verticala_supertx);
  free_mode_context(&tree->verticalb_supertx);
#endif  // CONFIG_EXT_PARTITION_TYPES
#endif  // CONFIG_SUPERTX
}

// This function sets up a tree of contexts such that at each square
// partition level. There are contexts for none, horizontal, vertical, and
// split.  Along with a block_size value and a selected block_size which
// represents the state of our search.
void av1_setup_pc_tree(AV1_COMMON *cm, ThreadData *td) {
  int i, j;
#if CONFIG_EXT_PARTITION
  const int leaf_nodes = 256;
  const int tree_nodes = 256 + 64 + 16 + 4 + 1;
#else
  const int leaf_nodes = 64;
  const int tree_nodes = 64 + 16 + 4 + 1;
#endif  // CONFIG_EXT_PARTITION
  int pc_tree_index = 0;
  PC_TREE *this_pc;
  PICK_MODE_CONTEXT *this_leaf;
  int square_index = 1;
  int nodes;

  aom_free(td->leaf_tree);
  CHECK_MEM_ERROR(cm, td->leaf_tree,
                  aom_calloc(leaf_nodes, sizeof(*td->leaf_tree)));
  aom_free(td->pc_tree);
  CHECK_MEM_ERROR(cm, td->pc_tree,
                  aom_calloc(tree_nodes, sizeof(*td->pc_tree)));

  this_pc = &td->pc_tree[0];
  this_leaf = &td->leaf_tree[0];

  // 4x4 blocks smaller than 8x8 but in the same 8x8 block share the same
  // context so we only need to allocate 1 for each 8x8 block.
  for (i = 0; i < leaf_nodes; ++i) {
#if CONFIG_EXT_PARTITION_TYPES
    alloc_mode_context(cm, 1, PARTITION_NONE, &td->leaf_tree[i]);
#else
    alloc_mode_context(cm, 1, &td->leaf_tree[i]);
#endif
  }

  // Sets up all the leaf nodes in the tree.
  for (pc_tree_index = 0; pc_tree_index < leaf_nodes; ++pc_tree_index) {
    PC_TREE *const tree = &td->pc_tree[pc_tree_index];
    tree->block_size = square[0];
    alloc_tree_contexts(cm, tree, 4);
    tree->leaf_split[0] = this_leaf++;
    for (j = 1; j < 4; j++) tree->leaf_split[j] = tree->leaf_split[0];
  }

  // Each node has 4 leaf nodes, fill each block_size level of the tree
  // from leafs to the root.
  for (nodes = leaf_nodes >> 2; nodes > 0; nodes >>= 2) {
    for (i = 0; i < nodes; ++i) {
      PC_TREE *const tree = &td->pc_tree[pc_tree_index];
      alloc_tree_contexts(cm, tree, 4 << (2 * square_index));
      tree->block_size = square[square_index];
      for (j = 0; j < 4; j++) tree->split[j] = this_pc++;
      ++pc_tree_index;
    }
    ++square_index;
  }

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

void av1_free_pc_tree(ThreadData *td) {
#if CONFIG_EXT_PARTITION
  const int leaf_nodes = 256;
  const int tree_nodes = 256 + 64 + 16 + 4 + 1;
#else
  const int leaf_nodes = 64;
  const int tree_nodes = 64 + 16 + 4 + 1;
#endif  // CONFIG_EXT_PARTITION
  int i;

  // Set up all 4x4 mode contexts
  for (i = 0; i < leaf_nodes; ++i) free_mode_context(&td->leaf_tree[i]);

  // Sets up all the leaf nodes in the tree.
  for (i = 0; i < tree_nodes; ++i) free_tree_contexts(&td->pc_tree[i]);

  aom_free(td->pc_tree);
  td->pc_tree = NULL;
  aom_free(td->leaf_tree);
  td->leaf_tree = NULL;
}
