Changeset 5633 for pjproject/trunk/third_party/yuv/source/scale_common.cc
- Timestamp:
- Jul 28, 2017 2:51:44 AM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/third_party/yuv/source/scale_common.cc
r5358 r5633 29 29 30 30 // CPU agnostic row functions 31 void ScaleRowDown2_C(const uint8* src_ptr, ptrdiff_t src_stride, 32 uint8* dst, int dst_width) { 33 int x; 31 void ScaleRowDown2_C(const uint8* src_ptr, 32 ptrdiff_t src_stride, 33 uint8* dst, 34 int dst_width) { 35 int x; 36 (void)src_stride; 34 37 for (x = 0; x < dst_width - 1; x += 2) { 35 38 dst[0] = src_ptr[1]; … … 43 46 } 44 47 45 void ScaleRowDown2_16_C(const uint16* src_ptr, ptrdiff_t src_stride, 46 uint16* dst, int dst_width) { 47 int x; 48 void ScaleRowDown2_16_C(const uint16* src_ptr, 49 ptrdiff_t src_stride, 50 uint16* dst, 51 int dst_width) { 52 int x; 53 (void)src_stride; 48 54 for (x = 0; x < dst_width - 1; x += 2) { 49 55 dst[0] = src_ptr[1]; … … 57 63 } 58 64 59 void ScaleRowDown2Linear_C(const uint8* src_ptr, ptrdiff_t src_stride, 60 uint8* dst, int dst_width) { 65 void ScaleRowDown2Linear_C(const uint8* src_ptr, 66 ptrdiff_t src_stride, 67 uint8* dst, 68 int dst_width) { 61 69 const uint8* s = src_ptr; 62 70 int x; 71 (void)src_stride; 63 72 for (x = 0; x < dst_width - 1; x += 2) { 64 73 dst[0] = (s[0] + s[1] + 1) >> 1; … … 72 81 } 73 82 74 void ScaleRowDown2Linear_16_C(const uint16* src_ptr, ptrdiff_t src_stride, 75 uint16* dst, int dst_width) { 83 void ScaleRowDown2Linear_16_C(const uint16* src_ptr, 84 ptrdiff_t src_stride, 85 uint16* dst, 86 int dst_width) { 76 87 const uint16* s = src_ptr; 77 88 int x; 89 (void)src_stride; 78 90 for (x = 0; x < dst_width - 1; x += 2) { 79 91 dst[0] = (s[0] + s[1] + 1) >> 1; … … 87 99 } 88 100 89 void ScaleRowDown2Box_C(const uint8* src_ptr, ptrdiff_t src_stride, 90 uint8* dst, int dst_width) { 101 void ScaleRowDown2Box_C(const uint8* src_ptr, 102 ptrdiff_t src_stride, 103 uint8* dst, 104 int dst_width) { 91 105 const uint8* s = src_ptr; 92 106 const uint8* t = src_ptr + src_stride; … … 104 118 } 105 119 106 void ScaleRowDown2Box_Odd_C(const uint8* src_ptr, ptrdiff_t src_stride, 107 uint8* dst, int dst_width) { 120 void ScaleRowDown2Box_Odd_C(const uint8* src_ptr, 121 ptrdiff_t src_stride, 122 uint8* dst, 123 int dst_width) { 108 124 const uint8* s = src_ptr; 109 125 const uint8* t = src_ptr + src_stride; … … 126 142 } 127 143 128 void ScaleRowDown2Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride, 129 uint16* dst, int dst_width) { 144 void ScaleRowDown2Box_16_C(const uint16* src_ptr, 145 ptrdiff_t src_stride, 146 uint16* dst, 147 int dst_width) { 130 148 const uint16* s = src_ptr; 131 149 const uint16* t = src_ptr + src_stride; … … 143 161 } 144 162 145 void ScaleRowDown4_C(const uint8* src_ptr, ptrdiff_t src_stride, 146 uint8* dst, int dst_width) { 147 int x; 163 void ScaleRowDown4_C(const uint8* src_ptr, 164 ptrdiff_t src_stride, 165 uint8* dst, 166 int dst_width) { 167 int x; 168 (void)src_stride; 148 169 for (x = 0; x < dst_width - 1; x += 2) { 149 170 dst[0] = src_ptr[2]; … … 157 178 } 158 179 159 void ScaleRowDown4_16_C(const uint16* src_ptr, ptrdiff_t src_stride, 160 uint16* dst, int dst_width) { 161 int x; 180 void ScaleRowDown4_16_C(const uint16* src_ptr, 181 ptrdiff_t src_stride, 182 uint16* dst, 183 int dst_width) { 184 int x; 185 (void)src_stride; 162 186 for (x = 0; x < dst_width - 1; x += 2) { 163 187 dst[0] = src_ptr[2]; … … 171 195 } 172 196 173 void ScaleRowDown4Box_C(const uint8* src_ptr, ptrdiff_t src_stride, 174 uint8* dst, int dst_width) { 197 void ScaleRowDown4Box_C(const uint8* src_ptr, 198 ptrdiff_t src_stride, 199 uint8* dst, 200 int dst_width) { 175 201 intptr_t stride = src_stride; 176 202 int x; 177 203 for (x = 0; x < dst_width - 1; x += 2) { 178 204 dst[0] = (src_ptr[0] + src_ptr[1] + src_ptr[2] + src_ptr[3] + 179 src_ptr[stride + 0] + src_ptr[stride + 1] +180 src_ptr[stride + 2] + src_ptr[stride + 3] +181 src_ptr[stride * 2 + 0] + src_ptr[stride * 2 + 1] +182 src_ptr[stride * 2 + 2] + src_ptr[stride * 2 + 3] +183 src_ptr[stride * 3 + 0] + src_ptr[stride * 3 + 1] +184 src_ptr[stride * 3 + 2] + src_ptr[stride * 3 + 3] +185 8) >>4;205 src_ptr[stride + 0] + src_ptr[stride + 1] + src_ptr[stride + 2] + 206 src_ptr[stride + 3] + src_ptr[stride * 2 + 0] + 207 src_ptr[stride * 2 + 1] + src_ptr[stride * 2 + 2] + 208 src_ptr[stride * 2 + 3] + src_ptr[stride * 3 + 0] + 209 src_ptr[stride * 3 + 1] + src_ptr[stride * 3 + 2] + 210 src_ptr[stride * 3 + 3] + 8) >> 211 4; 186 212 dst[1] = (src_ptr[4] + src_ptr[5] + src_ptr[6] + src_ptr[7] + 187 src_ptr[stride + 4] + src_ptr[stride + 5] +188 src_ptr[stride + 6] + src_ptr[stride + 7] +189 src_ptr[stride * 2 + 4] + src_ptr[stride * 2 + 5] +190 src_ptr[stride * 2 + 6] + src_ptr[stride * 2 + 7] +191 src_ptr[stride * 3 + 4] + src_ptr[stride * 3 + 5] +192 src_ptr[stride * 3 + 6] + src_ptr[stride * 3 + 7] +193 8) >>4;213 src_ptr[stride + 4] + src_ptr[stride + 5] + src_ptr[stride + 6] + 214 src_ptr[stride + 7] + src_ptr[stride * 2 + 4] + 215 src_ptr[stride * 2 + 5] + src_ptr[stride * 2 + 6] + 216 src_ptr[stride * 2 + 7] + src_ptr[stride * 3 + 4] + 217 src_ptr[stride * 3 + 5] + src_ptr[stride * 3 + 6] + 218 src_ptr[stride * 3 + 7] + 8) >> 219 4; 194 220 dst += 2; 195 221 src_ptr += 8; … … 197 223 if (dst_width & 1) { 198 224 dst[0] = (src_ptr[0] + src_ptr[1] + src_ptr[2] + src_ptr[3] + 199 src_ptr[stride + 0] + src_ptr[stride + 1] + 200 src_ptr[stride + 2] + src_ptr[stride + 3] + 201 src_ptr[stride * 2 + 0] + src_ptr[stride * 2 + 1] + 202 src_ptr[stride * 2 + 2] + src_ptr[stride * 2 + 3] + 203 src_ptr[stride * 3 + 0] + src_ptr[stride * 3 + 1] + 204 src_ptr[stride * 3 + 2] + src_ptr[stride * 3 + 3] + 205 8) >> 4; 206 } 207 } 208 209 void ScaleRowDown4Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride, 210 uint16* dst, int dst_width) { 225 src_ptr[stride + 0] + src_ptr[stride + 1] + src_ptr[stride + 2] + 226 src_ptr[stride + 3] + src_ptr[stride * 2 + 0] + 227 src_ptr[stride * 2 + 1] + src_ptr[stride * 2 + 2] + 228 src_ptr[stride * 2 + 3] + src_ptr[stride * 3 + 0] + 229 src_ptr[stride * 3 + 1] + src_ptr[stride * 3 + 2] + 230 src_ptr[stride * 3 + 3] + 8) >> 231 4; 232 } 233 } 234 235 void ScaleRowDown4Box_16_C(const uint16* src_ptr, 236 ptrdiff_t src_stride, 237 uint16* dst, 238 int dst_width) { 211 239 intptr_t stride = src_stride; 212 240 int x; 213 241 for (x = 0; x < dst_width - 1; x += 2) { 214 242 dst[0] = (src_ptr[0] + src_ptr[1] + src_ptr[2] + src_ptr[3] + 215 src_ptr[stride + 0] + src_ptr[stride + 1] +216 src_ptr[stride + 2] + src_ptr[stride + 3] +217 src_ptr[stride * 2 + 0] + src_ptr[stride * 2 + 1] +218 src_ptr[stride * 2 + 2] + src_ptr[stride * 2 + 3] +219 src_ptr[stride * 3 + 0] + src_ptr[stride * 3 + 1] +220 src_ptr[stride * 3 + 2] + src_ptr[stride * 3 + 3] +221 8) >>4;243 src_ptr[stride + 0] + src_ptr[stride + 1] + src_ptr[stride + 2] + 244 src_ptr[stride + 3] + src_ptr[stride * 2 + 0] + 245 src_ptr[stride * 2 + 1] + src_ptr[stride * 2 + 2] + 246 src_ptr[stride * 2 + 3] + src_ptr[stride * 3 + 0] + 247 src_ptr[stride * 3 + 1] + src_ptr[stride * 3 + 2] + 248 src_ptr[stride * 3 + 3] + 8) >> 249 4; 222 250 dst[1] = (src_ptr[4] + src_ptr[5] + src_ptr[6] + src_ptr[7] + 223 src_ptr[stride + 4] + src_ptr[stride + 5] +224 src_ptr[stride + 6] + src_ptr[stride + 7] +225 src_ptr[stride * 2 + 4] + src_ptr[stride * 2 + 5] +226 src_ptr[stride * 2 + 6] + src_ptr[stride * 2 + 7] +227 src_ptr[stride * 3 + 4] + src_ptr[stride * 3 + 5] +228 src_ptr[stride * 3 + 6] + src_ptr[stride * 3 + 7] +229 8) >>4;251 src_ptr[stride + 4] + src_ptr[stride + 5] + src_ptr[stride + 6] + 252 src_ptr[stride + 7] + src_ptr[stride * 2 + 4] + 253 src_ptr[stride * 2 + 5] + src_ptr[stride * 2 + 6] + 254 src_ptr[stride * 2 + 7] + src_ptr[stride * 3 + 4] + 255 src_ptr[stride * 3 + 5] + src_ptr[stride * 3 + 6] + 256 src_ptr[stride * 3 + 7] + 8) >> 257 4; 230 258 dst += 2; 231 259 src_ptr += 8; … … 233 261 if (dst_width & 1) { 234 262 dst[0] = (src_ptr[0] + src_ptr[1] + src_ptr[2] + src_ptr[3] + 235 src_ptr[stride + 0] + src_ptr[stride + 1] + 236 src_ptr[stride + 2] + src_ptr[stride + 3] + 237 src_ptr[stride * 2 + 0] + src_ptr[stride * 2 + 1] + 238 src_ptr[stride * 2 + 2] + src_ptr[stride * 2 + 3] + 239 src_ptr[stride * 3 + 0] + src_ptr[stride * 3 + 1] + 240 src_ptr[stride * 3 + 2] + src_ptr[stride * 3 + 3] + 241 8) >> 4; 242 } 243 } 244 245 void ScaleRowDown34_C(const uint8* src_ptr, ptrdiff_t src_stride, 246 uint8* dst, int dst_width) { 247 int x; 263 src_ptr[stride + 0] + src_ptr[stride + 1] + src_ptr[stride + 2] + 264 src_ptr[stride + 3] + src_ptr[stride * 2 + 0] + 265 src_ptr[stride * 2 + 1] + src_ptr[stride * 2 + 2] + 266 src_ptr[stride * 2 + 3] + src_ptr[stride * 3 + 0] + 267 src_ptr[stride * 3 + 1] + src_ptr[stride * 3 + 2] + 268 src_ptr[stride * 3 + 3] + 8) >> 269 4; 270 } 271 } 272 273 void ScaleRowDown34_C(const uint8* src_ptr, 274 ptrdiff_t src_stride, 275 uint8* dst, 276 int dst_width) { 277 int x; 278 (void)src_stride; 248 279 assert((dst_width % 3 == 0) && (dst_width > 0)); 249 280 for (x = 0; x < dst_width; x += 3) { … … 256 287 } 257 288 258 void ScaleRowDown34_16_C(const uint16* src_ptr, ptrdiff_t src_stride, 259 uint16* dst, int dst_width) { 260 int x; 289 void ScaleRowDown34_16_C(const uint16* src_ptr, 290 ptrdiff_t src_stride, 291 uint16* dst, 292 int dst_width) { 293 int x; 294 (void)src_stride; 261 295 assert((dst_width % 3 == 0) && (dst_width > 0)); 262 296 for (x = 0; x < dst_width; x += 3) { … … 270 304 271 305 // Filter rows 0 and 1 together, 3 : 1 272 void ScaleRowDown34_0_Box_C(const uint8* src_ptr, ptrdiff_t src_stride, 273 uint8* d, int dst_width) { 306 void ScaleRowDown34_0_Box_C(const uint8* src_ptr, 307 ptrdiff_t src_stride, 308 uint8* d, 309 int dst_width) { 274 310 const uint8* s = src_ptr; 275 311 const uint8* t = src_ptr + src_stride; … … 292 328 } 293 329 294 void ScaleRowDown34_0_Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride, 295 uint16* d, int dst_width) { 330 void ScaleRowDown34_0_Box_16_C(const uint16* src_ptr, 331 ptrdiff_t src_stride, 332 uint16* d, 333 int dst_width) { 296 334 const uint16* s = src_ptr; 297 335 const uint16* t = src_ptr + src_stride; … … 315 353 316 354 // Filter rows 1 and 2 together, 1 : 1 317 void ScaleRowDown34_1_Box_C(const uint8* src_ptr, ptrdiff_t src_stride, 318 uint8* d, int dst_width) { 355 void ScaleRowDown34_1_Box_C(const uint8* src_ptr, 356 ptrdiff_t src_stride, 357 uint8* d, 358 int dst_width) { 319 359 const uint8* s = src_ptr; 320 360 const uint8* t = src_ptr + src_stride; … … 337 377 } 338 378 339 void ScaleRowDown34_1_Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride, 340 uint16* d, int dst_width) { 379 void ScaleRowDown34_1_Box_16_C(const uint16* src_ptr, 380 ptrdiff_t src_stride, 381 uint16* d, 382 int dst_width) { 341 383 const uint16* s = src_ptr; 342 384 const uint16* t = src_ptr + src_stride; … … 360 402 361 403 // Scales a single row of pixels using point sampling. 362 void ScaleCols_C(uint8* dst_ptr, const uint8* src_ptr, 363 int dst_width, int x, int dx) { 404 void ScaleCols_C(uint8* dst_ptr, 405 const uint8* src_ptr, 406 int dst_width, 407 int x, 408 int dx) { 364 409 int j; 365 410 for (j = 0; j < dst_width - 1; j += 2) { … … 375 420 } 376 421 377 void ScaleCols_16_C(uint16* dst_ptr, const uint16* src_ptr, 378 int dst_width, int x, int dx) { 422 void ScaleCols_16_C(uint16* dst_ptr, 423 const uint16* src_ptr, 424 int dst_width, 425 int x, 426 int dx) { 379 427 int j; 380 428 for (j = 0; j < dst_width - 1; j += 2) { … … 391 439 392 440 // Scales a single row of pixels up by 2x using point sampling. 393 void ScaleColsUp2_C(uint8* dst_ptr, const uint8* src_ptr, 394 int dst_width, int x, int dx) { 395 int j; 441 void ScaleColsUp2_C(uint8* dst_ptr, 442 const uint8* src_ptr, 443 int dst_width, 444 int x, 445 int dx) { 446 int j; 447 (void)x; 448 (void)dx; 396 449 for (j = 0; j < dst_width - 1; j += 2) { 397 450 dst_ptr[1] = dst_ptr[0] = src_ptr[0]; … … 404 457 } 405 458 406 void ScaleColsUp2_16_C(uint16* dst_ptr, const uint16* src_ptr, 407 int dst_width, int x, int dx) { 408 int j; 459 void ScaleColsUp2_16_C(uint16* dst_ptr, 460 const uint16* src_ptr, 461 int dst_width, 462 int x, 463 int dx) { 464 int j; 465 (void)x; 466 (void)dx; 409 467 for (j = 0; j < dst_width - 1; j += 2) { 410 468 dst_ptr[1] = dst_ptr[0] = src_ptr[0]; … … 418 476 419 477 // (1-f)a + fb can be replaced with a + f(b-a) 420 #define BLENDER(a, b, f) (uint8)((int)(a) + \ 421 ((int)(f) * ((int)(b) - (int)(a)) >> 16)) 422 423 void ScaleFilterCols_C(uint8* dst_ptr, const uint8* src_ptr, 424 int dst_width, int x, int dx) { 478 #if defined(__arm__) || defined(__aarch64__) 479 #define BLENDER(a, b, f) \ 480 (uint8)((int)(a) + ((((int)((f)) * ((int)(b) - (int)(a))) + 0x8000) >> 16)) 481 #else 482 // Intel uses 7 bit math with rounding. 483 #define BLENDER(a, b, f) \ 484 (uint8)((int)(a) + (((int)((f) >> 9) * ((int)(b) - (int)(a)) + 0x40) >> 7)) 485 #endif 486 487 void ScaleFilterCols_C(uint8* dst_ptr, 488 const uint8* src_ptr, 489 int dst_width, 490 int x, 491 int dx) { 425 492 int j; 426 493 for (j = 0; j < dst_width - 1; j += 2) { … … 445 512 } 446 513 447 void ScaleFilterCols64_C(uint8* dst_ptr, const uint8* src_ptr, 448 int dst_width, int x32, int dx) { 514 void ScaleFilterCols64_C(uint8* dst_ptr, 515 const uint8* src_ptr, 516 int dst_width, 517 int x32, 518 int dx) { 449 519 int64 x = (int64)(x32); 450 520 int j; … … 471 541 #undef BLENDER 472 542 473 #define BLENDER(a, b, f) (uint16)((int)(a) + \ 474 ((int)(f) * ((int)(b) - (int)(a)) >> 16)) 475 476 void ScaleFilterCols_16_C(uint16* dst_ptr, const uint16* src_ptr, 477 int dst_width, int x, int dx) { 543 // Same as 8 bit arm blender but return is cast to uint16 544 #define BLENDER(a, b, f) \ 545 (uint16)((int)(a) + ((((int)((f)) * ((int)(b) - (int)(a))) + 0x8000) >> 16)) 546 547 void ScaleFilterCols_16_C(uint16* dst_ptr, 548 const uint16* src_ptr, 549 int dst_width, 550 int x, 551 int dx) { 478 552 int j; 479 553 for (j = 0; j < dst_width - 1; j += 2) { … … 498 572 } 499 573 500 void ScaleFilterCols64_16_C(uint16* dst_ptr, const uint16* src_ptr, 501 int dst_width, int x32, int dx) { 574 void ScaleFilterCols64_16_C(uint16* dst_ptr, 575 const uint16* src_ptr, 576 int dst_width, 577 int x32, 578 int dx) { 502 579 int64 x = (int64)(x32); 503 580 int j; … … 524 601 #undef BLENDER 525 602 526 void ScaleRowDown38_C(const uint8* src_ptr, ptrdiff_t src_stride, 527 uint8* dst, int dst_width) { 528 int x; 603 void ScaleRowDown38_C(const uint8* src_ptr, 604 ptrdiff_t src_stride, 605 uint8* dst, 606 int dst_width) { 607 int x; 608 (void)src_stride; 529 609 assert(dst_width % 3 == 0); 530 610 for (x = 0; x < dst_width; x += 3) { … … 537 617 } 538 618 539 void ScaleRowDown38_16_C(const uint16* src_ptr, ptrdiff_t src_stride, 540 uint16* dst, int dst_width) { 541 int x; 619 void ScaleRowDown38_16_C(const uint16* src_ptr, 620 ptrdiff_t src_stride, 621 uint16* dst, 622 int dst_width) { 623 int x; 624 (void)src_stride; 542 625 assert(dst_width % 3 == 0); 543 626 for (x = 0; x < dst_width; x += 3) { … … 553 636 void ScaleRowDown38_3_Box_C(const uint8* src_ptr, 554 637 ptrdiff_t src_stride, 555 uint8* dst_ptr, int dst_width) { 638 uint8* dst_ptr, 639 int dst_width) { 556 640 intptr_t stride = src_stride; 557 641 int i; 558 642 assert((dst_width % 3 == 0) && (dst_width > 0)); 559 643 for (i = 0; i < dst_width; i += 3) { 560 dst_ptr[0] = (src_ptr[0] + src_ptr[1] + src_ptr[2] + 561 src_ptr[stride + 0] + src_ptr[stride + 1] + 562 src_ptr[stride + 2] + src_ptr[stride * 2 + 0] + 563 src_ptr[stride * 2 + 1] + src_ptr[stride * 2 + 2]) * 564 (65536 / 9) >> 16; 565 dst_ptr[1] = (src_ptr[3] + src_ptr[4] + src_ptr[5] + 566 src_ptr[stride + 3] + src_ptr[stride + 4] + 567 src_ptr[stride + 5] + src_ptr[stride * 2 + 3] + 568 src_ptr[stride * 2 + 4] + src_ptr[stride * 2 + 5]) * 569 (65536 / 9) >> 16; 570 dst_ptr[2] = (src_ptr[6] + src_ptr[7] + 571 src_ptr[stride + 6] + src_ptr[stride + 7] + 572 src_ptr[stride * 2 + 6] + src_ptr[stride * 2 + 7]) * 573 (65536 / 6) >> 16; 644 dst_ptr[0] = 645 (src_ptr[0] + src_ptr[1] + src_ptr[2] + src_ptr[stride + 0] + 646 src_ptr[stride + 1] + src_ptr[stride + 2] + src_ptr[stride * 2 + 0] + 647 src_ptr[stride * 2 + 1] + src_ptr[stride * 2 + 2]) * 648 (65536 / 9) >> 649 16; 650 dst_ptr[1] = 651 (src_ptr[3] + src_ptr[4] + src_ptr[5] + src_ptr[stride + 3] + 652 src_ptr[stride + 4] + src_ptr[stride + 5] + src_ptr[stride * 2 + 3] + 653 src_ptr[stride * 2 + 4] + src_ptr[stride * 2 + 5]) * 654 (65536 / 9) >> 655 16; 656 dst_ptr[2] = 657 (src_ptr[6] + src_ptr[7] + src_ptr[stride + 6] + src_ptr[stride + 7] + 658 src_ptr[stride * 2 + 6] + src_ptr[stride * 2 + 7]) * 659 (65536 / 6) >> 660 16; 574 661 src_ptr += 8; 575 662 dst_ptr += 3; … … 579 666 void ScaleRowDown38_3_Box_16_C(const uint16* src_ptr, 580 667 ptrdiff_t src_stride, 581 uint16* dst_ptr, int dst_width) { 668 uint16* dst_ptr, 669 int dst_width) { 582 670 intptr_t stride = src_stride; 583 671 int i; 584 672 assert((dst_width % 3 == 0) && (dst_width > 0)); 585 673 for (i = 0; i < dst_width; i += 3) { 586 dst_ptr[0] = (src_ptr[0] + src_ptr[1] + src_ptr[2] + 587 src_ptr[stride + 0] + src_ptr[stride + 1] + 588 src_ptr[stride + 2] + src_ptr[stride * 2 + 0] + 589 src_ptr[stride * 2 + 1] + src_ptr[stride * 2 + 2]) * 590 (65536 / 9) >> 16; 591 dst_ptr[1] = (src_ptr[3] + src_ptr[4] + src_ptr[5] + 592 src_ptr[stride + 3] + src_ptr[stride + 4] + 593 src_ptr[stride + 5] + src_ptr[stride * 2 + 3] + 594 src_ptr[stride * 2 + 4] + src_ptr[stride * 2 + 5]) * 595 (65536 / 9) >> 16; 596 dst_ptr[2] = (src_ptr[6] + src_ptr[7] + 597 src_ptr[stride + 6] + src_ptr[stride + 7] + 598 src_ptr[stride * 2 + 6] + src_ptr[stride * 2 + 7]) * 599 (65536 / 6) >> 16; 674 dst_ptr[0] = 675 (src_ptr[0] + src_ptr[1] + src_ptr[2] + src_ptr[stride + 0] + 676 src_ptr[stride + 1] + src_ptr[stride + 2] + src_ptr[stride * 2 + 0] + 677 src_ptr[stride * 2 + 1] + src_ptr[stride * 2 + 2]) * 678 (65536 / 9) >> 679 16; 680 dst_ptr[1] = 681 (src_ptr[3] + src_ptr[4] + src_ptr[5] + src_ptr[stride + 3] + 682 src_ptr[stride + 4] + src_ptr[stride + 5] + src_ptr[stride * 2 + 3] + 683 src_ptr[stride * 2 + 4] + src_ptr[stride * 2 + 5]) * 684 (65536 / 9) >> 685 16; 686 dst_ptr[2] = 687 (src_ptr[6] + src_ptr[7] + src_ptr[stride + 6] + src_ptr[stride + 7] + 688 src_ptr[stride * 2 + 6] + src_ptr[stride * 2 + 7]) * 689 (65536 / 6) >> 690 16; 600 691 src_ptr += 8; 601 692 dst_ptr += 3; … … 604 695 605 696 // 8x2 -> 3x1 606 void ScaleRowDown38_2_Box_C(const uint8* src_ptr, ptrdiff_t src_stride, 607 uint8* dst_ptr, int dst_width) { 697 void ScaleRowDown38_2_Box_C(const uint8* src_ptr, 698 ptrdiff_t src_stride, 699 uint8* dst_ptr, 700 int dst_width) { 608 701 intptr_t stride = src_stride; 609 702 int i; 610 703 assert((dst_width % 3 == 0) && (dst_width > 0)); 611 704 for (i = 0; i < dst_width; i += 3) { 612 dst_ptr[0] = (src_ptr[0] + src_ptr[1] + src_ptr[2] + 613 src_ptr[stride + 0] + src_ptr[stride + 1] + 614 src_ptr[stride + 2]) * (65536 / 6) >> 16; 615 dst_ptr[1] = (src_ptr[3] + src_ptr[4] + src_ptr[5] + 616 src_ptr[stride + 3] + src_ptr[stride + 4] + 617 src_ptr[stride + 5]) * (65536 / 6) >> 16; 618 dst_ptr[2] = (src_ptr[6] + src_ptr[7] + 619 src_ptr[stride + 6] + src_ptr[stride + 7]) * 620 (65536 / 4) >> 16; 705 dst_ptr[0] = (src_ptr[0] + src_ptr[1] + src_ptr[2] + src_ptr[stride + 0] + 706 src_ptr[stride + 1] + src_ptr[stride + 2]) * 707 (65536 / 6) >> 708 16; 709 dst_ptr[1] = (src_ptr[3] + src_ptr[4] + src_ptr[5] + src_ptr[stride + 3] + 710 src_ptr[stride + 4] + src_ptr[stride + 5]) * 711 (65536 / 6) >> 712 16; 713 dst_ptr[2] = 714 (src_ptr[6] + src_ptr[7] + src_ptr[stride + 6] + src_ptr[stride + 7]) * 715 (65536 / 4) >> 716 16; 621 717 src_ptr += 8; 622 718 dst_ptr += 3; … … 624 720 } 625 721 626 void ScaleRowDown38_2_Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride, 627 uint16* dst_ptr, int dst_width) { 722 void ScaleRowDown38_2_Box_16_C(const uint16* src_ptr, 723 ptrdiff_t src_stride, 724 uint16* dst_ptr, 725 int dst_width) { 628 726 intptr_t stride = src_stride; 629 727 int i; 630 728 assert((dst_width % 3 == 0) && (dst_width > 0)); 631 729 for (i = 0; i < dst_width; i += 3) { 632 dst_ptr[0] = (src_ptr[0] + src_ptr[1] + src_ptr[2] + 633 src_ptr[stride + 0] + src_ptr[stride + 1] + 634 src_ptr[stride + 2]) * (65536 / 6) >> 16; 635 dst_ptr[1] = (src_ptr[3] + src_ptr[4] + src_ptr[5] + 636 src_ptr[stride + 3] + src_ptr[stride + 4] + 637 src_ptr[stride + 5]) * (65536 / 6) >> 16; 638 dst_ptr[2] = (src_ptr[6] + src_ptr[7] + 639 src_ptr[stride + 6] + src_ptr[stride + 7]) * 640 (65536 / 4) >> 16; 730 dst_ptr[0] = (src_ptr[0] + src_ptr[1] + src_ptr[2] + src_ptr[stride + 0] + 731 src_ptr[stride + 1] + src_ptr[stride + 2]) * 732 (65536 / 6) >> 733 16; 734 dst_ptr[1] = (src_ptr[3] + src_ptr[4] + src_ptr[5] + src_ptr[stride + 3] + 735 src_ptr[stride + 4] + src_ptr[stride + 5]) * 736 (65536 / 6) >> 737 16; 738 dst_ptr[2] = 739 (src_ptr[6] + src_ptr[7] + src_ptr[stride + 6] + src_ptr[stride + 7]) * 740 (65536 / 4) >> 741 16; 641 742 src_ptr += 8; 642 743 dst_ptr += 3; … … 674 775 void ScaleARGBRowDown2_C(const uint8* src_argb, 675 776 ptrdiff_t src_stride, 676 uint8* dst_argb, int dst_width) { 777 uint8* dst_argb, 778 int dst_width) { 677 779 const uint32* src = (const uint32*)(src_argb); 678 780 uint32* dst = (uint32*)(dst_argb); 679 680 int x;781 int x; 782 (void)src_stride; 681 783 for (x = 0; x < dst_width - 1; x += 2) { 682 784 dst[0] = src[1]; … … 692 794 void ScaleARGBRowDown2Linear_C(const uint8* src_argb, 693 795 ptrdiff_t src_stride, 694 uint8* dst_argb, int dst_width) { 695 int x; 796 uint8* dst_argb, 797 int dst_width) { 798 int x; 799 (void)src_stride; 696 800 for (x = 0; x < dst_width; ++x) { 697 801 dst_argb[0] = (src_argb[0] + src_argb[4] + 1) >> 1; … … 704 808 } 705 809 706 void ScaleARGBRowDown2Box_C(const uint8* src_argb, ptrdiff_t src_stride, 707 uint8* dst_argb, int dst_width) { 810 void ScaleARGBRowDown2Box_C(const uint8* src_argb, 811 ptrdiff_t src_stride, 812 uint8* dst_argb, 813 int dst_width) { 708 814 int x; 709 815 for (x = 0; x < dst_width; ++x) { 710 dst_argb[0] = (src_argb[0] + src_argb[4] + 711 src_argb[src_stride] + src_argb[src_stride + 4] + 2) >> 2; 712 dst_argb[1] = (src_argb[1] + src_argb[5] + 713 src_argb[src_stride + 1] + src_argb[src_stride + 5] + 2) >> 2; 714 dst_argb[2] = (src_argb[2] + src_argb[6] + 715 src_argb[src_stride + 2] + src_argb[src_stride + 6] + 2) >> 2; 716 dst_argb[3] = (src_argb[3] + src_argb[7] + 717 src_argb[src_stride + 3] + src_argb[src_stride + 7] + 2) >> 2; 816 dst_argb[0] = (src_argb[0] + src_argb[4] + src_argb[src_stride] + 817 src_argb[src_stride + 4] + 2) >> 818 2; 819 dst_argb[1] = (src_argb[1] + src_argb[5] + src_argb[src_stride + 1] + 820 src_argb[src_stride + 5] + 2) >> 821 2; 822 dst_argb[2] = (src_argb[2] + src_argb[6] + src_argb[src_stride + 2] + 823 src_argb[src_stride + 6] + 2) >> 824 2; 825 dst_argb[3] = (src_argb[3] + src_argb[7] + src_argb[src_stride + 3] + 826 src_argb[src_stride + 7] + 2) >> 827 2; 718 828 src_argb += 8; 719 829 dst_argb += 4; … … 721 831 } 722 832 723 void ScaleARGBRowDownEven_C(const uint8* src_argb, ptrdiff_t src_stride, 833 void ScaleARGBRowDownEven_C(const uint8* src_argb, 834 ptrdiff_t src_stride, 724 835 int src_stepx, 725 uint8* dst_argb, int dst_width) { 836 uint8* dst_argb, 837 int dst_width) { 726 838 const uint32* src = (const uint32*)(src_argb); 727 839 uint32* dst = (uint32*)(dst_argb); 728 840 (void)src_stride; 729 841 int x; 730 842 for (x = 0; x < dst_width - 1; x += 2) { … … 742 854 ptrdiff_t src_stride, 743 855 int src_stepx, 744 uint8* dst_argb, int dst_width) { 856 uint8* dst_argb, 857 int dst_width) { 745 858 int x; 746 859 for (x = 0; x < dst_width; ++x) { 747 dst_argb[0] = (src_argb[0] + src_argb[4] + 748 src_argb[src_stride] + src_argb[src_stride + 4] + 2) >> 2; 749 dst_argb[1] = (src_argb[1] + src_argb[5] + 750 src_argb[src_stride + 1] + src_argb[src_stride + 5] + 2) >> 2; 751 dst_argb[2] = (src_argb[2] + src_argb[6] + 752 src_argb[src_stride + 2] + src_argb[src_stride + 6] + 2) >> 2; 753 dst_argb[3] = (src_argb[3] + src_argb[7] + 754 src_argb[src_stride + 3] + src_argb[src_stride + 7] + 2) >> 2; 860 dst_argb[0] = (src_argb[0] + src_argb[4] + src_argb[src_stride] + 861 src_argb[src_stride + 4] + 2) >> 862 2; 863 dst_argb[1] = (src_argb[1] + src_argb[5] + src_argb[src_stride + 1] + 864 src_argb[src_stride + 5] + 2) >> 865 2; 866 dst_argb[2] = (src_argb[2] + src_argb[6] + src_argb[src_stride + 2] + 867 src_argb[src_stride + 6] + 2) >> 868 2; 869 dst_argb[3] = (src_argb[3] + src_argb[7] + src_argb[src_stride + 3] + 870 src_argb[src_stride + 7] + 2) >> 871 2; 755 872 src_argb += src_stepx * 4; 756 873 dst_argb += 4; … … 759 876 760 877 // Scales a single row of pixels using point sampling. 761 void ScaleARGBCols_C(uint8* dst_argb, const uint8* src_argb, 762 int dst_width, int x, int dx) { 878 void ScaleARGBCols_C(uint8* dst_argb, 879 const uint8* src_argb, 880 int dst_width, 881 int x, 882 int dx) { 763 883 const uint32* src = (const uint32*)(src_argb); 764 884 uint32* dst = (uint32*)(dst_argb); … … 776 896 } 777 897 778 void ScaleARGBCols64_C(uint8* dst_argb, const uint8* src_argb, 779 int dst_width, int x32, int dx) { 898 void ScaleARGBCols64_C(uint8* dst_argb, 899 const uint8* src_argb, 900 int dst_width, 901 int x32, 902 int dx) { 780 903 int64 x = (int64)(x32); 781 904 const uint32* src = (const uint32*)(src_argb); … … 795 918 796 919 // Scales a single row of pixels up by 2x using point sampling. 797 void ScaleARGBColsUp2_C(uint8* dst_argb, const uint8* src_argb, 798 int dst_width, int x, int dx) { 920 void ScaleARGBColsUp2_C(uint8* dst_argb, 921 const uint8* src_argb, 922 int dst_width, 923 int x, 924 int dx) { 799 925 const uint32* src = (const uint32*)(src_argb); 800 926 uint32* dst = (uint32*)(dst_argb); 801 927 int j; 928 (void)x; 929 (void)dx; 802 930 for (j = 0; j < dst_width - 1; j += 2) { 803 931 dst[1] = dst[0] = src[0]; … … 810 938 } 811 939 940 // TODO(fbarchard): Replace 0x7f ^ f with 128-f. bug=607. 812 941 // Mimics SSSE3 blender 813 #define BLENDER1(a, b, f) ((a) * (0x7f ^ f) + (b) * f) >> 7 814 #define BLENDERC(a, b, f, s) (uint32)( \ 815 BLENDER1(((a) >> s) & 255, ((b) >> s) & 255, f) << s) 816 #define BLENDER(a, b, f) \ 817 BLENDERC(a, b, f, 24) | BLENDERC(a, b, f, 16) | \ 818 BLENDERC(a, b, f, 8) | BLENDERC(a, b, f, 0) 819 820 void ScaleARGBFilterCols_C(uint8* dst_argb, const uint8* src_argb, 821 int dst_width, int x, int dx) { 942 #define BLENDER1(a, b, f) ((a) * (0x7f ^ f) + (b)*f) >> 7 943 #define BLENDERC(a, b, f, s) \ 944 (uint32)(BLENDER1(((a) >> s) & 255, ((b) >> s) & 255, f) << s) 945 #define BLENDER(a, b, f) \ 946 BLENDERC(a, b, f, 24) | BLENDERC(a, b, f, 16) | BLENDERC(a, b, f, 8) | \ 947 BLENDERC(a, b, f, 0) 948 949 void ScaleARGBFilterCols_C(uint8* dst_argb, 950 const uint8* src_argb, 951 int dst_width, 952 int x, 953 int dx) { 822 954 const uint32* src = (const uint32*)(src_argb); 823 955 uint32* dst = (uint32*)(dst_argb); … … 847 979 } 848 980 849 void ScaleARGBFilterCols64_C(uint8* dst_argb, const uint8* src_argb, 850 int dst_width, int x32, int dx) { 981 void ScaleARGBFilterCols64_C(uint8* dst_argb, 982 const uint8* src_argb, 983 int dst_width, 984 int x32, 985 int dx) { 851 986 int64 x = (int64)(x32); 852 987 const uint32* src = (const uint32*)(src_argb); … … 882 1017 // Scale plane vertically with bilinear interpolation. 883 1018 void ScalePlaneVertical(int src_height, 884 int dst_width, int dst_height, 885 int src_stride, int dst_stride, 886 const uint8* src_argb, uint8* dst_argb, 887 int x, int y, int dy, 888 int bpp, enum FilterMode filtering) { 1019 int dst_width, 1020 int dst_height, 1021 int src_stride, 1022 int dst_stride, 1023 const uint8* src_argb, 1024 uint8* dst_argb, 1025 int x, 1026 int y, 1027 int dy, 1028 int bpp, 1029 enum FilterMode filtering) { 889 1030 // TODO(fbarchard): Allow higher bpp. 890 1031 int dst_width_bytes = dst_width * bpp; 891 void (*InterpolateRow)(uint8 * dst_argb, const uint8* src_argb,892 ptrdiff_t src_stride, int dst_width, int source_y_fraction) =893 InterpolateRow_C;1032 void (*InterpolateRow)(uint8 * dst_argb, const uint8* src_argb, 1033 ptrdiff_t src_stride, int dst_width, 1034 int source_y_fraction) = InterpolateRow_C; 894 1035 const int max_y = (src_height > 1) ? ((src_height - 1) << 16) - 1 : 0; 895 1036 int j; … … 924 1065 #endif 925 1066 #if defined(HAS_INTERPOLATEROW_DSPR2) 926 if (TestCpuFlag(kCpuHasDSPR2) && 927 IS_ALIGNED(src_ argb, 4) && IS_ALIGNED(src_stride, 4) &&928 IS_ALIGNED(dst_ argb, 4) && IS_ALIGNED(dst_stride, 4)) {1067 if (TestCpuFlag(kCpuHasDSPR2) && IS_ALIGNED(src_argb, 4) && 1068 IS_ALIGNED(src_stride, 4) && IS_ALIGNED(dst_argb, 4) && 1069 IS_ALIGNED(dst_stride, 4)) { 929 1070 InterpolateRow = InterpolateRow_Any_DSPR2; 930 1071 if (IS_ALIGNED(dst_width_bytes, 4)) { 931 1072 InterpolateRow = InterpolateRow_DSPR2; 1073 } 1074 } 1075 #endif 1076 #if defined(HAS_INTERPOLATEROW_MSA) 1077 if (TestCpuFlag(kCpuHasMSA)) { 1078 InterpolateRow = InterpolateRow_Any_MSA; 1079 if (IS_ALIGNED(dst_width_bytes, 32)) { 1080 InterpolateRow = InterpolateRow_MSA; 932 1081 } 933 1082 } … … 941 1090 yi = y >> 16; 942 1091 yf = filtering ? ((y >> 8) & 255) : 0; 943 InterpolateRow(dst_argb, src_argb + yi * src_stride, 944 src_stride,dst_width_bytes, yf);1092 InterpolateRow(dst_argb, src_argb + yi * src_stride, src_stride, 1093 dst_width_bytes, yf); 945 1094 dst_argb += dst_stride; 946 1095 y += dy; … … 948 1097 } 949 1098 void ScalePlaneVertical_16(int src_height, 950 int dst_width, int dst_height, 951 int src_stride, int dst_stride, 952 const uint16* src_argb, uint16* dst_argb, 953 int x, int y, int dy, 954 int wpp, enum FilterMode filtering) { 1099 int dst_width, 1100 int dst_height, 1101 int src_stride, 1102 int dst_stride, 1103 const uint16* src_argb, 1104 uint16* dst_argb, 1105 int x, 1106 int y, 1107 int dy, 1108 int wpp, 1109 enum FilterMode filtering) { 955 1110 // TODO(fbarchard): Allow higher wpp. 956 1111 int dst_width_words = dst_width * wpp; 957 void (*InterpolateRow)(uint16 * dst_argb, const uint16* src_argb,958 ptrdiff_t src_stride, int dst_width, int source_y_fraction) =959 InterpolateRow_16_C;1112 void (*InterpolateRow)(uint16 * dst_argb, const uint16* src_argb, 1113 ptrdiff_t src_stride, int dst_width, 1114 int source_y_fraction) = InterpolateRow_16_C; 960 1115 const int max_y = (src_height > 1) ? ((src_height - 1) << 16) - 1 : 0; 961 1116 int j; … … 998 1153 #endif 999 1154 #if defined(HAS_INTERPOLATEROW_16_DSPR2) 1000 if (TestCpuFlag(kCpuHasDSPR2) && 1001 IS_ALIGNED(src_ argb, 4) && IS_ALIGNED(src_stride, 4) &&1002 IS_ALIGNED(dst_ argb, 4) && IS_ALIGNED(dst_stride, 4)) {1155 if (TestCpuFlag(kCpuHasDSPR2) && IS_ALIGNED(src_argb, 4) && 1156 IS_ALIGNED(src_stride, 4) && IS_ALIGNED(dst_argb, 4) && 1157 IS_ALIGNED(dst_stride, 4)) { 1003 1158 InterpolateRow = InterpolateRow_Any_16_DSPR2; 1004 1159 if (IS_ALIGNED(dst_width_bytes, 4)) { … … 1015 1170 yi = y >> 16; 1016 1171 yf = filtering ? ((y >> 8) & 255) : 0; 1017 InterpolateRow(dst_argb, src_argb + yi * src_stride, 1018 src_stride,dst_width_words, yf);1172 InterpolateRow(dst_argb, src_argb + yi * src_stride, src_stride, 1173 dst_width_words, yf); 1019 1174 dst_argb += dst_stride; 1020 1175 y += dy; … … 1023 1178 1024 1179 // Simplify the filtering based on scale factors. 1025 enum FilterMode ScaleFilterReduce(int src_width, int src_height, 1026 int dst_width, int dst_height, 1180 enum FilterMode ScaleFilterReduce(int src_width, 1181 int src_height, 1182 int dst_width, 1183 int dst_height, 1027 1184 enum FilterMode filtering) { 1028 1185 if (src_width < 0) { … … 1071 1228 // Divide num by div and return as 16.16 fixed point result. 1072 1229 int FixedDiv1_C(int num, int div) { 1073 return (int)((((int64)(num) << 16) - 0x00010001) / 1074 (div - 1)); 1230 return (int)((((int64)(num) << 16) - 0x00010001) / (div - 1)); 1075 1231 } 1076 1232 … … 1078 1234 1079 1235 // Compute slope values for stepping. 1080 void ScaleSlope(int src_width, int src_height, 1081 int dst_width, int dst_height, 1236 void ScaleSlope(int src_width, 1237 int src_height, 1238 int dst_width, 1239 int dst_height, 1082 1240 enum FilterMode filtering, 1083 int* x, int* y, int* dx, int* dy) { 1241 int* x, 1242 int* y, 1243 int* dx, 1244 int* dy) { 1084 1245 assert(x != NULL); 1085 1246 assert(y != NULL); … … 1113 1274 } 1114 1275 if (dst_height <= src_height) { 1115 *dy = FixedDiv(src_height, 1276 *dy = FixedDiv(src_height, dst_height); 1116 1277 *y = CENTERSTART(*dy, -32768); // Subtract 0.5 (32768) to center filter. 1117 1278 } else if (dst_height > 1) {
Note: See TracChangeset
for help on using the changeset viewer.