85
86
const int bytes = 43;
89
const uint32_t mask = 0x3FF;
90
__m128i mmask = _mm_set_epi32(mask, mask, mask, mask);
93
uint32_t result[4] __attribute__ ((aligned (16))) = {0};
89
98
row = (info >> 4) & 0x7FF;
104
113
/* "Correct" missing pixel */
105
114
if ((row < 2) && (pixels == (IPECAMERA_PIXELS_PER_CHANNEL - 1))) {
106
115
pixel_buffer[base] = 0;
111
120
CHECK_FLAG("number of pixels, %i is expected", pixels == IPECAMERA_PIXELS_PER_CHANNEL, pixels, IPECAMERA_PIXELS_PER_CHANNEL);
114
for (int i = 1; i < bytes; i++) {
124
for (int i = 1 ; i < bytes-4; i += 4, base += 12) {
125
packed = _mm_set_epi32(raw[i], raw[i+1], raw[i+2], raw[i+3]);
127
tmp1 = _mm_srli_epi32(packed, 20);
128
tmp2 = _mm_and_si128(tmp1, mmask);
129
_mm_storeu_si128((__m128i*) result, tmp2);
130
pixel_buffer[base] = result[0];
131
pixel_buffer[base+3] = result[1];
132
pixel_buffer[base+6] = result[2];
133
pixel_buffer[base+9] = result[3];
135
tmp1 = _mm_srli_epi32(packed, 10);
136
tmp2 = _mm_and_si128(tmp1, mmask);
137
_mm_storeu_si128((__m128i*) result, tmp2);
138
pixel_buffer[base+1] = result[0];
139
pixel_buffer[base+4] = result[1];
140
pixel_buffer[base+7] = result[2];
141
pixel_buffer[base+10] = result[3];
143
tmp1 = _mm_and_si128(packed, mmask);
144
_mm_storeu_si128((__m128i*) result, tmp1);
145
pixel_buffer[base+2] = result[0];
146
pixel_buffer[base+5] = result[1];
147
pixel_buffer[base+8] = result[2];
148
pixel_buffer[base+11] = result[3];
151
/* Compute last pixels the usual way */
152
for (int i = bytes-4; i < bytes; i++) {
154
pixel_buffer[base++] = (data >> 20) & 0x3FF;
155
pixel_buffer[base++] = (data >> 10) & 0x3FF;
156
pixel_buffer[base++] = data & 0x3FF;
159
for (int i = 1 ; i < bytes; i++) {
118
162
header = (data >> 30) & 0x03;
119
163
CHECK_FLAG("raw data magick", header == 3, header);