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