vp8i_dec.h revision 9aea642eefa7a641ab8b89d953251939221d2719
19aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// Copyright 2010 Google Inc. 29aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// 39aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// This code is licensed under the same terms as WebM: 49aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// Software License Agreement: http://www.webmproject.org/license/software/ 59aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// Additional IP Rights Grant: http://www.webmproject.org/license/additional/ 69aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// ----------------------------------------------------------------------------- 79aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// 89aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// VP8 decoder: internal header. 99aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// 109aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// Author: Skal (pascal.massimino@gmail.com) 119aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 129aea642eefa7a641ab8b89d953251939221d2719Eric Hassold#ifndef WEBP_DECODE_VP8I_H_ 139aea642eefa7a641ab8b89d953251939221d2719Eric Hassold#define WEBP_DECODE_VP8I_H_ 149aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 159aea642eefa7a641ab8b89d953251939221d2719Eric Hassold#include <string.h> // for memcpy() 169aea642eefa7a641ab8b89d953251939221d2719Eric Hassold#include "bits.h" 179aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 189aea642eefa7a641ab8b89d953251939221d2719Eric Hassold#if defined(__cplusplus) || defined(c_plusplus) 199aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldextern "C" { 209aea642eefa7a641ab8b89d953251939221d2719Eric Hassold#endif 219aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 229aea642eefa7a641ab8b89d953251939221d2719Eric Hassold//----------------------------------------------------------------------------- 239aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// Various defines and enums 249aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 259aea642eefa7a641ab8b89d953251939221d2719Eric Hassold#define ONLY_KEYFRAME_CODE // to remove any code related to P-Frames 269aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 279aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// intra prediction modes 289aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldenum { B_DC_PRED = 0, // 4x4 modes 299aea642eefa7a641ab8b89d953251939221d2719Eric Hassold B_TM_PRED, 309aea642eefa7a641ab8b89d953251939221d2719Eric Hassold B_VE_PRED, 319aea642eefa7a641ab8b89d953251939221d2719Eric Hassold B_HE_PRED, 329aea642eefa7a641ab8b89d953251939221d2719Eric Hassold B_RD_PRED, 339aea642eefa7a641ab8b89d953251939221d2719Eric Hassold B_VR_PRED, 349aea642eefa7a641ab8b89d953251939221d2719Eric Hassold B_LD_PRED, 359aea642eefa7a641ab8b89d953251939221d2719Eric Hassold B_VL_PRED, 369aea642eefa7a641ab8b89d953251939221d2719Eric Hassold B_HD_PRED, 379aea642eefa7a641ab8b89d953251939221d2719Eric Hassold B_HU_PRED, 389aea642eefa7a641ab8b89d953251939221d2719Eric Hassold NUM_BMODES = B_HU_PRED + 1 - B_DC_PRED, // = 10 399aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 409aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // Luma16 or UV modes 419aea642eefa7a641ab8b89d953251939221d2719Eric Hassold DC_PRED = B_DC_PRED, V_PRED = B_VE_PRED, 429aea642eefa7a641ab8b89d953251939221d2719Eric Hassold H_PRED = B_HE_PRED, TM_PRED = B_TM_PRED, 439aea642eefa7a641ab8b89d953251939221d2719Eric Hassold B_PRED = NUM_BMODES, // refined I4x4 mode 449aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 459aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // special modes 469aea642eefa7a641ab8b89d953251939221d2719Eric Hassold B_DC_PRED_NOTOP = 4, 479aea642eefa7a641ab8b89d953251939221d2719Eric Hassold B_DC_PRED_NOLEFT = 5, 489aea642eefa7a641ab8b89d953251939221d2719Eric Hassold B_DC_PRED_NOTOPLEFT = 6 }; 499aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 509aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldenum { MB_FEATURE_TREE_PROBS = 3, 519aea642eefa7a641ab8b89d953251939221d2719Eric Hassold NUM_MB_SEGMENTS = 4, 529aea642eefa7a641ab8b89d953251939221d2719Eric Hassold NUM_REF_LF_DELTAS = 4, 539aea642eefa7a641ab8b89d953251939221d2719Eric Hassold NUM_MODE_LF_DELTAS = 4, // I4x4, ZERO, *, SPLIT 549aea642eefa7a641ab8b89d953251939221d2719Eric Hassold MAX_NUM_PARTITIONS = 8, 559aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // Probabilities 569aea642eefa7a641ab8b89d953251939221d2719Eric Hassold NUM_TYPES = 4, 579aea642eefa7a641ab8b89d953251939221d2719Eric Hassold NUM_BANDS = 8, 589aea642eefa7a641ab8b89d953251939221d2719Eric Hassold NUM_CTX = 3, 599aea642eefa7a641ab8b89d953251939221d2719Eric Hassold NUM_PROBAS = 11, 609aea642eefa7a641ab8b89d953251939221d2719Eric Hassold NUM_MV_PROBAS = 19 }; 619aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 629aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// YUV-cache parameters. 639aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// Constraints are: We need to store one 16x16 block of luma samples (y), 649aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// and two 8x8 chroma blocks (u/v). These are better be 16-bytes aligned, 659aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// in order to be SIMD-friendly. We also need to store the top, left and 669aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// top-left samples (from previously decoded blocks), along with four 679aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// extra top-right samples for luma (intra4x4 prediction only). 689aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// One possible layout is, using 32 * (17 + 9) bytes: 699aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// 709aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// .+------ <- only 1 pixel high 719aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// .|yyyyt. 729aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// .|yyyyt. 739aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// .|yyyyt. 749aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// .|yyyy.. 759aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// .+--.+-- <- only 1 pixel high 769aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// .|uu.|vv 779aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// .|uu.|vv 789aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// 799aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// Every character is a 4x4 block, with legend: 809aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// '.' = unused 819aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// 'y' = y-samples 'u' = u-samples 'v' = u-samples 829aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// '|' = left sample, '-' = top sample, '+' = top-left sample 839aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// 't' = extra top-right sample for 4x4 modes 849aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// With this layout, BPS (=Bytes Per Scan-line) is one cacheline size. 859aea642eefa7a641ab8b89d953251939221d2719Eric Hassold#define BPS 32 // this is the common stride used by yuv[] 869aea642eefa7a641ab8b89d953251939221d2719Eric Hassold#define YUV_SIZE (BPS * 17 + BPS * 9) 879aea642eefa7a641ab8b89d953251939221d2719Eric Hassold#define Y_SIZE (BPS * 17) 889aea642eefa7a641ab8b89d953251939221d2719Eric Hassold#define Y_OFF (BPS * 1 + 8) 899aea642eefa7a641ab8b89d953251939221d2719Eric Hassold#define U_OFF (Y_OFF + BPS * 16 + BPS) 909aea642eefa7a641ab8b89d953251939221d2719Eric Hassold#define V_OFF (U_OFF + 16) 919aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 929aea642eefa7a641ab8b89d953251939221d2719Eric Hassold//----------------------------------------------------------------------------- 939aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// Headers 949aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 959aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldtypedef struct { 969aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t key_frame_; 979aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t profile_; 989aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t show_; 999aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint32_t partition_length_; 1009aea642eefa7a641ab8b89d953251939221d2719Eric Hassold} VP8FrameHeader; 1019aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 1029aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldtypedef struct { 1039aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint16_t width_; 1049aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint16_t height_; 1059aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t xscale_; 1069aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t yscale_; 1079aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t colorspace_; // 0 = YCbCr 1089aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t clamp_type_; 1099aea642eefa7a641ab8b89d953251939221d2719Eric Hassold} VP8PictureHeader; 1109aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 1119aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// segment features 1129aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldtypedef struct { 1139aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int use_segment_; 1149aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int update_map_; // whether to update the segment map or not 1159aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int absolute_delta_; // absolute or delta values for quantizer and filter 1169aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int8_t quantizer_[NUM_MB_SEGMENTS]; // quantization changes 1179aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int8_t filter_strength_[NUM_MB_SEGMENTS]; // filter strength for segments 1189aea642eefa7a641ab8b89d953251939221d2719Eric Hassold} VP8SegmentHeader; 1199aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 1209aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// Struct collecting all frame-persistent probabilities. 1219aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldtypedef struct { 1229aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t segments_[MB_FEATURE_TREE_PROBS]; 1239aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // Type: 0:Intra16-AC 1:Intra16-DC 2:Chroma 3:Intra4 1249aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t coeffs_[NUM_TYPES][NUM_BANDS][NUM_CTX][NUM_PROBAS]; 1259aea642eefa7a641ab8b89d953251939221d2719Eric Hassold#ifndef ONLY_KEYFRAME_CODE 1269aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t ymode_[4], uvmode_[3]; 1279aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t mv_[2][NUM_MV_PROBAS]; 1289aea642eefa7a641ab8b89d953251939221d2719Eric Hassold#endif 1299aea642eefa7a641ab8b89d953251939221d2719Eric Hassold} VP8Proba; 1309aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 1319aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// Filter parameters 1329aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldtypedef struct { 1339aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int simple_; // 0=complex, 1=simple 1349aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int level_; // [0..63] 1359aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int sharpness_; // [0..7] 1369aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int use_lf_delta_; 1379aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int ref_lf_delta_[NUM_REF_LF_DELTAS]; 1389aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int mode_lf_delta_[NUM_MODE_LF_DELTAS]; 1399aea642eefa7a641ab8b89d953251939221d2719Eric Hassold} VP8FilterHeader; 1409aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 1419aea642eefa7a641ab8b89d953251939221d2719Eric Hassold//----------------------------------------------------------------------------- 1429aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// Informations about the macroblocks. 1439aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 1449aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldtypedef struct { 1459aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // block type 1469aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t skip_:1; 1479aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // filter specs 1489aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t f_level_:6; // filter strength: 0..63 1499aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t f_ilevel_:6; // inner limit: 1..63 1509aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t f_inner_:1; // do inner filtering? 1519aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // cbp 1529aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t nz_; // non-zero AC/DC coeffs 1539aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t dc_nz_; // non-zero DC coeffs 1549aea642eefa7a641ab8b89d953251939221d2719Eric Hassold} VP8MB; 1559aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 1569aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// Dequantization matrices 1579aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldtypedef struct { 1589aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint16_t y1_mat_[2], y2_mat_[2], uv_mat_[2]; // [DC / AC] 1599aea642eefa7a641ab8b89d953251939221d2719Eric Hassold} VP8QuantMatrix; 1609aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 1619aea642eefa7a641ab8b89d953251939221d2719Eric Hassold//----------------------------------------------------------------------------- 1629aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// VP8Decoder: the main opaque structure handed over to user 1639aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 1649aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldstruct VP8Decoder { 1659aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int status_; // 0 = OK 1669aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int ready_; // true if ready to decode a picture with VP8Decode() 1679aea642eefa7a641ab8b89d953251939221d2719Eric Hassold const char* error_msg_; // set when status_ is not OK. 1689aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 1699aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // Main data source 1709aea642eefa7a641ab8b89d953251939221d2719Eric Hassold VP8BitReader br_; 1719aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 1729aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // headers 1739aea642eefa7a641ab8b89d953251939221d2719Eric Hassold VP8FrameHeader frm_hdr_; 1749aea642eefa7a641ab8b89d953251939221d2719Eric Hassold VP8PictureHeader pic_hdr_; 1759aea642eefa7a641ab8b89d953251939221d2719Eric Hassold VP8FilterHeader filter_hdr_; 1769aea642eefa7a641ab8b89d953251939221d2719Eric Hassold VP8SegmentHeader segment_hdr_; 1779aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 1789aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // dimension, in macroblock units. 1799aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int mb_w_, mb_h_; 1809aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 1819aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // number of partitions. 1829aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int num_parts_; 1839aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // per-partition boolean decoders. 1849aea642eefa7a641ab8b89d953251939221d2719Eric Hassold VP8BitReader parts_[MAX_NUM_PARTITIONS]; 1859aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 1869aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // buffer refresh flags 1879aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // bit 0: refresh Gold, bit 1: refresh Alt 1889aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // bit 2-3: copy to Gold, bit 4-5: copy to Alt 1899aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // bit 6: Gold sign bias, bit 7: Alt sign bias 1909aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // bit 8: refresh last frame 1919aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint32_t buffer_flags_; 1929aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 1939aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // dequantization (one set of DC/AC dequant factor per segment) 1949aea642eefa7a641ab8b89d953251939221d2719Eric Hassold VP8QuantMatrix dqm_[NUM_MB_SEGMENTS]; 1959aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 1969aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // probabilities 1979aea642eefa7a641ab8b89d953251939221d2719Eric Hassold VP8Proba proba_; 1989aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int use_skip_proba_; 1999aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t skip_p_; 2009aea642eefa7a641ab8b89d953251939221d2719Eric Hassold#ifndef ONLY_KEYFRAME_CODE 2019aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t intra_p_, last_p_, golden_p_; 2029aea642eefa7a641ab8b89d953251939221d2719Eric Hassold VP8Proba proba_saved_; 2039aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int update_proba_; 2049aea642eefa7a641ab8b89d953251939221d2719Eric Hassold#endif 2059aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 2069aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // Boundary data cache and persistent buffers. 2079aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t* intra_t_; // top intra modes values: 4 * mb_w_ 2089aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t intra_l_[4]; // left intra modes values 2099aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t *y_t_; // top luma samples: 16 * mb_w_ 2109aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t *u_t_, *v_t_; // top u/v samples: 8 * mb_w_ each 2119aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 2129aea642eefa7a641ab8b89d953251939221d2719Eric Hassold VP8MB* mb_info_; // contextual macroblock infos (mb_w_ + 1) 2139aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t* yuv_b_; // main block for Y/U/V (size = YUV_SIZE) 2149aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int16_t* coeffs_; // 384 coeffs = (16+8+8) * 4*4 2159aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 2169aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t* cache_y_; // macroblock row for storing unfiltered samples 2179aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t* cache_u_; 2189aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t* cache_v_; 2199aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int cache_y_stride_; 2209aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int cache_uv_stride_; 2219aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 2229aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // main memory chunk for the above data. Persistent. 2239aea642eefa7a641ab8b89d953251939221d2719Eric Hassold void* mem_; 2249aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int mem_size_; 2259aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 2269aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // Per macroblock non-persistent infos. 2279aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int mb_x_, mb_y_; // current position, in macroblock units 2289aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t is_i4x4_; // true if intra4x4 2299aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t imodes_[16]; // one 16x16 mode (#0) or sixteen 4x4 modes 2309aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t uvmode_; // chroma prediction mode 2319aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t segment_; // block's segment 2329aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 2339aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // bit-wise info about the content of each sub-4x4 blocks: there are 16 bits 2349aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // for luma (bits #0->#15), then 4 bits for chroma-u (#16->#19) and 4 bits for 2359aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // chroma-v (#20->#23), each corresponding to one 4x4 block in decoding order. 2369aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // If the bit is set, the 4x4 block contains some non-zero coefficients. 2379aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint32_t non_zero_; 2389aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint32_t non_zero_ac_; 2399aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 2409aea642eefa7a641ab8b89d953251939221d2719Eric Hassold // Filtering side-info 2419aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int filter_type_; // 0=off, 1=simple, 2=complex 2429aea642eefa7a641ab8b89d953251939221d2719Eric Hassold uint8_t filter_levels_[NUM_MB_SEGMENTS]; // precalculated per-segment 2439aea642eefa7a641ab8b89d953251939221d2719Eric Hassold}; 2449aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 2459aea642eefa7a641ab8b89d953251939221d2719Eric Hassold//----------------------------------------------------------------------------- 2469aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// internal functions. Not public. 2479aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 2489aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// in vp8.c 2499aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldint VP8SetError(VP8Decoder* const dec, int error, const char *msg); 2509aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 2519aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// in tree.c 2529aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldvoid VP8ResetProba(VP8Proba* const proba); 2539aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldvoid VP8ParseProba(VP8BitReader* const br, VP8Decoder* const dec); 2549aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldvoid VP8ParseIntraMode(VP8BitReader* const br, VP8Decoder* const dec); 2559aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 2569aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// in quant.c 2579aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldvoid VP8ParseQuant(VP8Decoder* const dec); 2589aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 2599aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// in frame.c 2609aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldint VP8InitFrame(VP8Decoder* const dec, VP8Io* io); 2619aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// Predict a block and add residual 2629aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldvoid VP8ReconstructBlock(VP8Decoder* const dec); 2639aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// Store a block, along with filtering params 2649aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldvoid VP8StoreBlock(VP8Decoder* const dec); 2659aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// Finalize and transmit a complete row 2669aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldvoid VP8FinishRow(VP8Decoder* const dec, VP8Io* io); 2679aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 2689aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// in dsp.c 2699aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldtypedef void (*VP8Idct)(const int16_t* coeffs, uint8_t* dst); 2709aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldextern VP8Idct VP8Transform; 2719aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldextern VP8Idct VP8TransformUV; 2729aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldextern VP8Idct VP8TransformDC; 2739aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldextern VP8Idct VP8TransformDCUV; 2749aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldextern void (*VP8TransformWHT)(const int16_t* in, int16_t* out); 2759aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 2769aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// *dst is the destination block, with stride BPS. Boundary samples are 2779aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// assumed accessible when needed. 2789aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldtypedef void (*VP8PredFunc)(uint8_t *dst); 2799aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldextern VP8PredFunc VP8PredLuma16[7]; 2809aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldextern VP8PredFunc VP8PredChroma8[7]; 2819aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldextern VP8PredFunc VP8PredLuma4[11]; 2829aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 2839aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldvoid VP8DspInit(); // must be called before anything using the above 2849aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldvoid VP8DspInitTables(); // needs to be called no matter what. 2859aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 2869aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// simple filter (only for luma) 2879aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldtypedef void (*VP8SimpleFilterFunc)(uint8_t* p, int stride, int thresh); 2889aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldextern VP8SimpleFilterFunc VP8SimpleVFilter16; 2899aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldextern VP8SimpleFilterFunc VP8SimpleHFilter16; 2909aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldextern VP8SimpleFilterFunc VP8SimpleVFilter16i; // filter 3 inner edges 2919aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldextern VP8SimpleFilterFunc VP8SimpleHFilter16i; 2929aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 2939aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// regular filter (on both macroblock edges and inner edges) 2949aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldtypedef void (*VP8LumaFilterFunc)(uint8_t* luma, int stride, 2959aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int thresh, int ithresh, int hev_t); 2969aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldtypedef void (*VP8ChromaFilterFunc)(uint8_t* u, uint8_t* v, int stride, 2979aea642eefa7a641ab8b89d953251939221d2719Eric Hassold int thresh, int ithresh, int hev_t); 2989aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// on outter edge 2999aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldextern VP8LumaFilterFunc VP8VFilter16; 3009aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldextern VP8LumaFilterFunc VP8HFilter16; 3019aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldextern VP8ChromaFilterFunc VP8VFilter8; 3029aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldextern VP8ChromaFilterFunc VP8HFilter8; 3039aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 3049aea642eefa7a641ab8b89d953251939221d2719Eric Hassold// on inner edge 3059aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldextern VP8LumaFilterFunc VP8VFilter16i; // filtering 3 inner edges altogether 3069aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldextern VP8LumaFilterFunc VP8HFilter16i; 3079aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldextern VP8ChromaFilterFunc VP8VFilter8i; // filtering u and v altogether 3089aea642eefa7a641ab8b89d953251939221d2719Eric Hassoldextern VP8ChromaFilterFunc VP8HFilter8i; 3099aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 3109aea642eefa7a641ab8b89d953251939221d2719Eric Hassold//----------------------------------------------------------------------------- 3119aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 3129aea642eefa7a641ab8b89d953251939221d2719Eric Hassold#if defined(__cplusplus) || defined(c_plusplus) 3139aea642eefa7a641ab8b89d953251939221d2719Eric Hassold} // extern "C" 3149aea642eefa7a641ab8b89d953251939221d2719Eric Hassold#endif 3159aea642eefa7a641ab8b89d953251939221d2719Eric Hassold 3169aea642eefa7a641ab8b89d953251939221d2719Eric Hassold#endif // WEBP_DECODE_VP8I_H_ 317