diff options
author | Jonathan Lennox <jonathan@vidyo.com> | 2015-08-04 19:04:20 +0300 |
---|---|---|
committer | Timothy B. Terriberry <tterribe@xiph.org> | 2015-08-04 19:10:06 +0300 |
commit | ef8676867777ee1024a8c4a024cdd230c51d1d6a (patch) | |
tree | 5c4df88dac2ae4cfc2c7204034a58507840b0ef3 /src | |
parent | 24539c4d7bd528bcb7fb55d44702f4a90fff05e7 (diff) |
Simplify and generalize implementation of align(). Should be very efficient on sensible platforms, and correct everywhere.
Diffstat (limited to 'src')
-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, |