shithub: libvpx

ref: a742a736550c4fc1120c06832749bced0a209e1b
dir: /vp8/encoder/boolhuff.c/

View raw version
/*
 *  Copyright (c) 2010 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 "boolhuff.h"

#if defined(SECTIONBITS_OUTPUT)
unsigned __int64 Sectionbits[500];

#endif

#ifdef ENTROPY_STATS
unsigned int active_section = 0;
#endif

const unsigned int vp8_prob_cost[256] =
{
    2047, 2047, 1791, 1641, 1535, 1452, 1385, 1328, 1279, 1235, 1196, 1161, 1129, 1099, 1072, 1046,
    1023, 1000,  979,  959,  940,  922,  905,  889,  873,  858,  843,  829,  816,  803,  790,  778,
    767,  755,  744,  733,  723,  713,  703,  693,  684,  675,  666,  657,  649,  641,  633,  625,
    617,  609,  602,  594,  587,  580,  573,  567,  560,  553,  547,  541,  534,  528,  522,  516,
    511,  505,  499,  494,  488,  483,  477,  472,  467,  462,  457,  452,  447,  442,  437,  433,
    428,  424,  419,  415,  410,  406,  401,  397,  393,  389,  385,  381,  377,  373,  369,  365,
    361,  357,  353,  349,  346,  342,  338,  335,  331,  328,  324,  321,  317,  314,  311,  307,
    304,  301,  297,  294,  291,  288,  285,  281,  278,  275,  272,  269,  266,  263,  260,  257,
    255,  252,  249,  246,  243,  240,  238,  235,  232,  229,  227,  224,  221,  219,  216,  214,
    211,  208,  206,  203,  201,  198,  196,  194,  191,  189,  186,  184,  181,  179,  177,  174,
    172,  170,  168,  165,  163,  161,  159,  156,  154,  152,  150,  148,  145,  143,  141,  139,
    137,  135,  133,  131,  129,  127,  125,  123,  121,  119,  117,  115,  113,  111,  109,  107,
    105,  103,  101,   99,   97,   95,   93,   92,   90,   88,   86,   84,   82,   81,   79,   77,
    75,   73,   72,   70,   68,   66,   65,   63,   61,   60,   58,   56,   55,   53,   51,   50,
    48,   46,   45,   43,   41,   40,   38,   37,   35,   33,   32,   30,   29,   27,   25,   24,
    22,   21,   19,   18,   16,   15,   13,   12,   10,    9,    7,    6,    4,    3,    1,   1
};

void vp8_start_encode(BOOL_CODER *br, unsigned char *source)
{

    br->lowvalue = 0;
    br->range    = 255;
    br->value    = 0;
    br->count    = -24;
    br->buffer   = source;
    br->pos      = 0;
}

void vp8_stop_encode(BOOL_CODER *br)
{
    int i;

    for (i = 0; i < 32; i++)
        vp8_encode_bool(br, 0, 128);
}


void vp8_encode_value(BOOL_CODER *br, int data, int bits)
{
    int bit;

    for (bit = bits - 1; bit >= 0; bit--)
        vp8_encode_bool(br, (1 & (data >> bit)), 0x80);

}

#if CONFIG_NEWUPDATE
int recenter_nonneg(int v, int m)
{
    if (v > (m<<1)) return v;
    else if (v >= m) return ((v-m)<<1);
    else return ((m-v)<<1)-1;
}

static int get_unsigned_bits(unsigned num_values)
{
    int cat=0;
    if ((num_values--)<=1) return 0;
    while (num_values>0)
    {
        cat++;
        num_values>>=1;
    }
    return cat;
}

void vp8_encode_uniform(BOOL_CODER *br, int v, int n)
{
    int l = get_unsigned_bits(n);
    int m;
    if (l == 0) return;
    m = (1<<l)-n;
    if (v<m)
        vp8_encode_value(br, v, l-1);
    else
    {
        vp8_encode_value(br, m+((v-m)>>1), l-1);
        vp8_encode_value(br, (v-m)&1, 1);
    }
}

int vp8_count_uniform(int v, int n)
{
    int l = get_unsigned_bits(n);
    int m;
    if (l == 0) return 0;
    m = (1<<l)-n;
    if (v<m)
        return l-1;
    else
        return l;
}

void vp8_encode_term_subexp(BOOL_CODER *br, int word, int k, int num_syms)
{
    int i = 0;
    int mk = 0;
    while (1) {
        int b = (i?k+i-1:k);
        int a = (1<<b);
        if (num_syms<=mk+3*a) {
            vp8_encode_uniform(br, word-mk, num_syms-mk);
            break;
        } else {
            int t = (word>=mk+a);
            vp8_encode_value(br, t, 1);
            if (t) {
                i=i+1;
                mk+=a;
            } else {
                vp8_encode_value(br, word-mk, b);
                break;
            }
        }
    }
}

int vp8_count_term_subexp(int word, int k, int num_syms)
{
    int count = 0;
    int i = 0;
    int mk = 0;
    while (1) {
        int b = (i?k+i-1:k);
        int a = (1<<b);
        if (num_syms<=mk+3*a) {
            count += vp8_count_uniform(word-mk, num_syms-mk);
            break;
        } else {
            int t = (word>=mk+a);
            count++;
            if (t) {
                i=i+1;
                mk+=a;
            } else {
                count += b;
                break;
            }
        }
    }
    return count;
}
#endif