Home | History | Annotate | Download | only in src
      1 #include "RenderScript.h"
      2 #include "ScriptC_detectAt.h"
      3 #include "../../objdetect/src/HaarStructs.h"
      4 
      5 using namespace android;
      6 using namespace RSC;
      7 using namespace std;
      8 
      9 static sp<RS> rs;
     10 static sp<ScriptC_detectAt> sc;
     11 
     12 void initInnerLoop(HaarVars hf, int origWidth, int origHeight) {
     13     rs = new RS();
     14     bool r = rs->init("/data/data/com.example.noahp.facialrecogrs/cache");
     15 
     16     sc = new ScriptC_detectAt(rs);
     17 
     18     sc->set_origWidth(origWidth);
     19     sc->set_origHeight(origHeight);
     20     sc->set_sqofs(hf.sqofs);
     21     sc->set_normRectArea(hf.normRectArea);
     22     sc->set_stagesSize(hf.stagesSize);
     23 
     24     sc->invoke_initCurr();
     25 
     26     const HaarStump* cascadeStumps = &hf.stumps[0];
     27     const HaarStage* cascadeStages = &hf.stages[0];
     28 
     29     for( int i = 0; i < hf.nStumps; i++ )
     30     {
     31         const HaarStump stump = cascadeStumps[i];
     32         sc->invoke_addStump(i, stump.threshold, stump.left, stump.right);
     33     }
     34 
     35     for(int stageIdx = 0; stageIdx < hf.stagesSize; stageIdx++) {
     36         const HaarStage stage = cascadeStages[stageIdx];
     37         sc->invoke_addStage(stage.first, stage.ntrees, stage.threshold);
     38         int ntrees = stage.ntrees;
     39     }
     40 
     41     for( int i = 0; i < hf.nFeatures; i++ )
     42     {
     43         const HaarFeature f = hf.haarFeatures[i];
     44         sc->invoke_addHF(f.x[0],f.y[0],f.width[0],f.height[0],
     45                             f.x[1],f.y[1],f.width[1],f.height[1],
     46                             f.x[2],f.y[2],f.width[2],f.height[2],
     47                             f.weight0, f.weight1, f.weight2);
     48     }
     49 
     50     sc->set_nrect(UInt4(hf.nrect.x, hf.nrect.y, hf.nrect.width, hf.nrect.height));
     51 }
     52 
     53 void innerloops(const int height, const int width, const int* inArr, const int* inArrSq, const int yStep, bool* outData) {
     54     sp<Allocation> outAllocation;
     55     sp<const Element> e2 = Element::BOOLEAN(rs);
     56     Type::Builder tb2(rs, e2);
     57     tb2.setX(width*height);
     58     sp<const Type> t2 = tb2.create();
     59     outAllocation = Allocation::createTyped(rs,t2);
     60 
     61     sp<Allocation> inAllocation;
     62     sp<const Element> e = Element::I32(rs);
     63     Type::Builder tb(rs, e);
     64     tb.setX(width*height);
     65     sp<const Type> t = tb.create();
     66     inAllocation = Allocation::createTyped(rs,t);
     67     inAllocation->copy1DRangeFrom(0,width*height,inArr);
     68     sc->set_inAlloc(inAllocation);
     69 
     70     sp<Allocation> inAllocationSq;
     71     sp<const Element> e3 = Element::I32(rs);
     72     inAllocationSq = Allocation::createTyped(rs,t);
     73     inAllocationSq->copy1DRangeFrom(0,width*height,inArrSq);
     74     sc->set_inAllocSq(inAllocationSq);
     75 
     76     sc->set_width(width);
     77     sc->set_height(height);
     78     sc->set_yStep(yStep);
     79 
     80     sc->forEach_runAtHaarKernel(inAllocation, outAllocation);
     81     outAllocation->copy1DRangeTo(0,width*height,outData);
     82 }
     83 
     84 void cleanUpInnerLoops() {
     85     rs->finish();
     86 }