193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org/*
293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  Copyright (c) 2014 The WebM project authors. All Rights Reserved.
393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *
493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  Use of this source code is governed by a BSD-style license
593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  that can be found in the LICENSE file in the root of the source
693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  tree. An additional intellectual property rights grant can be found
793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  in the file PATENTS.  All contributing project authors may
893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  be found in the AUTHORS file in the root of the source tree.
993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org */
1093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
1193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "vp9/encoder/vp9_cost.h"
1293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
1393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgconst unsigned int vp9_prob_cost[256] = {
1493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  2047, 2047, 1791, 1641, 1535, 1452, 1385, 1328, 1279, 1235, 1196, 1161,
1593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  1129, 1099, 1072, 1046, 1023, 1000, 979,  959,  940,  922,  905,  889,
1693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  873,  858,  843,  829,  816,  803,  790,  778,  767,  755,  744,  733,
1793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  723,  713,  703,  693,  684,  675,  666,  657,  649,  641,  633,  625,
1893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  617,  609,  602,  594,  587,  580,  573,  567,  560,  553,  547,  541,
1993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  534,  528,  522,  516,  511,  505,  499,  494,  488,  483,  477,  472,
2093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  467,  462,  457,  452,  447,  442,  437,  433,  428,  424,  419,  415,
2193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  410,  406,  401,  397,  393,  389,  385,  381,  377,  373,  369,  365,
2293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  361,  357,  353,  349,  346,  342,  338,  335,  331,  328,  324,  321,
2393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  317,  314,  311,  307,  304,  301,  297,  294,  291,  288,  285,  281,
2493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  278,  275,  272,  269,  266,  263,  260,  257,  255,  252,  249,  246,
2593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  243,  240,  238,  235,  232,  229,  227,  224,  221,  219,  216,  214,
2693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  211,  208,  206,  203,  201,  198,  196,  194,  191,  189,  186,  184,
2793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  181,  179,  177,  174,  172,  170,  168,  165,  163,  161,  159,  156,
2893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  154,  152,  150,  148,  145,  143,  141,  139,  137,  135,  133,  131,
2993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  129,  127,  125,  123,  121,  119,  117,  115,  113,  111,  109,  107,
3093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  105,  103,  101,  99,   97,   95,   93,   92,   90,   88,   86,   84,
3193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  82,   81,   79,   77,   75,   73,   72,   70,   68,   66,   65,   63,
3293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  61,   60,   58,   56,   55,   53,   51,   50,   48,   46,   45,   43,
3393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  41,   40,   38,   37,   35,   33,   32,   30,   29,   27,   25,   24,
3493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  22,   21,   19,   18,   16,   15,   13,   12,   10,   9,    7,    6,
3593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  4,    3,    1,    1};
3693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
3793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgstatic void cost(int *costs, vp9_tree tree, const vp9_prob *probs,
3893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org                 int i, int c) {
3993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  const vp9_prob prob = probs[i / 2];
4093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  int b;
4193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
4293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  for (b = 0; b <= 1; ++b) {
4393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    const int cc = c + vp9_cost_bit(prob, b);
4493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    const vp9_tree_index ii = tree[i + b];
4593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
4693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    if (ii <= 0)
4793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org      costs[-ii] = cc;
4893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    else
4993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org      cost(costs, tree, probs, ii, cc);
5093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  }
5193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}
5293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
5393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgvoid vp9_cost_tokens(int *costs, const vp9_prob *probs, vp9_tree tree) {
5493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  cost(costs, tree, probs, 0, 0);
5593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}
5693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
5793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgvoid vp9_cost_tokens_skip(int *costs, const vp9_prob *probs, vp9_tree tree) {
5893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  assert(tree[0] <= 0 && tree[1] > 0);
5993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
6093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  costs[-tree[0]] = vp9_cost_bit(probs[0], 0);
6193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  cost(costs, tree, probs, 2, 0);
6293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}
63