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