Example #1
0
        public void Communications(object obj)
        {

            //byte[] receiveBuffer = new byte[4096];
            Dictionary<String, String> request2 = new Dictionary<String, String>();

            MJPEGVideo video = null;
            RtpModel rtpModel = null;

            var clientSocket = obj as Socket;
            var clientAddress = clientSocket.RemoteEndPoint;

            //update server box to show that a client has connected
            this.UpdateServerBox("Accepted connection from: "
                + clientSocket.RemoteEndPoint.ToString() + Environment.NewLine);

            var clientModel = new ClientModel(clientSocket);

            //watch for timer to tick and run increment timer function when ticks
            clientModel.timer.Elapsed += new ElapsedEventHandler((sender, e) => IncrementTimer(sender, e, ref rtpModel, ref video));

            while (true)
            {
                RtspRequest request = null;
                try
                {
                    request = clientModel.Listen();
                    UpdateClientBox(request.ToString() + Environment.NewLine);
                }
                catch (ArgumentException)
                {
                    break;
                }

                switch (request.RequestType)
                {
                    case RtspRequest.RtspRequestType.DESCRIBE:
                        this.UpdateServerBox("Client " + clientAddress.ToString()
                        + " has requested description" + Environment.NewLine);
                        clientModel.Send(new RtspResponse
                        {
                            RtspVersion = request.RtspVersion,
                            CSeq = request.CSeq,
                            Content = FileUtils.GetAllMJPEGFilesFromDir(ServerConfig.FilesDirectory)
                            .Aggregate(string.Empty, (res, next) => res += next + ";")
                        });
                        break;
                    case RtspRequest.RtspRequestType.SETUP:
                        this.UpdateServerBox("Client " + clientAddress.ToString()
                        + " has setted up" + Environment.NewLine);
                        rtpModel = new RtpModel(clientAddress.ToString().Split(':')[0], request.ClientPort);
                        //load video
                        video = new MJPEGVideo(request.FileName);
                        break;

                    case RtspRequest.RtspRequestType.PLAY:
                        this.UpdateServerBox("Client " + clientAddress.ToString()
                        + " is playing " + request.FileName + Environment.NewLine);
                        //start the timer
                        clientModel.timer.Start();
                        break;

                    case RtspRequest.RtspRequestType.PAUSE:
                        this.UpdateServerBox("Client " + clientAddress.ToString()
                        + " paused " + request.FileName + Environment.NewLine);
                        //pause the timer
                        clientModel.timer.Stop();
                        break;

                    case RtspRequest.RtspRequestType.TEARDOWN:
                        this.UpdateServerBox("Client " + clientAddress.ToString()
                        + " teared down " + request.FileName + Environment.NewLine);
                        //stop timer
                        clientModel.timer.Stop();
                        //server reply
                        clientModel.Send(new RtspResponse
                        {
                            RtspVersion = request.RtspVersion,
                            CSeq = request.CSeq,
                            Session = request.Session
                        });
                        video = null;
                        rtpModel = null;
                        clientModel = null;
                        clientSocket = obj as Socket;
                        clientModel = new ClientModel(clientSocket);
                        clientModel.timer.Elapsed += new ElapsedEventHandler((sender, e) => IncrementTimer(sender, e, ref rtpModel, ref video));
                        break;
                }
                if (request.RequestType != RtspRequest.RtspRequestType.DESCRIBE)
                {
                    clientModel.Send(new RtspResponse
                    {
                        RtspVersion = request.RtspVersion,
                        CSeq = request.CSeq,
                        Session = request.Session
                    });
                }
            }
        }
Example #2
0
        public void IncrementTimer(object sender, EventArgs e, ref RtpModel rtpModel, ref MJPEGVideo video)
        {
            //increment packet timer
            rtpModel.IncrementPacketTime();

            //check if end of file and if it is, then reset file
            if (video.EndofFile())
            {
                video.ResetVideo();
            }

            //get the next frame
            var videoBuffer = video.GetNextFrame();

            //packetize and send the next frame
            var packetizedVideoFrame = rtpModel.SendPacket(videoBuffer);

            //create blank byte array to store header bytes
            var headerBytes = new byte[12];

            //copy first 12 bytes of the packetized video frame into the headerBytes byte array
            System.Buffer.BlockCopy(packetizedVideoFrame, 0, headerBytes, 0, 12);

            //convert the header bytes into bits
            var headerBits = string.Join(" ", headerBytes.Select(x => Convert.ToString(x, 2).PadLeft(8, '0')));
        }