42 #include <tmmintrin.h>
177 void copyInverse(uint8_t *tp,
const uint8_t *sp,
size_t nmemb,
size_t m)
186 #if defined (__SSSE3__)
187 __m128i inv_index=_mm_set_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
189 while (i+16 <= nmemb)
193 __m128i v=_mm_loadu_si128(
reinterpret_cast<const __m128i *
>(sp));
194 v=_mm_shuffle_epi8(v, inv_index);
195 _mm_storeu_si128(
reinterpret_cast<__m128i *
>(tp), v);
215 for (
size_t i=0; i<nmemb; i++)
219 for (
size_t k=0; k<m; k++)
230 uint32_t part,
bool rotate)
232 sensor_msgs::ImagePtr im;
233 std::string pixelformat;
244 ROS_WARN_STREAM(
"Rotation is not supporte for image format: " << pixelformat);
247 if (pixelformat.size() > 0)
251 im = boost::make_shared<sensor_msgs::Image>();
252 im->encoding = pixelformat;
254 const uint64_t freq = 1000000000ul;
258 im->header.stamp.sec = time / freq;
259 im->header.stamp.nsec = time - freq * im->header.stamp.sec;
260 im->header.frame_id = frame_id;
264 im->width =
static_cast<uint32_t
>(buffer->
getWidth(part));
265 im->height =
static_cast<uint32_t
>(buffer->
getHeight(part));
270 const uint8_t* ps =
static_cast<const uint8_t*
>(buffer->
getBase(part));
271 size_t pstep = im->width * bytes_per_pixel + buffer->
getXPadding(part);
275 im->step = im->width * bytes_per_pixel;
277 im->data.resize(im->step * im->height);
278 uint8_t* pt =
reinterpret_cast<uint8_t*
>(&im->data[0]);
280 if (im->step != pstep)
284 pt += im->step*im->height;
285 for (uint32_t k = 0; k < im->height; k++)
289 copyInverse(pt, ps, im->width, bytes_per_pixel);
296 for (uint32_t k = 0; k < im->height; k++)
298 memcpy(pt, ps, im->step*
sizeof(uint8_t));
309 copyInverse(pt, ps, im->height*im->width, bytes_per_pixel);
313 memcpy(pt, ps, im->height*im->step*
sizeof(uint8_t));