| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/base/yuv_row.h" | 5 #include "media/base/yuv_row.h" |
| 6 | 6 |
| 7 #ifdef _DEBUG | 7 #ifdef _DEBUG |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #else | 9 #else |
| 10 #define DCHECK(a) | 10 #define DCHECK(a) |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 | 266 |
| 267 void FastConvertYUVToRGB32Row(const uint8* y_buf, | 267 void FastConvertYUVToRGB32Row(const uint8* y_buf, |
| 268 const uint8* u_buf, | 268 const uint8* u_buf, |
| 269 const uint8* v_buf, | 269 const uint8* v_buf, |
| 270 uint8* rgb_buf, | 270 uint8* rgb_buf, |
| 271 int width); | 271 int width); |
| 272 | 272 |
| 273 asm( | 273 asm( |
| 274 ".global FastConvertYUVToRGB32Row\n" | 274 ".global FastConvertYUVToRGB32Row\n" |
| 275 "FastConvertYUVToRGB32Row:\n" | 275 "FastConvertYUVToRGB32Row:\n" |
| 276 #if 0 | |
| 277 "pusha\n" | 276 "pusha\n" |
| 278 "mov 0x24(%esp),%edx\n" | 277 "mov 0x24(%esp),%edx\n" |
| 279 "mov 0x28(%esp),%edi\n" | 278 "mov 0x28(%esp),%edi\n" |
| 280 "mov 0x2c(%esp),%esi\n" | 279 "mov 0x2c(%esp),%esi\n" |
| 281 "mov 0x30(%esp),%ebp\n" | 280 "mov 0x30(%esp),%ebp\n" |
| 282 "mov 0x34(%esp),%ecx\n" | 281 "mov 0x34(%esp),%ecx\n" |
| 283 "jmp convertend\n" | 282 "jmp convertend\n" |
| 284 | 283 |
| 285 "convertloop:" | 284 "convertloop:" |
| 286 "movzbl (%edi),%eax\n" | 285 "movzbl (%edi),%eax\n" |
| (...skipping 26 matching lines...) Expand all Loading... |
| 313 "movzbl (%esi),%eax\n" | 312 "movzbl (%esi),%eax\n" |
| 314 "paddsw kCoefficientsRgbY+4096(,%eax,8),%mm0\n" | 313 "paddsw kCoefficientsRgbY+4096(,%eax,8),%mm0\n" |
| 315 "movzbl (%edx),%eax\n" | 314 "movzbl (%edx),%eax\n" |
| 316 "movq kCoefficientsRgbY(,%eax,8),%mm1\n" | 315 "movq kCoefficientsRgbY(,%eax,8),%mm1\n" |
| 317 "paddsw %mm0,%mm1\n" | 316 "paddsw %mm0,%mm1\n" |
| 318 "psraw $0x6,%mm1\n" | 317 "psraw $0x6,%mm1\n" |
| 319 "packuswb %mm1,%mm1\n" | 318 "packuswb %mm1,%mm1\n" |
| 320 "movd %mm1,0x0(%ebp)\n" | 319 "movd %mm1,0x0(%ebp)\n" |
| 321 "convertdone:" | 320 "convertdone:" |
| 322 "popa\n" | 321 "popa\n" |
| 323 #endif | |
| 324 "ret\n" | 322 "ret\n" |
| 325 ); | 323 ); |
| 326 | 324 |
| 327 | 325 |
| 328 void ScaleYUVToRGB32Row(const uint8* y_buf, | 326 void ScaleYUVToRGB32Row(const uint8* y_buf, |
| 329 const uint8* u_buf, | 327 const uint8* u_buf, |
| 330 const uint8* v_buf, | 328 const uint8* v_buf, |
| 331 uint8* rgb_buf, | 329 uint8* rgb_buf, |
| 332 int width, | 330 int width, |
| 333 int source_dx); | 331 int source_dx); |
| 334 | 332 |
| 335 asm( | 333 asm( |
| 336 ".global ScaleYUVToRGB32Row\n" | 334 ".global ScaleYUVToRGB32Row\n" |
| 337 "ScaleYUVToRGB32Row:\n" | 335 "ScaleYUVToRGB32Row:\n" |
| 338 #if 0 | |
| 339 "pusha\n" | 336 "pusha\n" |
| 340 "mov 0x24(%esp),%edx\n" | 337 "mov 0x24(%esp),%edx\n" |
| 341 "mov 0x28(%esp),%edi\n" | 338 "mov 0x28(%esp),%edi\n" |
| 342 "mov 0x2c(%esp),%esi\n" | 339 "mov 0x2c(%esp),%esi\n" |
| 343 "mov 0x30(%esp),%ebp\n" | 340 "mov 0x30(%esp),%ebp\n" |
| 344 "mov 0x34(%esp),%ecx\n" | 341 "mov 0x34(%esp),%ecx\n" |
| 345 "xor %ebx,%ebx\n" | 342 "xor %ebx,%ebx\n" |
| 346 "jmp scaleend\n" | 343 "jmp scaleend\n" |
| 347 | 344 |
| 348 "scaleloop:" | 345 "scaleloop:" |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 "sar $0x10,%eax\n" | 387 "sar $0x10,%eax\n" |
| 391 "movzbl (%edx,%eax,1),%eax\n" | 388 "movzbl (%edx,%eax,1),%eax\n" |
| 392 "movq kCoefficientsRgbY(,%eax,8),%mm1\n" | 389 "movq kCoefficientsRgbY(,%eax,8),%mm1\n" |
| 393 "paddsw %mm0,%mm1\n" | 390 "paddsw %mm0,%mm1\n" |
| 394 "psraw $0x6,%mm1\n" | 391 "psraw $0x6,%mm1\n" |
| 395 "packuswb %mm1,%mm1\n" | 392 "packuswb %mm1,%mm1\n" |
| 396 "movd %mm1,0x0(%ebp)\n" | 393 "movd %mm1,0x0(%ebp)\n" |
| 397 | 394 |
| 398 "scaledone:" | 395 "scaledone:" |
| 399 "popa\n" | 396 "popa\n" |
| 400 #endif | |
| 401 "ret\n" | 397 "ret\n" |
| 402 ); | 398 ); |
| 403 | 399 |
| 404 void LinearScaleYUVToRGB32Row(const uint8* y_buf, | 400 void LinearScaleYUVToRGB32Row(const uint8* y_buf, |
| 405 const uint8* u_buf, | 401 const uint8* u_buf, |
| 406 const uint8* v_buf, | 402 const uint8* v_buf, |
| 407 uint8* rgb_buf, | 403 uint8* rgb_buf, |
| 408 int width, | 404 int width, |
| 409 int source_dx); | 405 int source_dx); |
| 410 | 406 |
| 411 asm( | 407 asm( |
| 412 ".global LinearScaleYUVToRGB32Row\n" | 408 ".global LinearScaleYUVToRGB32Row\n" |
| 413 "LinearScaleYUVToRGB32Row:\n" | 409 "LinearScaleYUVToRGB32Row:\n" |
| 414 #if 0 | |
| 415 "pusha\n" | 410 "pusha\n" |
| 416 "mov 0x24(%esp),%edx\n" | 411 "mov 0x24(%esp),%edx\n" |
| 417 "mov 0x28(%esp),%edi\n" | 412 "mov 0x28(%esp),%edi\n" |
| 418 "mov 0x30(%esp),%ebp\n" | 413 "mov 0x30(%esp),%ebp\n" |
| 419 | 414 |
| 420 // source_width = width * source_dx + ebx | 415 // source_width = width * source_dx + ebx |
| 421 "mov 0x34(%esp), %ecx\n" | 416 "mov 0x34(%esp), %ecx\n" |
| 422 "imull 0x38(%esp), %ecx\n" | 417 "imull 0x38(%esp), %ecx\n" |
| 423 "mov %ecx, 0x34(%esp)\n" | 418 "mov %ecx, 0x34(%esp)\n" |
| 424 | 419 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 503 "jl .lscaleloop\n" | 498 "jl .lscaleloop\n" |
| 504 "popa\n" | 499 "popa\n" |
| 505 "ret\n" | 500 "ret\n" |
| 506 | 501 |
| 507 ".lscalelastpixel:" | 502 ".lscalelastpixel:" |
| 508 "paddsw %mm0, %mm1\n" | 503 "paddsw %mm0, %mm1\n" |
| 509 "psraw $6, %mm1\n" | 504 "psraw $6, %mm1\n" |
| 510 "packuswb %mm1, %mm1\n" | 505 "packuswb %mm1, %mm1\n" |
| 511 "movd %mm1, (%ebp)\n" | 506 "movd %mm1, (%ebp)\n" |
| 512 "popa\n" | 507 "popa\n" |
| 513 #endif | |
| 514 "ret\n" | 508 "ret\n" |
| 515 ); | 509 ); |
| 516 | 510 |
| 517 #elif USE_MMX && !defined(ARCH_CPU_X86_64) && defined(__PIC__) | 511 #elif USE_MMX && !defined(ARCH_CPU_X86_64) && defined(__PIC__) |
| 518 | 512 |
| 519 extern void PICConvertYUVToRGB32Row(const uint8* y_buf, | 513 extern void PICConvertYUVToRGB32Row(const uint8* y_buf, |
| 520 const uint8* u_buf, | 514 const uint8* u_buf, |
| 521 const uint8* v_buf, | 515 const uint8* v_buf, |
| 522 uint8* rgb_buf, | 516 uint8* rgb_buf, |
| 523 int width, | 517 int width, |
| 524 int16 *kCoefficientsRgbY); | 518 int16 *kCoefficientsRgbY); |
| 525 __asm__( | 519 __asm__( |
| 526 "_PICConvertYUVToRGB32Row:\n" | 520 "_PICConvertYUVToRGB32Row:\n" |
| 527 #if 0 | |
| 528 "pusha\n" | 521 "pusha\n" |
| 529 "mov 0x24(%esp),%edx\n" | 522 "mov 0x24(%esp),%edx\n" |
| 530 "mov 0x28(%esp),%edi\n" | 523 "mov 0x28(%esp),%edi\n" |
| 531 "mov 0x2c(%esp),%esi\n" | 524 "mov 0x2c(%esp),%esi\n" |
| 532 "mov 0x30(%esp),%ebp\n" | 525 "mov 0x30(%esp),%ebp\n" |
| 533 "mov 0x38(%esp),%ecx\n" | 526 "mov 0x38(%esp),%ecx\n" |
| 534 | 527 |
| 535 "jmp .Lconvertend\n" | 528 "jmp .Lconvertend\n" |
| 536 | 529 |
| 537 ".Lconvertloop:" | 530 ".Lconvertloop:" |
| (...skipping 27 matching lines...) Expand all Loading... |
| 565 "movzbl (%esi),%eax\n" | 558 "movzbl (%esi),%eax\n" |
| 566 "paddsw 4096(%ecx,%eax,8),%mm0\n" | 559 "paddsw 4096(%ecx,%eax,8),%mm0\n" |
| 567 "movzbl (%edx),%eax\n" | 560 "movzbl (%edx),%eax\n" |
| 568 "movq 0(%ecx,%eax,8),%mm1\n" | 561 "movq 0(%ecx,%eax,8),%mm1\n" |
| 569 "paddsw %mm0,%mm1\n" | 562 "paddsw %mm0,%mm1\n" |
| 570 "psraw $0x6,%mm1\n" | 563 "psraw $0x6,%mm1\n" |
| 571 "packuswb %mm1,%mm1\n" | 564 "packuswb %mm1,%mm1\n" |
| 572 "movd %mm1,0x0(%ebp)\n" | 565 "movd %mm1,0x0(%ebp)\n" |
| 573 ".Lconvertdone:\n" | 566 ".Lconvertdone:\n" |
| 574 "popa\n" | 567 "popa\n" |
| 575 #endif | |
| 576 "ret\n" | 568 "ret\n" |
| 577 ); | 569 ); |
| 578 | 570 |
| 579 void FastConvertYUVToRGB32Row(const uint8* y_buf, | 571 void FastConvertYUVToRGB32Row(const uint8* y_buf, |
| 580 const uint8* u_buf, | 572 const uint8* u_buf, |
| 581 const uint8* v_buf, | 573 const uint8* v_buf, |
| 582 uint8* rgb_buf, | 574 uint8* rgb_buf, |
| 583 int width) { | 575 int width) { |
| 584 PICConvertYUVToRGB32Row(y_buf, u_buf, v_buf, rgb_buf, width, | 576 PICConvertYUVToRGB32Row(y_buf, u_buf, v_buf, rgb_buf, width, |
| 585 &kCoefficientsRgbY[0][0]); | 577 &kCoefficientsRgbY[0][0]); |
| 586 } | 578 } |
| 587 | 579 |
| 588 extern void PICScaleYUVToRGB32Row(const uint8* y_buf, | 580 extern void PICScaleYUVToRGB32Row(const uint8* y_buf, |
| 589 const uint8* u_buf, | 581 const uint8* u_buf, |
| 590 const uint8* v_buf, | 582 const uint8* v_buf, |
| 591 uint8* rgb_buf, | 583 uint8* rgb_buf, |
| 592 int width, | 584 int width, |
| 593 int source_dx, | 585 int source_dx, |
| 594 int16 *kCoefficientsRgbY); | 586 int16 *kCoefficientsRgbY); |
| 595 | 587 |
| 596 __asm__( | 588 __asm__( |
| 597 "_PICScaleYUVToRGB32Row:\n" | 589 "_PICScaleYUVToRGB32Row:\n" |
| 598 #if 0 | |
| 599 "pusha\n" | 590 "pusha\n" |
| 600 "mov 0x24(%esp),%edx\n" | 591 "mov 0x24(%esp),%edx\n" |
| 601 "mov 0x28(%esp),%edi\n" | 592 "mov 0x28(%esp),%edi\n" |
| 602 "mov 0x2c(%esp),%esi\n" | 593 "mov 0x2c(%esp),%esi\n" |
| 603 "mov 0x30(%esp),%ebp\n" | 594 "mov 0x30(%esp),%ebp\n" |
| 604 "mov 0x3c(%esp),%ecx\n" | 595 "mov 0x3c(%esp),%ecx\n" |
| 605 "xor %ebx,%ebx\n" | 596 "xor %ebx,%ebx\n" |
| 606 "jmp Lscaleend\n" | 597 "jmp Lscaleend\n" |
| 607 | 598 |
| 608 "Lscaleloop:" | 599 "Lscaleloop:" |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 650 "sar $0x10,%eax\n" | 641 "sar $0x10,%eax\n" |
| 651 "movzbl (%edx,%eax,1),%eax\n" | 642 "movzbl (%edx,%eax,1),%eax\n" |
| 652 "movq 0(%ecx,%eax,8),%mm1\n" | 643 "movq 0(%ecx,%eax,8),%mm1\n" |
| 653 "paddsw %mm0,%mm1\n" | 644 "paddsw %mm0,%mm1\n" |
| 654 "psraw $0x6,%mm1\n" | 645 "psraw $0x6,%mm1\n" |
| 655 "packuswb %mm1,%mm1\n" | 646 "packuswb %mm1,%mm1\n" |
| 656 "movd %mm1,0x0(%ebp)\n" | 647 "movd %mm1,0x0(%ebp)\n" |
| 657 | 648 |
| 658 "Lscaledone:" | 649 "Lscaledone:" |
| 659 "popa\n" | 650 "popa\n" |
| 660 #endif | |
| 661 "ret\n" | 651 "ret\n" |
| 662 ); | 652 ); |
| 663 | 653 |
| 664 | 654 |
| 665 void ScaleYUVToRGB32Row(const uint8* y_buf, | 655 void ScaleYUVToRGB32Row(const uint8* y_buf, |
| 666 const uint8* u_buf, | 656 const uint8* u_buf, |
| 667 const uint8* v_buf, | 657 const uint8* v_buf, |
| 668 uint8* rgb_buf, | 658 uint8* rgb_buf, |
| 669 int width, | 659 int width, |
| 670 int source_dx) { | 660 int source_dx) { |
| 671 PICScaleYUVToRGB32Row(y_buf, u_buf, v_buf, rgb_buf, width, source_dx, | 661 PICScaleYUVToRGB32Row(y_buf, u_buf, v_buf, rgb_buf, width, source_dx, |
| 672 &kCoefficientsRgbY[0][0]); | 662 &kCoefficientsRgbY[0][0]); |
| 673 } | 663 } |
| 674 | 664 |
| 675 void PICLinearScaleYUVToRGB32Row(const uint8* y_buf, | 665 void PICLinearScaleYUVToRGB32Row(const uint8* y_buf, |
| 676 const uint8* u_buf, | 666 const uint8* u_buf, |
| 677 const uint8* v_buf, | 667 const uint8* v_buf, |
| 678 uint8* rgb_buf, | 668 uint8* rgb_buf, |
| 679 int width, | 669 int width, |
| 680 int source_dx, | 670 int source_dx, |
| 681 int16 *kCoefficientsRgbY); | 671 int16 *kCoefficientsRgbY); |
| 682 | 672 |
| 683 asm( | 673 asm( |
| 684 "_PICLinearScaleYUVToRGB32Row:\n" | 674 "_PICLinearScaleYUVToRGB32Row:\n" |
| 685 #if 0 | |
| 686 "pusha\n" | 675 "pusha\n" |
| 687 "mov 0x24(%esp),%edx\n" | 676 "mov 0x24(%esp),%edx\n" |
| 688 "mov 0x30(%esp),%ebp\n" | 677 "mov 0x30(%esp),%ebp\n" |
| 689 "mov 0x34(%esp),%ecx\n" | 678 "mov 0x34(%esp),%ecx\n" |
| 690 "mov 0x3c(%esp),%edi\n" | 679 "mov 0x3c(%esp),%edi\n" |
| 691 "xor %ebx,%ebx\n" | 680 "xor %ebx,%ebx\n" |
| 692 | 681 |
| 693 // source_width = width * source_dx + ebx | 682 // source_width = width * source_dx + ebx |
| 694 "mov 0x34(%esp), %ecx\n" | 683 "mov 0x34(%esp), %ecx\n" |
| 695 "imull 0x38(%esp), %ecx\n" | 684 "imull 0x38(%esp), %ecx\n" |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 777 "jg .lscaleloop\n" | 766 "jg .lscaleloop\n" |
| 778 "popa\n" | 767 "popa\n" |
| 779 "ret\n" | 768 "ret\n" |
| 780 | 769 |
| 781 ".lscalelastpixel:" | 770 ".lscalelastpixel:" |
| 782 "paddsw %mm0, %mm1\n" | 771 "paddsw %mm0, %mm1\n" |
| 783 "psraw $6, %mm1\n" | 772 "psraw $6, %mm1\n" |
| 784 "packuswb %mm1, %mm1\n" | 773 "packuswb %mm1, %mm1\n" |
| 785 "movd %mm1, (%ebp)\n" | 774 "movd %mm1, (%ebp)\n" |
| 786 "popa\n" | 775 "popa\n" |
| 787 #endif | |
| 788 "ret\n" | 776 "ret\n" |
| 789 ); | 777 ); |
| 790 | 778 |
| 791 void LinearScaleYUVToRGB32Row(const uint8* y_buf, | 779 void LinearScaleYUVToRGB32Row(const uint8* y_buf, |
| 792 const uint8* u_buf, | 780 const uint8* u_buf, |
| 793 const uint8* v_buf, | 781 const uint8* v_buf, |
| 794 uint8* rgb_buf, | 782 uint8* rgb_buf, |
| 795 int width, | 783 int width, |
| 796 int source_dx) { | 784 int source_dx) { |
| 797 PICLinearScaleYUVToRGB32Row(y_buf, u_buf, v_buf, rgb_buf, width, source_dx, | 785 PICLinearScaleYUVToRGB32Row(y_buf, u_buf, v_buf, rgb_buf, width, source_dx, |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 935 YuvPixel(y, u, v, rgb_buf+4); | 923 YuvPixel(y, u, v, rgb_buf+4); |
| 936 x += source_dx; | 924 x += source_dx; |
| 937 } | 925 } |
| 938 rgb_buf += 8; | 926 rgb_buf += 8; |
| 939 } | 927 } |
| 940 } | 928 } |
| 941 | 929 |
| 942 #endif // USE_MMX | 930 #endif // USE_MMX |
| 943 } // extern "C" | 931 } // extern "C" |
| 944 | 932 |
| OLD | NEW |