IntraPred.cs
1 using Ryujinx.Graphics.Nvdec.Vp9.Common; 2 3 namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp 4 { 5 internal static class IntraPred 6 { 7 private static unsafe ref byte Dst(byte* dst, int stride, int x, int y) 8 { 9 return ref dst[x + y * stride]; 10 } 11 12 private static unsafe ref ushort Dst(ushort* dst, int stride, int x, int y) 13 { 14 return ref dst[x + y * stride]; 15 } 16 17 private static byte Avg3(byte a, byte b, byte c) 18 { 19 return (byte)((a + 2 * b + c + 2) >> 2); 20 } 21 22 private static ushort Avg3(ushort a, ushort b, ushort c) 23 { 24 return (ushort)((a + 2 * b + c + 2) >> 2); 25 } 26 27 private static byte Avg2(byte a, byte b) 28 { 29 return (byte)((a + b + 1) >> 1); 30 } 31 32 private static ushort Avg2(ushort a, ushort b) 33 { 34 return (ushort)((a + b + 1) >> 1); 35 } 36 37 public static unsafe void D207Predictor8x8(byte* dst, int stride, byte* above, byte* left) 38 { 39 D207Predictor(dst, stride, 8, above, left); 40 } 41 42 public static unsafe void D207Predictor16x16(byte* dst, int stride, byte* above, byte* left) 43 { 44 D207Predictor(dst, stride, 16, above, left); 45 } 46 47 public static unsafe void D207Predictor32x32(byte* dst, int stride, byte* above, byte* left) 48 { 49 D207Predictor(dst, stride, 32, above, left); 50 } 51 52 private static unsafe void D207Predictor(byte* dst, int stride, int bs, byte* above, byte* left) 53 { 54 int r, c; 55 // First column 56 for (r = 0; r < bs - 1; ++r) 57 { 58 dst[r * stride] = Avg2(left[r], left[r + 1]); 59 } 60 61 dst[(bs - 1) * stride] = left[bs - 1]; 62 dst++; 63 64 // Second column 65 for (r = 0; r < bs - 2; ++r) 66 { 67 dst[r * stride] = Avg3(left[r], left[r + 1], left[r + 2]); 68 } 69 70 dst[(bs - 2) * stride] = Avg3(left[bs - 2], left[bs - 1], left[bs - 1]); 71 dst[(bs - 1) * stride] = left[bs - 1]; 72 dst++; 73 74 // Rest of last row 75 for (c = 0; c < bs - 2; ++c) 76 { 77 dst[(bs - 1) * stride + c] = left[bs - 1]; 78 } 79 80 for (r = bs - 2; r >= 0; --r) 81 { 82 for (c = 0; c < bs - 2; ++c) 83 { 84 dst[r * stride + c] = dst[(r + 1) * stride + c - 2]; 85 } 86 } 87 } 88 89 public static unsafe void D63Predictor8x8(byte* dst, int stride, byte* above, byte* left) 90 { 91 D63Predictor(dst, stride, 8, above, left); 92 } 93 94 public static unsafe void D63Predictor16x16(byte* dst, int stride, byte* above, byte* left) 95 { 96 D63Predictor(dst, stride, 16, above, left); 97 } 98 99 public static unsafe void D63Predictor32x32(byte* dst, int stride, byte* above, byte* left) 100 { 101 D63Predictor(dst, stride, 32, above, left); 102 } 103 104 private static unsafe void D63Predictor(byte* dst, int stride, int bs, byte* above, byte* left) 105 { 106 int r, c; 107 int size; 108 for (c = 0; c < bs; ++c) 109 { 110 dst[c] = Avg2(above[c], above[c + 1]); 111 dst[stride + c] = Avg3(above[c], above[c + 1], above[c + 2]); 112 } 113 for (r = 2, size = bs - 2; r < bs; r += 2, --size) 114 { 115 MemoryUtil.Copy(dst + (r + 0) * stride, dst + (r >> 1), size); 116 MemoryUtil.Fill(dst + (r + 0) * stride + size, above[bs - 1], bs - size); 117 MemoryUtil.Copy(dst + (r + 1) * stride, dst + stride + (r >> 1), size); 118 MemoryUtil.Fill(dst + (r + 1) * stride + size, above[bs - 1], bs - size); 119 } 120 } 121 122 public static unsafe void D45Predictor8x8(byte* dst, int stride, byte* above, byte* left) 123 { 124 D45Predictor(dst, stride, 8, above, left); 125 } 126 127 public static unsafe void D45Predictor16x16(byte* dst, int stride, byte* above, byte* left) 128 { 129 D45Predictor(dst, stride, 16, above, left); 130 } 131 132 public static unsafe void D45Predictor32x32(byte* dst, int stride, byte* above, byte* left) 133 { 134 D45Predictor(dst, stride, 32, above, left); 135 } 136 137 private static unsafe void D45Predictor(byte* dst, int stride, int bs, byte* above, byte* left) 138 { 139 byte aboveRight = above[bs - 1]; 140 byte* dstRow0 = dst; 141 int x, size; 142 143 for (x = 0; x < bs - 1; ++x) 144 { 145 dst[x] = Avg3(above[x], above[x + 1], above[x + 2]); 146 } 147 dst[bs - 1] = aboveRight; 148 dst += stride; 149 for (x = 1, size = bs - 2; x < bs; ++x, --size) 150 { 151 MemoryUtil.Copy(dst, dstRow0 + x, size); 152 MemoryUtil.Fill(dst + size, aboveRight, x + 1); 153 dst += stride; 154 } 155 } 156 157 public static unsafe void D117Predictor8x8(byte* dst, int stride, byte* above, byte* left) 158 { 159 D117Predictor(dst, stride, 8, above, left); 160 } 161 162 public static unsafe void D117Predictor16x16(byte* dst, int stride, byte* above, byte* left) 163 { 164 D117Predictor(dst, stride, 16, above, left); 165 } 166 167 public static unsafe void D117Predictor32x32(byte* dst, int stride, byte* above, byte* left) 168 { 169 D117Predictor(dst, stride, 32, above, left); 170 } 171 172 private static unsafe void D117Predictor(byte* dst, int stride, int bs, byte* above, byte* left) 173 { 174 int r, c; 175 176 // First row 177 for (c = 0; c < bs; c++) 178 { 179 dst[c] = Avg2(above[c - 1], above[c]); 180 } 181 182 dst += stride; 183 184 // Second row 185 dst[0] = Avg3(left[0], above[-1], above[0]); 186 for (c = 1; c < bs; c++) 187 { 188 dst[c] = Avg3(above[c - 2], above[c - 1], above[c]); 189 } 190 191 dst += stride; 192 193 // The rest of first col 194 dst[0] = Avg3(above[-1], left[0], left[1]); 195 for (r = 3; r < bs; ++r) 196 { 197 dst[(r - 2) * stride] = Avg3(left[r - 3], left[r - 2], left[r - 1]); 198 } 199 200 // The rest of the block 201 for (r = 2; r < bs; ++r) 202 { 203 for (c = 1; c < bs; c++) 204 { 205 dst[c] = dst[-2 * stride + c - 1]; 206 } 207 208 dst += stride; 209 } 210 } 211 212 public static unsafe void D135Predictor8x8(byte* dst, int stride, byte* above, byte* left) 213 { 214 D135Predictor(dst, stride, 8, above, left); 215 } 216 217 public static unsafe void D135Predictor16x16(byte* dst, int stride, byte* above, byte* left) 218 { 219 D135Predictor(dst, stride, 16, above, left); 220 } 221 222 public static unsafe void D135Predictor32x32(byte* dst, int stride, byte* above, byte* left) 223 { 224 D135Predictor(dst, stride, 32, above, left); 225 } 226 227 private static unsafe void D135Predictor(byte* dst, int stride, int bs, byte* above, byte* left) 228 { 229 int i; 230 byte* border = stackalloc byte[32 + 32 - 1]; // outer border from bottom-left to top-right 231 232 // Dst(dst, stride, bs, bs - 2)[0], i.e., border starting at bottom-left 233 for (i = 0; i < bs - 2; ++i) 234 { 235 border[i] = Avg3(left[bs - 3 - i], left[bs - 2 - i], left[bs - 1 - i]); 236 } 237 border[bs - 2] = Avg3(above[-1], left[0], left[1]); 238 border[bs - 1] = Avg3(left[0], above[-1], above[0]); 239 border[bs - 0] = Avg3(above[-1], above[0], above[1]); 240 // dst[0][2, size), i.e., remaining top border ascending 241 for (i = 0; i < bs - 2; ++i) 242 { 243 border[bs + 1 + i] = Avg3(above[i], above[i + 1], above[i + 2]); 244 } 245 246 for (i = 0; i < bs; ++i) 247 { 248 MemoryUtil.Copy(dst + i * stride, border + bs - 1 - i, bs); 249 } 250 } 251 252 public static unsafe void D153Predictor8x8(byte* dst, int stride, byte* above, byte* left) 253 { 254 D153Predictor(dst, stride, 8, above, left); 255 } 256 257 public static unsafe void D153Predictor16x16(byte* dst, int stride, byte* above, byte* left) 258 { 259 D153Predictor(dst, stride, 16, above, left); 260 } 261 262 public static unsafe void D153Predictor32x32(byte* dst, int stride, byte* above, byte* left) 263 { 264 D153Predictor(dst, stride, 32, above, left); 265 } 266 267 private static unsafe void D153Predictor(byte* dst, int stride, int bs, byte* above, byte* left) 268 { 269 int r, c; 270 dst[0] = Avg2(above[-1], left[0]); 271 for (r = 1; r < bs; r++) 272 { 273 dst[r * stride] = Avg2(left[r - 1], left[r]); 274 } 275 276 dst++; 277 278 dst[0] = Avg3(left[0], above[-1], above[0]); 279 dst[stride] = Avg3(above[-1], left[0], left[1]); 280 for (r = 2; r < bs; r++) 281 { 282 dst[r * stride] = Avg3(left[r - 2], left[r - 1], left[r]); 283 } 284 285 dst++; 286 287 for (c = 0; c < bs - 2; c++) 288 { 289 dst[c] = Avg3(above[c - 1], above[c], above[c + 1]); 290 } 291 292 dst += stride; 293 294 for (r = 1; r < bs; ++r) 295 { 296 for (c = 0; c < bs - 2; c++) 297 { 298 dst[c] = dst[-stride + c - 2]; 299 } 300 301 dst += stride; 302 } 303 } 304 305 public static unsafe void VPredictor4x4(byte* dst, int stride, byte* above, byte* left) 306 { 307 VPredictor(dst, stride, 4, above, left); 308 } 309 310 public static unsafe void VPredictor8x8(byte* dst, int stride, byte* above, byte* left) 311 { 312 VPredictor(dst, stride, 8, above, left); 313 } 314 315 public static unsafe void VPredictor16x16(byte* dst, int stride, byte* above, byte* left) 316 { 317 VPredictor(dst, stride, 16, above, left); 318 } 319 320 public static unsafe void VPredictor32x32(byte* dst, int stride, byte* above, byte* left) 321 { 322 VPredictor(dst, stride, 32, above, left); 323 } 324 325 private static unsafe void VPredictor(byte* dst, int stride, int bs, byte* above, byte* left) 326 { 327 int r; 328 329 for (r = 0; r < bs; r++) 330 { 331 MemoryUtil.Copy(dst, above, bs); 332 dst += stride; 333 } 334 } 335 336 public static unsafe void HPredictor4x4(byte* dst, int stride, byte* above, byte* left) 337 { 338 HPredictor(dst, stride, 4, above, left); 339 } 340 341 public static unsafe void HPredictor8x8(byte* dst, int stride, byte* above, byte* left) 342 { 343 HPredictor(dst, stride, 8, above, left); 344 } 345 346 public static unsafe void HPredictor16x16(byte* dst, int stride, byte* above, byte* left) 347 { 348 HPredictor(dst, stride, 16, above, left); 349 } 350 351 public static unsafe void HPredictor32x32(byte* dst, int stride, byte* above, byte* left) 352 { 353 HPredictor(dst, stride, 32, above, left); 354 } 355 356 private static unsafe void HPredictor(byte* dst, int stride, int bs, byte* above, byte* left) 357 { 358 int r; 359 360 for (r = 0; r < bs; r++) 361 { 362 MemoryUtil.Fill(dst, left[r], bs); 363 dst += stride; 364 } 365 } 366 367 public static unsafe void TMPredictor4x4(byte* dst, int stride, byte* above, byte* left) 368 { 369 TMPredictor(dst, stride, 4, above, left); 370 } 371 372 public static unsafe void TMPredictor8x8(byte* dst, int stride, byte* above, byte* left) 373 { 374 TMPredictor(dst, stride, 8, above, left); 375 } 376 377 public static unsafe void TMPredictor16x16(byte* dst, int stride, byte* above, byte* left) 378 { 379 TMPredictor(dst, stride, 16, above, left); 380 } 381 382 public static unsafe void TMPredictor32x32(byte* dst, int stride, byte* above, byte* left) 383 { 384 TMPredictor(dst, stride, 32, above, left); 385 } 386 387 private static unsafe void TMPredictor(byte* dst, int stride, int bs, byte* above, byte* left) 388 { 389 int r, c; 390 int yTopLeft = above[-1]; 391 392 for (r = 0; r < bs; r++) 393 { 394 for (c = 0; c < bs; c++) 395 { 396 dst[c] = BitUtils.ClipPixel(left[r] + above[c] - yTopLeft); 397 } 398 399 dst += stride; 400 } 401 } 402 403 public static unsafe void Dc128Predictor4x4(byte* dst, int stride, byte* above, byte* left) 404 { 405 Dc128Predictor(dst, stride, 4, above, left); 406 } 407 408 public static unsafe void Dc128Predictor8x8(byte* dst, int stride, byte* above, byte* left) 409 { 410 Dc128Predictor(dst, stride, 8, above, left); 411 } 412 413 public static unsafe void Dc128Predictor16x16(byte* dst, int stride, byte* above, byte* left) 414 { 415 Dc128Predictor(dst, stride, 16, above, left); 416 } 417 418 public static unsafe void Dc128Predictor32x32(byte* dst, int stride, byte* above, byte* left) 419 { 420 Dc128Predictor(dst, stride, 32, above, left); 421 } 422 423 private static unsafe void Dc128Predictor(byte* dst, int stride, int bs, byte* above, byte* left) 424 { 425 int r; 426 427 for (r = 0; r < bs; r++) 428 { 429 MemoryUtil.Fill(dst, (byte)128, bs); 430 dst += stride; 431 } 432 } 433 434 public static unsafe void DcLeftPredictor4x4(byte* dst, int stride, byte* above, byte* left) 435 { 436 DcLeftPredictor(dst, stride, 4, above, left); 437 } 438 439 public static unsafe void DcLeftPredictor8x8(byte* dst, int stride, byte* above, byte* left) 440 { 441 DcLeftPredictor(dst, stride, 8, above, left); 442 } 443 444 public static unsafe void DcLeftPredictor16x16(byte* dst, int stride, byte* above, byte* left) 445 { 446 DcLeftPredictor(dst, stride, 16, above, left); 447 } 448 449 public static unsafe void DcLeftPredictor32x32(byte* dst, int stride, byte* above, byte* left) 450 { 451 DcLeftPredictor(dst, stride, 32, above, left); 452 } 453 454 private static unsafe void DcLeftPredictor(byte* dst, int stride, int bs, byte* above, byte* left) 455 { 456 int i, r, expectedDc, sum = 0; 457 458 for (i = 0; i < bs; i++) 459 { 460 sum += left[i]; 461 } 462 463 expectedDc = (sum + (bs >> 1)) / bs; 464 465 for (r = 0; r < bs; r++) 466 { 467 MemoryUtil.Fill(dst, (byte)expectedDc, bs); 468 dst += stride; 469 } 470 } 471 472 public static unsafe void DcTopPredictor4x4(byte* dst, int stride, byte* above, byte* left) 473 { 474 DcTopPredictor(dst, stride, 4, above, left); 475 } 476 477 public static unsafe void DcTopPredictor8x8(byte* dst, int stride, byte* above, byte* left) 478 { 479 DcTopPredictor(dst, stride, 8, above, left); 480 } 481 482 public static unsafe void DcTopPredictor16x16(byte* dst, int stride, byte* above, byte* left) 483 { 484 DcTopPredictor(dst, stride, 16, above, left); 485 } 486 487 public static unsafe void DcTopPredictor32x32(byte* dst, int stride, byte* above, byte* left) 488 { 489 DcTopPredictor(dst, stride, 32, above, left); 490 } 491 492 private static unsafe void DcTopPredictor(byte* dst, int stride, int bs, byte* above, byte* left) 493 { 494 int i, r, expectedDc, sum = 0; 495 496 for (i = 0; i < bs; i++) 497 { 498 sum += above[i]; 499 } 500 501 expectedDc = (sum + (bs >> 1)) / bs; 502 503 for (r = 0; r < bs; r++) 504 { 505 MemoryUtil.Fill(dst, (byte)expectedDc, bs); 506 dst += stride; 507 } 508 } 509 510 public static unsafe void DcPredictor4x4(byte* dst, int stride, byte* above, byte* left) 511 { 512 DcPredictor(dst, stride, 4, above, left); 513 } 514 515 public static unsafe void DcPredictor8x8(byte* dst, int stride, byte* above, byte* left) 516 { 517 DcPredictor(dst, stride, 8, above, left); 518 } 519 520 public static unsafe void DcPredictor16x16(byte* dst, int stride, byte* above, byte* left) 521 { 522 DcPredictor(dst, stride, 16, above, left); 523 } 524 525 public static unsafe void DcPredictor32x32(byte* dst, int stride, byte* above, byte* left) 526 { 527 DcPredictor(dst, stride, 32, above, left); 528 } 529 530 private static unsafe void DcPredictor(byte* dst, int stride, int bs, byte* above, byte* left) 531 { 532 int i, r, expectedDc, sum = 0; 533 int count = 2 * bs; 534 535 for (i = 0; i < bs; i++) 536 { 537 sum += above[i]; 538 sum += left[i]; 539 } 540 541 expectedDc = (sum + (count >> 1)) / count; 542 543 for (r = 0; r < bs; r++) 544 { 545 MemoryUtil.Fill(dst, (byte)expectedDc, bs); 546 dst += stride; 547 } 548 } 549 550 public static unsafe void HePredictor4x4(byte* dst, int stride, byte* above, byte* left) 551 { 552 byte h = above[-1]; 553 byte I = left[0]; 554 byte j = left[1]; 555 byte k = left[2]; 556 byte l = left[3]; 557 558 MemoryUtil.Fill(dst + stride * 0, Avg3(h, I, j), 4); 559 MemoryUtil.Fill(dst + stride * 1, Avg3(I, j, k), 4); 560 MemoryUtil.Fill(dst + stride * 2, Avg3(j, k, l), 4); 561 MemoryUtil.Fill(dst + stride * 3, Avg3(k, l, l), 4); 562 } 563 564 public static unsafe void VePredictor4x4(byte* dst, int stride, byte* above, byte* left) 565 { 566 byte h = above[-1]; 567 byte I = above[0]; 568 byte j = above[1]; 569 byte k = above[2]; 570 byte l = above[3]; 571 byte m = above[4]; 572 573 dst[0] = Avg3(h, I, j); 574 dst[1] = Avg3(I, j, k); 575 dst[2] = Avg3(j, k, l); 576 dst[3] = Avg3(k, l, m); 577 MemoryUtil.Copy(dst + stride * 1, dst, 4); 578 MemoryUtil.Copy(dst + stride * 2, dst, 4); 579 MemoryUtil.Copy(dst + stride * 3, dst, 4); 580 } 581 582 public static unsafe void D207Predictor4x4(byte* dst, int stride, byte* above, byte* left) 583 { 584 byte I = left[0]; 585 byte j = left[1]; 586 byte k = left[2]; 587 byte l = left[3]; 588 Dst(dst, stride, 0, 0) = Avg2(I, j); 589 Dst(dst, stride, 2, 0) = Dst(dst, stride, 0, 1) = Avg2(j, k); 590 Dst(dst, stride, 2, 1) = Dst(dst, stride, 0, 2) = Avg2(k, l); 591 Dst(dst, stride, 1, 0) = Avg3(I, j, k); 592 Dst(dst, stride, 3, 0) = Dst(dst, stride, 1, 1) = Avg3(j, k, l); 593 Dst(dst, stride, 3, 1) = Dst(dst, stride, 1, 2) = Avg3(k, l, l); 594 Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 0, 3) = Dst(dst, stride, 1, 3) = Dst(dst, stride, 2, 3) = Dst(dst, stride, 3, 3) = l; 595 } 596 597 public static unsafe void D63Predictor4x4(byte* dst, int stride, byte* above, byte* left) 598 { 599 byte a = above[0]; 600 byte b = above[1]; 601 byte c = above[2]; 602 byte d = above[3]; 603 byte e = above[4]; 604 byte f = above[5]; 605 byte g = above[6]; 606 Dst(dst, stride, 0, 0) = Avg2(a, b); 607 Dst(dst, stride, 1, 0) = Dst(dst, stride, 0, 2) = Avg2(b, c); 608 Dst(dst, stride, 2, 0) = Dst(dst, stride, 1, 2) = Avg2(c, d); 609 Dst(dst, stride, 3, 0) = Dst(dst, stride, 2, 2) = Avg2(d, e); 610 Dst(dst, stride, 3, 2) = Avg2(e, f); // Differs from vp8 611 612 Dst(dst, stride, 0, 1) = Avg3(a, b, c); 613 Dst(dst, stride, 1, 1) = Dst(dst, stride, 0, 3) = Avg3(b, c, d); 614 Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 3) = Avg3(c, d, e); 615 Dst(dst, stride, 3, 1) = Dst(dst, stride, 2, 3) = Avg3(d, e, f); 616 Dst(dst, stride, 3, 3) = Avg3(e, f, g); // Differs from vp8 617 } 618 619 public static unsafe void D63ePredictor4x4(byte* dst, int stride, byte* above, byte* left) 620 { 621 byte a = above[0]; 622 byte b = above[1]; 623 byte c = above[2]; 624 byte d = above[3]; 625 byte e = above[4]; 626 byte f = above[5]; 627 byte g = above[6]; 628 byte h = above[7]; 629 Dst(dst, stride, 0, 0) = Avg2(a, b); 630 Dst(dst, stride, 1, 0) = Dst(dst, stride, 0, 2) = Avg2(b, c); 631 Dst(dst, stride, 2, 0) = Dst(dst, stride, 1, 2) = Avg2(c, d); 632 Dst(dst, stride, 3, 0) = Dst(dst, stride, 2, 2) = Avg2(d, e); 633 Dst(dst, stride, 3, 2) = Avg3(e, f, g); 634 635 Dst(dst, stride, 0, 1) = Avg3(a, b, c); 636 Dst(dst, stride, 1, 1) = Dst(dst, stride, 0, 3) = Avg3(b, c, d); 637 Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 3) = Avg3(c, d, e); 638 Dst(dst, stride, 3, 1) = Dst(dst, stride, 2, 3) = Avg3(d, e, f); 639 Dst(dst, stride, 3, 3) = Avg3(f, g, h); 640 } 641 642 public static unsafe void D45Predictor4x4(byte* dst, int stride, byte* above, byte* left) 643 { 644 byte a = above[0]; 645 byte b = above[1]; 646 byte c = above[2]; 647 byte d = above[3]; 648 byte e = above[4]; 649 byte f = above[5]; 650 byte g = above[6]; 651 byte h = above[7]; 652 Dst(dst, stride, 0, 0) = Avg3(a, b, c); 653 Dst(dst, stride, 1, 0) = Dst(dst, stride, 0, 1) = Avg3(b, c, d); 654 Dst(dst, stride, 2, 0) = Dst(dst, stride, 1, 1) = Dst(dst, stride, 0, 2) = Avg3(c, d, e); 655 Dst(dst, stride, 3, 0) = Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 2) = Dst(dst, stride, 0, 3) = Avg3(d, e, f); 656 Dst(dst, stride, 3, 1) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 1, 3) = Avg3(e, f, g); 657 Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 3) = Avg3(f, g, h); 658 Dst(dst, stride, 3, 3) = h; // differs from vp8 659 } 660 661 public static unsafe void D45ePredictor4x4(byte* dst, int stride, byte* above, byte* left) 662 { 663 byte a = above[0]; 664 byte b = above[1]; 665 byte c = above[2]; 666 byte d = above[3]; 667 byte e = above[4]; 668 byte f = above[5]; 669 byte g = above[6]; 670 byte h = above[7]; 671 Dst(dst, stride, 0, 0) = Avg3(a, b, c); 672 Dst(dst, stride, 1, 0) = Dst(dst, stride, 0, 1) = Avg3(b, c, d); 673 Dst(dst, stride, 2, 0) = Dst(dst, stride, 1, 1) = Dst(dst, stride, 0, 2) = Avg3(c, d, e); 674 Dst(dst, stride, 3, 0) = Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 2) = Dst(dst, stride, 0, 3) = Avg3(d, e, f); 675 Dst(dst, stride, 3, 1) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 1, 3) = Avg3(e, f, g); 676 Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 3) = Avg3(f, g, h); 677 Dst(dst, stride, 3, 3) = Avg3(g, h, h); 678 } 679 680 public static unsafe void D117Predictor4x4(byte* dst, int stride, byte* above, byte* left) 681 { 682 byte I = left[0]; 683 byte j = left[1]; 684 byte k = left[2]; 685 byte x = above[-1]; 686 byte a = above[0]; 687 byte b = above[1]; 688 byte c = above[2]; 689 byte d = above[3]; 690 Dst(dst, stride, 0, 0) = Dst(dst, stride, 1, 2) = Avg2(x, a); 691 Dst(dst, stride, 1, 0) = Dst(dst, stride, 2, 2) = Avg2(a, b); 692 Dst(dst, stride, 2, 0) = Dst(dst, stride, 3, 2) = Avg2(b, c); 693 Dst(dst, stride, 3, 0) = Avg2(c, d); 694 695 Dst(dst, stride, 0, 3) = Avg3(k, j, I); 696 Dst(dst, stride, 0, 2) = Avg3(j, I, x); 697 Dst(dst, stride, 0, 1) = Dst(dst, stride, 1, 3) = Avg3(I, x, a); 698 Dst(dst, stride, 1, 1) = Dst(dst, stride, 2, 3) = Avg3(x, a, b); 699 Dst(dst, stride, 2, 1) = Dst(dst, stride, 3, 3) = Avg3(a, b, c); 700 Dst(dst, stride, 3, 1) = Avg3(b, c, d); 701 } 702 703 public static unsafe void D135Predictor4x4(byte* dst, int stride, byte* above, byte* left) 704 { 705 byte I = left[0]; 706 byte j = left[1]; 707 byte k = left[2]; 708 byte l = left[3]; 709 byte x = above[-1]; 710 byte a = above[0]; 711 byte b = above[1]; 712 byte c = above[2]; 713 byte d = above[3]; 714 Dst(dst, stride, 0, 3) = Avg3(j, k, l); 715 Dst(dst, stride, 1, 3) = Dst(dst, stride, 0, 2) = Avg3(I, j, k); 716 Dst(dst, stride, 2, 3) = Dst(dst, stride, 1, 2) = Dst(dst, stride, 0, 1) = Avg3(x, I, j); 717 Dst(dst, stride, 3, 3) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 1, 1) = Dst(dst, stride, 0, 0) = Avg3(a, x, I); 718 Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 0) = Avg3(b, a, x); 719 Dst(dst, stride, 3, 1) = Dst(dst, stride, 2, 0) = Avg3(c, b, a); 720 Dst(dst, stride, 3, 0) = Avg3(d, c, b); 721 } 722 723 public static unsafe void D153Predictor4x4(byte* dst, int stride, byte* above, byte* left) 724 { 725 byte I = left[0]; 726 byte j = left[1]; 727 byte k = left[2]; 728 byte l = left[3]; 729 byte x = above[-1]; 730 byte a = above[0]; 731 byte b = above[1]; 732 byte c = above[2]; 733 Dst(dst, stride, 0, 0) = Dst(dst, stride, 2, 1) = Avg2(I, x); 734 Dst(dst, stride, 0, 1) = Dst(dst, stride, 2, 2) = Avg2(j, I); 735 Dst(dst, stride, 0, 2) = Dst(dst, stride, 2, 3) = Avg2(k, j); 736 Dst(dst, stride, 0, 3) = Avg2(l, k); 737 738 Dst(dst, stride, 3, 0) = Avg3(a, b, c); 739 Dst(dst, stride, 2, 0) = Avg3(x, a, b); 740 Dst(dst, stride, 1, 0) = Dst(dst, stride, 3, 1) = Avg3(I, x, a); 741 Dst(dst, stride, 1, 1) = Dst(dst, stride, 3, 2) = Avg3(j, I, x); 742 Dst(dst, stride, 1, 2) = Dst(dst, stride, 3, 3) = Avg3(k, j, I); 743 Dst(dst, stride, 1, 3) = Avg3(l, k, j); 744 } 745 746 public static unsafe void HighbdD207Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) 747 { 748 HighbdD207Predictor(dst, stride, 8, above, left, bd); 749 } 750 751 public static unsafe void HighbdD207Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) 752 { 753 HighbdD207Predictor(dst, stride, 16, above, left, bd); 754 } 755 756 public static unsafe void HighbdD207Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) 757 { 758 HighbdD207Predictor(dst, stride, 32, above, left, bd); 759 } 760 761 private static unsafe void HighbdD207Predictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) 762 { 763 int r, c; 764 765 // First column. 766 for (r = 0; r < bs - 1; ++r) 767 { 768 dst[r * stride] = Avg2(left[r], left[r + 1]); 769 } 770 dst[(bs - 1) * stride] = left[bs - 1]; 771 dst++; 772 773 // Second column. 774 for (r = 0; r < bs - 2; ++r) 775 { 776 dst[r * stride] = Avg3(left[r], left[r + 1], left[r + 2]); 777 } 778 dst[(bs - 2) * stride] = Avg3(left[bs - 2], left[bs - 1], left[bs - 1]); 779 dst[(bs - 1) * stride] = left[bs - 1]; 780 dst++; 781 782 // Rest of last row. 783 for (c = 0; c < bs - 2; ++c) 784 { 785 dst[(bs - 1) * stride + c] = left[bs - 1]; 786 } 787 788 for (r = bs - 2; r >= 0; --r) 789 { 790 for (c = 0; c < bs - 2; ++c) 791 { 792 dst[r * stride + c] = dst[(r + 1) * stride + c - 2]; 793 } 794 } 795 } 796 797 public static unsafe void HighbdD63Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) 798 { 799 HighbdD63Predictor(dst, stride, 8, above, left, bd); 800 } 801 802 public static unsafe void HighbdD63Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) 803 { 804 HighbdD63Predictor(dst, stride, 16, above, left, bd); 805 } 806 807 public static unsafe void HighbdD63Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) 808 { 809 HighbdD63Predictor(dst, stride, 32, above, left, bd); 810 } 811 812 private static unsafe void HighbdD63Predictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) 813 { 814 int r, c; 815 int size; 816 for (c = 0; c < bs; ++c) 817 { 818 dst[c] = Avg2(above[c], above[c + 1]); 819 dst[stride + c] = Avg3(above[c], above[c + 1], above[c + 2]); 820 } 821 for (r = 2, size = bs - 2; r < bs; r += 2, --size) 822 { 823 MemoryUtil.Copy(dst + (r + 0) * stride, dst + (r >> 1), size); 824 MemoryUtil.Fill(dst + (r + 0) * stride + size, above[bs - 1], bs - size); 825 MemoryUtil.Copy(dst + (r + 1) * stride, dst + stride + (r >> 1), size); 826 MemoryUtil.Fill(dst + (r + 1) * stride + size, above[bs - 1], bs - size); 827 } 828 } 829 830 public static unsafe void HighbdD45Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) 831 { 832 HighbdD45Predictor(dst, stride, 8, above, left, bd); 833 } 834 835 public static unsafe void HighbdD45Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) 836 { 837 HighbdD45Predictor(dst, stride, 16, above, left, bd); 838 } 839 840 public static unsafe void HighbdD45Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) 841 { 842 HighbdD45Predictor(dst, stride, 32, above, left, bd); 843 } 844 845 private static unsafe void HighbdD45Predictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) 846 { 847 ushort aboveRight = above[bs - 1]; 848 ushort* dstRow0 = dst; 849 int x, size; 850 851 for (x = 0; x < bs - 1; ++x) 852 { 853 dst[x] = Avg3(above[x], above[x + 1], above[x + 2]); 854 } 855 dst[bs - 1] = aboveRight; 856 dst += stride; 857 for (x = 1, size = bs - 2; x < bs; ++x, --size) 858 { 859 MemoryUtil.Copy(dst, dstRow0 + x, size); 860 MemoryUtil.Fill(dst + size, aboveRight, x + 1); 861 dst += stride; 862 } 863 } 864 865 public static unsafe void HighbdD117Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) 866 { 867 HighbdD117Predictor(dst, stride, 8, above, left, bd); 868 } 869 870 public static unsafe void HighbdD117Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) 871 { 872 HighbdD117Predictor(dst, stride, 16, above, left, bd); 873 } 874 875 public static unsafe void HighbdD117Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) 876 { 877 HighbdD117Predictor(dst, stride, 32, above, left, bd); 878 } 879 880 private static unsafe void HighbdD117Predictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) 881 { 882 int r, c; 883 884 // First row 885 for (c = 0; c < bs; c++) 886 { 887 dst[c] = Avg2(above[c - 1], above[c]); 888 } 889 890 dst += stride; 891 892 // Second row 893 dst[0] = Avg3(left[0], above[-1], above[0]); 894 for (c = 1; c < bs; c++) 895 { 896 dst[c] = Avg3(above[c - 2], above[c - 1], above[c]); 897 } 898 899 dst += stride; 900 901 // The rest of first col 902 dst[0] = Avg3(above[-1], left[0], left[1]); 903 for (r = 3; r < bs; ++r) 904 { 905 dst[(r - 2) * stride] = Avg3(left[r - 3], left[r - 2], left[r - 1]); 906 } 907 908 // The rest of the block 909 for (r = 2; r < bs; ++r) 910 { 911 for (c = 1; c < bs; c++) 912 { 913 dst[c] = dst[-2 * stride + c - 1]; 914 } 915 916 dst += stride; 917 } 918 } 919 920 public static unsafe void HighbdD135Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) 921 { 922 HighbdD135Predictor(dst, stride, 8, above, left, bd); 923 } 924 925 public static unsafe void HighbdD135Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) 926 { 927 HighbdD135Predictor(dst, stride, 16, above, left, bd); 928 } 929 930 public static unsafe void HighbdD135Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) 931 { 932 HighbdD135Predictor(dst, stride, 32, above, left, bd); 933 } 934 935 private static unsafe void HighbdD135Predictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) 936 { 937 int i; 938 ushort* border = stackalloc ushort[32 + 32 - 1]; // Outer border from bottom-left to top-right 939 940 // Dst(dst, stride, bs, bs - 2)[0], i.e., border starting at bottom-left 941 for (i = 0; i < bs - 2; ++i) 942 { 943 border[i] = Avg3(left[bs - 3 - i], left[bs - 2 - i], left[bs - 1 - i]); 944 } 945 border[bs - 2] = Avg3(above[-1], left[0], left[1]); 946 border[bs - 1] = Avg3(left[0], above[-1], above[0]); 947 border[bs - 0] = Avg3(above[-1], above[0], above[1]); 948 // dst[0][2, size), i.e., remaining top border ascending 949 for (i = 0; i < bs - 2; ++i) 950 { 951 border[bs + 1 + i] = Avg3(above[i], above[i + 1], above[i + 2]); 952 } 953 954 for (i = 0; i < bs; ++i) 955 { 956 MemoryUtil.Copy(dst + i * stride, border + bs - 1 - i, bs); 957 } 958 } 959 960 public static unsafe void HighbdD153Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) 961 { 962 HighbdD153Predictor(dst, stride, 8, above, left, bd); 963 } 964 965 public static unsafe void HighbdD153Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) 966 { 967 HighbdD153Predictor(dst, stride, 16, above, left, bd); 968 } 969 970 public static unsafe void HighbdD153Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) 971 { 972 HighbdD153Predictor(dst, stride, 32, above, left, bd); 973 } 974 975 private static unsafe void HighbdD153Predictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) 976 { 977 int r, c; 978 dst[0] = Avg2(above[-1], left[0]); 979 for (r = 1; r < bs; r++) 980 { 981 dst[r * stride] = Avg2(left[r - 1], left[r]); 982 } 983 984 dst++; 985 986 dst[0] = Avg3(left[0], above[-1], above[0]); 987 dst[stride] = Avg3(above[-1], left[0], left[1]); 988 for (r = 2; r < bs; r++) 989 { 990 dst[r * stride] = Avg3(left[r - 2], left[r - 1], left[r]); 991 } 992 993 dst++; 994 995 for (c = 0; c < bs - 2; c++) 996 { 997 dst[c] = Avg3(above[c - 1], above[c], above[c + 1]); 998 } 999 1000 dst += stride; 1001 1002 for (r = 1; r < bs; ++r) 1003 { 1004 for (c = 0; c < bs - 2; c++) 1005 { 1006 dst[c] = dst[-stride + c - 2]; 1007 } 1008 1009 dst += stride; 1010 } 1011 } 1012 1013 public static unsafe void HighbdVPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1014 { 1015 HighbdVPredictor(dst, stride, 4, above, left, bd); 1016 } 1017 1018 public static unsafe void HighbdVPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1019 { 1020 HighbdVPredictor(dst, stride, 8, above, left, bd); 1021 } 1022 1023 public static unsafe void HighbdVPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1024 { 1025 HighbdVPredictor(dst, stride, 16, above, left, bd); 1026 } 1027 1028 public static unsafe void HighbdVPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1029 { 1030 HighbdVPredictor(dst, stride, 32, above, left, bd); 1031 } 1032 1033 private static unsafe void HighbdVPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) 1034 { 1035 int r; 1036 for (r = 0; r < bs; r++) 1037 { 1038 MemoryUtil.Copy(dst, above, bs); 1039 dst += stride; 1040 } 1041 } 1042 1043 public static unsafe void HighbdHPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1044 { 1045 HighbdHPredictor(dst, stride, 4, above, left, bd); 1046 } 1047 1048 public static unsafe void HighbdHPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1049 { 1050 HighbdHPredictor(dst, stride, 8, above, left, bd); 1051 } 1052 1053 public static unsafe void HighbdHPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1054 { 1055 HighbdHPredictor(dst, stride, 16, above, left, bd); 1056 } 1057 1058 public static unsafe void HighbdHPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1059 { 1060 HighbdHPredictor(dst, stride, 32, above, left, bd); 1061 } 1062 1063 private static unsafe void HighbdHPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) 1064 { 1065 int r; 1066 for (r = 0; r < bs; r++) 1067 { 1068 MemoryUtil.Fill(dst, left[r], bs); 1069 dst += stride; 1070 } 1071 } 1072 1073 public static unsafe void HighbdTMPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1074 { 1075 HighbdTMPredictor(dst, stride, 4, above, left, bd); 1076 } 1077 1078 public static unsafe void HighbdTMPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1079 { 1080 HighbdTMPredictor(dst, stride, 8, above, left, bd); 1081 } 1082 1083 public static unsafe void HighbdTMPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1084 { 1085 HighbdTMPredictor(dst, stride, 16, above, left, bd); 1086 } 1087 1088 public static unsafe void HighbdTMPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1089 { 1090 HighbdTMPredictor(dst, stride, 32, above, left, bd); 1091 } 1092 1093 private static unsafe void HighbdTMPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) 1094 { 1095 int r, c; 1096 int yTopLeft = above[-1]; 1097 1098 for (r = 0; r < bs; r++) 1099 { 1100 for (c = 0; c < bs; c++) 1101 { 1102 dst[c] = BitUtils.ClipPixelHighbd(left[r] + above[c] - yTopLeft, bd); 1103 } 1104 1105 dst += stride; 1106 } 1107 } 1108 1109 public static unsafe void HighbdDc128Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1110 { 1111 HighbdDc128Predictor(dst, stride, 4, above, left, bd); 1112 } 1113 1114 public static unsafe void HighbdDc128Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1115 { 1116 HighbdDc128Predictor(dst, stride, 8, above, left, bd); 1117 } 1118 1119 public static unsafe void HighbdDc128Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1120 { 1121 HighbdDc128Predictor(dst, stride, 16, above, left, bd); 1122 } 1123 1124 public static unsafe void HighbdDc128Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1125 { 1126 HighbdDc128Predictor(dst, stride, 32, above, left, bd); 1127 } 1128 1129 private static unsafe void HighbdDc128Predictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) 1130 { 1131 int r; 1132 1133 for (r = 0; r < bs; r++) 1134 { 1135 MemoryUtil.Fill(dst, (ushort)(128 << (bd - 8)), bs); 1136 dst += stride; 1137 } 1138 } 1139 1140 public static unsafe void HighbdDcLeftPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1141 { 1142 HighbdDcLeftPredictor(dst, stride, 4, above, left, bd); 1143 } 1144 1145 public static unsafe void HighbdDcLeftPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1146 { 1147 HighbdDcLeftPredictor(dst, stride, 8, above, left, bd); 1148 } 1149 1150 public static unsafe void HighbdDcLeftPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1151 { 1152 HighbdDcLeftPredictor(dst, stride, 16, above, left, bd); 1153 } 1154 1155 public static unsafe void HighbdDcLeftPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1156 { 1157 HighbdDcLeftPredictor(dst, stride, 32, above, left, bd); 1158 } 1159 1160 private static unsafe void HighbdDcLeftPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) 1161 { 1162 int i, r, expectedDc, sum = 0; 1163 1164 for (i = 0; i < bs; i++) 1165 { 1166 sum += left[i]; 1167 } 1168 1169 expectedDc = (sum + (bs >> 1)) / bs; 1170 1171 for (r = 0; r < bs; r++) 1172 { 1173 MemoryUtil.Fill(dst, (ushort)expectedDc, bs); 1174 dst += stride; 1175 } 1176 } 1177 1178 public static unsafe void HighbdDcTopPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1179 { 1180 HighbdDcTopPredictor(dst, stride, 4, above, left, bd); 1181 } 1182 1183 public static unsafe void HighbdDcTopPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1184 { 1185 HighbdDcTopPredictor(dst, stride, 8, above, left, bd); 1186 } 1187 1188 public static unsafe void HighbdDcTopPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1189 { 1190 HighbdDcTopPredictor(dst, stride, 16, above, left, bd); 1191 } 1192 1193 public static unsafe void HighbdDcTopPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1194 { 1195 HighbdDcTopPredictor(dst, stride, 32, above, left, bd); 1196 } 1197 1198 private static unsafe void HighbdDcTopPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) 1199 { 1200 int i, r, expectedDc, sum = 0; 1201 1202 for (i = 0; i < bs; i++) 1203 { 1204 sum += above[i]; 1205 } 1206 1207 expectedDc = (sum + (bs >> 1)) / bs; 1208 1209 for (r = 0; r < bs; r++) 1210 { 1211 MemoryUtil.Fill(dst, (ushort)expectedDc, bs); 1212 dst += stride; 1213 } 1214 } 1215 1216 public static unsafe void HighbdDcPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1217 { 1218 HighbdDcPredictor(dst, stride, 4, above, left, bd); 1219 } 1220 1221 public static unsafe void HighbdDcPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1222 { 1223 HighbdDcPredictor(dst, stride, 8, above, left, bd); 1224 } 1225 1226 public static unsafe void HighbdDcPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1227 { 1228 HighbdDcPredictor(dst, stride, 16, above, left, bd); 1229 } 1230 1231 public static unsafe void HighbdDcPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1232 { 1233 HighbdDcPredictor(dst, stride, 32, above, left, bd); 1234 } 1235 1236 private static unsafe void HighbdDcPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) 1237 { 1238 int i, r, expectedDc, sum = 0; 1239 int count = 2 * bs; 1240 1241 for (i = 0; i < bs; i++) 1242 { 1243 sum += above[i]; 1244 sum += left[i]; 1245 } 1246 1247 expectedDc = (sum + (count >> 1)) / count; 1248 1249 for (r = 0; r < bs; r++) 1250 { 1251 MemoryUtil.Fill(dst, (ushort)expectedDc, bs); 1252 dst += stride; 1253 } 1254 } 1255 1256 public static unsafe void HighbdD207Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1257 { 1258 ushort I = left[0]; 1259 ushort j = left[1]; 1260 ushort k = left[2]; 1261 ushort l = left[3]; 1262 Dst(dst, stride, 0, 0) = Avg2(I, j); 1263 Dst(dst, stride, 2, 0) = Dst(dst, stride, 0, 1) = Avg2(j, k); 1264 Dst(dst, stride, 2, 1) = Dst(dst, stride, 0, 2) = Avg2(k, l); 1265 Dst(dst, stride, 1, 0) = Avg3(I, j, k); 1266 Dst(dst, stride, 3, 0) = Dst(dst, stride, 1, 1) = Avg3(j, k, l); 1267 Dst(dst, stride, 3, 1) = Dst(dst, stride, 1, 2) = Avg3(k, l, l); 1268 Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 0, 3) = Dst(dst, stride, 1, 3) = Dst(dst, stride, 2, 3) = Dst(dst, stride, 3, 3) = l; 1269 } 1270 1271 public static unsafe void HighbdD63Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1272 { 1273 ushort a = above[0]; 1274 ushort b = above[1]; 1275 ushort c = above[2]; 1276 ushort d = above[3]; 1277 ushort e = above[4]; 1278 ushort f = above[5]; 1279 ushort g = above[6]; 1280 Dst(dst, stride, 0, 0) = Avg2(a, b); 1281 Dst(dst, stride, 1, 0) = Dst(dst, stride, 0, 2) = Avg2(b, c); 1282 Dst(dst, stride, 2, 0) = Dst(dst, stride, 1, 2) = Avg2(c, d); 1283 Dst(dst, stride, 3, 0) = Dst(dst, stride, 2, 2) = Avg2(d, e); 1284 Dst(dst, stride, 3, 2) = Avg2(e, f); // Differs from vp8 1285 1286 Dst(dst, stride, 0, 1) = Avg3(a, b, c); 1287 Dst(dst, stride, 1, 1) = Dst(dst, stride, 0, 3) = Avg3(b, c, d); 1288 Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 3) = Avg3(c, d, e); 1289 Dst(dst, stride, 3, 1) = Dst(dst, stride, 2, 3) = Avg3(d, e, f); 1290 Dst(dst, stride, 3, 3) = Avg3(e, f, g); // Differs from vp8 1291 } 1292 1293 public static unsafe void HighbdD45Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1294 { 1295 ushort a = above[0]; 1296 ushort b = above[1]; 1297 ushort c = above[2]; 1298 ushort d = above[3]; 1299 ushort e = above[4]; 1300 ushort f = above[5]; 1301 ushort g = above[6]; 1302 ushort h = above[7]; 1303 Dst(dst, stride, 0, 0) = Avg3(a, b, c); 1304 Dst(dst, stride, 1, 0) = Dst(dst, stride, 0, 1) = Avg3(b, c, d); 1305 Dst(dst, stride, 2, 0) = Dst(dst, stride, 1, 1) = Dst(dst, stride, 0, 2) = Avg3(c, d, e); 1306 Dst(dst, stride, 3, 0) = Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 2) = Dst(dst, stride, 0, 3) = Avg3(d, e, f); 1307 Dst(dst, stride, 3, 1) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 1, 3) = Avg3(e, f, g); 1308 Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 3) = Avg3(f, g, h); 1309 Dst(dst, stride, 3, 3) = h; // Differs from vp8 1310 } 1311 1312 public static unsafe void HighbdD117Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1313 { 1314 ushort I = left[0]; 1315 ushort j = left[1]; 1316 ushort k = left[2]; 1317 ushort x = above[-1]; 1318 ushort a = above[0]; 1319 ushort b = above[1]; 1320 ushort c = above[2]; 1321 ushort d = above[3]; 1322 Dst(dst, stride, 0, 0) = Dst(dst, stride, 1, 2) = Avg2(x, a); 1323 Dst(dst, stride, 1, 0) = Dst(dst, stride, 2, 2) = Avg2(a, b); 1324 Dst(dst, stride, 2, 0) = Dst(dst, stride, 3, 2) = Avg2(b, c); 1325 Dst(dst, stride, 3, 0) = Avg2(c, d); 1326 1327 Dst(dst, stride, 0, 3) = Avg3(k, j, I); 1328 Dst(dst, stride, 0, 2) = Avg3(j, I, x); 1329 Dst(dst, stride, 0, 1) = Dst(dst, stride, 1, 3) = Avg3(I, x, a); 1330 Dst(dst, stride, 1, 1) = Dst(dst, stride, 2, 3) = Avg3(x, a, b); 1331 Dst(dst, stride, 2, 1) = Dst(dst, stride, 3, 3) = Avg3(a, b, c); 1332 Dst(dst, stride, 3, 1) = Avg3(b, c, d); 1333 } 1334 1335 public static unsafe void HighbdD135Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1336 { 1337 ushort I = left[0]; 1338 ushort j = left[1]; 1339 ushort k = left[2]; 1340 ushort l = left[3]; 1341 ushort x = above[-1]; 1342 ushort a = above[0]; 1343 ushort b = above[1]; 1344 ushort c = above[2]; 1345 ushort d = above[3]; 1346 Dst(dst, stride, 0, 3) = Avg3(j, k, l); 1347 Dst(dst, stride, 1, 3) = Dst(dst, stride, 0, 2) = Avg3(I, j, k); 1348 Dst(dst, stride, 2, 3) = Dst(dst, stride, 1, 2) = Dst(dst, stride, 0, 1) = Avg3(x, I, j); 1349 Dst(dst, stride, 3, 3) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 1, 1) = Dst(dst, stride, 0, 0) = Avg3(a, x, I); 1350 Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 0) = Avg3(b, a, x); 1351 Dst(dst, stride, 3, 1) = Dst(dst, stride, 2, 0) = Avg3(c, b, a); 1352 Dst(dst, stride, 3, 0) = Avg3(d, c, b); 1353 } 1354 1355 public static unsafe void HighbdD153Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) 1356 { 1357 ushort I = left[0]; 1358 ushort j = left[1]; 1359 ushort k = left[2]; 1360 ushort l = left[3]; 1361 ushort x = above[-1]; 1362 ushort a = above[0]; 1363 ushort b = above[1]; 1364 ushort c = above[2]; 1365 1366 Dst(dst, stride, 0, 0) = Dst(dst, stride, 2, 1) = Avg2(I, x); 1367 Dst(dst, stride, 0, 1) = Dst(dst, stride, 2, 2) = Avg2(j, I); 1368 Dst(dst, stride, 0, 2) = Dst(dst, stride, 2, 3) = Avg2(k, j); 1369 Dst(dst, stride, 0, 3) = Avg2(l, k); 1370 1371 Dst(dst, stride, 3, 0) = Avg3(a, b, c); 1372 Dst(dst, stride, 2, 0) = Avg3(x, a, b); 1373 Dst(dst, stride, 1, 0) = Dst(dst, stride, 3, 1) = Avg3(I, x, a); 1374 Dst(dst, stride, 1, 1) = Dst(dst, stride, 3, 2) = Avg3(j, I, x); 1375 Dst(dst, stride, 1, 2) = Dst(dst, stride, 3, 3) = Avg3(k, j, I); 1376 Dst(dst, stride, 1, 3) = Avg3(l, k, j); 1377 } 1378 } 1379 }