blocking implementation of VideoPlayer
							parent
							
								
									45b085a236
								
							
						
					
					
						commit
						5a97bd3f33
					
				| 
						 | 
				
			
			@ -1,6 +1,5 @@
 | 
			
		|||
using System;
 | 
			
		||||
using System.Diagnostics;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using MoonWorks.Graphics;
 | 
			
		||||
 | 
			
		||||
namespace MoonWorks.Video
 | 
			
		||||
| 
						 | 
				
			
			@ -18,10 +17,6 @@ namespace MoonWorks.Video
 | 
			
		|||
		private VideoAV1 Video = null;
 | 
			
		||||
		private VideoAV1Stream CurrentStream = null;
 | 
			
		||||
 | 
			
		||||
		private Task ReadNextFrameTask;
 | 
			
		||||
		private Task ResetTask;
 | 
			
		||||
		private Task ResetSecondaryStreamTask;
 | 
			
		||||
 | 
			
		||||
		private Texture yTexture = null;
 | 
			
		||||
		private Texture uTexture = null;
 | 
			
		||||
		private Texture vTexture = null;
 | 
			
		||||
| 
						 | 
				
			
			@ -164,10 +159,6 @@ namespace MoonWorks.Video
 | 
			
		|||
		/// </summary>
 | 
			
		||||
		public void Unload()
 | 
			
		||||
		{
 | 
			
		||||
			ReadNextFrameTask?.Wait();
 | 
			
		||||
			ResetTask?.Wait();
 | 
			
		||||
			ResetSecondaryStreamTask?.Wait();
 | 
			
		||||
 | 
			
		||||
			timer.Stop();
 | 
			
		||||
			timer.Reset();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -179,9 +170,6 @@ namespace MoonWorks.Video
 | 
			
		|||
			Video.StreamA.Unload();
 | 
			
		||||
			Video.StreamB.Unload();
 | 
			
		||||
 | 
			
		||||
			ReadNextFrameTask = null;
 | 
			
		||||
			ResetTask = null;
 | 
			
		||||
			ResetSecondaryStreamTask = null;
 | 
			
		||||
			Video = null;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -208,8 +196,7 @@ namespace MoonWorks.Video
 | 
			
		|||
				}
 | 
			
		||||
 | 
			
		||||
				currentFrame = thisFrame;
 | 
			
		||||
				ReadNextFrameTask = Task.Run(CurrentStream.ReadNextFrame);
 | 
			
		||||
				ReadNextFrameTask.ContinueWith(HandleTaskException, TaskContinuationOptions.OnlyOnFaulted);
 | 
			
		||||
				CurrentStream.ReadNextFrame();
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (CurrentStream.Ended)
 | 
			
		||||
| 
						 | 
				
			
			@ -217,8 +204,7 @@ namespace MoonWorks.Video
 | 
			
		|||
				timer.Stop();
 | 
			
		||||
				timer.Reset();
 | 
			
		||||
 | 
			
		||||
				ResetSecondaryStreamTask = Task.Run(CurrentStream.Reset);
 | 
			
		||||
				ResetSecondaryStreamTask.ContinueWith(HandleTaskException, TaskContinuationOptions.OnlyOnFaulted);
 | 
			
		||||
				CurrentStream.Reset();
 | 
			
		||||
 | 
			
		||||
				if (Loop)
 | 
			
		||||
				{
 | 
			
		||||
| 
						 | 
				
			
			@ -238,9 +224,6 @@ namespace MoonWorks.Video
 | 
			
		|||
		{
 | 
			
		||||
			lock (CurrentStream)
 | 
			
		||||
			{
 | 
			
		||||
				ResetTask?.Wait();
 | 
			
		||||
				ResetTask = null;
 | 
			
		||||
 | 
			
		||||
				var commandBuffer = Device.AcquireCommandBuffer();
 | 
			
		||||
 | 
			
		||||
				var ySpan = new Span<byte>((void*) CurrentStream.yDataHandle, (int) CurrentStream.yDataLength);
 | 
			
		||||
| 
						 | 
				
			
			@ -338,19 +321,8 @@ namespace MoonWorks.Video
 | 
			
		|||
 | 
			
		||||
		private void InitializeDav1dStream()
 | 
			
		||||
		{
 | 
			
		||||
			ReadNextFrameTask?.Wait();
 | 
			
		||||
			ReadNextFrameTask = null;
 | 
			
		||||
 | 
			
		||||
			ResetTask?.Wait();
 | 
			
		||||
			ResetTask = null;
 | 
			
		||||
 | 
			
		||||
			ResetSecondaryStreamTask?.Wait();
 | 
			
		||||
			ResetSecondaryStreamTask = null;
 | 
			
		||||
 | 
			
		||||
			ResetTask = Task.Run(Video.StreamA.Load);
 | 
			
		||||
			ResetTask.ContinueWith(HandleTaskException, TaskContinuationOptions.OnlyOnFaulted);
 | 
			
		||||
			ResetSecondaryStreamTask = Task.Run(Video.StreamB.Load);
 | 
			
		||||
			ResetSecondaryStreamTask.ContinueWith(HandleTaskException, TaskContinuationOptions.OnlyOnFaulted);
 | 
			
		||||
			Video.StreamA.Load();
 | 
			
		||||
			Video.StreamB.Load();
 | 
			
		||||
 | 
			
		||||
			CurrentStream = Video.StreamA;
 | 
			
		||||
			currentFrame = -1;
 | 
			
		||||
| 
						 | 
				
			
			@ -358,26 +330,13 @@ namespace MoonWorks.Video
 | 
			
		|||
 | 
			
		||||
		private void ResetDav1dStream()
 | 
			
		||||
		{
 | 
			
		||||
			ReadNextFrameTask?.Wait();
 | 
			
		||||
			ReadNextFrameTask = null;
 | 
			
		||||
 | 
			
		||||
			ResetTask = Task.Run(Video.StreamA.Reset);
 | 
			
		||||
			ResetTask.ContinueWith(HandleTaskException, TaskContinuationOptions.OnlyOnFaulted);
 | 
			
		||||
			ResetSecondaryStreamTask = Task.Run(Video.StreamB.Reset);
 | 
			
		||||
			ResetSecondaryStreamTask.ContinueWith(HandleTaskException, TaskContinuationOptions.OnlyOnFaulted);
 | 
			
		||||
			Video.StreamA.Reset();
 | 
			
		||||
			Video.StreamB.Reset();
 | 
			
		||||
 | 
			
		||||
			CurrentStream = Video.StreamA;
 | 
			
		||||
			currentFrame = -1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		private static void HandleTaskException(Task task)
 | 
			
		||||
		{
 | 
			
		||||
			if (task.Exception.InnerException is not TaskCanceledException)
 | 
			
		||||
			{
 | 
			
		||||
				throw task.Exception;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		protected override void Dispose(bool disposing)
 | 
			
		||||
		{
 | 
			
		||||
			if (!IsDisposed)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue