nx_h264_pps.nx source
↩ module page · 45 lines · 2620 B
1// nx_h264_pps.nx -- H.264 Picture Parameter Set parser (rung 4b, spec 7.3.2.2).
2// Carries the two fields that steer the whole macroblock decode:
3// entropy_coding_mode_flag (0 = CAVLC, 1 = CABAC) -> which residual decoder
4// pic_init_qp = 26 + pic_init_qp_minus26 -> base QP for dequant
5// plus pps_id/sps_id binding, weighted_pred, deblocking-present, constrained-intra.
6//
7// Parses the always-present field run (pps_id .. redundant_pic_cnt_present).
8// HONEST: if num_slice_groups_minus1 > 0 there is a slice-group map in between
9// (rare); fields after it would misalign, so we FLAG it (out[8]=1) rather than
10// silently misread. transform_8x8 / scaling-matrix tail (more_rbsp_data) ignored.
11//
12// genealogy_id: itu_t_h264_sec7_3_2_2_pps
13// lineage_id: exp_golomb_pps_fields + entropy_mode + init_qp
14// license_tier: ORIGINAL
15import "nx_syscalls.nx"
16import "nx_h264_bits.nx"
17
18// out[0]=pps_id out[1]=sps_id out[2]=entropy_coding_mode out[3]=pic_init_qp
19// out[4]=num_slice_groups_minus1 out[5]=weighted_pred out[6]=deblock_present
20// out[7]=constrained_intra out[8]=slice_group_map_unparsed
21func nx_h264_parse_pps(rbsp: *u8, len: i64, out: *i64) -> i64 {
22 var i: i64 = 0
23 while i < 10 { out[i] = 0; i = i + 1 }
24 let br: *BitReader = sys_mmap(NX_BR_BYTES) as *BitReader
25 br_init(br, rbsp, len)
26 out[0] = br_read_ue(br) // pic_parameter_set_id
27 out[1] = br_read_ue(br) // seq_parameter_set_id
28 out[2] = br_read_bits(br, 1) // entropy_coding_mode_flag
29 br_read_bits(br, 1) // bottom_field_pic_order_in_frame_present_flag
30 let nsg: i64 = br_read_ue(br) // num_slice_groups_minus1
31 out[4] = nsg
32 if nsg > 0 { out[8] = 1 } // slice-group map present -> downstream fields unreliable
33 br_read_ue(br) // num_ref_idx_l0_default_active_minus1
34 br_read_ue(br) // num_ref_idx_l1_default_active_minus1
35 out[5] = br_read_bits(br, 1) // weighted_pred_flag
36 br_read_bits(br, 2) // weighted_bipred_idc
37 let qpd: i64 = br_read_se(br) // pic_init_qp_minus26
38 out[3] = 26 + qpd
39 br_read_se(br) // pic_init_qs_minus26
40 out[9] = br_read_se(br) // chroma_qp_index_offset
41 out[6] = br_read_bits(br, 1) // deblocking_filter_control_present_flag
42 out[7] = br_read_bits(br, 1) // constrained_intra_pred_flag
43 br_read_bits(br, 1) // redundant_pic_cnt_present_flag
44 return 0
45}