#include "opus_rc.h"
+#define OPUS_RC_BITS 32
+#define OPUS_RC_SYM 8
+#define OPUS_RC_CEIL ((1 << OPUS_RC_SYM) - 1)
+#define OPUS_RC_TOP (1u << 31)
+#define OPUS_RC_BOT (OPUS_RC_TOP >> OPUS_RC_SYM)
+#define OPUS_RC_SHIFT (OPUS_RC_BITS - OPUS_RC_SYM - 1)
+
static av_always_inline void opus_rc_dec_normalize(OpusRangeCoder *rc)
{
- while (rc->range <= 1<<23) {
- rc->value = ((rc->value << 8) | (get_bits(&rc->gb, 8) ^ 0xFF)) & ((1u << 31) - 1);
- rc->range <<= 8;
- rc->total_read_bits += 8;
+ while (rc->range <= OPUS_RC_BOT) {
+ rc->value = ((rc->value << OPUS_RC_SYM) | (get_bits(&rc->gb, OPUS_RC_SYM) ^ OPUS_RC_CEIL)) & (OPUS_RC_TOP - 1);
+ rc->range <<= OPUS_RC_SYM;
+ rc->total_bits += OPUS_RC_SYM;
}
}
value = av_mod_uintp2(rc->rb.cacheval, count);
rc->rb.cacheval >>= count;
rc->rb.cachelen -= count;
- rc->total_read_bits += count;
+ rc->total_bits += count;
return value;
}
rc->range = 128;
rc->value = 127 - get_bits(&rc->gb, 7);
- rc->total_read_bits = 9;
+ rc->total_bits = 9;
opus_rc_dec_normalize(rc);
return 0;
RawBitsContext rb;
uint32_t range;
uint32_t value;
- uint32_t total_read_bits;
+ uint32_t total_bits;
} OpusRangeCoder;
/**
*/
static av_always_inline uint32_t opus_rc_tell(const OpusRangeCoder *rc)
{
- return rc->total_read_bits - av_log2(rc->range) - 1;
+ return rc->total_bits - av_log2(rc->range) - 1;
}
static av_always_inline uint32_t opus_rc_tell_frac(const OpusRangeCoder *rc)
{
uint32_t i, total_bits, rcbuffer, range;
- total_bits = rc->total_read_bits << 3;
+ total_bits = rc->total_bits << 3;
rcbuffer = av_log2(rc->range) + 1;
range = rc->range >> (rcbuffer-16);