1 /* 2 * Copyright 2011 The LibYuv 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 <stdlib.h> 12 #include <time.h> 13 14 #include "libyuv/rotate.h" 15 #include "../unit_test/unit_test.h" 16 17 namespace libyuv { 18 19 void PrintArray(uint8 *array, int w, int h) { 20 for (int i = 0; i < h; ++i) { 21 for (int j = 0; j < w; ++j) { 22 printf("%4d", (signed char)array[i * w + j]); 23 } 24 printf("\n"); 25 } 26 } 27 28 TEST_F(libyuvTest, Transpose) { 29 int iw, ih, ow, oh; 30 int err = 0; 31 32 for (iw = 8; iw < rotate_max_w_ && !err; ++iw) { 33 for (ih = 8; ih < rotate_max_h_ && !err; ++ih) { 34 int i; 35 ow = ih; 36 oh = iw; 37 38 align_buffer_16(input, iw * ih) 39 align_buffer_16(output_1, ow * oh) 40 align_buffer_16(output_2, iw * ih) 41 42 for (i = 0; i < iw * ih; ++i) { 43 input[i] = i; 44 } 45 46 TransposePlane(input, iw, output_1, ow, iw, ih); 47 TransposePlane(output_1, ow, output_2, oh, ow, oh); 48 49 for (i = 0; i < iw * ih; ++i) { 50 if (input[i] != output_2[i]) { 51 err++; 52 } 53 } 54 55 if (err) { 56 printf("input %dx%d \n", iw, ih); 57 PrintArray(input, iw, ih); 58 59 printf("transpose 1\n"); 60 PrintArray(output_1, ow, oh); 61 62 printf("transpose 2\n"); 63 PrintArray(output_2, iw, ih); 64 } 65 66 free_aligned_buffer_16(input) 67 free_aligned_buffer_16(output_1) 68 free_aligned_buffer_16(output_2) 69 } 70 } 71 72 EXPECT_EQ(0, err); 73 } 74 75 TEST_F(libyuvTest, TransposeUV) { 76 int iw, ih, ow, oh; 77 int err = 0; 78 79 for (iw = 16; iw < rotate_max_w_ && !err; iw += 2) { 80 for (ih = 8; ih < rotate_max_h_ && !err; ++ih) { 81 int i; 82 83 ow = ih; 84 oh = iw >> 1; 85 86 align_buffer_16(input, iw * ih) 87 align_buffer_16(output_a1, ow * oh) 88 align_buffer_16(output_b1, ow * oh) 89 align_buffer_16(output_a2, iw * ih) 90 align_buffer_16(output_b2, iw * ih) 91 92 for (i = 0; i < iw * ih; i += 2) { 93 input[i] = i >> 1; 94 input[i + 1] = -(i >> 1); 95 } 96 97 TransposeUV(input, iw, output_a1, ow, output_b1, ow, iw >> 1, ih); 98 99 TransposePlane(output_a1, ow, output_a2, oh, ow, oh); 100 TransposePlane(output_b1, ow, output_b2, oh, ow, oh); 101 102 for (i = 0; i < iw * ih; i += 2) { 103 if (input[i] != output_a2[i >> 1]) { 104 err++; 105 } 106 if (input[i + 1] != output_b2[i >> 1]) { 107 err++; 108 } 109 } 110 111 if (err) { 112 printf("input %dx%d \n", iw, ih); 113 PrintArray(input, iw, ih); 114 115 printf("transpose 1\n"); 116 PrintArray(output_a1, ow, oh); 117 PrintArray(output_b1, ow, oh); 118 119 printf("transpose 2\n"); 120 PrintArray(output_a2, oh, ow); 121 PrintArray(output_b2, oh, ow); 122 } 123 124 free_aligned_buffer_16(input) 125 free_aligned_buffer_16(output_a1) 126 free_aligned_buffer_16(output_b1) 127 free_aligned_buffer_16(output_a2) 128 free_aligned_buffer_16(output_b2) 129 } 130 } 131 132 EXPECT_EQ(0, err); 133 } 134 135 TEST_F(libyuvTest, RotatePlane90) { 136 int iw, ih, ow, oh; 137 int err = 0; 138 139 for (iw = 8; iw < rotate_max_w_ && !err; ++iw) { 140 for (ih = 8; ih < rotate_max_h_ && !err; ++ih) { 141 int i; 142 143 ow = ih; 144 oh = iw; 145 146 align_buffer_16(input, iw * ih) 147 align_buffer_16(output_0, iw * ih) 148 align_buffer_16(output_90, ow * oh) 149 align_buffer_16(output_180, iw * ih) 150 align_buffer_16(output_270, ow * oh) 151 152 for (i = 0; i < iw * ih; ++i) { 153 input[i] = i; 154 } 155 156 RotatePlane90(input, iw, output_90, ow, iw, ih); 157 RotatePlane90(output_90, ow, output_180, oh, ow, oh); 158 RotatePlane90(output_180, oh, output_270, ow, oh, ow); 159 RotatePlane90(output_270, ow, output_0, iw, ow, oh); 160 161 for (i = 0; i < iw * ih; ++i) { 162 if (input[i] != output_0[i]) { 163 err++; 164 } 165 } 166 167 if (err) { 168 printf("input %dx%d \n", iw, ih); 169 PrintArray(input, iw, ih); 170 171 printf("output 90\n"); 172 PrintArray(output_90, ow, oh); 173 174 printf("output 180\n"); 175 PrintArray(output_180, iw, ih); 176 177 printf("output 270\n"); 178 PrintArray(output_270, ow, oh); 179 180 printf("output 0\n"); 181 PrintArray(output_0, iw, ih); 182 } 183 184 free_aligned_buffer_16(input) 185 free_aligned_buffer_16(output_0) 186 free_aligned_buffer_16(output_90) 187 free_aligned_buffer_16(output_180) 188 free_aligned_buffer_16(output_270) 189 } 190 } 191 192 EXPECT_EQ(0, err); 193 } 194 195 TEST_F(libyuvTest, RotateUV90) { 196 int iw, ih, ow, oh; 197 int err = 0; 198 199 for (iw = 16; iw < rotate_max_w_ && !err; iw += 2) { 200 for (ih = 8; ih < rotate_max_h_ && !err; ++ih) { 201 int i; 202 203 ow = ih; 204 oh = iw >> 1; 205 206 align_buffer_16(input, iw * ih) 207 align_buffer_16(output_0_u, ow * oh) 208 align_buffer_16(output_0_v, ow * oh) 209 align_buffer_16(output_90_u, ow * oh) 210 align_buffer_16(output_90_v, ow * oh) 211 align_buffer_16(output_180_u, ow * oh) 212 align_buffer_16(output_180_v, ow * oh) 213 214 for (i = 0; i < iw * ih; i += 2) { 215 input[i] = i >> 1; 216 input[i + 1] = -(i >> 1); 217 } 218 219 RotateUV90(input, iw, output_90_u, ow, output_90_v, ow, iw >> 1, ih); 220 221 RotatePlane90(output_90_u, ow, output_180_u, oh, ow, oh); 222 RotatePlane90(output_90_v, ow, output_180_v, oh, ow, oh); 223 224 RotatePlane180(output_180_u, ow, output_0_u, ow, ow, oh); 225 RotatePlane180(output_180_v, ow, output_0_v, ow, ow, oh); 226 227 for (i = 0; i < (ow * oh); ++i) { 228 if (output_0_u[i] != (uint8)i) { 229 err++; 230 } 231 if (output_0_v[i] != (uint8)(-i)) { 232 err++; 233 } 234 } 235 236 if (err) { 237 printf("input %dx%d \n", iw, ih); 238 PrintArray(input, iw, ih); 239 240 printf("output 90_u\n"); 241 PrintArray(output_90_u, ow, oh); 242 243 printf("output 90_v\n"); 244 PrintArray(output_90_v, ow, oh); 245 246 printf("output 180_u\n"); 247 PrintArray(output_180_u, oh, ow); 248 249 printf("output 180_v\n"); 250 PrintArray(output_180_v, oh, ow); 251 252 printf("output 0_u\n"); 253 PrintArray(output_0_u, oh, ow); 254 255 printf("output 0_v\n"); 256 PrintArray(output_0_v, oh, ow); 257 } 258 259 free_aligned_buffer_16(input) 260 free_aligned_buffer_16(output_0_u) 261 free_aligned_buffer_16(output_0_v) 262 free_aligned_buffer_16(output_90_u) 263 free_aligned_buffer_16(output_90_v) 264 free_aligned_buffer_16(output_180_u) 265 free_aligned_buffer_16(output_180_v) 266 } 267 } 268 269 EXPECT_EQ(0, err); 270 } 271 272 TEST_F(libyuvTest, RotateUV180) { 273 int iw, ih, ow, oh; 274 int err = 0; 275 276 for (iw = 16; iw < rotate_max_w_ && !err; iw += 2) { 277 for (ih = 8; ih < rotate_max_h_ && !err; ++ih) { 278 int i; 279 280 ow = iw >> 1; 281 oh = ih; 282 283 align_buffer_16(input, iw * ih) 284 align_buffer_16(output_0_u, ow * oh) 285 align_buffer_16(output_0_v, ow * oh) 286 align_buffer_16(output_90_u, ow * oh) 287 align_buffer_16(output_90_v, ow * oh) 288 align_buffer_16(output_180_u, ow * oh) 289 align_buffer_16(output_180_v, ow * oh) 290 291 for (i = 0; i < iw * ih; i += 2) { 292 input[i] = i >> 1; 293 input[i + 1] = -(i >> 1); 294 } 295 296 RotateUV180(input, iw, output_180_u, ow, output_180_v, ow, iw >> 1, ih); 297 298 RotatePlane90(output_180_u, ow, output_90_u, oh, ow, oh); 299 RotatePlane90(output_180_v, ow, output_90_v, oh, ow, oh); 300 301 RotatePlane90(output_90_u, oh, output_0_u, ow, oh, ow); 302 RotatePlane90(output_90_v, oh, output_0_v, ow, oh, ow); 303 304 for (i = 0; i < (ow * oh); ++i) { 305 if (output_0_u[i] != (uint8)i) { 306 err++; 307 } 308 if (output_0_v[i] != (uint8)(-i)) { 309 err++; 310 } 311 } 312 313 if (err) { 314 printf("input %dx%d \n", iw, ih); 315 PrintArray(input, iw, ih); 316 317 printf("output 180_u\n"); 318 PrintArray(output_180_u, oh, ow); 319 320 printf("output 180_v\n"); 321 PrintArray(output_180_v, oh, ow); 322 323 printf("output 90_u\n"); 324 PrintArray(output_90_u, oh, ow); 325 326 printf("output 90_v\n"); 327 PrintArray(output_90_v, oh, ow); 328 329 printf("output 0_u\n"); 330 PrintArray(output_0_u, ow, oh); 331 332 printf("output 0_v\n"); 333 PrintArray(output_0_v, ow, oh); 334 } 335 336 free_aligned_buffer_16(input) 337 free_aligned_buffer_16(output_0_u) 338 free_aligned_buffer_16(output_0_v) 339 free_aligned_buffer_16(output_90_u) 340 free_aligned_buffer_16(output_90_v) 341 free_aligned_buffer_16(output_180_u) 342 free_aligned_buffer_16(output_180_v) 343 } 344 } 345 346 EXPECT_EQ(0, err); 347 } 348 349 TEST_F(libyuvTest, RotateUV270) { 350 int iw, ih, ow, oh; 351 int err = 0; 352 353 for (iw = 16; iw < rotate_max_w_ && !err; iw += 2) { 354 for (ih = 8; ih < rotate_max_h_ && !err; ++ih) { 355 int i; 356 357 ow = ih; 358 oh = iw >> 1; 359 360 align_buffer_16(input, iw * ih) 361 align_buffer_16(output_0_u, ow * oh) 362 align_buffer_16(output_0_v, ow * oh) 363 align_buffer_16(output_270_u, ow * oh) 364 align_buffer_16(output_270_v, ow * oh) 365 align_buffer_16(output_180_u, ow * oh) 366 align_buffer_16(output_180_v, ow * oh) 367 368 for (i = 0; i < iw * ih; i += 2) { 369 input[i] = i >> 1; 370 input[i + 1] = -(i >> 1); 371 } 372 373 RotateUV270(input, iw, output_270_u, ow, output_270_v, ow, 374 iw >> 1, ih); 375 376 RotatePlane270(output_270_u, ow, output_180_u, oh, ow, oh); 377 RotatePlane270(output_270_v, ow, output_180_v, oh, ow, oh); 378 379 RotatePlane180(output_180_u, ow, output_0_u, ow, ow, oh); 380 RotatePlane180(output_180_v, ow, output_0_v, ow, ow, oh); 381 382 for (i = 0; i < (ow * oh); ++i) { 383 if (output_0_u[i] != (uint8)i) { 384 err++; 385 } 386 if (output_0_v[i] != (uint8)(-i)) { 387 err++; 388 } 389 } 390 391 if (err) { 392 printf("input %dx%d \n", iw, ih); 393 PrintArray(input, iw, ih); 394 395 printf("output 270_u\n"); 396 PrintArray(output_270_u, ow, oh); 397 398 printf("output 270_v\n"); 399 PrintArray(output_270_v, ow, oh); 400 401 printf("output 180_u\n"); 402 PrintArray(output_180_u, oh, ow); 403 404 printf("output 180_v\n"); 405 PrintArray(output_180_v, oh, ow); 406 407 printf("output 0_u\n"); 408 PrintArray(output_0_u, oh, ow); 409 410 printf("output 0_v\n"); 411 PrintArray(output_0_v, oh, ow); 412 } 413 414 free_aligned_buffer_16(input) 415 free_aligned_buffer_16(output_0_u) 416 free_aligned_buffer_16(output_0_v) 417 free_aligned_buffer_16(output_270_u) 418 free_aligned_buffer_16(output_270_v) 419 free_aligned_buffer_16(output_180_u) 420 free_aligned_buffer_16(output_180_v) 421 } 422 } 423 424 EXPECT_EQ(0, err); 425 } 426 427 TEST_F(libyuvTest, RotatePlane180) { 428 int iw, ih, ow, oh; 429 int err = 0; 430 431 for (iw = 8; iw < rotate_max_w_ && !err; ++iw) 432 for (ih = 8; ih < rotate_max_h_ && !err; ++ih) { 433 int i; 434 435 ow = iw; 436 oh = ih; 437 438 align_buffer_16(input, iw * ih) 439 align_buffer_16(output_0, iw * ih) 440 align_buffer_16(output_180, iw * ih) 441 442 for (i = 0; i < iw * ih; ++i) { 443 input[i] = i; 444 } 445 446 RotatePlane180(input, iw, output_180, ow, iw, ih); 447 RotatePlane180(output_180, ow, output_0, iw, ow, oh); 448 449 for (i = 0; i < iw * ih; ++i) { 450 if (input[i] != output_0[i]) { 451 err++; 452 } 453 } 454 455 if (err) { 456 printf("input %dx%d \n", iw, ih); 457 PrintArray(input, iw, ih); 458 459 printf("output 180\n"); 460 PrintArray(output_180, iw, ih); 461 462 printf("output 0\n"); 463 PrintArray(output_0, iw, ih); 464 } 465 466 free_aligned_buffer_16(input) 467 free_aligned_buffer_16(output_0) 468 free_aligned_buffer_16(output_180) 469 } 470 471 EXPECT_EQ(0, err); 472 } 473 474 TEST_F(libyuvTest, RotatePlane270) { 475 int iw, ih, ow, oh; 476 int err = 0; 477 478 for (iw = 8; iw < rotate_max_w_ && !err; ++iw) { 479 for (ih = 8; ih < rotate_max_h_ && !err; ++ih) { 480 int i; 481 482 ow = ih; 483 oh = iw; 484 485 align_buffer_16(input, iw * ih) 486 align_buffer_16(output_0, iw * ih) 487 align_buffer_16(output_90, ow * oh) 488 align_buffer_16(output_180, iw * ih) 489 align_buffer_16(output_270, ow * oh) 490 491 for (i = 0; i < iw * ih; ++i) 492 input[i] = i; 493 494 RotatePlane270(input, iw, output_270, ow, iw, ih); 495 RotatePlane270(output_270, ow, output_180, oh, ow, oh); 496 RotatePlane270(output_180, oh, output_90, ow, oh, ow); 497 RotatePlane270(output_90, ow, output_0, iw, ow, oh); 498 499 for (i = 0; i < iw * ih; ++i) { 500 if (input[i] != output_0[i]) { 501 err++; 502 } 503 } 504 505 if (err) { 506 printf("input %dx%d \n", iw, ih); 507 PrintArray(input, iw, ih); 508 509 printf("output 270\n"); 510 PrintArray(output_270, ow, oh); 511 512 printf("output 180\n"); 513 PrintArray(output_180, iw, ih); 514 515 printf("output 90\n"); 516 PrintArray(output_90, ow, oh); 517 518 printf("output 0\n"); 519 PrintArray(output_0, iw, ih); 520 } 521 522 free_aligned_buffer_16(input) 523 free_aligned_buffer_16(output_0) 524 free_aligned_buffer_16(output_90) 525 free_aligned_buffer_16(output_180) 526 free_aligned_buffer_16(output_270) 527 } 528 } 529 530 EXPECT_EQ(0, err); 531 } 532 533 TEST_F(libyuvTest, RotatePlane90and270) { 534 int iw, ih, ow, oh; 535 int err = 0; 536 537 for (iw = 16; iw < rotate_max_w_ && !err; iw += 4) 538 for (ih = 16; ih < rotate_max_h_ && !err; ih += 4) { 539 int i; 540 541 ow = ih; 542 oh = iw; 543 544 align_buffer_16(input, iw * ih) 545 align_buffer_16(output_0, iw * ih) 546 align_buffer_16(output_90, ow * oh) 547 548 for (i = 0; i < iw * ih; ++i) { 549 input[i] = i; 550 } 551 552 RotatePlane90(input, iw, output_90, ow, iw, ih); 553 RotatePlane270(output_90, ow, output_0, iw, ow, oh); 554 555 for (i = 0; i < iw * ih; ++i) { 556 if (input[i] != output_0[i]) { 557 err++; 558 } 559 } 560 561 if (err) { 562 printf("intput %dx%d\n", iw, ih); 563 PrintArray(input, iw, ih); 564 565 printf("output \n"); 566 PrintArray(output_90, ow, oh); 567 568 printf("output \n"); 569 PrintArray(output_0, iw, ih); 570 } 571 572 free_aligned_buffer_16(input) 573 free_aligned_buffer_16(output_0) 574 free_aligned_buffer_16(output_90) 575 } 576 577 EXPECT_EQ(0, err); 578 } 579 580 TEST_F(libyuvTest, RotatePlane90Pitch) { 581 int iw, ih; 582 int err = 0; 583 584 for (iw = 16; iw < rotate_max_w_ && !err; iw += 4) 585 for (ih = 16; ih < rotate_max_h_ && !err; ih += 4) { 586 int i; 587 588 int ow = ih; 589 int oh = iw; 590 591 align_buffer_16(input, iw * ih) 592 align_buffer_16(output_0, iw * ih) 593 align_buffer_16(output_90, ow * oh) 594 595 for (i = 0; i < iw * ih; ++i) { 596 input[i] = i; 597 } 598 599 RotatePlane90(input, iw, 600 output_90 + (ow >> 1), ow, 601 iw >> 1, ih >> 1); 602 RotatePlane90(input + (iw >> 1), iw, 603 output_90 + (ow >> 1) + ow * (oh >> 1), ow, 604 iw >> 1, ih >> 1); 605 RotatePlane90(input + iw * (ih >> 1), iw, 606 output_90, ow, 607 iw >> 1, ih >> 1); 608 RotatePlane90(input + (iw >> 1) + iw * (ih >> 1), iw, 609 output_90 + ow * (oh >> 1), ow, 610 iw >> 1, ih >> 1); 611 612 RotatePlane270(output_90, ih, output_0, iw, ow, oh); 613 614 for (i = 0; i < iw * ih; ++i) { 615 if (input[i] != output_0[i]) { 616 err++; 617 } 618 } 619 620 if (err) { 621 printf("intput %dx%d\n", iw, ih); 622 PrintArray(input, iw, ih); 623 624 printf("output \n"); 625 PrintArray(output_90, ow, oh); 626 627 printf("output \n"); 628 PrintArray(output_0, iw, ih); 629 } 630 631 free_aligned_buffer_16(input) 632 free_aligned_buffer_16(output_0) 633 free_aligned_buffer_16(output_90) 634 } 635 636 EXPECT_EQ(0, err); 637 } 638 639 TEST_F(libyuvTest, RotatePlane270Pitch) { 640 int iw, ih, ow, oh; 641 int err = 0; 642 643 for (iw = 16; iw < rotate_max_w_ && !err; iw += 4) { 644 for (ih = 16; ih < rotate_max_h_ && !err; ih += 4) { 645 int i; 646 647 ow = ih; 648 oh = iw; 649 650 align_buffer_16(input, iw * ih) 651 align_buffer_16(output_0, iw * ih) 652 align_buffer_16(output_270, ow * oh) 653 654 for (i = 0; i < iw * ih; ++i) { 655 input[i] = i; 656 } 657 658 RotatePlane270(input, iw, 659 output_270 + ow * (oh >> 1), ow, 660 iw >> 1, ih >> 1); 661 RotatePlane270(input + (iw >> 1), iw, 662 output_270, ow, 663 iw >> 1, ih >> 1); 664 RotatePlane270(input + iw * (ih >> 1), iw, 665 output_270 + (ow >> 1) + ow * (oh >> 1), ow, 666 iw >> 1, ih >> 1); 667 RotatePlane270(input + (iw >> 1) + iw * (ih >> 1), iw, 668 output_270 + (ow >> 1), ow, 669 iw >> 1, ih >> 1); 670 671 RotatePlane90(output_270, ih, output_0, iw, ow, oh); 672 673 for (i = 0; i < iw * ih; ++i) { 674 if (input[i] != output_0[i]) { 675 err++; 676 } 677 } 678 679 if (err) { 680 printf("intput %dx%d\n", iw, ih); 681 PrintArray(input, iw, ih); 682 683 printf("output \n"); 684 PrintArray(output_270, ow, oh); 685 686 printf("output \n"); 687 PrintArray(output_0, iw, ih); 688 } 689 690 free_aligned_buffer_16(input) 691 free_aligned_buffer_16(output_0) 692 free_aligned_buffer_16(output_270) 693 } 694 } 695 696 EXPECT_EQ(0, err); 697 } 698 699 TEST_F(libyuvTest, I420Rotate90) { 700 int err = 0; 701 702 int yw = 1024; 703 int yh = 768; 704 int b = 128; 705 int uvw = (yw + 1) >> 1; 706 int uvh = (yh + 1) >> 1; 707 708 int i, j; 709 710 int y_plane_size = (yw + b * 2) * (yh + b * 2); 711 int uv_plane_size = (uvw + b * 2) * (uvh + b * 2); 712 713 srandom(time(NULL)); 714 715 align_buffer_16(orig_y, y_plane_size) 716 align_buffer_16(orig_u, uv_plane_size) 717 align_buffer_16(orig_v, uv_plane_size) 718 align_buffer_16(ro0_y, y_plane_size) 719 align_buffer_16(ro0_u, uv_plane_size) 720 align_buffer_16(ro0_v, uv_plane_size) 721 align_buffer_16(ro90_y, y_plane_size) 722 align_buffer_16(ro90_u, uv_plane_size) 723 align_buffer_16(ro90_v, uv_plane_size) 724 align_buffer_16(ro270_y, y_plane_size) 725 align_buffer_16(ro270_u, uv_plane_size) 726 align_buffer_16(ro270_v, uv_plane_size) 727 memset(orig_y, 0, y_plane_size); 728 memset(orig_u, 0, uv_plane_size); 729 memset(orig_v, 0, uv_plane_size); 730 memset(ro0_y, 0, y_plane_size); 731 memset(ro0_u, 0, uv_plane_size); 732 memset(ro0_v, 0, uv_plane_size); 733 memset(ro90_y, 0, y_plane_size); 734 memset(ro90_u, 0, uv_plane_size); 735 memset(ro90_v, 0, uv_plane_size); 736 memset(ro270_y, 0, y_plane_size); 737 memset(ro270_u, 0, uv_plane_size); 738 memset(ro270_v, 0, uv_plane_size); 739 740 // fill image buffers with random data 741 for (i = b; i < (yh + b); ++i) { 742 for (j = b; j < (yw + b); ++j) { 743 orig_y[i * (yw + b * 2) + j] = random() & 0xff; 744 } 745 } 746 747 for (i = b; i < (uvh + b); ++i) { 748 for (j = b; j < (uvw + b); ++j) { 749 orig_u[i * (uvw + b * 2) + j] = random() & 0xff; 750 orig_v[i * (uvw + b * 2) + j] = random() & 0xff; 751 } 752 } 753 754 int y_off_0 = b * (yw + b * 2) + b; 755 int uv_off_0 = b * (uvw + b * 2) + b; 756 int y_off_90 = b * (yh + b * 2) + b; 757 int uv_off_90 = b * (uvh + b * 2) + b; 758 759 int y_st_0 = yw + b * 2; 760 int uv_st_0 = uvw + b * 2; 761 int y_st_90 = yh + b * 2; 762 int uv_st_90 = uvh + b * 2; 763 764 I420Rotate(orig_y+y_off_0, y_st_0, 765 orig_u+uv_off_0, uv_st_0, 766 orig_v+uv_off_0, uv_st_0, 767 ro90_y+y_off_90, y_st_90, 768 ro90_u+uv_off_90, uv_st_90, 769 ro90_v+uv_off_90, uv_st_90, 770 yw, yh, 771 kRotateClockwise); 772 773 I420Rotate(ro90_y+y_off_90, y_st_90, 774 ro90_u+uv_off_90, uv_st_90, 775 ro90_v+uv_off_90, uv_st_90, 776 ro270_y+y_off_90, y_st_90, 777 ro270_u+uv_off_90, uv_st_90, 778 ro270_v+uv_off_90, uv_st_90, 779 yh, yw, 780 kRotate180); 781 782 I420Rotate(ro270_y+y_off_90, y_st_90, 783 ro270_u+uv_off_90, uv_st_90, 784 ro270_v+uv_off_90, uv_st_90, 785 ro0_y+y_off_0, y_st_0, 786 ro0_u+uv_off_0, uv_st_0, 787 ro0_v+uv_off_0, uv_st_0, 788 yh, yw, 789 kRotateClockwise); 790 791 for (i = 0; i < y_plane_size; ++i) { 792 if (orig_y[i] != ro0_y[i]) { 793 ++err; 794 } 795 } 796 797 for (i = 0; i < uv_plane_size; ++i) { 798 if (orig_u[i] != ro0_u[i]) { 799 ++err; 800 } 801 if (orig_v[i] != ro0_v[i]) { 802 ++err; 803 } 804 } 805 806 free_aligned_buffer_16(orig_y) 807 free_aligned_buffer_16(orig_u) 808 free_aligned_buffer_16(orig_v) 809 free_aligned_buffer_16(ro0_y) 810 free_aligned_buffer_16(ro0_u) 811 free_aligned_buffer_16(ro0_v) 812 free_aligned_buffer_16(ro90_y) 813 free_aligned_buffer_16(ro90_u) 814 free_aligned_buffer_16(ro90_v) 815 free_aligned_buffer_16(ro270_y) 816 free_aligned_buffer_16(ro270_u) 817 free_aligned_buffer_16(ro270_v) 818 819 EXPECT_EQ(0, err); 820 } 821 822 TEST_F(libyuvTest, I420Rotate270) { 823 int err = 0; 824 825 int yw = 1024; 826 int yh = 768; 827 int b = 128; 828 int uvw = (yw + 1) >> 1; 829 int uvh = (yh + 1) >> 1; 830 831 int i, j; 832 833 int y_plane_size = (yw + b * 2) * (yh + b * 2); 834 int uv_plane_size = (uvw + b * 2) * (uvh + b * 2); 835 836 srandom(time(NULL)); 837 838 align_buffer_16(orig_y, y_plane_size) 839 align_buffer_16(orig_u, uv_plane_size) 840 align_buffer_16(orig_v, uv_plane_size) 841 align_buffer_16(ro0_y, y_plane_size) 842 align_buffer_16(ro0_u, uv_plane_size) 843 align_buffer_16(ro0_v, uv_plane_size) 844 align_buffer_16(ro90_y, y_plane_size) 845 align_buffer_16(ro90_u, uv_plane_size) 846 align_buffer_16(ro90_v, uv_plane_size) 847 align_buffer_16(ro270_y, y_plane_size) 848 align_buffer_16(ro270_u, uv_plane_size) 849 align_buffer_16(ro270_v, uv_plane_size) 850 memset(orig_y, 0, y_plane_size); 851 memset(orig_u, 0, uv_plane_size); 852 memset(orig_v, 0, uv_plane_size); 853 memset(ro0_y, 0, y_plane_size); 854 memset(ro0_u, 0, uv_plane_size); 855 memset(ro0_v, 0, uv_plane_size); 856 memset(ro90_y, 0, y_plane_size); 857 memset(ro90_u, 0, uv_plane_size); 858 memset(ro90_v, 0, uv_plane_size); 859 memset(ro270_y, 0, y_plane_size); 860 memset(ro270_u, 0, uv_plane_size); 861 memset(ro270_v, 0, uv_plane_size); 862 863 // fill image buffers with random data 864 for (i = b; i < (yh + b); ++i) { 865 for (j = b; j < (yw + b); ++j) { 866 orig_y[i * (yw + b * 2) + j] = random() & 0xff; 867 } 868 } 869 870 for (i = b; i < (uvh + b); ++i) { 871 for (j = b; j < (uvw + b); ++j) { 872 orig_u[i * (uvw + b * 2) + j] = random() & 0xff; 873 orig_v[i * (uvw + b * 2) + j] = random() & 0xff; 874 } 875 } 876 877 int y_off_0 = b * (yw + b * 2) + b; 878 int uv_off_0 = b * (uvw + b * 2) + b; 879 int y_off_90 = b * (yh + b * 2) + b; 880 int uv_off_90 = b * (uvh + b * 2) + b; 881 882 int y_st_0 = yw + b * 2; 883 int uv_st_0 = uvw + b * 2; 884 int y_st_90 = yh + b * 2; 885 int uv_st_90 = uvh + b * 2; 886 887 I420Rotate(orig_y+y_off_0, y_st_0, 888 orig_u+uv_off_0, uv_st_0, 889 orig_v+uv_off_0, uv_st_0, 890 ro270_y+y_off_90, y_st_90, 891 ro270_u+uv_off_90, uv_st_90, 892 ro270_v+uv_off_90, uv_st_90, 893 yw, yh, 894 kRotateCounterClockwise); 895 896 I420Rotate(ro270_y+y_off_90, y_st_90, 897 ro270_u+uv_off_90, uv_st_90, 898 ro270_v+uv_off_90, uv_st_90, 899 ro90_y+y_off_90, y_st_90, 900 ro90_u+uv_off_90, uv_st_90, 901 ro90_v+uv_off_90, uv_st_90, 902 yh, yw, 903 kRotate180); 904 905 I420Rotate(ro90_y+y_off_90, y_st_90, 906 ro90_u+uv_off_90, uv_st_90, 907 ro90_v+uv_off_90, uv_st_90, 908 ro0_y+y_off_0, y_st_0, 909 ro0_u+uv_off_0, uv_st_0, 910 ro0_v+uv_off_0, uv_st_0, 911 yh, yw, 912 kRotateCounterClockwise); 913 914 for (i = 0; i < y_plane_size; ++i) { 915 if (orig_y[i] != ro0_y[i]) { 916 ++err; 917 } 918 } 919 920 for (i = 0; i < uv_plane_size; ++i) { 921 if (orig_u[i] != ro0_u[i]) { 922 ++err; 923 } 924 if (orig_v[i] != ro0_v[i]) { 925 ++err; 926 } 927 } 928 929 free_aligned_buffer_16(orig_y) 930 free_aligned_buffer_16(orig_u) 931 free_aligned_buffer_16(orig_v) 932 free_aligned_buffer_16(ro0_y) 933 free_aligned_buffer_16(ro0_u) 934 free_aligned_buffer_16(ro0_v) 935 free_aligned_buffer_16(ro90_y) 936 free_aligned_buffer_16(ro90_u) 937 free_aligned_buffer_16(ro90_v) 938 free_aligned_buffer_16(ro270_y) 939 free_aligned_buffer_16(ro270_u) 940 free_aligned_buffer_16(ro270_v) 941 942 EXPECT_EQ(0, err); 943 } 944 945 TEST_F(libyuvTest, NV12ToI420Rotate90) { 946 int err = 0; 947 948 int yw = 1024; 949 int yh = 768; 950 int b = 128; 951 int uvw = (yw + 1) >> 1; 952 int uvh = (yh + 1) >> 1; 953 int i, j; 954 955 int y_plane_size = (yw + b * 2) * (yh + b * 2); 956 int uv_plane_size = (uvw + b * 2) * (uvh + b * 2); 957 int o_uv_plane_size = (uvw * 2 + b * 2) * (uvh + b * 2); 958 959 srandom(time(NULL)); 960 961 align_buffer_16(orig_y, y_plane_size) 962 align_buffer_16(orig_uv, o_uv_plane_size) 963 align_buffer_16(ro0_y, y_plane_size) 964 align_buffer_16(ro0_u, uv_plane_size) 965 align_buffer_16(ro0_v, uv_plane_size) 966 align_buffer_16(ro90_y, y_plane_size) 967 align_buffer_16(ro90_u, uv_plane_size) 968 align_buffer_16(ro90_v, uv_plane_size) 969 memset(orig_y, 0, y_plane_size); 970 memset(orig_uv, 0, uv_plane_size); 971 memset(ro0_y, 0, y_plane_size); 972 memset(ro0_u, 0, uv_plane_size); 973 memset(ro0_v, 0, uv_plane_size); 974 memset(ro90_y, 0, y_plane_size); 975 memset(ro90_u, 0, uv_plane_size); 976 memset(ro90_v, 0, uv_plane_size); 977 978 // fill image buffers with random data 979 for (i = b; i < (yh + b); ++i) { 980 for (j = b; j < (yw + b); ++j) { 981 orig_y[i * (yw + b * 2) + j] = random() & 0xff; 982 } 983 } 984 985 for (i = b; i < (uvh + b); ++i) { 986 for (j = b; j < (uvw * 2 + b); j += 2) { 987 uint8 random_number = random() & 0x7f; 988 orig_uv[i * (uvw * 2 + b * 2) + j] = random_number; 989 orig_uv[i * (uvw * 2 + b * 2) + j + 1] = -random_number; 990 } 991 } 992 993 int y_off_0 = b * (yw + b * 2) + b; 994 int uv_off_0 = b * (uvw + b * 2) + b; 995 int y_off_90 = b * (yh + b * 2) + b; 996 int uv_off_90 = b * (uvh + b * 2) + b; 997 998 int y_st_0 = yw + b * 2; 999 int uv_st_0 = uvw + b * 2; 1000 int y_st_90 = yh + b * 2; 1001 int uv_st_90 = uvh + b * 2; 1002 1003 NV12ToI420Rotate(orig_y+y_off_0, y_st_0, 1004 orig_uv+y_off_0, y_st_0, 1005 ro90_y+y_off_90, y_st_90, 1006 ro90_u+uv_off_90, uv_st_90, 1007 ro90_v+uv_off_90, uv_st_90, 1008 yw, yh, 1009 kRotateClockwise); 1010 1011 I420Rotate(ro90_y+y_off_90, y_st_90, 1012 ro90_u+uv_off_90, uv_st_90, 1013 ro90_v+uv_off_90, uv_st_90, 1014 ro0_y+y_off_0, y_st_0, 1015 ro0_u+uv_off_0, uv_st_0, 1016 ro0_v+uv_off_0, uv_st_0, 1017 yh, yw, 1018 kRotateCounterClockwise); 1019 1020 for (i = 0; i < y_plane_size; ++i) { 1021 if (orig_y[i] != ro0_y[i]) 1022 ++err; 1023 } 1024 1025 int zero_cnt = 0; 1026 1027 for (i = 0; i < uv_plane_size; ++i) { 1028 if ((signed char)ro0_u[i] != -(signed char)ro0_v[i]) { 1029 ++err; 1030 } 1031 if (ro0_u[i] != 0) { 1032 ++zero_cnt; 1033 } 1034 } 1035 1036 if (!zero_cnt) { 1037 ++err; 1038 } 1039 1040 free_aligned_buffer_16(orig_y) 1041 free_aligned_buffer_16(orig_uv) 1042 free_aligned_buffer_16(ro0_y) 1043 free_aligned_buffer_16(ro0_u) 1044 free_aligned_buffer_16(ro0_v) 1045 free_aligned_buffer_16(ro90_y) 1046 free_aligned_buffer_16(ro90_u) 1047 free_aligned_buffer_16(ro90_v) 1048 1049 EXPECT_EQ(0, err); 1050 } 1051 1052 TEST_F(libyuvTest, NV12ToI420Rotate270) { 1053 int err = 0; 1054 1055 int yw = 1024; 1056 int yh = 768; 1057 int b = 128; 1058 int uvw = (yw + 1) >> 1; 1059 int uvh = (yh + 1) >> 1; 1060 1061 int i, j; 1062 1063 int y_plane_size = (yw + b * 2) * (yh + b * 2); 1064 int uv_plane_size = (uvw + b * 2) * (uvh + b * 2); 1065 int o_uv_plane_size = (uvw * 2 + b * 2) * (uvh + b * 2); 1066 1067 srandom(time(NULL)); 1068 1069 align_buffer_16(orig_y, y_plane_size) 1070 align_buffer_16(orig_uv, o_uv_plane_size) 1071 align_buffer_16(ro0_y, y_plane_size) 1072 align_buffer_16(ro0_u, uv_plane_size) 1073 align_buffer_16(ro0_v, uv_plane_size) 1074 align_buffer_16(ro270_y, y_plane_size) 1075 align_buffer_16(ro270_u, uv_plane_size) 1076 align_buffer_16(ro270_v, uv_plane_size) 1077 memset(orig_y, 0, y_plane_size); 1078 memset(orig_uv, 0, o_uv_plane_size); 1079 memset(ro0_y, 0, y_plane_size); 1080 memset(ro0_u, 0, uv_plane_size); 1081 memset(ro0_v, 0, uv_plane_size); 1082 memset(ro270_y, 0, y_plane_size); 1083 memset(ro270_u, 0, uv_plane_size); 1084 memset(ro270_v, 0, uv_plane_size); 1085 1086 // fill image buffers with random data 1087 for (i = b; i < (yh + b); ++i) { 1088 for (j = b; j < (yw + b); ++j) { 1089 orig_y[i * (yw + b * 2) + j] = random() & 0xff; 1090 } 1091 } 1092 1093 for (i = b; i < (uvh + b); ++i) { 1094 for (j = b; j < (uvw * 2 + b); j += 2) { 1095 uint8 random_number = random() & 0x7f; 1096 orig_uv[i * (uvw * 2 + b * 2) + j] = random_number; 1097 orig_uv[i * (uvw * 2 + b * 2) + j + 1] = -random_number; 1098 } 1099 } 1100 1101 int y_off_0 = b * (yw + b * 2) + b; 1102 int uv_off_0 = b * (uvw + b * 2) + b; 1103 int y_off_270 = b * (yh + b * 2) + b; 1104 int uv_off_270 = b * (uvh + b * 2) + b; 1105 1106 int y_st_0 = yw + b * 2; 1107 int uv_st_0 = uvw + b * 2; 1108 int y_st_270 = yh + b * 2; 1109 int uv_st_270 = uvh + b * 2; 1110 1111 NV12ToI420Rotate(orig_y+y_off_0, y_st_0, 1112 orig_uv+y_off_0, y_st_0, 1113 ro270_y+y_off_270, y_st_270, 1114 ro270_u+uv_off_270, uv_st_270, 1115 ro270_v+uv_off_270, uv_st_270, 1116 yw, yh, 1117 kRotateCounterClockwise); 1118 1119 I420Rotate(ro270_y+y_off_270, y_st_270, 1120 ro270_u+uv_off_270, uv_st_270, 1121 ro270_v+uv_off_270, uv_st_270, 1122 ro0_y+y_off_0, y_st_0, 1123 ro0_u+uv_off_0, uv_st_0, 1124 ro0_v+uv_off_0, uv_st_0, 1125 yh, yw, 1126 kRotateClockwise); 1127 1128 for (i = 0; i < y_plane_size; ++i) { 1129 if (orig_y[i] != ro0_y[i]) 1130 ++err; 1131 } 1132 1133 int zero_cnt = 0; 1134 1135 for (i = 0; i < uv_plane_size; ++i) { 1136 if ((signed char)ro0_u[i] != -(signed char)ro0_v[i]) { 1137 ++err; 1138 } 1139 if (ro0_u[i] != 0) { 1140 ++zero_cnt; 1141 } 1142 } 1143 1144 if (!zero_cnt) { 1145 ++err; 1146 } 1147 1148 free_aligned_buffer_16(orig_y) 1149 free_aligned_buffer_16(orig_uv) 1150 free_aligned_buffer_16(ro0_y) 1151 free_aligned_buffer_16(ro0_u) 1152 free_aligned_buffer_16(ro0_v) 1153 free_aligned_buffer_16(ro270_y) 1154 free_aligned_buffer_16(ro270_u) 1155 free_aligned_buffer_16(ro270_v) 1156 1157 EXPECT_EQ(0, err); 1158 } 1159 1160 TEST_F(libyuvTest, NV12ToI420Rotate180) { 1161 int err = 0; 1162 1163 int yw = 1024; 1164 int yh = 768; 1165 int b = 128; 1166 int uvw = (yw + 1) >> 1; 1167 int uvh = (yh + 1) >> 1; 1168 1169 int i, j; 1170 1171 int y_plane_size = (yw + b * 2) * (yh + b * 2); 1172 int uv_plane_size = (uvw + b * 2) * (uvh + b * 2); 1173 int o_uv_plane_size = (uvw * 2 + b * 2) * (uvh + b * 2); 1174 1175 srandom(time(NULL)); 1176 1177 align_buffer_16(orig_y, y_plane_size) 1178 align_buffer_16(orig_uv, o_uv_plane_size) 1179 align_buffer_16(ro0_y, y_plane_size) 1180 align_buffer_16(ro0_u, uv_plane_size) 1181 align_buffer_16(ro0_v, uv_plane_size) 1182 align_buffer_16(ro180_y, y_plane_size) 1183 align_buffer_16(ro180_u, uv_plane_size) 1184 align_buffer_16(ro180_v, uv_plane_size) 1185 memset(orig_y, 0, y_plane_size); 1186 memset(orig_uv, 0, o_uv_plane_size); 1187 memset(ro0_y, 0, y_plane_size); 1188 memset(ro0_u, 0, uv_plane_size); 1189 memset(ro0_v, 0, uv_plane_size); 1190 memset(ro180_y, 0, y_plane_size); 1191 memset(ro180_u, 0, uv_plane_size); 1192 memset(ro180_v, 0, uv_plane_size); 1193 1194 // fill image buffers with random data 1195 for (i = b; i < (yh + b); ++i) { 1196 for (j = b; j < (yw + b); ++j) { 1197 orig_y[i * (yw + b * 2) + j] = random() & 0xff; 1198 } 1199 } 1200 1201 for (i = b; i < (uvh + b); ++i) { 1202 for (j = b; j < (uvw * 2 + b); j += 2) { 1203 uint8 random_number = random() & 0x7f; 1204 orig_uv[i * (uvw * 2 + b * 2) + j] = random_number; 1205 orig_uv[i * (uvw * 2 + b * 2) + j + 1] = -random_number; 1206 } 1207 } 1208 1209 int y_off = b * (yw + b * 2) + b; 1210 int uv_off = b * (uvw + b * 2) + b; 1211 1212 int y_st = yw + b * 2; 1213 int uv_st = uvw + b * 2; 1214 1215 NV12ToI420Rotate(orig_y+y_off, y_st, 1216 orig_uv+y_off, y_st, 1217 ro180_y+y_off, y_st, 1218 ro180_u+uv_off, uv_st, 1219 ro180_v+uv_off, uv_st, 1220 yw, yh, 1221 kRotate180); 1222 1223 I420Rotate(ro180_y+y_off, y_st, 1224 ro180_u+uv_off, uv_st, 1225 ro180_v+uv_off, uv_st, 1226 ro0_y+y_off, y_st, 1227 ro0_u+uv_off, uv_st, 1228 ro0_v+uv_off, uv_st, 1229 yw, yh, 1230 kRotate180); 1231 1232 for (i = 0; i < y_plane_size; ++i) { 1233 if (orig_y[i] != ro0_y[i]) { 1234 ++err; 1235 } 1236 } 1237 1238 int zero_cnt = 0; 1239 1240 for (i = 0; i < uv_plane_size; ++i) { 1241 if ((signed char)ro0_u[i] != -(signed char)ro0_v[i]) { 1242 ++err; 1243 } 1244 if (ro0_u[i] != 0) { 1245 ++zero_cnt; 1246 } 1247 } 1248 1249 if (!zero_cnt) { 1250 ++err; 1251 } 1252 1253 free_aligned_buffer_16(orig_y) 1254 free_aligned_buffer_16(orig_uv) 1255 free_aligned_buffer_16(ro0_y) 1256 free_aligned_buffer_16(ro0_u) 1257 free_aligned_buffer_16(ro0_v) 1258 free_aligned_buffer_16(ro180_y) 1259 free_aligned_buffer_16(ro180_u) 1260 free_aligned_buffer_16(ro180_v) 1261 1262 EXPECT_EQ(0, err); 1263 } 1264 1265 TEST_F(libyuvTest, NV12ToI420RotateNegHeight90) { 1266 int y_err = 0, uv_err = 0; 1267 1268 int yw = 1024; 1269 int yh = 768; 1270 int b = 128; 1271 int uvw = (yw + 1) >> 1; 1272 int uvh = (yh + 1) >> 1; 1273 int i, j; 1274 1275 int y_plane_size = (yw + b * 2) * (yh + b * 2); 1276 int uv_plane_size = (uvw + b * 2) * (uvh + b * 2); 1277 int o_uv_plane_size = (uvw * 2 + b * 2) * (uvh + b * 2); 1278 1279 srandom(time(NULL)); 1280 1281 align_buffer_16(orig_y, y_plane_size) 1282 align_buffer_16(orig_uv, o_uv_plane_size) 1283 align_buffer_16(roa_y, y_plane_size) 1284 align_buffer_16(roa_u, uv_plane_size) 1285 align_buffer_16(roa_v, uv_plane_size) 1286 align_buffer_16(rob_y, y_plane_size) 1287 align_buffer_16(rob_u, uv_plane_size) 1288 align_buffer_16(rob_v, uv_plane_size) 1289 align_buffer_16(roc_y, y_plane_size) 1290 align_buffer_16(roc_u, uv_plane_size) 1291 align_buffer_16(roc_v, uv_plane_size) 1292 memset(orig_y, 0, y_plane_size); 1293 memset(orig_uv, 0, o_uv_plane_size); 1294 memset(roa_y, 0, y_plane_size); 1295 memset(roa_u, 0, uv_plane_size); 1296 memset(roa_v, 0, uv_plane_size); 1297 memset(rob_y, 0, y_plane_size); 1298 memset(rob_u, 0, uv_plane_size); 1299 memset(rob_v, 0, uv_plane_size); 1300 memset(roc_y, 0, y_plane_size); 1301 memset(roc_u, 0, uv_plane_size); 1302 memset(roc_v, 0, uv_plane_size); 1303 1304 // fill image buffers with random data 1305 for (i = b; i < (yh + b); ++i) { 1306 for (j = b; j < (yw + b); ++j) { 1307 orig_y[i * (yw + b * 2) + j] = random() & 0xff; 1308 } 1309 } 1310 1311 for (i = b; i < (uvh + b); ++i) { 1312 for (j = b; j < (uvw * 2 + b); j += 2) { 1313 uint8 random_number = random() & 0x7f; 1314 orig_uv[i * (uvw * 2 + b * 2) + j] = random_number; 1315 orig_uv[i * (uvw * 2 + b * 2) + j + 1] = -random_number; 1316 } 1317 } 1318 1319 int y_off_0 = b * (yw + b * 2) + b; 1320 int uv_off_0 = b * (uvw + b * 2) + b; 1321 int y_off_90 = b * (yh + b * 2) + b; 1322 int uv_off_90 = b * (uvh + b * 2) + b; 1323 1324 int y_st_0 = yw + b * 2; 1325 int uv_st_0 = uvw + b * 2; 1326 int y_st_90 = yh + b * 2; 1327 int uv_st_90 = uvh + b * 2; 1328 1329 NV12ToI420Rotate(orig_y+y_off_0, y_st_0, 1330 orig_uv+y_off_0, y_st_0, 1331 roa_y+y_off_90, y_st_90, 1332 roa_u+uv_off_90, uv_st_90, 1333 roa_v+uv_off_90, uv_st_90, 1334 yw, -yh, 1335 kRotateClockwise); 1336 1337 I420Rotate(roa_y+y_off_90, y_st_90, 1338 roa_u+uv_off_90, uv_st_90, 1339 roa_v+uv_off_90, uv_st_90, 1340 rob_y+y_off_0, y_st_0, 1341 rob_u+uv_off_0, uv_st_0, 1342 rob_v+uv_off_0, uv_st_0, 1343 yh, -yw, 1344 kRotateCounterClockwise); 1345 1346 I420Rotate(rob_y+y_off_0, y_st_0, 1347 rob_u+uv_off_0, uv_st_0, 1348 rob_v+uv_off_0, uv_st_0, 1349 roc_y+y_off_0, y_st_0, 1350 roc_u+uv_off_0, uv_st_0, 1351 roc_v+uv_off_0, uv_st_0, 1352 yw, yh, 1353 kRotate180); 1354 1355 for (i = 0; i < y_plane_size; ++i) { 1356 if (orig_y[i] != roc_y[i]) { 1357 ++y_err; 1358 } 1359 } 1360 1361 if (y_err) { 1362 printf("input %dx%d \n", yw, yh); 1363 PrintArray(orig_y, y_st_0, yh + b * 2); 1364 1365 printf("rotate a\n"); 1366 PrintArray(roa_y, y_st_90, y_st_0); 1367 1368 printf("rotate b\n"); 1369 PrintArray(rob_y, y_st_90, y_st_0); 1370 1371 printf("rotate c\n"); 1372 PrintArray(roc_y, y_st_0, y_st_90); 1373 } 1374 1375 int zero_cnt = 0; 1376 1377 for (i = 0; i < uv_plane_size; ++i) { 1378 if ((signed char)roc_u[i] != -(signed char)roc_v[i]) { 1379 ++uv_err; 1380 } 1381 if (rob_u[i] != 0) { 1382 ++zero_cnt; 1383 } 1384 } 1385 1386 if (!zero_cnt) { 1387 ++uv_err; 1388 } 1389 1390 if (uv_err) { 1391 printf("input %dx%d \n", uvw * 2, uvh); 1392 PrintArray(orig_uv, y_st_0, uvh + b * 2); 1393 1394 printf("rotate a\n"); 1395 PrintArray(roa_u, uv_st_90, uv_st_0); 1396 PrintArray(roa_v, uv_st_90, uv_st_0); 1397 1398 printf("rotate b\n"); 1399 PrintArray(rob_u, uv_st_90, uv_st_0); 1400 PrintArray(rob_v, uv_st_90, uv_st_0); 1401 1402 printf("rotate c\n"); 1403 PrintArray(roc_u, uv_st_0, uv_st_90); 1404 PrintArray(roc_v, uv_st_0, uv_st_90); 1405 } 1406 1407 free_aligned_buffer_16(orig_y) 1408 free_aligned_buffer_16(orig_uv) 1409 free_aligned_buffer_16(roa_y) 1410 free_aligned_buffer_16(roa_u) 1411 free_aligned_buffer_16(roa_v) 1412 free_aligned_buffer_16(rob_y) 1413 free_aligned_buffer_16(rob_u) 1414 free_aligned_buffer_16(rob_v) 1415 free_aligned_buffer_16(roc_y) 1416 free_aligned_buffer_16(roc_u) 1417 free_aligned_buffer_16(roc_v) 1418 1419 EXPECT_EQ(0, y_err + uv_err); 1420 } 1421 1422 TEST_F(libyuvTest, NV12ToI420RotateNegHeight180) { 1423 int y_err = 0, uv_err = 0; 1424 1425 int yw = 1024; 1426 int yh = 768; 1427 int b = 128; 1428 int uvw = (yw + 1) >> 1; 1429 int uvh = (yh + 1) >> 1; 1430 int i, j; 1431 1432 int y_plane_size = (yw + b * 2) * (yh + b * 2); 1433 int uv_plane_size = (uvw + b * 2) * (uvh + b * 2); 1434 int o_uv_plane_size = (uvw * 2 + b * 2) * (uvh + b * 2); 1435 1436 srandom(time(NULL)); 1437 1438 align_buffer_16(orig_y, y_plane_size) 1439 align_buffer_16(orig_uv, o_uv_plane_size) 1440 align_buffer_16(roa_y, y_plane_size) 1441 align_buffer_16(roa_u, uv_plane_size) 1442 align_buffer_16(roa_v, uv_plane_size) 1443 align_buffer_16(rob_y, y_plane_size) 1444 align_buffer_16(rob_u, uv_plane_size) 1445 align_buffer_16(rob_v, uv_plane_size) 1446 memset(orig_y, 0, y_plane_size); 1447 memset(orig_uv, 0, o_uv_plane_size); 1448 memset(roa_y, 0, y_plane_size); 1449 memset(roa_u, 0, uv_plane_size); 1450 memset(roa_v, 0, uv_plane_size); 1451 memset(rob_y, 0, y_plane_size); 1452 memset(rob_u, 0, uv_plane_size); 1453 memset(rob_v, 0, uv_plane_size); 1454 1455 // fill image buffers with random data 1456 for (i = b; i < (yh + b); ++i) { 1457 for (j = b; j < (yw + b); ++j) { 1458 orig_y[i * (yw + b * 2) + j] = random() & 0xff; 1459 } 1460 } 1461 1462 for (i = b; i < (uvh + b); ++i) { 1463 for (j = b; j < (uvw * 2 + b); j += 2) { 1464 uint8 random_number = random() & 0x7f; 1465 orig_uv[i * (uvw * 2 + b * 2) + j] = random_number; 1466 orig_uv[i * (uvw * 2 + b * 2) + j + 1] = -random_number; 1467 } 1468 } 1469 1470 int y_off = b * (yw + b * 2) + b; 1471 int uv_off = b * (uvw + b * 2) + b; 1472 1473 int y_st = yw + b * 2; 1474 int uv_st = uvw + b * 2; 1475 1476 NV12ToI420Rotate(orig_y+y_off, y_st, 1477 orig_uv+y_off, y_st, 1478 roa_y+y_off, y_st, 1479 roa_u+uv_off, uv_st, 1480 roa_v+uv_off, uv_st, 1481 yw, -yh, 1482 kRotate180); 1483 1484 I420Rotate(roa_y+y_off, y_st, 1485 roa_u+uv_off, uv_st, 1486 roa_v+uv_off, uv_st, 1487 rob_y+y_off, y_st, 1488 rob_u+uv_off, uv_st, 1489 rob_v+uv_off, uv_st, 1490 yw, -yh, 1491 kRotate180); 1492 1493 for (i = 0; i < y_plane_size; ++i) { 1494 if (orig_y[i] != rob_y[i]) 1495 ++y_err; 1496 } 1497 1498 if (y_err) { 1499 printf("input %dx%d \n", yw, yh); 1500 PrintArray(orig_y, y_st, yh + b * 2); 1501 1502 printf("rotate a\n"); 1503 PrintArray(roa_y, y_st, yh + b * 2); 1504 1505 printf("rotate b\n"); 1506 PrintArray(rob_y, y_st, yh + b * 2); 1507 } 1508 1509 int zero_cnt = 0; 1510 1511 for (i = 0; i < uv_plane_size; ++i) { 1512 if ((signed char)rob_u[i] != -(signed char)rob_v[i]) { 1513 ++uv_err; 1514 } 1515 if (rob_u[i] != 0) { 1516 ++zero_cnt; 1517 } 1518 } 1519 1520 if (!zero_cnt) { 1521 ++uv_err; 1522 } 1523 1524 if (uv_err) { 1525 printf("input %dx%d \n", uvw * 2, uvh); 1526 PrintArray(orig_uv, y_st, uvh + b * 2); 1527 1528 printf("rotate a\n"); 1529 PrintArray(roa_u, uv_st, uvh + b * 2); 1530 PrintArray(roa_v, uv_st, uvh + b * 2); 1531 1532 printf("rotate b\n"); 1533 PrintArray(rob_u, uv_st, uvh + b * 2); 1534 PrintArray(rob_v, uv_st, uvh + b * 2); 1535 } 1536 1537 free_aligned_buffer_16(orig_y) 1538 free_aligned_buffer_16(orig_uv) 1539 free_aligned_buffer_16(roa_y) 1540 free_aligned_buffer_16(roa_u) 1541 free_aligned_buffer_16(roa_v) 1542 free_aligned_buffer_16(rob_y) 1543 free_aligned_buffer_16(rob_u) 1544 free_aligned_buffer_16(rob_v) 1545 1546 EXPECT_EQ(0, y_err + uv_err); 1547 } 1548 1549 } // namespace libyuv 1550