From ef8676867777ee1024a8c4a024cdd230c51d1d6a Mon Sep 17 00:00:00 2001 From: Jonathan Lennox Date: Tue, 4 Aug 2015 12:04:20 -0400 Subject: Simplify and generalize implementation of align(). Should be very efficient on sensible platforms, and correct everywhere. --- src/opus_private.h | 18 +++++++++--------- 1 file 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 /* 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, -- cgit v1.2.1