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,
is_ref: bool,
) {
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, 8); 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 is_ref {
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,
wp: Option<&[(i32, i32)]>,
) {
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, 8); 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); if let Some(weights) = wp {
debug_assert_eq!(weights.len(), num_ref_idx_active.max(1), "one entry per active ref");
w.write_ue(6); w.write_ue(0); for &(lw, lo) in weights {
let ident = lw == 64 && lo == 0;
w.write_bit(!ident); if !ident {
w.write_se(lw);
w.write_se(lo);
}
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, 8); 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); }