1#[rustfmt::skip]
24static TRANSITION_MPS: [u8; 64] = [
25 1, 2, 3, 4, 5, 6, 7, 8,
26 9, 10, 11, 12, 13, 14, 15, 16,
27 17, 18, 19, 20, 21, 22, 23, 24,
28 25, 26, 27, 28, 29, 30, 31, 32,
29 33, 34, 35, 36, 37, 38, 39, 40,
30 41, 42, 43, 44, 45, 46, 47, 48,
31 49, 50, 51, 52, 53, 54, 55, 56,
32 57, 58, 59, 60, 61, 62, 62, 63,
33];
34
35#[rustfmt::skip]
38static TRANSITION_LPS: [u8; 64] = [
39 0, 0, 1, 2, 2, 4, 4, 5,
40 6, 7, 8, 9, 9, 11, 11, 12,
41 13, 13, 15, 15, 16, 16, 18, 18,
42 19, 19, 21, 21, 22, 22, 23, 24,
43 24, 25, 26, 26, 27, 27, 28, 29,
44 29, 30, 30, 30, 31, 32, 32, 33,
45 33, 33, 34, 34, 35, 35, 35, 36,
46 36, 36, 37, 37, 37, 38, 38, 63,
47];
48
49#[rustfmt::skip]
58static RANGE_TABLE: [[u16; 4]; 64] = [
59 [128, 176, 208, 240],
60 [128, 167, 197, 227],
61 [128, 158, 187, 216],
62 [123, 150, 178, 205],
63 [116, 142, 169, 195],
64 [111, 135, 160, 185],
65 [105, 128, 152, 175],
66 [100, 122, 144, 166],
67 [ 95, 116, 137, 158],
68 [ 90, 110, 130, 150],
69 [ 85, 104, 123, 142],
70 [ 81, 99, 117, 135],
71 [ 77, 94, 111, 128],
72 [ 73, 89, 105, 122],
73 [ 69, 85, 100, 116],
74 [ 66, 80, 95, 110],
75 [ 62, 76, 90, 104],
76 [ 59, 72, 86, 99],
77 [ 56, 69, 81, 94],
78 [ 53, 65, 77, 89],
79 [ 51, 62, 73, 85],
80 [ 48, 59, 69, 80],
81 [ 46, 56, 66, 76],
82 [ 43, 53, 63, 72],
83 [ 41, 50, 59, 69],
84 [ 39, 48, 56, 65],
85 [ 37, 45, 54, 62],
86 [ 35, 43, 51, 59],
87 [ 33, 41, 48, 56],
88 [ 32, 39, 46, 53],
89 [ 30, 37, 43, 50],
90 [ 29, 35, 41, 48],
91 [ 27, 33, 39, 45],
92 [ 26, 31, 37, 43],
93 [ 24, 30, 35, 41],
94 [ 23, 28, 33, 39],
95 [ 22, 27, 32, 37],
96 [ 21, 26, 30, 35],
97 [ 20, 24, 29, 33],
98 [ 19, 23, 27, 31],
99 [ 18, 22, 26, 30],
100 [ 17, 21, 25, 28],
101 [ 16, 20, 23, 27],
102 [ 15, 19, 22, 25],
103 [ 14, 18, 21, 24],
104 [ 14, 17, 20, 23],
105 [ 13, 16, 19, 22],
106 [ 12, 15, 18, 21],
107 [ 12, 14, 17, 20],
108 [ 11, 14, 16, 19],
109 [ 11, 13, 15, 18],
110 [ 10, 12, 15, 17],
111 [ 10, 12, 14, 16],
112 [ 9, 11, 13, 15],
113 [ 9, 11, 12, 14],
114 [ 8, 10, 12, 14],
115 [ 8, 9, 11, 13],
116 [ 7, 9, 11, 12],
117 [ 7, 9, 10, 12],
118 [ 7, 8, 10, 11],
119 [ 6, 8, 9, 11],
120 [ 6, 7, 9, 10],
121 [ 6, 7, 8, 9],
122 [ 2, 2, 2, 2],
123];
124
125pub const NUM_CABAC_CONTEXTS: usize = 460;
131
132#[derive(Debug, Clone)]
134pub struct CabacContext {
135 pub state: u8,
137 pub mps: bool,
139}
140
141impl CabacContext {
142 pub fn new(slice_qp: i32, init_value: i16) -> Self {
145 let m = (init_value >> 4) * 5 - 45;
146 let n = ((init_value & 15) << 3) - 16;
147 let pre = ((m * (slice_qp.clamp(0, 51) as i16 - 16)) >> 4) + n;
148 let pre = pre.clamp(1, 126);
149
150 if pre <= 63 {
151 CabacContext {
152 state: (63 - pre) as u8,
153 mps: false,
154 }
155 } else {
156 CabacContext {
157 state: (pre - 64) as u8,
158 mps: true,
159 }
160 }
161 }
162
163 pub fn equiprobable() -> Self {
165 CabacContext {
166 state: 0,
167 mps: false,
168 }
169 }
170}
171
172pub fn init_cabac_contexts(slice_qp: i32) -> Vec<CabacContext> {
179 let default_init: i16 = 0x7E; (0..NUM_CABAC_CONTEXTS)
182 .map(|_| CabacContext::new(slice_qp, default_init))
183 .collect()
184}
185
186pub struct CabacDecoder<'a> {
192 data: &'a [u8],
193 offset: usize,
194 bits_left: u32,
195 range: u32,
197 value: u32,
199}
200
201impl<'a> CabacDecoder<'a> {
202 pub fn new(data: &'a [u8]) -> Self {
207 let mut dec = CabacDecoder {
208 data,
209 offset: 0,
210 bits_left: 0,
211 range: 510,
212 value: 0,
213 };
214 dec.value = dec.read_bits(9);
216 dec
217 }
218
219 fn read_bit(&mut self) -> u32 {
224 if self.bits_left == 0 {
225 if self.offset < self.data.len() {
226 self.bits_left = 8;
227 self.offset += 1;
228 } else {
229 return 0;
230 }
231 }
232 self.bits_left -= 1;
233 let byte = self.data[self.offset - 1];
234 (u32::from(byte) >> self.bits_left) & 1
235 }
236
237 fn read_bits(&mut self, n: u32) -> u32 {
238 let mut val = 0u32;
239 for _ in 0..n {
240 val = (val << 1) | self.read_bit();
241 }
242 val
243 }
244
245 fn renorm(&mut self) {
250 while self.range < 256 {
251 self.range <<= 1;
252 self.value = (self.value << 1) | self.read_bit();
253 }
254 }
255
256 pub fn decode_decision(&mut self, ctx: &mut CabacContext) -> bool {
262 let q_idx = (self.range >> 6) & 3;
263 let lps_range = RANGE_TABLE[ctx.state as usize][q_idx as usize] as u32;
264 self.range -= lps_range;
265
266 if self.value < self.range {
267 ctx.state = TRANSITION_MPS[ctx.state as usize];
269 self.renorm();
270 ctx.mps
271 } else {
272 self.value -= self.range;
274 self.range = lps_range;
275 if ctx.state == 0 {
276 ctx.mps = !ctx.mps;
277 }
278 ctx.state = TRANSITION_LPS[ctx.state as usize];
279 self.renorm();
280 !ctx.mps
281 }
282 }
283
284 pub fn decode_bypass(&mut self) -> bool {
286 self.value = (self.value << 1) | self.read_bit();
287 if self.value >= self.range {
288 self.value -= self.range;
289 true
290 } else {
291 false
292 }
293 }
294
295 pub fn decode_terminate(&mut self) -> bool {
297 self.range -= 2;
298 if self.value >= self.range {
299 true
300 } else {
301 self.renorm();
302 false
303 }
304 }
305
306 pub fn bytes_remaining(&self) -> usize {
308 let full_bytes = self.data.len().saturating_sub(self.offset);
309 if self.bits_left > 0 {
310 full_bytes + 1
311 } else {
312 full_bytes
313 }
314 }
315}
316
317pub fn decode_unary(decoder: &mut CabacDecoder<'_>, ctx: &mut CabacContext, max_bins: u32) -> u32 {
323 let mut val = 0u32;
324 while val < max_bins {
325 if decoder.decode_decision(ctx) {
326 val += 1;
327 } else {
328 return val;
329 }
330 }
331 val
332}
333
334pub fn decode_truncated_unary(
336 decoder: &mut CabacDecoder<'_>,
337 ctx: &mut CabacContext,
338 max_val: u32,
339) -> u32 {
340 if max_val == 0 {
341 return 0;
342 }
343 let mut val = 0u32;
344 while val < max_val {
345 if decoder.decode_decision(ctx) {
346 val += 1;
347 } else {
348 return val;
349 }
350 }
351 val
352}
353
354pub fn decode_fixed_length(decoder: &mut CabacDecoder<'_>, n: u32) -> u32 {
356 let mut val = 0u32;
357 for _ in 0..n {
358 val = (val << 1) | (decoder.decode_bypass() as u32);
359 }
360 val
361}
362
363pub fn decode_exp_golomb_bypass(decoder: &mut CabacDecoder<'_>, k: u32) -> u32 {
365 let mut order = 0u32;
366 while decoder.decode_bypass() {
368 order += 1;
369 if order > 16 {
370 return 0; }
372 }
373 let suffix_len = order + k;
375 let mut val = (1u32 << order) - 1;
376 if suffix_len > 0 {
377 val += decode_fixed_length(decoder, suffix_len);
378 }
379 val
380}
381
382pub mod ctx {
388 pub const MB_TYPE_I_START: usize = 3;
390 pub const MB_TYPE_P_START: usize = 14;
392 pub const CODED_BLOCK_FLAG_LUMA: usize = 85;
394 pub const SIGNIFICANT_COEFF_START: usize = 105;
396 pub const LAST_SIGNIFICANT_COEFF_START: usize = 166;
398 pub const COEFF_ABS_LEVEL_START: usize = 227;
400}
401
402pub fn decode_mb_type_i_slice(
408 decoder: &mut CabacDecoder<'_>,
409 contexts: &mut [CabacContext],
410) -> u32 {
411 let ci = ctx::MB_TYPE_I_START;
413 if !decoder.decode_decision(&mut contexts[ci]) {
414 return 0; }
416 if decoder.decode_terminate() {
418 return 25; }
420 let sub = decode_truncated_unary(decoder, &mut contexts[ci + 2], 23);
422 1 + sub }
424
425pub fn decode_mb_type_p_slice(
427 decoder: &mut CabacDecoder<'_>,
428 contexts: &mut [CabacContext],
429) -> u32 {
430 let ci = ctx::MB_TYPE_P_START;
431 if !decoder.decode_decision(&mut contexts[ci]) {
432 if !decoder.decode_decision(&mut contexts[ci + 1]) {
434 return 0; }
436 if !decoder.decode_decision(&mut contexts[ci + 2]) {
437 return 1; }
439 return 2; }
441 if !decoder.decode_decision(&mut contexts[ci + 3]) {
442 return 3; }
444 let intra_type = decode_mb_type_i_slice(decoder, contexts);
446 5 + intra_type
447}
448
449pub fn decode_coded_block_flag(
451 decoder: &mut CabacDecoder<'_>,
452 contexts: &mut [CabacContext],
453 ctx_offset: usize,
454) -> bool {
455 let ci = ctx::CODED_BLOCK_FLAG_LUMA + ctx_offset.min(3);
456 decoder.decode_decision(&mut contexts[ci])
457}
458
459pub fn decode_residual_block_cabac(
463 decoder: &mut CabacDecoder<'_>,
464 contexts: &mut [CabacContext],
465 max_num_coeff: usize,
466) -> Vec<i32> {
467 let mut coeffs = vec![0i32; max_num_coeff];
468
469 let mut significant = vec![false; max_num_coeff];
471 let mut last = vec![false; max_num_coeff];
472 let mut num_coeff = 0usize;
473
474 for i in 0..max_num_coeff - 1 {
475 let sig_ci = ctx::SIGNIFICANT_COEFF_START + i.min(14);
476 significant[i] = decoder.decode_decision(&mut contexts[sig_ci]);
477 if significant[i] {
478 let last_ci = ctx::LAST_SIGNIFICANT_COEFF_START + i.min(14);
479 last[i] = decoder.decode_decision(&mut contexts[last_ci]);
480 num_coeff += 1;
481 if last[i] {
482 break;
483 }
484 }
485 }
486 if num_coeff > 0 && !last.iter().any(|&l| l) {
488 significant[max_num_coeff - 1] = true;
489 num_coeff += 1;
490 }
491
492 if num_coeff == 0 {
493 return coeffs;
494 }
495
496 let sig_positions: Vec<usize> = (0..max_num_coeff).filter(|&i| significant[i]).collect();
498
499 let mut num_gt1 = 0u32;
500 let mut num_eq1 = 0u32;
501
502 for &pos in sig_positions.iter().rev() {
503 let ctx_cat = (num_gt1.min(4)) as usize;
505 let ci = ctx::COEFF_ABS_LEVEL_START + ctx_cat;
506 let prefix = decode_truncated_unary(decoder, &mut contexts[ci], 14);
507 let abs_level = if prefix < 14 {
508 prefix + 1
509 } else {
510 let suffix = decode_exp_golomb_bypass(decoder, 0);
512 prefix + 1 + suffix
513 };
514
515 let sign = decoder.decode_bypass();
517 coeffs[pos] = if sign {
518 -(abs_level as i32)
519 } else {
520 abs_level as i32
521 };
522
523 if abs_level == 1 {
524 num_eq1 += 1;
525 }
526 if abs_level > 1 {
527 num_gt1 += 1;
528 }
529 }
530
531 let _ = num_eq1; coeffs
534}
535
536#[derive(Debug, Clone, Copy, PartialEq, Eq)]
538pub enum EntropyCodingMode {
539 Cavlc,
541 Cabac,
543}
544
545impl EntropyCodingMode {
546 pub fn from_flag(flag: bool) -> Self {
548 if flag {
549 EntropyCodingMode::Cabac
550 } else {
551 EntropyCodingMode::Cavlc
552 }
553 }
554}
555
556#[cfg(test)]
561mod tests {
562 use super::*;
563
564 #[test]
565 fn test_cabac_context_init_equiprobable() {
566 let ctx = CabacContext::equiprobable();
567 assert_eq!(ctx.state, 0);
568 assert!(!ctx.mps);
569 }
570
571 #[test]
572 fn test_cabac_context_init_from_value() {
573 let ctx = CabacContext::new(26, 0x7E);
579 assert_eq!(ctx.state, 25);
580 assert!(ctx.mps);
581 }
582
583 #[test]
584 fn test_cabac_decode_bypass_deterministic() {
585 let data = [0x00, 0x00, 0x00, 0x00];
587 let mut dec = CabacDecoder::new(&data);
588 for _ in 0..8 {
589 assert!(!dec.decode_bypass());
590 }
591 }
592
593 #[test]
594 fn test_cabac_decode_terminate_on_end() {
595 let data = [0xFF, 0xFF, 0xFF, 0xFF];
599 let mut dec = CabacDecoder::new(&data);
600 assert!(dec.decode_terminate());
603 }
604
605 #[test]
606 fn test_cabac_decode_decision_updates_state() {
607 let data = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
608 let mut dec = CabacDecoder::new(&data);
609 let mut ctx = CabacContext::equiprobable();
610 let initial_state = ctx.state;
611
612 let _bin = dec.decode_decision(&mut ctx);
614 assert!(ctx.state <= 63);
617 let _ = initial_state;
618 }
619
620 #[test]
621 fn test_decode_unary_zero() {
622 let data = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
626 let mut dec = CabacDecoder::new(&data);
627 let mut ctx = CabacContext::equiprobable();
628 let val = decode_unary(&mut dec, &mut ctx, 10);
629 assert_eq!(val, 0);
632 }
633
634 #[test]
635 fn test_fixed_length_decode() {
636 let data = [0xFF, 0xFF, 0xFF, 0xFF];
638 let mut dec = CabacDecoder::new(&data);
639 let val = decode_fixed_length(&mut dec, 3);
640 assert_eq!(val, 7);
642 }
643
644 #[test]
645 fn test_entropy_coding_mode_from_flag() {
646 assert_eq!(
647 EntropyCodingMode::from_flag(false),
648 EntropyCodingMode::Cavlc
649 );
650 assert_eq!(EntropyCodingMode::from_flag(true), EntropyCodingMode::Cabac);
651 }
652
653 #[test]
654 fn test_init_cabac_contexts_count() {
655 let contexts = init_cabac_contexts(26);
656 assert_eq!(contexts.len(), NUM_CABAC_CONTEXTS);
657 }
658
659 #[test]
660 fn test_decode_residual_block_length() {
661 let data = [0x00; 32];
664 let mut dec = CabacDecoder::new(&data);
665 let mut contexts = init_cabac_contexts(26);
666 let coeffs = decode_residual_block_cabac(&mut dec, &mut contexts, 16);
667 assert_eq!(coeffs.len(), 16);
668
669 let data2 = [0x00; 32];
671 let mut dec2 = CabacDecoder::new(&data2);
672 let mut contexts2 = init_cabac_contexts(26);
673 let coeffs2 = decode_residual_block_cabac(&mut dec2, &mut contexts2, 4);
674 assert_eq!(coeffs2.len(), 4);
675 }
676
677 #[test]
678 fn test_transition_table_bounds() {
679 for &s in TRANSITION_MPS.iter() {
681 assert!(s <= 63);
682 }
683 for &s in TRANSITION_LPS.iter() {
684 assert!(s <= 63);
685 }
686 }
687
688 #[test]
689 fn test_range_table_positive() {
690 for row in RANGE_TABLE.iter() {
692 for &val in row.iter() {
693 assert!(val > 0);
694 }
695 }
696 }
697}