media/libvpx/vp9/common/vp9_entropy.c

Thu, 15 Jan 2015 15:59:08 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 15:59:08 +0100
branch
TOR_BUG_9701
changeset 10
ac0c01689b40
permissions
-rw-r--r--

Implement a real Private Browsing Mode condition by changing the API/ABI;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 /*
     2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
     3  *
     4  *  Use of this source code is governed by a BSD-style license
     5  *  that can be found in the LICENSE file in the root of the source
     6  *  tree. An additional intellectual property rights grant can be found
     7  *  in the file PATENTS.  All contributing project authors may
     8  *  be found in the AUTHORS file in the root of the source tree.
     9  */
    11 #include "vp9/common/vp9_entropy.h"
    12 #include "vp9/common/vp9_blockd.h"
    13 #include "vp9/common/vp9_onyxc_int.h"
    14 #include "vp9/common/vp9_entropymode.h"
    15 #include "vpx_mem/vpx_mem.h"
    16 #include "vpx/vpx_integer.h"
    18 #define MODEL_NODES (ENTROPY_NODES - UNCONSTRAINED_NODES)
    20 DECLARE_ALIGNED(16, const uint8_t, vp9_norm[256]) = {
    21   0, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
    22   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    23   2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    24   2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    25   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    26   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    27   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    28   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    29   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    30   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    31   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    32   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    33   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    34   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    35   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    36   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    37 };
    39 DECLARE_ALIGNED(16, const uint8_t,
    40                 vp9_coefband_trans_8x8plus[1024]) = {
    41   0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4,
    42   4, 4, 4, 4, 4, 5,
    43   // beyond MAXBAND_INDEX+1 all values are filled as 5
    44                     5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    45   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    46   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    47   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    48   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    49   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    50   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    51   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    52   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    53   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    54   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    55   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    56   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    57   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    58   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    59   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    60   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    61   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    62   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    63   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    64   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    65   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    66   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    67   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    68   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    69   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    70   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    71   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    72   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    73   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    74   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    75   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    76   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    77   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    78   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    79   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    80   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    81   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    82   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    83   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    84   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    85   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    86   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    87   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    88   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    89   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    90   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    91   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    92   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    93   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    94   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    95   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    96   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    97   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    98   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    99   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
   100   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
   101   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
   102   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
   103   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
   104   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
   105   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
   106   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
   107 };
   109 DECLARE_ALIGNED(16, const uint8_t,
   110                 vp9_coefband_trans_4x4[16]) = {
   111   0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5,
   112 };
   114 DECLARE_ALIGNED(16, const uint8_t, vp9_pt_energy_class[MAX_ENTROPY_TOKENS]) = {
   115   0, 1, 2, 3, 3, 4, 4, 5, 5, 5, 5, 5
   116 };
   120 /* Array indices are identical to previously-existing CONTEXT_NODE indices */
   122 const vp9_tree_index vp9_coef_tree[TREE_SIZE(MAX_ENTROPY_TOKENS)] = {
   123   -DCT_EOB_TOKEN, 2,                          /* 0 = EOB */
   124   -ZERO_TOKEN, 4,                             /* 1 = ZERO */
   125   -ONE_TOKEN, 6,                              /* 2 = ONE */
   126   8, 12,                                      /* 3 = LOW_VAL */
   127   -TWO_TOKEN, 10,                            /* 4 = TWO */
   128   -THREE_TOKEN, -FOUR_TOKEN,                /* 5 = THREE */
   129   14, 16,                                   /* 6 = HIGH_LOW */
   130   -DCT_VAL_CATEGORY1, -DCT_VAL_CATEGORY2,   /* 7 = CAT_ONE */
   131   18, 20,                                   /* 8 = CAT_THREEFOUR */
   132   -DCT_VAL_CATEGORY3, -DCT_VAL_CATEGORY4,   /* 9 = CAT_THREE */
   133   -DCT_VAL_CATEGORY5, -DCT_VAL_CATEGORY6    /* 10 = CAT_FIVE */
   134 };
   136 struct vp9_token vp9_coef_encodings[MAX_ENTROPY_TOKENS];
   138 /* Trees for extra bits.  Probabilities are constant and
   139    do not depend on previously encoded bits */
   141 static const vp9_prob Pcat1[] = { 159};
   142 static const vp9_prob Pcat2[] = { 165, 145};
   143 static const vp9_prob Pcat3[] = { 173, 148, 140};
   144 static const vp9_prob Pcat4[] = { 176, 155, 140, 135};
   145 static const vp9_prob Pcat5[] = { 180, 157, 141, 134, 130};
   146 static const vp9_prob Pcat6[] = {
   147   254, 254, 254, 252, 249, 243, 230, 196, 177, 153, 140, 133, 130, 129
   148 };
   150 const vp9_tree_index vp9_coefmodel_tree[6] = {
   151   -DCT_EOB_MODEL_TOKEN, 2,                      /* 0 = EOB */
   152   -ZERO_TOKEN, 4,                               /* 1 = ZERO */
   153   -ONE_TOKEN, -TWO_TOKEN,
   154 };
   156 // Model obtained from a 2-sided zero-centerd distribuition derived
   157 // from a Pareto distribution. The cdf of the distribution is:
   158 // cdf(x) = 0.5 + 0.5 * sgn(x) * [1 - {alpha/(alpha + |x|)} ^ beta]
   159 //
   160 // For a given beta and a given probablity of the 1-node, the alpha
   161 // is first solved, and then the {alpha, beta} pair is used to generate
   162 // the probabilities for the rest of the nodes.
   164 // beta = 8
   165 static const vp9_prob modelcoefprobs_pareto8[COEFPROB_MODELS][MODEL_NODES] = {
   166   {  3,  86, 128,   6,  86,  23,  88,  29},
   167   {  9,  86, 129,  17,  88,  61,  94,  76},
   168   { 15,  87, 129,  28,  89,  93, 100, 110},
   169   { 20,  88, 130,  38,  91, 118, 106, 136},
   170   { 26,  89, 131,  48,  92, 139, 111, 156},
   171   { 31,  90, 131,  58,  94, 156, 117, 171},
   172   { 37,  90, 132,  66,  95, 171, 122, 184},
   173   { 42,  91, 132,  75,  97, 183, 127, 194},
   174   { 47,  92, 133,  83,  98, 193, 132, 202},
   175   { 52,  93, 133,  90, 100, 201, 137, 208},
   176   { 57,  94, 134,  98, 101, 208, 142, 214},
   177   { 62,  94, 135, 105, 103, 214, 146, 218},
   178   { 66,  95, 135, 111, 104, 219, 151, 222},
   179   { 71,  96, 136, 117, 106, 224, 155, 225},
   180   { 76,  97, 136, 123, 107, 227, 159, 228},
   181   { 80,  98, 137, 129, 109, 231, 162, 231},
   182   { 84,  98, 138, 134, 110, 234, 166, 233},
   183   { 89,  99, 138, 140, 112, 236, 170, 235},
   184   { 93, 100, 139, 145, 113, 238, 173, 236},
   185   { 97, 101, 140, 149, 115, 240, 176, 238},
   186   {101, 102, 140, 154, 116, 242, 179, 239},
   187   {105, 103, 141, 158, 118, 243, 182, 240},
   188   {109, 104, 141, 162, 119, 244, 185, 241},
   189   {113, 104, 142, 166, 120, 245, 187, 242},
   190   {116, 105, 143, 170, 122, 246, 190, 243},
   191   {120, 106, 143, 173, 123, 247, 192, 244},
   192   {123, 107, 144, 177, 125, 248, 195, 244},
   193   {127, 108, 145, 180, 126, 249, 197, 245},
   194   {130, 109, 145, 183, 128, 249, 199, 245},
   195   {134, 110, 146, 186, 129, 250, 201, 246},
   196   {137, 111, 147, 189, 131, 251, 203, 246},
   197   {140, 112, 147, 192, 132, 251, 205, 247},
   198   {143, 113, 148, 194, 133, 251, 207, 247},
   199   {146, 114, 149, 197, 135, 252, 208, 248},
   200   {149, 115, 149, 199, 136, 252, 210, 248},
   201   {152, 115, 150, 201, 138, 252, 211, 248},
   202   {155, 116, 151, 204, 139, 253, 213, 249},
   203   {158, 117, 151, 206, 140, 253, 214, 249},
   204   {161, 118, 152, 208, 142, 253, 216, 249},
   205   {163, 119, 153, 210, 143, 253, 217, 249},
   206   {166, 120, 153, 212, 144, 254, 218, 250},
   207   {168, 121, 154, 213, 146, 254, 220, 250},
   208   {171, 122, 155, 215, 147, 254, 221, 250},
   209   {173, 123, 155, 217, 148, 254, 222, 250},
   210   {176, 124, 156, 218, 150, 254, 223, 250},
   211   {178, 125, 157, 220, 151, 254, 224, 251},
   212   {180, 126, 157, 221, 152, 254, 225, 251},
   213   {183, 127, 158, 222, 153, 254, 226, 251},
   214   {185, 128, 159, 224, 155, 255, 227, 251},
   215   {187, 129, 160, 225, 156, 255, 228, 251},
   216   {189, 131, 160, 226, 157, 255, 228, 251},
   217   {191, 132, 161, 227, 159, 255, 229, 251},
   218   {193, 133, 162, 228, 160, 255, 230, 252},
   219   {195, 134, 163, 230, 161, 255, 231, 252},
   220   {197, 135, 163, 231, 162, 255, 231, 252},
   221   {199, 136, 164, 232, 163, 255, 232, 252},
   222   {201, 137, 165, 233, 165, 255, 233, 252},
   223   {202, 138, 166, 233, 166, 255, 233, 252},
   224   {204, 139, 166, 234, 167, 255, 234, 252},
   225   {206, 140, 167, 235, 168, 255, 235, 252},
   226   {207, 141, 168, 236, 169, 255, 235, 252},
   227   {209, 142, 169, 237, 171, 255, 236, 252},
   228   {210, 144, 169, 237, 172, 255, 236, 252},
   229   {212, 145, 170, 238, 173, 255, 237, 252},
   230   {214, 146, 171, 239, 174, 255, 237, 253},
   231   {215, 147, 172, 240, 175, 255, 238, 253},
   232   {216, 148, 173, 240, 176, 255, 238, 253},
   233   {218, 149, 173, 241, 177, 255, 239, 253},
   234   {219, 150, 174, 241, 179, 255, 239, 253},
   235   {220, 152, 175, 242, 180, 255, 240, 253},
   236   {222, 153, 176, 242, 181, 255, 240, 253},
   237   {223, 154, 177, 243, 182, 255, 240, 253},
   238   {224, 155, 178, 244, 183, 255, 241, 253},
   239   {225, 156, 178, 244, 184, 255, 241, 253},
   240   {226, 158, 179, 244, 185, 255, 242, 253},
   241   {228, 159, 180, 245, 186, 255, 242, 253},
   242   {229, 160, 181, 245, 187, 255, 242, 253},
   243   {230, 161, 182, 246, 188, 255, 243, 253},
   244   {231, 163, 183, 246, 189, 255, 243, 253},
   245   {232, 164, 184, 247, 190, 255, 243, 253},
   246   {233, 165, 185, 247, 191, 255, 244, 253},
   247   {234, 166, 185, 247, 192, 255, 244, 253},
   248   {235, 168, 186, 248, 193, 255, 244, 253},
   249   {236, 169, 187, 248, 194, 255, 244, 253},
   250   {236, 170, 188, 248, 195, 255, 245, 253},
   251   {237, 171, 189, 249, 196, 255, 245, 254},
   252   {238, 173, 190, 249, 197, 255, 245, 254},
   253   {239, 174, 191, 249, 198, 255, 245, 254},
   254   {240, 175, 192, 249, 199, 255, 246, 254},
   255   {240, 177, 193, 250, 200, 255, 246, 254},
   256   {241, 178, 194, 250, 201, 255, 246, 254},
   257   {242, 179, 195, 250, 202, 255, 246, 254},
   258   {242, 181, 196, 250, 203, 255, 247, 254},
   259   {243, 182, 197, 251, 204, 255, 247, 254},
   260   {244, 184, 198, 251, 205, 255, 247, 254},
   261   {244, 185, 199, 251, 206, 255, 247, 254},
   262   {245, 186, 200, 251, 207, 255, 247, 254},
   263   {246, 188, 201, 252, 207, 255, 248, 254},
   264   {246, 189, 202, 252, 208, 255, 248, 254},
   265   {247, 191, 203, 252, 209, 255, 248, 254},
   266   {247, 192, 204, 252, 210, 255, 248, 254},
   267   {248, 194, 205, 252, 211, 255, 248, 254},
   268   {248, 195, 206, 252, 212, 255, 249, 254},
   269   {249, 197, 207, 253, 213, 255, 249, 254},
   270   {249, 198, 208, 253, 214, 255, 249, 254},
   271   {250, 200, 210, 253, 215, 255, 249, 254},
   272   {250, 201, 211, 253, 215, 255, 249, 254},
   273   {250, 203, 212, 253, 216, 255, 249, 254},
   274   {251, 204, 213, 253, 217, 255, 250, 254},
   275   {251, 206, 214, 254, 218, 255, 250, 254},
   276   {252, 207, 216, 254, 219, 255, 250, 254},
   277   {252, 209, 217, 254, 220, 255, 250, 254},
   278   {252, 211, 218, 254, 221, 255, 250, 254},
   279   {253, 213, 219, 254, 222, 255, 250, 254},
   280   {253, 214, 221, 254, 223, 255, 250, 254},
   281   {253, 216, 222, 254, 224, 255, 251, 254},
   282   {253, 218, 224, 254, 225, 255, 251, 254},
   283   {254, 220, 225, 254, 225, 255, 251, 254},
   284   {254, 222, 227, 255, 226, 255, 251, 254},
   285   {254, 224, 228, 255, 227, 255, 251, 254},
   286   {254, 226, 230, 255, 228, 255, 251, 254},
   287   {255, 228, 231, 255, 230, 255, 251, 254},
   288   {255, 230, 233, 255, 231, 255, 252, 254},
   289   {255, 232, 235, 255, 232, 255, 252, 254},
   290   {255, 235, 237, 255, 233, 255, 252, 254},
   291   {255, 238, 240, 255, 235, 255, 252, 255},
   292   {255, 241, 243, 255, 236, 255, 252, 254},
   293   {255, 246, 247, 255, 239, 255, 253, 255}
   294 };
   296 static void extend_model_to_full_distribution(vp9_prob p,
   297                                               vp9_prob *tree_probs) {
   298   const int l = (p - 1) / 2;
   299   const vp9_prob (*model)[MODEL_NODES] = modelcoefprobs_pareto8;
   300   if (p & 1) {
   301     vpx_memcpy(tree_probs + UNCONSTRAINED_NODES,
   302                model[l], MODEL_NODES * sizeof(vp9_prob));
   303   } else {
   304     // interpolate
   305     int i;
   306     for (i = UNCONSTRAINED_NODES; i < ENTROPY_NODES; ++i)
   307       tree_probs[i] = (model[l][i - UNCONSTRAINED_NODES] +
   308                        model[l + 1][i - UNCONSTRAINED_NODES]) >> 1;
   309   }
   310 }
   312 void vp9_model_to_full_probs(const vp9_prob *model, vp9_prob *full) {
   313   if (full != model)
   314     vpx_memcpy(full, model, sizeof(vp9_prob) * UNCONSTRAINED_NODES);
   315   extend_model_to_full_distribution(model[PIVOT_NODE], full);
   316 }
   318 static vp9_tree_index cat1[2], cat2[4], cat3[6], cat4[8], cat5[10], cat6[28];
   320 static void init_bit_tree(vp9_tree_index *p, int n) {
   321   int i = 0;
   323   while (++i < n) {
   324     p[0] = p[1] = i << 1;
   325     p += 2;
   326   }
   328   p[0] = p[1] = 0;
   329 }
   331 static void init_bit_trees() {
   332   init_bit_tree(cat1, 1);
   333   init_bit_tree(cat2, 2);
   334   init_bit_tree(cat3, 3);
   335   init_bit_tree(cat4, 4);
   336   init_bit_tree(cat5, 5);
   337   init_bit_tree(cat6, 14);
   338 }
   340 const vp9_extra_bit vp9_extra_bits[MAX_ENTROPY_TOKENS] = {
   341   { 0, 0, 0, 0},
   342   { 0, 0, 0, 1},
   343   { 0, 0, 0, 2},
   344   { 0, 0, 0, 3},
   345   { 0, 0, 0, 4},
   346   { cat1, Pcat1, 1, 5},
   347   { cat2, Pcat2, 2, 7},
   348   { cat3, Pcat3, 3, 11},
   349   { cat4, Pcat4, 4, 19},
   350   { cat5, Pcat5, 5, 35},
   351   { cat6, Pcat6, 14, 67},
   352   { 0, 0, 0, 0}
   353 };
   355 #include "vp9/common/vp9_default_coef_probs.h"
   357 void vp9_default_coef_probs(VP9_COMMON *cm) {
   358   vp9_copy(cm->fc.coef_probs[TX_4X4], default_coef_probs_4x4);
   359   vp9_copy(cm->fc.coef_probs[TX_8X8], default_coef_probs_8x8);
   360   vp9_copy(cm->fc.coef_probs[TX_16X16], default_coef_probs_16x16);
   361   vp9_copy(cm->fc.coef_probs[TX_32X32], default_coef_probs_32x32);
   362 }
   364 void vp9_coef_tree_initialize() {
   365   init_bit_trees();
   366   vp9_tokens_from_tree(vp9_coef_encodings, vp9_coef_tree);
   367 }
   369 // #define COEF_COUNT_TESTING
   371 #define COEF_COUNT_SAT 24
   372 #define COEF_MAX_UPDATE_FACTOR 112
   373 #define COEF_COUNT_SAT_KEY 24
   374 #define COEF_MAX_UPDATE_FACTOR_KEY 112
   375 #define COEF_COUNT_SAT_AFTER_KEY 24
   376 #define COEF_MAX_UPDATE_FACTOR_AFTER_KEY 128
   378 static void adapt_coef_probs(VP9_COMMON *cm, TX_SIZE tx_size,
   379                              unsigned int count_sat,
   380                              unsigned int update_factor) {
   381   const FRAME_CONTEXT *pre_fc = &cm->frame_contexts[cm->frame_context_idx];
   383   vp9_coeff_probs_model *dst_coef_probs = cm->fc.coef_probs[tx_size];
   384   const vp9_coeff_probs_model *pre_coef_probs = pre_fc->coef_probs[tx_size];
   385   vp9_coeff_count_model *coef_counts = cm->counts.coef[tx_size];
   386   unsigned int (*eob_branch_count)[REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS] =
   387       cm->counts.eob_branch[tx_size];
   388   int i, j, k, l, m;
   389   unsigned int branch_ct[UNCONSTRAINED_NODES][2];
   391   for (i = 0; i < BLOCK_TYPES; ++i)
   392     for (j = 0; j < REF_TYPES; ++j)
   393       for (k = 0; k < COEF_BANDS; ++k)
   394         for (l = 0; l < PREV_COEF_CONTEXTS; ++l) {
   395           if (l >= 3 && k == 0)
   396             continue;
   397           vp9_tree_probs_from_distribution(vp9_coefmodel_tree, branch_ct,
   398                                            coef_counts[i][j][k][l]);
   399           branch_ct[0][1] = eob_branch_count[i][j][k][l] - branch_ct[0][0];
   400           for (m = 0; m < UNCONSTRAINED_NODES; ++m)
   401             dst_coef_probs[i][j][k][l][m] = merge_probs(
   402                                                 pre_coef_probs[i][j][k][l][m],
   403                                                 branch_ct[m],
   404                                                 count_sat, update_factor);
   405         }
   406 }
   408 void vp9_adapt_coef_probs(VP9_COMMON *cm) {
   409   TX_SIZE t;
   410   unsigned int count_sat, update_factor;
   412   if (frame_is_intra_only(cm)) {
   413     update_factor = COEF_MAX_UPDATE_FACTOR_KEY;
   414     count_sat = COEF_COUNT_SAT_KEY;
   415   } else if (cm->last_frame_type == KEY_FRAME) {
   416     update_factor = COEF_MAX_UPDATE_FACTOR_AFTER_KEY;  /* adapt quickly */
   417     count_sat = COEF_COUNT_SAT_AFTER_KEY;
   418   } else {
   419     update_factor = COEF_MAX_UPDATE_FACTOR;
   420     count_sat = COEF_COUNT_SAT;
   421   }
   422   for (t = TX_4X4; t <= TX_32X32; t++)
   423     adapt_coef_probs(cm, t, count_sat, update_factor);
   424 }

mercurial