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