/ src / Ryujinx.Graphics.Nvdec.Vp9 / Dsp / IntraPred.cs
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  }