diff --git a/celt/bands.c b/celt/bands.c index 75f40787820f7fe21a5555ed71965280c9c18d0e..0acb25c4d2e419f6903f809b5eabf17fbda46ef5 100644 --- a/celt/bands.c +++ b/celt/bands.c @@ -630,7 +630,8 @@ static int compute_qn(int N, int b, int offset, int pulse_cap, int stereo) /* The upper limit ensures that in a stereo split with itheta==16384, we'll always have enough bits left over to code at least one pulse in the side; otherwise it would collapse, since it doesn't get folded. */ - qb = IMIN(b-pulse_cap-(4<<BITRES), (b+N2*offset)/N2); + qb = celt_sudiv(b+N2*offset, N2); + qb = IMIN(b-pulse_cap-(4<<BITRES), qb); qb = IMIN(8<<BITRES, qb); @@ -1434,7 +1435,7 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, ctx.remaining_bits = remaining_bits; if (i <= codedBands-1) { - curr_balance = balance / IMIN(3, codedBands-i); + curr_balance = celt_sudiv(balance, IMIN(3, codedBands-i)); b = IMAX(0, IMIN(16383, IMIN(remaining_bits+1,pulses[i]+curr_balance))); } else { b = 0; diff --git a/celt/entcode.h b/celt/entcode.h index 66f281dec80f14103d5309761f192bdbc32fa7d5..13d6c84ef0fa39205166d3e776134b9bc23275c5 100644 --- a/celt/entcode.h +++ b/celt/entcode.h @@ -137,4 +137,16 @@ static OPUS_INLINE opus_uint32 celt_udiv(opus_uint32 n, opus_uint32 d) { #endif } +static OPUS_INLINE opus_int32 celt_sudiv(opus_int32 n, opus_int32 d) { + celt_assert(d>0); +#ifdef USE_SMALL_DIV_TABLE + if (n<0) + return -(opus_int32)celt_udiv(-n, d); + else + return celt_udiv(n, d); +#else + return n/d; +#endif +} + #endif