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) 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef __cplusplus 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)// PixOrCopy 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum Mode { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kLiteral, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kCacheIdx, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kCopy, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kNone 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mode as uint8_t to make the memory layout to be exactly 8 bytes. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t mode; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t len; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t argb_or_distance; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} PixOrCopy; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE PixOrCopy PixOrCopyCreateCopy(uint32_t distance, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t len) { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PixOrCopy retval; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.mode = kCopy; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.argb_or_distance = distance; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.len = len; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return retval; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE PixOrCopy PixOrCopyCreateCacheIdx(int idx) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PixOrCopy retval; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(idx >= 0); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(idx < (1 << MAX_COLOR_CACHE_BITS)); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.mode = kCacheIdx; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.argb_or_distance = idx; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.len = 1; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return retval; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE PixOrCopy PixOrCopyCreateLiteral(uint32_t argb) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PixOrCopy retval; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.mode = kLiteral; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.argb_or_distance = argb; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.len = 1; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return retval; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE int PixOrCopyIsLiteral(const PixOrCopy* const p) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (p->mode == kLiteral); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE int PixOrCopyIsCacheIdx(const PixOrCopy* const p) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (p->mode == kCacheIdx); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE int PixOrCopyIsCopy(const PixOrCopy* const p) { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (p->mode == kCopy); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE uint32_t PixOrCopyLiteral(const PixOrCopy* const p, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int component) { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(p->mode == kLiteral); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (p->argb_or_distance >> (component * 8)) & 0xff; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE uint32_t PixOrCopyLength(const PixOrCopy* const p) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return p->len; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE uint32_t PixOrCopyArgb(const PixOrCopy* const p) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(p->mode == kLiteral); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return p->argb_or_distance; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE uint32_t PixOrCopyCacheIdx(const PixOrCopy* const p) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(p->mode == kCacheIdx); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(p->argb_or_distance < (1U << MAX_COLOR_CACHE_BITS)); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return p->argb_or_distance; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE uint32_t PixOrCopyDistance(const PixOrCopy* const p) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(p->mode == kCopy); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return p->argb_or_distance; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// VP8LHashChain 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define HASH_BITS 18 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define HASH_SIZE (1 << HASH_BITS) 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)typedef struct VP8LHashChain VP8LHashChain; 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)struct VP8LHashChain { 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Stores the most recently added position with the given hash value. 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int32_t hash_to_first_index_[HASH_SIZE]; 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // chain_[pos] stores the previous position with the same hash value 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // for every pixel in the image. 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int32_t* chain_; 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // This is the maximum size of the hash_chain that can be constructed. 1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Typically this is the pixel count (width x height) for a given image. 1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int size_; 1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Must be called first, to set size. 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)int VP8LHashChainInit(VP8LHashChain* const p, int size); 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void VP8LHashChainClear(VP8LHashChain* const p); // release memory 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// ----------------------------------------------------------------------------- 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// VP8LBackwardRefs (block-based backward-references storage) 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// maximum number of reference blocks the image will be segmented into 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define MAX_REFS_BLOCK_PER_IMAGE 16 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)typedef struct PixOrCopyBlock PixOrCopyBlock; // forward declaration 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)typedef struct VP8LBackwardRefs VP8LBackwardRefs; 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Container for blocks chain 1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)struct VP8LBackwardRefs { 1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int block_size_; // common block-size 1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int error_; // set to true if some memory error occurred 1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PixOrCopyBlock* refs_; // list of currently used blocks 1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PixOrCopyBlock** tail_; // for list recycling 1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PixOrCopyBlock* free_blocks_; // free-list 1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PixOrCopyBlock* last_block_; // used for adding new refs (internal) 1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Initialize the object. 'block_size' is the common block size to store 1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// references (typically, width * height / MAX_REFS_BLOCK_PER_IMAGE). 1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void VP8LBackwardRefsInit(VP8LBackwardRefs* const refs, int block_size); 1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Release memory for backward references. 1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void VP8LBackwardRefsClear(VP8LBackwardRefs* const refs); 1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copies the 'src' backward refs to the 'dst'. Returns 0 in case of error. 1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)int VP8LBackwardRefsCopy(const VP8LBackwardRefs* const src, 1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) VP8LBackwardRefs* const dst); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Cursor for iterating on references content 1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)typedef struct { 1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // public: 1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PixOrCopy* cur_pos; // current position 1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // private: 1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PixOrCopyBlock* cur_block_; // current block in the refs list 1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const PixOrCopy* last_pos_; // sentinel for switching to next block 1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} VP8LRefsCursor; 1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Returns a cursor positioned at the beginning of the references list. 1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)VP8LRefsCursor VP8LRefsCursorInit(const VP8LBackwardRefs* const refs); 1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Returns true if cursor is pointing at a valid position. 1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static WEBP_INLINE int VP8LRefsCursorOk(const VP8LRefsCursor* const c) { 1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return (c->cur_pos != NULL); 1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Move to next block of references. Internal, not to be called directly. 1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void VP8LRefsCursorNextBlock(VP8LRefsCursor* const c); 1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Move to next position, or NULL. Should not be called if !VP8LRefsCursorOk(). 1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static WEBP_INLINE void VP8LRefsCursorNext(VP8LRefsCursor* const c) { 1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assert(c != NULL); 1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assert(VP8LRefsCursorOk(c)); 1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (++c->cur_pos == c->last_pos_) VP8LRefsCursorNextBlock(c); 1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Main entry points 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Evaluates best possible backward references for specified quality. 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Further optimize for 2D locality if use_2d_locality flag is set. 1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// The return value is the pointer to the best of the two backward refs viz, 1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// refs[0] or refs[1]. 1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)VP8LBackwardRefs* VP8LGetBackwardReferences( 1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int width, int height, const uint32_t* const argb, int quality, 1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int cache_bits, int use_2d_locality, VP8LHashChain* const hash_chain, 1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) VP8LBackwardRefs refs[2]); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Produce an estimate for a good color cache size for the image. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int VP8LCalculateEstimateForCacheSize(const uint32_t* const argb, 2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int xsize, int ysize, int quality, 2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) VP8LHashChain* const hash_chain, 2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) VP8LBackwardRefs* const ref, 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* const best_cache_bits); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef __cplusplus 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // WEBP_ENC_BACKWARD_REFERENCES_H_ 213