private static void readScalingListMatrix(BitReader inb, SeqParameterSet sps) { sps.scalingMatrix = new ScalingMatrix(); for (int i = 0; i < 8; i++) { bool seqScalingListPresentFlag = CAVLCReader.readBool(inb, "SPS: seqScalingListPresentFlag"); if (seqScalingListPresentFlag) { sps.scalingMatrix.ScalingList4x4 = new ScalingList[8]; sps.scalingMatrix.ScalingList8x8 = new ScalingList[8]; if (i < 6) { sps.scalingMatrix.ScalingList4x4[i] = ScalingList.read(inb, 16); } else { sps.scalingMatrix.ScalingList8x8[i - 6] = ScalingList.read(inb, 64); } } } }
public static ScalingList read(BitReader inb, int sizeOfScalingList) { ScalingList sl = new ScalingList(); sl.scalingList = new int[sizeOfScalingList]; int lastScale = 8; int nextScale = 8; for (int j = 0; j < sizeOfScalingList; j++) { if (nextScale != 0) { int deltaScale = CAVLCReader.readSE(inb, "deltaScale"); nextScale = (lastScale + deltaScale + 256) % 256; sl.useDefaultScalingMatrixFlag = (j == 0 && nextScale == 0); } sl.scalingList[j] = nextScale == 0 ? lastScale : nextScale; lastScale = sl.scalingList[j]; } return(sl); }
public static PictureParameterSet read(MemoryStream iss) { BitReader inb = new BitReader(iss); PictureParameterSet pps = new PictureParameterSet(); pps.pic_parameter_set_id = CAVLCReader.readUE(inb, "PPS: pic_parameter_set_id"); pps.seq_parameter_set_id = CAVLCReader.readUE(inb, "PPS: seq_parameter_set_id"); pps.entropy_coding_mode_flag = CAVLCReader.readBool(inb, "PPS: entropy_coding_mode_flag"); pps.pic_order_present_flag = CAVLCReader.readBool(inb, "PPS: pic_order_present_flag"); pps.num_slice_groups_minus1 = CAVLCReader.readUE(inb, "PPS: num_slice_groups_minus1"); if (pps.num_slice_groups_minus1 > 0) { pps.slice_group_map_type = CAVLCReader.readUE(inb, "PPS: slice_group_map_type"); pps.top_left = new int[pps.num_slice_groups_minus1 + 1]; pps.bottom_right = new int[pps.num_slice_groups_minus1 + 1]; pps.run_length_minus1 = new int[pps.num_slice_groups_minus1 + 1]; if (pps.slice_group_map_type == 0) { for (int iGroup = 0; iGroup <= pps.num_slice_groups_minus1; iGroup++) { pps.run_length_minus1[iGroup] = CAVLCReader.readUE(inb, "PPS: run_length_minus1"); } } else if (pps.slice_group_map_type == 2) { for (int iGroup = 0; iGroup < pps.num_slice_groups_minus1; iGroup++) { pps.top_left[iGroup] = CAVLCReader.readUE(inb, "PPS: top_left"); pps.bottom_right[iGroup] = CAVLCReader.readUE(inb, "PPS: bottom_right"); } } else if (pps.slice_group_map_type == 3 || pps.slice_group_map_type == 4 || pps.slice_group_map_type == 5) { pps.slice_group_change_direction_flag = CAVLCReader.readBool(inb, "PPS: slice_group_change_direction_flag"); pps.slice_group_change_rate_minus1 = CAVLCReader.readUE(inb, "PPS: slice_group_change_rate_minus1"); } else if (pps.slice_group_map_type == 6) { int NumberBitsPerSliceGroupId; if (pps.num_slice_groups_minus1 + 1 > 4) { NumberBitsPerSliceGroupId = 3; } else if (pps.num_slice_groups_minus1 + 1 > 2) { NumberBitsPerSliceGroupId = 2; } else { NumberBitsPerSliceGroupId = 1; } int pic_size_in_map_units_minus1 = CAVLCReader.readUE(inb, "PPS: pic_size_in_map_units_minus1"); pps.slice_group_id = new int[pic_size_in_map_units_minus1 + 1]; for (int i = 0; i <= pic_size_in_map_units_minus1; i++) { pps.slice_group_id[i] = CAVLCReader.readU(inb, NumberBitsPerSliceGroupId, "PPS: slice_group_id [" + i + "]f"); } } } pps.num_ref_idx_active_minus1 = new int[] { CAVLCReader.readUE(inb, "PPS: num_ref_idx_l0_active_minus1"), CAVLCReader.readUE(inb, "PPS: num_ref_idx_l1_active_minus1") }; pps.weighted_pred_flag = CAVLCReader.readBool(inb, "PPS: weighted_pred_flag"); pps.weighted_bipred_idc = CAVLCReader.readNBit(inb, 2, "PPS: weighted_bipred_idc"); pps.pic_init_qp_minus26 = CAVLCReader.readSE(inb, "PPS: pic_init_qp_minus26"); pps.pic_init_qs_minus26 = CAVLCReader.readSE(inb, "PPS: pic_init_qs_minus26"); pps.chroma_qp_index_offset = CAVLCReader.readSE(inb, "PPS: chroma_qp_index_offset"); pps.deblocking_filter_control_present_flag = CAVLCReader.readBool(inb, "PPS: deblocking_filter_control_present_flag"); pps.constrained_intra_pred_flag = CAVLCReader.readBool(inb, "PPS: constrained_intra_pred_flag"); pps.redundant_pic_cnt_present_flag = CAVLCReader.readBool(inb, "PPS: redundant_pic_cnt_present_flag"); if (CAVLCReader.moreRBSPData(inb)) { pps.extended = new PictureParameterSet.PPSExt(); pps.extended.transform_8x8_mode_flag = CAVLCReader.readBool(inb, "PPS: transform_8x8_mode_flag"); bool pic_scaling_matrix_present_flag = CAVLCReader.readBool(inb, "PPS: pic_scaling_matrix_present_flag"); if (pic_scaling_matrix_present_flag) { for (int i = 0; i < 6 + 2 * (pps.extended.transform_8x8_mode_flag ? 1 : 0); i++) { bool pic_scaling_list_present_flag = CAVLCReader.readBool(inb, "PPS: pic_scaling_list_present_flag"); if (pic_scaling_list_present_flag) { pps.extended.scalindMatrix.ScalingList4x4 = new ScalingList[8]; pps.extended.scalindMatrix.ScalingList8x8 = new ScalingList[8]; if (i < 6) { pps.extended.scalindMatrix.ScalingList4x4[i] = ScalingList.read(inb, 16); } else { pps.extended.scalindMatrix.ScalingList8x8[i - 6] = ScalingList.read(inb, 64); } } } } pps.extended.second_chroma_qp_index_offset = CAVLCReader.readSE(inb, "PPS: second_chroma_qp_index_offset"); } return(pps); }