1 /* 2 * Copyright (c) 2015 The WebM project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "./vpx_config.h" 12 #include "./vpx_dsp_rtcd.h" 13 14 #include "vpx_dsp/vpx_dsp_common.h" 15 #include "vpx_mem/vpx_mem.h" 16 17 #define DST(x, y) dst[(x) + (y) * stride] 18 #define AVG3(a, b, c) (((a) + 2 * (b) + (c) + 2) >> 2) 19 #define AVG2(a, b) (((a) + (b) + 1) >> 1) 20 21 static INLINE void d207_predictor(uint8_t *dst, ptrdiff_t stride, int bs, 22 const uint8_t *above, const uint8_t *left) { 23 int r, c; 24 (void) above; 25 // first column 26 for (r = 0; r < bs - 1; ++r) 27 dst[r * stride] = AVG2(left[r], left[r + 1]); 28 dst[(bs - 1) * stride] = left[bs - 1]; 29 dst++; 30 31 // second column 32 for (r = 0; r < bs - 2; ++r) 33 dst[r * stride] = AVG3(left[r], left[r + 1], left[r + 2]); 34 dst[(bs - 2) * stride] = AVG3(left[bs - 2], left[bs - 1], left[bs - 1]); 35 dst[(bs - 1) * stride] = left[bs - 1]; 36 dst++; 37 38 // rest of last row 39 for (c = 0; c < bs - 2; ++c) 40 dst[(bs - 1) * stride + c] = left[bs - 1]; 41 42 for (r = bs - 2; r >= 0; --r) 43 for (c = 0; c < bs - 2; ++c) 44 dst[r * stride + c] = dst[(r + 1) * stride + c - 2]; 45 } 46 47 static INLINE void d207e_predictor(uint8_t *dst, ptrdiff_t stride, int bs, 48 const uint8_t *above, const uint8_t *left) { 49 int r, c; 50 (void) above; 51 52 for (r = 0; r < bs; ++r) { 53 for (c = 0; c < bs; ++c) { 54 dst[c] = c & 1 ? AVG3(left[(c >> 1) + r], left[(c >> 1) + r + 1], 55 left[(c >> 1) + r + 2]) 56 : AVG2(left[(c >> 1) + r], left[(c >> 1) + r + 1]); 57 } 58 dst += stride; 59 } 60 } 61 62 static INLINE void d63_predictor(uint8_t *dst, ptrdiff_t stride, int bs, 63 const uint8_t *above, const uint8_t *left) { 64 int r, c; 65 int size; 66 (void)left; 67 for (c = 0; c < bs; ++c) { 68 dst[c] = AVG2(above[c], above[c + 1]); 69 dst[stride + c] = AVG3(above[c], above[c + 1], above[c + 2]); 70 } 71 for (r = 2, size = bs - 2; r < bs; r += 2, --size) { 72 memcpy(dst + (r + 0) * stride, dst + (r >> 1), size); 73 memset(dst + (r + 0) * stride + size, above[bs - 1], bs - size); 74 memcpy(dst + (r + 1) * stride, dst + stride + (r >> 1), size); 75 memset(dst + (r + 1) * stride + size, above[bs - 1], bs - size); 76 } 77 } 78 79 static INLINE void d63e_predictor(uint8_t *dst, ptrdiff_t stride, int bs, 80 const uint8_t *above, const uint8_t *left) { 81 int r, c; 82 (void) left; 83 for (r = 0; r < bs; ++r) { 84 for (c = 0; c < bs; ++c) { 85 dst[c] = r & 1 ? AVG3(above[(r >> 1) + c], above[(r >> 1) + c + 1], 86 above[(r >> 1) + c + 2]) 87 : AVG2(above[(r >> 1) + c], above[(r >> 1) + c + 1]); 88 } 89 dst += stride; 90 } 91 } 92 93 static INLINE void d45_predictor(uint8_t *dst, ptrdiff_t stride, int bs, 94 const uint8_t *above, const uint8_t *left) { 95 const uint8_t above_right = above[bs - 1]; 96 const uint8_t *const dst_row0 = dst; 97 int x, size; 98 (void)left; 99 100 for (x = 0; x < bs - 1; ++x) { 101 dst[x] = AVG3(above[x], above[x + 1], above[x + 2]); 102 } 103 dst[bs - 1] = above_right; 104 dst += stride; 105 for (x = 1, size = bs - 2; x < bs; ++x, --size) { 106 memcpy(dst, dst_row0 + x, size); 107 memset(dst + size, above_right, x + 1); 108 dst += stride; 109 } 110 } 111 112 static INLINE void d45e_predictor(uint8_t *dst, ptrdiff_t stride, int bs, 113 const uint8_t *above, const uint8_t *left) { 114 int r, c; 115 (void) left; 116 for (r = 0; r < bs; ++r) { 117 for (c = 0; c < bs; ++c) { 118 dst[c] = AVG3(above[r + c], above[r + c + 1], 119 above[r + c + 1 + (r + c + 2 < bs * 2)]); 120 } 121 dst += stride; 122 } 123 } 124 125 static INLINE void d117_predictor(uint8_t *dst, ptrdiff_t stride, int bs, 126 const uint8_t *above, const uint8_t *left) { 127 int r, c; 128 129 // first row 130 for (c = 0; c < bs; c++) 131 dst[c] = AVG2(above[c - 1], above[c]); 132 dst += stride; 133 134 // second row 135 dst[0] = AVG3(left[0], above[-1], above[0]); 136 for (c = 1; c < bs; c++) 137 dst[c] = AVG3(above[c - 2], above[c - 1], above[c]); 138 dst += stride; 139 140 // the rest of first col 141 dst[0] = AVG3(above[-1], left[0], left[1]); 142 for (r = 3; r < bs; ++r) 143 dst[(r - 2) * stride] = AVG3(left[r - 3], left[r - 2], left[r - 1]); 144 145 // the rest of the block 146 for (r = 2; r < bs; ++r) { 147 for (c = 1; c < bs; c++) 148 dst[c] = dst[-2 * stride + c - 1]; 149 dst += stride; 150 } 151 } 152 153 static INLINE void d135_predictor(uint8_t *dst, ptrdiff_t stride, int bs, 154 const uint8_t *above, const uint8_t *left) { 155 int r, c; 156 dst[0] = AVG3(left[0], above[-1], above[0]); 157 for (c = 1; c < bs; c++) 158 dst[c] = AVG3(above[c - 2], above[c - 1], above[c]); 159 160 dst[stride] = AVG3(above[-1], left[0], left[1]); 161 for (r = 2; r < bs; ++r) 162 dst[r * stride] = AVG3(left[r - 2], left[r - 1], left[r]); 163 164 dst += stride; 165 for (r = 1; r < bs; ++r) { 166 for (c = 1; c < bs; c++) 167 dst[c] = dst[-stride + c - 1]; 168 dst += stride; 169 } 170 } 171 172 static INLINE void d153_predictor(uint8_t *dst, ptrdiff_t stride, int bs, 173 const uint8_t *above, const uint8_t *left) { 174 int r, c; 175 dst[0] = AVG2(above[-1], left[0]); 176 for (r = 1; r < bs; r++) 177 dst[r * stride] = AVG2(left[r - 1], left[r]); 178 dst++; 179 180 dst[0] = AVG3(left[0], above[-1], above[0]); 181 dst[stride] = AVG3(above[-1], left[0], left[1]); 182 for (r = 2; r < bs; r++) 183 dst[r * stride] = AVG3(left[r - 2], left[r - 1], left[r]); 184 dst++; 185 186 for (c = 0; c < bs - 2; c++) 187 dst[c] = AVG3(above[c - 1], above[c], above[c + 1]); 188 dst += stride; 189 190 for (r = 1; r < bs; ++r) { 191 for (c = 0; c < bs - 2; c++) 192 dst[c] = dst[-stride + c - 2]; 193 dst += stride; 194 } 195 } 196 197 static INLINE void v_predictor(uint8_t *dst, ptrdiff_t stride, int bs, 198 const uint8_t *above, const uint8_t *left) { 199 int r; 200 (void) left; 201 202 for (r = 0; r < bs; r++) { 203 memcpy(dst, above, bs); 204 dst += stride; 205 } 206 } 207 208 static INLINE void h_predictor(uint8_t *dst, ptrdiff_t stride, int bs, 209 const uint8_t *above, const uint8_t *left) { 210 int r; 211 (void) above; 212 213 for (r = 0; r < bs; r++) { 214 memset(dst, left[r], bs); 215 dst += stride; 216 } 217 } 218 219 static INLINE void tm_predictor(uint8_t *dst, ptrdiff_t stride, int bs, 220 const uint8_t *above, const uint8_t *left) { 221 int r, c; 222 int ytop_left = above[-1]; 223 224 for (r = 0; r < bs; r++) { 225 for (c = 0; c < bs; c++) 226 dst[c] = clip_pixel(left[r] + above[c] - ytop_left); 227 dst += stride; 228 } 229 } 230 231 static INLINE void dc_128_predictor(uint8_t *dst, ptrdiff_t stride, int bs, 232 const uint8_t *above, const uint8_t *left) { 233 int r; 234 (void) above; 235 (void) left; 236 237 for (r = 0; r < bs; r++) { 238 memset(dst, 128, bs); 239 dst += stride; 240 } 241 } 242 243 static INLINE void dc_left_predictor(uint8_t *dst, ptrdiff_t stride, int bs, 244 const uint8_t *above, 245 const uint8_t *left) { 246 int i, r, expected_dc, sum = 0; 247 (void) above; 248 249 for (i = 0; i < bs; i++) 250 sum += left[i]; 251 expected_dc = (sum + (bs >> 1)) / bs; 252 253 for (r = 0; r < bs; r++) { 254 memset(dst, expected_dc, bs); 255 dst += stride; 256 } 257 } 258 259 static INLINE void dc_top_predictor(uint8_t *dst, ptrdiff_t stride, int bs, 260 const uint8_t *above, const uint8_t *left) { 261 int i, r, expected_dc, sum = 0; 262 (void) left; 263 264 for (i = 0; i < bs; i++) 265 sum += above[i]; 266 expected_dc = (sum + (bs >> 1)) / bs; 267 268 for (r = 0; r < bs; r++) { 269 memset(dst, expected_dc, bs); 270 dst += stride; 271 } 272 } 273 274 static INLINE void dc_predictor(uint8_t *dst, ptrdiff_t stride, int bs, 275 const uint8_t *above, const uint8_t *left) { 276 int i, r, expected_dc, sum = 0; 277 const int count = 2 * bs; 278 279 for (i = 0; i < bs; i++) { 280 sum += above[i]; 281 sum += left[i]; 282 } 283 284 expected_dc = (sum + (count >> 1)) / count; 285 286 for (r = 0; r < bs; r++) { 287 memset(dst, expected_dc, bs); 288 dst += stride; 289 } 290 } 291 292 void vpx_he_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride, 293 const uint8_t *above, const uint8_t *left) { 294 const int H = above[-1]; 295 const int I = left[0]; 296 const int J = left[1]; 297 const int K = left[2]; 298 const int L = left[3]; 299 300 memset(dst + stride * 0, AVG3(H, I, J), 4); 301 memset(dst + stride * 1, AVG3(I, J, K), 4); 302 memset(dst + stride * 2, AVG3(J, K, L), 4); 303 memset(dst + stride * 3, AVG3(K, L, L), 4); 304 } 305 306 void vpx_ve_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride, 307 const uint8_t *above, const uint8_t *left) { 308 const int H = above[-1]; 309 const int I = above[0]; 310 const int J = above[1]; 311 const int K = above[2]; 312 const int L = above[3]; 313 const int M = above[4]; 314 315 dst[0] = AVG3(H, I, J); 316 dst[1] = AVG3(I, J, K); 317 dst[2] = AVG3(J, K, L); 318 dst[3] = AVG3(K, L, M); 319 memcpy(dst + stride * 1, dst, 4); 320 memcpy(dst + stride * 2, dst, 4); 321 memcpy(dst + stride * 3, dst, 4); 322 } 323 324 void vpx_d207_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride, 325 const uint8_t *above, const uint8_t *left) { 326 const int I = left[0]; 327 const int J = left[1]; 328 const int K = left[2]; 329 const int L = left[3]; 330 (void)above; 331 DST(0, 0) = AVG2(I, J); 332 DST(2, 0) = DST(0, 1) = AVG2(J, K); 333 DST(2, 1) = DST(0, 2) = AVG2(K, L); 334 DST(1, 0) = AVG3(I, J, K); 335 DST(3, 0) = DST(1, 1) = AVG3(J, K, L); 336 DST(3, 1) = DST(1, 2) = AVG3(K, L, L); 337 DST(3, 2) = DST(2, 2) = 338 DST(0, 3) = DST(1, 3) = DST(2, 3) = DST(3, 3) = L; 339 } 340 341 void vpx_d63_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride, 342 const uint8_t *above, const uint8_t *left) { 343 const int A = above[0]; 344 const int B = above[1]; 345 const int C = above[2]; 346 const int D = above[3]; 347 const int E = above[4]; 348 const int F = above[5]; 349 const int G = above[6]; 350 (void)left; 351 DST(0, 0) = AVG2(A, B); 352 DST(1, 0) = DST(0, 2) = AVG2(B, C); 353 DST(2, 0) = DST(1, 2) = AVG2(C, D); 354 DST(3, 0) = DST(2, 2) = AVG2(D, E); 355 DST(3, 2) = AVG2(E, F); // differs from vp8 356 357 DST(0, 1) = AVG3(A, B, C); 358 DST(1, 1) = DST(0, 3) = AVG3(B, C, D); 359 DST(2, 1) = DST(1, 3) = AVG3(C, D, E); 360 DST(3, 1) = DST(2, 3) = AVG3(D, E, F); 361 DST(3, 3) = AVG3(E, F, G); // differs from vp8 362 } 363 364 void vpx_d63f_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride, 365 const uint8_t *above, const uint8_t *left) { 366 const int A = above[0]; 367 const int B = above[1]; 368 const int C = above[2]; 369 const int D = above[3]; 370 const int E = above[4]; 371 const int F = above[5]; 372 const int G = above[6]; 373 const int H = above[7]; 374 (void)left; 375 DST(0, 0) = AVG2(A, B); 376 DST(1, 0) = DST(0, 2) = AVG2(B, C); 377 DST(2, 0) = DST(1, 2) = AVG2(C, D); 378 DST(3, 0) = DST(2, 2) = AVG2(D, E); 379 DST(3, 2) = AVG3(E, F, G); 380 381 DST(0, 1) = AVG3(A, B, C); 382 DST(1, 1) = DST(0, 3) = AVG3(B, C, D); 383 DST(2, 1) = DST(1, 3) = AVG3(C, D, E); 384 DST(3, 1) = DST(2, 3) = AVG3(D, E, F); 385 DST(3, 3) = AVG3(F, G, H); 386 } 387 388 void vpx_d45_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride, 389 const uint8_t *above, const uint8_t *left) { 390 const int A = above[0]; 391 const int B = above[1]; 392 const int C = above[2]; 393 const int D = above[3]; 394 const int E = above[4]; 395 const int F = above[5]; 396 const int G = above[6]; 397 const int H = above[7]; 398 (void)stride; 399 (void)left; 400 DST(0, 0) = AVG3(A, B, C); 401 DST(1, 0) = DST(0, 1) = AVG3(B, C, D); 402 DST(2, 0) = DST(1, 1) = DST(0, 2) = AVG3(C, D, E); 403 DST(3, 0) = DST(2, 1) = DST(1, 2) = DST(0, 3) = AVG3(D, E, F); 404 DST(3, 1) = DST(2, 2) = DST(1, 3) = AVG3(E, F, G); 405 DST(3, 2) = DST(2, 3) = AVG3(F, G, H); 406 DST(3, 3) = H; // differs from vp8 407 } 408 409 void vpx_d45e_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride, 410 const uint8_t *above, const uint8_t *left) { 411 const int A = above[0]; 412 const int B = above[1]; 413 const int C = above[2]; 414 const int D = above[3]; 415 const int E = above[4]; 416 const int F = above[5]; 417 const int G = above[6]; 418 const int H = above[7]; 419 (void)stride; 420 (void)left; 421 DST(0, 0) = AVG3(A, B, C); 422 DST(1, 0) = DST(0, 1) = AVG3(B, C, D); 423 DST(2, 0) = DST(1, 1) = DST(0, 2) = AVG3(C, D, E); 424 DST(3, 0) = DST(2, 1) = DST(1, 2) = DST(0, 3) = AVG3(D, E, F); 425 DST(3, 1) = DST(2, 2) = DST(1, 3) = AVG3(E, F, G); 426 DST(3, 2) = DST(2, 3) = AVG3(F, G, H); 427 DST(3, 3) = AVG3(G, H, H); 428 } 429 430 void vpx_d117_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride, 431 const uint8_t *above, const uint8_t *left) { 432 const int I = left[0]; 433 const int J = left[1]; 434 const int K = left[2]; 435 const int X = above[-1]; 436 const int A = above[0]; 437 const int B = above[1]; 438 const int C = above[2]; 439 const int D = above[3]; 440 DST(0, 0) = DST(1, 2) = AVG2(X, A); 441 DST(1, 0) = DST(2, 2) = AVG2(A, B); 442 DST(2, 0) = DST(3, 2) = AVG2(B, C); 443 DST(3, 0) = AVG2(C, D); 444 445 DST(0, 3) = AVG3(K, J, I); 446 DST(0, 2) = AVG3(J, I, X); 447 DST(0, 1) = DST(1, 3) = AVG3(I, X, A); 448 DST(1, 1) = DST(2, 3) = AVG3(X, A, B); 449 DST(2, 1) = DST(3, 3) = AVG3(A, B, C); 450 DST(3, 1) = AVG3(B, C, D); 451 } 452 453 void vpx_d135_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride, 454 const uint8_t *above, const uint8_t *left) { 455 const int I = left[0]; 456 const int J = left[1]; 457 const int K = left[2]; 458 const int L = left[3]; 459 const int X = above[-1]; 460 const int A = above[0]; 461 const int B = above[1]; 462 const int C = above[2]; 463 const int D = above[3]; 464 (void)stride; 465 DST(0, 3) = AVG3(J, K, L); 466 DST(1, 3) = DST(0, 2) = AVG3(I, J, K); 467 DST(2, 3) = DST(1, 2) = DST(0, 1) = AVG3(X, I, J); 468 DST(3, 3) = DST(2, 2) = DST(1, 1) = DST(0, 0) = AVG3(A, X, I); 469 DST(3, 2) = DST(2, 1) = DST(1, 0) = AVG3(B, A, X); 470 DST(3, 1) = DST(2, 0) = AVG3(C, B, A); 471 DST(3, 0) = AVG3(D, C, B); 472 } 473 474 void vpx_d153_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride, 475 const uint8_t *above, const uint8_t *left) { 476 const int I = left[0]; 477 const int J = left[1]; 478 const int K = left[2]; 479 const int L = left[3]; 480 const int X = above[-1]; 481 const int A = above[0]; 482 const int B = above[1]; 483 const int C = above[2]; 484 485 DST(0, 0) = DST(2, 1) = AVG2(I, X); 486 DST(0, 1) = DST(2, 2) = AVG2(J, I); 487 DST(0, 2) = DST(2, 3) = AVG2(K, J); 488 DST(0, 3) = AVG2(L, K); 489 490 DST(3, 0) = AVG3(A, B, C); 491 DST(2, 0) = AVG3(X, A, B); 492 DST(1, 0) = DST(3, 1) = AVG3(I, X, A); 493 DST(1, 1) = DST(3, 2) = AVG3(J, I, X); 494 DST(1, 2) = DST(3, 3) = AVG3(K, J, I); 495 DST(1, 3) = AVG3(L, K, J); 496 } 497 498 #if CONFIG_VP9_HIGHBITDEPTH 499 static INLINE void highbd_d207_predictor(uint16_t *dst, ptrdiff_t stride, 500 int bs, const uint16_t *above, 501 const uint16_t *left, int bd) { 502 int r, c; 503 (void) above; 504 (void) bd; 505 506 // First column. 507 for (r = 0; r < bs - 1; ++r) { 508 dst[r * stride] = AVG2(left[r], left[r + 1]); 509 } 510 dst[(bs - 1) * stride] = left[bs - 1]; 511 dst++; 512 513 // Second column. 514 for (r = 0; r < bs - 2; ++r) { 515 dst[r * stride] = AVG3(left[r], left[r + 1], left[r + 2]); 516 } 517 dst[(bs - 2) * stride] = AVG3(left[bs - 2], left[bs - 1], left[bs - 1]); 518 dst[(bs - 1) * stride] = left[bs - 1]; 519 dst++; 520 521 // Rest of last row. 522 for (c = 0; c < bs - 2; ++c) 523 dst[(bs - 1) * stride + c] = left[bs - 1]; 524 525 for (r = bs - 2; r >= 0; --r) { 526 for (c = 0; c < bs - 2; ++c) 527 dst[r * stride + c] = dst[(r + 1) * stride + c - 2]; 528 } 529 } 530 531 static INLINE void highbd_d207e_predictor(uint16_t *dst, ptrdiff_t stride, 532 int bs, const uint16_t *above, 533 const uint16_t *left, int bd) { 534 int r, c; 535 (void) above; 536 (void) bd; 537 538 for (r = 0; r < bs; ++r) { 539 for (c = 0; c < bs; ++c) { 540 dst[c] = c & 1 ? AVG3(left[(c >> 1) + r], left[(c >> 1) + r + 1], 541 left[(c >> 1) + r + 2]) 542 : AVG2(left[(c >> 1) + r], left[(c >> 1) + r + 1]); 543 } 544 dst += stride; 545 } 546 } 547 548 static INLINE void highbd_d63_predictor(uint16_t *dst, ptrdiff_t stride, 549 int bs, const uint16_t *above, 550 const uint16_t *left, int bd) { 551 int r, c; 552 (void) left; 553 (void) bd; 554 for (r = 0; r < bs; ++r) { 555 for (c = 0; c < bs; ++c) { 556 dst[c] = r & 1 ? AVG3(above[(r >> 1) + c], above[(r >> 1) + c + 1], 557 above[(r >> 1) + c + 2]) 558 : AVG2(above[(r >> 1) + c], above[(r >> 1) + c + 1]); 559 } 560 dst += stride; 561 } 562 } 563 564 #define highbd_d63e_predictor highbd_d63_predictor 565 566 static INLINE void highbd_d45_predictor(uint16_t *dst, ptrdiff_t stride, int bs, 567 const uint16_t *above, 568 const uint16_t *left, int bd) { 569 int r, c; 570 (void) left; 571 (void) bd; 572 for (r = 0; r < bs; ++r) { 573 for (c = 0; c < bs; ++c) { 574 dst[c] = r + c + 2 < bs * 2 ? AVG3(above[r + c], above[r + c + 1], 575 above[r + c + 2]) 576 : above[bs * 2 - 1]; 577 } 578 dst += stride; 579 } 580 } 581 582 static INLINE void highbd_d45e_predictor(uint16_t *dst, ptrdiff_t stride, 583 int bs, const uint16_t *above, 584 const uint16_t *left, int bd) { 585 int r, c; 586 (void) left; 587 (void) bd; 588 for (r = 0; r < bs; ++r) { 589 for (c = 0; c < bs; ++c) { 590 dst[c] = AVG3(above[r + c], above[r + c + 1], 591 above[r + c + 1 + (r + c + 2 < bs * 2)]); 592 } 593 dst += stride; 594 } 595 } 596 597 static INLINE void highbd_d117_predictor(uint16_t *dst, ptrdiff_t stride, 598 int bs, const uint16_t *above, 599 const uint16_t *left, int bd) { 600 int r, c; 601 (void) bd; 602 603 // first row 604 for (c = 0; c < bs; c++) 605 dst[c] = AVG2(above[c - 1], above[c]); 606 dst += stride; 607 608 // second row 609 dst[0] = AVG3(left[0], above[-1], above[0]); 610 for (c = 1; c < bs; c++) 611 dst[c] = AVG3(above[c - 2], above[c - 1], above[c]); 612 dst += stride; 613 614 // the rest of first col 615 dst[0] = AVG3(above[-1], left[0], left[1]); 616 for (r = 3; r < bs; ++r) 617 dst[(r - 2) * stride] = AVG3(left[r - 3], left[r - 2], left[r - 1]); 618 619 // the rest of the block 620 for (r = 2; r < bs; ++r) { 621 for (c = 1; c < bs; c++) 622 dst[c] = dst[-2 * stride + c - 1]; 623 dst += stride; 624 } 625 } 626 627 static INLINE void highbd_d135_predictor(uint16_t *dst, ptrdiff_t stride, 628 int bs, const uint16_t *above, 629 const uint16_t *left, int bd) { 630 int r, c; 631 (void) bd; 632 dst[0] = AVG3(left[0], above[-1], above[0]); 633 for (c = 1; c < bs; c++) 634 dst[c] = AVG3(above[c - 2], above[c - 1], above[c]); 635 636 dst[stride] = AVG3(above[-1], left[0], left[1]); 637 for (r = 2; r < bs; ++r) 638 dst[r * stride] = AVG3(left[r - 2], left[r - 1], left[r]); 639 640 dst += stride; 641 for (r = 1; r < bs; ++r) { 642 for (c = 1; c < bs; c++) 643 dst[c] = dst[-stride + c - 1]; 644 dst += stride; 645 } 646 } 647 648 static INLINE void highbd_d153_predictor(uint16_t *dst, ptrdiff_t stride, 649 int bs, const uint16_t *above, 650 const uint16_t *left, int bd) { 651 int r, c; 652 (void) bd; 653 dst[0] = AVG2(above[-1], left[0]); 654 for (r = 1; r < bs; r++) 655 dst[r * stride] = AVG2(left[r - 1], left[r]); 656 dst++; 657 658 dst[0] = AVG3(left[0], above[-1], above[0]); 659 dst[stride] = AVG3(above[-1], left[0], left[1]); 660 for (r = 2; r < bs; r++) 661 dst[r * stride] = AVG3(left[r - 2], left[r - 1], left[r]); 662 dst++; 663 664 for (c = 0; c < bs - 2; c++) 665 dst[c] = AVG3(above[c - 1], above[c], above[c + 1]); 666 dst += stride; 667 668 for (r = 1; r < bs; ++r) { 669 for (c = 0; c < bs - 2; c++) 670 dst[c] = dst[-stride + c - 2]; 671 dst += stride; 672 } 673 } 674 675 static INLINE void highbd_v_predictor(uint16_t *dst, ptrdiff_t stride, 676 int bs, const uint16_t *above, 677 const uint16_t *left, int bd) { 678 int r; 679 (void) left; 680 (void) bd; 681 for (r = 0; r < bs; r++) { 682 memcpy(dst, above, bs * sizeof(uint16_t)); 683 dst += stride; 684 } 685 } 686 687 static INLINE void highbd_h_predictor(uint16_t *dst, ptrdiff_t stride, 688 int bs, const uint16_t *above, 689 const uint16_t *left, int bd) { 690 int r; 691 (void) above; 692 (void) bd; 693 for (r = 0; r < bs; r++) { 694 vpx_memset16(dst, left[r], bs); 695 dst += stride; 696 } 697 } 698 699 static INLINE void highbd_tm_predictor(uint16_t *dst, ptrdiff_t stride, 700 int bs, const uint16_t *above, 701 const uint16_t *left, int bd) { 702 int r, c; 703 int ytop_left = above[-1]; 704 (void) bd; 705 706 for (r = 0; r < bs; r++) { 707 for (c = 0; c < bs; c++) 708 dst[c] = clip_pixel_highbd(left[r] + above[c] - ytop_left, bd); 709 dst += stride; 710 } 711 } 712 713 static INLINE void highbd_dc_128_predictor(uint16_t *dst, ptrdiff_t stride, 714 int bs, const uint16_t *above, 715 const uint16_t *left, int bd) { 716 int r; 717 (void) above; 718 (void) left; 719 720 for (r = 0; r < bs; r++) { 721 vpx_memset16(dst, 128 << (bd - 8), bs); 722 dst += stride; 723 } 724 } 725 726 static INLINE void highbd_dc_left_predictor(uint16_t *dst, ptrdiff_t stride, 727 int bs, const uint16_t *above, 728 const uint16_t *left, int bd) { 729 int i, r, expected_dc, sum = 0; 730 (void) above; 731 (void) bd; 732 733 for (i = 0; i < bs; i++) 734 sum += left[i]; 735 expected_dc = (sum + (bs >> 1)) / bs; 736 737 for (r = 0; r < bs; r++) { 738 vpx_memset16(dst, expected_dc, bs); 739 dst += stride; 740 } 741 } 742 743 static INLINE void highbd_dc_top_predictor(uint16_t *dst, ptrdiff_t stride, 744 int bs, const uint16_t *above, 745 const uint16_t *left, int bd) { 746 int i, r, expected_dc, sum = 0; 747 (void) left; 748 (void) bd; 749 750 for (i = 0; i < bs; i++) 751 sum += above[i]; 752 expected_dc = (sum + (bs >> 1)) / bs; 753 754 for (r = 0; r < bs; r++) { 755 vpx_memset16(dst, expected_dc, bs); 756 dst += stride; 757 } 758 } 759 760 static INLINE void highbd_dc_predictor(uint16_t *dst, ptrdiff_t stride, 761 int bs, const uint16_t *above, 762 const uint16_t *left, int bd) { 763 int i, r, expected_dc, sum = 0; 764 const int count = 2 * bs; 765 (void) bd; 766 767 for (i = 0; i < bs; i++) { 768 sum += above[i]; 769 sum += left[i]; 770 } 771 772 expected_dc = (sum + (count >> 1)) / count; 773 774 for (r = 0; r < bs; r++) { 775 vpx_memset16(dst, expected_dc, bs); 776 dst += stride; 777 } 778 } 779 #endif // CONFIG_VP9_HIGHBITDEPTH 780 781 // This serves as a wrapper function, so that all the prediction functions 782 // can be unified and accessed as a pointer array. Note that the boundary 783 // above and left are not necessarily used all the time. 784 #define intra_pred_sized(type, size) \ 785 void vpx_##type##_predictor_##size##x##size##_c(uint8_t *dst, \ 786 ptrdiff_t stride, \ 787 const uint8_t *above, \ 788 const uint8_t *left) { \ 789 type##_predictor(dst, stride, size, above, left); \ 790 } 791 792 #if CONFIG_VP9_HIGHBITDEPTH 793 #define intra_pred_highbd_sized(type, size) \ 794 void vpx_highbd_##type##_predictor_##size##x##size##_c( \ 795 uint16_t *dst, ptrdiff_t stride, const uint16_t *above, \ 796 const uint16_t *left, int bd) { \ 797 highbd_##type##_predictor(dst, stride, size, above, left, bd); \ 798 } 799 800 #define intra_pred_allsizes(type) \ 801 intra_pred_sized(type, 4) \ 802 intra_pred_sized(type, 8) \ 803 intra_pred_sized(type, 16) \ 804 intra_pred_sized(type, 32) \ 805 intra_pred_highbd_sized(type, 4) \ 806 intra_pred_highbd_sized(type, 8) \ 807 intra_pred_highbd_sized(type, 16) \ 808 intra_pred_highbd_sized(type, 32) 809 810 #define intra_pred_no_4x4(type) \ 811 intra_pred_sized(type, 8) \ 812 intra_pred_sized(type, 16) \ 813 intra_pred_sized(type, 32) \ 814 intra_pred_highbd_sized(type, 4) \ 815 intra_pred_highbd_sized(type, 8) \ 816 intra_pred_highbd_sized(type, 16) \ 817 intra_pred_highbd_sized(type, 32) 818 819 #else 820 #define intra_pred_allsizes(type) \ 821 intra_pred_sized(type, 4) \ 822 intra_pred_sized(type, 8) \ 823 intra_pred_sized(type, 16) \ 824 intra_pred_sized(type, 32) 825 826 #define intra_pred_no_4x4(type) \ 827 intra_pred_sized(type, 8) \ 828 intra_pred_sized(type, 16) \ 829 intra_pred_sized(type, 32) 830 #endif // CONFIG_VP9_HIGHBITDEPTH 831 832 intra_pred_no_4x4(d207) 833 intra_pred_no_4x4(d63) 834 intra_pred_no_4x4(d45) 835 #if CONFIG_MISC_FIXES 836 intra_pred_allsizes(d207e) 837 intra_pred_allsizes(d63e) 838 intra_pred_no_4x4(d45e) 839 #endif 840 intra_pred_no_4x4(d117) 841 intra_pred_no_4x4(d135) 842 intra_pred_no_4x4(d153) 843 intra_pred_allsizes(v) 844 intra_pred_allsizes(h) 845 intra_pred_allsizes(tm) 846 intra_pred_allsizes(dc_128) 847 intra_pred_allsizes(dc_left) 848 intra_pred_allsizes(dc_top) 849 intra_pred_allsizes(dc) 850 #undef intra_pred_allsizes 851