Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.xiph.org/xiph/opus.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Lennox <jonathan@vidyo.com>2015-08-04 19:04:20 +0300
committerTimothy B. Terriberry <tterribe@xiph.org>2015-08-04 19:10:06 +0300
commitef8676867777ee1024a8c4a024cdd230c51d1d6a (patch)
tree5c4df88dac2ae4cfc2c7204034a58507840b0ef3
parent24539c4d7bd528bcb7fb55d44702f4a90fff05e7 (diff)
Simplify and generalize implementation of align(). Should be very efficient on sensible platforms, and correct everywhere.
-rw-r--r--src/opus_private.h18
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,