From abb089431d0467c3609207d0b27359ef08a6c16d Mon Sep 17 00:00:00 2001 From: wm4 Date: Wed, 6 Nov 2019 21:35:49 +0100 Subject: common: add a helper to round up to next power of 2 This is something relatively frequently needed, and there must be half a dozen ad-hoc implementations in mpv. The next commit uses this, the suspected duplicate implementations are hiding. --- common/common.c | 14 ++++++++++++++ common/common.h | 1 + 2 files changed, 15 insertions(+) diff --git a/common/common.c b/common/common.c index 967ab961c0..5068995ded 100644 --- a/common/common.c +++ b/common/common.c @@ -336,3 +336,17 @@ unsigned int mp_log2(uint32_t v) return 0; #endif } + +// If a power of 2, return it, otherwise return the next highest one, or 0. +// mp_round_next_power_of_2(65) == 128 +// mp_round_next_power_of_2(64) == 64 +// mp_round_next_power_of_2(0) == 1 +// mp_round_next_power_of_2(UINT32_MAX) == 0 +uint32_t mp_round_next_power_of_2(uint32_t v) +{ + for (int n = 0; n < 30; n++) { + if ((1 << n) >= v) + return 1 << n; + } + return 0; +} diff --git a/common/common.h b/common/common.h index 5e6950c931..8dbb304625 100644 --- a/common/common.h +++ b/common/common.h @@ -89,6 +89,7 @@ bool mp_rect_contains(struct mp_rect *rc, int x, int y); bool mp_rect_equals(struct mp_rect *rc1, struct mp_rect *rc2); unsigned int mp_log2(uint32_t v); +uint32_t mp_round_next_power_of_2(uint32_t v); int mp_snprintf_cat(char *str, size_t size, const char *format, ...) PRINTF_ATTRIBUTE(3, 4); -- cgit v1.2.3