Make align() work even on machines with 32-bit chars
authorJean-Marc Valin <jmvalin@jmvalin.ca>
Tue, 4 Aug 2015 04:05:16 +0000 (00:05 -0400)
committerJean-Marc Valin <jmvalin@jmvalin.ca>
Tue, 4 Aug 2015 04:05:16 +0000 (00:05 -0400)
src/opus_private.h

index 44db28d..63338fe 100644 (file)
@@ -110,10 +110,15 @@ int opus_decode_native(OpusDecoder *st, const unsigned char *data, opus_int32 le
 /* Make sure everything is properly aligned. */
 static OPUS_INLINE int align(int i)
 {
+    int size;
     /* Alignment is determined by the max size of void*, opus_int32 and opus_val32,
        rounded up to the nearest power of two. */
-    int size = 1 << EC_ILOG(((sizeof(opus_int32)-1)|(sizeof(opus_val32)-1)|(sizeof(void*)-1)));
-    return (i+(int)size-1)&-(int)size;
+    int tmp = (sizeof(opus_int32)-1)|(sizeof(opus_val32)-1)|(sizeof(void*)-1);
+    if (tmp == 0)
+       size = 1;
+    else
+       size = 1 << EC_ILOG(tmp);
+    return (i+size-1)&-size;
 }
 
 int opus_packet_parse_impl(const unsigned char *data, opus_int32 len,