/src/flac/src/libFLAC/bitmath.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* libFLAC - Free Lossless Audio Codec library |
2 | | * Copyright (C) 2001-2009 Josh Coalson |
3 | | * Copyright (C) 2011-2025 Xiph.Org Foundation |
4 | | * |
5 | | * Redistribution and use in source and binary forms, with or without |
6 | | * modification, are permitted provided that the following conditions |
7 | | * are met: |
8 | | * |
9 | | * - Redistributions of source code must retain the above copyright |
10 | | * notice, this list of conditions and the following disclaimer. |
11 | | * |
12 | | * - Redistributions in binary form must reproduce the above copyright |
13 | | * notice, this list of conditions and the following disclaimer in the |
14 | | * documentation and/or other materials provided with the distribution. |
15 | | * |
16 | | * - Neither the name of the Xiph.org Foundation nor the names of its |
17 | | * contributors may be used to endorse or promote products derived from |
18 | | * this software without specific prior written permission. |
19 | | * |
20 | | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
21 | | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
22 | | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
23 | | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR |
24 | | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
25 | | * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
26 | | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
27 | | * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
28 | | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
29 | | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
30 | | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
31 | | */ |
32 | | |
33 | | #ifdef HAVE_CONFIG_H |
34 | | # include <config.h> |
35 | | #endif |
36 | | |
37 | | #include "private/bitmath.h" |
38 | | |
39 | | /* An example of what FLAC__bitmath_silog2() computes: |
40 | | * |
41 | | * silog2(-10) = 5 |
42 | | * silog2(- 9) = 5 |
43 | | * silog2(- 8) = 4 |
44 | | * silog2(- 7) = 4 |
45 | | * silog2(- 6) = 4 |
46 | | * silog2(- 5) = 4 |
47 | | * silog2(- 4) = 3 |
48 | | * silog2(- 3) = 3 |
49 | | * silog2(- 2) = 2 |
50 | | * silog2(- 1) = 2 |
51 | | * silog2( 0) = 0 |
52 | | * silog2( 1) = 2 |
53 | | * silog2( 2) = 3 |
54 | | * silog2( 3) = 3 |
55 | | * silog2( 4) = 4 |
56 | | * silog2( 5) = 4 |
57 | | * silog2( 6) = 4 |
58 | | * silog2( 7) = 4 |
59 | | * silog2( 8) = 5 |
60 | | * silog2( 9) = 5 |
61 | | * silog2( 10) = 5 |
62 | | */ |
63 | | uint32_t FLAC__bitmath_silog2(FLAC__int64 v) |
64 | 40.4k | { |
65 | 40.4k | if(v == 0) |
66 | 8.39k | return 0; |
67 | | |
68 | 32.0k | if(v == -1) |
69 | 0 | return 2; |
70 | | |
71 | 32.0k | v = (v < 0) ? (-(v+1)) : v; |
72 | 32.0k | return FLAC__bitmath_ilog2_wide(v)+2; |
73 | 32.0k | } |
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 | 0 | { |
105 | 0 | uint32_t ilog2; |
106 | 0 | if(v == 0) |
107 | 0 | return 0; |
108 | 0 | ilog2 = FLAC__bitmath_ilog2(v); |
109 | 0 | if(((v >> ilog2) << ilog2) == v) |
110 | | /* v is power of 2 */ |
111 | 0 | return ilog2; |
112 | 0 | else |
113 | | /* v is not a power of 2, return one higher */ |
114 | 0 | return ilog2 + 1; |
115 | 0 | } |