void ParseScalingList(H264Bitstream r, int sizeOfScalingList) { var lastScale = 8; var nextScale = 8; for (var j = 0; j < sizeOfScalingList; ++j) { if (0 != nextScale) { var delta_scale = r.ReadSe(); nextScale = (lastScale + delta_scale + 256) & 0xff; var useDefaultScalingMatrixFlag = (0 == j && 0 == nextScale); } var scalingList = 0 == nextScale ? lastScale : nextScale; lastScale = scalingList; } }
void ReadScalingList(H264Bitstream r, int sizeOfScalingList) { var lastScale = 8; var nextScale = 8; for (var j = 0; j < sizeOfScalingList; j++) { if (nextScale != 0) { var delta_scale = r.ReadSe(); nextScale = (lastScale + delta_scale + 256) % 256; var useDefaultScalingMatrixFlag = (j == 0 && nextScale == 0); } var scalingList_j = (nextScale == 0) ? lastScale : nextScale; lastScale = scalingList_j; } }
public void ReadSps(H264Bitstream r) { _ppsSeqParameterSetId = null; uint profile_idc; uint constraint_sets; uint level_idc; uint width; uint height; var forbidden_zero_bit = r.ReadBits(1); var nal_ref_idc = r.ReadBits(2); var nal_unit_type = r.ReadBits(5); profile_idc = r.ReadBits(8); constraint_sets = r.ReadBits(8); level_idc = r.ReadBits(8); var seq_parameter_set_id = r.ReadUe(); _seqParameterSetId = seq_parameter_set_id; if (Array.BinarySearch(ProfileIdcHasChromaFormat, profile_idc) >= 0) { var chroma_format_idc = r.ReadUe(); _chromaFormatIdc = chroma_format_idc; if (3 == chroma_format_idc) { var separate_colour_plane_flag = r.ReadBits(1); _separateColourPlaneFlag = separate_colour_plane_flag; } var bit_depth_luma_minus8 = r.ReadUe(); var bit_depth_chroma_minus8 = r.ReadUe(); var qpprime_y_zero_transform_bypass_flag = r.ReadBits(1); var seq_scaling_matrix_present_flag = r.ReadBits(1); if (0 != seq_scaling_matrix_present_flag) { for (var i = 0; i < (3 != chroma_format_idc ? 8 : 12); ++i) { var seq_scaling_list_present_flag = r.ReadBits(1); if (0 != seq_scaling_list_present_flag) ParseScalingList(r, i < 6 ? 16 : 64); } } } var log2_max_frame_num_minus4 = r.ReadUe(); _log2MaxFrameNumMinus4 = log2_max_frame_num_minus4; var pic_order_cnt_type = r.ReadUe(); _picOrderCntType = pic_order_cnt_type; if (0 == pic_order_cnt_type) { var log2_max_pic_order_cnt_lsb_minus4 = r.ReadUe(); } else if (1 == pic_order_cnt_type) { var delta_pic_order_always_zero_flag = r.ReadBits(1); _deltaPicOrderAlwaysZeroFlag = delta_pic_order_always_zero_flag; var offset_for_non_ref_pic = r.ReadSe(); var offset_for_top_to_bottom_field = r.ReadSe(); var num_ref_frames_in_pic_order_cnt_cycle = r.ReadUe(); for (var i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; ++i) { var offset_for_ref_frame = r.ReadSe(); } } var max_num_ref_frames = r.ReadUe(); var gaps_in_frame_num_value_allowed_flag = r.ReadBits(1); var pic_width_in_mbs_minus1 = r.ReadUe(); var pic_height_in_map_units_minus1 = r.ReadUe(); var frame_mbs_only_flag = r.ReadBits(1); _frameMbsOnlyFlag = frame_mbs_only_flag; if (0 == frame_mbs_only_flag) { var mb_adaptive_frame_field_flag = r.ReadBits(1); } var direct_8x8_inference_flag = r.ReadBits(1); var frame_cropping_flag = r.ReadBits(1); width = ((pic_width_in_mbs_minus1 + 1) * 16); height = ((2 - frame_mbs_only_flag) * (pic_height_in_map_units_minus1 + 1) * 16); if (0 != frame_cropping_flag) { var frame_crop_left_offset = r.ReadUe(); var frame_crop_right_offset = r.ReadUe(); var frame_crop_top_offset = r.ReadUe(); var frame_crop_bottom_offset = r.ReadUe(); width = width - frame_crop_left_offset * 2 - frame_crop_right_offset * 2; height = height - (frame_crop_top_offset * 2) - (frame_crop_bottom_offset * 2); } var vui_parameters_present_flag = r.ReadBits(1); if (0 != vui_parameters_present_flag) { ReadVuiParameters(r); } Height = (int)height; Width = (int)width; var profileName = ProfileName(profile_idc, constraint_sets); Name = String.Format("H.264 \"{0}\" profile, level {1} {2}x{3}", profileName, level_idc / 10.0, width, height); }
public void ReadPps(H264Bitstream r) { _slicePicParameterSetId = null; var forbidden_zero_bit = r.ReadBits(1); var nal_ref_idc = r.ReadBits(2); var nal_unit_type = r.ReadBits(5); var pic_parameter_set_id = r.ReadUe(); _picParameterSetId = pic_parameter_set_id; var seq_parameter_set_id = r.ReadUe(); _ppsSeqParameterSetId = seq_parameter_set_id; var entropy_coding_mode_flag = r.ReadBits(1); var bottom_field_pic_order_in_frame_present_flag = r.ReadBits(1); _bottomFieldPicOrderInFramePresentFlag = bottom_field_pic_order_in_frame_present_flag; var num_slice_groups_minus1 = r.ReadUe(); if (num_slice_groups_minus1 > 0) { var slice_group_map_type = r.ReadUe(); if (0 == slice_group_map_type) { for (var iGroup = 0; iGroup <= num_slice_groups_minus1; iGroup++) { var run_length_minus1_iGroup = r.ReadUe(); } } else if (2 == slice_group_map_type) { for (var iGroup = 0; iGroup < num_slice_groups_minus1; iGroup++) { var top_left_iGroup = r.ReadUe(); var bottom_right_iGroup = r.ReadUe(); } } else if (3 == slice_group_map_type || 4 == slice_group_map_type || 5 == slice_group_map_type) { var slice_group_change_direction_flag = r.ReadBits(1); var slice_group_change_rate_minus1 = r.ReadUe(); } else if (6 == slice_group_map_type) { var nsgBits = GetBitSize(num_slice_groups_minus1); var pic_size_in_map_units_minus1 = r.ReadUe(); for (var i = 0; i <= pic_size_in_map_units_minus1; i++) { var slice_group_id_i = r.ReadBits(nsgBits); } } } var num_ref_idx_l0_default_active_minus1 = r.ReadUe(); var num_ref_idx_l1_default_active_minus1 = r.ReadUe(); var weighted_pred_flag = r.ReadBits(1); var weighted_bipred_idc = r.ReadBits(2); var pic_init_qp_minus26 /* relative to 26 */ = r.ReadSe(); var pic_init_qs_minus26 /* relative to 26 */ = r.ReadSe(); var chroma_qp_index_offset = r.ReadSe(); var deblocking_filter_control_present_flag = r.ReadBits(1); var constrained_intra_pred_flag = r.ReadBits(1); var redundant_pic_cnt_present_flag = r.ReadBits(1); _redundantPicCntPresentFlag = redundant_pic_cnt_present_flag; if (more_rbsp_data(r)) { var transform_8x8_mode_flag = r.ReadBits(1); var pic_scaling_matrix_present_flag = r.ReadBits(1); if (0 != pic_scaling_matrix_present_flag) { for (var i = 0; i < 6 + ((_chromaFormatIdc != 3) ? 2 : 6) * transform_8x8_mode_flag; i++) { var pic_scaling_list_present_flag_i = r.ReadBits(1); if (0 != pic_scaling_list_present_flag_i) { if (i < 6) { ReadScalingList(r, 16); //scaling_list(ScalingList4x4[i], 16, UseDefaultScalingMatrix4x4Flag[i]); } else { ReadScalingList(r, 64); //scaling_list(ScalingList8x8[i - 6], 64, UseDefaultScalingMatrix8x8Flag[i - 6]); } } } } var second_chroma_qp_index_offset = r.ReadSe(); } }
public void ReadSliceHeader(H264Bitstream r, bool IdrPicFlag) { var first_mb_in_slice = r.ReadUe(); var slice_type = r.ReadUe(); var pic_parameter_set_id = r.ReadUe(); _slicePicParameterSetId = pic_parameter_set_id; if (_separateColourPlaneFlag == 1) { var colour_plane_id = r.ReadBits(2); } var frame_num = r.ReadBits((int)(_log2MaxFrameNumMinus4 ?? 0) + 4); uint field_pic_flag = 0; if (0 == _frameMbsOnlyFlag) { field_pic_flag = r.ReadBits(1); if (0 != field_pic_flag) { var bottom_field_flag = r.ReadBits(1); } } _fieldPicFlag = 0 != field_pic_flag; if (IdrPicFlag) { var idr_pic_id = r.ReadUe(); if (_picOrderCntType == 0) { var pic_order_cnt_lsb = r.ReadBits((int)(_log2MaxFrameNumMinus4 ?? 0) + 4); if (0 != _bottomFieldPicOrderInFramePresentFlag && 0 == field_pic_flag) { var delta_pic_order_cnt_bottom = r.ReadSe(); } } if (_picOrderCntType == 1 && 0 == _deltaPicOrderAlwaysZeroFlag) { var delta_pic_order_cnt_0 = r.ReadSe(); if (0 != _bottomFieldPicOrderInFramePresentFlag && 0 == field_pic_flag) { var delta_pic_order_cnt_1 = r.ReadSe(); } } if (0 != _redundantPicCntPresentFlag) { var redundant_pic_cnt = r.ReadUe(); } } }