Index: third_party/libwebp/dec/vp8i.h |
diff --git a/third_party/libwebp/dec/vp8i.h b/third_party/libwebp/dec/vp8i.h |
index 1d0d4077ebc071f0480d588203e3be75cdd10978..3f4cf297d9952b81fcb2d4496f2cb85a637c2b28 100644 |
--- a/third_party/libwebp/dec/vp8i.h |
+++ b/third_party/libwebp/dec/vp8i.h |
@@ -17,10 +17,11 @@ |
#include <string.h> // for memcpy() |
#include "./vp8li.h" |
#include "../utils/bit_reader.h" |
+#include "../utils/random.h" |
#include "../utils/thread.h" |
#include "../dsp/dsp.h" |
-#if defined(__cplusplus) || defined(c_plusplus) |
+#ifdef __cplusplus |
extern "C" { |
#endif |
@@ -29,10 +30,8 @@ extern "C" { |
// version numbers |
#define DEC_MAJ_VERSION 0 |
-#define DEC_MIN_VERSION 3 |
-#define DEC_REV_VERSION 1 |
- |
-#define ONLY_KEYFRAME_CODE // to remove any code related to P-Frames |
+#define DEC_MIN_VERSION 4 |
+#define DEC_REV_VERSION 0 |
// intra prediction modes |
enum { B_DC_PRED = 0, // 4x4 modes |
@@ -100,6 +99,9 @@ enum { MB_FEATURE_TREE_PROBS = 3, |
#define U_OFF (Y_OFF + BPS * 16 + BPS) |
#define V_OFF (U_OFF + 16) |
+// minimal width under which lossy multi-threading is always disabled |
+#define MIN_WIDTH_FOR_THREADS 512 |
+ |
//------------------------------------------------------------------------------ |
// Headers |
@@ -128,15 +130,19 @@ typedef struct { |
int8_t filter_strength_[NUM_MB_SEGMENTS]; // filter strength for segments |
} VP8SegmentHeader; |
+ |
+// probas associated to one of the contexts |
+typedef uint8_t VP8ProbaArray[NUM_PROBAS]; |
+ |
+typedef struct { // all the probas associated to one band |
+ VP8ProbaArray probas_[NUM_CTX]; |
+} VP8BandProbas; |
+ |
// Struct collecting all frame-persistent probabilities. |
typedef struct { |
uint8_t segments_[MB_FEATURE_TREE_PROBS]; |
// Type: 0:Intra16-AC 1:Intra16-DC 2:Chroma 3:Intra4 |
- uint8_t coeffs_[NUM_TYPES][NUM_BANDS][NUM_CTX][NUM_PROBAS]; |
-#ifndef ONLY_KEYFRAME_CODE |
- uint8_t ymode_[4], uvmode_[3]; |
- uint8_t mv_[2][NUM_MV_PROBAS]; |
-#endif |
+ VP8BandProbas bands_[NUM_TYPES][NUM_BANDS]; |
} VP8Proba; |
// Filter parameters |
@@ -153,32 +159,59 @@ typedef struct { |
// Informations about the macroblocks. |
typedef struct { // filter specs |
- unsigned int f_level_:6; // filter strength: 0..63 |
- unsigned int f_ilevel_:6; // inner limit: 1..63 |
- unsigned int f_inner_:1; // do inner filtering? |
+ uint8_t f_limit_; // filter limit in [3..189], or 0 if no filtering |
+ uint8_t f_ilevel_; // inner limit in [1..63] |
+ uint8_t f_inner_; // do inner filtering? |
+ uint8_t hev_thresh_; // high edge variance threshold in [0..2] |
} VP8FInfo; |
-typedef struct { // used for syntax-parsing |
- unsigned int nz_:24; // non-zero AC/DC coeffs (24bit) |
- unsigned int dc_nz_:1; // non-zero DC coeffs |
- unsigned int skip_:1; // block type |
+typedef struct { // Top/Left Contexts used for syntax-parsing |
+ uint8_t nz_; // non-zero AC/DC coeffs (4bit for luma + 4bit for chroma) |
+ uint8_t nz_dc_; // non-zero DC coeff (1bit) |
} VP8MB; |
// Dequantization matrices |
typedef int quant_t[2]; // [DC / AC]. Can be 'uint16_t[2]' too (~slower). |
typedef struct { |
quant_t y1_mat_, y2_mat_, uv_mat_; |
+ |
+ int uv_quant_; // U/V quantizer value |
+ int dither_; // dithering amplitude (0 = off, max=255) |
} VP8QuantMatrix; |
+// Data needed to reconstruct a macroblock |
+typedef struct { |
+ int16_t coeffs_[384]; // 384 coeffs = (16+4+4) * 4*4 |
+ uint8_t is_i4x4_; // true if intra4x4 |
+ uint8_t imodes_[16]; // one 16x16 mode (#0) or sixteen 4x4 modes |
+ uint8_t uvmode_; // chroma prediction mode |
+ // bit-wise info about the content of each sub-4x4 blocks (in decoding order). |
+ // Each of the 4x4 blocks for y/u/v is associated with a 2b code according to: |
+ // code=0 -> no coefficient |
+ // code=1 -> only DC |
+ // code=2 -> first three coefficients are non-zero |
+ // code=3 -> more than three coefficients are non-zero |
+ // This allows to call specialized transform functions. |
+ uint32_t non_zero_y_; |
+ uint32_t non_zero_uv_; |
+ uint8_t dither_; // local dithering strength (deduced from non_zero_*) |
+} VP8MBData; |
+ |
// Persistent information needed by the parallel processing |
typedef struct { |
- int id_; // cache row to process (in [0..2]) |
- int mb_y_; // macroblock position of the row |
- int filter_row_; // true if row-filtering is needed |
- VP8FInfo* f_info_; // filter strengths |
- VP8Io io_; // copy of the VP8Io to pass to put() |
+ int id_; // cache row to process (in [0..2]) |
+ int mb_y_; // macroblock position of the row |
+ int filter_row_; // true if row-filtering is needed |
+ VP8FInfo* f_info_; // filter strengths (swapped with dec->f_info_) |
+ VP8MBData* mb_data_; // reconstruction data (swapped with dec->mb_data_) |
+ VP8Io io_; // copy of the VP8Io to pass to put() |
} VP8ThreadContext; |
+// Saved top samples, per macroblock. Fits into a cache-line. |
+typedef struct { |
+ uint8_t y[16], u[8], v[8]; |
+} VP8TopSamples; |
+ |
//------------------------------------------------------------------------------ |
// VP8Decoder: the main opaque structure handed over to user |
@@ -198,7 +231,8 @@ struct VP8Decoder { |
// Worker |
WebPWorker worker_; |
- int use_threads_; // use multi-thread |
+ int mt_method_; // multi-thread method: 0=off, 1=[parse+recon][filter] |
+ // 2=[parse][recon+filter] |
int cache_id_; // current cache row |
int num_caches_; // number of cached rows of 16 pixels (1, 2 or 3) |
VP8ThreadContext thread_ctx_; // Thread context |
@@ -215,12 +249,9 @@ struct VP8Decoder { |
// per-partition boolean decoders. |
VP8BitReader parts_[MAX_NUM_PARTITIONS]; |
- // buffer refresh flags |
- // bit 0: refresh Gold, bit 1: refresh Alt |
- // bit 2-3: copy to Gold, bit 4-5: copy to Alt |
- // bit 6: Gold sign bias, bit 7: Alt sign bias |
- // bit 8: refresh last frame |
- uint32_t buffer_flags_; |
+ // Dithering strength, deduced from decoding options |
+ int dither_; // whether to use dithering or not |
+ VP8Random dithering_rg_; // random generator for dithering |
// dequantization (one set of DC/AC dequant factor per segment) |
VP8QuantMatrix dqm_[NUM_MB_SEGMENTS]; |
@@ -229,24 +260,19 @@ struct VP8Decoder { |
VP8Proba proba_; |
int use_skip_proba_; |
uint8_t skip_p_; |
-#ifndef ONLY_KEYFRAME_CODE |
- uint8_t intra_p_, last_p_, golden_p_; |
- VP8Proba proba_saved_; |
- int update_proba_; |
-#endif |
// Boundary data cache and persistent buffers. |
- uint8_t* intra_t_; // top intra modes values: 4 * mb_w_ |
- uint8_t intra_l_[4]; // left intra modes values |
- uint8_t* y_t_; // top luma samples: 16 * mb_w_ |
- uint8_t* u_t_, *v_t_; // top u/v samples: 8 * mb_w_ each |
+ uint8_t* intra_t_; // top intra modes values: 4 * mb_w_ |
+ uint8_t intra_l_[4]; // left intra modes values |
+ |
+ uint8_t segment_; // segment of the currently parsed block |
+ VP8TopSamples* yuv_t_; // top y/u/v samples |
- VP8MB* mb_info_; // contextual macroblock info (mb_w_ + 1) |
- VP8FInfo* f_info_; // filter strength info |
- uint8_t* yuv_b_; // main block for Y/U/V (size = YUV_SIZE) |
- int16_t* coeffs_; // 384 coeffs = (16+8+8) * 4*4 |
+ VP8MB* mb_info_; // contextual macroblock info (mb_w_ + 1) |
+ VP8FInfo* f_info_; // filter strength info |
+ uint8_t* yuv_b_; // main block for Y/U/V (size = YUV_SIZE) |
- uint8_t* cache_y_; // macroblock row for storing unfiltered samples |
+ uint8_t* cache_y_; // macroblock row for storing unfiltered samples |
uint8_t* cache_u_; |
uint8_t* cache_v_; |
int cache_y_stride_; |
@@ -258,29 +284,20 @@ struct VP8Decoder { |
// Per macroblock non-persistent infos. |
int mb_x_, mb_y_; // current position, in macroblock units |
- uint8_t is_i4x4_; // true if intra4x4 |
- uint8_t imodes_[16]; // one 16x16 mode (#0) or sixteen 4x4 modes |
- uint8_t uvmode_; // chroma prediction mode |
- uint8_t segment_; // block's segment |
- |
- // bit-wise info about the content of each sub-4x4 blocks: there are 16 bits |
- // for luma (bits #0->#15), then 4 bits for chroma-u (#16->#19) and 4 bits for |
- // chroma-v (#20->#23), each corresponding to one 4x4 block in decoding order. |
- // If the bit is set, the 4x4 block contains some non-zero coefficients. |
- uint32_t non_zero_; |
- uint32_t non_zero_ac_; |
+ VP8MBData* mb_data_; // parsed reconstruction data |
// Filtering side-info |
int filter_type_; // 0=off, 1=simple, 2=complex |
- int filter_row_; // per-row flag |
VP8FInfo fstrengths_[NUM_MB_SEGMENTS][2]; // precalculated per-segment/type |
- // extensions |
- const uint8_t* alpha_data_; // compressed alpha data (if present) |
+ // Alpha |
+ struct ALPHDecoder* alph_dec_; // alpha-plane decoder object |
+ const uint8_t* alpha_data_; // compressed alpha data (if present) |
size_t alpha_data_size_; |
int is_alpha_decoded_; // true if alpha_data_ is decoded in alpha_plane_ |
uint8_t* alpha_plane_; // output. Persistent, contains the whole data. |
+ // extensions |
int layer_colorspace_; |
const uint8_t* layer_data_; // compressed layer data (if present) |
size_t layer_data_size_; |
@@ -303,8 +320,6 @@ void VP8ParseQuant(VP8Decoder* const dec); |
// in frame.c |
int VP8InitFrame(VP8Decoder* const dec, VP8Io* io); |
-// Predict a block and add residual |
-void VP8ReconstructBlock(VP8Decoder* const dec); |
// Call io->setup() and finish setting up scan parameters. |
// After this call returns, one must always call VP8ExitCritical() with the |
// same parameters. Both functions should be used in pair. Returns VP8_STATUS_OK |
@@ -313,7 +328,15 @@ VP8StatusCode VP8EnterCritical(VP8Decoder* const dec, VP8Io* const io); |
// Must always be called in pair with VP8EnterCritical(). |
// Returns false in case of error. |
int VP8ExitCritical(VP8Decoder* const dec, VP8Io* const io); |
-// Process the last decoded row (filtering + output) |
+// Return the multi-threading method to use (0=off), depending |
+// on options and bitstream size. Only for lossy decoding. |
+int VP8GetThreadMethod(const WebPDecoderOptions* const options, |
+ const WebPHeaderStructure* const headers, |
+ int width, int height); |
+// Initialize dithering post-process if needed. |
+void VP8InitDithering(const WebPDecoderOptions* const options, |
+ VP8Decoder* const dec); |
+// Process the last decoded row (filtering + output). |
int VP8ProcessRow(VP8Decoder* const dec, VP8Io* const io); |
// To be called at the start of a new scanline, to initialize predictors. |
void VP8InitScanline(VP8Decoder* const dec); |
@@ -329,7 +352,7 @@ int VP8DecodeLayer(VP8Decoder* const dec); |
//------------------------------------------------------------------------------ |
-#if defined(__cplusplus) || defined(c_plusplus) |
+#ifdef __cplusplus |
} // extern "C" |
#endif |