From e90adb001350e067437d64b1f9bf68a569fac6b5 Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin Date: Mon, 3 Aug 2015 21:40:46 -0400 Subject: More conservative alignment Based on max size of void*, opus_int32 and opus_val32, rounded up to the nearest power of two --- src/opus_private.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/opus_private.h b/src/opus_private.h index 3177f524..44db28d7 100644 --- a/src/opus_private.h +++ b/src/opus_private.h @@ -107,10 +107,13 @@ int opus_decode_native(OpusDecoder *st, const unsigned char *data, opus_int32 le opus_val16 *pcm, int frame_size, int decode_fec, int self_delimited, opus_int32 *packet_offset, int soft_clip); -/* Make sure everything's aligned to sizeof(void *) bytes */ +/* Make sure everything is properly aligned. */ static OPUS_INLINE int align(int i) { - return (i+(int)sizeof(void *)-1)&-(int)sizeof(void *); + /* 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 opus_packet_parse_impl(const unsigned char *data, opus_int32 len, -- cgit v1.2.1