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); }
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() { // 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); }