Пример #1
0
        public void TestRecordVideoLargeVideo()
        {
            ConsoleBitmap bitmap    = new ConsoleBitmap(1, 1);
            var           numFrames = 10000;

            using (var sharedStream = new MemoryStream())
            {
                var bitmapVideoWriter = new ConsoleBitmapVideoWriter(s => sharedStream.Write(Encoding.Default.GetBytes(s)));

                for (var i = 0; i < numFrames; i++)
                {
                    bitmapVideoWriter.WriteFrame(bitmap, true, TimeSpan.FromMilliseconds(i));
                }
                bitmapVideoWriter.Finish();

                sharedStream.Position = 0; // rewind the stream to the beginning to read it back

                var destination = TimeSpan.Zero;

                var reader         = new ConsoleBitmapStreamReader(sharedStream);
                var video          = reader.ReadToEnd();
                var lastFrameIndex = 0;
                var sw             = Stopwatch.StartNew();

                InMemoryConsoleBitmapFrame frame;
                while ((lastFrameIndex = video.Seek(destination, out frame, lastFrameIndex >= 0 ? lastFrameIndex : 0)) != numFrames - 1)
                {
                    destination = destination.Add(TimeSpan.FromMilliseconds(1));
                }
                sw.Stop();
                Assert.IsTrue(sw.ElapsedMilliseconds < 10);
                Console.WriteLine($"Playback took {sw.ElapsedMilliseconds} ms");
            }
        }
Пример #2
0
        public void TestRecordVideoBasic()
        {
            ConsoleBitmap bitmap = new ConsoleBitmap(4, 2), redBitmap = null, greenBitmap = null, magentaPixelBitmap = null;

            using (var sharedStream = new MemoryStream())
            {
                var bitmapVideoWriter = new ConsoleBitmapVideoWriter(s => sharedStream.Write(Encoding.Default.GetBytes(s)));

                bitmap = new ConsoleBitmap(4, 2);
                bitmap.Fill(ConsoleCharacter.RedBG());
                redBitmap = bitmapVideoWriter.WriteFrame(bitmap).Clone();
                bitmap.Fill(ConsoleCharacter.GreenBG());
                greenBitmap = bitmapVideoWriter.WriteFrame(bitmap).Clone();
                bitmap.DrawPoint(ConsoleCharacter.MagentaBG(), 0, 0);
                magentaPixelBitmap = bitmapVideoWriter.WriteFrame(bitmap).Clone();
                bitmapVideoWriter.Finish();

                sharedStream.Position = 0; // rewind the stream to the beginning to read it back

                // create a reader and make sure we can read each frame back exactly as they were written
                var bitmapVideoReader = new ConsoleBitmapStreamReader(sharedStream);
                Assert.AreEqual(redBitmap, bitmapVideoReader.ReadFrame().CurrentBitmap);
                Assert.AreEqual(greenBitmap, bitmapVideoReader.ReadFrame().CurrentBitmap);
                Assert.AreEqual(magentaPixelBitmap, bitmapVideoReader.ReadFrame().CurrentBitmap);
                Assert.IsNull(bitmapVideoReader.ReadFrame().CurrentFrame);
            }
        }
Пример #3
0
        public void TestPlaybackEndToEnd()
        {
            var app = new CliTestHarness(this.TestContext, 80, 30);

            app.InvokeNextCycle(async() =>
            {
                int w    = 10, h = 1;
                var temp = Path.GetTempFileName();
                using (var stream = File.OpenWrite(temp))
                {
                    var writer = new ConsoleBitmapVideoWriter(s => stream.Write(Encoding.Default.GetBytes(s)));
                    var bitmap = new ConsoleBitmap(w, h);

                    for (var i = 0; i < bitmap.Width; i++)
                    {
                        bitmap.Fill(new ConsoleCharacter(' '));
                        bitmap.DrawPoint(new ConsoleCharacter(' ', backgroundColor: ConsoleColor.Red), i, 0);
                        writer.WriteFrame(bitmap, true, TimeSpan.FromSeconds(.1 * i));
                    }
                    writer.Finish();
                }

                var player = app.LayoutRoot.Add(new ConsoleBitmapPlayer()).Fill();
                Assert.IsFalse(player.Width == 0);
                Assert.IsFalse(player.Height == 0);
                player.Load(File.OpenRead(temp));

                var playStarted = false;
                player.SubscribeForLifetime(nameof(player.State), () =>
                {
                    if (player.State == PlayerState.Playing)
                    {
                        playStarted = true;
                    }
                    else if (player.State == PlayerState.Stopped && playStarted)
                    {
                        app.Stop();
                    }
                }, app);

                await Task.Delay(100);
                await app.SendKey(new ConsoleKeyInfo('p', ConsoleKey.P, false, false, false));
            });

            app.Start().Wait();
            Thread.Sleep(100);
            app.AssertThisTestMatchesLKGFirstAndLastFrame();
        }
Пример #4
0
        private async void SaveCommon(string destination)
        {
            if (saveInProgress)
            {
                return;
            }

            try
            {
                saveInProgress = true;
                ConsoleBitmapVideoWriter writer = null;
                var  tempFile         = Path.GetTempFileName();
                bool tempWriteSuccess = false;
                try
                {
                    writer = new ConsoleBitmapVideoWriter(s => File.WriteAllText(tempFile, s));
                    foreach (var frame in animation.Frames)
                    {
                        writer.WriteFrame(frame.Bitmap, desiredFrameTime: frame.FrameTime);
                    }
                    tempWriteSuccess = true;
                }
                catch (Exception)
                {
                    await Dialog.ShowMessage($"Failed to save file to {destination}".ToRed());

                    return;
                }
                finally
                {
                    writer?.Finish();
                    if (tempWriteSuccess == false)
                    {
                        try { File.Delete(tempFile); } catch (Exception) { }
                    }
                }

                try
                {
                    // If we can't read this back then don't finalize the save.
                    // This ensures that if we wrote garbage (which should never happen)
                    // then we won't corrupt whatever was on disk.
                    using (var testStream = File.OpenRead(tempFile))
                    {
                        var testReader = new ConsoleBitmapStreamReader(testStream);
                        testReader.ReadToEnd();
                    }
                }
                catch (Exception)
                {
                    try { File.Delete(tempFile); } catch (Exception) { }
                    await Dialog.ShowMessage($"Failed to save file to {destination}".ToRed());

                    return;
                }

                File.Delete(destination);
                File.Move(tempFile, destination);
                currentlyOpenedFile = destination;
                undoRedo.Do(new ClearPendingChangesAction(this));
            }
            finally
            {
                saveInProgress = false;
            }
        }