libcvd-members
[Top][All Lists]
Advanced

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

[libcvd-members] libcvd/cvd_src faster_corner.cxx


From: Edward Rosten
Subject: [libcvd-members] libcvd/cvd_src faster_corner.cxx
Date: Fri, 03 Aug 2007 23:13:25 +0000

CVSROOT:        /cvsroot/libcvd
Module name:    libcvd
Changes by:     Edward Rosten <edrosten>        07/08/03 23:13:25

Modified files:
        cvd_src        : faster_corner.cxx 

Log message:
        Potential fix to faster_corner_10.
        
        WARNING IT MAY BE BROKEN!!!

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/libcvd/cvd_src/faster_corner.cxx?cvsroot=libcvd&r1=1.7&r2=1.8

Patches:
Index: faster_corner.cxx
===================================================================
RCS file: /cvsroot/libcvd/libcvd/cvd_src/faster_corner.cxx,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- faster_corner.cxx   25 Jul 2007 20:52:25 -0000      1.7
+++ faster_corner.cxx   3 Aug 2007 23:13:24 -0000       1.8
@@ -154,14 +154,23 @@
     {
        const int w = I.size().x;
        const int stride = 3*w;
-       typedef std::list<std::pair<const byte*, unsigned int> > Passed;
-       Passed passed;
  
        // The compiler refuses to reserve a register for this
        register const __m128i barriers = _mm_set1_epi8((byte)barrier);
        const byte* const end = I[I.size().y - 3]-16;
 
-       for (const byte* p = I[3] + 16; p!=end; p+=16) {
+       int xend = I.size().x - 3;
+       xend -= I.size().x % 16;
+
+       for(int y=3; y < I.size().y - 3; y++)
+       {
+           for(int x=3; x < 16; x++)
+               if(is_corner_10<Less>(&I[y][x], I.row_stride(), barrier) || 
is_corner_10<Greater>(&I[y][x], I.row_stride(), barrier))
+                   corners.push_back(ImageRef(x, y));
+           
+           for(int x=16; x < xend; x++)
+           {
+               const byte* p = &I[y][x];
            __m128i lo, hi;
            {
                const __m128i here = load_si128<Aligned>((const __m128i*)(p));
@@ -265,42 +274,50 @@
                if (!possible)
                    continue;
            }
-           passed.push_back(make_pair(p,(possible | (possible>>16))&0xFFFF));
-       }
-       corners.reserve(passed.size());
-       int row = 3;
-       const byte* row_start = I[3];
-       // Check first 16
+
+               //if(possible & 0x0f) //Does this make it faster?
        {
-           for (int j=3; j<16; ++j)
-               if (is_corner_10<Less>(row_start + j, w, row_start[j]-barrier) 
|| 
-                   is_corner_10<Greater>(row_start + j, w, 
row_start[j]+barrier))
-                   corners.push_back(ImageRef(j,3));
+                   if(possible & (1<< 0))
+                           corners.push_back(ImageRef(y, x + 0));
+                   if(possible & (1<< 1))
+                           corners.push_back(ImageRef(y, x + 1));
+                   if(possible & (1<< 2))
+                           corners.push_back(ImageRef(y, x + 2));
+                   if(possible & (1<< 3))
+                           corners.push_back(ImageRef(y, x + 3));
+                   if(possible & (1<< 4))
+                           corners.push_back(ImageRef(y, x + 4));
+                   if(possible & (1<< 5))
+                           corners.push_back(ImageRef(y, x + 5));
+                   if(possible & (1<< 6))
+                           corners.push_back(ImageRef(y, x + 6));
+                   if(possible & (1<< 7))
+                           corners.push_back(ImageRef(y, x + 7));
+               }
+               //if(possible & 0xf0) //Does this mak( ,  fast)r?
+               {
+                   if(possible & (1<< 8))
+                           corners.push_back(ImageRef(y, x + 8));
+                   if(possible & (1<< 9))
+                           corners.push_back(ImageRef(y, x + 9));
+                   if(possible & (1<<10))
+                           corners.push_back(ImageRef(y, x +10));
+                   if(possible & (1<<11))
+                           corners.push_back(ImageRef(y, x +11));
+                   if(possible & (1<<12))
+                           corners.push_back(ImageRef(y, x +12));
+                   if(possible & (1<<13))
+                           corners.push_back(ImageRef(y, x +13));
+                   if(possible & (1<<14))
+                           corners.push_back(ImageRef(y, x +14));
+                   if(possible & (1<<15))
+                           corners.push_back(ImageRef(y, x +15));
        }
-       for (Passed::iterator it = passed.begin(); it != passed.end(); ++it) {
-           while (it->first >= row_start + w) {
-               ++row;
-               row_start += w;
            }
-           int x = it->first - row_start;
-           unsigned int bits = it->second;
-           if (x == 0) {
-               x = 3;
-               bits >>= 3;
-           } else if (x >= w-18)
-               bits &= 0x1FFF;
-           for (;bits;bits>>=1, ++x) {
-               if (bits&0x1)
-                   corners.push_back(ImageRef(x,row));
-           }
-       }
-       // Check last 16
-       {
-           row_start = I[I.size().y-4];
-           for (int j=w-16; j<w-3; ++j)
-               if (is_corner_10<Less>(row_start + j, w, row_start[j]-barrier) 
|| 
-                   is_corner_10<Greater>(row_start + j, w, 
row_start[j]+barrier))
-                   corners.push_back(ImageRef(j,I.size().y-4));
+
+           for(int x=xend; x < I.size().x - 3; x++)
+               if(is_corner_10<Less>(&I[y][x], I.row_stride(), barrier) || 
is_corner_10<Greater>(&I[y][x], I.row_stride(), barrier))
+                   corners.push_back(ImageRef(x, y));
        }
     }
 




reply via email to

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