//Tear down button is clicked public void Teardown(object sender, EventArgs e) { //Determine which view to control view = (View)((Button)sender).FindForm(); //send the request message to the server rtspModel.Send(new RtspRequest { RequestType = RtspRequest.RtspRequestType.TEARDOWN, FileName = VideoName, SessionID = sessionNum }); //wait for the reply from the server try { var response = rtspModel.Listen(); sessionNum = response.Session; UpdateServerBox(response.ToString() + Environment.NewLine); UpdateClientBox("New RTSP State: TEARDOWN" + Environment.NewLine); //reset sequence number rtspModel.CSeqNum = 1; //disable & enable appropriate buttons view.EnableButton(View.Buttons.Setup); view.DisableButton(View.Buttons.Play); view.DisableButton(View.Buttons.Pause); view.DisableButton(View.Buttons.Teardowm); } catch (ArgumentException ex) { UpdateServerBox($"Error: {ex.Message}{Environment.NewLine}"); } }
//communications thread for UDP socket to receive video frames public void Communications() { //used to receive video frames from server rtpModel = new RtpModel(this.ServerIP, this.ServerPort, ClientPort); while (true) { //converts the video frame into an image var currentVideoFrame = rtpModel.GetImage(ref videoFrame); //break out of loop if video is over if (currentVideoFrame == null) { view.DisableButton(View.Buttons.Pause); break; } //store the video header var videoFrameHeader = new byte[12]; Buffer.BlockCopy(videoFrame, 0, videoFrameHeader, 0, videoFrameHeader.Length); //if packet report is checked, display packet report if (view.IsPacketReportChecked) { //get sequence number var sequenceNum = new byte[2]; Buffer.BlockCopy(videoFrameHeader, 2, sequenceNum, 0, sequenceNum.Length); Array.Reverse(sequenceNum); BitArray sequenceNumBits = new BitArray(sequenceNum); int seqNumBitsStr = GetIntFromBitArray(sequenceNumBits); //get time stamp var timeStamp = new byte[4]; Buffer.BlockCopy(videoFrameHeader, 4, timeStamp, 0, timeStamp.Length); Array.Reverse(timeStamp); var timeStampBits = new BitArray(timeStamp); var timeStampBitsStr = GetIntFromBitArray(timeStampBits); //get payload type var type = new byte[1]; Buffer.BlockCopy(videoFrameHeader, 1, type, 0, type.Length); var typeBits = new BitArray(type); typeBits.Set(7, false); var timeBitsStr = GetIntFromBitArray(typeBits); this.UpdateClientBox(Environment.NewLine + "Got RTP packet with SeqNum #" + seqNumBitsStr + ", Timestamp: " + timeStampBitsStr + " of type " + timeBitsStr + Environment.NewLine); } //display the image view.SetImageBox(currentVideoFrame); } }
//Play button is clicked public void Play(object sender, EventArgs e) { //Determine which view to control view = (View)((Button)sender).FindForm(); //send the request message to the server rtspModel.Send(new RtspRequest { RequestType = RtspRequest.RtspRequestType.PLAY, FileName = VideoName, SessionID = sessionNum }); //wait for the reply from the server try { var response = rtspModel.Listen(); UpdateServerBox(response.ToString() + Environment.NewLine); //Start UDP video thread to start receiving images if (videoTimerThread == null) { this.videoTimerThread = new Thread(Communications); videoTimerThread.IsBackground = true; //to stop all threads with application is terminated this.videoTimerThread.Start(); } UpdateClientBox("New RTSP State: PLAYING" + Environment.NewLine); //disable & enable appropriate buttons view.DisableButton(View.Buttons.Play); view.EnableButton(View.Buttons.Pause); view.EnableButton(View.Buttons.Teardowm); } catch (ArgumentException ex) { UpdateServerBox($"Error: {ex.Message}{Environment.NewLine}"); } }