// range_dec.mbt
//
// RFC 6716 §4.1 范围解码器。这是 SILK 与 CELT 两层共用的熵解码底座。
//
// 实现严格对应规范文字:初始化(§4.1.1)、符号解码与更新(§4.1.2)、
// 重归一化(§4.1.2.1)、三类快路径(§4.1.3)、raw bits(§4.1.4)、
// 均匀整数(§4.1.5)、位用量(§4.1.6)。
//
// 状态量 val/rng 是 32 位无符号量(rng 可达 2**31),故用 Int64 承载,
// 并在规范要求掩码处显式掩码(§4.1.2.1 的 & 0x7FFFFFFF),避免依赖语言
// 的溢出行为。除法均为正数整除,与规范的 integer division 一致。
//
// 独立的 Python 参考端见 tools/gen_range_goldens.py,它产出的逐轨迹金标
// 用于比对本实现;端到端正确性另由真实 libopus 比特流的 PCM 差分兜底。

///|
/// 范围解码器状态。创建后即可连续解码,所有 mut 字段透过 self 引用更新。
pub struct RangeDecoder {
  data : Bytes
  nbytes : Int
  mut offs : Int
  mut leftover : Int
  mut val : Int64
  mut rng : Int64
  mut raw_read : Int
  mut skipped : Int
}

///|
/// 创建解码器并完成初始化与首轮重归一化(RFC §4.1.1)。
///
/// rng 置 128、val 置 127-(b0>>1),首字节的最低位存为 leftover 供后续
/// 重归一化拼接;无输入时按 0 处理。
pub fn RangeDecoder::new(data : Bytes) -> RangeDecoder {
  let nbytes = data.length()
  let b0 = if nbytes > 0 { data.unsafe_get(0).to_int() } else { 0 }
  let decoder = RangeDecoder::{
    data,
    nbytes,
    offs: 1,
    leftover: b0 & 1,
    val: (127 - (b0 >> 1)).to_int64(),
    rng: 128L,
    raw_read: 0,
    skipped: 0,
  }
  decoder.normalize()
  decoder
}

///|
/// 读取下一字节;超出输入末尾补 0(§4.1.2.1)。
fn RangeDecoder::next_byte(self : RangeDecoder) -> Int {
  let b = if self.offs < self.nbytes {
    self.data.unsafe_get(self.offs).to_int()
  } else {
    0
  }
  self.offs += 1
  b
}

///|
/// 重归一化:反复左移 rng 并读字节,直到 rng > 2**23(§4.1.2.1)。
///
/// sym 由上一字节存留位作最高位、本字节高 7 位拼成;本字节最低位存回
/// leftover。val 只在此处按规范掩码到 31 位。
fn RangeDecoder::normalize(self : RangeDecoder) -> Unit {
  while self.rng <= 8388608L { // 2**23
    self.rng = self.rng << 8
    let nb = self.next_byte()
    let sym = ((self.leftover << 7) | (nb >> 1)) & 0xFF
    self.leftover = nb & 1
    self.val = ((self.val << 8) + (255 - sym).to_int64()) & 0x7FFFFFFFL
  }
}

///|
/// ec_decode():算出落在目标符号区间内的 16 位值 fs(§4.1.2)。
fn RangeDecoder::decode(self : RangeDecoder, ft : Int) -> Int {
  let d = self.rng / ft.to_int64()
  if d == 0L {
    return ft
  }
  let t = (self.val / d + 1L).to_int()
  ft - (if t < ft { t } else { ft })
}

///|
/// ec_dec_update():按 (fl, fh, ft) 推进状态并重归一化(§4.1.2)。
fn RangeDecoder::update(
  self : RangeDecoder,
  fl : Int,
  fh : Int,
  ft : Int,
) -> Unit {
  let s = self.rng / ft.to_int64()
  if fl > 0 {
    self.val = self.val - s * (ft - fh).to_int64()
    self.rng = s * (fh - fl).to_int64()
  } else {
    self.rng = self.rng - s * (ft - fh).to_int64()
  }
  self.normalize()
}

///|
/// 解一个由频率数组描述的上下文,返回解出的符号 k(§4.1.2)。
///
/// `freqs[i]` 是符号 i 的频率,其和即 ft;fl/fh 由累计和推出,符号由
/// 比特流决定而非由调用方指定。fs 不落在任何符号区间时属实现错误。
pub fn RangeDecoder::decode_ctx(self : RangeDecoder, freqs : Array[Int]) -> Int {
  let mut ft = 0
  for f in freqs {
    ft += f
  }
  let fs = self.decode(ft)
  let mut fl = 0
  for i in 0.. Int {
  let ft = 1 << logp
  let fs = self.decode(ft)
  if fs < ft - 1 {
    self.update(0, ft - 1, ft)
    0
  } else {
    self.update(ft - 1, ft, ft)
    1
  }
}

///|
/// ec_decode_bin():返回 `fs = ec_decode(1< Int {
  self.decode(1 << ftb)
}

///|
/// ec_dec_icdf():用逆累积分布表解符号(§4.1.3.3)。
///
/// `icdf[k] = (1< Int {
  let ft = 1 << ftb
  let fs = self.decode(ft)
  let mut k = 0
  while k < icdf.length() - 1 && fs >= ft - icdf[k] {
    k += 1
  }
  let fl = if k == 0 { 0 } else { ft - icdf[k - 1] }
  let fh = ft - icdf[k]
  self.update(fl, fh, ft)
  k
}

///|
/// ec_dec_uint():解 0..ft-1 的均匀整数(§4.1.5)。适用于 ft ≤ 2**31-1。
///
/// ftb<=8 时直接解一个符号;否则高 8 位走范围码、余位走 raw bits。
/// 结果可能超出 0..ft-1,此时按 §4.1.5 视为帧损坏(取模退回)。
pub fn RangeDecoder::decode_uint(self : RangeDecoder, ft : Int) -> Int {
  self.decode_uint64(ft.to_int64()).to_int()
}

///|
/// ec_dec_uint() 的 64 位版本:ft 可达 2**32。
///
/// 为什么需要——PVQ 的码本按 32 bits 设计(RFC §4.3.4.4:codebook 上限
/// 32 bits;cwrs.c 注释:K=128 或 whichever fits in 32 bits),而 V(N,K)
/// 对 (96,5) 这类组合就已越过 Int32 上限。Int 版本据此转发,保证只有一份
/// 实现。
///
/// 中间量 top_ft 与高 8 位的 hi 都不超过 257,可直接复用现有解码路径;
/// 只有末尾拼接 raw bits 那一步需要 64 位。
pub fn RangeDecoder::decode_uint64(self : RangeDecoder, ft : Int64) -> Int64 {
  let mut ftb = 0
  let mut m = ft - 1L
  while m > 0L {
    ftb += 1
    m = m >> 1
  }
  if ftb <= 8 {
    let k = self.decode(ft.to_int())
    self.update(k, k + 1, ft.to_int())
    k.to_int64()
  } else {
    let top_ft = ((ft - 1L) >> (ftb - 8)) + 1L
    let hi = self.decode(top_ft.to_int())
    self.update(hi, hi + 1, top_ft.to_int())
    let lo = self.dec_bits(ftb - 8)
    // 先转 64 位再移位:ftb 达 32 时 hi<<24 可到 4.3e9,超出 Int32
    ((hi.to_int64() << (ftb - 8)) | lo.to_int64()) % ft
  }
}

///|
/// ec_dec_bits():raw bits 从帧尾反向打包,LSB 起(§4.1.4)。
///
/// 与范围解码器的前向读取相互独立,允许重叠消费同一段数据。
pub fn RangeDecoder::dec_bits(self : RangeDecoder, nbits : Int) -> Int {
  let mut v = 0
  for i in 0..> bit_index) & 1
    }
    v = v | (bit << i)
    self.raw_read += 1
  }
  v
}

///|
/// 已消费的总位数 nbits_total(§4.1.6):整字节 + 1 位保留 + raw bits,
/// 再加静音帧一次性跳过的位数。
///
/// 初始化完成后为 33(= 8*4 + 1),与规范给的初值一致。
fn RangeDecoder::nbits_total(self : RangeDecoder) -> Int {
  8 * self.offs + 1 + self.raw_read + self.skipped
}

///|
/// 把位计数一次性推进到 `nbits`,**不消费任何比特**。
///
/// 对应静音帧的处理:参考实现令 nbits_total += nbits - ec_tell(),使
/// ec_tell() 之后返回帧长,于是帧首后续几个符号的门控(tell+16 之类)全部
/// 落空、一个都不读。位置状态(rng/val/字节游标)保持不变。
pub fn RangeDecoder::skip_bits_to(self : RangeDecoder, nbits : Int) -> Unit {
  let cur = self.nbits_total()
  if nbits > cur {
    self.skipped += nbits - cur
  }
}

///|
/// rng 的最高位位置,即 §1.1 的 ilog(rng) = floor(log2(rng)) + 1。
fn RangeDecoder::ilog_rng(self : RangeDecoder) -> Int {
  let mut x = self.rng
  let mut n = 0
  while x > 0L {
    x = x >> 1
    n += 1
  }
  n
}

///|
/// ec_tell():已用位数的保守上界(§4.1.6.1)。初始化后为 1。
pub fn RangeDecoder::tell(self : RangeDecoder) -> Int {
  self.nbits_total() - self.ilog_rng()
}

///|
/// ec_tell_frac():1/8 位精度的已用位数(§4.1.6.2)。
///
/// 比特分配例程要求它与编码端 bit-exact 一致;满足
/// `ec_tell() == ceil(ec_tell_frac() / 8)`。
pub fn RangeDecoder::tell_frac(self : RangeDecoder) -> Int {
  let nbits_total = self.nbits_total()
  let mut lg = self.ilog_rng()
  let mut r = self.rng >> (lg - 16)
  for _ in 0..<3 {
    r = (r * r) >> 15
    lg = 2 * lg + (r >> 16).to_int()
    if ((r >> 16) & 1L) != 0L {
      r = r >> 1
    }
  }
  nbits_total * 8 - lg
}