Coverage Report

Created: 2025-07-11 06:51

/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
}