Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
            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);
            }
Пример #4
0
    //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");
                }
            }
        }
    }
Пример #5
0
 public MapManager(SeqParameterSet sps, PictureParameterSet pps)
 {
     this.sps = sps;
     this.pps = pps;
     this.mbToSliceGroupMap = buildMap(sps, pps);
 }