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;
                }
            }
        }