Beispiel #1
0
        public void Update()
        {
            if (tcpClient.Available != 0)
            {
                var buffer = new byte[tcpClient.Available];
                tcpClient.GetStream().Read(buffer, 0, buffer.Length);

                if (CurrentState == ClientStates.Handshaking)
                {
                    if (sMemory.Length < HANDSHAKE_RAND_LENGTH * 2)
                    {
                        sWriter.Write(buffer);
                        if (sMemory.Length >= HANDSHAKE_RAND_LENGTH * 2)
                        {
                            ParseS1Handshake();
                        }
                    }
                    else
                    {
                        ParseS1Handshake();
                    }
                }
                else
                {
                    var memory = new MemoryStream(buffer);
                    var reader = new EndianBinaryReader(EndianBitConverter.Big, memory);

                    while (memory.Position < memory.Length)
                    {
                        reader.ReadBytes(4); //as of now not used data
                        var bodySizeBytes = new byte[] { 0, reader.ReadByte(), reader.ReadByte(), reader.ReadByte() };
                        var bodySize      = converter.ToUInt32(bodySizeBytes, 0);

                        var messageId = (RtmpMessageTypeId)reader.ReadByte();
                        reader.ReadInt32(); //stream id is not needed as of now

                        switch (messageId)
                        {
                        case RtmpMessageTypeId.SetChunkSize:
                        {
                            ParseSetChunkSize(reader.ReadInt32());
                        }
                        break;

                        case RtmpMessageTypeId.UserControlMessage:
                        {
                            //No fawking clue why it's six bytes atm
                            ParseUserControlMessage(reader.ReadBytes(6));
                            if (CurrentState == ClientStates.WaitForStreamBeginControl)
                            {
                                //Console.WriteLine("SWITCh3");
                                CurrentState = ClientStates.WaitForConnectResult;
                            }
                            if (CurrentState == ClientStates.WaitForPublishStreamBeginResult)
                            {
                                //Console.WriteLine("Switch6");
                                CurrentState = ClientStates.Streaming;
                                SendChunkSize(100);
                            }
                        }
                        break;

                        case RtmpMessageTypeId.ServerBandwidth:
                        {
                            if (CurrentState == ClientStates.WaitingForAcknowledge)
                            {
                                //Console.WriteLine("SWITCH1");
                                SendWindowAcknowledgementSize();
                                CurrentState = ClientStates.WaitForPeerBandwidth;
                            }
                            ParseServerBandwidth(reader.ReadInt32());
                        }
                        break;

                        case RtmpMessageTypeId.ClientBandwitdh:
                        {
                            if (CurrentState == ClientStates.WaitForPeerBandwidth)
                            {
                                //Console.WriteLine("SWITCh2");
                                CurrentState = ClientStates.WaitForStreamBeginControl;
                            }
                            ParseClientBandwidth(reader.ReadInt32(), reader.ReadByte());
                        }
                        break;

                        case RtmpMessageTypeId.Audio:
                            break;

                        case RtmpMessageTypeId.Video:
                            break;

                        case RtmpMessageTypeId.AMF3:
                            break;

                        case RtmpMessageTypeId.Invoke:
                            break;

                        case RtmpMessageTypeId.AMF0:
                        {
                            var amfReader = new AmfReader();
                            amfReader.Parse(reader, bodySize);

                            if (CurrentState == ClientStates.WaitForConnectResult)
                            {
                                if (amfReader.amfData.Strings.Contains("_result"))
                                {
                                    //Console.WriteLine("SWITCH4");
                                    createStream();
                                    CurrentState = ClientStates.WaitForCreateStreamResponse;
                                }
                            }
                            if (CurrentState == ClientStates.WaitForCreateStreamResponse)
                            {
                                if (amfReader.amfData.Strings.Contains("_result"))
                                {
                                    //Console.WriteLine("SWITCH5");
                                    publish(PublisherId);
                                    CurrentState = ClientStates.WaitForPublishStreamBeginResult;
                                }
                            }

                            ParseAmf(amfReader.amfData);
                        }
                        break;

                        case RtmpMessageTypeId.Acknowledgement:
                            ParseAcknowledgement(reader.ReadInt32());
                            break;

                        default:
                            Console.WriteLine(messageId);
                            break;
                        }

                        ParseMessage(messageId, reader);
                    }
                }
            }
        }
Beispiel #2
0
        public void Update()
        {
            if(tcpClient.Available != 0)
            {
                var buffer = new byte[tcpClient.Available];
                tcpClient.GetStream().Read(buffer, 0, buffer.Length);

                if(CurrentState == ClientStates.Handshaking)
                {
                    if(sMemory.Length < HANDSHAKE_RAND_LENGTH * 2)
                    {
                        sWriter.Write(buffer);
                        if(sMemory.Length >= HANDSHAKE_RAND_LENGTH * 2)
                        {
                            ParseS1Handshake();
                        }
                    }
                    else
                    {
                        ParseS1Handshake();
                    }
                }
                else
                {
                    var memory = new MemoryStream(buffer);
                    var reader = new EndianBinaryReader(EndianBitConverter.Big, memory);

                    while (memory.Position < memory.Length)
                    {
                        reader.ReadBytes(4); //as of now not used data
                        var bodySizeBytes = new byte[] {0, reader.ReadByte(), reader.ReadByte(), reader.ReadByte()};
                        var bodySize = converter.ToUInt32(bodySizeBytes, 0);

                        var messageId = (RtmpMessageTypeId) reader.ReadByte();
                        reader.ReadInt32(); //stream id is not needed as of now

                        switch (messageId)
                        {
                            case RtmpMessageTypeId.SetChunkSize:
                                {
                                    ParseSetChunkSize(reader.ReadInt32());
                                }
                                break;
                            case RtmpMessageTypeId.UserControlMessage:
                                {
                                    //No fawking clue why it's six bytes atm
                                    ParseUserControlMessage(reader.ReadBytes(6));
                                    if(CurrentState == ClientStates.WaitForStreamBeginControl)
                                    {
                                        //Console.WriteLine("SWITCh3");
                                        CurrentState = ClientStates.WaitForConnectResult;
                                    }
                                    if(CurrentState == ClientStates.WaitForPublishStreamBeginResult)
                                    {
                                        //Console.WriteLine("Switch6");
                                        CurrentState = ClientStates.Streaming;
                                        SendChunkSize(100);
                                    }
                                }
                                break;
                            case RtmpMessageTypeId.ServerBandwidth:
                                {
                                    if(CurrentState == ClientStates.WaitingForAcknowledge)
                                    {
                                        //Console.WriteLine("SWITCH1");
                                        SendWindowAcknowledgementSize();
                                        CurrentState = ClientStates.WaitForPeerBandwidth;
                                    }
                                    ParseServerBandwidth(reader.ReadInt32());
                                }
                                break;
                            case RtmpMessageTypeId.ClientBandwitdh:
                                {
                                    if(CurrentState == ClientStates.WaitForPeerBandwidth)
                                    {
                                        //Console.WriteLine("SWITCh2");
                                        CurrentState = ClientStates.WaitForStreamBeginControl;
                                    }
                                    ParseClientBandwidth(reader.ReadInt32(), reader.ReadByte());
                                }
                                break;
                            case RtmpMessageTypeId.Audio:
                                break;
                            case RtmpMessageTypeId.Video:
                                break;
                            case RtmpMessageTypeId.AMF3:
                                break;
                            case RtmpMessageTypeId.Invoke:
                                break;
                            case RtmpMessageTypeId.AMF0:
                                {
                                    var amfReader = new AmfReader();
                                    amfReader.Parse(reader, bodySize);

                                    if(CurrentState == ClientStates.WaitForConnectResult)
                                    {
                                        if (amfReader.amfData.Strings.Contains("_result"))
                                        {
                                            //Console.WriteLine("SWITCH4");
                                            createStream();
                                            CurrentState = ClientStates.WaitForCreateStreamResponse;
                                        }
                                    }
                                    if(CurrentState == ClientStates.WaitForCreateStreamResponse)
                                    {
                                        if (amfReader.amfData.Strings.Contains("_result"))
                                        {
                                            //Console.WriteLine("SWITCH5");
                                            publish(PublisherId);
                                            CurrentState = ClientStates.WaitForPublishStreamBeginResult;
                                        }
                                    }

                                    ParseAmf(amfReader.amfData);
                                }
                                break;
                                case RtmpMessageTypeId.Acknowledgement:
                                ParseAcknowledgement(reader.ReadInt32());
                                break;
                            default:
                                Console.WriteLine(messageId);
                                break;
                        }

                        ParseMessage(messageId, reader);
                    }
                }
            }
        }