From a3bba38b49a1d12d22f7949786a266e410aa884e Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin Date: Tue, 20 Oct 2009 07:13:35 -0400 Subject: [PATCH] This should prevent a rare divide-by-zero in the pitch gain code --- libcelt/bands.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libcelt/bands.c b/libcelt/bands.c index 231b2cd9..d414b66c 100644 --- a/libcelt/bands.c +++ b/libcelt/bands.c @@ -262,12 +262,14 @@ int compute_pitch_gain(const CELTMode *m, const celt_sig *X, const celt_sig *P, fact = QCONST16(1., 14); num = Sxy; den = EPSILON+Sxx+MULT16_32_Q15(QCONST16(.03,15),Syy); - shift = celt_ilog2(Sxy)-16; + shift = celt_zlog2(Sxy)-16; if (shift < 0) shift = 0; - g = DIV32(SHL32(SHR32(num,shift),14),SHR32(den,shift)); if (Sxy < MULT16_32_Q15(fact, MULT16_16(celt_sqrt(EPSILON+Sxx),celt_sqrt(EPSILON+Syy)))) g = 0; + else + g = DIV32(SHL32(SHR32(num,shift),14),ADD32(EPSILON,SHR32(den,shift))); + /* This MUST round down so that we don't over-estimate the gain */ *gain_id = EXTRACT16(SHR32(MULT16_16(20,(g-QCONST16(.5,14))),14)); }