1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Copyright 2011 Google Inc. All Rights Reserved. 2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Use of this source code is governed by a BSD-style license 4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// that can be found in the COPYING file in the root of the source 5793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// tree. An additional intellectual property rights grant can be found 6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// in the file PATENTS. All contributing project authors may 7793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// be found in the AUTHORS file in the root of the source tree. 8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// ----------------------------------------------------------------------------- 9793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// WebP encoder: internal header. 11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 12793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Author: Skal (pascal.massimino@gmail.com) 13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 14793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef WEBP_ENC_VP8ENCI_H_ 15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define WEBP_ENC_VP8ENCI_H_ 16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <string.h> // for memcpy() 18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "../webp/encode.h" 19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "../dsp/dsp.h" 20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "../utils/bit_writer.h" 21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "../utils/thread.h" 22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if defined(__cplusplus) || defined(c_plusplus) 24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerextern "C" { 25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 27793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//------------------------------------------------------------------------------ 28793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Various defines and enums 29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// version numbers 31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define ENC_MAJ_VERSION 0 32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define ENC_MIN_VERSION 3 33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define ENC_REV_VERSION 1 34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// intra prediction modes 36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerenum { B_DC_PRED = 0, // 4x4 modes 37793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler B_TM_PRED = 1, 38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler B_VE_PRED = 2, 39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler B_HE_PRED = 3, 40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler B_RD_PRED = 4, 41793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler B_VR_PRED = 5, 42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler B_LD_PRED = 6, 43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler B_VL_PRED = 7, 44793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler B_HD_PRED = 8, 45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler B_HU_PRED = 9, 46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler NUM_BMODES = B_HU_PRED + 1 - B_DC_PRED, // = 10 47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Luma16 or UV modes 49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler DC_PRED = B_DC_PRED, V_PRED = B_VE_PRED, 50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler H_PRED = B_HE_PRED, TM_PRED = B_TM_PRED, 51793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler NUM_PRED_MODES = 4 52793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler }; 53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerenum { NUM_MB_SEGMENTS = 4, 55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MAX_NUM_PARTITIONS = 8, 56793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler NUM_TYPES = 4, // 0: i16-AC, 1: i16-DC, 2:chroma-AC, 3:i4-AC 57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler NUM_BANDS = 8, 58793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler NUM_CTX = 3, 59793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler NUM_PROBAS = 11, 60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MAX_LF_LEVELS = 64, // Maximum loop filter level 61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MAX_VARIABLE_LEVEL = 67, // last (inclusive) level with variable cost 62793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MAX_LEVEL = 2047 // max level (note: max codable is 2047 + 67) 63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler }; 64793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 65793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef enum { // Rate-distortion optimization levels 66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RD_OPT_NONE = 0, // no rd-opt 67793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RD_OPT_BASIC = 1, // basic scoring (no trellis) 68793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RD_OPT_TRELLIS = 2, // perform trellis-quant on the final decision only 69793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler RD_OPT_TRELLIS_ALL = 3 // trellis-quant for every scoring (much slower) 70793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} VP8RDLevel; 71793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 72793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// YUV-cache parameters. Cache is 16-pixels wide. 73793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// The original or reconstructed samples can be accessed using VP8Scan[] 74793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// The predicted blocks can be accessed using offsets to yuv_p_ and 75793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// the arrays VP8*ModeOffsets[]; 76793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// +----+ YUV Samples area. See VP8Scan[] for accessing the blocks. 77793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Y_OFF |YYYY| <- original samples (enc->yuv_in_) 78793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |YYYY| 79793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |YYYY| 80793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |YYYY| 81793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// U_OFF |UUVV| V_OFF (=U_OFF + 8) 82793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |UUVV| 83793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// +----+ 84793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Y_OFF |YYYY| <- compressed/decoded samples ('yuv_out_') 85793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |YYYY| There are two buffers like this ('yuv_out_'/'yuv_out2_') 86793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |YYYY| 87793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |YYYY| 88793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// U_OFF |UUVV| V_OFF 89793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |UUVV| 90793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// x2 (for yuv_out2_) 91793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// +----+ Prediction area ('yuv_p_', size = PRED_SIZE) 92793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// I16DC16 |YYYY| Intra16 predictions (16x16 block each) 93793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |YYYY| 94793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |YYYY| 95793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |YYYY| 96793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// I16TM16 |YYYY| 97793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |YYYY| 98793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |YYYY| 99793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |YYYY| 100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// I16VE16 |YYYY| 101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |YYYY| 102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |YYYY| 103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |YYYY| 104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// I16HE16 |YYYY| 105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |YYYY| 106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |YYYY| 107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |YYYY| 108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// +----+ Chroma U/V predictions (16x8 block each) 109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// C8DC8 |UUVV| 110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |UUVV| 111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// C8TM8 |UUVV| 112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |UUVV| 113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// C8VE8 |UUVV| 114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |UUVV| 115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// C8HE8 |UUVV| 116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |UUVV| 117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// +----+ Intra 4x4 predictions (4x4 block each) 118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |YYYY| I4DC4 I4TM4 I4VE4 I4HE4 119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |YYYY| I4RD4 I4VR4 I4LD4 I4VL4 120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// |YY..| I4HD4 I4HU4 I4TMP 121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// +----+ 122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define BPS 16 // this is the common stride 123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define Y_SIZE (BPS * 16) 124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define UV_SIZE (BPS * 8) 125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define YUV_SIZE (Y_SIZE + UV_SIZE) 126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define PRED_SIZE (6 * 16 * BPS + 12 * BPS) 127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define Y_OFF (0) 128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define U_OFF (Y_SIZE) 129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define V_OFF (U_OFF + 8) 130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define ALIGN_CST 15 131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define DO_ALIGN(PTR) ((uintptr_t)((PTR) + ALIGN_CST) & ~ALIGN_CST) 132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerextern const int VP8Scan[16 + 4 + 4]; // in quant.c 134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerextern const int VP8UVModeOffsets[4]; // in analyze.c 135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerextern const int VP8I16ModeOffsets[4]; 136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerextern const int VP8I4ModeOffsets[NUM_BMODES]; 137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Layout of prediction blocks 139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// intra 16x16 140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define I16DC16 (0 * 16 * BPS) 141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define I16TM16 (1 * 16 * BPS) 142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define I16VE16 (2 * 16 * BPS) 143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define I16HE16 (3 * 16 * BPS) 144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// chroma 8x8, two U/V blocks side by side (hence: 16x8 each) 145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define C8DC8 (4 * 16 * BPS) 146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define C8TM8 (4 * 16 * BPS + 8 * BPS) 147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define C8VE8 (5 * 16 * BPS) 148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define C8HE8 (5 * 16 * BPS + 8 * BPS) 149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// intra 4x4 150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define I4DC4 (6 * 16 * BPS + 0) 151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define I4TM4 (6 * 16 * BPS + 4) 152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define I4VE4 (6 * 16 * BPS + 8) 153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define I4HE4 (6 * 16 * BPS + 12) 154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define I4RD4 (6 * 16 * BPS + 4 * BPS + 0) 155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define I4VR4 (6 * 16 * BPS + 4 * BPS + 4) 156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define I4LD4 (6 * 16 * BPS + 4 * BPS + 8) 157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define I4VL4 (6 * 16 * BPS + 4 * BPS + 12) 158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define I4HD4 (6 * 16 * BPS + 8 * BPS + 0) 159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define I4HU4 (6 * 16 * BPS + 8 * BPS + 4) 160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define I4TMP (6 * 16 * BPS + 8 * BPS + 8) 161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef int64_t score_t; // type used for scores, rate, distortion 163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define MAX_COST ((score_t)0x7fffffffffffffLL) 164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define QFIX 17 166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define BIAS(b) ((b) << (QFIX - 8)) 167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Fun fact: this is the _only_ line where we're actually being lossy and 168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// discarding bits. 169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic WEBP_INLINE int QUANTDIV(int n, int iQ, int B) { 170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return (n * iQ + B) >> QFIX; 171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// size of histogram used by CollectHistogram. 174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define MAX_COEFF_THRESH 31 175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef struct VP8Histogram VP8Histogram; 176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstruct VP8Histogram { 177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // TODO(skal): we only need to store the max_value and last_non_zero actually. 178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int distribution[MAX_COEFF_THRESH + 1]; 179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}; 180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Uncomment the following to remove token-buffer code: 182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// #define DISABLE_TOKEN_BUFFER 183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//------------------------------------------------------------------------------ 185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Headers 186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef uint32_t proba_t; // 16b + 16b 188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef uint8_t ProbaArray[NUM_CTX][NUM_PROBAS]; 189793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef proba_t StatsArray[NUM_CTX][NUM_PROBAS]; 190793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef uint16_t CostArray[NUM_CTX][MAX_VARIABLE_LEVEL + 1]; 191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef double LFStats[NUM_MB_SEGMENTS][MAX_LF_LEVELS]; // filter stats 192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef struct VP8Encoder VP8Encoder; 194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// segment features 196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef struct { 197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int num_segments_; // Actual number of segments. 1 segment only = unused. 198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int update_map_; // whether to update the segment map or not. 199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // must be 0 if there's only 1 segment. 200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int size_; // bit-cost for transmitting the segment map 201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} VP8SegmentHeader; 202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Struct collecting all frame-persistent probabilities. 204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef struct { 205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint8_t segments_[3]; // probabilities for segment tree 206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint8_t skip_proba_; // final probability of being skipped. 207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ProbaArray coeffs_[NUM_TYPES][NUM_BANDS]; // 924 bytes 208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler StatsArray stats_[NUM_TYPES][NUM_BANDS]; // 4224 bytes 209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CostArray level_cost_[NUM_TYPES][NUM_BANDS]; // 11.4k 210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int dirty_; // if true, need to call VP8CalculateLevelCosts() 211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int use_skip_proba_; // Note: we always use skip_proba for now. 212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int nb_skip_; // number of skipped blocks 213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} VP8Proba; 214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Filter parameters. Not actually used in the code (we don't perform 216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// the in-loop filtering), but filled from user's config 217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef struct { 218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int simple_; // filtering type: 0=complex, 1=simple 219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int level_; // base filter level [0..63] 220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int sharpness_; // [0..7] 221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int i4x4_lf_delta_; // delta filter level for i4x4 relative to i16x16 222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} VP8FilterHeader; 223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//------------------------------------------------------------------------------ 225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Informations about the macroblocks. 226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 227793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef struct { 228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // block type 229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler unsigned int type_:2; // 0=i4x4, 1=i16x16 230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler unsigned int uv_mode_:2; 231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler unsigned int skip_:1; 232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler unsigned int segment_:2; 233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint8_t alpha_; // quantization-susceptibility 234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} VP8MBInfo; 235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef struct VP8Matrix { 237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint16_t q_[16]; // quantizer steps 238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint16_t iq_[16]; // reciprocals, fixed point. 239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint16_t bias_[16]; // rounding bias 240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint16_t zthresh_[16]; // value under which a coefficient is zeroed 241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint16_t sharpen_[16]; // frequency boosters for slight sharpening 242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} VP8Matrix; 243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef struct { 245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler VP8Matrix y1_, y2_, uv_; // quantization matrices 246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int alpha_; // quant-susceptibility, range [-127,127]. Zero is neutral. 247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Lower values indicate a lower risk of blurriness. 248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int beta_; // filter-susceptibility, range [0,255]. 249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int quant_; // final segment quantizer. 250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int fstrength_; // final in-loop filtering strength 251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // reactivities 252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int lambda_i16_, lambda_i4_, lambda_uv_; 253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int lambda_mode_, lambda_trellis_, tlambda_; 254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int lambda_trellis_i16_, lambda_trellis_i4_, lambda_trellis_uv_; 255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} VP8SegmentInfo; 256793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Handy transcient struct to accumulate score and info during RD-optimization 258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// and mode evaluation. 259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef struct { 260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler score_t D, SD, R, score; // Distortion, spectral distortion, rate, score. 261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int16_t y_dc_levels[16]; // Quantized levels for luma-DC, luma-AC, chroma. 262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int16_t y_ac_levels[16][16]; 263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int16_t uv_levels[4 + 4][16]; 264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int mode_i16; // mode number for intra16 prediction 265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint8_t modes_i4[16]; // mode numbers for intra4 predictions 266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int mode_uv; // mode number of chroma prediction 267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint32_t nz; // non-zero blocks 268793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} VP8ModeScore; 269793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Iterator structure to iterate through macroblocks, pointing to the 271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// right neighbouring data (samples, predictions, contexts, ...) 272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef struct { 273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int x_, y_; // current macroblock 274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int y_offset_, uv_offset_; // offset to the luma / chroma planes 275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int y_stride_, uv_stride_; // respective strides 276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint8_t* yuv_in_; // borrowed from enc_ (for now) 277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint8_t* yuv_out_; // '' 278793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint8_t* yuv_out2_; // '' 279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint8_t* yuv_p_; // '' 280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler VP8Encoder* enc_; // back-pointer 281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler VP8MBInfo* mb_; // current macroblock 282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler VP8BitWriter* bw_; // current bit-writer 283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint8_t* preds_; // intra mode predictors (4x4 blocks) 284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint32_t* nz_; // non-zero pattern 285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint8_t i4_boundary_[37]; // 32+5 boundary samples needed by intra4x4 286793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint8_t* i4_top_; // pointer to the current top boundary sample 287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int i4_; // current intra4x4 mode being tested 288793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int top_nz_[9]; // top-non-zero context. 289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int left_nz_[9]; // left-non-zero. left_nz[8] is independent. 290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint64_t bit_count_[4][3]; // bit counters for coded levels. 291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint64_t luma_bits_; // macroblock bit-cost for luma 292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint64_t uv_bits_; // macroblock bit-cost for chroma 293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler LFStats* lf_stats_; // filter stats (borrowed from enc_) 294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int do_trellis_; // if true, perform extra level optimisation 295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int done_; // true when scan is finished 296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int percent0_; // saved initial progress percent 297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} VP8EncIterator; 298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // in iterator.c 300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// must be called first. 301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8IteratorInit(VP8Encoder* const enc, VP8EncIterator* const it); 302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// restart a scan. 303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8IteratorReset(VP8EncIterator* const it); 304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// import samples from source 305793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8IteratorImport(const VP8EncIterator* const it); 306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// export decimated samples 307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8IteratorExport(const VP8EncIterator* const it); 308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// go to next macroblock. Returns !done_. If *block_to_save is non-null, will 309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// save the boundary values to top_/left_ arrays. block_to_save can be 310793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// it->yuv_out_ or it->yuv_in_. 311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint VP8IteratorNext(VP8EncIterator* const it, 312793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler const uint8_t* const block_to_save); 313793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Report progression based on macroblock rows. Return 0 for user-abort request. 314793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint VP8IteratorProgress(const VP8EncIterator* const it, 315793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int final_delta_percent); 316793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Intra4x4 iterations 317793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8IteratorStartI4(VP8EncIterator* const it); 318793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// returns true if not done. 319793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint VP8IteratorRotateI4(VP8EncIterator* const it, 320793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler const uint8_t* const yuv_out); 321793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 322793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Non-zero context setup/teardown 323793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8IteratorNzToBytes(VP8EncIterator* const it); 324793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8IteratorBytesToNz(VP8EncIterator* const it); 325793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 326793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Helper functions to set mode properties 327793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8SetIntra16Mode(const VP8EncIterator* const it, int mode); 328793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8SetIntra4Mode(const VP8EncIterator* const it, const uint8_t* modes); 329793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8SetIntraUVMode(const VP8EncIterator* const it, int mode); 330793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8SetSkip(const VP8EncIterator* const it, int skip); 331793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8SetSegment(const VP8EncIterator* const it, int segment); 332793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 333793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//------------------------------------------------------------------------------ 334793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Paginated token buffer 335793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 336793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef struct VP8Tokens VP8Tokens; // struct details in token.c 337793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 338793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef struct { 339793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if !defined(DISABLE_TOKEN_BUFFER) 340793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler VP8Tokens* pages_; // first page 341793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler VP8Tokens** last_page_; // last page 342793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint16_t* tokens_; // set to (*last_page_)->tokens_ 343793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int left_; // how many free tokens left before the page is full. 344793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 345793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int error_; // true in case of malloc error 346793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} VP8TBuffer; 347793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 348793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8TBufferInit(VP8TBuffer* const b); // initialize an empty buffer 349793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8TBufferClear(VP8TBuffer* const b); // de-allocate pages memory 350793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 351793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if !defined(DISABLE_TOKEN_BUFFER) 352793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 353793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Finalizes bitstream when probabilities are known. 354793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Deletes the allocated token memory if final_pass is true. 355793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint VP8EmitTokens(VP8TBuffer* const b, VP8BitWriter* const bw, 356793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler const uint8_t* const probas, int final_pass); 357793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 358793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// record the coding of coefficients without knowing the probabilities yet 359793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint VP8RecordCoeffTokens(int ctx, int coeff_type, int first, int last, 360793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler const int16_t* const coeffs, 361793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler VP8TBuffer* const tokens); 362793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 363793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// unused for now 364793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8TokenToStats(const VP8TBuffer* const b, proba_t* const stats); 365793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 366793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif // !DISABLE_TOKEN_BUFFER 367793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 368793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//------------------------------------------------------------------------------ 369793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// VP8Encoder 370793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 371793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstruct VP8Encoder { 372793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler const WebPConfig* config_; // user configuration and parameters 373793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler WebPPicture* pic_; // input / output picture 374793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 375793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // headers 376793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler VP8FilterHeader filter_hdr_; // filtering information 377793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler VP8SegmentHeader segment_hdr_; // segment information 378793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 379793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int profile_; // VP8's profile, deduced from Config. 380793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 381793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // dimension, in macroblock units. 382793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int mb_w_, mb_h_; 383793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int preds_w_; // stride of the *preds_ prediction plane (=4*mb_w + 1) 384793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 385793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // number of partitions (1, 2, 4 or 8 = MAX_NUM_PARTITIONS) 386793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int num_parts_; 387793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 388793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // per-partition boolean decoders. 389793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler VP8BitWriter bw_; // part0 390793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler VP8BitWriter parts_[MAX_NUM_PARTITIONS]; // token partitions 391793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler VP8TBuffer tokens_; // token buffer 392793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 393793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int percent_; // for progress 394793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 395793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // transparency blob 396793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int has_alpha_; 397793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint8_t* alpha_data_; // non-NULL if transparency is present 398793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint32_t alpha_data_size_; 399793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler WebPWorker alpha_worker_; 400793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 401793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // enhancement layer 402793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int use_layer_; 403793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler VP8BitWriter layer_bw_; 404793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint8_t* layer_data_; 405793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler size_t layer_data_size_; 406793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 407793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // quantization info (one set of DC/AC dequant factor per segment) 408793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler VP8SegmentInfo dqm_[NUM_MB_SEGMENTS]; 409793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int base_quant_; // nominal quantizer value. Only used 410793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // for relative coding of segments' quant. 411793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int alpha_; // global susceptibility (<=> complexity) 412793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int uv_alpha_; // U/V quantization susceptibility 413793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // global offset of quantizers, shared by all segments 414793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int dq_y1_dc_; 415793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int dq_y2_dc_, dq_y2_ac_; 416793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int dq_uv_dc_, dq_uv_ac_; 417793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 418793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // probabilities and statistics 419793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler VP8Proba proba_; 420793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint64_t sse_[4]; // sum of Y/U/V/A squared errors for all macroblocks 421793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint64_t sse_count_; // pixel count for the sse_[] stats 422793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int coded_size_; 423793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int residual_bytes_[3][4]; 424793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int block_count_[3]; 425793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 426793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // quality/speed settings 427793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int method_; // 0=fastest, 6=best/slowest. 428793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler VP8RDLevel rd_opt_level_; // Deduced from method_. 429793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int max_i4_header_bits_; // partition #0 safeness factor 430793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int thread_level_; // derived from config->thread_level 431793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int do_search_; // derived from config->target_XXX 432793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int use_tokens_; // if true, use token buffer 433793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 434793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Memory 435793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler VP8MBInfo* mb_info_; // contextual macroblock infos (mb_w_ + 1) 436793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint8_t* preds_; // predictions modes: (4*mb_w+1) * (4*mb_h+1) 437793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint32_t* nz_; // non-zero bit context: mb_w+1 438793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint8_t* yuv_in_; // input samples 439793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint8_t* yuv_out_; // output samples 440793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint8_t* yuv_out2_; // secondary scratch out-buffer. swapped with yuv_out_. 441793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint8_t* yuv_p_; // scratch buffer for prediction 442793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint8_t *y_top_; // top luma samples. 443793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint8_t *uv_top_; // top u/v samples. 444793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // U and V are packed into 16 pixels (8 U + 8 V) 445793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint8_t *y_left_; // left luma samples (adressable from index -1 to 15). 446793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint8_t *u_left_; // left u samples (adressable from index -1 to 7) 447793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler uint8_t *v_left_; // left v samples (adressable from index -1 to 7) 448793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 449793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler LFStats *lf_stats_; // autofilter stats (if NULL, autofilter is off) 450793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}; 451793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 452793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//------------------------------------------------------------------------------ 453793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// internal functions. Not public. 454793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 455793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // in tree.c 456793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerextern const uint8_t VP8CoeffsProba0[NUM_TYPES][NUM_BANDS][NUM_CTX][NUM_PROBAS]; 457793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerextern const uint8_t 458793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler VP8CoeffsUpdateProba[NUM_TYPES][NUM_BANDS][NUM_CTX][NUM_PROBAS]; 459793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Reset the token probabilities to their initial (default) values 460793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8DefaultProbas(VP8Encoder* const enc); 461793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Write the token probabilities 462793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8WriteProbas(VP8BitWriter* const bw, const VP8Proba* const probas); 463793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Writes the partition #0 modes (that is: all intra modes) 464793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8CodeIntraModes(VP8Encoder* const enc); 465793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 466793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // in syntax.c 467793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Generates the final bitstream by coding the partition0 and headers, 468793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// and appending an assembly of all the pre-coded token partitions. 469793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Return true if everything is ok. 470793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint VP8EncWrite(VP8Encoder* const enc); 471793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Release memory allocated for bit-writing in VP8EncLoop & seq. 472793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8EncFreeBitWriters(VP8Encoder* const enc); 473793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 474793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // in frame.c 475793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerextern const uint8_t VP8EncBands[16 + 1]; 476793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerextern const uint8_t VP8Cat3[]; 477793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerextern const uint8_t VP8Cat4[]; 478793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerextern const uint8_t VP8Cat5[]; 479793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerextern const uint8_t VP8Cat6[]; 480793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 481793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Form all the four Intra16x16 predictions in the yuv_p_ cache 482793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8MakeLuma16Preds(const VP8EncIterator* const it); 483793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Form all the four Chroma8x8 predictions in the yuv_p_ cache 484793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8MakeChroma8Preds(const VP8EncIterator* const it); 485793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Form all the ten Intra4x4 predictions in the yuv_p_ cache 486793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// for the 4x4 block it->i4_ 487793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8MakeIntra4Preds(const VP8EncIterator* const it); 488793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Rate calculation 489793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint VP8GetCostLuma16(VP8EncIterator* const it, const VP8ModeScore* const rd); 490793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint VP8GetCostLuma4(VP8EncIterator* const it, const int16_t levels[16]); 491793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint VP8GetCostUV(VP8EncIterator* const it, const VP8ModeScore* const rd); 492793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Main coding calls 493793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint VP8EncLoop(VP8Encoder* const enc); 494793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint VP8EncTokenLoop(VP8Encoder* const enc); 495793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 496793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // in webpenc.c 497793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Assign an error code to a picture. Return false for convenience. 498793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint WebPEncodingSetError(const WebPPicture* const pic, WebPEncodingError error); 499793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint WebPReportProgress(const WebPPicture* const pic, 500793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int percent, int* const percent_store); 501793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 502793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // in analysis.c 503793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Main analysis loop. Decides the segmentations and complexity. 504793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Assigns a first guess for Intra16 and uvmode_ prediction modes. 505793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint VP8EncAnalyze(VP8Encoder* const enc); 506793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 507793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // in quant.c 508793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Sets up segment's quantization values, base_quant_ and filter strengths. 509793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8SetSegmentParams(VP8Encoder* const enc, float quality); 510793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Pick best modes and fills the levels. Returns true if skipped. 511793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint VP8Decimate(VP8EncIterator* const it, VP8ModeScore* const rd, 512793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler VP8RDLevel rd_opt); 513793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 514793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // in alpha.c 515793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8EncInitAlpha(VP8Encoder* const enc); // initialize alpha compression 516793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint VP8EncStartAlpha(VP8Encoder* const enc); // start alpha coding process 517793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint VP8EncFinishAlpha(VP8Encoder* const enc); // finalize compressed data 518793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint VP8EncDeleteAlpha(VP8Encoder* const enc); // delete compressed data 519793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 520793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // in layer.c 521793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8EncInitLayer(VP8Encoder* const enc); // init everything 522793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8EncCodeLayerBlock(VP8EncIterator* it); // code one more macroblock 523793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint VP8EncFinishLayer(VP8Encoder* const enc); // finalize coding 524793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8EncDeleteLayer(VP8Encoder* enc); // reclaim memory 525793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 526793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // in filter.c 527793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 528793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// SSIM utils 529793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef struct { 530793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler double w, xm, ym, xxm, xym, yym; 531793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} DistoStats; 532793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8SSIMAddStats(const DistoStats* const src, DistoStats* const dst); 533793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8SSIMAccumulatePlane(const uint8_t* src1, int stride1, 534793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler const uint8_t* src2, int stride2, 535793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int W, int H, DistoStats* const stats); 536793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerdouble VP8SSIMGet(const DistoStats* const stats); 537793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerdouble VP8SSIMGetSquaredError(const DistoStats* const stats); 538793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 539793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// autofilter 540793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8InitFilter(VP8EncIterator* const it); 541793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8StoreFilterStats(VP8EncIterator* const it); 542793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid VP8AdjustFilterStrength(VP8EncIterator* const it); 543793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 544793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//------------------------------------------------------------------------------ 545793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 546793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if defined(__cplusplus) || defined(c_plusplus) 547793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} // extern "C" 548793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 549793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 550793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif /* WEBP_ENC_VP8ENCI_H_ */ 551