public bool Parse(byte[] h264Stream) { profile = 0; level = 0; refFrames = 0; currrentPos = 0; buffer = h264Stream; byte[] nal = new byte[0]; while (nal != null) { nal = ReadNALUnit(); if (nal != null) { NALUnit nu = NALUnit.Read(nal); if (nu.Type == NALUnitType.SequenceParameterSet) { SeqParameterSet param = SeqParameterSet.Read(nu.Data); if (Enum.IsDefined(typeof(H264HeaderProfile), param.profile_idc) == true) { profile = param.profile_idc; level = param.level_idc; refFrames = param.num_ref_frames; return(true); } } } } return(false); }
private MBToSliceGroupMap buildMap(SeqParameterSet sps, PictureParameterSet pps) { int numGroups = pps.num_slice_groups_minus1 + 1; if (numGroups > 1) { int[] map; int picWidthInMbs = sps.pic_width_in_mbs_minus1 + 1; int picHeightInMbs = Utility.getPicHeightInMbs(sps); if (pps.slice_group_map_type == 0) { int[] runLength = new int[numGroups]; for (int i = 0; i < numGroups; i++) { runLength[i] = pps.run_length_minus1[i] + 1; } map = SliceGroupMapBuilder.buildInterleavedMap(picWidthInMbs, picHeightInMbs, runLength); } else if (pps.slice_group_map_type == 1) { map = SliceGroupMapBuilder.buildDispersedMap(picWidthInMbs, picHeightInMbs, numGroups); } else if (pps.slice_group_map_type == 2) { map = SliceGroupMapBuilder.buildForegroundMap(picWidthInMbs, picHeightInMbs, numGroups, pps.top_left, pps.bottom_right); } else if (pps.slice_group_map_type >= 3 && pps.slice_group_map_type <= 5) { return(null); } else if (pps.slice_group_map_type == 6) { map = pps.slice_group_id; } else { throw new Exception("Unsupported slice group map type"); } return(buildMapIndices(map, numGroups)); } return(null); }
public static SeqParameterSet Read(byte[] NALData) { BitStreamReader bitReader = new BitStreamReader(NALData); SeqParameterSet sps = new SeqParameterSet(); sps.profile_idc = bitReader.ReadNBit(8); sps.constraint_set_0_flag = bitReader.ReadBool(); sps.constraint_set_1_flag = bitReader.ReadBool(); sps.constraint_set_2_flag = bitReader.ReadBool(); sps.constraint_set_3_flag = bitReader.ReadBool(); bitReader.ReadNBit(4); //reserved_zero_4bits sps.level_idc = bitReader.ReadNBit(8); sps.seq_parameter_set_id = bitReader.ReadUE(); sps.chroma_format_idc = ChromaFormat.Yuv420; if (sps.profile_idc == 100 || sps.profile_idc == 110 || sps.profile_idc == 122 || sps.profile_idc == 244 || sps.profile_idc == 44) { sps.chroma_format_idc = (ChromaFormat)bitReader.ReadUE(); if (sps.chroma_format_idc == ChromaFormat.Yuv444) { sps.residual_color_transform_flag = bitReader.ReadBool(); } sps.bit_depth_luma_minus8 = bitReader.ReadUE(); sps.bit_depth_chroma_minus8 = bitReader.ReadUE(); sps.qpprime_y_zero_transform_bypass_flag = bitReader.ReadBool(); bool seqScalingMatrixPresent = bitReader.ReadBool(); if (seqScalingMatrixPresent) { ReadScalingListMatrix(bitReader, ref sps.scalingMatrix); } } sps.log2_max_frame_num_minus4 = bitReader.ReadUE(); sps.pic_order_cnt_type = bitReader.ReadUE(); if (sps.pic_order_cnt_type == 0) { sps.log2_max_pic_order_cnt_lsb_minus4 = bitReader.ReadUE(); } else if (sps.pic_order_cnt_type == 1) { sps.delta_pic_order_always_zero_flag = bitReader.ReadBool(); sps.offset_for_non_ref_pic = bitReader.ReadSE(); sps.offset_for_top_to_bottom_field = bitReader.ReadSE(); sps.num_ref_frames_in_pic_order_cnt_cycle = bitReader.ReadUE(); sps.offsetForRefFrame = new int[sps.num_ref_frames_in_pic_order_cnt_cycle]; for (int i = 0; i < sps.num_ref_frames_in_pic_order_cnt_cycle; i++) { sps.offsetForRefFrame[i] = bitReader.ReadSE(); } } sps.num_ref_frames = bitReader.ReadUE(); sps.gaps_in_frame_num_value_allowed_flag = bitReader.ReadBool(); sps.pic_width_in_mbs_minus1 = bitReader.ReadUE(); sps.pic_height_in_map_units_minus1 = bitReader.ReadUE(); sps.frame_mbs_only_flag = bitReader.ReadBool(); if (!sps.frame_mbs_only_flag) { sps.mb_adaptive_frame_field_flag = bitReader.ReadBool(); } sps.direct_8x8_inference_flag = bitReader.ReadBool(); sps.frame_cropping_flag = bitReader.ReadBool(); if (sps.frame_cropping_flag) { sps.frame_crop_left_offset = bitReader.ReadUE(); sps.frame_crop_right_offset = bitReader.ReadUE(); sps.frame_crop_top_offset = bitReader.ReadUE(); sps.frame_crop_bottom_offset = bitReader.ReadUE(); } bool vui_parameters_present_flag = bitReader.ReadBool(); if (vui_parameters_present_flag) { ReadVUIParameters(bitReader, ref sps.vuiParams); } return(sps); }
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET: //ORIGINAL LINE: public SliceHeader(InputStream is, com.googlecode.mp4parser.h264.model.SeqParameterSet sps, com.googlecode.mp4parser.h264.model.PictureParameterSet pps, boolean IdrPicFlag) throws IOException public SliceHeader(Stream @is, SeqParameterSet sps, PictureParameterSet pps, bool IdrPicFlag) { @is.ReadByte(); CAVLCReader reader = new CAVLCReader(@is); first_mb_in_slice = reader.readUE("SliceHeader: first_mb_in_slice"); switch (reader.readUE("SliceHeader: slice_type")) { case 0: case 5: slice_type = SliceType.P; break; case 1: case 6: slice_type = SliceType.B; break; case 2: case 7: slice_type = SliceType.I; break; case 3: case 8: slice_type = SliceType.SP; break; case 4: case 9: slice_type = SliceType.SI; break; } pic_parameter_set_id = reader.readUE("SliceHeader: pic_parameter_set_id"); if (sps.residual_color_transform_flag) { colour_plane_id = reader.readU(2, "SliceHeader: colour_plane_id"); } frame_num = reader.readU(sps.log2_max_frame_num_minus4 + 4, "SliceHeader: frame_num"); if (!sps.frame_mbs_only_flag) { field_pic_flag = reader.readBool("SliceHeader: field_pic_flag"); if (field_pic_flag) { bottom_field_flag = reader.readBool("SliceHeader: bottom_field_flag"); } } if (IdrPicFlag) { idr_pic_id = reader.readUE("SliceHeader: idr_pic_id"); if (sps.pic_order_cnt_type == 0) { pic_order_cnt_lsb = reader.readU(sps.log2_max_pic_order_cnt_lsb_minus4 + 4, "SliceHeader: pic_order_cnt_lsb"); if (pps.pic_order_present_flag && !field_pic_flag) { delta_pic_order_cnt_bottom = reader.readSE("SliceHeader: delta_pic_order_cnt_bottom"); } } } }
public MapManager(SeqParameterSet sps, PictureParameterSet pps) { this.sps = sps; this.pps = pps; this.mbToSliceGroupMap = buildMap(sps, pps); }