libcvd-members
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[libcvd-members] libcvd/cvd_src/NEON convert_rgb_to_y.cc


From: Gerhard Reitmayr
Subject: [libcvd-members] libcvd/cvd_src/NEON convert_rgb_to_y.cc
Date: Wed, 11 May 2011 15:20:57 +0000

CVSROOT:        /cvsroot/libcvd
Module name:    libcvd
Changes by:     Gerhard Reitmayr <gerhard>      11/05/11 15:20:56

Modified files:
        cvd_src/NEON   : convert_rgb_to_y.cc 

Log message:
        fixes to NEON implementation

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/libcvd/cvd_src/NEON/convert_rgb_to_y.cc?cvsroot=libcvd&r1=1.1&r2=1.2

Patches:
Index: convert_rgb_to_y.cc
===================================================================
RCS file: /cvsroot/libcvd/libcvd/cvd_src/NEON/convert_rgb_to_y.cc,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- convert_rgb_to_y.cc 11 May 2011 15:02:05 -0000      1.1
+++ convert_rgb_to_y.cc 11 May 2011 15:20:56 -0000      1.2
@@ -6,23 +6,23 @@
 namespace CVD {
 
        namespace Internal {
-               void convert_rgb_to_grey_NEON(const SubImage<Rgb<byte> >& from, 
SubImage<byte>& to, const unsigned red, const unsigned green, const unsigned 
blue) 
-                       const uint16x8_t red = vdupq_n_u16(red);
-                       const uint16x8_t green = vdupq_n_u16(green);
-                       const uint16x8_t blue = vdupq_n_u16(blue);
+               void convert_rgb_to_grey_NEON(const SubImage<Rgb<byte> >& from, 
SubImage<byte>& to, const unsigned r, const unsigned g, const unsigned b) {
+                       const uint8x8_t red = vdup_n_u8(r);
+                       const uint8x8_t green = vdup_n_u8(g);
+                       const uint8x8_t blue = vdup_n_u8(b);
                        
                        for( int y = 0; y < from.size().y; ++y){
                                const Rgb<byte> * in = from[y];
-                               byte * out = out[y];
+                               byte * out = to[y];
                                for( int x = 0; x < from.size().x; x+=8, in += 
8, out += 8){
                                        uint8x8x3_t in_data  = vld3_u8((const 
uint8_t *)in);
 
-                                       uint16x8_t sum = vmulq_u16(in_data[0], 
red);
-                                       sum = vmlaq_u16(sum, in_data[1], green);
-                                       sum = vmlaq_u16(sum, in_data[2], blue);
+                                       uint16x8_t sum = 
vmull_u8(in_data.val[0], red);
+                                       sum = vmlal_u8(sum, in_data.val[1], 
green);
+                                       sum = vmlal_u8(sum, in_data.val[2], 
blue);
 
                                        uint8x8_t final_sum = vshrn_n_u16(sum, 
8); // divide by 256
-                                       vst1_u8(out_data, final_sum);
+                                       vst1_u8(out, final_sum);
                                }
                        }
                }
@@ -36,10 +36,10 @@
                Internal::convert_rgb_to_grey_NEON( from, to, 77, 150, 29);
                } else {
                        const int multiple_of_8_width = (from.size().x / 8) * 8;
-                       const int remainder = from.size().x - 
multiple_of_8_width;
                        const ImageRef end_fast(multiple_of_8_width, 
from.size().y);
 
-                       Internal::convert_rgb_to_grey_NEON( 
from.sub_image(ImageRef_zero, end_fast), to.sub_image(ImageRef_zero, end_fast), 
77, 150, 29);
+            // red (77) + green (150) + blue (29) = 256
+                       Internal::convert_rgb_to_grey_NEON( 
from.sub_image(ImageRef_zero, end_fast), to.sub_image(ImageRef_zero, 
end_fast).ref(), 77, 150, 29);
                        
                        for(int y = 0; y < from.size().y; ++y){
                                const Rgb<byte> * in = 
from[y]+multiple_of_8_width;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]