static void put_slice_header(void* regs) { put_bits(regs, 3 << 5 | 5 << 0, 8); // NAL Header put_ue(regs, 0); // first_mb_in_slice put_ue(regs, 2); // slice_type put_ue(regs, 0); // pic_parameter_set_id put_bits(regs, 0, 4); // frame_num // if (IdrPicFlag) put_ue(regs, 0); // idr_pic_id // if (pic_order_cnt_type == 0) put_bits(regs, 0, 8); // pic_order_cnt_lsb // dec_ref_pic_marking put_bits(regs, 0, 1); // no_output_of_prior_pics_flag put_bits(regs, 0, 1); // long_term_reference_flag put_se(regs, 4); // slice_qp_delta // if (deblocking_filter_control_present_flag) put_ue(regs, 0); // disable_deblocking_filter_idc // if (disable_deblocking_filter_idc != 1) put_se(regs, 0); // slice_alpha_c0_offset_div2 put_se(regs, 0); // slice_beta_offset_div2 }
static void put_pic_parameter_set(h264enc *c) { put_start_code(c->regs, 3, 8); put_ue(c->regs, /* pic_parameter_set_id = */ 0); put_ue(c->regs, /* seq_parameter_set_id = */ 0); put_bits(c->regs, c->entropy_coding_mode_flag, 1); put_bits(c->regs, /* bottom_field_pic_order_in_frame_present_flag = */ 0, 1); put_ue(c->regs, /* num_slice_groups_minus1 = */ 0); put_ue(c->regs, /* num_ref_idx_l0_default_active_minus1 = */ 0); put_ue(c->regs, /* num_ref_idx_l1_default_active_minus1 = */ 0); put_bits(c->regs, /* weighted_pred_flag = */ 0, 1); put_bits(c->regs, /* weighted_bipred_idc = */ 0, 2); put_se(c->regs, (int)c->pic_init_qp - 26); put_se(c->regs, (int)c->pic_init_qp - 26); put_se(c->regs, /* chroma_qp_index_offset = */ 4); put_bits(c->regs, /* deblocking_filter_control_present_flag = */ 1, 1); put_bits(c->regs, /* constrained_intra_pred_flag = */ 0, 1); put_bits(c->regs, /* redundant_pic_cnt_present_flag = */ 0, 1); put_rbsp_trailing_bits(c->regs); }
static void put_seq_parameter_set(void* regs, int width, int height) { put_bits(regs, 3 << 5 | 7 << 0, 8); // NAL Header put_bits(regs, 77, 8); // profile_idc put_bits(regs, 0x0, 8); // constraints put_bits(regs, 4 * 10 + 1, 8); // level_idc put_ue(regs, 0); // seq_parameter_set_id put_ue(regs, 0); // log2_max_frame_num_minus4 put_ue(regs, 0); // pic_order_cnt_type // if (pic_order_cnt_type == 0) put_ue(regs, 4); // log2_max_pic_order_cnt_lsb_minus4 put_ue(regs, 1); // max_num_ref_frames put_bits(regs, 0, 1); // gaps_in_frame_num_value_allowed_flag put_ue(regs, width - 1); // pic_width_in_mbs_minus1 put_ue(regs, height - 1); // pic_height_in_map_units_minus1 put_bits(regs, 1, 1); // frame_mbs_only_flag // if (!frame_mbs_only_flag) put_bits(regs, 1, 1); // direct_8x8_inference_flag put_bits(regs, 0, 1); // frame_cropping_flag // if (frame_cropping_flag) put_bits(regs, 0, 1); // vui_parameters_present_flag // if (vui_parameters_present_flag) }
static void put_pic_parameter_set(void *regs, int qp_minus30) { put_bits(regs, 3 << 5 | 8 << 0, 8); // NAL Header put_ue(regs, 0); // pic_parameter_set_id put_ue(regs, 0); // seq_parameter_set_id put_bits(regs, 1, 1); // entropy_coding_mode_flag put_bits(regs, 0, 1); // bottom_field_pic_order_in_frame_present_flag put_ue(regs, 0); // num_slice_groups_minus1 // if (num_slice_groups_minus1 > 0) put_ue(regs, 0); // num_ref_idx_l0_default_active_minus1 put_ue(regs, 0); // num_ref_idx_l1_default_active_minus1 put_bits(regs, 0, 1); // weighted_pred_flag put_bits(regs, 0, 2); // weighted_bipred_idc //put_se(regs, 0); // pic_init_qp_minus26 (minus slice_qp_delta) //put_se(regs, 0); // pic_init_qs_minus26 put_se(regs, qp_minus30); // pic_init_qp_minus26 (minus slice_qp_delta) put_se(regs, qp_minus30); // pic_init_qs_minus26 put_se(regs, 4); // chroma_qp_index_offset put_bits(regs, 1, 1); // deblocking_filter_control_present_flag put_bits(regs, 0, 1); // constrained_intra_pred_flag put_bits(regs, 0, 1); // redundant_pic_cnt_present_flag }
static void put_seq_parameter_set(h264enc *c) { put_start_code(c->regs, 3, 7); put_bits(c->regs, c->profile_idc, 8); put_bits(c->regs, c->constraints, 8); put_bits(c->regs, c->level_idc, 8); put_ue(c->regs, /* seq_parameter_set_id = */ 0); put_ue(c->regs, /* log2_max_frame_num_minus4 = */ 0); put_ue(c->regs, /* pic_order_cnt_type = */ 2); put_ue(c->regs, /* max_num_ref_frames = */ 1); put_bits(c->regs, /* gaps_in_frame_num_value_allowed_flag = */ 0, 1); put_ue(c->regs, c->mb_width - 1); put_ue(c->regs, c->mb_height - 1); put_bits(c->regs, /* frame_mbs_only_flag = */ 1, 1); put_bits(c->regs, /* direct_8x8_inference_flag = */ 0, 1); unsigned int frame_cropping_flag = c->crop_right || c->crop_bottom; put_bits(c->regs, frame_cropping_flag, 1); if (frame_cropping_flag) { put_ue(c->regs, 0); put_ue(c->regs, c->crop_right); put_ue(c->regs, 0); put_ue(c->regs, c->crop_bottom); } put_bits(c->regs, /* vui_parameters_present_flag = */ 0, 1); put_rbsp_trailing_bits(c->regs); }
static void put_slice_header(h264enc *c) { if (c->current_slice_type == SLICE_I) put_start_code(c->regs, 3, 5); else put_start_code(c->regs, 2, 1); put_ue(c->regs, /* first_mb_in_slice = */ 0); put_ue(c->regs, c->current_slice_type); put_ue(c->regs, /* pic_parameter_set_id = */ 0); put_bits(c->regs, c->current_frame_num & 0xf, 4); if (c->current_slice_type == SLICE_I) put_ue(c->regs, /* idr_pic_id = */ 0); if (c->current_slice_type == SLICE_P) { put_bits(c->regs, /* num_ref_idx_active_override_flag = */ 0, 1); put_bits(c->regs, /* ref_pic_list_modification_flag_l0 = */ 0, 1); put_bits(c->regs, /* adaptive_ref_pic_marking_mode_flag = */ 0, 1); if (c->entropy_coding_mode_flag) put_ue(c->regs, /* cabac_init_idc = */ 0); } if (c->current_slice_type == SLICE_I) { put_bits(c->regs, /* no_output_of_prior_pics_flag = */ 0, 1); put_bits(c->regs, /* long_term_reference_flag = */ 0, 1); } put_se(c->regs, /* slice_qp_delta = */ 0); put_ue(c->regs, /* disable_deblocking_filter_idc = */ 0); put_se(c->regs, /* slice_alpha_c0_offset_div2 = */ 0); put_se(c->regs, /* slice_beta_offset_div2 = */ 0); }
static void put_se(void* regs, int x) { x = 2 * x - 1; x ^= (x >> 31); put_ue(regs, x); }