15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2010 Google Inc. All Rights Reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// that can be found in the COPYING file in the root of the source 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// tree. An additional intellectual property rights grant can be found 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// in the file PATENTS. All contributing project authors may 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// be found in the AUTHORS file in the root of the source tree. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// VP8 decoder: internal header. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: Skal (pascal.massimino@gmail.com) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef WEBP_DEC_VP8I_H_ 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WEBP_DEC_VP8I_H_ 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> // for memcpy() 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "./vp8li.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "../utils/bit_reader.h" 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "../utils/random.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "../utils/thread.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "../dsp/dsp.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef __cplusplus 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern "C" { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Various defines and enums 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version numbers 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEC_MAJ_VERSION 0 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define DEC_MIN_VERSION 4 34c1942b189965ab0a2086aa6de64d966e9e16fe6bBen Murdoch#define DEC_REV_VERSION 1 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// intra prediction modes 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum { B_DC_PRED = 0, // 4x4 modes 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_TM_PRED, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_VE_PRED, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_HE_PRED, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_RD_PRED, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_VR_PRED, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_LD_PRED, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_VL_PRED, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_HD_PRED, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_HU_PRED, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUM_BMODES = B_HU_PRED + 1 - B_DC_PRED, // = 10 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Luma16 or UV modes 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DC_PRED = B_DC_PRED, V_PRED = B_VE_PRED, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) H_PRED = B_HE_PRED, TM_PRED = B_TM_PRED, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_PRED = NUM_BMODES, // refined I4x4 mode 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // special modes 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_DC_PRED_NOTOP = 4, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_DC_PRED_NOLEFT = 5, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_DC_PRED_NOTOPLEFT = 6, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUM_B_DC_MODES = 7 }; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum { MB_FEATURE_TREE_PROBS = 3, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUM_MB_SEGMENTS = 4, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUM_REF_LF_DELTAS = 4, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUM_MODE_LF_DELTAS = 4, // I4x4, ZERO, *, SPLIT 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MAX_NUM_PARTITIONS = 8, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Probabilities 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUM_TYPES = 4, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUM_BANDS = 8, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUM_CTX = 3, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUM_PROBAS = 11, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUM_MV_PROBAS = 19 }; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// YUV-cache parameters. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Constraints are: We need to store one 16x16 block of luma samples (y), 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and two 8x8 chroma blocks (u/v). These are better be 16-bytes aligned, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in order to be SIMD-friendly. We also need to store the top, left and 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// top-left samples (from previously decoded blocks), along with four 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extra top-right samples for luma (intra4x4 prediction only). 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// One possible layout is, using 32 * (17 + 9) bytes: 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// .+------ <- only 1 pixel high 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// .|yyyyt. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// .|yyyyt. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// .|yyyyt. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// .|yyyy.. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// .+--.+-- <- only 1 pixel high 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// .|uu.|vv 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// .|uu.|vv 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Every character is a 4x4 block, with legend: 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// '.' = unused 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'y' = y-samples 'u' = u-samples 'v' = u-samples 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// '|' = left sample, '-' = top sample, '+' = top-left sample 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 't' = extra top-right sample for 4x4 modes 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// With this layout, BPS (=Bytes Per Scan-line) is one cacheline size. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BPS 32 // this is the common stride used by yuv[] 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define YUV_SIZE (BPS * 17 + BPS * 9) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define Y_SIZE (BPS * 17) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define Y_OFF (BPS * 1 + 8) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define U_OFF (Y_OFF + BPS * 16 + BPS) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define V_OFF (U_OFF + 16) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// minimal width under which lossy multi-threading is always disabled 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MIN_WIDTH_FOR_THREADS 512 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Headers 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t key_frame_; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t profile_; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t show_; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t partition_length_; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} VP8FrameHeader; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t width_; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t height_; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t xscale_; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t yscale_; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t colorspace_; // 0 = YCbCr 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t clamp_type_; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} VP8PictureHeader; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// segment features 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int use_segment_; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int update_map_; // whether to update the segment map or not 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int absolute_delta_; // absolute or delta values for quantizer and filter 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int8_t quantizer_[NUM_MB_SEGMENTS]; // quantization changes 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int8_t filter_strength_[NUM_MB_SEGMENTS]; // filter strength for segments 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} VP8SegmentHeader; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// probas associated to one of the contexts 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef uint8_t VP8ProbaArray[NUM_PROBAS]; 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef struct { // all the probas associated to one band 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VP8ProbaArray probas_[NUM_CTX]; 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} VP8BandProbas; 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Struct collecting all frame-persistent probabilities. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t segments_[MB_FEATURE_TREE_PROBS]; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Type: 0:Intra16-AC 1:Intra16-DC 2:Chroma 3:Intra4 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VP8BandProbas bands_[NUM_TYPES][NUM_BANDS]; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} VP8Proba; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Filter parameters 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int simple_; // 0=complex, 1=simple 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int level_; // [0..63] 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sharpness_; // [0..7] 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int use_lf_delta_; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ref_lf_delta_[NUM_REF_LF_DELTAS]; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mode_lf_delta_[NUM_MODE_LF_DELTAS]; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} VP8FilterHeader; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Informations about the macroblocks. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct { // filter specs 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8_t f_limit_; // filter limit in [3..189], or 0 if no filtering 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8_t f_ilevel_; // inner limit in [1..63] 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8_t f_inner_; // do inner filtering? 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8_t hev_thresh_; // high edge variance threshold in [0..2] 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} VP8FInfo; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef struct { // Top/Left Contexts used for syntax-parsing 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8_t nz_; // non-zero AC/DC coeffs (4bit for luma + 4bit for chroma) 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8_t nz_dc_; // non-zero DC coeff (1bit) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} VP8MB; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dequantization matrices 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int quant_t[2]; // [DC / AC]. Can be 'uint16_t[2]' too (~slower). 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) quant_t y1_mat_, y2_mat_, uv_mat_; 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int uv_quant_; // U/V quantizer value 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int dither_; // dithering amplitude (0 = off, max=255) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} VP8QuantMatrix; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Data needed to reconstruct a macroblock 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef struct { 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int16_t coeffs_[384]; // 384 coeffs = (16+4+4) * 4*4 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8_t is_i4x4_; // true if intra4x4 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8_t imodes_[16]; // one 16x16 mode (#0) or sixteen 4x4 modes 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8_t uvmode_; // chroma prediction mode 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // bit-wise info about the content of each sub-4x4 blocks (in decoding order). 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Each of the 4x4 blocks for y/u/v is associated with a 2b code according to: 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // code=0 -> no coefficient 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // code=1 -> only DC 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // code=2 -> first three coefficients are non-zero 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // code=3 -> more than three coefficients are non-zero 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This allows to call specialized transform functions. 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint32_t non_zero_y_; 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint32_t non_zero_uv_; 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8_t dither_; // local dithering strength (deduced from non_zero_*) 198c1942b189965ab0a2086aa6de64d966e9e16fe6bBen Murdoch uint8_t skip_; 199c1942b189965ab0a2086aa6de64d966e9e16fe6bBen Murdoch uint8_t segment_; 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} VP8MBData; 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Persistent information needed by the parallel processing 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct { 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int id_; // cache row to process (in [0..2]) 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int mb_y_; // macroblock position of the row 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int filter_row_; // true if row-filtering is needed 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VP8FInfo* f_info_; // filter strengths (swapped with dec->f_info_) 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VP8MBData* mb_data_; // reconstruction data (swapped with dec->mb_data_) 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VP8Io io_; // copy of the VP8Io to pass to put() 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} VP8ThreadContext; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Saved top samples, per macroblock. Fits into a cache-line. 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef struct { 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8_t y[16], u[8], v[8]; 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} VP8TopSamples; 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// VP8Decoder: the main opaque structure handed over to user 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct VP8Decoder { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8StatusCode status_; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ready_; // true if ready to decode a picture with VP8Decode() 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* error_msg_; // set when status_ is not OK. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Main data source 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8BitReader br_; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // headers 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8FrameHeader frm_hdr_; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8PictureHeader pic_hdr_; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8FilterHeader filter_hdr_; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8SegmentHeader segment_hdr_; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Worker 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPWorker worker_; 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int mt_method_; // multi-thread method: 0=off, 1=[parse+recon][filter] 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 2=[parse][recon+filter] 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cache_id_; // current cache row 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_caches_; // number of cached rows of 16 pixels (1, 2 or 3) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8ThreadContext thread_ctx_; // Thread context 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dimension, in macroblock units. 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mb_w_, mb_h_; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Macroblock to process/filter, depending on cropping and filter_type. 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tl_mb_x_, tl_mb_y_; // top-left MB that must be in-loop filtered 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int br_mb_x_, br_mb_y_; // last bottom-right MB that must be decoded 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // number of partitions. 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_parts_; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // per-partition boolean decoders. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8BitReader parts_[MAX_NUM_PARTITIONS]; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Dithering strength, deduced from decoding options 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int dither_; // whether to use dithering or not 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VP8Random dithering_rg_; // random generator for dithering 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dequantization (one set of DC/AC dequant factor per segment) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8QuantMatrix dqm_[NUM_MB_SEGMENTS]; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // probabilities 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8Proba proba_; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int use_skip_proba_; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t skip_p_; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Boundary data cache and persistent buffers. 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8_t* intra_t_; // top intra modes values: 4 * mb_w_ 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8_t intra_l_[4]; // left intra modes values 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VP8TopSamples* yuv_t_; // top y/u/v samples 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VP8MB* mb_info_; // contextual macroblock info (mb_w_ + 1) 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VP8FInfo* f_info_; // filter strength info 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8_t* yuv_b_; // main block for Y/U/V (size = YUV_SIZE) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8_t* cache_y_; // macroblock row for storing unfiltered samples 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t* cache_u_; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t* cache_v_; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cache_y_stride_; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cache_uv_stride_; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // main memory chunk for the above data. Persistent. 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* mem_; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t mem_size_; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Per macroblock non-persistent infos. 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mb_x_, mb_y_; // current position, in macroblock units 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VP8MBData* mb_data_; // parsed reconstruction data 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Filtering side-info 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int filter_type_; // 0=off, 1=simple, 2=complex 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VP8FInfo fstrengths_[NUM_MB_SEGMENTS][2]; // precalculated per-segment/type 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Alpha 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct ALPHDecoder* alph_dec_; // alpha-plane decoder object 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const uint8_t* alpha_data_; // compressed alpha data (if present) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t alpha_data_size_; 298eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int is_alpha_decoded_; // true if alpha_data_ is decoded in alpha_plane_ 299c1942b189965ab0a2086aa6de64d966e9e16fe6bBen Murdoch uint8_t* alpha_plane_; // output. Persistent, contains the whole data. 300c1942b189965ab0a2086aa6de64d966e9e16fe6bBen Murdoch int alpha_dithering_; // derived from decoding options (0=off, 100=full). 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// internal functions. Not public. 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in vp8.c 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int VP8SetError(VP8Decoder* const dec, 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8StatusCode error, const char* const msg); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in tree.c 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VP8ResetProba(VP8Proba* const proba); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VP8ParseProba(VP8BitReader* const br, VP8Decoder* const dec); 313c1942b189965ab0a2086aa6de64d966e9e16fe6bBen Murdoch// parses one row of intra mode data in partition 0, returns !eof 314c1942b189965ab0a2086aa6de64d966e9e16fe6bBen Murdochint VP8ParseIntraModeRow(VP8BitReader* const br, VP8Decoder* const dec); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in quant.c 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VP8ParseQuant(VP8Decoder* const dec); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in frame.c 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int VP8InitFrame(VP8Decoder* const dec, VP8Io* io); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Call io->setup() and finish setting up scan parameters. 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// After this call returns, one must always call VP8ExitCritical() with the 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// same parameters. Both functions should be used in pair. Returns VP8_STATUS_OK 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if ok, otherwise sets and returns the error status on *dec. 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VP8StatusCode VP8EnterCritical(VP8Decoder* const dec, VP8Io* const io); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Must always be called in pair with VP8EnterCritical(). 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns false in case of error. 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int VP8ExitCritical(VP8Decoder* const dec, VP8Io* const io); 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Return the multi-threading method to use (0=off), depending 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// on options and bitstream size. Only for lossy decoding. 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int VP8GetThreadMethod(const WebPDecoderOptions* const options, 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const WebPHeaderStructure* const headers, 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int width, int height); 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Initialize dithering post-process if needed. 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void VP8InitDithering(const WebPDecoderOptions* const options, 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VP8Decoder* const dec); 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Process the last decoded row (filtering + output). 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int VP8ProcessRow(VP8Decoder* const dec, VP8Io* const io); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To be called at the start of a new scanline, to initialize predictors. 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VP8InitScanline(VP8Decoder* const dec); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Decode one macroblock. Returns false if there is not enough data. 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int VP8DecodeMB(VP8Decoder* const dec, VP8BitReader* const token_br); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in alpha.c 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint8_t* VP8DecompressAlphaRows(VP8Decoder* const dec, 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int row, int num_rows); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef __cplusplus 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // extern "C" 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* WEBP_DEC_VP8I_H_ */ 355