| OLD | NEW |
| 1 // Copyright 2010 Google Inc. All Rights Reserved. | 1 // Copyright 2010 Google Inc. All Rights Reserved. |
| 2 // | 2 // |
| 3 // Use of this source code is governed by a BSD-style license | 3 // Use of this source code is governed by a BSD-style license |
| 4 // that can be found in the COPYING file in the root of the source | 4 // that can be found in the COPYING file in the root of the source |
| 5 // tree. An additional intellectual property rights grant can be found | 5 // tree. An additional intellectual property rights grant can be found |
| 6 // in the file PATENTS. All contributing project authors may | 6 // in the file PATENTS. All contributing project authors may |
| 7 // be found in the AUTHORS file in the root of the source tree. | 7 // be found in the AUTHORS file in the root of the source tree. |
| 8 // ----------------------------------------------------------------------------- | 8 // ----------------------------------------------------------------------------- |
| 9 // | 9 // |
| 10 // Coding trees and probas | 10 // Coding trees and probas |
| 11 // | 11 // |
| 12 // Author: Skal (pascal.massimino@gmail.com) | 12 // Author: Skal (pascal.massimino@gmail.com) |
| 13 | 13 |
| 14 #include "vp8i.h" | 14 #include "vp8i.h" |
| 15 | 15 |
| 16 #define USE_GENERIC_TREE | 16 #define USE_GENERIC_TREE |
| 17 | 17 |
| 18 #if defined(__cplusplus) || defined(c_plusplus) | |
| 19 extern "C" { | |
| 20 #endif | |
| 21 | |
| 22 #ifdef USE_GENERIC_TREE | 18 #ifdef USE_GENERIC_TREE |
| 23 static const int8_t kYModesIntra4[18] = { | 19 static const int8_t kYModesIntra4[18] = { |
| 24 -B_DC_PRED, 1, | 20 -B_DC_PRED, 1, |
| 25 -B_TM_PRED, 2, | 21 -B_TM_PRED, 2, |
| 26 -B_VE_PRED, 3, | 22 -B_VE_PRED, 3, |
| 27 4, 6, | 23 4, 6, |
| 28 -B_HE_PRED, 5, | 24 -B_HE_PRED, 5, |
| 29 -B_RD_PRED, -B_VR_PRED, | 25 -B_RD_PRED, -B_VR_PRED, |
| 30 -B_LD_PRED, 7, | 26 -B_LD_PRED, 7, |
| 31 -B_VL_PRED, 8, | 27 -B_VL_PRED, 8, |
| 32 -B_HD_PRED, -B_HU_PRED | 28 -B_HD_PRED, -B_HU_PRED |
| 33 }; | 29 }; |
| 34 #endif | 30 #endif |
| 35 | 31 |
| 36 #ifndef ONLY_KEYFRAME_CODE | |
| 37 | |
| 38 // inter prediction modes | |
| 39 enum { | |
| 40 LEFT4 = 0, ABOVE4 = 1, ZERO4 = 2, NEW4 = 3, | |
| 41 NEARESTMV, NEARMV, ZEROMV, NEWMV, SPLITMV }; | |
| 42 | |
| 43 static const int8_t kYModesInter[8] = { | |
| 44 -DC_PRED, 1, | |
| 45 2, 3, | |
| 46 -V_PRED, -H_PRED, | |
| 47 -TM_PRED, -B_PRED | |
| 48 }; | |
| 49 | |
| 50 static const int8_t kMBSplit[6] = { | |
| 51 -3, 1, | |
| 52 -2, 2, | |
| 53 -0, -1 | |
| 54 }; | |
| 55 | |
| 56 static const int8_t kMVRef[8] = { | |
| 57 -ZEROMV, 1, | |
| 58 -NEARESTMV, 2, | |
| 59 -NEARMV, 3, | |
| 60 -NEWMV, -SPLITMV | |
| 61 }; | |
| 62 | |
| 63 static const int8_t kMVRef4[6] = { | |
| 64 -LEFT4, 1, | |
| 65 -ABOVE4, 2, | |
| 66 -ZERO4, -NEW4 | |
| 67 }; | |
| 68 #endif | |
| 69 | |
| 70 //------------------------------------------------------------------------------ | 32 //------------------------------------------------------------------------------ |
| 71 // Default probabilities | 33 // Default probabilities |
| 72 | 34 |
| 73 // Inter | |
| 74 #ifndef ONLY_KEYFRAME_CODE | |
| 75 static const uint8_t kYModeProbaInter0[4] = { 112, 86, 140, 37 }; | |
| 76 static const uint8_t kUVModeProbaInter0[3] = { 162, 101, 204 }; | |
| 77 static const uint8_t kMVProba0[2][NUM_MV_PROBAS] = { | |
| 78 { 162, 128, 225, 146, 172, 147, 214, 39, | |
| 79 156, 128, 129, 132, 75, 145, 178, 206, | |
| 80 239, 254, 254 }, | |
| 81 { 164, 128, 204, 170, 119, 235, 140, 230, | |
| 82 228, 128, 130, 130, 74, 148, 180, 203, | |
| 83 236, 254, 254 } | |
| 84 }; | |
| 85 #endif | |
| 86 | |
| 87 // Paragraph 13.5 | 35 // Paragraph 13.5 |
| 88 static const uint8_t | 36 static const uint8_t |
| 89 CoeffsProba0[NUM_TYPES][NUM_BANDS][NUM_CTX][NUM_PROBAS] = { | 37 CoeffsProba0[NUM_TYPES][NUM_BANDS][NUM_CTX][NUM_PROBAS] = { |
| 90 // genereated using vp8_default_coef_probs() in entropy.c:129 | |
| 91 { { { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 }, | 38 { { { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 }, |
| 92 { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 }, | 39 { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 }, |
| 93 { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 } | 40 { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 } |
| 94 }, | 41 }, |
| 95 { { 253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128 }, | 42 { { 253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128 }, |
| 96 { 189, 129, 242, 255, 227, 213, 255, 219, 128, 128, 128 }, | 43 { 189, 129, 242, 255, 227, 213, 255, 219, 128, 128, 128 }, |
| 97 { 106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128 } | 44 { 106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128 } |
| 98 }, | 45 }, |
| 99 { { 1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128 }, | 46 { { 1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128 }, |
| 100 { 181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128 }, | 47 { 181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128 }, |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 321 { 71, 30, 17, 119, 118, 255, 17, 18, 138 }, | 268 { 71, 30, 17, 119, 118, 255, 17, 18, 138 }, |
| 322 { 101, 38, 60, 138, 55, 70, 43, 26, 142 }, | 269 { 101, 38, 60, 138, 55, 70, 43, 26, 142 }, |
| 323 { 146, 36, 19, 30, 171, 255, 97, 27, 20 }, | 270 { 146, 36, 19, 30, 171, 255, 97, 27, 20 }, |
| 324 { 138, 45, 61, 62, 219, 1, 81, 188, 64 }, | 271 { 138, 45, 61, 62, 219, 1, 81, 188, 64 }, |
| 325 { 32, 41, 20, 117, 151, 142, 20, 21, 163 }, | 272 { 32, 41, 20, 117, 151, 142, 20, 21, 163 }, |
| 326 { 112, 19, 12, 61, 195, 128, 48, 4, 24 } } | 273 { 112, 19, 12, 61, 195, 128, 48, 4, 24 } } |
| 327 }; | 274 }; |
| 328 | 275 |
| 329 void VP8ResetProba(VP8Proba* const proba) { | 276 void VP8ResetProba(VP8Proba* const proba) { |
| 330 memset(proba->segments_, 255u, sizeof(proba->segments_)); | 277 memset(proba->segments_, 255u, sizeof(proba->segments_)); |
| 331 memcpy(proba->coeffs_, CoeffsProba0, sizeof(CoeffsProba0)); | 278 // proba->bands_[][] is initialized later |
| 332 #ifndef ONLY_KEYFRAME_CODE | |
| 333 memcpy(proba->mv_, kMVProba0, sizeof(kMVProba0)); | |
| 334 memcpy(proba->ymode_, kYModeProbaInter0, sizeof(kYModeProbaInter0)); | |
| 335 memcpy(proba->uvmode_, kUVModeProbaInter0, sizeof(kUVModeProbaInter0)); | |
| 336 #endif | |
| 337 } | 279 } |
| 338 | 280 |
| 339 void VP8ParseIntraMode(VP8BitReader* const br, VP8Decoder* const dec) { | 281 void VP8ParseIntraMode(VP8BitReader* const br, VP8Decoder* const dec) { |
| 340 uint8_t* const top = dec->intra_t_ + 4 * dec->mb_x_; | 282 uint8_t* const top = dec->intra_t_ + 4 * dec->mb_x_; |
| 341 uint8_t* const left = dec->intra_l_; | 283 uint8_t* const left = dec->intra_l_; |
| 342 // Hardcoded 16x16 intra-mode decision tree. | 284 VP8MBData* const block = dec->mb_data_ + dec->mb_x_; |
| 343 dec->is_i4x4_ = !VP8GetBit(br, 145); // decide for B_PRED first | 285 |
| 344 if (!dec->is_i4x4_) { | 286 block->is_i4x4_ = !VP8GetBit(br, 145); // decide for B_PRED first |
| 287 if (!block->is_i4x4_) { |
| 288 // Hardcoded 16x16 intra-mode decision tree. |
| 345 const int ymode = | 289 const int ymode = |
| 346 VP8GetBit(br, 156) ? (VP8GetBit(br, 128) ? TM_PRED : H_PRED) | 290 VP8GetBit(br, 156) ? (VP8GetBit(br, 128) ? TM_PRED : H_PRED) |
| 347 : (VP8GetBit(br, 163) ? V_PRED : DC_PRED); | 291 : (VP8GetBit(br, 163) ? V_PRED : DC_PRED); |
| 348 dec->imodes_[0] = ymode; | 292 block->imodes_[0] = ymode; |
| 349 memset(top, ymode, 4 * sizeof(top[0])); | 293 memset(top, ymode, 4 * sizeof(*top)); |
| 350 memset(left, ymode, 4 * sizeof(left[0])); | 294 memset(left, ymode, 4 * sizeof(*left)); |
| 351 } else { | 295 } else { |
| 352 uint8_t* modes = dec->imodes_; | 296 uint8_t* modes = block->imodes_; |
| 353 int y; | 297 int y; |
| 354 for (y = 0; y < 4; ++y) { | 298 for (y = 0; y < 4; ++y) { |
| 355 int ymode = left[y]; | 299 int ymode = left[y]; |
| 356 int x; | 300 int x; |
| 357 for (x = 0; x < 4; ++x) { | 301 for (x = 0; x < 4; ++x) { |
| 358 const uint8_t* const prob = kBModesProba[top[x]][ymode]; | 302 const uint8_t* const prob = kBModesProba[top[x]][ymode]; |
| 359 #ifdef USE_GENERIC_TREE | 303 #ifdef USE_GENERIC_TREE |
| 360 // Generic tree-parsing | 304 // Generic tree-parsing |
| 361 int i = 0; | 305 int i = kYModesIntra4[VP8GetBit(br, prob[0])]; |
| 362 do { | 306 while (i > 0) { |
| 363 i = kYModesIntra4[2 * i + VP8GetBit(br, prob[i])]; | 307 i = kYModesIntra4[2 * i + VP8GetBit(br, prob[i])]; |
| 364 } while (i > 0); | 308 } |
| 365 ymode = -i; | 309 ymode = -i; |
| 366 #else | 310 #else |
| 367 // Hardcoded tree parsing | 311 // Hardcoded tree parsing |
| 368 ymode = !VP8GetBit(br, prob[0]) ? B_DC_PRED : | 312 ymode = !VP8GetBit(br, prob[0]) ? B_DC_PRED : |
| 369 !VP8GetBit(br, prob[1]) ? B_TM_PRED : | 313 !VP8GetBit(br, prob[1]) ? B_TM_PRED : |
| 370 !VP8GetBit(br, prob[2]) ? B_VE_PRED : | 314 !VP8GetBit(br, prob[2]) ? B_VE_PRED : |
| 371 !VP8GetBit(br, prob[3]) ? | 315 !VP8GetBit(br, prob[3]) ? |
| 372 (!VP8GetBit(br, prob[4]) ? B_HE_PRED : | 316 (!VP8GetBit(br, prob[4]) ? B_HE_PRED : |
| 373 (!VP8GetBit(br, prob[5]) ? B_RD_PRED : B_VR_PRED)) : | 317 (!VP8GetBit(br, prob[5]) ? B_RD_PRED : B_VR_PRED)) : |
| 374 (!VP8GetBit(br, prob[6]) ? B_LD_PRED : | 318 (!VP8GetBit(br, prob[6]) ? B_LD_PRED : |
| 375 (!VP8GetBit(br, prob[7]) ? B_VL_PRED : | 319 (!VP8GetBit(br, prob[7]) ? B_VL_PRED : |
| 376 (!VP8GetBit(br, prob[8]) ? B_HD_PRED : B_HU_PRED))); | 320 (!VP8GetBit(br, prob[8]) ? B_HD_PRED : B_HU_PRED))); |
| 377 #endif // USE_GENERIC_TREE | 321 #endif // USE_GENERIC_TREE |
| 378 top[x] = ymode; | 322 top[x] = ymode; |
| 379 *modes++ = ymode; | |
| 380 } | 323 } |
| 324 memcpy(modes, top, 4 * sizeof(*top)); |
| 325 modes += 4; |
| 381 left[y] = ymode; | 326 left[y] = ymode; |
| 382 } | 327 } |
| 383 } | 328 } |
| 384 // Hardcoded UVMode decision tree | 329 // Hardcoded UVMode decision tree |
| 385 dec->uvmode_ = !VP8GetBit(br, 142) ? DC_PRED | 330 block->uvmode_ = !VP8GetBit(br, 142) ? DC_PRED |
| 386 : !VP8GetBit(br, 114) ? V_PRED | 331 : !VP8GetBit(br, 114) ? V_PRED |
| 387 : VP8GetBit(br, 183) ? TM_PRED : H_PRED; | 332 : VP8GetBit(br, 183) ? TM_PRED : H_PRED; |
| 388 } | 333 } |
| 389 | 334 |
| 390 //------------------------------------------------------------------------------ | 335 //------------------------------------------------------------------------------ |
| 391 // Paragraph 13 | 336 // Paragraph 13 |
| 392 | 337 |
| 393 static const uint8_t | 338 static const uint8_t |
| 394 CoeffsUpdateProba[NUM_TYPES][NUM_BANDS][NUM_CTX][NUM_PROBAS] = { | 339 CoeffsUpdateProba[NUM_TYPES][NUM_BANDS][NUM_CTX][NUM_PROBAS] = { |
| 395 { { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, | 340 { { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, |
| 396 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, | 341 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, |
| 397 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } | 342 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 519 { 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, | 464 { 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, |
| 520 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } | 465 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } |
| 521 }, | 466 }, |
| 522 { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, | 467 { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, |
| 523 { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, | 468 { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, |
| 524 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } | 469 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } |
| 525 } | 470 } |
| 526 } | 471 } |
| 527 }; | 472 }; |
| 528 | 473 |
| 529 #ifndef ONLY_KEYFRAME_CODE | |
| 530 static const uint8_t MVUpdateProba[2][NUM_MV_PROBAS] = { | |
| 531 { 237, 246, 253, 253, 254, 254, 254, 254, | |
| 532 254, 254, 254, 254, 254, 254, 250, 250, | |
| 533 252, 254, 254 }, | |
| 534 { 231, 243, 245, 253, 254, 254, 254, 254, | |
| 535 254, 254, 254, 254, 254, 254, 251, 251, | |
| 536 254, 254, 254 } | |
| 537 }; | |
| 538 #endif | |
| 539 | |
| 540 // Paragraph 9.9 | 474 // Paragraph 9.9 |
| 541 void VP8ParseProba(VP8BitReader* const br, VP8Decoder* const dec) { | 475 void VP8ParseProba(VP8BitReader* const br, VP8Decoder* const dec) { |
| 542 VP8Proba* const proba = &dec->proba_; | 476 VP8Proba* const proba = &dec->proba_; |
| 543 int t, b, c, p; | 477 int t, b, c, p; |
| 544 for (t = 0; t < NUM_TYPES; ++t) { | 478 for (t = 0; t < NUM_TYPES; ++t) { |
| 545 for (b = 0; b < NUM_BANDS; ++b) { | 479 for (b = 0; b < NUM_BANDS; ++b) { |
| 546 for (c = 0; c < NUM_CTX; ++c) { | 480 for (c = 0; c < NUM_CTX; ++c) { |
| 547 for (p = 0; p < NUM_PROBAS; ++p) { | 481 for (p = 0; p < NUM_PROBAS; ++p) { |
| 548 if (VP8GetBit(br, CoeffsUpdateProba[t][b][c][p])) { | 482 const int v = VP8GetBit(br, CoeffsUpdateProba[t][b][c][p]) ? |
| 549 proba->coeffs_[t][b][c][p] = VP8GetValue(br, 8); | 483 VP8GetValue(br, 8) : CoeffsProba0[t][b][c][p]; |
| 550 } | 484 proba->bands_[t][b].probas_[c][p] = v; |
| 551 } | 485 } |
| 552 } | 486 } |
| 553 } | 487 } |
| 554 } | 488 } |
| 555 dec->use_skip_proba_ = VP8Get(br); | 489 dec->use_skip_proba_ = VP8Get(br); |
| 556 if (dec->use_skip_proba_) { | 490 if (dec->use_skip_proba_) { |
| 557 dec->skip_p_ = VP8GetValue(br, 8); | 491 dec->skip_p_ = VP8GetValue(br, 8); |
| 558 } | 492 } |
| 559 #ifndef ONLY_KEYFRAME_CODE | |
| 560 if (!dec->frm_hdr_.key_frame_) { | |
| 561 int i; | |
| 562 dec->intra_p_ = VP8GetValue(br, 8); | |
| 563 dec->last_p_ = VP8GetValue(br, 8); | |
| 564 dec->golden_p_ = VP8GetValue(br, 8); | |
| 565 if (VP8Get(br)) { // update y-mode | |
| 566 for (i = 0; i < 4; ++i) { | |
| 567 proba->ymode_[i] = VP8GetValue(br, 8); | |
| 568 } | |
| 569 } | |
| 570 if (VP8Get(br)) { // update uv-mode | |
| 571 for (i = 0; i < 3; ++i) { | |
| 572 proba->uvmode_[i] = VP8GetValue(br, 8); | |
| 573 } | |
| 574 } | |
| 575 // update MV | |
| 576 for (i = 0; i < 2; ++i) { | |
| 577 int k; | |
| 578 for (k = 0; k < NUM_MV_PROBAS; ++k) { | |
| 579 if (VP8GetBit(br, MVUpdateProba[i][k])) { | |
| 580 const int v = VP8GetValue(br, 7); | |
| 581 proba->mv_[i][k] = v ? v << 1 : 1; | |
| 582 } | |
| 583 } | |
| 584 } | |
| 585 } | |
| 586 #endif | |
| 587 } | 493 } |
| 588 | 494 |
| 589 #if defined(__cplusplus) || defined(c_plusplus) | |
| 590 } // extern "C" | |
| 591 #endif | |
| OLD | NEW |