public void Close() { logger.Debug("VideoStreamer::Close()"); if (running) { state = StreamerState.Closing; syncEvent.Set(); } else { CleanUp(); } }
private void CleanUp() { logger.Debug("VideoStreamer::CleanUp()"); if (videoEncoder != null) { videoEncoder.DataEncoded -= VideoEncoder_DataEncoded; videoEncoder.Close(); videoEncoder = null; } videoSource.BufferUpdated -= ScreenSource_BufferUpdated; RtpSender?.Close(); state = StreamerState.Closed; }
private void AsyncProducer() { try { while (_state == StreamerState.Started) { Enqueue0(Acquire()); } } catch (ThreadInterruptedException) { } catch (EndOfStreamException) { } finally { lock (_stateLock) if (_state == StreamerState.Stopping) { _state = StreamerState.Stopped; } } }
public sealed override void Stop() { lock (_stateLock) if (_state == StreamerState.Started) { Stopping?.Invoke(this, EventArgs.Empty); if (_tProducer.IsAlive) { _tProducer.Interrupt(); _state = StreamerState.Stopping; } else { _state = StreamerState.Stopped; } } else { throw new Exception($"Illegal State: {_state}"); } }
public sealed override void Start() { lock (_stateLock) { if (_state != StreamerState.Initialized) { throw new Exception($"Illegal State: {_state}"); } _state = StreamerState.Started; _queued.Clear(); _semaphore = new Semaphore(0, int.MaxValue); Started?.Invoke(this, EventArgs.Empty); } (_tProducer = new Thread(AsyncProducer) { IsBackground = true, Name = $"Stream '{StreamId}' Producer", Priority = ThreadPriority.AboveNormal }).Start(); (_tConsumer = new Thread(AsyncConsumer) { IsBackground = true, Name = $"Stream '{StreamId}' Consumer", Priority = ThreadPriority.BelowNormal }).Start(); }
public bool Start() { logger.Debug("ScreenStreamer::Start()"); if (running) { return(false); } if (state != StreamerState.Initialized) { //... return(false); } state = StreamerState.Starting; Task.Run(() => { DoStreaming(); }); return(true); }
public void Setup(VideoEncoderSettings encoderSettings, NetworkSettings networkSettings) { logger.Debug("ScreenStreamer::Setup()"); this.Id = "VideoStreamer_" + Guid.NewGuid().ToString(); this.EncoderSettings = encoderSettings; this.NetworkSettings = networkSettings; try { H264Session = new H264Session(); if (networkSettings.TransportMode == TransportMode.Tcp) { RtpSender = new RtpTcpSender(H264Session); } else if (networkSettings.TransportMode == TransportMode.Udp) { RtpSender = new RtpUdpSender(H264Session); } else { throw new FormatException("NotSupportedFormat " + networkSettings.TransportMode); } //rtpStreamer = new RtpStreamer(h264Session); RtpSender.Setup(networkSettings); networkSettings.SSRC = H264Session.SSRC; RtpSender.Start(); //var hwContext = screenSource.hwContext; //var hwDevice = hwContext.device; //var srcSize = videoSource.SrcSize; //new Size(screenSource.Buffer.bitmap.Width, screenSource.Buffer.bitmap.Height); //if (encodingSettings.UseResoulutionFromSource) //{ // encodingSettings.Resolution = srcSize; //} //encoder = new FFmpegVideoEncoder(); //encoder.Open(encodingParams); //encoder.DataEncoded += Encoder_DataEncoded; videoEncoder = new VideoEncoder(videoSource); videoEncoder.Open(encoderSettings); videoEncoder.DataEncoded += VideoEncoder_DataEncoded; videoSource.BufferUpdated += ScreenSource_BufferUpdated; state = StreamerState.Initialized; } catch (Exception ex) { logger.Error(ex); CleanUp(); throw; } }
private void DoStreaming() { running = true; logger.Info("Streaming thread started..."); if (state != StreamerState.Starting) { //... } try { streamStats.Reset(); // Statistic.RegisterCounter(streamStats); //var hwContext = screenSource.hwContext; //mfEncoder.Start(); state = StreamerState.Streaming; StateChanged?.Invoke(); while (state == StreamerState.Streaming) { try { if (!syncEvent.WaitOne(1000)) { continue; } if (state != StreamerState.Streaming) { break; } sw.Restart(); videoEncoder.Encode(); } catch (Exception ex) { logger.Error(ex); Thread.Sleep(1000); } } } catch (Exception ex) { logger.Error(ex); } finally { CleanUp(); //Statistic.UnregisterCounter(streamStats); running = false; state = StreamerState.Closed; StateChanged?.Invoke(); } logger.Info("Streaming thread ended..."); }