use crate::av2::entropy::ByteWriter;
use crate::av2::headers::{Config, DISABLE_LOOPFILTERS_ACROSS_TILES, ENABLE_INTRA_EDGE_FILTER};
pub(crate) fn sequence_header_video(config: &Config, width: u32, height: u32) -> Vec<u8> {
let has_chroma = config.layout.has_chroma();
let mut b = ByteWriter::new();
b.write_uvlc(0); b.write_bits(config.layout.profile(), 5); b.write_bit(0); b.write_bits(31, 5); b.write_bit(0); b.write_uvlc(config.layout.header_uvlc()); let bitdepth_idx = match config.bit_depth {
10 => 0,
12 => 2,
_ => 1,
};
b.write_uvlc(bitdepth_idx);
b.write_bits(0, 3); b.write_bit(0); b.write_bits(0, 2); b.write_bits(0, 3); b.write_bit(1);
let width_bits = (32 - (width - 1).leading_zeros()).max(1);
let height_bits = (32 - (height - 1).leading_zeros()).max(1);
b.write_bits(width_bits - 1, 4);
b.write_bits(height_bits - 1, 4);
b.write_bits(width - 1, width_bits);
b.write_bits(height - 1, height_bits);
b.write_bit(0);
b.write_bit(0); b.write_bit(0);
b.write_bit(0); b.write_bit(0); if has_chroma {
b.write_bit(0); }
b.write_bit(0); b.write_bit(0); b.write_bit(0); b.write_bit(0); b.write_bit(0); b.write_bit(ENABLE_INTRA_EDGE_FILTER as u32);
b.write_bit(0); b.write_bit(config.cfl as u32); if has_chroma {
b.write_bits(0, 2); }
b.write_bit(config.mhccp as u32); b.write_bit(0);
b.write_bits(0, 4);
b.write_bit(0); b.write_bit(0); b.write_bits(6, 4); b.write_bit(0); b.write_bit(1); b.write_bit(1); b.write_bit(0); b.write_bits(0, 3); b.write_uniform(0, 5); b.write_bit(0); b.write_uniform(0, 3); b.write_bit(0); b.write_bits(0, 2); b.write_bit(0); b.write_bit(0); b.write_bit(0); b.write_bit(0); b.write_bit(0); b.write_bit(0); b.write_bits(0, 2); b.write_bit(0); b.write_bit(0); b.write_bit(0); b.write_bit(0); b.write_bit(0); b.write_bit(0); b.write_bit(0);
if config.lossless {
b.write_bit(1); b.write_bit(1); } else {
b.write_bit(0); b.write_bit(0); }
b.write_bit(0); b.write_bit(0); b.write_bit(0); b.write_bit(0); if has_chroma {
b.write_bit(0); }
b.write_bit(0); b.write_bit(0); if has_chroma {
b.write_bit(0); }
b.write_bit(0); b.write_bit(0); b.write_bit(0); if has_chroma {
b.write_bit(0); }
b.write_bit(1); if has_chroma {
let uv_raw = (23 + config.uv_ac_delta_q).clamp(0, 31) as u32;
b.write_bits(uv_raw, 5); b.write_bit(0); }
b.write_bit(DISABLE_LOOPFILTERS_ACROSS_TILES as u32);
b.write_bit(config.cdef.is_some() as u32); b.write_bit(0); b.write_bit(0); if config.ccso.is_some() {
b.write_bit(1); b.write_bit(1); } else {
b.write_bit(0);
}
b.write_bit(0);
b.write_bit(0);
b.write_bits(0, 2);
b.write_bit(0); b.write_bit(0); b.write_bit(0);
b.align_with_one();
b.into_bytes()
}