backward_references.h revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2012 Google Inc. All Rights Reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// that can be found in the COPYING file in the root of the source 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// tree. An additional intellectual property rights grant can be found 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// in the file PATENTS. All contributing project authors may 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// be found in the AUTHORS file in the root of the source tree. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: Jyrki Alakuijala (jyrki@google.com) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef WEBP_ENC_BACKWARD_REFERENCES_H_ 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WEBP_ENC_BACKWARD_REFERENCES_H_ 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <assert.h> 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "../webp/types.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "../webp/format_constants.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__cplusplus) || defined(c_plusplus) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern "C" { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The spec allows 11, we use 9 bits to reduce memory consumption in encoding. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Having 9 instead of 11 only removes about 0.25 % of compression density. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAX_COLOR_CACHE_BITS 9 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Max ever number of codes we'll use: 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PIX_OR_COPY_CODES_MAX \ 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (NUM_LITERAL_CODES + NUM_LENGTH_CODES + (1 << MAX_COLOR_CACHE_BITS)) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PrefixEncode() 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// use GNU builtins where available. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__GNUC__) && \ 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ >= 4) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE int BitsLog2Floor(uint32_t n) { 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(n != 0); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 31 ^ __builtin_clz(n); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <intrin.h> 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma intrinsic(_BitScanReverse) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE int BitsLog2Floor(uint32_t n) { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long first_set_bit; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(n != 0); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _BitScanReverse(&first_set_bit, n); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return first_set_bit; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns (int)floor(log2(n)). n must be > 0. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE int BitsLog2Floor(uint32_t n) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int log = 0; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t value = n; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(n != 0); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 4; i >= 0; --i) { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int shift = (1 << i); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32_t x = value >> shift; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (x != 0) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = x; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log += shift; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return log; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE int VP8LBitsLog2Ceiling(uint32_t n) { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int log_floor = BitsLog2Floor(n); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (n == (n & ~(n - 1))) // zero or a power of two. 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return log_floor; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return log_floor + 1; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Splitting of distance and length codes into prefixes and 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extra bits. The prefixes are encoded with an entropy code 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// while the extra bits are stored just as normal bits. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE void PrefixEncode(int distance, int* const code, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* const extra_bits_count, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* const extra_bits_value) { 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (distance > 2) { // Collect the two most significant bits. 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int highest_bit = BitsLog2Floor(--distance); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int second_highest_bit = (distance >> (highest_bit - 1)) & 1; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *extra_bits_count = highest_bit - 1; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *extra_bits_value = distance & ((1 << *extra_bits_count) - 1); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *code = 2 * highest_bit + second_highest_bit; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *extra_bits_count = 0; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *extra_bits_value = 0; 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *code = (distance == 2) ? 1 : 0; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PixOrCopy 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum Mode { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kLiteral, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kCacheIdx, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kCopy, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kNone 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mode as uint8_t to make the memory layout to be exactly 8 bytes. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t mode; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t len; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t argb_or_distance; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} PixOrCopy; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE PixOrCopy PixOrCopyCreateCopy(uint32_t distance, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t len) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PixOrCopy retval; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.mode = kCopy; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.argb_or_distance = distance; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.len = len; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return retval; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE PixOrCopy PixOrCopyCreateCacheIdx(int idx) { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PixOrCopy retval; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(idx >= 0); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(idx < (1 << MAX_COLOR_CACHE_BITS)); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.mode = kCacheIdx; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.argb_or_distance = idx; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.len = 1; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return retval; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE PixOrCopy PixOrCopyCreateLiteral(uint32_t argb) { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PixOrCopy retval; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.mode = kLiteral; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.argb_or_distance = argb; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.len = 1; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return retval; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE int PixOrCopyIsLiteral(const PixOrCopy* const p) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (p->mode == kLiteral); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE int PixOrCopyIsCacheIdx(const PixOrCopy* const p) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (p->mode == kCacheIdx); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE int PixOrCopyIsCopy(const PixOrCopy* const p) { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (p->mode == kCopy); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE uint32_t PixOrCopyLiteral(const PixOrCopy* const p, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int component) { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(p->mode == kLiteral); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (p->argb_or_distance >> (component * 8)) & 0xff; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE uint32_t PixOrCopyLength(const PixOrCopy* const p) { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return p->len; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE uint32_t PixOrCopyArgb(const PixOrCopy* const p) { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(p->mode == kLiteral); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return p->argb_or_distance; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE uint32_t PixOrCopyCacheIdx(const PixOrCopy* const p) { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(p->mode == kCacheIdx); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(p->argb_or_distance < (1U << MAX_COLOR_CACHE_BITS)); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return p->argb_or_distance; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE uint32_t PixOrCopyDistance(const PixOrCopy* const p) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(p->mode == kCopy); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return p->argb_or_distance; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// VP8LBackwardRefs 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PixOrCopy* refs; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size; // currently used 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_size; // maximum capacity 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} VP8LBackwardRefs; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Initialize the object. Must be called first. 'refs' can be NULL. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VP8LInitBackwardRefs(VP8LBackwardRefs* const refs); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Release memory and re-initialize the object. 'refs' can be NULL. 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VP8LClearBackwardRefs(VP8LBackwardRefs* const refs); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Allocate 'max_size' references. Returns false in case of memory error. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int VP8LBackwardRefsAlloc(VP8LBackwardRefs* const refs, int max_size); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Main entry points 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Evaluates best possible backward references for specified quality. 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Further optimize for 2D locality if use_2d_locality flag is set. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int VP8LGetBackwardReferences(int width, int height, 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32_t* const argb, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int quality, int cache_bits, int use_2d_locality, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8LBackwardRefs* const best); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Produce an estimate for a good color cache size for the image. 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int VP8LCalculateEstimateForCacheSize(const uint32_t* const argb, 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int xsize, int ysize, 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* const best_cache_bits); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__cplusplus) || defined(c_plusplus) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // WEBP_ENC_BACKWARD_REFERENCES_H_ 220