Skip to content

Commit

Permalink
Build on big-endian systems again.
Browse files Browse the repository at this point in the history
On big endian, fn_le32() is actually a function, not an empty preprocessor
macro, so we can't take the address of its return value when doing the C
equivalent of reinterpret_cast.

Signed-off-by: Drew Fisher <drew.m.fisher@gmail.com>
  • Loading branch information
zarvox committed Jan 30, 2012
1 parent ac6721a commit bbc109a
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 6 deletions.
13 changes: 9 additions & 4 deletions src/cameras.c
Expand Up @@ -910,10 +910,15 @@ static int freenect_fetch_zero_plane_info(freenect_device *dev)
}

memcpy(&(dev->registration.zero_plane_info), reply + 94, sizeof(dev->registration.zero_plane_info));
dev->registration.zero_plane_info.dcmos_emitter_dist = *((float*)(&fn_le32(*((uint32_t*)(&dev->registration.zero_plane_info.dcmos_emitter_dist)))));
dev->registration.zero_plane_info.dcmos_rcmos_dist = *((float*)(&fn_le32(*((uint32_t*)(&dev->registration.zero_plane_info.dcmos_rcmos_dist)))));
dev->registration.zero_plane_info.reference_distance = *((float*)(&fn_le32(*((uint32_t*)(&dev->registration.zero_plane_info.reference_distance)))));
dev->registration.zero_plane_info.reference_pixel_size = *((float*)(&fn_le32(*((uint32_t*)(&dev->registration.zero_plane_info.reference_pixel_size)))));
uint32_t temp;
temp = fn_le32(*((uint32_t*)(&dev->registration.zero_plane_info.dcmos_emitter_dist)));
dev->registration.zero_plane_info.dcmos_emitter_dist = *((float*)(&temp));
temp = fn_le32(*((uint32_t*)(&dev->registration.zero_plane_info.dcmos_rcmos_dist)));
dev->registration.zero_plane_info.dcmos_rcmos_dist = *((float*)(&temp));
temp = fn_le32(*((uint32_t*)(&dev->registration.zero_plane_info.reference_distance)));
dev->registration.zero_plane_info.reference_distance = *((float*)(&temp));
temp = fn_le32(*((uint32_t*)(&dev->registration.zero_plane_info.reference_pixel_size)));
dev->registration.zero_plane_info.reference_pixel_size = *((float*)(&temp));

// WTF is all this data? it's way bigger than sizeof(XnFixedParams)...
FN_SPEW("dcmos_emitter_distance: %f\n", dev->registration.zero_plane_info.dcmos_emitter_dist);
Expand Down
8 changes: 6 additions & 2 deletions src/freenect_internal.h
Expand Up @@ -89,12 +89,16 @@ static inline uint32_t fn_le32(uint32_t d)
static inline int16_t fn_le16s(int16_t s)
{
// reinterpret cast to unsigned, use the normal fn_le16, and then reinterpret cast back
return *((int16_t*)(&fn_le16(*((uint16_t*)(&s)))));
uint16_t temp = (*(uint16_t*)(&s));
temp = fn_le16(temp);
return *((int16_t*)(&temp));
}
static inline int32_t fn_le32s(int32_t s)
{
// reinterpret cast to unsigned, use the normal fn_le32, and then reinterpret cast back
return *((int32_t*)(&fn_le32(*((uint32_t*)(&s)))));
uint32_t temp = (*(uint32_t*)(&s));
temp = fn_le32(temp);
return *((int32_t*)(&temp));
}
#else
#define fn_le16(x) (x)
Expand Down

0 comments on commit bbc109a

Please sign in to comment.