stream video from memory
							parent
							
								
									b648d1b1c3
								
							
						
					
					
						commit
						e17a29cbf9
					
				|  | @ -17,6 +17,8 @@ namespace MoonWorks.Video | ||||||
| 	public unsafe class Video : IDisposable | 	public unsafe class Video : IDisposable | ||||||
| 	{ | 	{ | ||||||
| 		internal IntPtr Handle; | 		internal IntPtr Handle; | ||||||
|  | 		private IntPtr rwData; | ||||||
|  | 		private void* videoData; | ||||||
| 
 | 
 | ||||||
| 		public bool Loop { get; private set; } | 		public bool Loop { get; private set; } | ||||||
| 		public float Volume { | 		public float Volume { | ||||||
|  | @ -71,7 +73,12 @@ namespace MoonWorks.Video | ||||||
| 				throw new ArgumentException("Video file not found!"); | 				throw new ArgumentException("Video file not found!"); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			if (Theorafile.tf_fopen(filename, out Handle) < 0) | 			var bytes = System.IO.File.ReadAllBytes(filename); | ||||||
|  | 			videoData = NativeMemory.Alloc((nuint) bytes.Length); | ||||||
|  | 			Marshal.Copy(bytes, 0, (IntPtr) videoData, bytes.Length); | ||||||
|  | 			rwData = SDL2.SDL.SDL_RWFromMem((IntPtr) videoData, bytes.Length); | ||||||
|  | 
 | ||||||
|  | 			if (Theorafile.tf_open_callbacks(rwData, out Handle, callbacks) < 0) | ||||||
| 			{ | 			{ | ||||||
| 				throw new ArgumentException("Invalid video file!"); | 				throw new ArgumentException("Invalid video file!"); | ||||||
| 			} | 			} | ||||||
|  | @ -317,6 +324,17 @@ namespace MoonWorks.Video | ||||||
| 			currentFrame = -1; | 			currentFrame = -1; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		private static IntPtr Read(IntPtr ptr, IntPtr size, IntPtr nmemb, IntPtr datasource) => (IntPtr) SDL2.SDL.SDL_RWread(datasource, ptr, size, nmemb); | ||||||
|  | 		private static int Seek(IntPtr datasource, long offset, Theorafile.SeekWhence whence) => (int) SDL2.SDL.SDL_RWseek(datasource, offset, (int) whence); | ||||||
|  | 		private static int Close(IntPtr datasource) => (int) SDL2.SDL.SDL_RWclose(datasource); | ||||||
|  | 
 | ||||||
|  | 		private static Theorafile.tf_callbacks callbacks = new Theorafile.tf_callbacks | ||||||
|  | 		{ | ||||||
|  | 			read_func = Read, | ||||||
|  | 			seek_func = Seek, | ||||||
|  | 			close_func = Close | ||||||
|  | 		}; | ||||||
|  | 
 | ||||||
| 		protected virtual void Dispose(bool disposing) | 		protected virtual void Dispose(bool disposing) | ||||||
| 		{ | 		{ | ||||||
| 			if (!disposed) | 			if (!disposed) | ||||||
|  | @ -332,6 +350,7 @@ namespace MoonWorks.Video | ||||||
| 				// free unmanaged resources (unmanaged objects) | 				// free unmanaged resources (unmanaged objects) | ||||||
| 				Theorafile.tf_close(ref Handle); | 				Theorafile.tf_close(ref Handle); | ||||||
| 				NativeMemory.Free(yuvData); | 				NativeMemory.Free(yuvData); | ||||||
|  | 				NativeMemory.Free(videoData); | ||||||
| 
 | 
 | ||||||
| 				disposed = true; | 				disposed = true; | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue