1 /* 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 12 #include "vpx_ports/config.h" 13 #include "recon.h" 14 #include "reconintra.h" 15 #include "vpx_mem/vpx_mem.h" 16 #include "onyxd_int.h" 17 18 /* For skip_recon_mb(), add vp8_build_intra_predictors_mby_s(MACROBLOCKD *x) and 19 * vp8_build_intra_predictors_mbuv_s(MACROBLOCKD *x). 20 */ 21 22 void vp8mt_build_intra_predictors_mby(VP8D_COMP *pbi, MACROBLOCKD *x, int mb_row, int mb_col) 23 { 24 #if CONFIG_MULTITHREAD 25 unsigned char *yabove_row; /* = x->dst.y_buffer - x->dst.y_stride; */ 26 unsigned char *yleft_col; 27 unsigned char yleft_buf[16]; 28 unsigned char ytop_left; /* = yabove_row[-1]; */ 29 unsigned char *ypred_ptr = x->predictor; 30 int r, c, i; 31 32 if (pbi->common.filter_level) 33 { 34 yabove_row = pbi->mt_yabove_row[mb_row] + mb_col*16 +32; 35 yleft_col = pbi->mt_yleft_col[mb_row]; 36 } else 37 { 38 yabove_row = x->dst.y_buffer - x->dst.y_stride; 39 40 for (i = 0; i < 16; i++) 41 yleft_buf[i] = x->dst.y_buffer [i* x->dst.y_stride -1]; 42 yleft_col = yleft_buf; 43 } 44 45 ytop_left = yabove_row[-1]; 46 47 /* for Y */ 48 switch (x->mode_info_context->mbmi.mode) 49 { 50 case DC_PRED: 51 { 52 int expected_dc; 53 int i; 54 int shift; 55 int average = 0; 56 57 58 if (x->up_available || x->left_available) 59 { 60 if (x->up_available) 61 { 62 for (i = 0; i < 16; i++) 63 { 64 average += yabove_row[i]; 65 } 66 } 67 68 if (x->left_available) 69 { 70 71 for (i = 0; i < 16; i++) 72 { 73 average += yleft_col[i]; 74 } 75 76 } 77 78 79 80 shift = 3 + x->up_available + x->left_available; 81 expected_dc = (average + (1 << (shift - 1))) >> shift; 82 } 83 else 84 { 85 expected_dc = 128; 86 } 87 88 vpx_memset(ypred_ptr, expected_dc, 256); 89 } 90 break; 91 case V_PRED: 92 { 93 94 for (r = 0; r < 16; r++) 95 { 96 97 ((int *)ypred_ptr)[0] = ((int *)yabove_row)[0]; 98 ((int *)ypred_ptr)[1] = ((int *)yabove_row)[1]; 99 ((int *)ypred_ptr)[2] = ((int *)yabove_row)[2]; 100 ((int *)ypred_ptr)[3] = ((int *)yabove_row)[3]; 101 ypred_ptr += 16; 102 } 103 } 104 break; 105 case H_PRED: 106 { 107 108 for (r = 0; r < 16; r++) 109 { 110 111 vpx_memset(ypred_ptr, yleft_col[r], 16); 112 ypred_ptr += 16; 113 } 114 115 } 116 break; 117 case TM_PRED: 118 { 119 120 for (r = 0; r < 16; r++) 121 { 122 for (c = 0; c < 16; c++) 123 { 124 int pred = yleft_col[r] + yabove_row[ c] - ytop_left; 125 126 if (pred < 0) 127 pred = 0; 128 129 if (pred > 255) 130 pred = 255; 131 132 ypred_ptr[c] = pred; 133 } 134 135 ypred_ptr += 16; 136 } 137 138 } 139 break; 140 case B_PRED: 141 case NEARESTMV: 142 case NEARMV: 143 case ZEROMV: 144 case NEWMV: 145 case SPLITMV: 146 case MB_MODE_COUNT: 147 break; 148 } 149 #else 150 (void) pbi; 151 (void) x; 152 (void) mb_row; 153 (void) mb_col; 154 #endif 155 } 156 157 void vp8mt_build_intra_predictors_mby_s(VP8D_COMP *pbi, MACROBLOCKD *x, int mb_row, int mb_col) 158 { 159 #if CONFIG_MULTITHREAD 160 unsigned char *yabove_row; /* = x->dst.y_buffer - x->dst.y_stride; */ 161 unsigned char *yleft_col; 162 unsigned char yleft_buf[16]; 163 unsigned char ytop_left; /* = yabove_row[-1]; */ 164 unsigned char *ypred_ptr = x->predictor; 165 int r, c, i; 166 167 int y_stride = x->dst.y_stride; 168 ypred_ptr = x->dst.y_buffer; /*x->predictor;*/ 169 170 if (pbi->common.filter_level) 171 { 172 yabove_row = pbi->mt_yabove_row[mb_row] + mb_col*16 +32; 173 yleft_col = pbi->mt_yleft_col[mb_row]; 174 } else 175 { 176 yabove_row = x->dst.y_buffer - x->dst.y_stride; 177 178 for (i = 0; i < 16; i++) 179 yleft_buf[i] = x->dst.y_buffer [i* x->dst.y_stride -1]; 180 yleft_col = yleft_buf; 181 } 182 183 ytop_left = yabove_row[-1]; 184 185 /* for Y */ 186 switch (x->mode_info_context->mbmi.mode) 187 { 188 case DC_PRED: 189 { 190 int expected_dc; 191 int i; 192 int shift; 193 int average = 0; 194 195 196 if (x->up_available || x->left_available) 197 { 198 if (x->up_available) 199 { 200 for (i = 0; i < 16; i++) 201 { 202 average += yabove_row[i]; 203 } 204 } 205 206 if (x->left_available) 207 { 208 209 for (i = 0; i < 16; i++) 210 { 211 average += yleft_col[i]; 212 } 213 214 } 215 216 217 218 shift = 3 + x->up_available + x->left_available; 219 expected_dc = (average + (1 << (shift - 1))) >> shift; 220 } 221 else 222 { 223 expected_dc = 128; 224 } 225 226 /*vpx_memset(ypred_ptr, expected_dc, 256);*/ 227 for (r = 0; r < 16; r++) 228 { 229 vpx_memset(ypred_ptr, expected_dc, 16); 230 ypred_ptr += y_stride; /*16;*/ 231 } 232 } 233 break; 234 case V_PRED: 235 { 236 237 for (r = 0; r < 16; r++) 238 { 239 240 ((int *)ypred_ptr)[0] = ((int *)yabove_row)[0]; 241 ((int *)ypred_ptr)[1] = ((int *)yabove_row)[1]; 242 ((int *)ypred_ptr)[2] = ((int *)yabove_row)[2]; 243 ((int *)ypred_ptr)[3] = ((int *)yabove_row)[3]; 244 ypred_ptr += y_stride; /*16;*/ 245 } 246 } 247 break; 248 case H_PRED: 249 { 250 251 for (r = 0; r < 16; r++) 252 { 253 254 vpx_memset(ypred_ptr, yleft_col[r], 16); 255 ypred_ptr += y_stride; /*16;*/ 256 } 257 258 } 259 break; 260 case TM_PRED: 261 { 262 263 for (r = 0; r < 16; r++) 264 { 265 for (c = 0; c < 16; c++) 266 { 267 int pred = yleft_col[r] + yabove_row[ c] - ytop_left; 268 269 if (pred < 0) 270 pred = 0; 271 272 if (pred > 255) 273 pred = 255; 274 275 ypred_ptr[c] = pred; 276 } 277 278 ypred_ptr += y_stride; /*16;*/ 279 } 280 281 } 282 break; 283 case B_PRED: 284 case NEARESTMV: 285 case NEARMV: 286 case ZEROMV: 287 case NEWMV: 288 case SPLITMV: 289 case MB_MODE_COUNT: 290 break; 291 } 292 #else 293 (void) pbi; 294 (void) x; 295 (void) mb_row; 296 (void) mb_col; 297 #endif 298 } 299 300 void vp8mt_build_intra_predictors_mbuv(VP8D_COMP *pbi, MACROBLOCKD *x, int mb_row, int mb_col) 301 { 302 #if CONFIG_MULTITHREAD 303 unsigned char *uabove_row; /* = x->dst.u_buffer - x->dst.uv_stride; */ 304 unsigned char *uleft_col; /*[16];*/ 305 unsigned char uleft_buf[8]; 306 unsigned char utop_left; /* = uabove_row[-1]; */ 307 unsigned char *vabove_row; /* = x->dst.v_buffer - x->dst.uv_stride; */ 308 unsigned char *vleft_col; /*[20];*/ 309 unsigned char vleft_buf[8]; 310 unsigned char vtop_left; /* = vabove_row[-1]; */ 311 unsigned char *upred_ptr = &x->predictor[256]; 312 unsigned char *vpred_ptr = &x->predictor[320]; 313 int i, j; 314 315 if (pbi->common.filter_level) 316 { 317 uabove_row = pbi->mt_uabove_row[mb_row] + mb_col*8 +16; 318 vabove_row = pbi->mt_vabove_row[mb_row] + mb_col*8 +16; 319 uleft_col = pbi->mt_uleft_col[mb_row]; 320 vleft_col = pbi->mt_vleft_col[mb_row]; 321 } else 322 { 323 uabove_row = x->dst.u_buffer - x->dst.uv_stride; 324 vabove_row = x->dst.v_buffer - x->dst.uv_stride; 325 326 for (i = 0; i < 8; i++) 327 { 328 uleft_buf[i] = x->dst.u_buffer [i* x->dst.uv_stride -1]; 329 vleft_buf[i] = x->dst.v_buffer [i* x->dst.uv_stride -1]; 330 } 331 uleft_col = uleft_buf; 332 vleft_col = vleft_buf; 333 } 334 utop_left = uabove_row[-1]; 335 vtop_left = vabove_row[-1]; 336 337 switch (x->mode_info_context->mbmi.uv_mode) 338 { 339 case DC_PRED: 340 { 341 int expected_udc; 342 int expected_vdc; 343 int i; 344 int shift; 345 int Uaverage = 0; 346 int Vaverage = 0; 347 348 if (x->up_available) 349 { 350 for (i = 0; i < 8; i++) 351 { 352 Uaverage += uabove_row[i]; 353 Vaverage += vabove_row[i]; 354 } 355 } 356 357 if (x->left_available) 358 { 359 for (i = 0; i < 8; i++) 360 { 361 Uaverage += uleft_col[i]; 362 Vaverage += vleft_col[i]; 363 } 364 } 365 366 if (!x->up_available && !x->left_available) 367 { 368 expected_udc = 128; 369 expected_vdc = 128; 370 } 371 else 372 { 373 shift = 2 + x->up_available + x->left_available; 374 expected_udc = (Uaverage + (1 << (shift - 1))) >> shift; 375 expected_vdc = (Vaverage + (1 << (shift - 1))) >> shift; 376 } 377 378 379 vpx_memset(upred_ptr, expected_udc, 64); 380 vpx_memset(vpred_ptr, expected_vdc, 64); 381 382 383 } 384 break; 385 case V_PRED: 386 { 387 int i; 388 389 for (i = 0; i < 8; i++) 390 { 391 vpx_memcpy(upred_ptr, uabove_row, 8); 392 vpx_memcpy(vpred_ptr, vabove_row, 8); 393 upred_ptr += 8; 394 vpred_ptr += 8; 395 } 396 397 } 398 break; 399 case H_PRED: 400 { 401 int i; 402 403 for (i = 0; i < 8; i++) 404 { 405 vpx_memset(upred_ptr, uleft_col[i], 8); 406 vpx_memset(vpred_ptr, vleft_col[i], 8); 407 upred_ptr += 8; 408 vpred_ptr += 8; 409 } 410 } 411 412 break; 413 case TM_PRED: 414 { 415 int i; 416 417 for (i = 0; i < 8; i++) 418 { 419 for (j = 0; j < 8; j++) 420 { 421 int predu = uleft_col[i] + uabove_row[j] - utop_left; 422 int predv = vleft_col[i] + vabove_row[j] - vtop_left; 423 424 if (predu < 0) 425 predu = 0; 426 427 if (predu > 255) 428 predu = 255; 429 430 if (predv < 0) 431 predv = 0; 432 433 if (predv > 255) 434 predv = 255; 435 436 upred_ptr[j] = predu; 437 vpred_ptr[j] = predv; 438 } 439 440 upred_ptr += 8; 441 vpred_ptr += 8; 442 } 443 444 } 445 break; 446 case B_PRED: 447 case NEARESTMV: 448 case NEARMV: 449 case ZEROMV: 450 case NEWMV: 451 case SPLITMV: 452 case MB_MODE_COUNT: 453 break; 454 } 455 #else 456 (void) pbi; 457 (void) x; 458 (void) mb_row; 459 (void) mb_col; 460 #endif 461 } 462 463 void vp8mt_build_intra_predictors_mbuv_s(VP8D_COMP *pbi, MACROBLOCKD *x, int mb_row, int mb_col) 464 { 465 #if CONFIG_MULTITHREAD 466 unsigned char *uabove_row; /* = x->dst.u_buffer - x->dst.uv_stride; */ 467 unsigned char *uleft_col; /*[16];*/ 468 unsigned char uleft_buf[8]; 469 unsigned char utop_left; /* = uabove_row[-1]; */ 470 unsigned char *vabove_row; /* = x->dst.v_buffer - x->dst.uv_stride; */ 471 unsigned char *vleft_col; /*[20];*/ 472 unsigned char vleft_buf[8]; 473 unsigned char vtop_left; /* = vabove_row[-1]; */ 474 unsigned char *upred_ptr = x->dst.u_buffer; /*&x->predictor[256];*/ 475 unsigned char *vpred_ptr = x->dst.v_buffer; /*&x->predictor[320];*/ 476 int uv_stride = x->dst.uv_stride; 477 int i, j; 478 479 if (pbi->common.filter_level) 480 { 481 uabove_row = pbi->mt_uabove_row[mb_row] + mb_col*8 +16; 482 vabove_row = pbi->mt_vabove_row[mb_row] + mb_col*8 +16; 483 uleft_col = pbi->mt_uleft_col[mb_row]; 484 vleft_col = pbi->mt_vleft_col[mb_row]; 485 } else 486 { 487 uabove_row = x->dst.u_buffer - x->dst.uv_stride; 488 vabove_row = x->dst.v_buffer - x->dst.uv_stride; 489 490 for (i = 0; i < 8; i++) 491 { 492 uleft_buf[i] = x->dst.u_buffer [i* x->dst.uv_stride -1]; 493 vleft_buf[i] = x->dst.v_buffer [i* x->dst.uv_stride -1]; 494 } 495 uleft_col = uleft_buf; 496 vleft_col = vleft_buf; 497 } 498 utop_left = uabove_row[-1]; 499 vtop_left = vabove_row[-1]; 500 501 switch (x->mode_info_context->mbmi.uv_mode) 502 { 503 case DC_PRED: 504 { 505 int expected_udc; 506 int expected_vdc; 507 int i; 508 int shift; 509 int Uaverage = 0; 510 int Vaverage = 0; 511 512 if (x->up_available) 513 { 514 for (i = 0; i < 8; i++) 515 { 516 Uaverage += uabove_row[i]; 517 Vaverage += vabove_row[i]; 518 } 519 } 520 521 if (x->left_available) 522 { 523 for (i = 0; i < 8; i++) 524 { 525 Uaverage += uleft_col[i]; 526 Vaverage += vleft_col[i]; 527 } 528 } 529 530 if (!x->up_available && !x->left_available) 531 { 532 expected_udc = 128; 533 expected_vdc = 128; 534 } 535 else 536 { 537 shift = 2 + x->up_available + x->left_available; 538 expected_udc = (Uaverage + (1 << (shift - 1))) >> shift; 539 expected_vdc = (Vaverage + (1 << (shift - 1))) >> shift; 540 } 541 542 543 /*vpx_memset(upred_ptr,expected_udc,64); 544 vpx_memset(vpred_ptr,expected_vdc,64);*/ 545 for (i = 0; i < 8; i++) 546 { 547 vpx_memset(upred_ptr, expected_udc, 8); 548 vpx_memset(vpred_ptr, expected_vdc, 8); 549 upred_ptr += uv_stride; /*8;*/ 550 vpred_ptr += uv_stride; /*8;*/ 551 } 552 } 553 break; 554 case V_PRED: 555 { 556 int i; 557 558 for (i = 0; i < 8; i++) 559 { 560 vpx_memcpy(upred_ptr, uabove_row, 8); 561 vpx_memcpy(vpred_ptr, vabove_row, 8); 562 upred_ptr += uv_stride; /*8;*/ 563 vpred_ptr += uv_stride; /*8;*/ 564 } 565 566 } 567 break; 568 case H_PRED: 569 { 570 int i; 571 572 for (i = 0; i < 8; i++) 573 { 574 vpx_memset(upred_ptr, uleft_col[i], 8); 575 vpx_memset(vpred_ptr, vleft_col[i], 8); 576 upred_ptr += uv_stride; /*8;*/ 577 vpred_ptr += uv_stride; /*8;*/ 578 } 579 } 580 581 break; 582 case TM_PRED: 583 { 584 int i; 585 586 for (i = 0; i < 8; i++) 587 { 588 for (j = 0; j < 8; j++) 589 { 590 int predu = uleft_col[i] + uabove_row[j] - utop_left; 591 int predv = vleft_col[i] + vabove_row[j] - vtop_left; 592 593 if (predu < 0) 594 predu = 0; 595 596 if (predu > 255) 597 predu = 255; 598 599 if (predv < 0) 600 predv = 0; 601 602 if (predv > 255) 603 predv = 255; 604 605 upred_ptr[j] = predu; 606 vpred_ptr[j] = predv; 607 } 608 609 upred_ptr += uv_stride; /*8;*/ 610 vpred_ptr += uv_stride; /*8;*/ 611 } 612 613 } 614 break; 615 case B_PRED: 616 case NEARESTMV: 617 case NEARMV: 618 case ZEROMV: 619 case NEWMV: 620 case SPLITMV: 621 case MB_MODE_COUNT: 622 break; 623 } 624 #else 625 (void) pbi; 626 (void) x; 627 (void) mb_row; 628 (void) mb_col; 629 #endif 630 } 631 632 633 void vp8mt_predict_intra4x4(VP8D_COMP *pbi, 634 MACROBLOCKD *xd, 635 int b_mode, 636 unsigned char *predictor, 637 int mb_row, 638 int mb_col, 639 int num) 640 { 641 #if CONFIG_MULTITHREAD 642 int i, r, c; 643 644 unsigned char *Above; /* = *(x->base_dst) + x->dst - x->dst_stride; */ 645 unsigned char Left[4]; 646 unsigned char top_left; /* = Above[-1]; */ 647 648 BLOCKD *x = &xd->block[num]; 649 650 /*Caution: For some b_mode, it needs 8 pixels (4 above + 4 above-right).*/ 651 if (num < 4 && pbi->common.filter_level) 652 Above = pbi->mt_yabove_row[mb_row] + mb_col*16 + num*4 + 32; 653 else 654 Above = *(x->base_dst) + x->dst - x->dst_stride; 655 656 if (num%4==0 && pbi->common.filter_level) 657 { 658 for (i=0; i<4; i++) 659 Left[i] = pbi->mt_yleft_col[mb_row][num + i]; 660 }else 661 { 662 Left[0] = (*(x->base_dst))[x->dst - 1]; 663 Left[1] = (*(x->base_dst))[x->dst - 1 + x->dst_stride]; 664 Left[2] = (*(x->base_dst))[x->dst - 1 + 2 * x->dst_stride]; 665 Left[3] = (*(x->base_dst))[x->dst - 1 + 3 * x->dst_stride]; 666 } 667 668 if ((num==4 || num==8 || num==12) && pbi->common.filter_level) 669 top_left = pbi->mt_yleft_col[mb_row][num-1]; 670 else 671 top_left = Above[-1]; 672 673 switch (b_mode) 674 { 675 case B_DC_PRED: 676 { 677 int expected_dc = 0; 678 679 for (i = 0; i < 4; i++) 680 { 681 expected_dc += Above[i]; 682 expected_dc += Left[i]; 683 } 684 685 expected_dc = (expected_dc + 4) >> 3; 686 687 for (r = 0; r < 4; r++) 688 { 689 for (c = 0; c < 4; c++) 690 { 691 predictor[c] = expected_dc; 692 } 693 694 predictor += 16; 695 } 696 } 697 break; 698 case B_TM_PRED: 699 { 700 /* prediction similar to true_motion prediction */ 701 for (r = 0; r < 4; r++) 702 { 703 for (c = 0; c < 4; c++) 704 { 705 int pred = Above[c] - top_left + Left[r]; 706 707 if (pred < 0) 708 pred = 0; 709 710 if (pred > 255) 711 pred = 255; 712 713 predictor[c] = pred; 714 } 715 716 predictor += 16; 717 } 718 } 719 break; 720 721 case B_VE_PRED: 722 { 723 724 unsigned int ap[4]; 725 ap[0] = (top_left + 2 * Above[0] + Above[1] + 2) >> 2; 726 ap[1] = (Above[0] + 2 * Above[1] + Above[2] + 2) >> 2; 727 ap[2] = (Above[1] + 2 * Above[2] + Above[3] + 2) >> 2; 728 ap[3] = (Above[2] + 2 * Above[3] + Above[4] + 2) >> 2; 729 730 for (r = 0; r < 4; r++) 731 { 732 for (c = 0; c < 4; c++) 733 { 734 735 predictor[c] = ap[c]; 736 } 737 738 predictor += 16; 739 } 740 741 } 742 break; 743 744 745 case B_HE_PRED: 746 { 747 748 unsigned int lp[4]; 749 lp[0] = (top_left + 2 * Left[0] + Left[1] + 2) >> 2; 750 lp[1] = (Left[0] + 2 * Left[1] + Left[2] + 2) >> 2; 751 lp[2] = (Left[1] + 2 * Left[2] + Left[3] + 2) >> 2; 752 lp[3] = (Left[2] + 2 * Left[3] + Left[3] + 2) >> 2; 753 754 for (r = 0; r < 4; r++) 755 { 756 for (c = 0; c < 4; c++) 757 { 758 predictor[c] = lp[r]; 759 } 760 761 predictor += 16; 762 } 763 } 764 break; 765 case B_LD_PRED: 766 { 767 unsigned char *ptr = Above; 768 predictor[0 * 16 + 0] = (ptr[0] + ptr[1] * 2 + ptr[2] + 2) >> 2; 769 predictor[0 * 16 + 1] = 770 predictor[1 * 16 + 0] = (ptr[1] + ptr[2] * 2 + ptr[3] + 2) >> 2; 771 predictor[0 * 16 + 2] = 772 predictor[1 * 16 + 1] = 773 predictor[2 * 16 + 0] = (ptr[2] + ptr[3] * 2 + ptr[4] + 2) >> 2; 774 predictor[0 * 16 + 3] = 775 predictor[1 * 16 + 2] = 776 predictor[2 * 16 + 1] = 777 predictor[3 * 16 + 0] = (ptr[3] + ptr[4] * 2 + ptr[5] + 2) >> 2; 778 predictor[1 * 16 + 3] = 779 predictor[2 * 16 + 2] = 780 predictor[3 * 16 + 1] = (ptr[4] + ptr[5] * 2 + ptr[6] + 2) >> 2; 781 predictor[2 * 16 + 3] = 782 predictor[3 * 16 + 2] = (ptr[5] + ptr[6] * 2 + ptr[7] + 2) >> 2; 783 predictor[3 * 16 + 3] = (ptr[6] + ptr[7] * 2 + ptr[7] + 2) >> 2; 784 785 } 786 break; 787 case B_RD_PRED: 788 { 789 790 unsigned char pp[9]; 791 792 pp[0] = Left[3]; 793 pp[1] = Left[2]; 794 pp[2] = Left[1]; 795 pp[3] = Left[0]; 796 pp[4] = top_left; 797 pp[5] = Above[0]; 798 pp[6] = Above[1]; 799 pp[7] = Above[2]; 800 pp[8] = Above[3]; 801 802 predictor[3 * 16 + 0] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2; 803 predictor[3 * 16 + 1] = 804 predictor[2 * 16 + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2; 805 predictor[3 * 16 + 2] = 806 predictor[2 * 16 + 1] = 807 predictor[1 * 16 + 0] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2; 808 predictor[3 * 16 + 3] = 809 predictor[2 * 16 + 2] = 810 predictor[1 * 16 + 1] = 811 predictor[0 * 16 + 0] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2; 812 predictor[2 * 16 + 3] = 813 predictor[1 * 16 + 2] = 814 predictor[0 * 16 + 1] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2; 815 predictor[1 * 16 + 3] = 816 predictor[0 * 16 + 2] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2; 817 predictor[0 * 16 + 3] = (pp[6] + pp[7] * 2 + pp[8] + 2) >> 2; 818 819 } 820 break; 821 case B_VR_PRED: 822 { 823 824 unsigned char pp[9]; 825 826 pp[0] = Left[3]; 827 pp[1] = Left[2]; 828 pp[2] = Left[1]; 829 pp[3] = Left[0]; 830 pp[4] = top_left; 831 pp[5] = Above[0]; 832 pp[6] = Above[1]; 833 pp[7] = Above[2]; 834 pp[8] = Above[3]; 835 836 837 predictor[3 * 16 + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2; 838 predictor[2 * 16 + 0] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2; 839 predictor[3 * 16 + 1] = 840 predictor[1 * 16 + 0] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2; 841 predictor[2 * 16 + 1] = 842 predictor[0 * 16 + 0] = (pp[4] + pp[5] + 1) >> 1; 843 predictor[3 * 16 + 2] = 844 predictor[1 * 16 + 1] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2; 845 predictor[2 * 16 + 2] = 846 predictor[0 * 16 + 1] = (pp[5] + pp[6] + 1) >> 1; 847 predictor[3 * 16 + 3] = 848 predictor[1 * 16 + 2] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2; 849 predictor[2 * 16 + 3] = 850 predictor[0 * 16 + 2] = (pp[6] + pp[7] + 1) >> 1; 851 predictor[1 * 16 + 3] = (pp[6] + pp[7] * 2 + pp[8] + 2) >> 2; 852 predictor[0 * 16 + 3] = (pp[7] + pp[8] + 1) >> 1; 853 854 } 855 break; 856 case B_VL_PRED: 857 { 858 859 unsigned char *pp = Above; 860 861 predictor[0 * 16 + 0] = (pp[0] + pp[1] + 1) >> 1; 862 predictor[1 * 16 + 0] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2; 863 predictor[2 * 16 + 0] = 864 predictor[0 * 16 + 1] = (pp[1] + pp[2] + 1) >> 1; 865 predictor[1 * 16 + 1] = 866 predictor[3 * 16 + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2; 867 predictor[2 * 16 + 1] = 868 predictor[0 * 16 + 2] = (pp[2] + pp[3] + 1) >> 1; 869 predictor[3 * 16 + 1] = 870 predictor[1 * 16 + 2] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2; 871 predictor[0 * 16 + 3] = 872 predictor[2 * 16 + 2] = (pp[3] + pp[4] + 1) >> 1; 873 predictor[1 * 16 + 3] = 874 predictor[3 * 16 + 2] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2; 875 predictor[2 * 16 + 3] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2; 876 predictor[3 * 16 + 3] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2; 877 } 878 break; 879 880 case B_HD_PRED: 881 { 882 unsigned char pp[9]; 883 pp[0] = Left[3]; 884 pp[1] = Left[2]; 885 pp[2] = Left[1]; 886 pp[3] = Left[0]; 887 pp[4] = top_left; 888 pp[5] = Above[0]; 889 pp[6] = Above[1]; 890 pp[7] = Above[2]; 891 pp[8] = Above[3]; 892 893 894 predictor[3 * 16 + 0] = (pp[0] + pp[1] + 1) >> 1; 895 predictor[3 * 16 + 1] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2; 896 predictor[2 * 16 + 0] = 897 predictor[3 * 16 + 2] = (pp[1] + pp[2] + 1) >> 1; 898 predictor[2 * 16 + 1] = 899 predictor[3 * 16 + 3] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2; 900 predictor[2 * 16 + 2] = 901 predictor[1 * 16 + 0] = (pp[2] + pp[3] + 1) >> 1; 902 predictor[2 * 16 + 3] = 903 predictor[1 * 16 + 1] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2; 904 predictor[1 * 16 + 2] = 905 predictor[0 * 16 + 0] = (pp[3] + pp[4] + 1) >> 1; 906 predictor[1 * 16 + 3] = 907 predictor[0 * 16 + 1] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2; 908 predictor[0 * 16 + 2] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2; 909 predictor[0 * 16 + 3] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2; 910 } 911 break; 912 913 914 case B_HU_PRED: 915 { 916 unsigned char *pp = Left; 917 predictor[0 * 16 + 0] = (pp[0] + pp[1] + 1) >> 1; 918 predictor[0 * 16 + 1] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2; 919 predictor[0 * 16 + 2] = 920 predictor[1 * 16 + 0] = (pp[1] + pp[2] + 1) >> 1; 921 predictor[0 * 16 + 3] = 922 predictor[1 * 16 + 1] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2; 923 predictor[1 * 16 + 2] = 924 predictor[2 * 16 + 0] = (pp[2] + pp[3] + 1) >> 1; 925 predictor[1 * 16 + 3] = 926 predictor[2 * 16 + 1] = (pp[2] + pp[3] * 2 + pp[3] + 2) >> 2; 927 predictor[2 * 16 + 2] = 928 predictor[2 * 16 + 3] = 929 predictor[3 * 16 + 0] = 930 predictor[3 * 16 + 1] = 931 predictor[3 * 16 + 2] = 932 predictor[3 * 16 + 3] = pp[3]; 933 } 934 break; 935 936 937 } 938 #else 939 (void) pbi; 940 (void) xd; 941 (void) b_mode; 942 (void) predictor; 943 (void) mb_row; 944 (void) mb_col; 945 (void) num; 946 #endif 947 } 948 949 /* copy 4 bytes from the above right down so that the 4x4 prediction modes using pixels above and 950 * to the right prediction have filled in pixels to use. 951 */ 952 void vp8mt_intra_prediction_down_copy(VP8D_COMP *pbi, MACROBLOCKD *x, int mb_row, int mb_col) 953 { 954 #if CONFIG_MULTITHREAD 955 unsigned char *above_right; /* = *(x->block[0].base_dst) + x->block[0].dst - x->block[0].dst_stride + 16; */ 956 unsigned int *src_ptr; 957 unsigned int *dst_ptr0; 958 unsigned int *dst_ptr1; 959 unsigned int *dst_ptr2; 960 961 if (pbi->common.filter_level) 962 above_right = pbi->mt_yabove_row[mb_row] + mb_col*16 + 32 +16; 963 else 964 above_right = *(x->block[0].base_dst) + x->block[0].dst - x->block[0].dst_stride + 16; 965 966 src_ptr = (unsigned int *)above_right; 967 /*dst_ptr0 = (unsigned int *)(above_right + 4 * x->block[0].dst_stride); 968 dst_ptr1 = (unsigned int *)(above_right + 8 * x->block[0].dst_stride); 969 dst_ptr2 = (unsigned int *)(above_right + 12 * x->block[0].dst_stride);*/ 970 dst_ptr0 = (unsigned int *)(*(x->block[0].base_dst) + x->block[0].dst + 16 + 3 * x->block[0].dst_stride); 971 dst_ptr1 = (unsigned int *)(*(x->block[0].base_dst) + x->block[0].dst + 16 + 7 * x->block[0].dst_stride); 972 dst_ptr2 = (unsigned int *)(*(x->block[0].base_dst) + x->block[0].dst + 16 + 11 * x->block[0].dst_stride); 973 *dst_ptr0 = *src_ptr; 974 *dst_ptr1 = *src_ptr; 975 *dst_ptr2 = *src_ptr; 976 #else 977 (void) pbi; 978 (void) x; 979 (void) mb_row; 980 (void) mb_col; 981 #endif 982 } 983