code wiki / (root) / nx_h264_pps.nx

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}