Ejemplo n.º 1
0
        public List <MUX> ParseEntireMUX(Stream currentStream)
        {
            List <MUX>           muxs             = new List <MUX>();
            MultiplexFrameHeader _mf1ConfigHeader = ParseMultiplexFrameHeader(0, currentStream);

            // 解析 控制帧
            int offset = SearchServiceMultiplexConfigTable(currentStream, _mf1ConfigHeader);

            if (offset != -1)
            {
                ParseServiceMultiplexConfigTable(offset, currentStream);
            }

            // fill the MF length
            foreach (var v in _msConfigTable.mfConfigTables)
            {
                uint len = MFLengthLookupTable(v);
                v.Length = len;
            }

            // 初始化结束,开始解视频帧
            uint offset2 = _msConfigTable.mfConfigTables[0].Length + _msConfigTable.mfConfigTables[1].Length;

            for (int i = 2; i < _msConfigTable.mpFameNum; i++)
            {
                uint offset3 = offset2;
                MUX  mux     = new MUX();
                mux.stream = currentStream;
                // 从第二个复用帧开始
                mux.muxHeader = ParseMultiplexFrameHeader((int)offset3, currentStream);
                offset3      += mux.muxHeader.headerLength + CRC_Size;

                mux.msf           = new MSF();
                mux.msf.msfHeader = ParseMSFHeader((int)offset3, currentStream);

                // 解析视频段’
                offset3           += mux.msf.msfHeader.Length + CRC_Size;
                mux.msf.videoBlock = ParseVideoBlock((int)offset3, currentStream);
                //TODO 解析 音频段
                offset3           += mux.msf.msfHeader.VideoBlockLenth;
                mux.msf.audioBlock = ParseAudioBlock((int)offset3, currentStream);

                // the next
                muxs.Add(mux);
                offset2 += _msConfigTable.mfConfigTables[i].Length;
            }
            return(muxs);
        }
Ejemplo n.º 2
0
        public int SearchServiceMultiplexConfigTable(Stream s, MultiplexFrameHeader _mf1ConfigHeader)
        {
            //定位持续业务复用配置表
            int MFHeaderOffset = 0;

            byte[] tmp = new byte[4];

            //非业务复用帧
            if (_mf1ConfigHeader.MD_ID != 0)
            {
                return(-1);
            }

            //复用帧头长度
            MFHeaderOffset = (int)_mf1ConfigHeader.headerLength + CRC_Size;
            s.Seek(MFHeaderOffset, SeekOrigin.Begin);

            int  offset = 0;
            bool re     = false;

            //读取每个控制表的标示号(1byte),寻找 持续业务复用配置表
            for (int i = 0; i < _mf1ConfigHeader.subFrameNum; i++)
            {
                s.Read(tmp, 0, 1);
                s.Seek(-1, SeekOrigin.Current);

                if (tmp[0] == 0x02)
                {
                    re = true;
                    break;
                }
                else
                {
                    offset += _mf1ConfigHeader.subFrameLength[i];
                    s.Seek(offset, SeekOrigin.Current);
                }
            }
            if (re)
            {
                return(offset + MFHeaderOffset);
            }
            else
            {
                return(-1);
            }
        }
Ejemplo n.º 3
0
        public MultiplexFrameHeader ParseMultiplexFrameHeader(int offset, Stream _stream)
        {
            _stream.Seek(offset, SeekOrigin.Begin);

            byte[] tmp = new byte[4];
            int    r   = _stream.Read(tmp, 0, 4); // read the start code,

            if (r != 4)
            {
                return(null);
            }

            if (BitTools.FindBytePattern(tmp, frameStartCode) != 0)
            {
                return(null); // start code not match, return
            }
            MultiplexFrameHeader mfHeader = new MultiplexFrameHeader();

            mfHeader.startAddr = 0x0;
            // parse frame header length 1 byte.
            _stream.Read(tmp, 0, 1);
            mfHeader.headerLength = tmp[0];

            // 再读两个字节,协议版本号5 bit, 最低版本号5 bit, 复用帧标示 6 bit
            _stream.Read(tmp, 0, 2);
            mfHeader.MD_ID = (uint)BitTools.MaskBits(tmp, 10, 6);

            // 跳过4个字节, 包括从紧急广播提示-ESG更新序列号
            _stream.Seek(4, SeekOrigin.Current);

            // 读一个字节,取出 subFrame number (4 bit)
            _stream.Read(tmp, 0, 1);
            mfHeader.subFrameNum = (uint)BitTools.MaskBits(tmp, 4, 4);

            //读取子帧长度 (3 byte)
            mfHeader.subFrameLength = new int[mfHeader.subFrameNum];

            for (int i = 0; i < mfHeader.subFrameNum; i++)
            {
                _stream.Read(tmp, 0, 3);
                mfHeader.subFrameLength[i] = BitTools.MaskBits(tmp, 0, 24);
            }
            return(mfHeader);
        }
Ejemplo n.º 4
0
        public int SearchServiceMultiplexConfigTable(Stream s, MultiplexFrameHeader _mf1ConfigHeader)
        {
            //定位持续业务复用配置表
            int MFHeaderOffset = 0;
            byte[] tmp = new byte[4];

            //非业务复用帧
            if (_mf1ConfigHeader.MD_ID != 0)
                return -1;

            //复用帧头长度
            MFHeaderOffset = (int)_mf1ConfigHeader.headerLength + CRC_Size;
            s.Seek(MFHeaderOffset, SeekOrigin.Begin);

            int offset = 0;
            bool re = false;
            //读取每个控制表的标示号(1byte),寻找 持续业务复用配置表
            for (int i = 0; i < _mf1ConfigHeader.subFrameNum; i++)
            {
                s.Read(tmp, 0, 1);
                s.Seek(-1, SeekOrigin.Current);

                if (tmp[0] == 0x02)
                {
                    re = true;
                    break;
                }
                else
                {
                    offset += _mf1ConfigHeader.subFrameLength[i];
                    s.Seek(offset, SeekOrigin.Current);
                }
            }
            if (re)
                return offset + MFHeaderOffset;
            else
                return -1;
        }
Ejemplo n.º 5
0
        public MultiplexFrameHeader ParseMultiplexFrameHeader(int offset, Stream _stream)
        {
            _stream.Seek(offset, SeekOrigin.Begin);

            byte[] tmp = new byte[4];
            int r = _stream.Read(tmp, 0, 4); // read the start code,
            if (r !=4)
                return null;

            if (BitTools.FindBytePattern(tmp, frameStartCode) != 0)
                return null; // start code not match, return

            MultiplexFrameHeader mfHeader = new MultiplexFrameHeader();
            mfHeader.startAddr = 0x0;
            // parse frame header length 1 byte.
            _stream.Read(tmp, 0, 1);
            mfHeader.headerLength = tmp[0];

            // 再读两个字节,协议版本号5 bit, 最低版本号5 bit, 复用帧标示 6 bit
            _stream.Read(tmp, 0, 2);
            mfHeader.MD_ID = (uint)BitTools.MaskBits(tmp, 10, 6);

            // 跳过4个字节, 包括从紧急广播提示-ESG更新序列号
            _stream.Seek(4, SeekOrigin.Current);

            // 读一个字节,取出 subFrame number (4 bit)
            _stream.Read(tmp, 0, 1);
            mfHeader.subFrameNum = (uint)BitTools.MaskBits(tmp, 4, 4);

            //读取子帧长度 (3 byte)
            mfHeader.subFrameLength = new int[mfHeader.subFrameNum];

            for (int i = 0; i < mfHeader.subFrameNum; i++)
            {
                _stream.Read(tmp, 0, 3);
                mfHeader.subFrameLength[i] = BitTools.MaskBits(tmp, 0, 24);
            }
            return mfHeader;
        }