Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(58)

Side by Side Diff: source/planar_functions.cc

Issue 1507683003: Add support for odd height YUVA alpha blending. (Closed) Base URL: https://chromium.googlesource.com/libyuv/libyuv@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « include/libyuv/version.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 The LibYuv Project Authors. All rights reserved. 2 * Copyright 2011 The LibYuv Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 633 matching lines...) Expand 10 before | Expand all | Expand 10 after
644 const uint8* src_v0, int src_stride_v0, 644 const uint8* src_v0, int src_stride_v0,
645 const uint8* src_y1, int src_stride_y1, 645 const uint8* src_y1, int src_stride_y1,
646 const uint8* src_u1, int src_stride_u1, 646 const uint8* src_u1, int src_stride_u1,
647 const uint8* src_v1, int src_stride_v1, 647 const uint8* src_v1, int src_stride_v1,
648 const uint8* alpha, int alpha_stride, 648 const uint8* alpha, int alpha_stride,
649 uint8* dst_y, int dst_stride_y, 649 uint8* dst_y, int dst_stride_y,
650 uint8* dst_u, int dst_stride_u, 650 uint8* dst_u, int dst_stride_u,
651 uint8* dst_v, int dst_stride_v, 651 uint8* dst_v, int dst_stride_v,
652 int width, int height) { 652 int width, int height) {
653 int y; 653 int y;
654 // Half width/height for UV.
655 int halfwidth = (width + 1) >> 1;
654 void (*BlendPlaneRow)(const uint8* src0, const uint8* src1, 656 void (*BlendPlaneRow)(const uint8* src0, const uint8* src1,
655 const uint8* alpha, uint8* dst, int width) = BlendPlaneRow_C; 657 const uint8* alpha, uint8* dst, int width) = BlendPlaneRow_C;
656 void (*ScaleRowDown2)(const uint8* src_ptr, ptrdiff_t src_stride, 658 void (*ScaleRowDown2)(const uint8* src_ptr, ptrdiff_t src_stride,
657 uint8* dst_ptr, int dst_width) = ScaleRowDown2Box_C; 659 uint8* dst_ptr, int dst_width) = ScaleRowDown2Box_C;
658 if (!src_y0 || !src_u0 || !src_v0 || !src_y1 || !src_u1 || !src_v1 || 660 if (!src_y0 || !src_u0 || !src_v0 || !src_y1 || !src_u1 || !src_v1 ||
659 !alpha || !dst_y || !dst_u || !dst_v || width <= 0 || height == 0) { 661 !alpha || !dst_y || !dst_u || !dst_v || width <= 0 || height == 0) {
660 return -1; 662 return -1;
661 } 663 }
662 664
663 // Negative height means invert the image. 665 // Negative height means invert the image.
664 if (height < 0) { 666 if (height < 0) {
665 height = -height; 667 height = -height;
666 dst_y = dst_y + (height - 1) * dst_stride_y; 668 dst_y = dst_y + (height - 1) * dst_stride_y;
667 dst_stride_y = -dst_stride_y; 669 dst_stride_y = -dst_stride_y;
668 } 670 }
669 671
670 // Blend Y plane. 672 // Blend Y plane.
671 BlendPlane(src_y0, src_stride_y0, 673 BlendPlane(src_y0, src_stride_y0,
672 src_y1, src_stride_y1, 674 src_y1, src_stride_y1,
673 alpha, alpha_stride, 675 alpha, alpha_stride,
674 dst_y, dst_stride_y, 676 dst_y, dst_stride_y,
675 width, height); 677 width, height);
676 678
677 // Half width/height for UV.
678 width = (width + 1) >> 1;
679 height = (height + 1) >> 1;
680
681 #if defined(HAS_BLENDPLANEROW_SSSE3) 679 #if defined(HAS_BLENDPLANEROW_SSSE3)
682 if (TestCpuFlag(kCpuHasSSSE3)) { 680 if (TestCpuFlag(kCpuHasSSSE3)) {
683 // TODO(fbarchard): Implement any versions for odd width. 681 // TODO(fbarchard): Implement any versions for odd width.
684 // BlendPlaneRow = BlendPlaneRow_Any_SSSE3; 682 // BlendPlaneRow = BlendPlaneRow_Any_SSSE3;
685 if (IS_ALIGNED(width, 8)) { 683 if (IS_ALIGNED(halfwidth, 8)) {
686 BlendPlaneRow = BlendPlaneRow_SSSE3; 684 BlendPlaneRow = BlendPlaneRow_SSSE3;
687 } 685 }
688 } 686 }
689 #endif 687 #endif
690 #if defined(HAS_BLENDPLANEROW_AVX2) 688 #if defined(HAS_BLENDPLANEROW_AVX2)
691 if (TestCpuFlag(kCpuHasAVX2)) { 689 if (TestCpuFlag(kCpuHasAVX2)) {
692 // BlendPlaneRow = BlendPlaneRow_Any_AVX2; 690 // BlendPlaneRow = BlendPlaneRow_Any_AVX2;
693 if (IS_ALIGNED(width, 16)) { 691 if (IS_ALIGNED(halfwidth, 16)) {
694 BlendPlaneRow = BlendPlaneRow_AVX2; 692 BlendPlaneRow = BlendPlaneRow_AVX2;
695 } 693 }
696 } 694 }
697 #endif 695 #endif
698 #if defined(HAS_SCALEROWDOWN2_NEON) 696 #if defined(HAS_SCALEROWDOWN2_NEON)
699 if (TestCpuFlag(kCpuHasNEON)) { 697 if (TestCpuFlag(kCpuHasNEON)) {
700 ScaleRowDown2 = ScaleRowDown2Box_Any_NEON; 698 ScaleRowDown2 = ScaleRowDown2Box_Any_NEON;
701 if (IS_ALIGNED(width, 16)) { 699 if (IS_ALIGNED(halfwidth, 16)) {
702 ScaleRowDown2 = ScaleRowDown2Box_NEON; 700 ScaleRowDown2 = ScaleRowDown2Box_NEON;
703 } 701 }
704 } 702 }
705 #endif 703 #endif
706 #if defined(HAS_SCALEROWDOWN2_SSE2) 704 #if defined(HAS_SCALEROWDOWN2_SSE2)
707 if (TestCpuFlag(kCpuHasSSE2)) { 705 if (TestCpuFlag(kCpuHasSSE2)) {
708 ScaleRowDown2 = ScaleRowDown2Box_Any_SSE2; 706 ScaleRowDown2 = ScaleRowDown2Box_Any_SSE2;
709 if (IS_ALIGNED(width, 16)) { 707 if (IS_ALIGNED(halfwidth, 16)) {
710 ScaleRowDown2 = ScaleRowDown2Box_SSE2; 708 ScaleRowDown2 = ScaleRowDown2Box_SSE2;
711 } 709 }
712 } 710 }
713 #endif 711 #endif
714 #if defined(HAS_SCALEROWDOWN2_AVX2) 712 #if defined(HAS_SCALEROWDOWN2_AVX2)
715 if (TestCpuFlag(kCpuHasAVX2)) { 713 if (TestCpuFlag(kCpuHasAVX2)) {
716 ScaleRowDown2 = ScaleRowDown2Box_Any_AVX2; 714 ScaleRowDown2 = ScaleRowDown2Box_Any_AVX2;
717 if (IS_ALIGNED(width, 32)) { 715 if (IS_ALIGNED(halfwidth, 32)) {
718 ScaleRowDown2 = ScaleRowDown2Box_AVX2; 716 ScaleRowDown2 = ScaleRowDown2Box_AVX2;
719 } 717 }
720 } 718 }
721 #endif 719 #endif
722 720
723 // Row buffer for intermediate alpha pixels. 721 // Row buffer for intermediate alpha pixels.
724 align_buffer_64(halfalpha, width); 722 align_buffer_64(halfalpha, halfwidth);
725 for (y = 0; y < height; ++y) { 723 for (y = 0; y < height; y += 2) {
724 // last row of odd height image use 1 row of alpha instead of 2.
Diony Rosa 2015/12/07 18:40:24 This skips the last row if the height is odd. e.g.
fbarchard 2015/12/07 18:58:10 In the example of height = 5, y will be 0, 2, 4, 4
725 if (y == (height - 1)) {
726 alpha_stride = 0;
727 }
726 // Subsample 2 rows of UV to half width and half height. 728 // Subsample 2 rows of UV to half width and half height.
727 ScaleRowDown2(alpha, alpha_stride, halfalpha, width); 729 ScaleRowDown2(alpha, alpha_stride, halfalpha, halfwidth);
728 alpha += alpha_stride * 2; 730 alpha += alpha_stride * 2;
729 BlendPlaneRow(src_u0, src_u1, halfalpha, dst_u, width); 731 BlendPlaneRow(src_u0, src_u1, halfalpha, dst_u, halfwidth);
730 BlendPlaneRow(src_v0, src_v1, halfalpha, dst_v, width); 732 BlendPlaneRow(src_v0, src_v1, halfalpha, dst_v, halfwidth);
731 src_u0 += src_stride_u0; 733 src_u0 += src_stride_u0;
732 src_u1 += src_stride_u1; 734 src_u1 += src_stride_u1;
733 dst_u += dst_stride_u; 735 dst_u += dst_stride_u;
734 src_v0 += src_stride_v0; 736 src_v0 += src_stride_v0;
735 src_v1 += src_stride_v1; 737 src_v1 += src_stride_v1;
736 dst_v += dst_stride_v; 738 dst_v += dst_stride_v;
737 } 739 }
738 free_aligned_buffer_64(halfalpha); 740 free_aligned_buffer_64(halfalpha);
739 return 0; 741 return 0;
740 } 742 }
(...skipping 1884 matching lines...) Expand 10 before | Expand all | Expand 10 after
2625 } 2627 }
2626 free_aligned_buffer_64(rows); 2628 free_aligned_buffer_64(rows);
2627 } 2629 }
2628 return 0; 2630 return 0;
2629 } 2631 }
2630 2632
2631 #ifdef __cplusplus 2633 #ifdef __cplusplus
2632 } // extern "C" 2634 } // extern "C"
2633 } // namespace libyuv 2635 } // namespace libyuv
2634 #endif 2636 #endif
OLDNEW
« no previous file with comments | « include/libyuv/version.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698