Esempio n. 1
0
        private RtmpHeader ReadHeader()
        {
            int       num1          = (int)this._reader.ReadByte();
            AmfReader reader        = this._reader;
            int       chunkStreamId = RtmpPacketReader.GetChunkStreamId((byte)num1, reader);
            int       num2          = 6;
            ChunkMessageHeaderType messageHeaderType = (ChunkMessageHeaderType)(num1 >> num2);
            RtmpHeader             rtmpHeader1       = new RtmpHeader();

            rtmpHeader1.StreamId = chunkStreamId;
            int num3 = (uint)messageHeaderType > 0U ? 1 : 0;

            rtmpHeader1.IsTimerRelative = num3 != 0;
            RtmpHeader rtmpHeader2 = rtmpHeader1;
            RtmpHeader rtmpHeader3;

            if (!this._rtmpHeaders.TryGetValue(chunkStreamId, out rtmpHeader3) && messageHeaderType != ChunkMessageHeaderType.New)
            {
                rtmpHeader3 = rtmpHeader2.Clone();
            }
            switch (messageHeaderType)
            {
            case ChunkMessageHeaderType.New:
                rtmpHeader2.Timestamp       = this._reader.ReadUInt24();
                rtmpHeader2.PacketLength    = this._reader.ReadUInt24();
                rtmpHeader2.MessageType     = (MessageType)this._reader.ReadByte();
                rtmpHeader2.MessageStreamId = this._reader.ReadReverseInt();
                break;

            case ChunkMessageHeaderType.SameSource:
                rtmpHeader2.Timestamp       = this._reader.ReadUInt24();
                rtmpHeader2.PacketLength    = this._reader.ReadUInt24();
                rtmpHeader2.MessageType     = (MessageType)this._reader.ReadByte();
                rtmpHeader2.MessageStreamId = rtmpHeader3.MessageStreamId;
                break;

            case ChunkMessageHeaderType.TimestampAdjustment:
                rtmpHeader2.Timestamp       = this._reader.ReadUInt24();
                rtmpHeader2.PacketLength    = rtmpHeader3.PacketLength;
                rtmpHeader2.MessageType     = rtmpHeader3.MessageType;
                rtmpHeader2.MessageStreamId = rtmpHeader3.MessageStreamId;
                break;

            case ChunkMessageHeaderType.Continuation:
                rtmpHeader2.Timestamp       = rtmpHeader3.Timestamp;
                rtmpHeader2.PacketLength    = rtmpHeader3.PacketLength;
                rtmpHeader2.MessageType     = rtmpHeader3.MessageType;
                rtmpHeader2.MessageStreamId = rtmpHeader3.MessageStreamId;
                rtmpHeader2.IsTimerRelative = rtmpHeader3.IsTimerRelative;
                break;

            default:
                throw new SerializationException("Unexpected header type: " + (object)(int)messageHeaderType);
            }
            if (rtmpHeader2.Timestamp == 16777215)
            {
                rtmpHeader2.Timestamp = this._reader.ReadInt32();
            }
            return(rtmpHeader2);
        }
Esempio n. 2
0
        RtmpHeader ReadHeader()
        {
            // first byte of the chunk basic header
            var chunkBasicHeaderByte   = reader.ReadByte();
            var chunkStreamId          = GetChunkStreamId(chunkBasicHeaderByte, reader);
            var chunkMessageHeaderType = (ChunkMessageHeaderType)(chunkBasicHeaderByte >> 6);

            var header = new RtmpHeader()
            {
                StreamId        = chunkStreamId,
                IsTimerRelative = chunkMessageHeaderType != ChunkMessageHeaderType.New
            };

            RtmpHeader previousHeader;

            // don't need to clone if new header, as it contains all info
            if (!rtmpHeaders.TryGetValue(chunkStreamId, out previousHeader) && chunkMessageHeaderType != ChunkMessageHeaderType.New)
            {
                previousHeader = header.Clone();
            }

            switch (chunkMessageHeaderType)
            {
            // 11 bytes
            case ChunkMessageHeaderType.New:
                header.Timestamp       = reader.ReadUInt24();
                header.PacketLength    = reader.ReadUInt24();
                header.MessageType     = (MessageType)reader.ReadByte();
                header.MessageStreamId = reader.ReadReverseInt();
                break;

            // 7 bytes
            case ChunkMessageHeaderType.SameSource:
                header.Timestamp       = reader.ReadUInt24();
                header.PacketLength    = reader.ReadUInt24();
                header.MessageType     = (MessageType)reader.ReadByte();
                header.MessageStreamId = previousHeader.MessageStreamId;
                break;

            // 3 bytes
            case ChunkMessageHeaderType.TimestampAdjustment:
                header.Timestamp       = reader.ReadUInt24();
                header.PacketLength    = previousHeader.PacketLength;
                header.MessageType     = previousHeader.MessageType;
                header.MessageStreamId = previousHeader.MessageStreamId;
                break;

            // 0 bytes
            case ChunkMessageHeaderType.Continuation:
                header.Timestamp       = previousHeader.Timestamp;
                header.PacketLength    = previousHeader.PacketLength;
                header.MessageType     = previousHeader.MessageType;
                header.MessageStreamId = previousHeader.MessageStreamId;
                header.IsTimerRelative = previousHeader.IsTimerRelative;
                break;

            default:
                throw new SerializationException("Unexpected header type: " + (int)chunkMessageHeaderType);
            }

            // extended timestamp
            if (header.Timestamp == 0xFFFFFF)
            {
                header.Timestamp = reader.ReadInt32();
            }

            return(header);
        }
Esempio n. 3
0
        RtmpHeader ReadHeader()
        {
            // first byte of the chunk basic header
            var chunkBasicHeaderByte = reader.ReadByte();
            var chunkStreamId = GetChunkStreamId(chunkBasicHeaderByte, reader);
            var chunkMessageHeaderType = (ChunkMessageHeaderType)(chunkBasicHeaderByte >> 6);

            var header = new RtmpHeader()
            {
                StreamId = chunkStreamId,
                IsTimerRelative = chunkMessageHeaderType != ChunkMessageHeaderType.New
            };

            RtmpHeader previousHeader;
            // don't need to clone if new header, as it contains all info
            if (!rtmpHeaders.TryGetValue(chunkStreamId, out previousHeader) && chunkMessageHeaderType != ChunkMessageHeaderType.New)
                previousHeader = header.Clone();

            switch (chunkMessageHeaderType)
            {
                // 11 bytes
                case ChunkMessageHeaderType.New:
                    header.Timestamp = reader.ReadUInt24();
                    header.PacketLength = reader.ReadUInt24();
                    header.MessageType = (MessageType)reader.ReadByte();
                    header.MessageStreamId = reader.ReadReverseInt();
                    break;

                // 7 bytes
                case ChunkMessageHeaderType.SameSource:
                    header.Timestamp = reader.ReadUInt24();
                    header.PacketLength = reader.ReadUInt24();
                    header.MessageType = (MessageType)reader.ReadByte();
                    header.MessageStreamId = previousHeader.MessageStreamId;
                    break;

                // 3 bytes
                case ChunkMessageHeaderType.TimestampAdjustment:
                    header.Timestamp = reader.ReadUInt24();
                    header.PacketLength = previousHeader.PacketLength;
                    header.MessageType = previousHeader.MessageType;
                    header.MessageStreamId = previousHeader.MessageStreamId;
                    break;

                // 0 bytes
                case ChunkMessageHeaderType.Continuation:
                    header.Timestamp = previousHeader.Timestamp;
                    header.PacketLength = previousHeader.PacketLength;
                    header.MessageType = previousHeader.MessageType;
                    header.MessageStreamId = previousHeader.MessageStreamId;
                    header.IsTimerRelative = previousHeader.IsTimerRelative;
                    break;
                default:
                    throw new SerializationException("Unexpected header type: " + (int)chunkMessageHeaderType);
            }

            // extended timestamp
            if (header.Timestamp == 0xFFFFFF)
                header.Timestamp = reader.ReadInt32();

            return header;
        }
        RtmpHeader ReadHeader()
        {
            if (reader.underlying.BaseStream is NetworkStream)
            {
                var orig_stream = (NetworkStream)reader.underlying.BaseStream;

                if (!orig_stream.DataAvailable)
                {
                    return(null);
                }
            }
            if (reader.underlying.BaseStream is SslStream)
            {
                var orig_stream = (SslStream)reader.underlying.BaseStream;
                throw new NotImplementedException();
            }
            if (reader.underlying.BaseStream is WebsocketStream)
            {
                return(null);
                //var orig_stream = (WebsocketStream)reader.underlying.BaseStream;

                //if (!orig_stream.DataAvailable)
                //{
                //    return null;
                //}
            }

            // first byte of the chunk basic header
            var chunkBasicHeaderByte   = reader.ReadByte();
            var chunkStreamId          = GetChunkStreamId(chunkBasicHeaderByte, reader);
            var chunkMessageHeaderType = (ChunkMessageHeaderType)(chunkBasicHeaderByte >> 6);

            var header = new RtmpHeader()
            {
                StreamId        = chunkStreamId,
                IsTimerRelative = chunkMessageHeaderType != ChunkMessageHeaderType.New
            };

            RtmpHeader previousHeader;

            // don't need to clone if new header, as it contains all info
            if (!rtmpHeaders.TryGetValue(chunkStreamId, out previousHeader) && chunkMessageHeaderType != ChunkMessageHeaderType.New)
            {
                previousHeader = header.Clone();
            }

            switch (chunkMessageHeaderType)
            {
            // 11 bytes
            case ChunkMessageHeaderType.New:
                header.Timestamp       = reader.ReadUInt24();
                header.PacketLength    = reader.ReadUInt24();
                header.MessageType     = (MessageType)reader.ReadByte();
                header.MessageStreamId = reader.ReadReverseInt();
                break;

            // 7 bytes
            case ChunkMessageHeaderType.SameSource:
                header.Timestamp       = reader.ReadUInt24();
                header.PacketLength    = reader.ReadUInt24();
                header.MessageType     = (MessageType)reader.ReadByte();
                header.MessageStreamId = previousHeader.MessageStreamId;
                break;

            // 3 bytes
            case ChunkMessageHeaderType.TimestampAdjustment:
                header.Timestamp       = reader.ReadUInt24();
                header.PacketLength    = previousHeader.PacketLength;
                header.MessageType     = previousHeader.MessageType;
                header.MessageStreamId = previousHeader.MessageStreamId;
                break;

            // 0 bytes
            case ChunkMessageHeaderType.Continuation:
                header.Timestamp       = previousHeader.Timestamp;
                header.PacketLength    = previousHeader.PacketLength;
                header.MessageType     = previousHeader.MessageType;
                header.MessageStreamId = previousHeader.MessageStreamId;
                header.IsTimerRelative = previousHeader.IsTimerRelative;
                break;

            default:
                throw new SerializationException("Unexpected header type: " + (int)chunkMessageHeaderType);
            }

            // extended timestamp
            if (header.Timestamp == 0xFFFFFF)
            {
                header.Timestamp = reader.ReadInt32();
            }

            return(header);
        }