vp8i.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2010 Google Inc. All Rights Reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This code is licensed under the same terms as WebM: 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Software License Agreement: http://www.webmproject.org/license/software/ 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Additional IP Rights Grant: http://www.webmproject.org/license/additional/ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// VP8 decoder: internal header. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: Skal (pascal.massimino@gmail.com) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef WEBP_DEC_VP8I_H_ 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WEBP_DEC_VP8I_H_ 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> // for memcpy() 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "./vp8li.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "../utils/bit_reader.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "../utils/thread.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "../dsp/dsp.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__cplusplus) || defined(c_plusplus) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern "C" { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Various defines and enums 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version numbers 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEC_MAJ_VERSION 0 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define DEC_MIN_VERSION 3 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEC_REV_VERSION 0 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ONLY_KEYFRAME_CODE // to remove any code related to P-Frames 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// intra prediction modes 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum { B_DC_PRED = 0, // 4x4 modes 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_TM_PRED, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_VE_PRED, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_HE_PRED, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_RD_PRED, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_VR_PRED, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_LD_PRED, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_VL_PRED, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_HD_PRED, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_HU_PRED, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUM_BMODES = B_HU_PRED + 1 - B_DC_PRED, // = 10 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Luma16 or UV modes 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DC_PRED = B_DC_PRED, V_PRED = B_VE_PRED, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) H_PRED = B_HE_PRED, TM_PRED = B_TM_PRED, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_PRED = NUM_BMODES, // refined I4x4 mode 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // special modes 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_DC_PRED_NOTOP = 4, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_DC_PRED_NOLEFT = 5, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B_DC_PRED_NOTOPLEFT = 6, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUM_B_DC_MODES = 7 }; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum { MB_FEATURE_TREE_PROBS = 3, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUM_MB_SEGMENTS = 4, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUM_REF_LF_DELTAS = 4, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUM_MODE_LF_DELTAS = 4, // I4x4, ZERO, *, SPLIT 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MAX_NUM_PARTITIONS = 8, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Probabilities 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUM_TYPES = 4, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUM_BANDS = 8, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUM_CTX = 3, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUM_PROBAS = 11, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUM_MV_PROBAS = 19 }; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// YUV-cache parameters. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Constraints are: We need to store one 16x16 block of luma samples (y), 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and two 8x8 chroma blocks (u/v). These are better be 16-bytes aligned, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in order to be SIMD-friendly. We also need to store the top, left and 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// top-left samples (from previously decoded blocks), along with four 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extra top-right samples for luma (intra4x4 prediction only). 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// One possible layout is, using 32 * (17 + 9) bytes: 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// .+------ <- only 1 pixel high 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// .|yyyyt. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// .|yyyyt. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// .|yyyyt. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// .|yyyy.. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// .+--.+-- <- only 1 pixel high 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// .|uu.|vv 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// .|uu.|vv 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Every character is a 4x4 block, with legend: 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// '.' = unused 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'y' = y-samples 'u' = u-samples 'v' = u-samples 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// '|' = left sample, '-' = top sample, '+' = top-left sample 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 't' = extra top-right sample for 4x4 modes 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// With this layout, BPS (=Bytes Per Scan-line) is one cacheline size. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BPS 32 // this is the common stride used by yuv[] 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define YUV_SIZE (BPS * 17 + BPS * 9) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define Y_SIZE (BPS * 17) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define Y_OFF (BPS * 1 + 8) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define U_OFF (Y_OFF + BPS * 16 + BPS) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define V_OFF (U_OFF + 16) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Headers 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t key_frame_; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t profile_; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t show_; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t partition_length_; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} VP8FrameHeader; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t width_; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t height_; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t xscale_; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t yscale_; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t colorspace_; // 0 = YCbCr 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t clamp_type_; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} VP8PictureHeader; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// segment features 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int use_segment_; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int update_map_; // whether to update the segment map or not 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int absolute_delta_; // absolute or delta values for quantizer and filter 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int8_t quantizer_[NUM_MB_SEGMENTS]; // quantization changes 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int8_t filter_strength_[NUM_MB_SEGMENTS]; // filter strength for segments 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} VP8SegmentHeader; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Struct collecting all frame-persistent probabilities. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t segments_[MB_FEATURE_TREE_PROBS]; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Type: 0:Intra16-AC 1:Intra16-DC 2:Chroma 3:Intra4 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t coeffs_[NUM_TYPES][NUM_BANDS][NUM_CTX][NUM_PROBAS]; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef ONLY_KEYFRAME_CODE 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t ymode_[4], uvmode_[3]; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t mv_[2][NUM_MV_PROBAS]; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} VP8Proba; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Filter parameters 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int simple_; // 0=complex, 1=simple 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int level_; // [0..63] 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sharpness_; // [0..7] 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int use_lf_delta_; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ref_lf_delta_[NUM_REF_LF_DELTAS]; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mode_lf_delta_[NUM_MODE_LF_DELTAS]; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} VP8FilterHeader; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Informations about the macroblocks. 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct { // filter specs 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int f_level_:6; // filter strength: 0..63 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int f_ilevel_:6; // inner limit: 1..63 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int f_inner_:1; // do inner filtering? 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} VP8FInfo; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct { // used for syntax-parsing 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned int nz_:24; // non-zero AC/DC coeffs (24bit) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int dc_nz_:1; // non-zero DC coeffs 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int skip_:1; // block type 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} VP8MB; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dequantization matrices 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int quant_t[2]; // [DC / AC]. Can be 'uint16_t[2]' too (~slower). 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) quant_t y1_mat_, y2_mat_, uv_mat_; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} VP8QuantMatrix; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Persistent information needed by the parallel processing 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id_; // cache row to process (in [0..2]) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mb_y_; // macroblock position of the row 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int filter_row_; // true if row-filtering is needed 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8FInfo* f_info_; // filter strengths 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8Io io_; // copy of the VP8Io to pass to put() 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} VP8ThreadContext; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// VP8Decoder: the main opaque structure handed over to user 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct VP8Decoder { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8StatusCode status_; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ready_; // true if ready to decode a picture with VP8Decode() 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* error_msg_; // set when status_ is not OK. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Main data source 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8BitReader br_; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // headers 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8FrameHeader frm_hdr_; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8PictureHeader pic_hdr_; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8FilterHeader filter_hdr_; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8SegmentHeader segment_hdr_; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Worker 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPWorker worker_; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int use_threads_; // use multi-thread 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cache_id_; // current cache row 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_caches_; // number of cached rows of 16 pixels (1, 2 or 3) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8ThreadContext thread_ctx_; // Thread context 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dimension, in macroblock units. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mb_w_, mb_h_; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Macroblock to process/filter, depending on cropping and filter_type. 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tl_mb_x_, tl_mb_y_; // top-left MB that must be in-loop filtered 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int br_mb_x_, br_mb_y_; // last bottom-right MB that must be decoded 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // number of partitions. 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_parts_; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // per-partition boolean decoders. 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8BitReader parts_[MAX_NUM_PARTITIONS]; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // buffer refresh flags 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bit 0: refresh Gold, bit 1: refresh Alt 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bit 2-3: copy to Gold, bit 4-5: copy to Alt 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bit 6: Gold sign bias, bit 7: Alt sign bias 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bit 8: refresh last frame 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t buffer_flags_; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dequantization (one set of DC/AC dequant factor per segment) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8QuantMatrix dqm_[NUM_MB_SEGMENTS]; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // probabilities 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8Proba proba_; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int use_skip_proba_; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t skip_p_; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef ONLY_KEYFRAME_CODE 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t intra_p_, last_p_, golden_p_; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8Proba proba_saved_; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int update_proba_; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Boundary data cache and persistent buffers. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t* intra_t_; // top intra modes values: 4 * mb_w_ 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t intra_l_[4]; // left intra modes values 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t* y_t_; // top luma samples: 16 * mb_w_ 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t* u_t_, *v_t_; // top u/v samples: 8 * mb_w_ each 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8MB* mb_info_; // contextual macroblock info (mb_w_ + 1) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8FInfo* f_info_; // filter strength info 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t* yuv_b_; // main block for Y/U/V (size = YUV_SIZE) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int16_t* coeffs_; // 384 coeffs = (16+8+8) * 4*4 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t* cache_y_; // macroblock row for storing unfiltered samples 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t* cache_u_; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t* cache_v_; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cache_y_stride_; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cache_uv_stride_; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // main memory chunk for the above data. Persistent. 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* mem_; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t mem_size_; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Per macroblock non-persistent infos. 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mb_x_, mb_y_; // current position, in macroblock units 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t is_i4x4_; // true if intra4x4 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t imodes_[16]; // one 16x16 mode (#0) or sixteen 4x4 modes 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t uvmode_; // chroma prediction mode 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t segment_; // block's segment 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bit-wise info about the content of each sub-4x4 blocks: there are 16 bits 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for luma (bits #0->#15), then 4 bits for chroma-u (#16->#19) and 4 bits for 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chroma-v (#20->#23), each corresponding to one 4x4 block in decoding order. 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the bit is set, the 4x4 block contains some non-zero coefficients. 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t non_zero_; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t non_zero_ac_; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Filtering side-info 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int filter_type_; // 0=off, 1=simple, 2=complex 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int filter_row_; // per-row flag 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VP8FInfo fstrengths_[NUM_MB_SEGMENTS][2]; // precalculated per-segment/type 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // extensions 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8_t* alpha_data_; // compressed alpha data (if present) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t alpha_data_size_; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t* alpha_plane_; // output. Persistent, contains the whole data. 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int layer_colorspace_; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8_t* layer_data_; // compressed layer data (if present) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t layer_data_size_; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// internal functions. Not public. 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in vp8.c 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int VP8SetError(VP8Decoder* const dec, 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8StatusCode error, const char* const msg); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in tree.c 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VP8ResetProba(VP8Proba* const proba); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VP8ParseProba(VP8BitReader* const br, VP8Decoder* const dec); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VP8ParseIntraMode(VP8BitReader* const br, VP8Decoder* const dec); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in quant.c 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VP8ParseQuant(VP8Decoder* const dec); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in frame.c 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int VP8InitFrame(VP8Decoder* const dec, VP8Io* io); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Predict a block and add residual 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VP8ReconstructBlock(VP8Decoder* const dec); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Call io->setup() and finish setting up scan parameters. 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// After this call returns, one must always call VP8ExitCritical() with the 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// same parameters. Both functions should be used in pair. Returns VP8_STATUS_OK 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if ok, otherwise sets and returns the error status on *dec. 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VP8StatusCode VP8EnterCritical(VP8Decoder* const dec, VP8Io* const io); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Must always be called in pair with VP8EnterCritical(). 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns false in case of error. 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int VP8ExitCritical(VP8Decoder* const dec, VP8Io* const io); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Process the last decoded row (filtering + output) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int VP8ProcessRow(VP8Decoder* const dec, VP8Io* const io); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To be called at the start of a new scanline, to initialize predictors. 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VP8InitScanline(VP8Decoder* const dec); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Decode one macroblock. Returns false if there is not enough data. 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int VP8DecodeMB(VP8Decoder* const dec, VP8BitReader* const token_br); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in alpha.c 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint8_t* VP8DecompressAlphaRows(VP8Decoder* const dec, 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int row, int num_rows); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in layer.c 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int VP8DecodeLayer(VP8Decoder* const dec); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__cplusplus) || defined(c_plusplus) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // extern "C" 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* WEBP_DEC_VP8I_H_ */ 334