| Index: third_party/libwebp/dec/tree.c
|
| diff --git a/third_party/libwebp/dec/tree.c b/third_party/libwebp/dec/tree.c
|
| index 3f02efe43f11b2220e62ee73a9e5fa85da60167b..bf9b7c551a13cf17a7f5ba2a35c2ea296eb93519 100644
|
| --- a/third_party/libwebp/dec/tree.c
|
| +++ b/third_party/libwebp/dec/tree.c
|
| @@ -15,10 +15,6 @@
|
|
|
| #define USE_GENERIC_TREE
|
|
|
| -#if defined(__cplusplus) || defined(c_plusplus)
|
| -extern "C" {
|
| -#endif
|
| -
|
| #ifdef USE_GENERIC_TREE
|
| static const int8_t kYModesIntra4[18] = {
|
| -B_DC_PRED, 1,
|
| @@ -33,61 +29,12 @@ static const int8_t kYModesIntra4[18] = {
|
| };
|
| #endif
|
|
|
| -#ifndef ONLY_KEYFRAME_CODE
|
| -
|
| -// inter prediction modes
|
| -enum {
|
| - LEFT4 = 0, ABOVE4 = 1, ZERO4 = 2, NEW4 = 3,
|
| - NEARESTMV, NEARMV, ZEROMV, NEWMV, SPLITMV };
|
| -
|
| -static const int8_t kYModesInter[8] = {
|
| - -DC_PRED, 1,
|
| - 2, 3,
|
| - -V_PRED, -H_PRED,
|
| - -TM_PRED, -B_PRED
|
| -};
|
| -
|
| -static const int8_t kMBSplit[6] = {
|
| - -3, 1,
|
| - -2, 2,
|
| - -0, -1
|
| -};
|
| -
|
| -static const int8_t kMVRef[8] = {
|
| - -ZEROMV, 1,
|
| - -NEARESTMV, 2,
|
| - -NEARMV, 3,
|
| - -NEWMV, -SPLITMV
|
| -};
|
| -
|
| -static const int8_t kMVRef4[6] = {
|
| - -LEFT4, 1,
|
| - -ABOVE4, 2,
|
| - -ZERO4, -NEW4
|
| -};
|
| -#endif
|
| -
|
| //------------------------------------------------------------------------------
|
| // Default probabilities
|
|
|
| -// Inter
|
| -#ifndef ONLY_KEYFRAME_CODE
|
| -static const uint8_t kYModeProbaInter0[4] = { 112, 86, 140, 37 };
|
| -static const uint8_t kUVModeProbaInter0[3] = { 162, 101, 204 };
|
| -static const uint8_t kMVProba0[2][NUM_MV_PROBAS] = {
|
| - { 162, 128, 225, 146, 172, 147, 214, 39,
|
| - 156, 128, 129, 132, 75, 145, 178, 206,
|
| - 239, 254, 254 },
|
| - { 164, 128, 204, 170, 119, 235, 140, 230,
|
| - 228, 128, 130, 130, 74, 148, 180, 203,
|
| - 236, 254, 254 }
|
| -};
|
| -#endif
|
| -
|
| // Paragraph 13.5
|
| static const uint8_t
|
| CoeffsProba0[NUM_TYPES][NUM_BANDS][NUM_CTX][NUM_PROBAS] = {
|
| - // genereated using vp8_default_coef_probs() in entropy.c:129
|
| { { { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
|
| { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
|
| { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 }
|
| @@ -328,28 +275,25 @@ static const uint8_t kBModesProba[NUM_BMODES][NUM_BMODES][NUM_BMODES - 1] = {
|
|
|
| void VP8ResetProba(VP8Proba* const proba) {
|
| memset(proba->segments_, 255u, sizeof(proba->segments_));
|
| - memcpy(proba->coeffs_, CoeffsProba0, sizeof(CoeffsProba0));
|
| -#ifndef ONLY_KEYFRAME_CODE
|
| - memcpy(proba->mv_, kMVProba0, sizeof(kMVProba0));
|
| - memcpy(proba->ymode_, kYModeProbaInter0, sizeof(kYModeProbaInter0));
|
| - memcpy(proba->uvmode_, kUVModeProbaInter0, sizeof(kUVModeProbaInter0));
|
| -#endif
|
| + // proba->bands_[][] is initialized later
|
| }
|
|
|
| -void VP8ParseIntraMode(VP8BitReader* const br, VP8Decoder* const dec) {
|
| +void VP8ParseIntraMode(VP8BitReader* const br, VP8Decoder* const dec) {
|
| uint8_t* const top = dec->intra_t_ + 4 * dec->mb_x_;
|
| uint8_t* const left = dec->intra_l_;
|
| - // Hardcoded 16x16 intra-mode decision tree.
|
| - dec->is_i4x4_ = !VP8GetBit(br, 145); // decide for B_PRED first
|
| - if (!dec->is_i4x4_) {
|
| + VP8MBData* const block = dec->mb_data_ + dec->mb_x_;
|
| +
|
| + block->is_i4x4_ = !VP8GetBit(br, 145); // decide for B_PRED first
|
| + if (!block->is_i4x4_) {
|
| + // Hardcoded 16x16 intra-mode decision tree.
|
| const int ymode =
|
| VP8GetBit(br, 156) ? (VP8GetBit(br, 128) ? TM_PRED : H_PRED)
|
| : (VP8GetBit(br, 163) ? V_PRED : DC_PRED);
|
| - dec->imodes_[0] = ymode;
|
| - memset(top, ymode, 4 * sizeof(top[0]));
|
| - memset(left, ymode, 4 * sizeof(left[0]));
|
| + block->imodes_[0] = ymode;
|
| + memset(top, ymode, 4 * sizeof(*top));
|
| + memset(left, ymode, 4 * sizeof(*left));
|
| } else {
|
| - uint8_t* modes = dec->imodes_;
|
| + uint8_t* modes = block->imodes_;
|
| int y;
|
| for (y = 0; y < 4; ++y) {
|
| int ymode = left[y];
|
| @@ -358,10 +302,10 @@ void VP8ParseIntraMode(VP8BitReader* const br, VP8Decoder* const dec) {
|
| const uint8_t* const prob = kBModesProba[top[x]][ymode];
|
| #ifdef USE_GENERIC_TREE
|
| // Generic tree-parsing
|
| - int i = 0;
|
| - do {
|
| + int i = kYModesIntra4[VP8GetBit(br, prob[0])];
|
| + while (i > 0) {
|
| i = kYModesIntra4[2 * i + VP8GetBit(br, prob[i])];
|
| - } while (i > 0);
|
| + }
|
| ymode = -i;
|
| #else
|
| // Hardcoded tree parsing
|
| @@ -376,15 +320,16 @@ void VP8ParseIntraMode(VP8BitReader* const br, VP8Decoder* const dec) {
|
| (!VP8GetBit(br, prob[8]) ? B_HD_PRED : B_HU_PRED)));
|
| #endif // USE_GENERIC_TREE
|
| top[x] = ymode;
|
| - *modes++ = ymode;
|
| }
|
| + memcpy(modes, top, 4 * sizeof(*top));
|
| + modes += 4;
|
| left[y] = ymode;
|
| }
|
| }
|
| // Hardcoded UVMode decision tree
|
| - dec->uvmode_ = !VP8GetBit(br, 142) ? DC_PRED
|
| - : !VP8GetBit(br, 114) ? V_PRED
|
| - : VP8GetBit(br, 183) ? TM_PRED : H_PRED;
|
| + block->uvmode_ = !VP8GetBit(br, 142) ? DC_PRED
|
| + : !VP8GetBit(br, 114) ? V_PRED
|
| + : VP8GetBit(br, 183) ? TM_PRED : H_PRED;
|
| }
|
|
|
| //------------------------------------------------------------------------------
|
| @@ -526,17 +471,6 @@ static const uint8_t
|
| }
|
| };
|
|
|
| -#ifndef ONLY_KEYFRAME_CODE
|
| -static const uint8_t MVUpdateProba[2][NUM_MV_PROBAS] = {
|
| - { 237, 246, 253, 253, 254, 254, 254, 254,
|
| - 254, 254, 254, 254, 254, 254, 250, 250,
|
| - 252, 254, 254 },
|
| - { 231, 243, 245, 253, 254, 254, 254, 254,
|
| - 254, 254, 254, 254, 254, 254, 251, 251,
|
| - 254, 254, 254 }
|
| -};
|
| -#endif
|
| -
|
| // Paragraph 9.9
|
| void VP8ParseProba(VP8BitReader* const br, VP8Decoder* const dec) {
|
| VP8Proba* const proba = &dec->proba_;
|
| @@ -545,9 +479,9 @@ void VP8ParseProba(VP8BitReader* const br, VP8Decoder* const dec) {
|
| for (b = 0; b < NUM_BANDS; ++b) {
|
| for (c = 0; c < NUM_CTX; ++c) {
|
| for (p = 0; p < NUM_PROBAS; ++p) {
|
| - if (VP8GetBit(br, CoeffsUpdateProba[t][b][c][p])) {
|
| - proba->coeffs_[t][b][c][p] = VP8GetValue(br, 8);
|
| - }
|
| + const int v = VP8GetBit(br, CoeffsUpdateProba[t][b][c][p]) ?
|
| + VP8GetValue(br, 8) : CoeffsProba0[t][b][c][p];
|
| + proba->bands_[t][b].probas_[c][p] = v;
|
| }
|
| }
|
| }
|
| @@ -556,36 +490,5 @@ void VP8ParseProba(VP8BitReader* const br, VP8Decoder* const dec) {
|
| if (dec->use_skip_proba_) {
|
| dec->skip_p_ = VP8GetValue(br, 8);
|
| }
|
| -#ifndef ONLY_KEYFRAME_CODE
|
| - if (!dec->frm_hdr_.key_frame_) {
|
| - int i;
|
| - dec->intra_p_ = VP8GetValue(br, 8);
|
| - dec->last_p_ = VP8GetValue(br, 8);
|
| - dec->golden_p_ = VP8GetValue(br, 8);
|
| - if (VP8Get(br)) { // update y-mode
|
| - for (i = 0; i < 4; ++i) {
|
| - proba->ymode_[i] = VP8GetValue(br, 8);
|
| - }
|
| - }
|
| - if (VP8Get(br)) { // update uv-mode
|
| - for (i = 0; i < 3; ++i) {
|
| - proba->uvmode_[i] = VP8GetValue(br, 8);
|
| - }
|
| - }
|
| - // update MV
|
| - for (i = 0; i < 2; ++i) {
|
| - int k;
|
| - for (k = 0; k < NUM_MV_PROBAS; ++k) {
|
| - if (VP8GetBit(br, MVUpdateProba[i][k])) {
|
| - const int v = VP8GetValue(br, 7);
|
| - proba->mv_[i][k] = v ? v << 1 : 1;
|
| - }
|
| - }
|
| - }
|
| - }
|
| -#endif
|
| }
|
|
|
| -#if defined(__cplusplus) || defined(c_plusplus)
|
| -} // extern "C"
|
| -#endif
|
|
|