use crate::config::EncoderConfig;
use rusty_h264_common::BitWriter;
const SLICE_TYPE_I_ALL: u32 = 7;
const SLICE_TYPE_P_ALL: u32 = 5;
const SLICE_TYPE_B_ALL: u32 = 6;
#[allow(clippy::too_many_arguments)]
pub fn write_b_slice_header(
w: &mut BitWriter,
cfg: &EncoderConfig,
qp: u8,
frame_num: u32,
poc_lsb: u32,
num_l0: usize,
num_l1: usize,
) {
w.write_ue(0); w.write_ue(SLICE_TYPE_B_ALL); w.write_ue(0); w.write_bits(frame_num, 4); w.write_bits(poc_lsb, 4); w.write_bit(true); w.write_bit(true); w.write_ue(num_l0.max(1) as u32 - 1); w.write_ue(num_l1.max(1) as u32 - 1); w.write_bit(false); w.write_bit(false); if cfg.cabac {
w.write_ue(cfg.cabac_init_idc); }
w.write_se(qp as i32 - cfg.qp as i32); w.write_ue(0); w.write_se(0); w.write_se(0); }
pub fn write_p_slice_header(
w: &mut BitWriter,
cfg: &EncoderConfig,
qp: u8,
frame_num: u32,
poc_lsb: u32,
num_ref_idx_active: usize,
) {
w.write_ue(0); w.write_ue(SLICE_TYPE_P_ALL); w.write_ue(0); w.write_bits(frame_num, 4); w.write_bits(poc_lsb, 4); if cfg.num_ref_frames > 1 {
w.write_bit(true); w.write_ue(num_ref_idx_active.max(1) as u32 - 1); } else {
w.write_bit(false); }
w.write_bit(false); w.write_bit(false); if cfg.cabac {
w.write_ue(cfg.cabac_init_idc); }
w.write_se(qp as i32 - cfg.qp as i32); w.write_ue(0); w.write_se(0); w.write_se(0); }
pub fn write_idr_slice_header(w: &mut BitWriter, cfg: &EncoderConfig, qp: u8) {
w.write_ue(0); w.write_ue(SLICE_TYPE_I_ALL); w.write_ue(0); w.write_bits(0, 4); w.write_ue(0); w.write_bits(0, 4); w.write_bit(false); w.write_bit(false); w.write_se(qp as i32 - cfg.qp as i32); w.write_ue(0); w.write_se(0); w.write_se(0); }