public async Task EventBasedReconstruction(Stream aedatFile, CameraParameters cam, int eventsPerFrame, int maxFrames, StorageFolder folder, string fileName) { byte[] bytes = new byte[5 * Convert.ToInt32(Math.Pow(10, 8))]; // Read 0.5 GB at a time int lastTime = -999999; int timeStamp; int frameCount = 0; int writeBufferSize = 50000; // Maximum number of characters to collect before writing to disk // Create CSV file StorageFile file = await folder.CreateFileAsync(fileName + ".csv", CreationCollisionOption.GenerateUniqueName); await FileIO.WriteTextAsync(file, "On Count,Off Count, Duration\n"); string fileConent = ""; int onCount = 0; int offCount = 0; int bytesRead = aedatFile.Read(bytes, 0, bytes.Length); // Read through AEDAT file while (bytesRead != 0 && frameCount < maxFrames) { for (int i = 0, length = bytesRead; i < length; i += AedatUtilities.dataEntrySize) // iterate through file, 8 bytes at a time. { AEDATEvent currentEvent = new AEDATEvent(bytes, i, cam); _ = currentEvent.onOff ? onCount++ : offCount++; timeStamp = currentEvent.time; if (lastTime == -999999) { lastTime = timeStamp; } else { if (onCount + offCount >= eventsPerFrame) // Collected enough events, add frame to video { try { fileConent += onCount + "," + offCount + "," + (timeStamp - lastTime) + "\n"; // Write to file if buffer size is reached if (fileConent.Length > writeBufferSize) { await FileIO.AppendTextAsync(file, fileConent); fileConent = ""; } } catch { } onCount = 0; offCount = 0; frameCount++; // Stop adding frames to video if max frames has been reached if (frameCount >= maxFrames) { break; } lastTime = timeStamp; } } } bytesRead = aedatFile.Read(bytes, 0, bytes.Length); } // Append any remaining data await FileIO.AppendTextAsync(file, fileConent); }
private async void SelectFile_Tapped(object sender, TappedRoutedEventArgs e) { EventColor onColor; EventColor offColor; int frameTime; int maxFrames; float fps; try { // Grab video reconstruction settings from GUI // Will throw a FormatException if input is invalid (negative numbers or input has letters) (frameTime, maxFrames, onColor, offColor, fps) = ParseVideoSettings(); } catch (FormatException) { await invaldVideoSettingsDialog.ShowAsync(); return; } // Select AEDAT file to be converted to video var picker = new FileOpenPicker { ViewMode = PickerViewMode.Thumbnail, SuggestedStartLocation = PickerLocationId.PicturesLibrary }; picker.FileTypeFilter.Add(".AEDAT"); // Select AEDAT file to be converted StorageFile file = await picker.PickSingleFileAsync(); if (file == null) { return; } var headerData = await AedatUtilities.GetHeaderData(file); var aedatFile = (await file.OpenReadAsync()).AsStreamForRead(); aedatFile.Seek(headerData.Item1, SeekOrigin.Begin); // Skip over header. CameraParameters cam = headerData.Item2; if (cam == null) { await invalidCameraDataDialog.ShowAsync(); return; } showLoading.IsActive = true; backgroundTint.Visibility = Windows.UI.Xaml.Visibility.Visible; float playback_frametime = 1.0f / fps; MediaComposition composition; if (playbackType.IsOn) { composition = await TimeBasedReconstruction(aedatFile, cam, onColor, offColor, frameTime, maxFrames, playback_frametime); } else { int numOfEvents = Int32.Parse(numOfEventInput.Text); composition = await EventBasedReconstruction(aedatFile, cam, onColor, offColor, numOfEvents, maxFrames, playback_frametime); } SaveCompositionToFile(composition, file.DisplayName, cam.cameraX, cam.cameraY); }
public async Task <MediaComposition> EventBasedReconstruction(Stream aedatFile, CameraParameters cam, EventColor onColor, EventColor offColor, int eventsPerFrame, int maxFrames, float playback_frametime) { byte[] aedatBytes = new byte[5 * Convert.ToInt32(Math.Pow(10, 8))]; // Read 0.5 GB at a time MediaComposition composition = new MediaComposition(); int frameCount = 0; int eventCount = 0; Stream pixelStream = InitBitMap(cam); byte[] currentFrame = new byte[pixelStream.Length]; int bytesRead = aedatFile.Read(aedatBytes, 0, aedatBytes.Length); while (bytesRead != 0 && frameCount < maxFrames) { // Read through AEDAT file for (int i = 0, length = bytesRead; i < length; i += AedatUtilities.dataEntrySize) // iterate through file, 8 bytes at a time. { AEDATEvent currentEvent = new AEDATEvent(aedatBytes, i, cam); AedatUtilities.SetPixel(ref currentFrame, currentEvent.x, currentEvent.y, (currentEvent.onOff ? onColor.Color : offColor.Color), cam.cameraX); eventCount++; if (eventCount >= eventsPerFrame) // Collected events within specified timeframe, add frame to video { eventCount = 0; WriteableBitmap b = new WriteableBitmap(cam.cameraX, cam.cameraY); using (Stream stream = b.PixelBuffer.AsStream()) { await stream.WriteAsync(currentFrame, 0, currentFrame.Length); } SoftwareBitmap outputBitmap = SoftwareBitmap.CreateCopyFromBuffer(b.PixelBuffer, BitmapPixelFormat.Bgra8, b.PixelWidth, b.PixelHeight, BitmapAlphaMode.Ignore); CanvasBitmap bitmap2 = CanvasBitmap.CreateFromSoftwareBitmap(CanvasDevice.GetSharedDevice(), outputBitmap); // Set playback framerate MediaClip mediaClip = MediaClip.CreateFromSurface(bitmap2, TimeSpan.FromSeconds(playback_frametime)); composition.Clips.Add(mediaClip); frameCount++; // Stop adding frames to video if max frames has been reached if (frameCount >= maxFrames) { return(composition); } currentFrame = new byte[pixelStream.Length]; } } bytesRead = aedatFile.Read(aedatBytes, 0, aedatBytes.Length); } return(composition); }
private async void SelectFile_Tapped(object sender, TappedRoutedEventArgs e) { int frameTime; int maxFrames; try { // Grab video reconstruction settings from GUI // Will throw a FormatException if input is invalid (negative numbers or input has letters) (frameTime, maxFrames) = ParseVideoSettings(); } catch (FormatException) { await invaldVideoSettingsDialog.ShowAsync(); return; } // Select AEDAT file to be converted to video var picker = new FileOpenPicker { ViewMode = PickerViewMode.Thumbnail, SuggestedStartLocation = PickerLocationId.PicturesLibrary }; picker.FileTypeFilter.Add(".AEDAT"); // Select AEDAT file to be converted IReadOnlyList <StorageFile> files = await picker.PickMultipleFilesAsync(); if (files == null) { showLoading.IsActive = false; backgroundTint.Visibility = Windows.UI.Xaml.Visibility.Collapsed; return; } var picker2 = new FolderPicker { ViewMode = PickerViewMode.Thumbnail, SuggestedStartLocation = PickerLocationId.PicturesLibrary }; picker2.FileTypeFilter.Add("*"); // Select AEDAT file to be converted StorageFolder folder = await picker2.PickSingleFolderAsync(); if (folder == null) { showLoading.IsActive = false; backgroundTint.Visibility = Windows.UI.Xaml.Visibility.Collapsed; return; } foreach (StorageFile file in files) { byte[] aedatFile = await AedatUtilities.ReadToBytes(file); // Determine camera type from AEDAT header string cameraTypeSearch = AedatUtilities.FindLineInHeader(AedatUtilities.hardwareInterfaceCheck, ref aedatFile); CameraParameters cam = AedatUtilities.ParseCameraModel(cameraTypeSearch); if (cam == null) { await invalidCameraDataDialog.ShowAsync(); return; } showLoading.IsActive = true; backgroundTint.Visibility = Windows.UI.Xaml.Visibility.Visible; StorageFolder folder2 = await folder.CreateFolderAsync(file.Name.Replace(".aedat", "") + " Event Chunks"); if (playbackType.IsOn) { await TimeBasedReconstruction(aedatFile, cam, frameTime, maxFrames, folder2, file.Name.Replace(".aedat", "")); } else { int numOfEvents = Int32.Parse(numOfEventInput.Text); await EventBasedReconstruction(aedatFile, cam, numOfEvents, maxFrames, folder2, file.Name.Replace(".aedat", "")); } } showLoading.IsActive = false; backgroundTint.Visibility = Windows.UI.Xaml.Visibility.Collapsed; }
private async void SelectFile_Tapped(object sender, TappedRoutedEventArgs e) { EventColor onColor; EventColor offColor; int frameTime; int maxFrames; try { // Grab video reconstruction settings from GUI // Will throw a FormatException if input is invalid (negative numbers or input has letters) (frameTime, maxFrames, onColor, offColor) = ParseFrameSettings(); } catch (FormatException) { await invaldVideoSettingsDialog.ShowAsync(); return; } // Select AEDAT file to be converted to video var picker = new FileOpenPicker { ViewMode = PickerViewMode.Thumbnail, SuggestedStartLocation = PickerLocationId.PicturesLibrary }; picker.FileTypeFilter.Add(".AEDAT"); // Select AEDAT file to be converted IReadOnlyList <StorageFile> files = await picker.PickMultipleFilesAsync(); if (files == null) { showLoading.IsActive = false; backgroundTint.Visibility = Windows.UI.Xaml.Visibility.Collapsed; return; } var picker2 = new FolderPicker { ViewMode = PickerViewMode.Thumbnail, SuggestedStartLocation = PickerLocationId.PicturesLibrary }; picker2.FileTypeFilter.Add("*"); // Select AEDAT file to be converted StorageFolder folder = await picker2.PickSingleFolderAsync(); if (folder == null) { showLoading.IsActive = false; backgroundTint.Visibility = Windows.UI.Xaml.Visibility.Collapsed; return; } foreach (var file in files) { var headerData = await AedatUtilities.GetHeaderData(file); var aedatFile = (await file.OpenReadAsync()).AsStreamForRead(); aedatFile.Seek(headerData.Item1, SeekOrigin.Begin); //Skip over header. CameraParameters cam = headerData.Item2; if (cam == null) { await invalidCameraDataDialog.ShowAsync(); return; } showLoading.IsActive = true; backgroundTint.Visibility = Windows.UI.Xaml.Visibility.Visible; StorageFolder folder2 = await folder.CreateFolderAsync(file.Name.Replace(".aedat", "") + (playbackType.IsOn ? " time based" : " event based") + " Frames"); if (playbackType.IsOn) { await TimeBasedReconstruction(aedatFile, cam, onColor, offColor, frameTime, maxFrames, folder2, file.Name.Replace(".aedat", "")); } else { int numOfEvents = Int32.Parse(numOfEventInput.Text); await EventBasedReconstruction(aedatFile, cam, onColor, offColor, numOfEvents, maxFrames, folder2, file.Name.Replace(".aedat", "")); } } showLoading.IsActive = false; backgroundTint.Visibility = Windows.UI.Xaml.Visibility.Collapsed; }
public async Task EventBasedReconstruction(Stream aedatFile, CameraParameters cam, EventColor onColor, EventColor offColor, int eventsPerFrame, int maxFrames, StorageFolder folder, string fileName) { byte[] aedatBytes = new byte[5 * Convert.ToInt32(Math.Pow(10, 8))]; // Read 0.5 GB at a time int frameCount = 0; int eventCount = 0; Stream pixelStream = InitBitMap(cam); byte[] currentFrame = new byte[pixelStream.Length]; int bytesRead = aedatFile.Read(aedatBytes, 0, aedatBytes.Length); while (bytesRead != 0 && frameCount < maxFrames) { // Read through AEDAT file for (int i = 0, length = bytesRead; i < length; i += AedatUtilities.dataEntrySize) // iterate through file, 8 bytes at a time. { AEDATEvent currentEvent = new AEDATEvent(aedatBytes, i, cam); AedatUtilities.SetPixel(ref currentFrame, currentEvent.x, currentEvent.y, (currentEvent.onOff ? onColor.Color : offColor.Color), cam.cameraX); eventCount++; if (eventCount >= eventsPerFrame) // Collected events within specified timeframe, add frame to video { eventCount = 0; WriteableBitmap b = new WriteableBitmap(cam.cameraX, cam.cameraY); using (Stream stream = b.PixelBuffer.AsStream()) { await stream.WriteAsync(currentFrame, 0, currentFrame.Length); } var file = await folder.CreateFileAsync(fileName + frameCount + ".png"); using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite)) { BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream); Stream pixelStream2 = b.PixelBuffer.AsStream(); byte[] pixels = new byte[pixelStream2.Length]; await pixelStream2.ReadAsync(pixels, 0, pixels.Length); encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)b.PixelWidth, (uint)b.PixelHeight, 96.0, 96.0, pixels); await encoder.FlushAsync(); } frameCount++; // Stop adding frames to video if max frames has been reached if (frameCount >= maxFrames) { return; } currentFrame = new byte[pixelStream.Length]; } } bytesRead = aedatFile.Read(aedatBytes, 0, aedatBytes.Length); } return; }