diff options
Diffstat (limited to 'src/opus_private.h')
-rw-r--r-- | src/opus_private.h | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/src/opus_private.h b/src/opus_private.h index 63338fee..5bbd7dce 100644 --- a/src/opus_private.h +++ b/src/opus_private.h @@ -33,6 +33,8 @@ #include "opus.h" #include "celt.h" +#include <stddef.h> /* offsetof */ + struct OpusRepacketizer { unsigned char toc; int nb_frames; @@ -110,15 +112,13 @@ 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 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; + struct foo {char c; union { void* p; opus_int32 i; opus_val32 v; } u;}; + + int alignment = offsetof(struct foo, u); + + /* Optimizing compilers should optimize div and multiply into and + for all sensible alignment values. */ + return ((i + alignment - 1) / alignment) * alignment; } int opus_packet_parse_impl(const unsigned char *data, opus_int32 len, |