1use crate::fixedvec::FixedVec;
2
3pub const EC_SYM_BITS: u32 = 8;
4pub const EC_CODE_BITS: u32 = 32;
5pub const EC_SYM_MAX: u32 = (1 << EC_SYM_BITS) - 1;
6pub const EC_CODE_SHIFT: u32 = EC_CODE_BITS - EC_SYM_BITS - 1;
7pub const EC_CODE_TOP: u32 = 1 << (EC_CODE_BITS - 1);
8pub const EC_CODE_BOT: u32 = EC_CODE_TOP >> EC_SYM_BITS;
9pub const EC_CODE_EXTRA: u32 = (EC_CODE_BITS - 2) % EC_SYM_BITS + 1;
10pub const BITRES: i32 = 3;
11
12pub const RANGE_BUF_MAX: usize = 2048;
17
18#[macro_export]
19macro_rules! tell_frac_inline {
20 ($rc:expr) => {{
21 static CORRECTION: [u32; 8] = [35733, 38967, 42495, 46340, 50535, 55109, 60097, 65535];
22 let nbits = $rc.nbits_total << BITRES;
23 let l = 32 - $rc.rng.leading_zeros() as i32;
24 let r = $rc.rng >> (l - 16);
25 let b = (r >> 12).wrapping_sub(8);
26
27 let correction = unsafe { *CORRECTION.get_unchecked(b as usize) };
28 let b = b + (r > correction) as u32;
29 nbits - (l << 3) - b as i32
30 }};
31}
32
33#[derive(Clone)]
34pub struct RangeCoder {
35 pub buf: FixedVec<u8, RANGE_BUF_MAX>,
36 pub storage: u32,
37 pub end_offs: u32,
38 pub end_window: u32,
39 pub nend_bits: i32,
40 pub nbits_total: i32,
41 pub offs: u32,
42 pub rng: u32,
43 pub val: u32,
44 pub ext: u32,
45 pub rem: i32,
46 pub error: i32,
47}
48
49impl RangeCoder {
50 pub fn new_encoder(size: u32) -> Self {
51 let size = (size as usize).clamp(1, RANGE_BUF_MAX);
52 let buf = FixedVec::from_value(0u8, size);
53 RangeCoder {
54 buf,
55 storage: size as u32,
56 end_offs: 0,
57 end_window: 0,
58 nend_bits: 0,
59 nbits_total: 33,
60 offs: 0,
61 rng: 1 << 31,
62 val: 0,
63 ext: 0,
64 rem: -1,
65 error: 0,
66 }
67 }
68
69 #[inline]
70 pub fn reset_for_encode(&mut self, size: u32) {
71 let size = (size as usize).clamp(1, RANGE_BUF_MAX);
72 self.buf.resize(size, 0);
73 self.storage = size as u32;
74 self.end_offs = 0;
75 self.end_window = 0;
76 self.nend_bits = 0;
77 self.nbits_total = 33;
78 self.offs = 0;
79 self.rng = 1 << 31;
80 self.val = 0;
81 self.ext = 0;
82 self.rem = -1;
83 self.error = 0;
84 }
85
86 pub fn new_decoder(data: &[u8]) -> Self {
87 let n = data.len().min(RANGE_BUF_MAX);
88 let storage = n as u32;
89 let buf = FixedVec::from_slice(&data[..n]);
90 let mut rc = RangeCoder {
91 buf,
92 storage,
93 end_offs: 0,
94 end_window: 0,
95 nend_bits: 0,
96 nbits_total: (EC_CODE_BITS + 1
97 - ((EC_CODE_BITS - EC_CODE_EXTRA) / EC_SYM_BITS) * EC_SYM_BITS)
98 as i32,
99 offs: 0,
100 rng: 1 << EC_CODE_EXTRA,
101 val: 0,
102 ext: 0,
103 rem: 0,
104 error: 0,
105 };
106
107 rc.rem = rc.read_byte() as i32;
108 rc.val = rc
109 .rng
110 .wrapping_sub(1)
111 .wrapping_sub(rc.rem as u32 >> (EC_SYM_BITS - EC_CODE_EXTRA));
112
113 rc.normalize_decoder();
114 rc
115 }
116
117 #[inline(always)]
118 fn normalize_decoder(&mut self) {
119 let mut guard = 0u32;
120 while self.rng <= EC_CODE_BOT {
121 guard += 1;
122 if guard > 100 {
123 self.error = 1;
124 self.rng = EC_CODE_BOT + 1;
125 break;
126 }
127 self.nbits_total += EC_SYM_BITS as i32;
128 self.rng <<= EC_SYM_BITS;
129
130 let sym = self.rem;
131 self.rem = self.read_byte() as i32;
132
133 let combined_sym = ((sym << EC_SYM_BITS) | self.rem) >> (EC_SYM_BITS - EC_CODE_EXTRA);
134 self.val = (self.val << EC_SYM_BITS).wrapping_add(EC_SYM_MAX & !combined_sym as u32)
135 & (EC_CODE_TOP - 1);
136 }
137 }
138
139 fn read_byte(&mut self) -> u8 {
140 if self.offs < self.storage {
141 let b = self.buf[self.offs as usize];
142 self.offs += 1;
143 b
144 } else {
145 0
146 }
147 }
148
149 #[inline(always)]
150 pub fn enc_uint(&mut self, fl: u32, ft: u32) {
151 if ft > 1 {
152 let ft_minus_1 = ft - 1;
153 let ftb = 32 - ft_minus_1.leading_zeros() as i32;
154 if ftb > 8 {
155 let s = ftb - 8;
156 let fl_low = fl & ((1u32 << s) - 1);
157 let fl = fl >> s;
158 let ft = (ft_minus_1 >> s) + 1;
159 self.encode(fl, fl.wrapping_add(1), ft);
160 self.enc_bits(fl_low, s as u32);
161 } else {
162 self.encode(fl, fl.wrapping_add(1), ft);
163 }
164 }
165 }
166
167 #[inline(always)]
168 pub fn dec_uint(&mut self, ft: u32) -> u32 {
169 if ft > 1 {
170 let ft_minus_1 = ft - 1;
171 let ftb = 32 - ft_minus_1.leading_zeros() as i32;
172 if ftb > 8 {
173 let s = ftb - 8;
174 let ft = (ft_minus_1 >> s) + 1;
175 let fs = self.decode(ft);
176 self.update(fs, fs.wrapping_add(1), ft);
177 let r = self.dec_bits(s as u32);
178 (fs << s) | r
179 } else {
180 let fs = self.decode(ft);
181 self.update(fs, fs.wrapping_add(1), ft);
182 fs
183 }
184 } else {
185 0
186 }
187 }
188
189 #[inline(always)]
190 pub fn enc_bits(&mut self, val: u32, bits: u32) {
191 if bits == 0 {
192 return;
193 }
194 let mut window = self.end_window;
195 let mut used = self.nend_bits;
196 if (used as u32) + bits > EC_CODE_BITS {
197 while used >= EC_SYM_BITS as i32 {
198 self.write_byte_at_end((window & EC_SYM_MAX) as u8);
199 window >>= EC_SYM_BITS;
200 used -= EC_SYM_BITS as i32;
201 }
202 }
203 window |= (val & ((1 << bits) - 1)) << used;
204 used += bits as i32;
205 self.end_window = window;
206 self.nend_bits = used;
207 self.nbits_total += bits as i32;
208 }
209
210 pub fn pad_to_bits(&mut self, target_bits: i32) {
211 let remaining = target_bits - self.nbits_total;
212 if remaining <= 0 {
213 return;
214 }
215 let mut remaining = remaining as u32;
216
217 let partial =
218 (EC_SYM_BITS - (self.nend_bits as u32 & (EC_SYM_BITS - 1))) & (EC_SYM_BITS - 1);
219 if partial > 0 && remaining >= partial {
220 self.enc_bits(0, partial.min(remaining));
221 remaining -= partial.min(remaining);
222 }
223
224 let full_bytes = remaining / EC_SYM_BITS;
225 if full_bytes > 0 {
226 let available = self.storage - self.offs - self.end_offs;
227 let write_count = full_bytes.min(available);
228 if write_count > 0 {
229 let start = (self.storage - self.end_offs - write_count) as usize;
230 unsafe {
231 core::ptr::write_bytes(
232 self.buf.as_mut_ptr().add(start),
233 0,
234 write_count as usize,
235 );
236 }
237 self.end_offs += write_count;
238 }
239 if write_count < full_bytes {
240 self.error = 1;
241 }
242 self.nbits_total += (full_bytes * EC_SYM_BITS) as i32;
243 remaining -= full_bytes * EC_SYM_BITS;
244 }
245
246 if remaining > 0 {
247 self.enc_bits(0, remaining);
248 }
249 }
250
251 pub fn dec_bits(&mut self, bits: u32) -> u32 {
252 if bits == 0 {
253 return 0;
254 }
255 let mut window = self.end_window;
256 let mut used = self.nend_bits;
257 if used < bits as i32 {
258 loop {
259 let byte = if self.end_offs < self.storage {
260 self.end_offs += 1;
261 self.buf[(self.storage - self.end_offs) as usize]
262 } else {
263 0
264 };
265 window |= (byte as u32) << used;
266 used += 8;
267 if used > 32 - 8 {
268 break;
269 }
270 }
271 }
272 let ret = window & ((1 << bits) - 1);
273 self.end_window = window >> bits;
274 self.nend_bits = used - bits as i32;
275 self.nbits_total += bits as i32;
276 ret
277 }
278
279 #[inline(always)]
280 pub fn tell_frac(&self) -> i32 {
281 static CORRECTION: [u32; 8] = [35733, 38967, 42495, 46340, 50535, 55109, 60097, 65535];
282 let nbits = self.nbits_total << BITRES;
283 let l = 32 - self.rng.leading_zeros() as i32;
284 let r = self.rng >> (l - 16);
285 let b = (r >> 12).wrapping_sub(8);
286 let b = b + (r > CORRECTION[b as usize]) as u32;
287 nbits - (l << 3) - b as i32
288 }
289
290 #[inline(always)]
292 pub fn tell(&self) -> i32 {
293 self.nbits_total - (32 - self.rng.leading_zeros() as i32)
294 }
295
296 #[inline(always)]
297 pub fn tell_fast(&self) -> i32 {
298 self.nbits_total
299 }
300
301 pub fn shrink(&mut self, new_size: u32) {
304 debug_assert!(self.offs + self.end_offs <= new_size);
305 if self.end_offs > 0 {
306 let old_end_start = (self.storage - self.end_offs) as usize;
307 let old_end_end = self.storage as usize;
308 let new_end_start = (new_size - self.end_offs) as usize;
309 self.buf
310 .copy_within(old_end_start..old_end_end, new_end_start);
311 }
312 self.storage = new_size;
313 }
314
315 #[inline(always)]
316 fn write_byte(&mut self, value: u8) {
317 if self.offs + self.end_offs < self.storage {
318 unsafe {
319 *self.buf.get_unchecked_mut(self.offs as usize) = value;
320 }
321 self.offs += 1;
322 } else {
323 self.error = 1;
324 }
325 }
326
327 #[inline(always)]
328 fn carry_out(&mut self, c: i32) {
329 if c != EC_SYM_MAX as i32 {
330 let carry = c >> EC_SYM_BITS;
331 if self.rem >= 0 {
332 self.write_byte((self.rem + carry) as u8);
333 }
334 if self.ext > 0 {
335 let sym = (EC_SYM_MAX as i32 + carry) & EC_SYM_MAX as i32;
336
337 let ext = self.ext as usize;
338 for _j in 0..ext {
339 self.write_byte(sym as u8);
340 }
341 self.ext = 0;
342 }
343 self.rem = c & EC_SYM_MAX as i32;
344 } else {
345 self.ext += 1;
346 }
347 }
348
349 #[inline(always)]
350 fn celt_udiv(n: u32, d: u32) -> u32 {
351 assert!(d > 0, "celt_udiv: division by zero");
355 n / d
356 }
357
358 #[inline(always)]
359 pub fn encode(&mut self, fl: u32, fh: u32, ft: u32) {
360 assert!(ft > 0, "encode: ft must be > 0");
363 let r = Self::celt_udiv(self.rng, ft);
364 if fl > 0 {
365 self.val = self
366 .val
367 .wrapping_add(self.rng.wrapping_sub(r.wrapping_mul(ft.wrapping_sub(fl))));
368 self.rng = r.wrapping_mul(fh.wrapping_sub(fl));
369 } else {
370 self.rng = self.rng.wrapping_sub(r.wrapping_mul(ft.wrapping_sub(fh)));
371 }
372 self.normalize_encoder();
373 }
374
375 #[inline(always)]
376 fn normalize_encoder(&mut self) {
377 while self.rng <= EC_CODE_BOT {
378 let c = (self.val >> EC_CODE_SHIFT) as i32;
379 if c != EC_SYM_MAX as i32 {
380 let carry = c >> EC_SYM_BITS;
381 if self.rem >= 0 {
382 if self.offs + self.end_offs < self.storage {
383 unsafe {
384 *self.buf.get_unchecked_mut(self.offs as usize) =
385 (self.rem + carry) as u8;
386 }
387 self.offs += 1;
388 } else {
389 self.error = 1;
390 }
391 }
392 if self.ext > 0 {
393 let sym = (EC_SYM_MAX as i32 + carry) & EC_SYM_MAX as i32;
394 let ext = self.ext as usize;
395 for _j in 0..ext {
396 if self.offs + self.end_offs < self.storage {
397 unsafe {
398 *self.buf.get_unchecked_mut(self.offs as usize) = sym as u8;
399 }
400 self.offs += 1;
401 } else {
402 self.error = 1;
403 }
404 }
405 self.ext = 0;
406 }
407 self.rem = c & EC_SYM_MAX as i32;
408 } else {
409 self.ext += 1;
410 }
411 self.val = (self.val << EC_SYM_BITS) & (EC_CODE_TOP - 1);
412 self.rng <<= EC_SYM_BITS;
413 self.nbits_total = self.nbits_total.wrapping_add(EC_SYM_BITS as i32);
414 }
415 }
416
417 #[inline(always)]
418 pub fn encode_bit_logp(&mut self, val: bool, logp: u32) {
419 let s = self.rng >> logp;
420 let r = self.rng.wrapping_sub(s);
421 if val {
422 self.val = self.val.wrapping_add(r);
423 self.rng = s;
424 } else {
425 self.rng = r;
426 }
427 self.normalize_encoder();
428 }
429
430 #[inline(always)]
431 pub fn encode_icdf(&mut self, s: i32, icdf: &[u8], ftb: u32) {
432 let r = self.rng >> ftb;
433 if s > 0 {
434 let val = unsafe { *icdf.get_unchecked((s - 1) as usize) as u32 };
435 self.val = self
436 .val
437 .wrapping_add(self.rng.wrapping_sub(r.wrapping_mul(val)));
438 let lower = unsafe { *icdf.get_unchecked(s as usize) };
439 self.rng = r.wrapping_mul(val.wrapping_sub(lower as u32));
440 } else {
441 let val = unsafe { *icdf.get_unchecked(s as usize) as u32 };
442 self.rng = self.rng.wrapping_sub(r.wrapping_mul(val));
443 }
444 self.normalize_encoder();
445 }
446
447 #[inline(always)]
448 pub fn decode_bit_logp(&mut self, logp: u32) -> bool {
449 let s = self.rng >> logp;
450 let ret = self.val < s;
451 if !ret {
452 self.val = self.val.wrapping_sub(s);
453 self.rng = self.rng.wrapping_sub(s);
454 } else {
455 self.rng = s;
456 }
457 self.normalize_decoder();
458 ret
459 }
460
461 #[inline(always)]
462 pub fn decode_icdf(&mut self, icdf: &[u8], ftb: u32) -> i32 {
463 let mut s = self.rng;
464 let d = self.val;
465 let r = s >> ftb;
466 let mut ret = 0;
467 let mut t;
468
469 loop {
470 t = s;
471 s = r.wrapping_mul(icdf[ret] as u32);
472 ret += 1;
473 if d >= s {
474 break;
475 }
476 }
477
478 self.val = d.wrapping_sub(s);
479 self.rng = t.wrapping_sub(s);
480 self.normalize_decoder();
481 (ret - 1) as i32
482 }
483
484 #[inline(always)]
485 pub fn decode(&mut self, ft: u32) -> u32 {
486 assert!(ft > 0, "decode: ft must be > 0");
487 let r = Self::celt_udiv(self.rng, ft);
488 self.ext = r;
489 let s = self.val / r;
490 ft - ft.min(s.wrapping_add(1))
491 }
492
493 #[inline(always)]
494 pub fn update(&mut self, fl: u32, fh: u32, ft: u32) {
495 let s = self.ext.wrapping_mul(ft.wrapping_sub(fh));
496 self.val = self.val.wrapping_sub(s);
497 self.rng = if fl > 0 {
498 self.ext.wrapping_mul(fh.wrapping_sub(fl))
499 } else {
500 self.rng.wrapping_sub(s)
501 };
502 self.normalize_decoder();
503 }
504
505 pub fn laplace_encode(&mut self, value: &mut i32, fs: u32, decay: i32) {
506 let mut val = *value;
507 let mut fl = 0;
508 let mut fs_val = fs;
509
510 if val != 0 {
511 let s = if val < 0 { -1 } else { 0 };
512 val = (val + s) ^ s;
513 fl = fs_val;
514 fs_val = self.laplace_get_freq1(fs_val, decay);
515
516 let mut i = 1;
517 while fs_val > 0 && i < val {
518 fs_val *= 2;
519 fl += fs_val + 2;
520 fs_val = ((fs_val as i32 * decay) >> 15) as u32;
521 i += 1;
522 }
523
524 if fs_val == 0 {
525 let ndi_max = 32768 - fl + 1 - 1;
526 let ndi_max = (ndi_max as i32 - s) >> 1;
527 let di = (val - i).min(ndi_max - 1);
528 fl += (2 * di + 1 + s) as u32;
529 fs_val = 1u32.min(32768 - fl);
530 *value = (i + di + s) ^ s;
531 } else {
532 fs_val += 1;
533 fl += fs_val & (!s as u32);
534 }
535 }
536 self.encode(fl, fl.wrapping_add(fs_val), 1 << 15);
537 }
538
539 fn laplace_get_freq1(&self, fs0: u32, decay: i32) -> u32 {
540 let ft = 32768 - (2 * 16) - fs0;
541 ((ft as i32 * (16384 - decay)) >> 15) as u32
542 }
543
544 pub fn laplace_decode(&mut self, fs: u32, decay: i32) -> i32 {
545 let fm = self.decode(1 << 15);
546 let mut fl = 0;
547 let mut fs_val = fs;
548 let mut val = 0;
549
550 if fm >= fs_val {
551 val += 1;
552 fl = fs_val;
553 fs_val = self.laplace_get_freq1(fs_val, decay) + 1;
554
555 while fs_val > 1 && fm >= fl + 2 * fs_val {
556 fs_val *= 2;
557 fl += fs_val;
558 fs_val = (((fs_val as i32 - 2) * decay) >> 15) as u32 + 1;
559 val += 1;
560 }
561
562 if fs_val <= 1 {
563 let di = (fm - fl) >> 1;
564 val += di as i32;
565 fl += 2 * di;
566 }
567
568 if fm < fl + fs_val {
569 val = -val;
570 } else {
571 fl += fs_val;
572 }
573 }
574
575 self.update(fl, fl.wrapping_add(fs_val.min(32768 - fl)), 1 << 15);
576 val
577 }
578
579 #[inline(always)]
580 fn write_byte_at_end(&mut self, value: u8) {
581 if self.offs + self.end_offs < self.storage {
582 self.end_offs += 1;
583 let idx = (self.storage - self.end_offs) as usize;
584 unsafe {
585 *self.buf.get_unchecked_mut(idx) = value;
586 }
587 } else {
588 self.error = 1;
589 }
590 }
591
592 pub fn patch_initial_bits(&mut self, val: u32, nbits: u32) {
593 let shift = EC_SYM_BITS - nbits;
594 let mask = ((1u32 << nbits) - 1) << shift;
595 if self.offs > 0 {
596 self.buf[0] = ((self.buf[0] as u32 & !mask) | (val << shift)) as u8;
597 } else if self.rem >= 0 {
598 self.rem = ((self.rem as u32 & !mask) | (val << shift)) as i32;
599 } else if self.rng <= (EC_CODE_TOP >> nbits) {
600 let mask_shifted = mask << EC_CODE_SHIFT;
601 self.val = (self.val & !mask_shifted) | (val << (EC_CODE_SHIFT + shift));
602 } else {
603 self.error = -1;
604 }
605 }
606
607 pub fn done(&mut self) {
608 let ilog = 32 - self.rng.leading_zeros();
609 let mut l = (EC_CODE_BITS - ilog) as i32;
610 let mut msk = (EC_CODE_TOP - 1) >> l;
611 let mut end = (self.val.wrapping_add(msk)) & !msk;
612
613 if (end | msk) >= self.val.wrapping_add(self.rng) {
614 l += 1;
615 msk >>= 1;
616 end = (self.val.wrapping_add(msk)) & !msk;
617 }
618
619 while l > 0 {
620 self.carry_out((end >> EC_CODE_SHIFT) as i32);
621 end = (end << EC_SYM_BITS) & (EC_CODE_TOP - 1);
622 l -= EC_SYM_BITS as i32;
623 }
624
625 if self.rem >= 0 || self.ext > 0 {
626 self.carry_out(0);
627 }
628
629 let mut window = self.end_window;
630 let mut used = self.nend_bits;
631 while used >= EC_SYM_BITS as i32 {
632 self.write_byte_at_end((window & EC_SYM_MAX) as u8);
633 window >>= EC_SYM_BITS;
634 used -= EC_SYM_BITS as i32;
635 }
636
637 if self.error == 0 {
638 for i in self.offs..(self.storage - self.end_offs) {
639 self.buf[i as usize] = 0;
640 }
641
642 if used > 0 {
643 if self.end_offs >= self.storage {
644 self.error = -1;
645 } else {
646 if self.offs + self.end_offs >= self.storage && -l < used {
649 window &= (1u32 << (-l as u32)) - 1;
650 self.error = -1;
651 }
652 let idx = (self.storage - self.end_offs - 1) as usize;
653 self.buf[idx] |= window as u8;
654 }
655 }
656 }
657 }
658
659 #[cfg(feature = "std")]
664 pub fn finish(&mut self) -> Vec<u8> {
665 self.done();
666
667 let extra_end = if self.nend_bits > 0 && self.end_offs == 0 {
668 1
669 } else {
670 0
671 };
672 let mut result = Vec::with_capacity((self.offs + self.end_offs + extra_end) as usize);
673 result.extend_from_slice(&self.buf[0..self.offs as usize]);
674 if extra_end > 0 {
675 result.push(self.buf[(self.storage - 1) as usize]);
676 }
677 result.extend_from_slice(
678 &self.buf[(self.storage - self.end_offs) as usize..self.storage as usize],
679 );
680 result
681 }
682}
683
684#[cfg(all(test, feature = "std"))]
685mod tests {
686 use super::*;
687
688 #[test]
689 fn test_laplace() {
690 let mut enc = RangeCoder::new_encoder(100);
691 let mut val = -3;
692 let fs = 100 << 7;
693 let decay = 120 << 6;
694 enc.laplace_encode(&mut val, fs, decay);
695 enc.done();
696
697 assert_eq!(enc.offs, 1);
698 assert_eq!(enc.buf[0], 224);
699
700 let mut dec = RangeCoder::new_decoder(&enc.buf[..enc.offs as usize]);
701 let decoded_val = dec.laplace_decode(fs, decay);
702 assert_eq!(decoded_val, -3);
703 }
704
705 #[test]
706 fn test_icdf_consistency() {
707 let mut enc = RangeCoder::new_encoder(1024);
708 let icdf = [2, 1, 0];
709 enc.encode_icdf(0, &icdf, 2);
710 enc.encode_icdf(1, &icdf, 2);
711 enc.encode_icdf(2, &icdf, 2);
712 enc.done();
713 let data = enc.buf[..enc.offs as usize].to_vec();
714
715 let mut dec = RangeCoder::new_decoder(&data);
716 let s0 = dec.decode_icdf(&icdf, 2);
717 let s1 = dec.decode_icdf(&icdf, 2);
718 let s2 = dec.decode_icdf(&icdf, 2);
719
720 assert_eq!(s0, 0);
721 assert_eq!(s1, 1);
722 assert_eq!(s2, 2);
723 }
724
725 #[test]
726 fn test_icdf_last_symbol_no_oob() {
727 let icdf: &[u8] = &[170, 85, 0];
728 let ftb = 8u32;
729
730 for sym in 0..3i32 {
731 let mut enc = RangeCoder::new_encoder(256);
732 enc.encode_icdf(sym, icdf, ftb);
733 enc.done();
734 let data = enc.buf[..enc.offs as usize].to_vec();
735
736 let mut dec = RangeCoder::new_decoder(&data);
737 let decoded = dec.decode_icdf(icdf, ftb);
738 assert_eq!(decoded, sym, "往返失败: 编码 symbol={sym} 解码得 {decoded}");
739 }
740 }
741
742 #[test]
743 fn test_icdf_decode_terminates() {
744 let icdf: &[u8] = &[192, 128, 64, 0];
745 let ftb = 8u32;
746
747 let symbols = [0i32, 1, 2, 3];
748 let mut enc = RangeCoder::new_encoder(256);
749 for &s in &symbols {
750 enc.encode_icdf(s, icdf, ftb);
751 }
752 enc.done();
753 let data = enc.buf[..enc.offs as usize].to_vec();
754
755 let mut dec = RangeCoder::new_decoder(&data);
756 for &expected in &symbols {
757 let got = dec.decode_icdf(icdf, ftb);
758 assert_eq!(got, expected, "解码器输出 {got},期望 {expected}");
759 }
760 }
761
762 #[test]
763 fn test_bits_only() {
764 let mut enc = RangeCoder::new_encoder(1024);
765
766 enc.enc_bits(1, 1);
767 enc.enc_bits(5, 3);
768 enc.enc_bits(7, 3);
769 enc.enc_bits(0, 2);
770
771 let data = enc.finish();
772 let mut dec = RangeCoder::new_decoder(&data);
773
774 let b1 = dec.dec_bits(1);
775 let b2 = dec.dec_bits(3);
776 let b3 = dec.dec_bits(3);
777 let b4 = dec.dec_bits(2);
778
779 assert_eq!(b1, 1);
780 assert_eq!(b2, 5);
781 assert_eq!(b3, 7);
782 assert_eq!(b4, 0);
783 }
784
785 #[test]
786 fn test_interleaved_bits_entropy() {
787 let mut enc = RangeCoder::new_encoder(1024);
788
789 enc.enc_bits(1, 1);
790
791 enc.encode(10, 20, 100);
792
793 enc.enc_bits(5, 3);
794
795 enc.encode(50, 60, 100);
796
797 let data = enc.finish();
798
799 let mut dec = RangeCoder::new_decoder(&data);
800
801 let b1 = dec.dec_bits(1);
802 let d1 = dec.decode(100);
803 dec.update(10, 20, 100);
804 let b2 = dec.dec_bits(3);
805 let d2 = dec.decode(100);
806 dec.update(50, 60, 100);
807
808 assert_eq!(b1, 1);
809 assert!((10..20).contains(&d1), "d1={} expected in [10, 20)", d1);
810 assert_eq!(b2, 5);
811 assert!((50..60).contains(&d2), "d2={} expected in [50, 60)", d2);
812 }
813}