#[rustfmt::skip]
pub static NORM_SHIFT: [u8; 512] = [
9,8,7,7,6,6,6,6,5,5,5,5,5,5,5,5,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
];
#[rustfmt::skip]
pub static LPS_RANGE: [u8; 512] = [
128, 128, 128, 128, 128, 128, 123, 123,
116, 116, 111, 111, 105, 105, 100, 100,
95, 95, 90, 90, 85, 85, 81, 81,
77, 77, 73, 73, 69, 69, 66, 66,
62, 62, 59, 59, 56, 56, 53, 53,
51, 51, 48, 48, 46, 46, 43, 43,
41, 41, 39, 39, 37, 37, 35, 35,
33, 33, 32, 32, 30, 30, 29, 29,
27, 27, 26, 26, 24, 24, 23, 23,
22, 22, 21, 21, 20, 20, 19, 19,
18, 18, 17, 17, 16, 16, 15, 15,
14, 14, 14, 14, 13, 13, 12, 12,
12, 12, 11, 11, 11, 11, 10, 10,
10, 10, 9, 9, 9, 9, 8, 8,
8, 8, 7, 7, 7, 7, 7, 7,
6, 6, 6, 6, 6, 6, 2, 2,
176, 176, 167, 167, 158, 158, 150, 150,
142, 142, 135, 135, 128, 128, 122, 122,
116, 116, 110, 110, 104, 104, 99, 99,
94, 94, 89, 89, 85, 85, 80, 80,
76, 76, 72, 72, 69, 69, 65, 65,
62, 62, 59, 59, 56, 56, 53, 53,
50, 50, 48, 48, 45, 45, 43, 43,
41, 41, 39, 39, 37, 37, 35, 35,
33, 33, 31, 31, 30, 30, 28, 28,
27, 27, 26, 26, 24, 24, 23, 23,
22, 22, 21, 21, 20, 20, 19, 19,
18, 18, 17, 17, 16, 16, 15, 15,
14, 14, 14, 14, 13, 13, 12, 12,
12, 12, 11, 11, 11, 11, 10, 10,
9, 9, 9, 9, 9, 9, 8, 8,
8, 8, 7, 7, 7, 7, 2, 2,
208, 208, 197, 197, 187, 187, 178, 178,
169, 169, 160, 160, 152, 152, 144, 144,
137, 137, 130, 130, 123, 123, 117, 117,
111, 111, 105, 105, 100, 100, 95, 95,
90, 90, 86, 86, 81, 81, 77, 77,
73, 73, 69, 69, 66, 66, 63, 63,
59, 59, 56, 56, 54, 54, 51, 51,
48, 48, 46, 46, 43, 43, 41, 41,
39, 39, 37, 37, 35, 35, 33, 33,
32, 32, 30, 30, 29, 29, 27, 27,
26, 26, 25, 25, 23, 23, 22, 22,
21, 21, 20, 20, 19, 19, 18, 18,
17, 17, 16, 16, 15, 15, 15, 15,
14, 14, 13, 13, 12, 12, 12, 12,
11, 11, 11, 11, 10, 10, 10, 10,
9, 9, 9, 9, 8, 8, 2, 2,
240, 240, 227, 227, 216, 216, 205, 205,
195, 195, 185, 185, 175, 175, 166, 166,
158, 158, 150, 150, 142, 142, 135, 135,
128, 128, 122, 122, 116, 116, 110, 110,
104, 104, 99, 99, 94, 94, 89, 89,
85, 85, 80, 80, 76, 76, 72, 72,
69, 69, 65, 65, 62, 62, 59, 59,
56, 56, 53, 53, 50, 50, 48, 48,
45, 45, 43, 43, 41, 41, 39, 39,
37, 37, 35, 35, 33, 33, 31, 31,
30, 30, 28, 28, 27, 27, 25, 25,
24, 24, 23, 23, 22, 22, 21, 21,
20, 20, 19, 19, 18, 18, 17, 17,
16, 16, 15, 15, 14, 14, 14, 14,
13, 13, 12, 12, 12, 12, 11, 11,
11, 11, 10, 10, 9, 9, 2, 2,
];
#[rustfmt::skip]
pub static MLPS_STATE: [u8; 256] = [
127, 126, 77, 76, 77, 76, 75, 74,
75, 74, 75, 74, 73, 72, 73, 72,
73, 72, 71, 70, 71, 70, 71, 70,
69, 68, 69, 68, 67, 66, 67, 66,
67, 66, 65, 64, 65, 64, 63, 62,
61, 60, 61, 60, 61, 60, 59, 58,
59, 58, 57, 56, 55, 54, 55, 54,
53, 52, 53, 52, 51, 50, 49, 48,
49, 48, 47, 46, 45, 44, 45, 44,
43, 42, 43, 42, 39, 38, 39, 38,
37, 36, 37, 36, 33, 32, 33, 32,
31, 30, 31, 30, 27, 26, 27, 26,
25, 24, 23, 22, 23, 22, 19, 18,
19, 18, 17, 16, 15, 14, 13, 12,
11, 10, 9, 8, 9, 8, 5, 4,
5, 4, 3, 2, 1, 0, 0, 1,
2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25,
26, 27, 28, 29, 30, 31, 32, 33,
34, 35, 36, 37, 38, 39, 40, 41,
42, 43, 44, 45, 46, 47, 48, 49,
50, 51, 52, 53, 54, 55, 56, 57,
58, 59, 60, 61, 62, 63, 64, 65,
66, 67, 68, 69, 70, 71, 72, 73,
74, 75, 76, 77, 78, 79, 80, 81,
82, 83, 84, 85, 86, 87, 88, 89,
90, 91, 92, 93, 94, 95, 96, 97,
98, 99, 100, 101, 102, 103, 104, 105,
106, 107, 108, 109, 110, 111, 112, 113,
114, 115, 116, 117, 118, 119, 120, 121,
122, 123, 124, 125, 124, 125, 126, 127,
];
pub const HEVC_CONTEXTS: usize = 179;
const CNU: u8 = 154;
#[rustfmt::skip]
pub static INIT_VALUES: [[u8; HEVC_CONTEXTS]; 3] = [
[
153,
200,
139, 141, 157,
154,
CNU, CNU, CNU,
154, 154, 154,
CNU,
184, CNU, CNU, CNU,
184,
63, 139,
CNU,
CNU,
CNU, CNU, CNU, CNU, CNU,
CNU, CNU,
CNU, CNU,
CNU, CNU,
CNU, CNU,
CNU,
CNU,
153, 138, 138,
111, 141,
94, 138, 182, 154, 154,
139, 139,
139, 139,
139, 139,
110, 110, 124, 125, 140, 153, 125, 127, 140, 109, 111, 143, 127, 111,
79, 108, 123, 63,
110, 110, 124, 125, 140, 153, 125, 127, 140, 109, 111, 143, 127, 111,
79, 108, 123, 63,
91, 171, 134, 141,
111, 111, 125, 110, 110, 94, 124, 108, 124, 107, 125, 141, 179, 153,
125, 107, 125, 141, 179, 153, 125, 107, 125, 141, 179, 153, 125, 140,
139, 182, 182, 152, 136, 152, 136, 153, 136, 139, 111, 136, 139, 111,
141, 111,
140, 92, 137, 138, 140, 152, 138, 139, 153, 74, 149, 92, 139, 107,
122, 152, 140, 179, 166, 182, 140, 227, 122, 197,
138, 153, 136, 167, 152, 152,
154, 154, 154, 154, 154, 154, 154, 154,
154, 154,
154,
154,
],
[
153,
185,
107, 139, 126,
154,
197, 185, 201,
154, 154, 154,
149,
154, 139, 154, 154,
154,
152, 139,
110,
122,
95, 79, 63, 31, 31,
153, 153,
153, 153,
140, 198,
140, 198,
168,
79,
124, 138, 94,
153, 111,
149, 107, 167, 154, 154,
139, 139,
139, 139,
139, 139,
125, 110, 94, 110, 95, 79, 125, 111, 110, 78, 110, 111, 111, 95,
94, 108, 123, 108,
125, 110, 94, 110, 95, 79, 125, 111, 110, 78, 110, 111, 111, 95,
94, 108, 123, 108,
121, 140, 61, 154,
155, 154, 139, 153, 139, 123, 123, 63, 153, 166, 183, 140, 136, 153,
154, 166, 183, 140, 136, 153, 154, 166, 183, 140, 136, 153, 154, 170,
153, 123, 123, 107, 121, 107, 121, 167, 151, 183, 140, 151, 183, 140,
140, 140,
154, 196, 196, 167, 154, 152, 167, 182, 182, 134, 149, 136, 153, 121,
136, 137, 169, 194, 166, 167, 154, 167, 137, 182,
107, 167, 91, 122, 107, 167,
154, 154, 154, 154, 154, 154, 154, 154,
154, 154,
154,
154,
],
[
153,
160,
107, 139, 126,
154,
197, 185, 201,
154, 154, 154,
134,
154, 139, 154, 154,
183,
152, 139,
154,
137,
95, 79, 63, 31, 31,
153, 153,
153, 153,
169, 198,
169, 198,
168,
79,
224, 167, 122,
153, 111,
149, 92, 167, 154, 154,
139, 139,
139, 139,
139, 139,
125, 110, 124, 110, 95, 94, 125, 111, 111, 79, 125, 126, 111, 111,
79, 108, 123, 93,
125, 110, 124, 110, 95, 94, 125, 111, 111, 79, 125, 126, 111, 111,
79, 108, 123, 93,
121, 140, 61, 154,
170, 154, 139, 153, 139, 123, 123, 63, 124, 166, 183, 140, 136, 153,
154, 166, 183, 140, 136, 153, 154, 166, 183, 140, 136, 153, 154, 170,
153, 138, 138, 122, 121, 122, 121, 167, 151, 183, 140, 151, 183, 140,
140, 140,
154, 196, 167, 167, 154, 152, 167, 182, 182, 134, 149, 136, 153, 121,
136, 122, 169, 208, 166, 167, 154, 152, 167, 182,
107, 167, 91, 107, 107, 167,
154, 154, 154, 154, 154, 154, 154, 154,
154, 154,
154,
154,
],
];
pub mod ctx {
pub const SAO_MERGE_FLAG: usize = 0;
pub const SAO_MERGE_FLAG_LEN: usize = 1;
pub const SAO_TYPE_IDX: usize = 1;
pub const SAO_TYPE_IDX_LEN: usize = 1;
pub const SPLIT_CODING_UNIT_FLAG: usize = 2;
pub const SPLIT_CODING_UNIT_FLAG_LEN: usize = 3;
pub const CU_TRANSQUANT_BYPASS_FLAG: usize = 5;
pub const CU_TRANSQUANT_BYPASS_FLAG_LEN: usize = 1;
pub const SKIP_FLAG: usize = 6;
pub const SKIP_FLAG_LEN: usize = 3;
pub const CU_QP_DELTA: usize = 9;
pub const CU_QP_DELTA_LEN: usize = 3;
pub const PRED_MODE_FLAG: usize = 12;
pub const PRED_MODE_FLAG_LEN: usize = 1;
pub const PART_MODE: usize = 13;
pub const PART_MODE_LEN: usize = 4;
pub const PREV_INTRA_LUMA_PRED_FLAG: usize = 17;
pub const PREV_INTRA_LUMA_PRED_FLAG_LEN: usize = 1;
pub const INTRA_CHROMA_PRED_MODE: usize = 18;
pub const INTRA_CHROMA_PRED_MODE_LEN: usize = 2;
pub const MERGE_FLAG: usize = 20;
pub const MERGE_FLAG_LEN: usize = 1;
pub const MERGE_IDX: usize = 21;
pub const MERGE_IDX_LEN: usize = 1;
pub const INTER_PRED_IDC: usize = 22;
pub const INTER_PRED_IDC_LEN: usize = 5;
pub const REF_IDX_L0: usize = 27;
pub const REF_IDX_L0_LEN: usize = 2;
pub const REF_IDX_L1: usize = 29;
pub const REF_IDX_L1_LEN: usize = 2;
pub const ABS_MVD_GREATER0_FLAG: usize = 31;
pub const ABS_MVD_GREATER0_FLAG_LEN: usize = 2;
pub const ABS_MVD_GREATER1_FLAG: usize = 33;
pub const ABS_MVD_GREATER1_FLAG_LEN: usize = 2;
pub const MVP_LX_FLAG: usize = 35;
pub const MVP_LX_FLAG_LEN: usize = 1;
pub const NO_RESIDUAL_DATA_FLAG: usize = 36;
pub const NO_RESIDUAL_DATA_FLAG_LEN: usize = 1;
pub const SPLIT_TRANSFORM_FLAG: usize = 37;
pub const SPLIT_TRANSFORM_FLAG_LEN: usize = 3;
pub const CBF_LUMA: usize = 40;
pub const CBF_LUMA_LEN: usize = 2;
pub const CBF_CB_CR: usize = 42;
pub const CBF_CB_CR_LEN: usize = 5;
pub const TRANSFORM_SKIP_FLAG: usize = 47;
pub const TRANSFORM_SKIP_FLAG_LEN: usize = 2;
pub const EXPLICIT_RDPCM_FLAG: usize = 49;
pub const EXPLICIT_RDPCM_FLAG_LEN: usize = 2;
pub const EXPLICIT_RDPCM_DIR_FLAG: usize = 51;
pub const EXPLICIT_RDPCM_DIR_FLAG_LEN: usize = 2;
pub const LAST_SIGNIFICANT_COEFF_X_PREFIX: usize = 53;
pub const LAST_SIGNIFICANT_COEFF_X_PREFIX_LEN: usize = 18;
pub const LAST_SIGNIFICANT_COEFF_Y_PREFIX: usize = 71;
pub const LAST_SIGNIFICANT_COEFF_Y_PREFIX_LEN: usize = 18;
pub const SIGNIFICANT_COEFF_GROUP_FLAG: usize = 89;
pub const SIGNIFICANT_COEFF_GROUP_FLAG_LEN: usize = 4;
pub const SIGNIFICANT_COEFF_FLAG: usize = 93;
pub const SIGNIFICANT_COEFF_FLAG_LEN: usize = 44;
pub const COEFF_ABS_LEVEL_GREATER1_FLAG: usize = 137;
pub const COEFF_ABS_LEVEL_GREATER1_FLAG_LEN: usize = 24;
pub const COEFF_ABS_LEVEL_GREATER2_FLAG: usize = 161;
pub const COEFF_ABS_LEVEL_GREATER2_FLAG_LEN: usize = 6;
pub const LOG2_RES_SCALE_ABS: usize = 167;
pub const LOG2_RES_SCALE_ABS_LEN: usize = 8;
pub const RES_SCALE_SIGN_FLAG: usize = 175;
pub const RES_SCALE_SIGN_FLAG_LEN: usize = 2;
pub const CU_CHROMA_QP_OFFSET_FLAG: usize = 177;
pub const CU_CHROMA_QP_OFFSET_FLAG_LEN: usize = 1;
pub const CU_CHROMA_QP_OFFSET_IDX: usize = 178;
pub const CU_CHROMA_QP_OFFSET_IDX_LEN: usize = 1;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_init_values_shape() {
for row in &INIT_VALUES {
assert_eq!(row.len(), HEVC_CONTEXTS);
}
}
#[test]
fn test_ctx_offsets_partition_table() {
let elements: &[(usize, usize)] = &[
(ctx::SAO_MERGE_FLAG, ctx::SAO_MERGE_FLAG_LEN),
(ctx::SAO_TYPE_IDX, ctx::SAO_TYPE_IDX_LEN),
(ctx::SPLIT_CODING_UNIT_FLAG, ctx::SPLIT_CODING_UNIT_FLAG_LEN),
(
ctx::CU_TRANSQUANT_BYPASS_FLAG,
ctx::CU_TRANSQUANT_BYPASS_FLAG_LEN,
),
(ctx::SKIP_FLAG, ctx::SKIP_FLAG_LEN),
(ctx::CU_QP_DELTA, ctx::CU_QP_DELTA_LEN),
(ctx::PRED_MODE_FLAG, ctx::PRED_MODE_FLAG_LEN),
(ctx::PART_MODE, ctx::PART_MODE_LEN),
(
ctx::PREV_INTRA_LUMA_PRED_FLAG,
ctx::PREV_INTRA_LUMA_PRED_FLAG_LEN,
),
(ctx::INTRA_CHROMA_PRED_MODE, ctx::INTRA_CHROMA_PRED_MODE_LEN),
(ctx::MERGE_FLAG, ctx::MERGE_FLAG_LEN),
(ctx::MERGE_IDX, ctx::MERGE_IDX_LEN),
(ctx::INTER_PRED_IDC, ctx::INTER_PRED_IDC_LEN),
(ctx::REF_IDX_L0, ctx::REF_IDX_L0_LEN),
(ctx::REF_IDX_L1, ctx::REF_IDX_L1_LEN),
(ctx::ABS_MVD_GREATER0_FLAG, ctx::ABS_MVD_GREATER0_FLAG_LEN),
(ctx::ABS_MVD_GREATER1_FLAG, ctx::ABS_MVD_GREATER1_FLAG_LEN),
(ctx::MVP_LX_FLAG, ctx::MVP_LX_FLAG_LEN),
(ctx::NO_RESIDUAL_DATA_FLAG, ctx::NO_RESIDUAL_DATA_FLAG_LEN),
(ctx::SPLIT_TRANSFORM_FLAG, ctx::SPLIT_TRANSFORM_FLAG_LEN),
(ctx::CBF_LUMA, ctx::CBF_LUMA_LEN),
(ctx::CBF_CB_CR, ctx::CBF_CB_CR_LEN),
(ctx::TRANSFORM_SKIP_FLAG, ctx::TRANSFORM_SKIP_FLAG_LEN),
(ctx::EXPLICIT_RDPCM_FLAG, ctx::EXPLICIT_RDPCM_FLAG_LEN),
(
ctx::EXPLICIT_RDPCM_DIR_FLAG,
ctx::EXPLICIT_RDPCM_DIR_FLAG_LEN,
),
(
ctx::LAST_SIGNIFICANT_COEFF_X_PREFIX,
ctx::LAST_SIGNIFICANT_COEFF_X_PREFIX_LEN,
),
(
ctx::LAST_SIGNIFICANT_COEFF_Y_PREFIX,
ctx::LAST_SIGNIFICANT_COEFF_Y_PREFIX_LEN,
),
(
ctx::SIGNIFICANT_COEFF_GROUP_FLAG,
ctx::SIGNIFICANT_COEFF_GROUP_FLAG_LEN,
),
(ctx::SIGNIFICANT_COEFF_FLAG, ctx::SIGNIFICANT_COEFF_FLAG_LEN),
(
ctx::COEFF_ABS_LEVEL_GREATER1_FLAG,
ctx::COEFF_ABS_LEVEL_GREATER1_FLAG_LEN,
),
(
ctx::COEFF_ABS_LEVEL_GREATER2_FLAG,
ctx::COEFF_ABS_LEVEL_GREATER2_FLAG_LEN,
),
(ctx::LOG2_RES_SCALE_ABS, ctx::LOG2_RES_SCALE_ABS_LEN),
(ctx::RES_SCALE_SIGN_FLAG, ctx::RES_SCALE_SIGN_FLAG_LEN),
(
ctx::CU_CHROMA_QP_OFFSET_FLAG,
ctx::CU_CHROMA_QP_OFFSET_FLAG_LEN,
),
(
ctx::CU_CHROMA_QP_OFFSET_IDX,
ctx::CU_CHROMA_QP_OFFSET_IDX_LEN,
),
];
let mut expected = 0usize;
for &(offset, len) in elements {
assert_eq!(offset, expected, "non-contiguous offsets at {offset}");
expected += len;
}
assert_eq!(expected, HEVC_CONTEXTS);
}
#[test]
fn test_split_cu_flag_init_value() {
assert_eq!(INIT_VALUES[0][ctx::SPLIT_CODING_UNIT_FLAG], 139);
assert_eq!(INIT_VALUES[0][ctx::SPLIT_CODING_UNIT_FLAG + 1], 141);
assert_eq!(INIT_VALUES[0][ctx::SPLIT_CODING_UNIT_FLAG + 2], 157);
}
#[test]
fn test_last_sig_coeff_x_prefix_tail() {
assert_eq!(
INIT_VALUES[0][ctx::LAST_SIGNIFICANT_COEFF_X_PREFIX
+ ctx::LAST_SIGNIFICANT_COEFF_X_PREFIX_LEN
- 1],
63
);
}
#[test]
fn test_cbf_luma_init_values() {
assert_eq!(INIT_VALUES[0][ctx::CBF_LUMA], 111);
assert_eq!(INIT_VALUES[0][ctx::CBF_LUMA + 1], 141);
}
}