diff --git a/src/Video/VideoAV1Stream.cs b/src/Video/VideoAV1Stream.cs index cc40aa0..a8a583d 100644 --- a/src/Video/VideoAV1Stream.cs +++ b/src/Video/VideoAV1Stream.cs @@ -8,6 +8,7 @@ namespace MoonWorks.Video public IntPtr Handle => handle; IntPtr handle; + public bool Loaded => handle != IntPtr.Zero; public bool Ended => Dav1dfile.df_eos(Handle) == 1; public IntPtr yDataHandle; @@ -20,21 +21,41 @@ namespace MoonWorks.Video public bool FrameDataUpdated { get; set; } + private VideoAV1 Parent; + public VideoAV1Stream(GraphicsDevice device, VideoAV1 video) : base(device) { - if (Dav1dfile.df_fopen(video.Filename, out handle) == 0) - { - throw new Exception("Failed to open video file!"); - } + handle = IntPtr.Zero; + Parent = video; + } - Reset(); + public void Load() + { + if (!Loaded) + { + if (Dav1dfile.df_fopen(Parent.Filename, out handle) == 0) + { + throw new Exception("Failed to load video file!"); + } + + Reset(); + } + } + + public void Unload() + { + if (Loaded) + { + Dav1dfile.df_close(handle); + handle = IntPtr.Zero; + } } public void Reset() { lock (this) { - Dav1dfile.df_reset(Handle); + Dav1dfile.df_reset(handle); ReadNextFrame(); } } @@ -46,7 +67,7 @@ namespace MoonWorks.Video if (!Ended) { if (Dav1dfile.df_readvideo( - Handle, + handle, 1, out var yDataHandle, out var uDataHandle, @@ -74,7 +95,7 @@ namespace MoonWorks.Video { if (!IsDisposed) { - Dav1dfile.df_close(Handle); + Unload(); } base.Dispose(disposing); } diff --git a/src/Video/VideoPlayer.cs b/src/Video/VideoPlayer.cs index 0529626..3966237 100644 --- a/src/Video/VideoPlayer.cs +++ b/src/Video/VideoPlayer.cs @@ -164,9 +164,18 @@ namespace MoonWorks.Video /// public void Unload() { - Stop(); + ReadNextFrameTask?.Wait(); ResetTask?.Wait(); ResetSecondaryStreamTask?.Wait(); + + Stop(); + + Video.StreamA.Unload(); + Video.StreamB.Unload(); + + ReadNextFrameTask = null; + ResetTask = null; + ResetSecondaryStreamTask = null; Video = null; } @@ -224,6 +233,7 @@ namespace MoonWorks.Video lock (CurrentStream) { ResetTask?.Wait(); + ResetTask = null; var commandBuffer = Device.AcquireCommandBuffer(); @@ -322,7 +332,11 @@ namespace MoonWorks.Video private void InitializeDav1dStream() { + Video.StreamA.Load(); + Video.StreamB.Load(); + ReadNextFrameTask?.Wait(); + ReadNextFrameTask = null; ResetTask = Task.Run(Video.StreamA.Reset); ResetTask.ContinueWith(HandleTaskException, TaskContinuationOptions.OnlyOnFaulted);