22 #include "descriptor.h"
24 #include <emmintrin.h>
28 Descriptor::Descriptor(uint8_t* I,int32_t width,int32_t height,int32_t bpl,
bool half_resolution) {
29 I_desc = (uint8_t*)_mm_malloc(16*width*height*
sizeof(uint8_t),16);
30 uint8_t* I_du = (uint8_t*)_mm_malloc(bpl*height*
sizeof(uint8_t),16);
31 uint8_t* I_dv = (uint8_t*)_mm_malloc(bpl*height*
sizeof(uint8_t),16);
32 filter::sobel3x3(I,I_du,I_dv,bpl,height);
33 createDescriptor(I_du,I_dv,width,height,bpl,half_resolution);
38 Descriptor::~Descriptor() {
42 void Descriptor::createDescriptor (uint8_t* I_du,uint8_t* I_dv,int32_t width,int32_t height,int32_t bpl,
bool half_resolution) {
45 uint32_t addr_v0,addr_v1,addr_v2,addr_v3,addr_v4;
48 if (half_resolution) {
51 for (int32_t v=4; v<height-3; v+=2) {
54 addr_v0 = addr_v2-2*bpl;
55 addr_v1 = addr_v2-1*bpl;
56 addr_v3 = addr_v2+1*bpl;
57 addr_v4 = addr_v2+2*bpl;
59 for (int32_t u=3; u<width-3; u++) {
60 I_desc_curr = I_desc+(v*width+u)*16;
61 *(I_desc_curr++) = *(I_du+addr_v0+u+0);
62 *(I_desc_curr++) = *(I_du+addr_v1+u-2);
63 *(I_desc_curr++) = *(I_du+addr_v1+u+0);
64 *(I_desc_curr++) = *(I_du+addr_v1+u+2);
65 *(I_desc_curr++) = *(I_du+addr_v2+u-1);
66 *(I_desc_curr++) = *(I_du+addr_v2+u+0);
67 *(I_desc_curr++) = *(I_du+addr_v2+u+0);
68 *(I_desc_curr++) = *(I_du+addr_v2+u+1);
69 *(I_desc_curr++) = *(I_du+addr_v3+u-2);
70 *(I_desc_curr++) = *(I_du+addr_v3+u+0);
71 *(I_desc_curr++) = *(I_du+addr_v3+u+2);
72 *(I_desc_curr++) = *(I_du+addr_v4+u+0);
73 *(I_desc_curr++) = *(I_dv+addr_v1+u+0);
74 *(I_desc_curr++) = *(I_dv+addr_v2+u-1);
75 *(I_desc_curr++) = *(I_dv+addr_v2+u+1);
76 *(I_desc_curr++) = *(I_dv+addr_v3+u+0);
84 for (int32_t v=3; v<height-3; v++) {
87 addr_v0 = addr_v2-2*bpl;
88 addr_v1 = addr_v2-1*bpl;
89 addr_v3 = addr_v2+1*bpl;
90 addr_v4 = addr_v2+2*bpl;
92 for (int32_t u=3; u<width-3; u++) {
93 I_desc_curr = I_desc+(v*width+u)*16;
94 *(I_desc_curr++) = *(I_du+addr_v0+u+0);
95 *(I_desc_curr++) = *(I_du+addr_v1+u-2);
96 *(I_desc_curr++) = *(I_du+addr_v1+u+0);
97 *(I_desc_curr++) = *(I_du+addr_v1+u+2);
98 *(I_desc_curr++) = *(I_du+addr_v2+u-1);
99 *(I_desc_curr++) = *(I_du+addr_v2+u+0);
100 *(I_desc_curr++) = *(I_du+addr_v2+u+0);
101 *(I_desc_curr++) = *(I_du+addr_v2+u+1);
102 *(I_desc_curr++) = *(I_du+addr_v3+u-2);
103 *(I_desc_curr++) = *(I_du+addr_v3+u+0);
104 *(I_desc_curr++) = *(I_du+addr_v3+u+2);
105 *(I_desc_curr++) = *(I_du+addr_v4+u+0);
106 *(I_desc_curr++) = *(I_dv+addr_v1+u+0);
107 *(I_desc_curr++) = *(I_dv+addr_v2+u-1);
108 *(I_desc_curr++) = *(I_dv+addr_v2+u+1);
109 *(I_desc_curr++) = *(I_dv+addr_v3+u+0);