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