17c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Copyright 2011 Google Inc.
27c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//
37c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// This code is licensed under the same terms as WebM:
47c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//  Software License Agreement:  http://www.webmproject.org/license/software/
57c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//  Additional IP Rights Grant:  http://www.webmproject.org/license/additional/
67c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// -----------------------------------------------------------------------------
77c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//
87c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Cost tables for level and modes.
97c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//
107c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Author: Skal (pascal.massimino@gmail.com)
117c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
127c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#ifndef WEBP_ENC_COST_H_
137c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define WEBP_ENC_COST_H_
147c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
157c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#include "vp8enci.h"
167c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
177c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#if defined(__cplusplus) || defined(c_plusplus)
187c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraextern "C" {
197c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#endif
207c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
217c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraextern const uint16_t VP8LevelFixedCosts[2048];   // approximate cost per level
227c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraextern const uint16_t VP8EntropyCost[256];        // 8bit fixed-point log(p)
237c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
247c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Cost of coding one event with probability 'proba'.
257c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arorastatic inline int VP8BitCost(int bit, uint8_t proba) {
267c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  return !bit ? VP8EntropyCost[proba] : VP8EntropyCost[255 - proba];
277c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora}
287c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
297c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Cost of coding 'nb' 1's and 'total-nb' 0's using 'proba' probability.
30466727975bcc57c0c5597bcd0747a2fe4777b303Vikas Arorastatic inline uint64_t VP8BranchCost(uint64_t nb, uint64_t total,
31466727975bcc57c0c5597bcd0747a2fe4777b303Vikas Arora                                     uint8_t proba) {
327c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  return nb * VP8BitCost(1, proba) + (total - nb) * VP8BitCost(0, proba);
337c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora}
347c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
357c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Level cost calculations
36466727975bcc57c0c5597bcd0747a2fe4777b303Vikas Aroraextern const uint16_t VP8LevelCodes[MAX_VARIABLE_LEVEL][2];
377c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroravoid VP8CalculateLevelCosts(VP8Proba* const proba);
387c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arorastatic inline int VP8LevelCost(const uint16_t* const table, int level) {
397c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  return VP8LevelFixedCosts[level]
407c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora       + table[level > MAX_VARIABLE_LEVEL ? MAX_VARIABLE_LEVEL : level];
417c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora}
427c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
437c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Mode costs
447c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraextern const uint16_t VP8FixedCostsUV[4];
457c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraextern const uint16_t VP8FixedCostsI16[4];
467c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraextern const uint16_t VP8FixedCostsI4[NUM_BMODES][NUM_BMODES][NUM_BMODES];
477c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
487c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//-----------------------------------------------------------------------------
497c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
507c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#if defined(__cplusplus) || defined(c_plusplus)
517c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora}    // extern "C"
527c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#endif
537c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
547c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#endif  // WEBP_ENC_COST_H_
55