void ReadHrdParameters(H264Bitstream r) { var cpb_cnt_minus1 = r.ReadUe(); var bit_rate_scale = r.ReadBits(4); var cpb_size_scale = r.ReadBits(4); for (var SchedSelIdx = 0; SchedSelIdx <= cpb_cnt_minus1; SchedSelIdx++) { var bit_rate_value_minus1_SchedSelIdx = r.ReadUe(); var cpb_size_value_minus1_SchedSelIdx = r.ReadUe(); var cbr_flag_SchedSelIdx = r.ReadBits(1); } var initial_cpb_removal_delay_length_minus1 = r.ReadBits(5); var cpb_removal_delay_length_minus1 = r.ReadBits(5); _cpbRemovalDelayLengthMinus1 = cpb_removal_delay_length_minus1; var dpb_output_delay_length_minus1 = r.ReadBits(5); _dpbOutputDelayLengthMinus1 = dpb_output_delay_length_minus1; var time_offset_length = r.ReadBits(5); _timeOffsetLength = time_offset_length; }
// ReSharper disable InconsistentNaming // ReSharper disable UnusedVariable void ReadVuiParameters(H264Bitstream r) { var aspect_ratio_info_present_flag = r.ReadBits(1); if (0 != aspect_ratio_info_present_flag) { var aspect_ratio_idc = r.ReadBits(8); const int Extended_SAR = 255; if (Extended_SAR == aspect_ratio_idc) { var sar_width = r.ReadBits(16); var sar_height = r.ReadBits(16); } } var overscan_info_present_flag = r.ReadBits(1); if (0 != overscan_info_present_flag) { var overscan_appropriate_flag = r.ReadBits(1); } var video_signal_type_present_flag = r.ReadBits(1); if (0 != video_signal_type_present_flag) { var video_format = r.ReadBits(3); var video_full_range_flag = r.ReadBits(1); var colour_description_present_flag = r.ReadBits(1); if (0 != colour_description_present_flag) { var colour_primaries = r.ReadBits(8); var transfer_characteristics = r.ReadBits(8); var matrix_coefficients = r.ReadBits(8); } } var chroma_loc_info_present_flag = r.ReadBits(1); if (0 != chroma_loc_info_present_flag) { var chroma_sample_loc_type_top_field = r.ReadUe(); var chroma_sample_loc_type_bottom_field = r.ReadUe(); } var timing_info_present_flag = r.ReadBits(1); if (0 != timing_info_present_flag) { var num_units_in_tick = r.ReadBits(32); _numUnitsInTick = num_units_in_tick; var time_scale = r.ReadBits(32); _timeScale = time_scale; var fixed_frame_rate_flag = r.ReadBits(1); _fixedFrameRateFlag = 0 != fixed_frame_rate_flag; } var nal_hrd_parameters_present_flag = r.ReadBits(1); _nalHrdParametersPresentFlag = 0 != nal_hrd_parameters_present_flag; if (0 != nal_hrd_parameters_present_flag) ReadHrdParameters(r); var vcl_hrd_parameters_present_flag = r.ReadBits(1); _vclHrdParametersPresentFlag = 0 != vcl_hrd_parameters_present_flag; if (0 != vcl_hrd_parameters_present_flag) ReadHrdParameters(r); if (0 != nal_hrd_parameters_present_flag || 0 != vcl_hrd_parameters_present_flag) { var low_delay_hrd_flag = r.ReadBits(1); } var pic_struct_present_flag = r.ReadBits(1); _picStructPresentFlag = 0 != pic_struct_present_flag; var bitstream_restriction_flag = r.ReadBits(1); if (0 != bitstream_restriction_flag) { var motion_vectors_over_pic_boundaries_flag = r.ReadBits(1); var max_bytes_per_pic_denom = r.ReadUe(); var max_bits_per_mb_denom = r.ReadUe(); var log2_max_mv_length_horizontal = r.ReadUe(); var log2_max_mv_length_vertical = r.ReadUe(); var max_num_reorder_frames = r.ReadUe(); var max_dec_frame_buffering = r.ReadUe(); } }
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(); } } }