@@ -71,3 +71,45 @@ uint32_t FLAC__bitmath_silog2(FLAC__int64 v)
7171 v = (v < 0 ) ? (- (v + 1 )) : v ;
7272 return FLAC__bitmath_ilog2_wide (v )+ 2 ;
7373}
74+
75+ /* An example of what FLAC__bitmath_extra_mulbits_unsigned() computes:
76+ *
77+ * extra_mulbits_unsigned( 0) = 0
78+ * extra_mulbits_unsigned( 1) = 0
79+ * extra_mulbits_unsigned( 2) = 1
80+ * extra_mulbits_unsigned( 3) = 2
81+ * extra_mulbits_unsigned( 4) = 2
82+ * extra_mulbits_unsigned( 5) = 3
83+ * extra_mulbits_unsigned( 6) = 3
84+ * extra_mulbits_unsigned( 7) = 3
85+ * extra_mulbits_unsigned( 8) = 3
86+ * extra_mulbits_unsigned( 9) = 4
87+ * extra_mulbits_unsigned(10) = 4
88+ * extra_mulbits_unsigned(11) = 4
89+ * extra_mulbits_unsigned(12) = 4
90+ * extra_mulbits_unsigned(13) = 4
91+ * extra_mulbits_unsigned(14) = 4
92+ * extra_mulbits_unsigned(15) = 4
93+ * extra_mulbits_unsigned(16) = 4
94+ * extra_mulbits_unsigned(17) = 5
95+ * extra_mulbits_unsigned(18) = 5
96+ *
97+ * The intent of this is to calculate how many extra bits multiplication
98+ * by a certain number requires. So, if a signal fits in a certain number
99+ * of bits (for example 16) than multiplying by a number (for example 1024)
100+ * grows that storage requirement (to 26 in this example). In effect this is
101+ * is the log2 rounded up.
102+ */
103+ uint32_t FLAC__bitmath_extra_mulbits_unsigned (FLAC__uint32 v )
104+ {
105+ uint32_t ilog2 ;
106+ if (v == 0 )
107+ return 0 ;
108+ ilog2 = FLAC__bitmath_ilog2 (v );
109+ if (((v >> ilog2 ) << ilog2 ) == v )
110+ /* v is power of 2 */
111+ return ilog2 ;
112+ else
113+ /* v is not a power of 2, return one higher */
114+ return ilog2 + 1 ;
115+ }
0 commit comments