1#![allow(missing_docs)]
14
15use alloc::vec::Vec;
16
17use msrtc_rans_core::sink::VecSink;
18use msrtc_rans_core::source::SliceSource;
19use msrtc_rans_core::source::Source;
20use msrtc_rans_core::variant::{Rans64, RansByte, RansParams};
21use msrtc_rans_core::{
22 Freq, Rans64DecSymbol, Rans64EncSymbol, Rans64Encoder, RansByteDecSymbol, RansByteEncSymbol,
23 RansByteEncoder, RawRansError,
24};
25
26const FREQ_BITS: u32 = (core::mem::size_of::<Freq>() * 8) as u32;
32
33#[derive(Debug, Clone, PartialEq, Eq)]
39pub enum EntropyError {
40 InvalidPmf,
42 InvalidParams,
44 InvalidState,
46 InvalidStream,
48 RawRansError(RawRansError),
50}
51
52impl core::fmt::Display for EntropyError {
53 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
54 match self {
55 EntropyError::InvalidPmf => write!(f, "invalid PMF data"),
56 EntropyError::InvalidParams => write!(f, "invalid parameter value"),
57 EntropyError::InvalidState => write!(f, "invalid state (not initialized)"),
58 EntropyError::InvalidStream => write!(f, "invalid stream"),
59 EntropyError::RawRansError(e) => write!(f, "raw rANS error: {}", e),
60 }
61 }
62}
63
64#[cfg(feature = "std")]
65impl std::error::Error for EntropyError {}
66
67#[derive(Debug, Clone)]
73struct DistributionDesc {
74 value_offset: i32,
76 bypass_sentinel: i32,
78 symbol_offset: usize,
80}
81
82fn initialize_distribution_desc(
87 distribution_descs: &mut Vec<DistributionDesc>,
88 pmf_lengths: &[i32],
89 pmf_offsets: &[i32],
90 pmf_table_size: usize,
91) -> Result<(), EntropyError> {
92 let distribution_count = pmf_lengths.len();
93 if pmf_offsets.len() != distribution_count {
94 return Err(EntropyError::InvalidPmf);
95 }
96 distribution_descs.reserve(distribution_count);
97
98 let mut symbol_cursor: usize = 0;
99 for i in 0..distribution_count {
100 let length = pmf_lengths[i];
101 if length <= 1 || pmf_table_size - symbol_cursor < length as usize {
103 return Err(EntropyError::InvalidPmf);
104 }
105 distribution_descs.push(DistributionDesc {
106 value_offset: pmf_offsets[i],
107 bypass_sentinel: length - 1,
108 symbol_offset: symbol_cursor,
109 });
110 symbol_cursor += length as usize;
111 }
112
113 if symbol_cursor != pmf_table_size {
114 return Err(EntropyError::InvalidPmf);
115 }
116 Ok(())
117}
118
119#[inline]
124fn check_bits(prob_bits: u32, max_scale_bits: u32) -> Result<(), EntropyError> {
125 if prob_bits < 2 || prob_bits > max_scale_bits {
126 return Err(EntropyError::InvalidParams);
127 }
128 Ok(())
129}
130
131#[inline]
136fn bytes_to_u32_units(data: &[u8]) -> Vec<u32> {
137 data.chunks_exact(4)
138 .map(|c| u32::from_le_bytes([c[0], c[1], c[2], c[3]]))
139 .collect()
140}
141
142pub(crate) trait RawEncoder {
148 type Unit: Copy + Default;
149 type Symbol;
150 fn put_raw(&mut self, start: Freq, freq: Freq, scale_bits: Freq);
151 fn put_symbol(&mut self, symbol: &Self::Symbol);
152 fn flush(&mut self);
153 fn into_units(self) -> Vec<Self::Unit>;
154}
155
156impl RawEncoder for RansByteEncoder<VecSink<u8>> {
157 type Unit = u8;
158 type Symbol = RansByteEncSymbol;
159
160 fn put_raw(&mut self, start: Freq, freq: Freq, scale_bits: Freq) {
161 self.put_raw(start, freq, scale_bits);
162 }
163
164 fn put_symbol(&mut self, symbol: &Self::Symbol) {
165 self.put(symbol);
166 }
167
168 fn flush(&mut self) {
169 self.flush();
170 }
171
172 fn into_units(self) -> Vec<u8> {
173 self.into_sink().encoded().to_vec()
174 }
175}
176
177impl RawEncoder for Rans64Encoder<VecSink<u32>> {
178 type Unit = u32;
179 type Symbol = Rans64EncSymbol;
180
181 fn put_raw(&mut self, start: Freq, freq: Freq, scale_bits: Freq) {
182 self.put_raw(start, freq, scale_bits);
183 }
184
185 fn put_symbol(&mut self, symbol: &Self::Symbol) {
186 self.put(symbol);
187 }
188
189 fn flush(&mut self) {
190 self.flush();
191 }
192
193 fn into_units(self) -> Vec<u32> {
194 self.into_sink().encoded().to_vec()
195 }
196}
197
198struct EncoderState<S: EncSymbol> {
203 symbol_bits: Freq,
204 distribution_descs: Vec<DistributionDesc>,
205 symbols: Vec<S>,
206 bypass_bits: Freq,
207 bypass_max_value: Freq,
208}
209
210pub(crate) trait EncSymbol: Sized {
212 fn try_new(start: Freq, freq: Freq, scale_bits: Freq) -> Result<Self, RawRansError>;
213}
214
215impl EncSymbol for RansByteEncSymbol {
216 fn try_new(start: Freq, freq: Freq, scale_bits: Freq) -> Result<Self, RawRansError> {
217 Self::try_new(start, freq, scale_bits)
218 }
219}
220
221impl EncSymbol for Rans64EncSymbol {
222 fn try_new(start: Freq, freq: Freq, scale_bits: Freq) -> Result<Self, RawRansError> {
223 Self::try_new(start, freq, scale_bits)
224 }
225}
226
227impl<S: EncSymbol> EncoderState<S> {
228 fn uninitialized() -> Self {
229 Self {
230 symbol_bits: 0,
231 distribution_descs: Vec::new(),
232 symbols: Vec::new(),
233 bypass_bits: 0,
234 bypass_max_value: 0,
235 }
236 }
237
238 fn initialize(
239 &mut self,
240 pmf_lengths: &[i32],
241 pmf_offsets: &[i32],
242 pmf_table: &[i32],
243 symbol_bits: i32,
244 bypass_bits: i32,
245 max_scale_bits: u32,
246 ) -> Result<(), EntropyError> {
247 let sb = symbol_bits as Freq;
248 let bb = bypass_bits as Freq;
249 check_bits(sb, max_scale_bits)?;
250 check_bits(bb, max_scale_bits)?;
251
252 let is_byte_variant = max_scale_bits < 32;
254 let max_safe_bits = if is_byte_variant { 30u32 } else { 31u32 };
255 if sb > max_safe_bits || bb > max_safe_bits {
256 return Err(EntropyError::InvalidParams);
257 }
258
259 let mut distribution_descs = Vec::new();
260 initialize_distribution_desc(
261 &mut distribution_descs,
262 pmf_lengths,
263 pmf_offsets,
264 pmf_table.len(),
265 )?;
266
267 let max_freq = 1u64 << symbol_bits;
269 let mut symbols: Vec<S> = Vec::with_capacity(pmf_table.len());
270 let mut pmf_cursor: usize = 0;
271
272 for desc in &distribution_descs {
273 let mut start: u64 = 0;
275 for _i in 0..=desc.bypass_sentinel {
276 let freq = pmf_table[pmf_cursor] as u64;
277 pmf_cursor += 1;
278 if !(freq > 0 && freq <= max_freq - start) {
279 return Err(EntropyError::InvalidPmf);
280 }
281 let sym = S::try_new(start as Freq, freq as Freq, sb).map_err(|e| match e {
282 RawRansError::InvalidScaleBits { .. } => EntropyError::InvalidParams,
283 RawRansError::InvalidParameters => EntropyError::InvalidPmf,
284 })?;
285 symbols.push(sym);
286 start += freq;
287 }
288 }
289
290 self.distribution_descs = distribution_descs;
291 self.symbols = symbols;
292 self.symbol_bits = sb;
293 self.bypass_bits = bb;
294 self.bypass_max_value = ((1u64 << bb) - 1) as Freq;
296 Ok(())
297 }
298
299 fn encode_to_vec<E: RawEncoder<Symbol = S>>(
300 &self,
301 indices: &[i32],
302 values: &[i32],
303 make_encoder: impl FnOnce() -> E,
304 ) -> Result<Vec<E::Unit>, EntropyError> {
305 if self.symbol_bits == 0 {
306 return Err(EntropyError::InvalidState);
307 }
308 if indices.len() != values.len() {
309 return Err(EntropyError::InvalidParams);
310 }
311
312 let mut encoder = make_encoder();
313
314 let data_size = indices.len();
316 let mut idx = data_size as isize - 1;
317 while idx >= 0 {
318 let index = indices[idx as usize];
319 let value = values[idx as usize];
320
321 if index < 0 {
322 idx -= 1;
324 continue;
325 }
326
327 let dist_len = self.distribution_descs.len();
329 let ui = if (index as usize) < dist_len {
330 index as usize
331 } else {
332 dist_len - 1
333 };
334 let desc = &self.distribution_descs[ui];
335
336 let adjusted = value
338 .checked_add(desc.value_offset)
339 .ok_or(EntropyError::InvalidParams)?;
340 let symbol_index: i32;
341 if adjusted < 0 || adjusted >= desc.bypass_sentinel {
342 let bypass_value: Freq = if adjusted < 0 {
345 let neg = adjusted.checked_neg().ok_or(EntropyError::InvalidParams)?;
347 2u64.wrapping_mul(neg as u64).wrapping_sub(1) as Freq
348 } else {
349 2u64.wrapping_mul((adjusted - desc.bypass_sentinel) as u64) as Freq
350 };
351 self.encode_bypass_value(&mut encoder, bypass_value);
352 symbol_index = desc.bypass_sentinel;
353 } else {
354 symbol_index = adjusted;
355 }
356
357 let sym_idx = desc.symbol_offset + symbol_index as usize;
358 encoder.put_symbol(&self.symbols[sym_idx]);
359 idx -= 1;
360 }
361
362 encoder.flush();
363 Ok(encoder.into_units())
364 }
365
366 #[inline]
367 fn encode_bypass_value<E: RawEncoder>(&self, encoder: &mut E, bypass_value: Freq) {
368 let max_parts = (FREQ_BITS as usize / self.bypass_bits as usize).max(2);
370 let mut bypass_buffer = Vec::with_capacity(max_parts);
371
372 let mut bv = bypass_value;
373 while bv != 0 {
374 bypass_buffer.push(bv & self.bypass_max_value);
375 bv >>= self.bypass_bits;
376 }
377
378 let mut bypass_count = bypass_buffer.len() as Freq;
379
380 for &digit in bypass_buffer.iter().rev() {
383 encoder.put_raw(digit, 1, self.bypass_bits);
384 }
385
386 let mut bypass_prefix_count: Freq = 0;
389 while bypass_count >= self.bypass_max_value {
390 bypass_count -= self.bypass_max_value;
391 bypass_prefix_count += 1;
392 }
393 encoder.put_raw(bypass_count, 1, self.bypass_bits);
395 for _ in 0..bypass_prefix_count {
397 encoder.put_raw(self.bypass_max_value, 1, self.bypass_bits);
398 }
399 }
400}
401
402struct DecoderState {
407 symbol_bits: Freq,
408 distribution_descs: Vec<DistributionDesc>,
409 cdf_table: Vec<Freq>,
410 bypass_bits: Freq,
411 bypass_max_value: Freq,
412}
413
414impl DecoderState {
415 fn uninitialized() -> Self {
416 Self {
417 symbol_bits: 0,
418 distribution_descs: Vec::new(),
419 cdf_table: Vec::new(),
420 bypass_bits: 0,
421 bypass_max_value: 0,
422 }
423 }
424
425 fn initialize(
426 &mut self,
427 pmf_lengths: &[i32],
428 pmf_offsets: &[i32],
429 pmf_table: &[i32],
430 symbol_bits: i32,
431 bypass_bits: i32,
432 max_scale_bits: u32,
433 ) -> Result<(), EntropyError> {
434 let sb = symbol_bits as Freq;
435 let bb = bypass_bits as Freq;
436 check_bits(sb, max_scale_bits)?;
437 check_bits(bb, max_scale_bits)?;
438
439 let is_byte_variant = max_scale_bits < 32;
441 let max_safe_bits = if is_byte_variant { 30u32 } else { 31u32 };
442 if sb > max_safe_bits || bb > max_safe_bits {
443 return Err(EntropyError::InvalidParams);
444 }
445
446 let mut distribution_descs = Vec::new();
447 initialize_distribution_desc(
448 &mut distribution_descs,
449 pmf_lengths,
450 pmf_offsets,
451 pmf_table.len(),
452 )?;
453
454 let num_dist = distribution_descs.len();
457 let mut cdf_table = vec![0u32; pmf_table.len() + num_dist];
458 let max_freq = 1u64 << symbol_bits;
460
461 let mut cursor: usize = 0;
462 for dist_idx in 0..num_dist {
463 distribution_descs[dist_idx].symbol_offset = cursor + dist_idx;
465
466 let mut start: u64 = 0;
467 for _i in 0..=distribution_descs[dist_idx].bypass_sentinel {
468 let freq = pmf_table[cursor] as u64;
469 if !(freq > 0 && freq <= max_freq - start) {
470 return Err(EntropyError::InvalidPmf);
471 }
472 cdf_table[cursor + dist_idx] = start as Freq;
473 start += freq;
474 cursor += 1;
475 }
476 cdf_table[cursor + dist_idx] = start as Freq; }
478
479 self.distribution_descs = distribution_descs;
480 self.cdf_table = cdf_table;
481 self.symbol_bits = sb;
482 self.bypass_bits = bb;
483 self.bypass_max_value = ((1u64 << bb) - 1) as Freq;
485 Ok(())
486 }
487
488 fn decode_from_slice(
489 &self,
490 values: &mut [i32],
491 indices: &[i32],
492 data: &[u8],
493 is_byte_variant: bool,
494 ) -> Result<(), EntropyError> {
495 if self.symbol_bits == 0 {
496 return Err(EntropyError::InvalidState);
497 }
498 if values.len() != indices.len() {
499 return Err(EntropyError::InvalidParams);
500 }
501
502 if is_byte_variant {
503 let units = data.to_vec();
504 let source = SliceSource::new(&units);
505 let mut decoder = msrtc_rans_core::RansByteDecoder::new(source);
506 if !decoder.init() {
507 return Err(EntropyError::InvalidStream);
508 }
509 self.decode_inner_byte(&mut decoder, values, indices)?;
510 if !decoder.source().is_exhausted() || !decoder.check_eof() {
511 return Err(EntropyError::InvalidStream);
512 }
513 } else {
514 if data.len() % 4 != 0 {
516 return Err(EntropyError::InvalidStream);
517 }
518 let units = bytes_to_u32_units(data);
519 let source = SliceSource::new(&units);
520 let mut decoder = msrtc_rans_core::Rans64Decoder::new(source);
521 if !decoder.init() {
522 return Err(EntropyError::InvalidStream);
523 }
524 self.decode_inner_64(&mut decoder, values, indices)?;
525 if !decoder.source().is_exhausted() || !decoder.check_eof() {
526 return Err(EntropyError::InvalidStream);
527 }
528 }
529 Ok(())
530 }
531
532 #[inline]
534 fn decode_bypass_count_byte(
535 &self,
536 decoder: &mut msrtc_rans_core::RansByteDecoder<SliceSource<'_, u8>>,
537 ) -> Result<Freq, EntropyError> {
538 let mut total: Freq = 0;
539 loop {
540 let value = decoder.get(self.bypass_bits);
541 if !decoder.advance(value, 1, self.bypass_bits) {
542 return Err(EntropyError::InvalidStream);
543 }
544 total += value;
545 if value != self.bypass_max_value {
546 break;
547 }
548 if total > FREQ_BITS {
549 return Err(EntropyError::InvalidStream);
550 }
551 }
552 Ok(total)
553 }
554
555 #[inline]
557 fn decode_bypass_count_64(
558 &self,
559 decoder: &mut msrtc_rans_core::Rans64Decoder<SliceSource<'_, u32>>,
560 ) -> Result<Freq, EntropyError> {
561 let mut total: Freq = 0;
562 loop {
563 let value = decoder.get(self.bypass_bits);
564 if !decoder.advance(value, 1, self.bypass_bits) {
565 return Err(EntropyError::InvalidStream);
566 }
567 total += value;
568 if value != self.bypass_max_value {
569 break;
570 }
571 if total > FREQ_BITS {
572 return Err(EntropyError::InvalidStream);
573 }
574 }
575 Ok(total)
576 }
577
578 #[inline]
580 fn decode_bypass_value_payload_byte(
581 &self,
582 decoder: &mut msrtc_rans_core::RansByteDecoder<SliceSource<'_, u8>>,
583 bypass_count: Freq,
584 ) -> Result<Freq, EntropyError> {
585 let mut encoded_value: u64 = 0;
587 let total_bits = bypass_count as u64 * self.bypass_bits as u64;
588 let mut shift: u64 = 0;
589 while shift < total_bits {
590 let v = decoder.get(self.bypass_bits);
591 if !decoder.advance(v, 1, self.bypass_bits) {
592 return Err(EntropyError::InvalidStream);
593 }
594 encoded_value |= (v as u64) << shift;
595 shift += self.bypass_bits as u64;
596 }
597 Ok(encoded_value as Freq)
598 }
599
600 #[inline]
602 fn decode_bypass_value_payload_64(
603 &self,
604 decoder: &mut msrtc_rans_core::Rans64Decoder<SliceSource<'_, u32>>,
605 bypass_count: Freq,
606 ) -> Result<Freq, EntropyError> {
607 let mut encoded_value: u64 = 0;
609 let total_bits = bypass_count as u64 * self.bypass_bits as u64;
610 let mut shift: u64 = 0;
611 while shift < total_bits {
612 let v = decoder.get(self.bypass_bits);
613 if !decoder.advance(v, 1, self.bypass_bits) {
614 return Err(EntropyError::InvalidStream);
615 }
616 encoded_value |= (v as u64) << shift;
617 shift += self.bypass_bits as u64;
618 }
619 Ok(encoded_value as Freq)
620 }
621
622 pub(crate) fn decode_inner_byte(
623 &self,
624 decoder: &mut msrtc_rans_core::RansByteDecoder<SliceSource<'_, u8>>,
625 values: &mut [i32],
626 indices: &[i32],
627 ) -> Result<(), EntropyError> {
628 if self.symbol_bits == 0 {
629 return Err(EntropyError::InvalidState);
630 }
631 if values.len() != indices.len() {
632 return Err(EntropyError::InvalidParams);
633 }
634
635 for (i, &index) in indices.iter().enumerate() {
636 if index < 0 {
637 values[i] = 0;
638 continue;
639 }
640
641 let dist_len = self.distribution_descs.len();
642 let ui = if (index as usize) < dist_len {
643 index as usize
644 } else {
645 dist_len - 1
646 };
647 let desc = &self.distribution_descs[ui];
648
649 let cum_freq = decoder.get(self.symbol_bits);
651 debug_assert!(cum_freq < (1u32 << self.symbol_bits));
652
653 let base_offset = desc.symbol_offset;
655 let lo = base_offset + 1;
656 let hi = base_offset + desc.bypass_sentinel as usize + 1;
657
658 let upper_idx = {
660 let mut low = lo;
661 let mut high = hi;
662 while low < high {
663 let mid = low + (high - low) / 2;
664 if cum_freq < self.cdf_table[mid] {
665 high = mid;
666 } else {
667 low = mid + 1;
668 }
669 }
670 low
671 };
672 let start_idx = upper_idx - 1;
674
675 let s0 = self.cdf_table[start_idx];
676 let s1 = self.cdf_table[start_idx + 1];
677 let freq = s1 - s0;
678
679 if !decoder.advance_symbol(&RansByteDecSymbol::new(s0, freq), self.symbol_bits) {
680 return Err(EntropyError::InvalidStream);
681 }
682
683 let mut symbol = (start_idx - base_offset) as i32;
684 if symbol == desc.bypass_sentinel {
685 let bypass_count = self.decode_bypass_count_byte(decoder)?;
686 let bypass_value = self.decode_bypass_value_payload_byte(decoder, bypass_count)?;
687 let half = (bypass_value >> 1) as i64;
689 if bypass_value & 1 != 0 {
690 symbol = (-half)
693 .checked_sub(1)
694 .ok_or(EntropyError::InvalidStream)?
695 .try_into()
696 .map_err(|_| EntropyError::InvalidStream)?;
697 } else {
698 symbol = half
700 .checked_add(desc.bypass_sentinel as i64)
701 .ok_or(EntropyError::InvalidStream)?
702 .try_into()
703 .map_err(|_| EntropyError::InvalidStream)?;
704 }
705 }
706
707 values[i] = (symbol as i64)
708 .checked_sub(desc.value_offset as i64)
709 .ok_or(EntropyError::InvalidStream)?
710 .try_into()
711 .map_err(|_| EntropyError::InvalidStream)?;
712 }
713 Ok(())
714 }
715
716 pub(crate) fn decode_inner_64(
717 &self,
718 decoder: &mut msrtc_rans_core::Rans64Decoder<SliceSource<'_, u32>>,
719 values: &mut [i32],
720 indices: &[i32],
721 ) -> Result<(), EntropyError> {
722 if self.symbol_bits == 0 {
723 return Err(EntropyError::InvalidState);
724 }
725 if values.len() != indices.len() {
726 return Err(EntropyError::InvalidParams);
727 }
728
729 for (i, &index) in indices.iter().enumerate() {
730 if index < 0 {
731 values[i] = 0;
732 continue;
733 }
734
735 let dist_len = self.distribution_descs.len();
736 let ui = if (index as usize) < dist_len {
737 index as usize
738 } else {
739 dist_len - 1
740 };
741 let desc = &self.distribution_descs[ui];
742
743 let cum_freq = decoder.get(self.symbol_bits);
744 debug_assert!(cum_freq < (1u32 << self.symbol_bits));
745
746 let base_offset = desc.symbol_offset;
747 let lo = base_offset + 1;
748 let hi = base_offset + desc.bypass_sentinel as usize + 1;
749
750 let upper_idx = {
751 let mut low = lo;
752 let mut high = hi;
753 while low < high {
754 let mid = low + (high - low) / 2;
755 if cum_freq < self.cdf_table[mid] {
756 high = mid;
757 } else {
758 low = mid + 1;
759 }
760 }
761 low
762 };
763 let start_idx = upper_idx - 1;
764
765 let s0 = self.cdf_table[start_idx];
766 let s1 = self.cdf_table[start_idx + 1];
767 let freq = s1 - s0;
768
769 if !decoder.advance_symbol(&Rans64DecSymbol::new(s0, freq), self.symbol_bits) {
770 return Err(EntropyError::InvalidStream);
771 }
772
773 let mut symbol = (start_idx - base_offset) as i32;
774 if symbol == desc.bypass_sentinel {
775 let bypass_count = self.decode_bypass_count_64(decoder)?;
776 let bypass_value = self.decode_bypass_value_payload_64(decoder, bypass_count)?;
777 let half = (bypass_value >> 1) as i64;
779 if bypass_value & 1 != 0 {
780 symbol = (-half)
783 .checked_sub(1)
784 .ok_or(EntropyError::InvalidStream)?
785 .try_into()
786 .map_err(|_| EntropyError::InvalidStream)?;
787 } else {
788 symbol = half
790 .checked_add(desc.bypass_sentinel as i64)
791 .ok_or(EntropyError::InvalidStream)?
792 .try_into()
793 .map_err(|_| EntropyError::InvalidStream)?;
794 }
795 }
796
797 values[i] = (symbol as i64)
798 .checked_sub(desc.value_offset as i64)
799 .ok_or(EntropyError::InvalidStream)?
800 .try_into()
801 .map_err(|_| EntropyError::InvalidStream)?;
802 }
803 Ok(())
804 }
805}
806
807pub trait EncoderVariantForS: RansParams {
816 type EncSymbol: EncSymbol;
818
819 type RawEnc: RawEncoder<Symbol = Self::EncSymbol>;
821
822 const MAX_SCALE_BITS: u32;
824
825 fn units_to_bytes(units: Vec<<Self::RawEnc as RawEncoder>::Unit>) -> Vec<u8>;
827
828 fn make_encoder() -> Self::RawEnc;
830}
831
832impl EncoderVariantForS for RansByte {
833 type EncSymbol = RansByteEncSymbol;
834 type RawEnc = RansByteEncoder<VecSink<u8>>;
835 const MAX_SCALE_BITS: u32 = 30;
836 fn units_to_bytes(units: Vec<u8>) -> Vec<u8> {
837 units
838 }
839 fn make_encoder() -> Self::RawEnc {
840 RansByteEncoder::new(VecSink::new(4096))
841 }
842}
843
844impl EncoderVariantForS for Rans64 {
845 type EncSymbol = Rans64EncSymbol;
846 type RawEnc = Rans64Encoder<VecSink<u32>>;
847 const MAX_SCALE_BITS: u32 = 32;
848 fn units_to_bytes(units: Vec<u32>) -> Vec<u8> {
849 let mut bytes = Vec::with_capacity(units.len() * 4);
850 for &u in &units {
851 bytes.extend_from_slice(&u.to_le_bytes());
852 }
853 bytes
854 }
855 fn make_encoder() -> Self::RawEnc {
856 Rans64Encoder::new(VecSink::new(4096))
857 }
858}
859
860pub struct EntropyEncoder<S: EncoderVariantForS> {
887 state: EncoderState<<S as EncoderVariantForS>::EncSymbol>,
888}
889
890impl<S: EncoderVariantForS> EntropyEncoder<S> {
891 pub fn new() -> Self {
893 Self {
894 state: EncoderState::uninitialized(),
895 }
896 }
897
898 pub fn initialize(
906 &mut self,
907 pmf_lengths: &[i32],
908 pmf_offsets: &[i32],
909 pmf_table: &[i32],
910 symbol_bits: u32,
911 bypass_bits: u32,
912 ) -> Result<(), EntropyError> {
913 self.state.initialize(
914 pmf_lengths,
915 pmf_offsets,
916 pmf_table,
917 symbol_bits as i32,
918 bypass_bits as i32,
919 <S as EncoderVariantForS>::MAX_SCALE_BITS,
920 )
921 }
922
923 pub fn encode(
927 &self,
928 indices: &[i32],
929 values: &[i32],
930 buffer: &mut Vec<u8>,
931 ) -> Result<(), EntropyError> {
932 let units = self.state.encode_to_vec(indices, values, S::make_encoder)?;
933 let bytes = S::units_to_bytes(units);
934 buffer.extend_from_slice(&bytes);
935 Ok(())
936 }
937}
938
939impl<S: EncoderVariantForS> Default for EntropyEncoder<S> {
940 fn default() -> Self {
941 Self::new()
942 }
943}
944
945fn _assert_encoder_bounds() {
946 fn _is_encoder<S: EncoderVariantForS>() {}
947 _is_encoder::<RansByte>();
948 _is_encoder::<Rans64>();
949}
950
951pub struct EntropyDecoder<S: RansParams> {
959 state: DecoderState,
960 _phantom: core::marker::PhantomData<S>,
961}
962
963impl<S: RansParams> EntropyDecoder<S> {
964 pub fn new() -> Self {
966 Self {
967 state: DecoderState::uninitialized(),
968 _phantom: core::marker::PhantomData,
969 }
970 }
971
972 pub fn initialize(
980 &mut self,
981 pmf_lengths: &[i32],
982 pmf_offsets: &[i32],
983 pmf_table: &[i32],
984 symbol_bits: u32,
985 bypass_bits: u32,
986 ) -> Result<(), EntropyError> {
987 let max_scale_bits = match S::NAME {
988 "RansByte" => 30u32,
989 "Rans64" => 32u32,
990 _ => return Err(EntropyError::InvalidParams),
991 };
992 self.state.initialize(
993 pmf_lengths,
994 pmf_offsets,
995 pmf_table,
996 symbol_bits as i32,
997 bypass_bits as i32,
998 max_scale_bits,
999 )
1000 }
1001
1002 pub fn decode(
1008 &self,
1009 values: &mut [i32],
1010 indices: &[i32],
1011 data: &[u8],
1012 ) -> Result<(), EntropyError> {
1013 let is_byte = match S::NAME {
1014 "RansByte" => true,
1015 "Rans64" => false,
1016 _ => return Err(EntropyError::InvalidParams),
1017 };
1018 self.state.decode_from_slice(values, indices, data, is_byte)
1019 }
1020
1021 pub fn decode_partial(
1033 &self,
1034 values: &mut [i32],
1035 indices: &[i32],
1036 data: &[u8],
1037 ) -> Result<usize, EntropyError> {
1038 if self.state.symbol_bits == 0 {
1039 return Err(EntropyError::InvalidState);
1040 }
1041 if values.len() != indices.len() {
1042 return Err(EntropyError::InvalidParams);
1043 }
1044
1045 let consumed = match S::NAME {
1046 "RansByte" => {
1047 let units = data.to_vec();
1048 let source = SliceSource::new(&units);
1049 let mut decoder = msrtc_rans_core::RansByteDecoder::new(source);
1050 if !decoder.init() {
1051 return Err(EntropyError::InvalidStream);
1052 }
1053 self.state
1054 .decode_inner_byte(&mut decoder, values, indices)?;
1055 if !decoder.check_eof() {
1056 return Err(EntropyError::InvalidStream);
1057 }
1058 decoder.source().position()
1059 }
1060 "Rans64" => {
1061 if data.len() % 4 != 0 {
1062 return Err(EntropyError::InvalidStream);
1063 }
1064 let units = bytes_to_u32_units(data);
1065 let source = SliceSource::new(&units);
1066 let mut decoder = msrtc_rans_core::Rans64Decoder::new(source);
1067 if !decoder.init() {
1068 return Err(EntropyError::InvalidStream);
1069 }
1070 self.state.decode_inner_64(&mut decoder, values, indices)?;
1071 if !decoder.check_eof() {
1072 return Err(EntropyError::InvalidStream);
1073 }
1074 decoder.source().position() * 4
1075 }
1076 _ => return Err(EntropyError::InvalidParams),
1077 };
1078
1079 Ok(consumed)
1080 }
1081}
1082
1083impl<S: RansParams> Default for EntropyDecoder<S> {
1084 fn default() -> Self {
1085 Self::new()
1086 }
1087}
1088
1089#[cfg(test)]
1094mod tests {
1095 use super::*;
1096
1097 const PMF_LENGTHS: [i32; 2] = [4, 6];
1111 const PMF_OFFSETS: [i32; 2] = [1, 2];
1112 const PMF_TABLE: [i32; 10] = [1, 3, 1, 1, 1, 3, 5, 3, 1, 1];
1113 const INDICES: [i32; 4] = [0, 1, 0, 1];
1114 const VALUES: [i32; 4] = [-2, 1, 0, 1];
1115 const SYMBOL_BITS: u32 = 16;
1116 const BYPASS_BITS: u32 = 4;
1117
1118 const REF_HEX_BYTE: &str = "0500bd040001a10003000b00";
1119 const REF_HEX_64: &str = "0500a1bd04000000110a002f03000300";
1120
1121 fn hex_decode(hex: &str) -> Vec<u8> {
1122 (0..hex.len())
1123 .step_by(2)
1124 .map(|i| u8::from_str_radix(&hex[i..i + 2], 16).unwrap())
1125 .collect()
1126 }
1127
1128 #[test]
1129 fn test_encoder_byte_initialize() {
1130 let mut enc: EntropyEncoder<RansByte> = EntropyEncoder::new();
1131 assert!(
1132 enc.initialize(
1133 &PMF_LENGTHS,
1134 &PMF_OFFSETS,
1135 &PMF_TABLE,
1136 SYMBOL_BITS,
1137 BYPASS_BITS
1138 )
1139 .is_ok()
1140 );
1141 }
1142
1143 #[test]
1144 fn test_encoder_64_initialize() {
1145 let mut enc: EntropyEncoder<Rans64> = EntropyEncoder::new();
1146 assert!(
1147 enc.initialize(
1148 &PMF_LENGTHS,
1149 &PMF_OFFSETS,
1150 &PMF_TABLE,
1151 SYMBOL_BITS,
1152 BYPASS_BITS
1153 )
1154 .is_ok()
1155 );
1156 }
1157
1158 #[test]
1159 fn test_encoder_rejects_invalid_pmf() {
1160 let mut enc: EntropyEncoder<RansByte> = EntropyEncoder::new();
1161 assert_eq!(
1163 enc.initialize(&[4], &[1, 2], &PMF_TABLE, SYMBOL_BITS, BYPASS_BITS),
1164 Err(EntropyError::InvalidPmf)
1165 );
1166 }
1167
1168 #[test]
1169 fn test_encoder_rejects_invalid_params() {
1170 let mut enc: EntropyEncoder<RansByte> = EntropyEncoder::new();
1171 assert_eq!(
1173 enc.initialize(&PMF_LENGTHS, &PMF_OFFSETS, &PMF_TABLE, 1, BYPASS_BITS),
1174 Err(EntropyError::InvalidParams)
1175 );
1176 }
1177
1178 #[test]
1179 fn test_encoder_byte_rejects_length_leq_one() {
1180 let mut enc: EntropyEncoder<RansByte> = EntropyEncoder::new();
1181 assert_eq!(
1183 enc.initialize(&[1, 6], &[1, 2], &PMF_TABLE, SYMBOL_BITS, BYPASS_BITS),
1184 Err(EntropyError::InvalidPmf)
1185 );
1186 }
1187
1188 #[test]
1189 fn test_encode_byte_matches_reference() {
1190 let mut enc: EntropyEncoder<RansByte> = EntropyEncoder::new();
1193 enc.initialize(
1194 &PMF_LENGTHS,
1195 &PMF_OFFSETS,
1196 &PMF_TABLE,
1197 SYMBOL_BITS,
1198 BYPASS_BITS,
1199 )
1200 .unwrap();
1201
1202 let mut buffer = Vec::new();
1203 enc.encode(&INDICES, &VALUES, &mut buffer).unwrap();
1204
1205 let expected = hex_decode(REF_HEX_BYTE);
1206 assert_eq!(
1207 buffer, expected,
1208 "RansByte encode output does not match reference hex"
1209 );
1210 }
1211
1212 #[test]
1213 fn test_encode_64_matches_reference() {
1214 let mut enc: EntropyEncoder<Rans64> = EntropyEncoder::new();
1215 enc.initialize(
1216 &PMF_LENGTHS,
1217 &PMF_OFFSETS,
1218 &PMF_TABLE,
1219 SYMBOL_BITS,
1220 BYPASS_BITS,
1221 )
1222 .unwrap();
1223
1224 let mut buffer = Vec::new();
1225 enc.encode(&INDICES, &VALUES, &mut buffer).unwrap();
1226
1227 let expected = hex_decode(REF_HEX_64);
1228 assert_eq!(
1229 buffer, expected,
1230 "Rans64 encode output does not match reference hex"
1231 );
1232 }
1233
1234 #[test]
1235 fn test_encode_in_range_values_no_bypass() {
1236 let in_range_values = [1i32, 1, 0, 1];
1240 let mut enc: EntropyEncoder<RansByte> = EntropyEncoder::new();
1241 enc.initialize(
1242 &PMF_LENGTHS,
1243 &PMF_OFFSETS,
1244 &PMF_TABLE,
1245 SYMBOL_BITS,
1246 BYPASS_BITS,
1247 )
1248 .unwrap();
1249
1250 let mut buffer = Vec::new();
1251 let result = enc.encode(&INDICES, &in_range_values, &mut buffer);
1252 assert!(result.is_ok(), "encode should succeed: {:?}", result);
1253 assert!(!buffer.is_empty(), "encoded buffer should not be empty");
1254 }
1255
1256 #[test]
1257 fn test_decode_byte_roundtrip_in_range() {
1258 let values = [1i32, 1, 0, 1];
1260
1261 let mut enc: EntropyEncoder<RansByte> = EntropyEncoder::new();
1262 enc.initialize(
1263 &PMF_LENGTHS,
1264 &PMF_OFFSETS,
1265 &PMF_TABLE,
1266 SYMBOL_BITS,
1267 BYPASS_BITS,
1268 )
1269 .unwrap();
1270
1271 let mut encoded = Vec::new();
1272 enc.encode(&INDICES, &values, &mut encoded).unwrap();
1273
1274 let mut dec: EntropyDecoder<RansByte> = EntropyDecoder::new();
1275 dec.initialize(
1276 &PMF_LENGTHS,
1277 &PMF_OFFSETS,
1278 &PMF_TABLE,
1279 SYMBOL_BITS,
1280 BYPASS_BITS,
1281 )
1282 .unwrap();
1283
1284 let mut decoded = vec![0i32; values.len()];
1285 dec.decode(&mut decoded, &INDICES, &encoded).unwrap();
1286
1287 assert_eq!(
1288 decoded, values,
1289 "roundtrip decode should match original values"
1290 );
1291 }
1292
1293 #[test]
1294 fn test_decode_64_roundtrip_in_range() {
1295 let values = [1i32, 1, 0, 1];
1296
1297 let mut enc: EntropyEncoder<Rans64> = EntropyEncoder::new();
1298 enc.initialize(
1299 &PMF_LENGTHS,
1300 &PMF_OFFSETS,
1301 &PMF_TABLE,
1302 SYMBOL_BITS,
1303 BYPASS_BITS,
1304 )
1305 .unwrap();
1306
1307 let mut encoded = Vec::new();
1308 enc.encode(&INDICES, &values, &mut encoded).unwrap();
1309
1310 let mut dec: EntropyDecoder<Rans64> = EntropyDecoder::new();
1311 dec.initialize(
1312 &PMF_LENGTHS,
1313 &PMF_OFFSETS,
1314 &PMF_TABLE,
1315 SYMBOL_BITS,
1316 BYPASS_BITS,
1317 )
1318 .unwrap();
1319
1320 let mut decoded = vec![0i32; values.len()];
1321 dec.decode(&mut decoded, &INDICES, &encoded).unwrap();
1322
1323 assert_eq!(
1324 decoded, values,
1325 "Rans64 roundtrip decode should match original values"
1326 );
1327 }
1328
1329 #[test]
1330 fn test_decode_byte_roundtrip_bypass() {
1331 let values = [-2i32, 1, 0, 1];
1333
1334 let mut enc: EntropyEncoder<RansByte> = EntropyEncoder::new();
1335 enc.initialize(
1336 &PMF_LENGTHS,
1337 &PMF_OFFSETS,
1338 &PMF_TABLE,
1339 SYMBOL_BITS,
1340 BYPASS_BITS,
1341 )
1342 .unwrap();
1343
1344 let mut encoded = Vec::new();
1345 enc.encode(&INDICES, &values, &mut encoded).unwrap();
1346
1347 let mut dec: EntropyDecoder<RansByte> = EntropyDecoder::new();
1348 dec.initialize(
1349 &PMF_LENGTHS,
1350 &PMF_OFFSETS,
1351 &PMF_TABLE,
1352 SYMBOL_BITS,
1353 BYPASS_BITS,
1354 )
1355 .unwrap();
1356
1357 let mut decoded = vec![0i32; values.len()];
1358 dec.decode(&mut decoded, &INDICES, &encoded).unwrap();
1359
1360 assert_eq!(
1361 decoded, values,
1362 "bypass roundtrip decode should match original values"
1363 );
1364 }
1365
1366 #[test]
1367 fn test_decode_64_roundtrip_bypass() {
1368 let values = [-2i32, 1, 0, 1];
1369
1370 let mut enc: EntropyEncoder<Rans64> = EntropyEncoder::new();
1371 enc.initialize(
1372 &PMF_LENGTHS,
1373 &PMF_OFFSETS,
1374 &PMF_TABLE,
1375 SYMBOL_BITS,
1376 BYPASS_BITS,
1377 )
1378 .unwrap();
1379
1380 let mut encoded = Vec::new();
1381 enc.encode(&INDICES, &values, &mut encoded).unwrap();
1382
1383 let mut dec: EntropyDecoder<Rans64> = EntropyDecoder::new();
1384 dec.initialize(
1385 &PMF_LENGTHS,
1386 &PMF_OFFSETS,
1387 &PMF_TABLE,
1388 SYMBOL_BITS,
1389 BYPASS_BITS,
1390 )
1391 .unwrap();
1392
1393 let mut decoded = vec![0i32; values.len()];
1394 dec.decode(&mut decoded, &INDICES, &encoded).unwrap();
1395
1396 assert_eq!(
1397 decoded, values,
1398 "Rans64 bypass roundtrip decode should match original values"
1399 );
1400 }
1401
1402 #[test]
1407 fn test_encoder_64_symbol_bits_31_accepted() {
1408 let mut enc: EntropyEncoder<Rans64> = EntropyEncoder::new();
1410 assert!(
1411 enc.initialize(&PMF_LENGTHS, &PMF_OFFSETS, &PMF_TABLE, 31, BYPASS_BITS)
1412 .is_ok()
1413 );
1414 }
1415
1416 #[test]
1417 fn test_encoder_64_symbol_bits_32_rejected() {
1418 let mut enc: EntropyEncoder<Rans64> = EntropyEncoder::new();
1420 assert_eq!(
1421 enc.initialize(&PMF_LENGTHS, &PMF_OFFSETS, &PMF_TABLE, 32, BYPASS_BITS),
1422 Err(EntropyError::InvalidParams)
1423 );
1424 }
1425
1426 #[test]
1427 fn test_encoder_64_bypass_bits_32_rejected() {
1428 let mut enc: EntropyEncoder<Rans64> = EntropyEncoder::new();
1430 assert_eq!(
1431 enc.initialize(&PMF_LENGTHS, &PMF_OFFSETS, &PMF_TABLE, SYMBOL_BITS, 32),
1432 Err(EntropyError::InvalidParams)
1433 );
1434 }
1435
1436 #[test]
1441 fn test_decode_64_rejects_misaligned_1_extra_byte() {
1442 let mut enc: EntropyEncoder<Rans64> = EntropyEncoder::new();
1443 enc.initialize(
1444 &PMF_LENGTHS,
1445 &PMF_OFFSETS,
1446 &PMF_TABLE,
1447 SYMBOL_BITS,
1448 BYPASS_BITS,
1449 )
1450 .unwrap();
1451 let mut encoded = Vec::new();
1452 enc.encode(&INDICES, &[1i32, 1, 0, 1], &mut encoded)
1453 .unwrap();
1454
1455 let mut misaligned = encoded.clone();
1457 misaligned.push(0xAB);
1458
1459 let mut dec: EntropyDecoder<Rans64> = EntropyDecoder::new();
1460 dec.initialize(
1461 &PMF_LENGTHS,
1462 &PMF_OFFSETS,
1463 &PMF_TABLE,
1464 SYMBOL_BITS,
1465 BYPASS_BITS,
1466 )
1467 .unwrap();
1468 let mut decoded = vec![0i32; 4];
1469 let result = dec.decode(&mut decoded, &INDICES, &misaligned);
1470 assert_eq!(result, Err(EntropyError::InvalidStream));
1471 }
1472
1473 #[test]
1474 fn test_decode_64_rejects_misaligned_2_extra_bytes() {
1475 let mut enc: EntropyEncoder<Rans64> = EntropyEncoder::new();
1476 enc.initialize(
1477 &PMF_LENGTHS,
1478 &PMF_OFFSETS,
1479 &PMF_TABLE,
1480 SYMBOL_BITS,
1481 BYPASS_BITS,
1482 )
1483 .unwrap();
1484 let mut encoded = Vec::new();
1485 enc.encode(&INDICES, &[1i32, 1, 0, 1], &mut encoded)
1486 .unwrap();
1487
1488 let mut misaligned = encoded.clone();
1489 misaligned.extend_from_slice(&[0xAB, 0xCD]);
1490
1491 let mut dec: EntropyDecoder<Rans64> = EntropyDecoder::new();
1492 dec.initialize(
1493 &PMF_LENGTHS,
1494 &PMF_OFFSETS,
1495 &PMF_TABLE,
1496 SYMBOL_BITS,
1497 BYPASS_BITS,
1498 )
1499 .unwrap();
1500 let mut decoded = vec![0i32; 4];
1501 let result = dec.decode(&mut decoded, &INDICES, &misaligned);
1502 assert_eq!(result, Err(EntropyError::InvalidStream));
1503 }
1504
1505 #[test]
1506 fn test_decode_64_rejects_misaligned_3_extra_bytes() {
1507 let mut enc: EntropyEncoder<Rans64> = EntropyEncoder::new();
1508 enc.initialize(
1509 &PMF_LENGTHS,
1510 &PMF_OFFSETS,
1511 &PMF_TABLE,
1512 SYMBOL_BITS,
1513 BYPASS_BITS,
1514 )
1515 .unwrap();
1516 let mut encoded = Vec::new();
1517 enc.encode(&INDICES, &[1i32, 1, 0, 1], &mut encoded)
1518 .unwrap();
1519
1520 let mut misaligned = encoded.clone();
1521 misaligned.extend_from_slice(&[0xAB, 0xCD, 0xEF]);
1522
1523 let mut dec: EntropyDecoder<Rans64> = EntropyDecoder::new();
1524 dec.initialize(
1525 &PMF_LENGTHS,
1526 &PMF_OFFSETS,
1527 &PMF_TABLE,
1528 SYMBOL_BITS,
1529 BYPASS_BITS,
1530 )
1531 .unwrap();
1532 let mut decoded = vec![0i32; 4];
1533 let result = dec.decode(&mut decoded, &INDICES, &misaligned);
1534 assert_eq!(result, Err(EntropyError::InvalidStream));
1535 }
1536
1537 #[test]
1538 fn test_decode_byte_accepts_extra_bytes() {
1539 let mut enc: EntropyEncoder<RansByte> = EntropyEncoder::new();
1541 enc.initialize(
1542 &PMF_LENGTHS,
1543 &PMF_OFFSETS,
1544 &PMF_TABLE,
1545 SYMBOL_BITS,
1546 BYPASS_BITS,
1547 )
1548 .unwrap();
1549 let mut encoded = Vec::new();
1550 enc.encode(&INDICES, &[1i32, 1, 0, 1], &mut encoded)
1551 .unwrap();
1552
1553 let mut extended = encoded.clone();
1555 extended.extend_from_slice(&[0xAB, 0xCD]);
1556
1557 let mut dec: EntropyDecoder<RansByte> = EntropyDecoder::new();
1558 dec.initialize(
1559 &PMF_LENGTHS,
1560 &PMF_OFFSETS,
1561 &PMF_TABLE,
1562 SYMBOL_BITS,
1563 BYPASS_BITS,
1564 )
1565 .unwrap();
1566 let mut decoded = vec![0i32; 4];
1567 let _ = dec.decode(&mut decoded, &INDICES, &extended);
1570 }
1572
1573 #[test]
1578 fn test_encode_bypass_positive_outlier() {
1579 let values = [10i32, 1, 0, 1];
1584 let mut enc: EntropyEncoder<RansByte> = EntropyEncoder::new();
1585 enc.initialize(
1586 &PMF_LENGTHS,
1587 &PMF_OFFSETS,
1588 &PMF_TABLE,
1589 SYMBOL_BITS,
1590 BYPASS_BITS,
1591 )
1592 .unwrap();
1593 let mut encoded = Vec::new();
1594 enc.encode(&INDICES, &values, &mut encoded).unwrap();
1595
1596 let mut dec: EntropyDecoder<RansByte> = EntropyDecoder::new();
1597 dec.initialize(
1598 &PMF_LENGTHS,
1599 &PMF_OFFSETS,
1600 &PMF_TABLE,
1601 SYMBOL_BITS,
1602 BYPASS_BITS,
1603 )
1604 .unwrap();
1605 let mut decoded = vec![0i32; 4];
1606 dec.decode(&mut decoded, &INDICES, &encoded).unwrap();
1607 assert_eq!(decoded, values);
1608 }
1609
1610 #[test]
1611 fn test_encode_bypass_multi_digit_value() {
1612 let values = [200i32, 1, 0, 1];
1616 let mut enc: EntropyEncoder<RansByte> = EntropyEncoder::new();
1617 enc.initialize(
1618 &PMF_LENGTHS,
1619 &PMF_OFFSETS,
1620 &PMF_TABLE,
1621 SYMBOL_BITS,
1622 BYPASS_BITS,
1623 )
1624 .unwrap();
1625 let mut encoded = Vec::new();
1626 enc.encode(&INDICES, &values, &mut encoded).unwrap();
1627
1628 let mut dec: EntropyDecoder<RansByte> = EntropyDecoder::new();
1629 dec.initialize(
1630 &PMF_LENGTHS,
1631 &PMF_OFFSETS,
1632 &PMF_TABLE,
1633 SYMBOL_BITS,
1634 BYPASS_BITS,
1635 )
1636 .unwrap();
1637 let mut decoded = vec![0i32; 4];
1638 dec.decode(&mut decoded, &INDICES, &encoded).unwrap();
1639 assert_eq!(decoded, values);
1640 }
1641
1642 #[test]
1643 fn test_encode_bypass_bits_2() {
1644 let mut enc: EntropyEncoder<RansByte> = EntropyEncoder::new();
1646 enc.initialize(&PMF_LENGTHS, &PMF_OFFSETS, &PMF_TABLE, SYMBOL_BITS, 2)
1647 .unwrap();
1648 let values = [10i32, 1, 0, 1]; let mut encoded = Vec::new();
1650 enc.encode(&INDICES, &values, &mut encoded).unwrap();
1651
1652 let mut dec: EntropyDecoder<RansByte> = EntropyDecoder::new();
1653 dec.initialize(&PMF_LENGTHS, &PMF_OFFSETS, &PMF_TABLE, SYMBOL_BITS, 2)
1654 .unwrap();
1655 let mut decoded = vec![0i32; 4];
1656 dec.decode(&mut decoded, &INDICES, &encoded).unwrap();
1657 assert_eq!(decoded, values);
1658 }
1659
1660 #[test]
1661 fn test_encode_bypass_bits_3() {
1662 let mut enc: EntropyEncoder<RansByte> = EntropyEncoder::new();
1664 enc.initialize(&PMF_LENGTHS, &PMF_OFFSETS, &PMF_TABLE, SYMBOL_BITS, 3)
1665 .unwrap();
1666 let values = [10i32, 1, 0, 1];
1667 let mut encoded = Vec::new();
1668 enc.encode(&INDICES, &values, &mut encoded).unwrap();
1669
1670 let mut dec: EntropyDecoder<RansByte> = EntropyDecoder::new();
1671 dec.initialize(&PMF_LENGTHS, &PMF_OFFSETS, &PMF_TABLE, SYMBOL_BITS, 3)
1672 .unwrap();
1673 let mut decoded = vec![0i32; 4];
1674 dec.decode(&mut decoded, &INDICES, &encoded).unwrap();
1675 assert_eq!(decoded, values);
1676 }
1677
1678 #[test]
1679 fn test_encode_bypass_bits_8() {
1680 let mut enc: EntropyEncoder<RansByte> = EntropyEncoder::new();
1682 enc.initialize(&PMF_LENGTHS, &PMF_OFFSETS, &PMF_TABLE, SYMBOL_BITS, 8)
1683 .unwrap();
1684 let values = [10i32, 1, 0, 1];
1685 let mut encoded = Vec::new();
1686 enc.encode(&INDICES, &values, &mut encoded).unwrap();
1687
1688 let mut dec: EntropyDecoder<RansByte> = EntropyDecoder::new();
1689 dec.initialize(&PMF_LENGTHS, &PMF_OFFSETS, &PMF_TABLE, SYMBOL_BITS, 8)
1690 .unwrap();
1691 let mut decoded = vec![0i32; 4];
1692 dec.decode(&mut decoded, &INDICES, &encoded).unwrap();
1693 assert_eq!(decoded, values);
1694 }
1695
1696 #[test]
1697 fn test_encode_bypass_multiple_bypasses() {
1698 let values = [-2i32, 10, 0, 1];
1703 let mut enc: EntropyEncoder<RansByte> = EntropyEncoder::new();
1704 enc.initialize(
1705 &PMF_LENGTHS,
1706 &PMF_OFFSETS,
1707 &PMF_TABLE,
1708 SYMBOL_BITS,
1709 BYPASS_BITS,
1710 )
1711 .unwrap();
1712 let mut encoded = Vec::new();
1713 enc.encode(&INDICES, &values, &mut encoded).unwrap();
1714
1715 let mut dec: EntropyDecoder<RansByte> = EntropyDecoder::new();
1716 dec.initialize(
1717 &PMF_LENGTHS,
1718 &PMF_OFFSETS,
1719 &PMF_TABLE,
1720 SYMBOL_BITS,
1721 BYPASS_BITS,
1722 )
1723 .unwrap();
1724 let mut decoded = vec![0i32; 4];
1725 dec.decode(&mut decoded, &INDICES, &encoded).unwrap();
1726 assert_eq!(decoded, values);
1727 }
1728
1729 #[test]
1730 fn test_encode_bypass_mixed_in_range_and_bypass() {
1731 let values = [0i32, 5, 1, -3];
1737 let mut enc: EntropyEncoder<RansByte> = EntropyEncoder::new();
1738 enc.initialize(
1739 &PMF_LENGTHS,
1740 &PMF_OFFSETS,
1741 &PMF_TABLE,
1742 SYMBOL_BITS,
1743 BYPASS_BITS,
1744 )
1745 .unwrap();
1746 let mut encoded = Vec::new();
1747 enc.encode(&INDICES, &values, &mut encoded).unwrap();
1748
1749 let mut dec: EntropyDecoder<RansByte> = EntropyDecoder::new();
1750 dec.initialize(
1751 &PMF_LENGTHS,
1752 &PMF_OFFSETS,
1753 &PMF_TABLE,
1754 SYMBOL_BITS,
1755 BYPASS_BITS,
1756 )
1757 .unwrap();
1758 let mut decoded = vec![0i32; 4];
1759 dec.decode(&mut decoded, &INDICES, &encoded).unwrap();
1760 assert_eq!(decoded, values);
1761 }
1762
1763 #[test]
1764 fn test_encode_bypass_negative_outlier_at_boundary() {
1765 let values = [-10i32, 1, 0, 1];
1771 let mut enc: EntropyEncoder<RansByte> = EntropyEncoder::new();
1772 enc.initialize(
1773 &PMF_LENGTHS,
1774 &PMF_OFFSETS,
1775 &PMF_TABLE,
1776 SYMBOL_BITS,
1777 BYPASS_BITS,
1778 )
1779 .unwrap();
1780 let mut encoded = Vec::new();
1781 enc.encode(&INDICES, &values, &mut encoded).unwrap();
1782
1783 let mut dec: EntropyDecoder<RansByte> = EntropyDecoder::new();
1784 dec.initialize(
1785 &PMF_LENGTHS,
1786 &PMF_OFFSETS,
1787 &PMF_TABLE,
1788 SYMBOL_BITS,
1789 BYPASS_BITS,
1790 )
1791 .unwrap();
1792 let mut decoded = vec![0i32; 4];
1793 dec.decode(&mut decoded, &INDICES, &encoded).unwrap();
1794 assert_eq!(decoded, values);
1795 }
1796
1797 #[test]
1798 fn test_encode_bypass_large_positive_outlier() {
1799 let values = [10000i32, 1, 0, 1];
1801 let mut enc: EntropyEncoder<RansByte> = EntropyEncoder::new();
1802 enc.initialize(
1803 &PMF_LENGTHS,
1804 &PMF_OFFSETS,
1805 &PMF_TABLE,
1806 SYMBOL_BITS,
1807 BYPASS_BITS,
1808 )
1809 .unwrap();
1810 let mut encoded = Vec::new();
1811 enc.encode(&INDICES, &values, &mut encoded).unwrap();
1812
1813 let mut dec: EntropyDecoder<RansByte> = EntropyDecoder::new();
1814 dec.initialize(
1815 &PMF_LENGTHS,
1816 &PMF_OFFSETS,
1817 &PMF_TABLE,
1818 SYMBOL_BITS,
1819 BYPASS_BITS,
1820 )
1821 .unwrap();
1822 let mut decoded = vec![0i32; 4];
1823 dec.decode(&mut decoded, &INDICES, &encoded).unwrap();
1824 assert_eq!(decoded, values);
1825 }
1826
1827 #[test]
1832 fn test_encode_bypass_extreme_negative_i32_min_plus_one() {
1833 let values = [i32::MIN + 1, 1, 0, 1];
1837 let mut enc: EntropyEncoder<RansByte> = EntropyEncoder::new();
1838 enc.initialize(
1839 &PMF_LENGTHS,
1840 &PMF_OFFSETS,
1841 &PMF_TABLE,
1842 SYMBOL_BITS,
1843 BYPASS_BITS,
1844 )
1845 .unwrap();
1846 let mut encoded = Vec::new();
1847 let result = enc.encode(&INDICES, &values, &mut encoded);
1848 assert!(result.is_ok() || result == Err(EntropyError::InvalidParams));
1850 }
1851
1852 #[test]
1853 fn test_encode_bypass_extreme_positive_i32_max() {
1854 let values = [i32::MAX, 1, 0, 1];
1856 let mut enc: EntropyEncoder<RansByte> = EntropyEncoder::new();
1857 enc.initialize(
1858 &PMF_LENGTHS,
1859 &PMF_OFFSETS,
1860 &PMF_TABLE,
1861 SYMBOL_BITS,
1862 BYPASS_BITS,
1863 )
1864 .unwrap();
1865 let mut encoded = Vec::new();
1866 let result = enc.encode(&INDICES, &values, &mut encoded);
1867 assert_eq!(result, Err(EntropyError::InvalidParams));
1868 }
1869}