190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*
2f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
4f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Use of this source code is governed by a BSD-style license
5f71323e297a928af368937089d3ed71239786f86Andreas Huber *  that can be found in the LICENSE file in the root of the source
6f71323e297a928af368937089d3ed71239786f86Andreas Huber *  tree. An additional intellectual property rights grant can be found
7f71323e297a928af368937089d3ed71239786f86Andreas Huber *  in the file PATENTS.  All contributing project authors may
8f71323e297a928af368937089d3ed71239786f86Andreas Huber *  be found in the AUTHORS file in the root of the source tree.
990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "boolhuff.h"
1379f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/blockd.h"
1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if defined(SECTIONBITS_OUTPUT)
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberunsigned __int64 Sectionbits[500];
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef ENTROPY_STATS
2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberunsigned int active_section = 0;
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberconst unsigned int vp8_prob_cost[256] =
2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    2047, 2047, 1791, 1641, 1535, 1452, 1385, 1328, 1279, 1235, 1196, 1161, 1129, 1099, 1072, 1046,
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    1023, 1000,  979,  959,  940,  922,  905,  889,  873,  858,  843,  829,  816,  803,  790,  778,
3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    767,  755,  744,  733,  723,  713,  703,  693,  684,  675,  666,  657,  649,  641,  633,  625,
3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    617,  609,  602,  594,  587,  580,  573,  567,  560,  553,  547,  541,  534,  528,  522,  516,
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    511,  505,  499,  494,  488,  483,  477,  472,  467,  462,  457,  452,  447,  442,  437,  433,
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    428,  424,  419,  415,  410,  406,  401,  397,  393,  389,  385,  381,  377,  373,  369,  365,
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    361,  357,  353,  349,  346,  342,  338,  335,  331,  328,  324,  321,  317,  314,  311,  307,
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    304,  301,  297,  294,  291,  288,  285,  281,  278,  275,  272,  269,  266,  263,  260,  257,
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    255,  252,  249,  246,  243,  240,  238,  235,  232,  229,  227,  224,  221,  219,  216,  214,
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    211,  208,  206,  203,  201,  198,  196,  194,  191,  189,  186,  184,  181,  179,  177,  174,
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    172,  170,  168,  165,  163,  161,  159,  156,  154,  152,  150,  148,  145,  143,  141,  139,
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    137,  135,  133,  131,  129,  127,  125,  123,  121,  119,  117,  115,  113,  111,  109,  107,
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    105,  103,  101,   99,   97,   95,   93,   92,   90,   88,   86,   84,   82,   81,   79,   77,
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    75,   73,   72,   70,   68,   66,   65,   63,   61,   60,   58,   56,   55,   53,   51,   50,
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    48,   46,   45,   43,   41,   40,   38,   37,   35,   33,   32,   30,   29,   27,   25,   24,
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    22,   21,   19,   18,   16,   15,   13,   12,   10,    9,    7,    6,    4,    3,    1,   1
4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_start_encode(BOOL_CODER *br, unsigned char *source)
4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    br->lowvalue = 0;
5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    br->range    = 255;
5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    br->value    = 0;
5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    br->count    = -24;
5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    br->buffer   = source;
5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    br->pos      = 0;
5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_stop_encode(BOOL_CODER *br)
5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i;
6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = 0; i < 32; i++)
6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_encode_bool(br, 0, 128);
6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberDECLARE_ALIGNED(16, static const unsigned int, norm[256]) =
6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    0, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_encode_bool(BOOL_CODER *br, int bit, int probability)
7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int split;
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int count = br->count;
8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int range = br->range;
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int lowvalue = br->lowvalue;
8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    register unsigned int shift;
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef ENTROPY_STATS
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if defined(SECTIONBITS_OUTPUT)
8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (bit)
8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        Sectionbits[active_section] += vp8_prob_cost[255-probability];
9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        Sectionbits[active_section] += vp8_prob_cost[probability];
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    split = 1 + (((range - 1) * probability) >> 8);
9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    range = split;
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (bit)
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        lowvalue += split;
10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        range = br->range - split;
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    shift = norm[range];
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    range <<= shift;
10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    count += shift;
11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (count >= 0)
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int offset = shift - count;
11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if ((lowvalue << (offset - 1)) & 0x80000000)
11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int x = br->pos - 1;
11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            while (x >= 0 && br->buffer[x] == 0xff)
12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                br->buffer[x] = (unsigned char)0;
12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                x--;
12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            br->buffer[x] += 1;
12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        br->buffer[br->pos++] = (lowvalue >> (24 - offset));
12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        lowvalue <<= offset;
13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        shift = count;
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        lowvalue &= 0xffffff;
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        count -= 8 ;
13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    lowvalue <<= shift;
13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    br->count = count;
13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    br->lowvalue = lowvalue;
13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    br->range = range;
13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_encode_value(BOOL_CODER *br, int data, int bits)
14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int bit;
14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (bit = bits - 1; bit >= 0; bit--)
14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_encode_bool(br, (1 & (data >> bit)), 0x80);
14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
149