private void ShutdownStreamer(ClientStreamer streamer, string info) { Log.Information($"Shutting down: {info}"); streamer.StopFrameProcessing(); streamer.BlockingUpdate(new ClientStreamerConfig(null, null, null, null, null, null, 0.0, Disposing: true)); streamer.Dispose(); Log.Information($"Shut down: {info}"); }
internal void ProcessMain(ClientStreamer mainStreamer, IDeviceIndicators kpi, StreamerRebuildContext lastRebuildContext) { if (mainStreamer == null) { kpi.CloudOut.State = IndicatorState.Disabled; kpi.Encoder.State = IndicatorState.Disabled; _cloudOutAverage = null; } else { if (_cloudOutAverage == null) { _cloudOutAverage = new AverageIntValue(3, true); } var stat = mainStreamer.ResourceManager.GetStatistics(out var period); var overload = mainStreamer.ResourceManager.GetOverload(); int failedInputs = 0; if (_coreData.Root.Settings.SelectedScene != null && _coreData.Root.Scenes.TryGetValue(_coreData.Root.Settings.SelectedScene, out var scene) && scene.Owner == _coreData.ThisDeviceId) { ProcessInputs(stat, lastRebuildContext.Videos, "V", _prevVideos, scene.VideoIssues, s => scene.VideoIssues = s); ProcessInputs(stat, lastRebuildContext.Audios, "A", _prevAudios, scene.AudioIssues, s => scene.AudioIssues = s); if (scene.VideoIssues != null) { foreach (var vi in scene.VideoIssues) { if (scene.Items.TryGetValue(vi.Id, out var item) && item.Visible) { failedInputs++; } } } if (scene.AudioIssues != null) { foreach (var vi in scene.AudioIssues) { if (scene.Audios.TryGetValue(vi.Id, out var item) && !item.Muted) { failedInputs++; } } } } ProcessMainKpi(stat, kpi, period, overload, failedInputs); } }
internal void ProcessReceivier(ClientStreamer receiverStreamer, IDeviceIndicators kpi) { if (receiverStreamer == null) { kpi.CloudIn.State = IndicatorState.Disabled; _cloudInAverage = null; } else { if (_cloudInAverage == null) { _cloudInAverage = new AverageIntValue(3, true); } var stat = receiverStreamer.ResourceManager.GetStatistics(out var period); var input = stat.FirstOrDefault(s => s.Name.Name == "I" && s.Name.Trunk == "0" && s.Name.TrunkPrefix == "V"); if (input == null) { kpi.CloudIn.State = IndicatorState.Disabled; // no outgest data yet } else { var data = (StatisticDataOfInputOutput)input.Data; var bitrate = (int)(data.Bytes * 8 / period.TotalMilliseconds); var ave = _cloudInAverage.AddValue(bitrate); IndicatorState state = IndicatorState.Ok; if (data.Errors > 0 || bitrate == 0) { state = IndicatorState.Error; } else { var bitratePercent = (ave * 100) / _coreData.Settings.Bitrate; if (bitratePercent < 60) { state = IndicatorState.Warning; } } kpi.CloudIn.Bitrate = ave; kpi.CloudIn.State = state; } } }
public void RefreshStreamer() { var settings = _coreData.Root.Settings; if (settings.SelectedScene == null || !_coreData.Root.Scenes.TryGetValue(settings.SelectedScene, out var scene)) { Log.Warning($"Bad scene '{settings.SelectedScene}'"); return; } // shutdown if (scene.Owner == _coreData.ThisDeviceId) { if (_coreData.ThisDevice.RequireOutgest) { Log.Information("Withdrawing outgest"); _coreData.ThisDevice.RequireOutgest = false; } if (_receiverStreamer != null) { ShutdownStreamer(_receiverStreamer, "receiving streamer"); _receiverStreamer = null; } } else { if (_mainStreamer != null) { ShutdownStreamer(_mainStreamer, "main streamer"); _mainStreamer = null; } } // start if (scene.Owner == _coreData.ThisDeviceId) { if (_mainStreamer == null) { _mainStreamer = new ClientStreamer("main", _hardwareEncoderCheck); } _mainStreamer.StartUpdate(RebuildMainStreamerConfig(scene, _mainStreamer.GetDxFailureCounter())); } else { if (!_coreData.ThisDevice.RequireOutgest) { Log.Information("Requesting outgest"); //_coreData.ThisDevice.RequireOutgestType = RequireOutgestType.Rtmp; _coreData.ThisDevice.RequireOutgestType = RequireOutgestType.Tcp; _coreData.ThisDevice.RequireOutgest = true; } if (_receiverStreamer == null) { _receiverStreamer = new ClientStreamer("main", _hardwareEncoderCheck); } _receiverStreamer.StartUpdate(GetReceiverStreamerConfig(_receiverStreamer.GetDxFailureCounter())); } }