adjust VideoPlayer to unload AV1 streams on Unload
							parent
							
								
									1b40b5e7d3
								
							
						
					
					
						commit
						0fbe241848
					
				|  | @ -8,6 +8,7 @@ namespace MoonWorks.Video | ||||||
| 		public IntPtr Handle => handle; | 		public IntPtr Handle => handle; | ||||||
| 		IntPtr handle; | 		IntPtr handle; | ||||||
| 
 | 
 | ||||||
|  | 		public bool Loaded => handle != IntPtr.Zero; | ||||||
| 		public bool Ended => Dav1dfile.df_eos(Handle) == 1; | 		public bool Ended => Dav1dfile.df_eos(Handle) == 1; | ||||||
| 
 | 
 | ||||||
| 		public IntPtr yDataHandle; | 		public IntPtr yDataHandle; | ||||||
|  | @ -20,21 +21,41 @@ namespace MoonWorks.Video | ||||||
| 
 | 
 | ||||||
| 		public bool FrameDataUpdated { get; set; } | 		public bool FrameDataUpdated { get; set; } | ||||||
| 
 | 
 | ||||||
|  | 		private VideoAV1 Parent; | ||||||
|  | 
 | ||||||
| 		public VideoAV1Stream(GraphicsDevice device, VideoAV1 video) : base(device) | 		public VideoAV1Stream(GraphicsDevice device, VideoAV1 video) : base(device) | ||||||
| 		{ | 		{ | ||||||
| 			if (Dav1dfile.df_fopen(video.Filename, out handle) == 0) | 			handle = IntPtr.Zero; | ||||||
| 			{ | 			Parent = video; | ||||||
| 				throw new Exception("Failed to open video file!"); | 		} | ||||||
| 			} |  | ||||||
| 
 | 
 | ||||||
| 			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() | 		public void Reset() | ||||||
| 		{ | 		{ | ||||||
| 			lock (this) | 			lock (this) | ||||||
| 			{ | 			{ | ||||||
| 				Dav1dfile.df_reset(Handle); | 				Dav1dfile.df_reset(handle); | ||||||
| 				ReadNextFrame(); | 				ReadNextFrame(); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | @ -46,7 +67,7 @@ namespace MoonWorks.Video | ||||||
| 				if (!Ended) | 				if (!Ended) | ||||||
| 				{ | 				{ | ||||||
| 					if (Dav1dfile.df_readvideo( | 					if (Dav1dfile.df_readvideo( | ||||||
| 						Handle, | 						handle, | ||||||
| 						1, | 						1, | ||||||
| 						out var yDataHandle, | 						out var yDataHandle, | ||||||
| 						out var uDataHandle, | 						out var uDataHandle, | ||||||
|  | @ -74,7 +95,7 @@ namespace MoonWorks.Video | ||||||
| 		{ | 		{ | ||||||
| 			if (!IsDisposed) | 			if (!IsDisposed) | ||||||
| 			{ | 			{ | ||||||
| 				Dav1dfile.df_close(Handle); | 				Unload(); | ||||||
| 			} | 			} | ||||||
| 			base.Dispose(disposing); | 			base.Dispose(disposing); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -164,9 +164,18 @@ namespace MoonWorks.Video | ||||||
| 		/// </summary> | 		/// </summary> | ||||||
| 		public void Unload() | 		public void Unload() | ||||||
| 		{ | 		{ | ||||||
| 			Stop(); | 			ReadNextFrameTask?.Wait(); | ||||||
| 			ResetTask?.Wait(); | 			ResetTask?.Wait(); | ||||||
| 			ResetSecondaryStreamTask?.Wait(); | 			ResetSecondaryStreamTask?.Wait(); | ||||||
|  | 
 | ||||||
|  | 			Stop(); | ||||||
|  | 
 | ||||||
|  | 			Video.StreamA.Unload(); | ||||||
|  | 			Video.StreamB.Unload(); | ||||||
|  | 
 | ||||||
|  | 			ReadNextFrameTask = null; | ||||||
|  | 			ResetTask = null; | ||||||
|  | 			ResetSecondaryStreamTask = null; | ||||||
| 			Video = null; | 			Video = null; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | @ -224,6 +233,7 @@ namespace MoonWorks.Video | ||||||
| 			lock (CurrentStream) | 			lock (CurrentStream) | ||||||
| 			{ | 			{ | ||||||
| 				ResetTask?.Wait(); | 				ResetTask?.Wait(); | ||||||
|  | 				ResetTask = null; | ||||||
| 
 | 
 | ||||||
| 				var commandBuffer = Device.AcquireCommandBuffer(); | 				var commandBuffer = Device.AcquireCommandBuffer(); | ||||||
| 
 | 
 | ||||||
|  | @ -322,7 +332,11 @@ namespace MoonWorks.Video | ||||||
| 
 | 
 | ||||||
| 		private void InitializeDav1dStream() | 		private void InitializeDav1dStream() | ||||||
| 		{ | 		{ | ||||||
|  | 			Video.StreamA.Load(); | ||||||
|  | 			Video.StreamB.Load(); | ||||||
|  | 
 | ||||||
| 			ReadNextFrameTask?.Wait(); | 			ReadNextFrameTask?.Wait(); | ||||||
|  | 			ReadNextFrameTask = null; | ||||||
| 
 | 
 | ||||||
| 			ResetTask = Task.Run(Video.StreamA.Reset); | 			ResetTask = Task.Run(Video.StreamA.Reset); | ||||||
| 			ResetTask.ContinueWith(HandleTaskException, TaskContinuationOptions.OnlyOnFaulted); | 			ResetTask.ContinueWith(HandleTaskException, TaskContinuationOptions.OnlyOnFaulted); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue