< Summary - ReFlex - Library

Information
Class: ReFlex.Sensor.EmulatorModule.DepthStreamRecorder
Assembly: ReFlex.Sensor.EmulatorModule
File(s): D:\a\reflex\reflex\library\src\Sensor\EmulatorModule\DepthStreamRecorder.cs
Line coverage
85%
Covered lines: 74
Uncovered lines: 13
Coverable lines: 87
Total lines: 158
Line coverage: 85%
Branch coverage
44%
Covered branches: 17
Total branches: 38
Branch coverage: 44.7%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
get_SessionName()100%11100%
get_IsRecording()100%11100%
.ctor()100%11100%
StartRecording(...)33.33%191884%
StopRecording()50%161269.23%
SaveImage(...)100%22100%
SaveAsync()25%4470.58%

File(s)

D:\a\reflex\reflex\library\src\Sensor\EmulatorModule\DepthStreamRecorder.cs

#LineLine coverage
 1using System;
 2using System.IO;
 3using System.Threading.Tasks;
 4using Newtonsoft.Json;
 5using NLog;
 6using ReFlex.Core.Common.Components;
 7using ReFlex.Core.Common.Util;
 8using ReFlex.Core.Tracking.Interfaces;
 9using SixLabors.ImageSharp;
 10using SixLabors.ImageSharp.PixelFormats;
 11
 12namespace ReFlex.Sensor.EmulatorModule
 13{
 14    public class DepthStreamRecorder
 15    {
 216        private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
 17
 18        private IDepthCamera _recordingCamera;
 19
 20        private string _sessionDir;
 21
 22        private StreamParameter _sessionParams;
 23
 24        private bool _usePng;
 25
 2626        public string SessionName { get; private set; }
 27
 13028        public bool IsRecording { get; private set; }
 29
 2630        public uint FrameId = 0;
 31
 32        public event EventHandler<RecordingStateUpdate> RecordingStateUpdated;
 33
 34        public string StartRecording(IDepthCamera camera, string name, bool usePng = false)
 2635        {
 2636            if (IsRecording)
 037            {
 038                Logger.Log(LogLevel.Warn, $"Already recording from {_recordingCamera?.ModelDescription} with Config {_re
 039                return "";
 40            }
 41
 2642            _recordingCamera = camera;
 2643            _usePng = usePng;
 44
 45            // delete recording with existing name
 2646            if (RecordingUtils.DeleteRecording(name))
 047                Logger.Warn($"Existing Recording with name '{name}' has been deleted.");
 48
 2649            var date = $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}";
 50
 2651            var dir = Directory.CreateDirectory($"{RecordingUtils.SavePath}{date}");
 52
 2653            _sessionDir = dir.FullName;
 2654            _sessionParams = new StreamParameter(_recordingCamera.StreamParameter.Width, _recordingCamera.StreamParamete
 55
 2656            _recordingCamera.DepthImageReady += SaveImage;
 57
 2658            Logger.Log(LogLevel.Info, $"Start recording from {_recordingCamera?.ModelDescription} with Config {_recordin
 59
 2660            IsRecording = true;
 61
 2662            SessionName = name;
 63
 2664            RecordingStateUpdated?.Invoke(this, new RecordingStateUpdate(RecordingState.Recording, (int)FrameId, Session
 65
 2666            var result = JsonConvert.SerializeObject(_sessionParams);
 67
 2668            using (var writer = File.CreateText($"{_sessionDir}/{RecordingUtils.ConfigFile}"))
 2669            {
 2670                writer.Write(result);
 2671            }
 72
 2673            return _sessionDir;
 2674        }
 75
 76        public async Task<string> StopRecording()
 2677        {
 2678            if (!IsRecording)
 079                return "";
 80
 2681            if (_recordingCamera == null)
 082            {
 083                Logger.Log(LogLevel.Error, $"Cannot {nameof(StopRecording)} for {GetType().Name}: No valid Camera set fo
 084                return "";
 85            }
 86
 2687            _recordingCamera.DepthImageReady -= SaveImage;
 2688            Logger.Log(LogLevel.Info, $"Successfully Recorded {FrameId + 1} frames from {_recordingCamera?.ModelDescript
 89
 2690            IsRecording = false;
 91
 2692            RecordingStateUpdated?.Invoke(this, new RecordingStateUpdate(RecordingState.Stopped, (int) FrameId, SessionN
 93
 2694            FrameId = 0;
 95
 5296            return await Task.Run(() => JsonConvert.SerializeObject(_sessionParams));
 2697        }
 98
 99
 100
 101        private void SaveImage(object sender, ImageByteArray cameraData)
 26102        {
 26103            var id = $"{FrameId:0000000}";
 104
 26105            FrameId += 1;
 106
 26107            var extension = _usePng ? "png" : "jpg";
 26108            var fileName = $"{_sessionDir}/{id}.{extension}";
 109
 110
 111
 52112            Task.Run(async () => {
 26113
 26114                switch (cameraData.Format)
 26115                {
 26116                    case DepthImageFormat.Greyccale48bpp:
 10117                        await SaveAsync<Rgb48>(fileName, cameraData);
 10118                        break;
 26119                    case DepthImageFormat.Greyscale8bpp:
 6120                        await SaveAsync<L8>(fileName, cameraData);
 6121                        break;
 26122                    case DepthImageFormat.Rgb24bpp:
 26123                    default:
 10124                        await SaveAsync<Rgb24>(fileName, cameraData);
 10125                        break;
 26126                }
 52127            }).Wait();
 26128        }
 129
 130        private async Task<bool> SaveAsync<T>(string fileName, ImageByteArray cameraData) where T: unmanaged, IPixel<T>
 26131        {
 132            try
 26133            {
 26134                using (var image =
 26135                    Image.LoadPixelData<T>(cameraData.ImageData, cameraData.Width, cameraData.Height))
 26136                {
 52137                    await Task.Run(() => {
 26138
 26139                        if (fileName.EndsWith(".png", StringComparison.OrdinalIgnoreCase))
 20140                            image.SaveAsPng(fileName);
 26141                        else
 6142                            image.SaveAsJpeg(fileName);
 52143                        });
 26144                    RecordingStateUpdated?.Invoke(this, new RecordingStateUpdate(RecordingState.Recording, (int)FrameId,
 26145                }
 26146            }
 0147            catch (Exception e)
 0148            {
 0149                Logger.Log(LogLevel.Error, e, $"{e.GetType().Name} when saving Image to {fileName}: {e.Message}");
 0150                RecordingStateUpdated?.Invoke(this, new RecordingStateUpdate(RecordingState.Faulted, (int)FrameId, Sessi
 151
 0152                return false;
 153            }
 154
 26155            return true;
 26156        }
 157    }
 158}