1a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Copyright 2011 Google Inc. All Rights Reserved.
27c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//
30406ce1417f76f2034833414dcecc9f56253640cVikas Arora// Use of this source code is governed by a BSD-style license
40406ce1417f76f2034833414dcecc9f56253640cVikas Arora// that can be found in the COPYING file in the root of the source
50406ce1417f76f2034833414dcecc9f56253640cVikas Arora// tree. An additional intellectual property rights grant can be found
60406ce1417f76f2034833414dcecc9f56253640cVikas Arora// in the file PATENTS. All contributing project authors may
70406ce1417f76f2034833414dcecc9f56253640cVikas Arora// be found in the AUTHORS file in the root of the source tree.
87c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// -----------------------------------------------------------------------------
97c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//
107c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//   WebP encoder: internal header.
117c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//
127c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Author: Skal (pascal.massimino@gmail.com)
137c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
147c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#ifndef WEBP_ENC_VP8ENCI_H_
157c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define WEBP_ENC_VP8ENCI_H_
167c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
17a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#include <string.h>     // for memcpy()
181e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora#include "webp/encode.h"
19a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#include "../dsp/dsp.h"
20a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#include "../utils/bit_writer.h"
211e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora#include "../utils/thread.h"
227c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
238b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora#ifdef __cplusplus
247c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraextern "C" {
257c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#endif
267c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
27a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------
287c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Various defines and enums
297c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
307c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// version numbers
317c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define ENC_MAJ_VERSION 0
328b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora#define ENC_MIN_VERSION 4
33af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#define ENC_REV_VERSION 1
34466727975bcc57c0c5597bcd0747a2fe4777b303Vikas Arora
357c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// intra prediction modes
367c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraenum { B_DC_PRED = 0,   // 4x4 modes
377c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora       B_TM_PRED = 1,
387c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora       B_VE_PRED = 2,
397c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora       B_HE_PRED = 3,
407c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora       B_RD_PRED = 4,
417c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora       B_VR_PRED = 5,
427c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora       B_LD_PRED = 6,
437c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora       B_VL_PRED = 7,
447c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora       B_HD_PRED = 8,
457c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora       B_HU_PRED = 9,
467c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora       NUM_BMODES = B_HU_PRED + 1 - B_DC_PRED,  // = 10
477c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
487c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora       // Luma16 or UV modes
497c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora       DC_PRED = B_DC_PRED, V_PRED = B_VE_PRED,
501e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora       H_PRED = B_HE_PRED, TM_PRED = B_TM_PRED,
511e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora       NUM_PRED_MODES = 4
527c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora     };
537c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
547c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraenum { NUM_MB_SEGMENTS = 4,
557c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora       MAX_NUM_PARTITIONS = 8,
567c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora       NUM_TYPES = 4,   // 0: i16-AC,  1: i16-DC,  2:chroma-AC,  3:i4-AC
577c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora       NUM_BANDS = 8,
587c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora       NUM_CTX = 3,
597c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora       NUM_PROBAS = 11,
600406ce1417f76f2034833414dcecc9f56253640cVikas Arora       MAX_LF_LEVELS = 64,       // Maximum loop filter level
610406ce1417f76f2034833414dcecc9f56253640cVikas Arora       MAX_VARIABLE_LEVEL = 67,  // last (inclusive) level with variable cost
620406ce1417f76f2034833414dcecc9f56253640cVikas Arora       MAX_LEVEL = 2047          // max level (note: max codable is 2047 + 67)
637c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora     };
647c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
651e7bf8805bd030c19924a5306837ecd72c295751Vikas Aroratypedef enum {   // Rate-distortion optimization levels
661e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  RD_OPT_NONE        = 0,  // no rd-opt
671e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  RD_OPT_BASIC       = 1,  // basic scoring (no trellis)
681e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  RD_OPT_TRELLIS     = 2,  // perform trellis-quant on the final decision only
691e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  RD_OPT_TRELLIS_ALL = 3   // trellis-quant for every scoring (much slower)
701e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora} VP8RDLevel;
711e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora
727c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// YUV-cache parameters. Cache is 16-pixels wide.
737c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// The original or reconstructed samples can be accessed using VP8Scan[]
747c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// The predicted blocks can be accessed using offsets to yuv_p_ and
757c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// the arrays VP8*ModeOffsets[];
767c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         +----+      YUV Samples area. See VP8Scan[] for accessing the blocks.
778b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora//  Y_OFF  |YYYY| <- original samples  ('yuv_in_')
787c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |YYYY|
797c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |YYYY|
807c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |YYYY|
817c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//  U_OFF  |UUVV| V_OFF  (=U_OFF + 8)
827c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |UUVV|
837c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         +----+
847c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//  Y_OFF  |YYYY| <- compressed/decoded samples  ('yuv_out_')
857c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |YYYY|    There are two buffers like this ('yuv_out_'/'yuv_out2_')
867c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |YYYY|
877c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |YYYY|
887c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//  U_OFF  |UUVV| V_OFF
897c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |UUVV|
907c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//          x2 (for yuv_out2_)
917c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         +----+     Prediction area ('yuv_p_', size = PRED_SIZE)
927c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// I16DC16 |YYYY|  Intra16 predictions (16x16 block each)
937c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |YYYY|
947c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |YYYY|
957c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |YYYY|
967c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// I16TM16 |YYYY|
977c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |YYYY|
987c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |YYYY|
997c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |YYYY|
1007c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// I16VE16 |YYYY|
1017c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |YYYY|
1027c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |YYYY|
1037c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |YYYY|
1047c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// I16HE16 |YYYY|
1057c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |YYYY|
1067c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |YYYY|
1077c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |YYYY|
1087c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         +----+  Chroma U/V predictions (16x8 block each)
1097c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// C8DC8   |UUVV|
1107c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |UUVV|
1117c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// C8TM8   |UUVV|
1127c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |UUVV|
1137c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// C8VE8   |UUVV|
1147c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |UUVV|
1157c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// C8HE8   |UUVV|
1167c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |UUVV|
1177c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         +----+  Intra 4x4 predictions (4x4 block each)
1187c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |YYYY| I4DC4 I4TM4 I4VE4 I4HE4
1197c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |YYYY| I4RD4 I4VR4 I4LD4 I4VL4
1207c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         |YY..| I4HD4 I4HU4 I4TMP
1217c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora//         +----+
1227c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define BPS       16   // this is the common stride
1237c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define Y_SIZE   (BPS * 16)
1247c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define UV_SIZE  (BPS * 8)
1257c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define YUV_SIZE (Y_SIZE + UV_SIZE)
1267c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define PRED_SIZE (6 * 16 * BPS + 12 * BPS)
1277c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define Y_OFF    (0)
1287c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define U_OFF    (Y_SIZE)
1297c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define V_OFF    (U_OFF + 8)
1307c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define ALIGN_CST 15
1317c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define DO_ALIGN(PTR) ((uintptr_t)((PTR) + ALIGN_CST) & ~ALIGN_CST)
1327c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
133af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroraextern const int VP8Scan[16];           // in quant.c
134af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroraextern const int VP8UVModeOffsets[4];   // in analyze.c
1357c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraextern const int VP8I16ModeOffsets[4];
1367c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraextern const int VP8I4ModeOffsets[NUM_BMODES];
1377c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
1387c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Layout of prediction blocks
1397c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// intra 16x16
1407c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define I16DC16 (0 * 16 * BPS)
1417c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define I16TM16 (1 * 16 * BPS)
1427c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define I16VE16 (2 * 16 * BPS)
1437c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define I16HE16 (3 * 16 * BPS)
1447c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// chroma 8x8, two U/V blocks side by side (hence: 16x8 each)
1457c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define C8DC8 (4 * 16 * BPS)
1467c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define C8TM8 (4 * 16 * BPS + 8 * BPS)
1477c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define C8VE8 (5 * 16 * BPS)
1487c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define C8HE8 (5 * 16 * BPS + 8 * BPS)
1497c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// intra 4x4
1507c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define I4DC4 (6 * 16 * BPS +  0)
1517c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define I4TM4 (6 * 16 * BPS +  4)
1527c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define I4VE4 (6 * 16 * BPS +  8)
1537c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define I4HE4 (6 * 16 * BPS + 12)
1547c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define I4RD4 (6 * 16 * BPS + 4 * BPS +  0)
1557c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define I4VR4 (6 * 16 * BPS + 4 * BPS +  4)
1567c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define I4LD4 (6 * 16 * BPS + 4 * BPS +  8)
1577c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define I4VL4 (6 * 16 * BPS + 4 * BPS + 12)
1587c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define I4HD4 (6 * 16 * BPS + 8 * BPS +  0)
1597c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define I4HU4 (6 * 16 * BPS + 8 * BPS +  4)
1607c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define I4TMP (6 * 16 * BPS + 8 * BPS +  8)
1617c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
1627c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroratypedef int64_t score_t;     // type used for scores, rate, distortion
163af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Note that MAX_COST is not the maximum allowed by sizeof(score_t),
164af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// in order to allow overflowing computations.
1657c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define MAX_COST ((score_t)0x7fffffffffffffLL)
1667c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
1677c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define QFIX 17
1687c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#define BIAS(b)  ((b) << (QFIX - 8))
1697c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Fun fact: this is the _only_ line where we're actually being lossy and
1707c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// discarding bits.
171af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arorastatic WEBP_INLINE int QUANTDIV(uint32_t n, uint32_t iQ, uint32_t B) {
172af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora  return (int)((n * iQ + B) >> QFIX);
1737c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora}
1741e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora
1751e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora// size of histogram used by CollectHistogram.
1761e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora#define MAX_COEFF_THRESH   31
1771e7bf8805bd030c19924a5306837ecd72c295751Vikas Aroratypedef struct VP8Histogram VP8Histogram;
1781e7bf8805bd030c19924a5306837ecd72c295751Vikas Arorastruct VP8Histogram {
1791e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  // TODO(skal): we only need to store the max_value and last_non_zero actually.
1801e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  int distribution[MAX_COEFF_THRESH + 1];
1811e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora};
1821e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora
1831e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora// Uncomment the following to remove token-buffer code:
1841e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora// #define DISABLE_TOKEN_BUFFER
1857c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
186a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------
1877c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Headers
1887c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
189a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef uint32_t proba_t;   // 16b + 16b
1907c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroratypedef uint8_t ProbaArray[NUM_CTX][NUM_PROBAS];
191a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef proba_t StatsArray[NUM_CTX][NUM_PROBAS];
1927c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroratypedef uint16_t CostArray[NUM_CTX][MAX_VARIABLE_LEVEL + 1];
1937c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroratypedef double LFStats[NUM_MB_SEGMENTS][MAX_LF_LEVELS];  // filter stats
1947c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
1957c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroratypedef struct VP8Encoder VP8Encoder;
1967c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
1977c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// segment features
1987c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroratypedef struct {
1997c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int num_segments_;      // Actual number of segments. 1 segment only = unused.
2007c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int update_map_;        // whether to update the segment map or not.
2017c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora                          // must be 0 if there's only 1 segment.
2027c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int size_;              // bit-cost for transmitting the segment map
2037c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora} VP8SegmentHeader;
2047c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
2057c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Struct collecting all frame-persistent probabilities.
2067c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroratypedef struct {
2077c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  uint8_t segments_[3];     // probabilities for segment tree
2087c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  uint8_t skip_proba_;      // final probability of being skipped.
209af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora  ProbaArray coeffs_[NUM_TYPES][NUM_BANDS];      // 1056 bytes
210a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  StatsArray stats_[NUM_TYPES][NUM_BANDS];       // 4224 bytes
211af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora  CostArray level_cost_[NUM_TYPES][NUM_BANDS];   // 13056 bytes
212a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  int dirty_;               // if true, need to call VP8CalculateLevelCosts()
2137c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int use_skip_proba_;      // Note: we always use skip_proba for now.
21488fe2b83c4b9232cd08729556fd0485d6a6a92cdVikas Arora  int nb_skip_;             // number of skipped blocks
2157c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora} VP8Proba;
2167c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
2177c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Filter parameters. Not actually used in the code (we don't perform
2187c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// the in-loop filtering), but filled from user's config
2197c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroratypedef struct {
2207c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int simple_;             // filtering type: 0=complex, 1=simple
2217c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int level_;              // base filter level [0..63]
2227c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int sharpness_;          // [0..7]
2237c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int i4x4_lf_delta_;      // delta filter level for i4x4 relative to i16x16
2247c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora} VP8FilterHeader;
2257c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
226a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------
2277c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Informations about the macroblocks.
2287c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
2297c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroratypedef struct {
2307c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  // block type
231a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  unsigned int type_:2;     // 0=i4x4, 1=i16x16
232a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  unsigned int uv_mode_:2;
233a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  unsigned int skip_:1;
234a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  unsigned int segment_:2;
2357c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  uint8_t alpha_;      // quantization-susceptibility
2367c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora} VP8MBInfo;
2377c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
238a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef struct VP8Matrix {
2397c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  uint16_t q_[16];        // quantizer steps
2407c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  uint16_t iq_[16];       // reciprocals, fixed point.
241af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora  uint32_t bias_[16];     // rounding bias
242af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora  uint32_t zthresh_[16];  // value below which a coefficient is zeroed
2437c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  uint16_t sharpen_[16];  // frequency boosters for slight sharpening
2447c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora} VP8Matrix;
2457c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
2467c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroratypedef struct {
2477c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  VP8Matrix y1_, y2_, uv_;  // quantization matrices
2487c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int alpha_;      // quant-susceptibility, range [-127,127]. Zero is neutral.
2497c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora                   // Lower values indicate a lower risk of blurriness.
2507c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int beta_;       // filter-susceptibility, range [0,255].
2517c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int quant_;      // final segment quantizer.
2527c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int fstrength_;  // final in-loop filtering strength
2538b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora  int max_edge_;   // max edge delta (for filtering strength)
2548b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora  int min_disto_;  // minimum distortion required to trigger filtering record
2557c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  // reactivities
2567c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int lambda_i16_, lambda_i4_, lambda_uv_;
2577c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int lambda_mode_, lambda_trellis_, tlambda_;
2587c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int lambda_trellis_i16_, lambda_trellis_i4_, lambda_trellis_uv_;
2597c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora} VP8SegmentInfo;
2607c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
2618b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// Handy transient struct to accumulate score and info during RD-optimization
2627c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// and mode evaluation.
2637c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroratypedef struct {
2648b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora  score_t D, SD;              // Distortion, spectral distortion
2658b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora  score_t H, R, score;        // header bits, rate, score.
2667c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int16_t y_dc_levels[16];    // Quantized levels for luma-DC, luma-AC, chroma.
2677c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int16_t y_ac_levels[16][16];
2687c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int16_t uv_levels[4 + 4][16];
2697c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int mode_i16;               // mode number for intra16 prediction
270a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  uint8_t modes_i4[16];       // mode numbers for intra4 predictions
2717c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int mode_uv;                // mode number of chroma prediction
2727c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  uint32_t nz;                // non-zero blocks
2737c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora} VP8ModeScore;
2747c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
2757c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Iterator structure to iterate through macroblocks, pointing to the
2767c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// right neighbouring data (samples, predictions, contexts, ...)
2777c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroratypedef struct {
2787c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int x_, y_;                      // current macroblock
2797c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int y_stride_, uv_stride_;       // respective strides
2808b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora  uint8_t*      yuv_in_;           // input samples
2818b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora  uint8_t*      yuv_out_;          // output samples
2828b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora  uint8_t*      yuv_out2_;         // secondary buffer swapped with yuv_out_.
2838b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora  uint8_t*      yuv_p_;            // scratch buffer for prediction
2847c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  VP8Encoder*   enc_;              // back-pointer
2857c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  VP8MBInfo*    mb_;               // current macroblock
2867c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  VP8BitWriter* bw_;               // current bit-writer
2877c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  uint8_t*      preds_;            // intra mode predictors (4x4 blocks)
2887c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  uint32_t*     nz_;               // non-zero pattern
2897c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  uint8_t       i4_boundary_[37];  // 32+5 boundary samples needed by intra4x4
290466727975bcc57c0c5597bcd0747a2fe4777b303Vikas Arora  uint8_t*      i4_top_;           // pointer to the current top boundary sample
2917c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int           i4_;               // current intra4x4 mode being tested
2927c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int           top_nz_[9];        // top-non-zero context.
2937c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int           left_nz_[9];       // left-non-zero. left_nz[8] is independent.
2947c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  uint64_t      bit_count_[4][3];  // bit counters for coded levels.
2957c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  uint64_t      luma_bits_;        // macroblock bit-cost for luma
2967c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  uint64_t      uv_bits_;          // macroblock bit-cost for chroma
2977c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  LFStats*      lf_stats_;         // filter stats (borrowed from enc_)
2987c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int           do_trellis_;       // if true, perform extra level optimisation
2998b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora  int           count_down_;       // number of mb still to be processed
3008b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora  int           count_down0_;      // starting counter value (for progress)
301a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  int           percent0_;         // saved initial progress percent
3028b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora
3038b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora  uint8_t* y_left_;    // left luma samples (addressable from index -1 to 15).
3048b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora  uint8_t* u_left_;    // left u samples (addressable from index -1 to 7)
3058b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora  uint8_t* v_left_;    // left v samples (addressable from index -1 to 7)
3068b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora
3078b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora  uint8_t* y_top_;     // top luma samples at position 'x_'
3088b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora  uint8_t* uv_top_;    // top u/v samples at position 'x_', packed as 16 bytes
3098b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora
3108b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora  // memory for storing y/u/v_left_ and yuv_in_/out_*
3118b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora  uint8_t yuv_left_mem_[17 + 16 + 16 + 8 + ALIGN_CST];     // memory for *_left_
3128b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora  uint8_t yuv_mem_[3 * YUV_SIZE + PRED_SIZE + ALIGN_CST];  // memory for yuv_*
3137c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora} VP8EncIterator;
3147c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
3157c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  // in iterator.c
3168b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// must be called first
3177c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroravoid VP8IteratorInit(VP8Encoder* const enc, VP8EncIterator* const it);
3188b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// restart a scan
3197c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroravoid VP8IteratorReset(VP8EncIterator* const it);
3208b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// reset iterator position to row 'y'
3218b720228d581a84fd173b6dcb2fa295b59db489aVikas Aroravoid VP8IteratorSetRow(VP8EncIterator* const it, int y);
3228b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// set count down (=number of iterations to go)
3238b720228d581a84fd173b6dcb2fa295b59db489aVikas Aroravoid VP8IteratorSetCountDown(VP8EncIterator* const it, int count_down);
3248b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// return true if iteration is finished
3258b720228d581a84fd173b6dcb2fa295b59db489aVikas Aroraint VP8IteratorIsDone(const VP8EncIterator* const it);
3268b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// Import uncompressed samples from source.
3278b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// If tmp_32 is not NULL, import boundary samples too.
3288b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// tmp_32 is a 32-bytes scratch buffer that must be aligned in memory.
3298b720228d581a84fd173b6dcb2fa295b59db489aVikas Aroravoid VP8IteratorImport(VP8EncIterator* const it, uint8_t* tmp_32);
3307c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// export decimated samples
3317c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroravoid VP8IteratorExport(const VP8EncIterator* const it);
3328b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// go to next macroblock. Returns false if not finished.
3338b720228d581a84fd173b6dcb2fa295b59db489aVikas Aroraint VP8IteratorNext(VP8EncIterator* const it);
3348b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// save the yuv_out_ boundary values to top_/left_ arrays for next iterations.
3358b720228d581a84fd173b6dcb2fa295b59db489aVikas Aroravoid VP8IteratorSaveBoundary(VP8EncIterator* const it);
336a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Report progression based on macroblock rows. Return 0 for user-abort request.
337a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraint VP8IteratorProgress(const VP8EncIterator* const it,
338a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora                        int final_delta_percent);
3397c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Intra4x4 iterations
3407c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroravoid VP8IteratorStartI4(VP8EncIterator* const it);
3417c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// returns true if not done.
3427c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraint VP8IteratorRotateI4(VP8EncIterator* const it,
3437c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora                        const uint8_t* const yuv_out);
3447c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
3457c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Non-zero context setup/teardown
3467c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroravoid VP8IteratorNzToBytes(VP8EncIterator* const it);
3477c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroravoid VP8IteratorBytesToNz(VP8EncIterator* const it);
3487c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
3497c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Helper functions to set mode properties
3507c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroravoid VP8SetIntra16Mode(const VP8EncIterator* const it, int mode);
351a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroravoid VP8SetIntra4Mode(const VP8EncIterator* const it, const uint8_t* modes);
3527c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroravoid VP8SetIntraUVMode(const VP8EncIterator* const it, int mode);
3537c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroravoid VP8SetSkip(const VP8EncIterator* const it, int skip);
3547c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroravoid VP8SetSegment(const VP8EncIterator* const it, int segment);
3557c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
356a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------
357a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Paginated token buffer
358a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
3591e7bf8805bd030c19924a5306837ecd72c295751Vikas Aroratypedef struct VP8Tokens VP8Tokens;  // struct details in token.c
360a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
361a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef struct {
3621e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora#if !defined(DISABLE_TOKEN_BUFFER)
3631e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  VP8Tokens* pages_;        // first page
3641e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  VP8Tokens** last_page_;   // last page
3651e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  uint16_t* tokens_;        // set to (*last_page_)->tokens_
366af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora  int left_;                // how many free tokens left before the page is full
367af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora  int page_size_;           // number of tokens per page
3681e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora#endif
3691e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  int error_;         // true in case of malloc error
370a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora} VP8TBuffer;
371a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
372af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// initialize an empty buffer
373af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroravoid VP8TBufferInit(VP8TBuffer* const b, int page_size);
3741e7bf8805bd030c19924a5306837ecd72c295751Vikas Aroravoid VP8TBufferClear(VP8TBuffer* const b);   // de-allocate pages memory
375a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
3761e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora#if !defined(DISABLE_TOKEN_BUFFER)
3771e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora
3781e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora// Finalizes bitstream when probabilities are known.
3791e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora// Deletes the allocated token memory if final_pass is true.
3801e7bf8805bd030c19924a5306837ecd72c295751Vikas Aroraint VP8EmitTokens(VP8TBuffer* const b, VP8BitWriter* const bw,
3811e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora                  const uint8_t* const probas, int final_pass);
3821e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora
3831e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora// record the coding of coefficients without knowing the probabilities yet
3841e7bf8805bd030c19924a5306837ecd72c295751Vikas Aroraint VP8RecordCoeffTokens(int ctx, int coeff_type, int first, int last,
3851e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora                         const int16_t* const coeffs,
3861e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora                         VP8TBuffer* const tokens);
3871e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora
3888b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// Estimate the final coded size given a set of 'probas'.
3898b720228d581a84fd173b6dcb2fa295b59db489aVikas Arorasize_t VP8EstimateTokenSize(VP8TBuffer* const b, const uint8_t* const probas);
3908b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora
3911e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora// unused for now
3921e7bf8805bd030c19924a5306837ecd72c295751Vikas Aroravoid VP8TokenToStats(const VP8TBuffer* const b, proba_t* const stats);
3931e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora
3941e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora#endif  // !DISABLE_TOKEN_BUFFER
395a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
396a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------
3977c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// VP8Encoder
3987c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
3997c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arorastruct VP8Encoder {
4007c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  const WebPConfig* config_;    // user configuration and parameters
4017c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  WebPPicture* pic_;            // input / output picture
4027c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
4037c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  // headers
4047c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  VP8FilterHeader   filter_hdr_;     // filtering information
4057c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  VP8SegmentHeader  segment_hdr_;    // segment information
4067c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
4077c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int profile_;                      // VP8's profile, deduced from Config.
4087c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
4097c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  // dimension, in macroblock units.
4107c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int mb_w_, mb_h_;
4117c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int preds_w_;   // stride of the *preds_ prediction plane (=4*mb_w + 1)
4127c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
4137c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  // number of partitions (1, 2, 4 or 8 = MAX_NUM_PARTITIONS)
4147c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int num_parts_;
4157c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
4167c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  // per-partition boolean decoders.
4177c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  VP8BitWriter bw_;                         // part0
4187c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  VP8BitWriter parts_[MAX_NUM_PARTITIONS];  // token partitions
4191e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  VP8TBuffer tokens_;                       // token buffer
4207c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
421a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  int percent_;                             // for progress
422a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
423466727975bcc57c0c5597bcd0747a2fe4777b303Vikas Arora  // transparency blob
424466727975bcc57c0c5597bcd0747a2fe4777b303Vikas Arora  int has_alpha_;
425466727975bcc57c0c5597bcd0747a2fe4777b303Vikas Arora  uint8_t* alpha_data_;       // non-NULL if transparency is present
426a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  uint32_t alpha_data_size_;
4271e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  WebPWorker alpha_worker_;
428466727975bcc57c0c5597bcd0747a2fe4777b303Vikas Arora
4297c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  // quantization info (one set of DC/AC dequant factor per segment)
4307c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  VP8SegmentInfo dqm_[NUM_MB_SEGMENTS];
4317c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int base_quant_;                 // nominal quantizer value. Only used
4327c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora                                   // for relative coding of segments' quant.
4331e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  int alpha_;                      // global susceptibility (<=> complexity)
4347c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int uv_alpha_;                   // U/V quantization susceptibility
4357c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  // global offset of quantizers, shared by all segments
4367c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int dq_y1_dc_;
4377c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int dq_y2_dc_, dq_y2_ac_;
4387c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int dq_uv_dc_, dq_uv_ac_;
4397c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
4407c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  // probabilities and statistics
4417c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  VP8Proba proba_;
442a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  uint64_t sse_[4];        // sum of Y/U/V/A squared errors for all macroblocks
4437c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  uint64_t sse_count_;     // pixel count for the sse_[] stats
4447c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int      coded_size_;
4457c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int      residual_bytes_[3][4];
4467c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  int      block_count_[3];
4477c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
4487c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  // quality/speed settings
4491e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  int method_;               // 0=fastest, 6=best/slowest.
4501e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  VP8RDLevel rd_opt_level_;  // Deduced from method_.
4511e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  int max_i4_header_bits_;   // partition #0 safeness factor
4521e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  int thread_level_;         // derived from config->thread_level
4531e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  int do_search_;            // derived from config->target_XXX
4541e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  int use_tokens_;           // if true, use token buffer
4557c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
4567c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  // Memory
4577c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  VP8MBInfo* mb_info_;   // contextual macroblock infos (mb_w_ + 1)
4587c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  uint8_t*   preds_;     // predictions modes: (4*mb_w+1) * (4*mb_h+1)
4597c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  uint32_t*  nz_;        // non-zero bit context: mb_w+1
4607c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  uint8_t   *y_top_;     // top luma samples.
4617c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  uint8_t   *uv_top_;    // top u/v samples.
4628b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora                         // U and V are packed into 16 bytes (8 U + 8 V)
4637c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  LFStats   *lf_stats_;  // autofilter stats (if NULL, autofilter is off)
4647c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora};
4657c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
466a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------
4677c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// internal functions. Not public.
4687c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
4697c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  // in tree.c
4707c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraextern const uint8_t VP8CoeffsProba0[NUM_TYPES][NUM_BANDS][NUM_CTX][NUM_PROBAS];
4717c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraextern const uint8_t
4727c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora    VP8CoeffsUpdateProba[NUM_TYPES][NUM_BANDS][NUM_CTX][NUM_PROBAS];
4737c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Reset the token probabilities to their initial (default) values
4747c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroravoid VP8DefaultProbas(VP8Encoder* const enc);
4757c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Write the token probabilities
4767c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroravoid VP8WriteProbas(VP8BitWriter* const bw, const VP8Proba* const probas);
4777c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Writes the partition #0 modes (that is: all intra modes)
4787c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroravoid VP8CodeIntraModes(VP8Encoder* const enc);
4797c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
4807c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  // in syntax.c
4817c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Generates the final bitstream by coding the partition0 and headers,
4827c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// and appending an assembly of all the pre-coded token partitions.
4837c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Return true if everything is ok.
4847c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraint VP8EncWrite(VP8Encoder* const enc);
485a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Release memory allocated for bit-writing in VP8EncLoop & seq.
486a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroravoid VP8EncFreeBitWriters(VP8Encoder* const enc);
4877c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
4887c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  // in frame.c
4897c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraextern const uint8_t VP8EncBands[16 + 1];
4901e7bf8805bd030c19924a5306837ecd72c295751Vikas Aroraextern const uint8_t VP8Cat3[];
4911e7bf8805bd030c19924a5306837ecd72c295751Vikas Aroraextern const uint8_t VP8Cat4[];
4921e7bf8805bd030c19924a5306837ecd72c295751Vikas Aroraextern const uint8_t VP8Cat5[];
4931e7bf8805bd030c19924a5306837ecd72c295751Vikas Aroraextern const uint8_t VP8Cat6[];
4941e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora
4957c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Form all the four Intra16x16 predictions in the yuv_p_ cache
4967c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroravoid VP8MakeLuma16Preds(const VP8EncIterator* const it);
4977c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Form all the four Chroma8x8 predictions in the yuv_p_ cache
4987c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroravoid VP8MakeChroma8Preds(const VP8EncIterator* const it);
4997c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Form all the ten Intra4x4 predictions in the yuv_p_ cache
5007c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// for the 4x4 block it->i4_
5017c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroravoid VP8MakeIntra4Preds(const VP8EncIterator* const it);
5027c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Rate calculation
5037c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraint VP8GetCostLuma16(VP8EncIterator* const it, const VP8ModeScore* const rd);
5047c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraint VP8GetCostLuma4(VP8EncIterator* const it, const int16_t levels[16]);
5057c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraint VP8GetCostUV(VP8EncIterator* const it, const VP8ModeScore* const rd);
5061e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora// Main coding calls
5077c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraint VP8EncLoop(VP8Encoder* const enc);
5081e7bf8805bd030c19924a5306837ecd72c295751Vikas Aroraint VP8EncTokenLoop(VP8Encoder* const enc);
5097c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
510466727975bcc57c0c5597bcd0747a2fe4777b303Vikas Arora  // in webpenc.c
511466727975bcc57c0c5597bcd0747a2fe4777b303Vikas Arora// Assign an error code to a picture. Return false for convenience.
512a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraint WebPEncodingSetError(const WebPPicture* const pic, WebPEncodingError error);
513a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraint WebPReportProgress(const WebPPicture* const pic,
514a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora                       int percent, int* const percent_store);
515a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
5167c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  // in analysis.c
5177c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Main analysis loop. Decides the segmentations and complexity.
5187c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Assigns a first guess for Intra16 and uvmode_ prediction modes.
5197c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroraint VP8EncAnalyze(VP8Encoder* const enc);
5207c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
5217c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  // in quant.c
5227c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Sets up segment's quantization values, base_quant_ and filter strengths.
5237c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Aroravoid VP8SetSegmentParams(VP8Encoder* const enc, float quality);
5247c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora// Pick best modes and fills the levels. Returns true if skipped.
5251e7bf8805bd030c19924a5306837ecd72c295751Vikas Aroraint VP8Decimate(VP8EncIterator* const it, VP8ModeScore* const rd,
5261e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora                VP8RDLevel rd_opt);
5277c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
528466727975bcc57c0c5597bcd0747a2fe4777b303Vikas Arora  // in alpha.c
529a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroravoid VP8EncInitAlpha(VP8Encoder* const enc);    // initialize alpha compression
5301e7bf8805bd030c19924a5306837ecd72c295751Vikas Aroraint VP8EncStartAlpha(VP8Encoder* const enc);    // start alpha coding process
531a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraint VP8EncFinishAlpha(VP8Encoder* const enc);   // finalize compressed data
5321e7bf8805bd030c19924a5306837ecd72c295751Vikas Aroraint VP8EncDeleteAlpha(VP8Encoder* const enc);   // delete compressed data
533466727975bcc57c0c5597bcd0747a2fe4777b303Vikas Arora
5347c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora  // in filter.c
5357c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
536a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// SSIM utils
537a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef struct {
538a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  double w, xm, ym, xxm, xym, yym;
539a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora} DistoStats;
540a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroravoid VP8SSIMAddStats(const DistoStats* const src, DistoStats* const dst);
541a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroravoid VP8SSIMAccumulatePlane(const uint8_t* src1, int stride1,
542a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora                            const uint8_t* src2, int stride2,
543a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora                            int W, int H, DistoStats* const stats);
544a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroradouble VP8SSIMGet(const DistoStats* const stats);
545a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroradouble VP8SSIMGetSquaredError(const DistoStats* const stats);
546a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
547a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// autofilter
548a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroravoid VP8InitFilter(VP8EncIterator* const it);
549a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroravoid VP8StoreFilterStats(VP8EncIterator* const it);
550a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroravoid VP8AdjustFilterStrength(VP8EncIterator* const it);
551a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
5528b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// returns the approximate filtering strength needed to smooth a edge
5538b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// step of 'delta', given a sharpness parameter 'sharpness'.
5548b720228d581a84fd173b6dcb2fa295b59db489aVikas Aroraint VP8FilterStrengthFromDelta(int sharpness, int delta);
5558b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora
556af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora  // misc utils for picture_*.c:
557af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora
558af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Remove reference to the ARGB/YUVA buffer (doesn't free anything).
559af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroravoid WebPPictureResetBuffers(WebPPicture* const picture);
560af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora
561af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Allocates ARGB buffer of given dimension (previous one is always free'd).
562af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Preserves the YUV(A) buffer. Returns false in case of error (invalid param,
563af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// out-of-memory).
564af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroraint WebPPictureAllocARGB(WebPPicture* const picture, int width, int height);
565af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora
566af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Allocates YUVA buffer of given dimension (previous one is always free'd).
567af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Uses picture->csp to determine whether an alpha buffer is needed.
568af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Preserves the ARGB buffer.
569af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Returns false in case of error (invalid param, out-of-memory).
570af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroraint WebPPictureAllocYUVA(WebPPicture* const picture, int width, int height);
571af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora
572a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------
5737c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
574af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#if WEBP_ENCODER_ABI_VERSION <= 0x0202
575af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroravoid WebPMemoryWriterClear(WebPMemoryWriter* writer);
576af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#endif
577af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora
5788b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora#ifdef __cplusplus
5797c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora}    // extern "C"
5807c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora#endif
5817c970a0a679089e416c5887cf7fcece15a70bfa4Vikas Arora
582a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif  /* WEBP_ENC_VP8ENCI_H_ */
583