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;
        }
Exemplo n.º 5
0
        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;
        }
Exemplo n.º 6
0
        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;
        }