67 lines
1.6 KiB
C#
67 lines
1.6 KiB
C#
using System;
|
|
using System.IO;
|
|
using Nerfed.Runtime.Graphics;
|
|
|
|
namespace Nerfed.Runtime.Video;
|
|
|
|
/// <summary>
|
|
/// This class takes in a filename for AV1 data in .obu (open bitstream unit) format
|
|
/// </summary>
|
|
public unsafe class VideoAV1 : GraphicsResource
|
|
{
|
|
public string Filename { get; }
|
|
|
|
public int Width => width;
|
|
public int Height => height;
|
|
public double FramesPerSecond { get; set; }
|
|
public Dav1dfile.PixelLayout PixelLayout => pixelLayout;
|
|
public int UVWidth { get; }
|
|
public int UVHeight { get; }
|
|
|
|
private int width;
|
|
private int height;
|
|
private Dav1dfile.PixelLayout pixelLayout;
|
|
|
|
/// <summary>
|
|
/// Opens an AV1 file so it can be loaded by VideoPlayer. You must also provide a playback framerate.
|
|
/// </summary>
|
|
public VideoAV1(GraphicsDevice device, string filename, double framesPerSecond) : base(device)
|
|
{
|
|
if (!File.Exists(filename))
|
|
{
|
|
throw new ArgumentException("Video file not found!");
|
|
}
|
|
|
|
if (Dav1dfile.df_fopen(filename, out IntPtr handle) == 0)
|
|
{
|
|
throw new Exception("Failed to open video file!");
|
|
}
|
|
|
|
Dav1dfile.df_videoinfo(handle, out width, out height, out pixelLayout);
|
|
Dav1dfile.df_close(handle);
|
|
|
|
if (pixelLayout == Dav1dfile.PixelLayout.I420)
|
|
{
|
|
UVWidth = Width / 2;
|
|
UVHeight = Height / 2;
|
|
}
|
|
else if (pixelLayout == Dav1dfile.PixelLayout.I422)
|
|
{
|
|
UVWidth = Width / 2;
|
|
UVHeight = Height;
|
|
}
|
|
else if (pixelLayout == Dav1dfile.PixelLayout.I444)
|
|
{
|
|
UVWidth = width;
|
|
UVHeight = height;
|
|
}
|
|
else
|
|
{
|
|
throw new NotSupportedException("Unrecognized YUV format!");
|
|
}
|
|
|
|
FramesPerSecond = framesPerSecond;
|
|
|
|
Filename = filename;
|
|
}
|
|
} |