Skip to content

Commit 1ab3c8e

Browse files
authored
Improve calculation of when to use wide residual computation (#700)
1 parent 0453280 commit 1ab3c8e

File tree

3 files changed

+45
-4
lines changed

3 files changed

+45
-4
lines changed

src/libFLAC/bitmath.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
}

src/libFLAC/include/private/bitmath.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,5 +206,6 @@ static inline uint32_t FLAC__bitmath_ilog2_wide(FLAC__uint64 v)
206206
}
207207

208208
uint32_t FLAC__bitmath_silog2(FLAC__int64 v);
209+
uint32_t FLAC__bitmath_extra_mulbits_unsigned(FLAC__uint32 v);
209210

210211
#endif

src/libFLAC/lpc.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -945,13 +945,11 @@ uint32_t FLAC__lpc_max_prediction_before_shift_bps(uint32_t subframe_bps, const
945945
* but that treats both the samples as well as the predictor as unknown. The
946946
* predictor is known however, so taking the log2 of the sum of the absolute values
947947
* of all coefficients is a more accurate representation of the predictor */
948-
FLAC__int32 abs_sum_of_qlp_coeff = 0;
948+
FLAC__uint32 abs_sum_of_qlp_coeff = 0;
949949
uint32_t i;
950950
for(i = 0; i < order; i++)
951951
abs_sum_of_qlp_coeff += abs(qlp_coeff[i]);
952-
if(abs_sum_of_qlp_coeff == 0)
953-
abs_sum_of_qlp_coeff = 1;
954-
return subframe_bps + FLAC__bitmath_silog2(abs_sum_of_qlp_coeff);
952+
return subframe_bps + FLAC__bitmath_extra_mulbits_unsigned(abs_sum_of_qlp_coeff);
955953
}
956954

957955

0 commit comments

Comments
 (0)