92 lines
1.5 KiB
C#
92 lines
1.5 KiB
C#
using System;
|
|
|
|
namespace MoonWorks.Video
|
|
{
|
|
internal class VideoAV1Stream
|
|
{
|
|
public IntPtr Handle => handle;
|
|
IntPtr handle;
|
|
|
|
public bool Ended => Dav1dfile.df_eos(Handle) == 1;
|
|
|
|
public IntPtr yDataHandle;
|
|
public IntPtr uDataHandle;
|
|
public IntPtr vDataHandle;
|
|
public uint yDataLength;
|
|
public uint uvDataLength;
|
|
public uint yStride;
|
|
public uint uvStride;
|
|
|
|
public bool FrameDataUpdated { get; private set; }
|
|
|
|
bool IsDisposed;
|
|
|
|
public VideoAV1Stream(VideoAV1 video)
|
|
{
|
|
if (Dav1dfile.df_fopen(video.Filename, out handle) == 0)
|
|
{
|
|
throw new Exception("Failed to open video file!");
|
|
}
|
|
|
|
Reset();
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
lock (this)
|
|
{
|
|
Dav1dfile.df_reset(Handle);
|
|
ReadNextFrame();
|
|
}
|
|
}
|
|
|
|
public void ReadNextFrame()
|
|
{
|
|
lock (this)
|
|
{
|
|
if (Dav1dfile.df_readvideo(
|
|
Handle,
|
|
1,
|
|
out yDataHandle,
|
|
out uDataHandle,
|
|
out vDataHandle,
|
|
out yDataLength,
|
|
out uvDataLength,
|
|
out yStride,
|
|
out uvStride) == 1
|
|
) {
|
|
FrameDataUpdated = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
protected virtual void Dispose(bool disposing)
|
|
{
|
|
if (!IsDisposed)
|
|
{
|
|
if (disposing)
|
|
{
|
|
// dispose managed state (managed objects)
|
|
}
|
|
|
|
// free unmanaged resources (unmanaged objects)
|
|
Dav1dfile.df_close(Handle);
|
|
|
|
IsDisposed = true;
|
|
}
|
|
}
|
|
|
|
~VideoAV1Stream()
|
|
{
|
|
Dispose(disposing: false);
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
// Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
|
|
Dispose(disposing: true);
|
|
GC.SuppressFinalize(this);
|
|
}
|
|
}
|
|
}
|