示例#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);
        }
示例#2
0
 public static int GetHeaderLength(ChunkMessageHeaderType chunkMessageHeaderType)
 {
     switch (chunkMessageHeaderType)
     {
         case ChunkMessageHeaderType.New:
             return 11;
         case ChunkMessageHeaderType.SameSource:
             return 7;
         case ChunkMessageHeaderType.TimestampAdjustment:
             return 3;
         case ChunkMessageHeaderType.Continuation:
             return 0;
         default:
             return -1;
     }
 }
        void WriteBasicHeaderAsync(ChunkMessageHeaderType messageHeaderFormat, int streamId)
        {
            var fmt = (byte)messageHeaderFormat;

            if (streamId <= 63)
            {
                writer.WriteByteAsync((byte)((fmt << 6) + streamId));
            }
            else if (streamId <= 320)
            {
                writer.WriteByteAsync((byte)(fmt << 6));
                writer.WriteByteAsync((byte)(streamId - 64));
            }
            else
            {
                writer.WriteByteAsync((byte)((fmt << 6) | 1));
                writer.WriteByteAsync((byte)((streamId - 64) & 0xff));
                writer.WriteByteAsync((byte)((streamId - 64) >> 8));
            }
        }
        public static int GetHeaderLength(ChunkMessageHeaderType chunkMessageHeaderType)
        {
            switch (chunkMessageHeaderType)
            {
            case ChunkMessageHeaderType.New:
                return(11);

            case ChunkMessageHeaderType.SameSource:
                return(7);

            case ChunkMessageHeaderType.TimestampAdjustment:
                return(3);

            case ChunkMessageHeaderType.Continuation:
                return(0);

            default:
                return(-1);
            }
        }
        private void WriteBasicHeader(ChunkMessageHeaderType messageHeaderFormat, int streamId)
        {
            byte num = (byte)messageHeaderFormat;

            if (streamId <= 63)
            {
                this._writer.WriteByte((byte)(((int)num << 6) + streamId));
            }
            else if (streamId <= 320)
            {
                this._writer.WriteByte((byte)((uint)num << 6));
                this._writer.WriteByte((byte)(streamId - 64));
            }
            else
            {
                this._writer.WriteByte((byte)((int)num << 6 | 1));
                this._writer.WriteByte((byte)(streamId - 64 & (int)byte.MaxValue));
                this._writer.WriteByte((byte)(streamId - 64 >> 8));
            }
        }
        private void WriteMessageHeader(RtmpHeader header, RtmpHeader previousHeader)
        {
            ChunkMessageHeaderType messageHeaderType = RtmpPacketWriter.GetMessageHeaderType(header, previousHeader);

            this.WriteBasicHeader(messageHeaderType, header.StreamId);
            int num = header.Timestamp < 16777215 ? header.Timestamp : 16777215;

            switch (messageHeaderType)
            {
            case ChunkMessageHeaderType.New:
                this._writer.WriteUInt24(num);
                this._writer.WriteUInt24(header.PacketLength);
                this._writer.WriteByte((byte)header.MessageType);
                this._writer.WriteReverseInt(header.MessageStreamId);
                goto case ChunkMessageHeaderType.Continuation;

            case ChunkMessageHeaderType.SameSource:
                this._writer.WriteUInt24(num);
                this._writer.WriteUInt24(header.PacketLength);
                this._writer.WriteByte((byte)header.MessageType);
                goto case ChunkMessageHeaderType.Continuation;

            case ChunkMessageHeaderType.TimestampAdjustment:
                this._writer.WriteUInt24(num);
                goto case ChunkMessageHeaderType.Continuation;

            case ChunkMessageHeaderType.Continuation:
                if (num < 16777215)
                {
                    break;
                }
                this._writer.WriteInt32(header.Timestamp);
                break;

            default:
                throw new ArgumentException("headerType");
            }
        }
 void WriteBasicHeader(ChunkMessageHeaderType messageHeaderFormat, int streamId)
 {
     var fmt = (byte)messageHeaderFormat;
     if (streamId <= 63)
     {
         writer.WriteByte((byte)((fmt << 6) + streamId));
     }
     else if (streamId <= 320)
     {
         writer.WriteByte((byte)(fmt << 6));
         writer.WriteByte((byte)(streamId - 64));
     }
     else
     {
         writer.WriteByte((byte)((fmt << 6) | 1));
         writer.WriteByte((byte)((streamId - 64) & 0xff));
         writer.WriteByte((byte)((streamId - 64) >> 8));
     }
 }