use crate::av2::cdf_state::{CdfState, update_cdf};
pub(crate) static MIN_PROB: [[u16; 8]; 8] = [
[63, 65535, 65535, 65535, 65535, 65535, 65535, 65535],
[47, 87, 65535, 65535, 65535, 65535, 65535, 65535],
[31, 63, 95, 65535, 65535, 65535, 65535, 65535],
[31, 55, 79, 103, 65535, 65535, 65535, 65535],
[23, 47, 63, 87, 111, 65535, 65535, 65535],
[23, 39, 55, 79, 95, 111, 65535, 65535],
[15, 31, 47, 63, 79, 95, 111, 65535],
[15, 31, 47, 63, 79, 95, 111, 65535],
];
pub(crate) struct ByteWriter {
bytes: Vec<u8>,
accumulator: u64,
pending_bits: u32,
}
impl ByteWriter {
pub(crate) fn new() -> Self {
ByteWriter {
bytes: vec![],
accumulator: 0,
pending_bits: 0,
}
}
pub(crate) fn write_bit(&mut self, bit: u32) {
self.accumulator = (self.accumulator << 1) | (bit as u64 & 1);
self.pending_bits += 1;
if self.pending_bits == 8 {
self.bytes.push(self.accumulator as u8);
self.accumulator = 0;
self.pending_bits = 0;
}
}
pub(crate) fn write_bits(&mut self, value: u32, count: u32) {
for i in (0..count).rev() {
self.write_bit((value >> i) & 1);
}
}
pub(crate) fn write_uvlc(&mut self, value: u32) {
let shifted = value + 1;
let leading_zeros = 31 - shifted.leading_zeros();
for _ in 0..leading_zeros {
self.write_bit(0);
}
self.write_bits(shifted, leading_zeros + 1);
}
pub(crate) fn write_uniform(&mut self, value: u32, max: u32) {
let bits = (31 - max.leading_zeros()) + 1;
let threshold = (1u32 << bits) - max;
if value < threshold {
self.write_bits(value, bits - 1);
} else {
let widened = value + threshold;
self.write_bits(widened >> 1, bits - 1);
self.write_bit(widened & 1);
}
}
pub(crate) fn align_with_one(&mut self) {
self.write_bit(1);
while self.pending_bits != 0 {
self.write_bit(0);
}
}
pub(crate) fn align_with_zero(&mut self) {
while self.pending_bits != 0 {
self.write_bit(0);
}
}
pub(crate) fn into_bytes(self) -> Vec<u8> {
self.bytes
}
}
pub(crate) struct RangeEncoder {
low: u64,
pub(crate) range: u32,
count: i32,
output: Vec<u16>,
pub(crate) qc: usize,
pub(crate) delta_q_present: bool,
pub(crate) delta_q_signaled: i32,
pub(crate) delta_q_pending: bool,
pub(crate) ccso_u_enable: bool,
pub(crate) ccso_v_enable: bool,
pub(crate) ccso_pending: bool,
pub(crate) ccso_grid: Vec<u8>,
pub(crate) ccso_grid_v: Vec<u8>,
pub(crate) ccso_cols: usize,
pub(crate) ccso_sb_rc: (usize, usize),
pub(crate) ccso_u_result: Option<crate::av2::ccso::PlaneResult>,
pub(crate) ccso_v_result: Option<crate::av2::ccso::PlaneResult>,
pub(crate) ccso_decided_u: Option<(crate::av2::ccso::CcsoEdgeResult, Vec<u8>)>,
pub(crate) ccso_decided_v: Option<(crate::av2::ccso::CcsoEdgeResult, Vec<u8>)>,
pub(crate) ccso_sb_cols_out: usize,
pub(crate) cfl: bool,
pub(crate) cfl_ctx: usize,
pub(crate) cfl_use: bool,
pub(crate) cfl_js: u8,
pub(crate) cfl_mag_u: u8,
pub(crate) cfl_mag_v: u8,
pub(crate) cfl_ctx_u: usize,
pub(crate) cfl_ctx_v: usize,
pub(crate) uv_mode: usize,
pub(crate) cdf_state: Option<Box<CdfState>>,
}
impl RangeEncoder {
pub(crate) fn new() -> Self {
RangeEncoder {
low: 0,
range: 0x8000,
count: -9,
output: vec![],
qc: 1,
delta_q_present: false,
delta_q_signaled: 0,
delta_q_pending: false,
ccso_u_enable: false,
ccso_v_enable: false,
ccso_pending: false,
ccso_grid: Vec::new(),
ccso_grid_v: Vec::new(),
ccso_cols: 0,
ccso_sb_rc: (0, 0),
ccso_u_result: None,
ccso_v_result: None,
ccso_decided_u: None,
ccso_decided_v: None,
ccso_sb_cols_out: 0,
cfl: false,
cfl_ctx: 0,
cfl_use: false,
cfl_js: 0,
cfl_mag_u: 0,
cfl_mag_v: 0,
cfl_ctx_u: 0,
cfl_ctx_v: 0,
uv_mode: 0,
cdf_state: None,
}
}
pub(crate) fn enable_adaptive_cdf(&mut self, qc: usize) {
self.cdf_state = Some(Box::new(CdfState::new(qc)));
}
fn normalize(&mut self, mut low: u64, range: u32) {
let base_count = self.count;
let shift = 16 - (32 - range.leading_zeros()) as i32;
let mut remaining = base_count + shift;
if remaining >= 0 {
let mut bit_pos = base_count + 16;
let mut mask: u64 = (1u64 << bit_pos) - 1;
if remaining >= 8 {
self.output.push((low >> bit_pos) as u16);
low &= mask;
bit_pos -= 8;
mask >>= 8;
}
self.output.push((low >> bit_pos) as u16);
remaining = bit_pos + shift - 24;
low &= mask;
}
self.low = low << shift;
self.range = range << shift;
self.count = remaining;
}
fn boundary(scaled_range: u32, icdf: &[u16], min_prob: &[u16; 8], k: usize) -> u32 {
((scaled_range * (icdf[k] as u32 | 127).saturating_sub(min_prob[k] as u32)) >> 10) << 3
}
pub(crate) fn encode_symbol(&mut self, icdf: &[u16], s: usize, nsyms: usize) {
let range = self.range;
let scaled_range = range >> 8;
let min_prob = &MIN_PROB[nsyms - 1];
let upper = if s == 0 {
range
} else {
Self::boundary(scaled_range, icdf, min_prob, s - 1)
};
let lower = Self::boundary(scaled_range, icdf, min_prob, s);
let low = self.low + (range - upper) as u64;
self.normalize(low, upper - lower);
}
pub(crate) fn encode_symbol_esc(&mut self, cdf: &[u16], s: usize, nsyms: usize) {
let mut buf = [0u16; 16];
let n = cdf.len();
buf[..n].copy_from_slice(cdf);
self.encode_symbol(&buf[..n + 1], s, nsyms);
}
pub(crate) fn encode_bool(&mut self, cdf: u32, bit: u32) {
let range = self.range;
let split = (((range >> 8) * (((cdf >> 7) << 4) + 8)) >> 7) << 3;
let (low, range) = if bit != 0 {
(self.low + (range - split) as u64, split)
} else {
(self.low, range - split)
};
self.normalize(low, range);
}
fn normalize_bypass(&mut self, mut low: u64, range: u32, bypass_bits: i32) {
let base_count = self.count + bypass_bits;
let mut remaining = base_count;
if remaining >= 0 {
let mut bit_pos = base_count + 16;
let mut mask: u64 = (1u64 << bit_pos) - 1;
if remaining >= 8 {
self.output.push((low >> bit_pos) as u16);
low &= mask;
bit_pos -= 8;
mask >>= 8;
}
self.output.push((low >> bit_pos) as u16);
remaining = bit_pos - 24;
low &= mask;
}
self.low = low;
self.range = range;
self.count = remaining;
}
pub(crate) fn encode_bypass(&mut self, value: u32, bit_count: u32) {
let range = self.range;
let low = (self.low << bit_count) + (range as u64) * (value as u64);
self.normalize_bypass(low, range, bit_count as i32);
}
pub(crate) fn finish(mut self) -> Vec<u8> {
let low = self.low;
let mut count = self.count;
let mut remaining = 10 + count;
let mask: u64 = 0x3FFF;
let mut end = ((low + mask) & !mask) | (mask + 1);
if remaining > 0 {
let mut byte_mask: u64 = (1u64 << (count + 16)) - 1;
loop {
self.output.push((end >> (count + 16)) as u16);
end &= byte_mask;
remaining -= 8;
count -= 8;
byte_mask >>= 8;
if remaining <= 0 {
break;
}
}
}
let len = self.output.len();
let mut bytes = vec![0u8; len];
let mut carry: u32 = 0;
let mut i = len;
while i > 0 {
i -= 1;
let x = self.output[i] as u32 + carry;
bytes[i] = (x & 0xff) as u8;
carry = x >> 8;
}
bytes
}
}
impl RangeEncoder {
#[inline]
fn sym_static(&mut self, icdf: &[u16], s: usize, nsyms: usize) {
if s == nsyms {
self.encode_symbol_esc(icdf, s, nsyms);
} else {
self.encode_symbol(icdf, s, nsyms);
}
}
#[inline]
fn sym_mut_inner(
low: &mut u64,
range_ref: &mut u32,
count_ref: &mut i32,
output: &mut Vec<u16>,
cdf: &mut [u16],
s: usize,
nsyms_mt: usize,
) {
let range = *range_ref;
let scaled_range = range >> 8;
let min_prob = &MIN_PROB[nsyms_mt - 1];
let has_sentinel = cdf[nsyms_mt - 1] == 0;
let nsyms_avm = if has_sentinel { nsyms_mt } else { nsyms_mt + 1 };
let icdf = &cdf[..=nsyms_mt];
let upper = if s == 0 {
range
} else {
Self::boundary(scaled_range, icdf, min_prob, s - 1)
};
let lower = Self::boundary(scaled_range, icdf, min_prob, s);
let new_low = *low + (range - upper) as u64;
let new_range = upper - lower;
let shift = 16 - (32 - new_range.leading_zeros()) as i32;
let mut remaining = *count_ref + shift;
let mut lo = new_low;
if remaining >= 0 {
let mut bit_pos = *count_ref + 16;
let mut mask: u64 = (1u64 << bit_pos) - 1;
if remaining >= 8 {
output.push((lo >> bit_pos) as u16);
lo &= mask;
bit_pos -= 8;
mask >>= 8;
}
output.push((lo >> bit_pos) as u16);
remaining = bit_pos + shift - 24;
lo &= mask;
}
*low = lo << shift;
*range_ref = new_range << shift;
*count_ref = remaining;
update_cdf(cdf, s, nsyms_avm);
}
pub(crate) fn sym_luma8_hf(&mut self, ctx: usize, s: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.luma8_hf[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
3,
);
} else {
use crate::av2::cdfs_qctx::LUMA8_BASE_TOK_HF_QC;
self.sym_static(&LUMA8_BASE_TOK_HF_QC[self.qc][ctx], s, 3);
}
}
pub(crate) fn sym_luma8_lf(&mut self, ctx: usize, s: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.luma8_lf[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
5,
);
} else {
use crate::av2::cdfs_qctx::LUMA8_BASE_TOK_LF_QC;
self.sym_static(&LUMA8_BASE_TOK_LF_QC[self.qc][ctx], s, 5);
}
}
pub(crate) fn sym_luma8_eob_hf(&mut self, ctx: usize, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.luma8_eob_hf[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfs_qctx::LUMA8_EOB_TOK_HF_QC;
self.sym_static(&LUMA8_EOB_TOK_HF_QC[self.qc][ctx], s, nsyms);
}
}
pub(crate) fn sym_luma8_eob_lf(&mut self, ctx: usize, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.luma8_eob_lf[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfs_qctx::LUMA8_EOB_TOK_LF_QC;
self.sym_static(&LUMA8_EOB_TOK_LF_QC[self.qc][ctx], s, nsyms);
}
}
pub(crate) fn sym_luma16_hf(&mut self, ctx: usize, s: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.luma16_hf[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
3,
);
} else {
use crate::av2::cdfs_qctx::LUMA16_BASE_TOK_HF_QC;
self.sym_static(&LUMA16_BASE_TOK_HF_QC[self.qc][ctx], s, 3);
}
}
pub(crate) fn sym_luma16_lf(&mut self, ctx: usize, s: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.luma16_lf[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
5,
);
} else {
use crate::av2::cdfs_qctx::LUMA16_BASE_TOK_LF_QC;
self.sym_static(&LUMA16_BASE_TOK_LF_QC[self.qc][ctx], s, 5);
}
}
pub(crate) fn sym_luma16_eob_hf(&mut self, ctx: usize, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.luma16_eob_hf[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfs_qctx::LUMA16_EOB_TOK_HF_QC;
self.sym_static(&LUMA16_EOB_TOK_HF_QC[self.qc][ctx], s, nsyms);
}
}
pub(crate) fn sym_luma16_eob_lf(&mut self, ctx: usize, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.luma16_eob_lf[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfs_qctx::LUMA16_EOB_TOK_LF_QC;
self.sym_static(&LUMA16_EOB_TOK_LF_QC[self.qc][ctx], s, nsyms);
}
}
pub(crate) fn sym_luma32_hf(&mut self, ctx: usize, s: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.luma32_hf[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
3,
);
} else {
use crate::av2::cdfs_qctx::LUMA32_BASE_TOK_HF_QC;
self.sym_static(&LUMA32_BASE_TOK_HF_QC[self.qc][ctx], s, 3);
}
}
pub(crate) fn sym_luma32_lf(&mut self, ctx: usize, s: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.luma32_lf[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
5,
);
} else {
use crate::av2::cdfs_qctx::LUMA32_BASE_TOK_LF_QC;
self.sym_static(&LUMA32_BASE_TOK_LF_QC[self.qc][ctx], s, 5);
}
}
pub(crate) fn sym_luma32_eob_hf(&mut self, ctx: usize, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.luma32_eob_hf[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfs_qctx::LUMA32_EOB_TOK_HF_QC;
self.sym_static(&LUMA32_EOB_TOK_HF_QC[self.qc][ctx], s, nsyms);
}
}
pub(crate) fn sym_luma32_eob_lf(&mut self, ctx: usize, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.luma32_eob_lf[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfs_qctx::LUMA32_EOB_TOK_LF_QC;
self.sym_static(&LUMA32_EOB_TOK_LF_QC[self.qc][ctx], s, nsyms);
}
}
pub(crate) fn sym_chr_hf(&mut self, ctx: usize, s: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.chr_hf[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
3,
);
} else {
use crate::av2::cdfs_qctx::CHROMA_BASE_TOK_HF_QC;
self.sym_static(&CHROMA_BASE_TOK_HF_QC[self.qc][ctx], s, 3);
}
}
pub(crate) fn sym_chr_lf(&mut self, ctx: usize, s: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.chr_lf[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
5,
);
} else {
use crate::av2::cdfs_qctx::CHROMA_BASE_TOK_LF_QC;
self.sym_static(&CHROMA_BASE_TOK_LF_QC[self.qc][ctx], s, 5);
}
}
pub(crate) fn sym_chr_eob_hf(&mut self, ctx: usize, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.chr_eob_hf[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfs_qctx::CHROMA_EOB_TOK_HF_QC;
self.sym_static(&CHROMA_EOB_TOK_HF_QC[self.qc][ctx], s, nsyms);
}
}
pub(crate) fn sym_chr_eob_lf(&mut self, ctx: usize, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.chr_eob_lf[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfs_qctx::CHROMA_EOB_TOK_LF_QC;
self.sym_static(&CHROMA_EOB_TOK_LF_QC[self.qc][ctx], s, nsyms);
}
}
pub(crate) fn sym_br_hf(&mut self, ctx: usize, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.br_hf[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfs_qctx::BR_TOK_HF_QC;
self.sym_static(&BR_TOK_HF_QC[self.qc][ctx], s, nsyms);
}
}
pub(crate) fn sym_br(&mut self, ctx: usize, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.br[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfs_qctx::BR_TOK_QC;
self.sym_static(&BR_TOK_QC[self.qc][ctx], s, nsyms);
}
}
pub(crate) fn sym_chr_br(&mut self, ctx: usize, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.chr_br[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfs_qctx::CHROMA_BR_TOK_HF_QC;
self.sym_static(&CHROMA_BR_TOK_HF_QC[self.qc][ctx], s, nsyms);
}
}
pub(crate) fn sym_eob_bin(&mut self, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.eob_bin;
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfs_qctx::EOB_BIN_QC;
self.sym_static(&EOB_BIN_QC[self.qc], s, nsyms);
}
}
pub(crate) fn sym_eob64_luma(&mut self, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.eob64_luma;
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfs_qctx::EOB64_LUMA_QC;
self.sym_static(&EOB64_LUMA_QC[self.qc], s, nsyms);
}
}
pub(crate) fn sym_eob128_luma(&mut self, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.eob128_luma;
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfs_qctx::EOB128_LUMA_QC;
self.sym_static(&EOB128_LUMA_QC[self.qc], s, nsyms);
}
}
pub(crate) fn sym_eob256(&mut self, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.eob256;
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfs_qctx::EOB256_QC;
self.sym_static(&EOB256_QC[self.qc], s, nsyms);
}
}
pub(crate) fn sym_eob512(&mut self, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.eob512;
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfs_qctx::EOB512_QC;
self.sym_static(&EOB512_QC[self.qc], s, nsyms);
}
}
pub(crate) fn sym_chr_eob_bin(&mut self, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.chr_eob_bin;
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfs_qctx::CHROMA_EOB_BIN_QC;
self.sym_static(&CHROMA_EOB_BIN_QC[self.qc], s, nsyms);
}
}
pub(crate) fn sym_chr_eob32(&mut self, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.chr_eob32;
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfs_qctx::CHROMA_EOB32_QC;
self.sym_static(&CHROMA_EOB32_QC[self.qc], s, nsyms);
}
}
pub(crate) fn sym_chr_eob64(&mut self, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.chr_eob64;
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfs_qctx::CHROMA_EOB64_QC;
self.sym_static(&CHROMA_EOB64_QC[self.qc], s, nsyms);
}
}
pub(crate) fn sym_chr_eob128(&mut self, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.chr_eob128;
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfs_qctx::CHROMA_EOB128_QC;
self.sym_static(&CHROMA_EOB128_QC[self.qc], s, nsyms);
}
}
pub(crate) fn sym_chr_eob256(&mut self, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.chr_eob256;
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfs_qctx::CHROMA_EOB256_QC;
self.sym_static(&CHROMA_EOB256_QC[self.qc], s, nsyms);
}
}
pub(crate) fn sym_chr_eob512(&mut self, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.chr_eob512;
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfs_qctx::CHROMA_EOB512_QC;
self.sym_static(&CHROMA_EOB512_QC[self.qc], s, nsyms);
}
}
pub(crate) fn sym_eob16_q0(&mut self, ctx: usize, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.eob16_q0[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfx_4tx::EOB16_Q0;
self.sym_static(&EOB16_Q0[ctx], s, nsyms);
}
}
pub(crate) fn sym_base_lf_tx4(&mut self, ctx: usize, pair: usize, s: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.base_lf_tx4[ctx][pair];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
5,
);
} else {
use crate::av2::cdfx_4tx::BASE_LF_TX4_Q0;
self.sym_static(&BASE_LF_TX4_Q0[ctx][pair], s, 5);
}
}
pub(crate) fn sym_base_tx4(&mut self, ctx: usize, pair: usize, s: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.base_tx4[ctx][pair];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
3,
);
} else {
use crate::av2::cdfx_4tx::BASE_TX4_Q0;
self.sym_static(&BASE_TX4_Q0[ctx][pair], s, 3);
}
}
pub(crate) fn sym_base_lf_eob_tx4(&mut self, ctx: usize, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.base_lf_eob_tx4[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfx_4tx::BASE_LF_EOB_TX4_Q0;
self.sym_static(&BASE_LF_EOB_TX4_Q0[ctx], s, nsyms);
}
}
pub(crate) fn sym_base_eob_tx4(&mut self, ctx: usize, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.base_eob_tx4[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfx_4tx::BASE_EOB_TX4_Q0;
self.sym_static(&BASE_EOB_TX4_Q0[ctx], s, nsyms);
}
}
pub(crate) fn sym_br_lf_q0(&mut self, ctx: usize, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.br_lf_q0[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfx_4tx::BR_LF_Q0;
self.sym_static(&BR_LF_Q0[ctx], s, nsyms);
}
}
pub(crate) fn sym_br_q0(&mut self, ctx: usize, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.br_q0[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfx_4tx::BR_Q0;
self.sym_static(&BR_Q0[ctx], s, nsyms);
}
}
pub(crate) fn sym_base_lf_uv(&mut self, ctx: usize, s: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.base_lf_uv[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
5,
);
} else {
use crate::av2::cdfx_4tx::BASE_LF_UV_Q0;
self.sym_static(&BASE_LF_UV_Q0[ctx], s, 5);
}
}
pub(crate) fn sym_base_uv(&mut self, ctx: usize, s: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.base_uv[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
3,
);
} else {
use crate::av2::cdfx_4tx::BASE_UV_Q0;
self.sym_static(&BASE_UV_Q0[ctx], s, 3);
}
}
pub(crate) fn sym_br_uv(&mut self, ctx: usize, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.br_uv[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfx_4tx::BR_UV_Q0;
self.sym_static(&BR_UV_Q0[ctx], s, nsyms);
}
}
pub(crate) fn sym_base_lf_eob_uv(&mut self, ctx: usize, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.base_lf_eob_uv[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfx_4tx::BASE_LF_EOB_UV_Q0;
self.sym_static(&BASE_LF_EOB_UV_Q0[ctx], s, nsyms);
}
}
pub(crate) fn sym_base_eob_uv(&mut self, ctx: usize, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.base_eob_uv[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdfx_4tx::BASE_EOB_UV_Q0;
self.sym_static(&BASE_EOB_UV_Q0[ctx], s, nsyms);
}
}
pub(crate) fn sym_y_set(&mut self, s: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.y_set;
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
3,
);
} else {
use crate::av2::cdf_state::Y_SET_INIT;
self.sym_static(&Y_SET_INIT, s, 3);
}
}
pub(crate) fn sym_y_idx0(&mut self, ctx: usize, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.y_idx0[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdf_state::Y_IDX0_INIT;
self.sym_static(&Y_IDX0_INIT[ctx], s, nsyms);
}
}
pub(crate) fn sym_y_idx1(&mut self, ctx: usize, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.y_idx1[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdf_state::Y_IDX1_INIT;
self.sym_static(&Y_IDX1_INIT[ctx], s, nsyms);
}
}
pub(crate) fn sym_uv_mode(&mut self, ctx: usize, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.uv_mode[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdf_state::UV_MODE_INIT;
self.sym_static(&UV_MODE_INIT[ctx], s, nsyms);
}
}
pub(crate) fn sym_delta_q(&mut self, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.delta_q;
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdf_state::DELTA_Q_INIT;
self.sym_static(&DELTA_Q_INIT, s, nsyms);
}
}
pub(crate) fn sym_tx_part_64(&mut self, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.tx_part_64;
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::tables_tx32::TX_PART_2D_64;
self.sym_static(&TX_PART_2D_64, s, nsyms);
}
}
pub(crate) fn sym_tx_part_64x32(&mut self, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.tx_part_64x32;
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdf_state::TX_PART_64X32_INIT;
self.sym_static(&TX_PART_64X32_INIT, s, nsyms);
}
}
pub(crate) fn sym_tx_part_32x64(&mut self, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.tx_part_32x64;
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdf_state::TX_PART_32X64_INIT;
self.sym_static(&TX_PART_32X64_INIT, s, nsyms);
}
}
pub(crate) fn sym_ccso(&mut self, plane: usize, ctx: usize, s: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.ccso[plane][ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
1,
);
} else {
unreachable!("CCSO flag emitted without adaptive CDF state");
}
}
pub(crate) fn sym_tx_short_side(&mut self, ctx: usize, s: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.tx_short_side[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
3,
);
} else {
use crate::av2::cdf_state::TX_SHORT_SIDE_INIT;
self.sym_static(&TX_SHORT_SIDE_INIT[ctx], s, 3);
}
}
pub(crate) fn bool_cfl_is(&mut self, ctx: usize, static_cdf: u32, bit: u32) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.cfl_is[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
bit as usize,
1,
);
} else {
self.encode_bool(static_cdf, bit);
}
}
pub(crate) fn bool_cfl_index(&mut self, static_cdf: u32, bit: u32) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.cfl_index;
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
bit as usize,
1,
);
} else {
self.encode_bool(static_cdf, bit);
}
}
pub(crate) fn sym_cfl_sign(&mut self, s: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.cfl_sign;
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
8,
);
} else {
use crate::av2::cfl::CFL_SIGN_ICDF;
self.sym_static(&CFL_SIGN_ICDF, s, 8);
}
}
pub(crate) fn sym_cfl_alpha(&mut self, ctx: usize, s: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.cfl_alpha[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
8,
);
} else {
use crate::av2::cfl::CFL_ALPHA_ICDF;
self.sym_static(&CFL_ALPHA_ICDF[ctx], s, 8);
}
}
pub(crate) fn bool_txb_skip_tx4_ctx(
&mut self,
static_cdf: u32,
bit: u32,
is_v: bool,
ctx: usize,
) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = if is_v {
&mut cs.skip_v[ctx]
} else {
&mut cs.skip_tx4[ctx]
};
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
bit as usize,
1,
);
} else {
self.encode_bool(static_cdf, bit);
}
}
pub(crate) fn bool_txb_skip(&mut self, static_cdf: u32, bit: u32) {
if let Some(ref mut cs) = self.cdf_state {
let (table, ctx) = cs.skip_slot_of(static_cdf as u16);
let cdf = match table {
0 => &mut cs.txb_skip[ctx],
1 => &mut cs.skip_tx64[ctx],
3 => &mut cs.skip_tx16[ctx],
4 => &mut cs.skip_tx8[ctx],
5 => &mut cs.skip_tx4[ctx],
_ => &mut cs.skip_v[ctx],
};
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
bit as usize,
1,
);
} else {
self.encode_bool(static_cdf, bit);
}
}
pub(crate) fn bool_skip_tbl(&mut self, static_cdf: u32, bit: u32, table: u8) {
if let Some(ref mut cs) = self.cdf_state {
let (slot, ctx) = if table == 2 {
(2u8, cs.skip_ctx_in(static_cdf as u16, 2))
} else {
cs.skip_slot_of(static_cdf as u16)
};
let cdf = match slot {
0 => &mut cs.txb_skip[ctx],
1 => &mut cs.skip_tx64[ctx],
3 => &mut cs.skip_tx16[ctx],
4 => &mut cs.skip_tx8[ctx],
5 => &mut cs.skip_tx4[ctx],
_ => &mut cs.skip_v[ctx],
};
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
bit as usize,
1,
);
} else {
self.encode_bool(static_cdf, bit);
}
}
pub(crate) fn bool_dc_sign(&mut self, static_cdf: u32, bit: u32) {
if let Some(ref mut cs) = self.cdf_state {
let ctx = cs.dc_sign_ctx_of(static_cdf as u16);
let cdf = &mut cs.dc_sign[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
bit as usize,
1,
);
} else {
self.encode_bool(static_cdf, bit);
}
}
pub(crate) fn bool_eob_extra(&mut self, static_cdf: u32, bit: u32) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.eob_extra;
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
bit as usize,
1,
);
} else {
self.encode_bool(static_cdf, bit);
}
}
pub(crate) fn bool_do_split(&mut self, static_cdf: u32, bit: u32) {
if let Some(ref mut cs) = self.cdf_state {
let ctx = cs.do_split_ctx_of(static_cdf as u16);
let cdf = &mut cs.do_split[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
bit as usize,
1,
);
} else {
self.encode_bool(static_cdf, bit);
}
}
pub(crate) fn bool_rect_type(&mut self, static_cdf: u32, bit: u32) {
if let Some(ref mut cs) = self.cdf_state {
let ctx = cs.rect_type_ctx_of(static_cdf as u16);
let cdf = &mut cs.rect_type[ctx];
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
bit as usize,
1,
);
} else {
self.encode_bool(static_cdf, bit);
}
}
pub(crate) fn bool_txfm_part(&mut self, static_cdf: u32, bit: u32) {
if let Some(cs) = self.cdf_state.as_deref_mut() {
let cdf = cs.txfm_bool(static_cdf as u16);
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
bit as usize,
1,
);
} else {
self.encode_bool(static_cdf, bit);
}
}
pub(crate) fn sym_intra_ext_tx16(&mut self, s: usize, nsyms: usize) {
if let Some(ref mut cs) = self.cdf_state {
let cdf = &mut cs.intra_ext_tx16;
Self::sym_mut_inner(
&mut self.low,
&mut self.range,
&mut self.count,
&mut self.output,
cdf,
s,
nsyms,
);
} else {
use crate::av2::cdf_state::INTRA_EXT_TX16_INIT;
self.sym_static(&INTRA_EXT_TX16_INIT, s, nsyms);
}
}
}