Move av1_ceil_log2() to aom_ports/bitops.h get_msb() and av1_ceil_log2() are the FloorLog2() and CeilLog2() functions in the AV1 specification, so declare them in the same header file, aom_ports/bitops.h. Change the prefix to aom: aom_ceil_log2(). Change-Id: If8cbb8a3d45110b8f8ca26388d52020867ee77c7
diff --git a/aom_ports/bitops.h b/aom_ports/bitops.h index cac529e..cbcfe5f 100644 --- a/aom_ports/bitops.h +++ b/aom_ports/bitops.h
@@ -70,6 +70,12 @@ } #endif +// Returns (int)ceil(log2(n)). +static inline int aom_ceil_log2(int n) { + if (n < 2) return 0; + return get_msb(n - 1) + 1; +} + #if defined(__GNUC__) && \ ((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ >= 4) static inline int aom_clzll(uint64_t n) { return __builtin_clzll(n); }
diff --git a/av1/common/entropymode.h b/av1/common/entropymode.h index 0783af0..b507eb1 100644 --- a/av1/common/entropymode.h +++ b/av1/common/entropymode.h
@@ -190,12 +190,6 @@ void av1_setup_frame_contexts(struct AV1Common *cm); void av1_setup_past_independence(struct AV1Common *cm); -// Returns (int)ceil(log2(n)). -static inline int av1_ceil_log2(int n) { - if (n < 2) return 0; - return get_msb(n - 1) + 1; -} - // Returns the context for palette color index at row 'r' and column 'c', // along with the 'color_order' of neighbors and the 'color_idx'. // The 'color_map' is a 2D array with the given 'stride'.
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c index 7d8971d..d3a2281 100644 --- a/av1/decoder/decodemv.c +++ b/av1/decoder/decodemv.c
@@ -27,6 +27,7 @@ #include "av1/decoder/decodemv.h" #include "aom_dsp/aom_dsp_common.h" +#include "aom_ports/bitops.h" #define ACCT_STR __func__ @@ -496,7 +497,7 @@ pmi->palette_colors[idx] = clamp(pmi->palette_colors[idx - 1] + delta, 0, (1 << bit_depth) - 1); range -= (pmi->palette_colors[idx] - pmi->palette_colors[idx - 1]); - bits = AOMMIN(bits, av1_ceil_log2(range)); + bits = AOMMIN(bits, aom_ceil_log2(range)); } } merge_colors(pmi->palette_colors, cached_colors, n, n_cached_colors); @@ -530,7 +531,7 @@ pmi->palette_colors[idx] = clamp(pmi->palette_colors[idx - 1] + delta, 0, (1 << bit_depth) - 1); range -= (pmi->palette_colors[idx] - pmi->palette_colors[idx - 1]); - bits = AOMMIN(bits, av1_ceil_log2(range)); + bits = AOMMIN(bits, aom_ceil_log2(range)); } } merge_colors(pmi->palette_colors + PALETTE_MAX_SIZE, cached_colors, n,
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c index 99c89a7..178a84a 100644 --- a/av1/encoder/bitstream.c +++ b/av1/encoder/bitstream.c
@@ -670,14 +670,14 @@ if (delta > max_delta) max_delta = delta; } const int min_bits = bit_depth - 3; - int bits = AOMMAX(av1_ceil_log2(max_delta + 1 - min_val), min_bits); + int bits = AOMMAX(aom_ceil_log2(max_delta + 1 - min_val), min_bits); assert(bits <= bit_depth); int range = (1 << bit_depth) - colors[0] - min_val; aom_write_literal(w, bits - min_bits, 2); for (int i = 0; i < num - 1; ++i) { aom_write_literal(w, deltas[i] - min_val, bits); range -= deltas[i]; - bits = AOMMIN(bits, av1_ceil_log2(range)); + bits = AOMMIN(bits, aom_ceil_log2(range)); } }
diff --git a/av1/encoder/palette.c b/av1/encoder/palette.c index c1ceb8c..838bf90 100644 --- a/av1/encoder/palette.c +++ b/av1/encoder/palette.c
@@ -14,6 +14,7 @@ #include "av1/common/pred_common.h" +#include "aom_ports/bitops.h" #include "av1/encoder/block.h" #include "av1/encoder/cost.h" #include "av1/encoder/encoder.h" @@ -76,13 +77,13 @@ assert(delta >= min_val); if (delta > max_delta) max_delta = delta; } - int bits_per_delta = AOMMAX(av1_ceil_log2(max_delta + 1 - min_val), min_bits); + int bits_per_delta = AOMMAX(aom_ceil_log2(max_delta + 1 - min_val), min_bits); assert(bits_per_delta <= bit_depth); int range = (1 << bit_depth) - colors[0] - min_val; for (int i = 0; i < num - 1; ++i) { bits_cost += bits_per_delta; range -= deltas[i]; - bits_per_delta = AOMMIN(bits_per_delta, av1_ceil_log2(range)); + bits_per_delta = AOMMIN(bits_per_delta, aom_ceil_log2(range)); } return bits_cost; } @@ -131,7 +132,7 @@ if (d > max_d) max_d = d; if (d == 0) ++(*zero_count); } - return AOMMAX(av1_ceil_log2(max_d + 1), *min_bits); + return AOMMAX(aom_ceil_log2(max_d + 1), *min_bits); } int av1_palette_color_cost_y(const PALETTE_MODE_INFO *const pmi,
diff --git a/test/log2_test.cc b/test/log2_test.cc index 59b0423..1ef9eca 100644 --- a/test/log2_test.cc +++ b/test/log2_test.cc
@@ -13,7 +13,6 @@ #include <math.h> #include "aom_ports/bitops.h" -#include "av1/common/entropymode.h" #include "gtest/gtest.h" TEST(Log2Test, GetMsb) { @@ -31,21 +30,21 @@ } } -TEST(Log2Test, Av1CeilLog2) { +TEST(Log2Test, AomCeilLog2) { // Test small numbers exhaustively. - EXPECT_EQ(av1_ceil_log2(0), 0); + EXPECT_EQ(aom_ceil_log2(0), 0); for (int n = 1; n < 10000; n++) { - EXPECT_EQ(av1_ceil_log2(n), static_cast<int>(ceil(log2(n)))); + EXPECT_EQ(aom_ceil_log2(n), static_cast<int>(ceil(log2(n)))); } // Test every power of 2 and the two adjacent numbers. for (int exponent = 2; exponent < 31; exponent++) { const int power_of_2 = 1 << exponent; - EXPECT_EQ(av1_ceil_log2(power_of_2 - 1), exponent); - EXPECT_EQ(av1_ceil_log2(power_of_2), exponent); - EXPECT_EQ(av1_ceil_log2(power_of_2 + 1), exponent + 1); + EXPECT_EQ(aom_ceil_log2(power_of_2 - 1), exponent); + EXPECT_EQ(aom_ceil_log2(power_of_2), exponent); + EXPECT_EQ(aom_ceil_log2(power_of_2 + 1), exponent + 1); } // INT_MAX = 2^31 - 1 - EXPECT_EQ(av1_ceil_log2(INT_MAX), 31); + EXPECT_EQ(aom_ceil_log2(INT_MAX), 31); }