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 |