#nullable disable using System; using System.Runtime.InteropServices; namespace BizHawk.Common { public static class AVIWriterImports { [Flags] public enum OpenFileStyle : uint { OF_WRITE = 0x00000001, OF_CREATE = 0x00001000 } [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct AVISTREAMINFOW { public int fccType; public int fccHandler; public int dwFlags; public int dwCaps; public short wPriority; public short wLanguage; public int dwScale; public int dwRate; public int dwStart; public int dwLength; public int dwInitialFrames; public int dwSuggestedBufferSize; public int dwQuality; public int dwSampleSize; public RECT rcFrame; public int dwEditCount; public int dwFormatChangeCount; [MarshalAs(UnmanagedType.LPWStr, SizeConst=64)] public string szName; [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct RECT { public int Left; public int Top; public int Right; public int Bottom; } } [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct BITMAPINFOHEADER { public uint biSize; public int biWidth; public int biHeight; public ushort biPlanes; public ushort biBitCount; public uint biCompression; public uint biSizeImage; public int biXPelsPerMeter; public int biYPelsPerMeter; public uint biClrUsed; public uint biClrImportant; public void Init() { biSize = (uint)Marshal.SizeOf(this); } } [StructLayout(LayoutKind.Sequential)] public struct AVICOMPRESSOPTIONS { public int fccType; public int fccHandler; public int dwKeyFrameEvery; public int dwQuality; public int dwBytesPerSecond; public int dwFlags; public IntPtr lpFormat; public int cbFormat; public IntPtr lpParms; public int cbParms; public int dwInterleaveEvery; } [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct WAVEFORMATEX { public ushort wFormatTag; public ushort nChannels; public uint nSamplesPerSec; public uint nAvgBytesPerSec; public ushort nBlockAlign; public ushort wBitsPerSample; public ushort cbSize; public void Init() { cbSize = (ushort)Marshal.SizeOf(this); } } /// Create a new stream in an existing file and creates an interface to the new stream [DllImport("avifil32.dll")] public static extern int AVIFileCreateStreamW(IntPtr pfile, out IntPtr ppavi, ref AVISTREAMINFOW psi); [DllImport("avifil32.dll", SetLastError = true)] public static extern void AVIFileInit(); [DllImport("avifil32.dll", SetLastError = true)] public static extern int AVIFileOpenW(ref IntPtr pAviFile, [MarshalAs(UnmanagedType.LPWStr)] string szFile, OpenFileStyle uMode, int lpHandler); /// Release an open AVI stream [DllImport("avifil32.dll")] public static extern int AVIFileRelease(IntPtr pfile); /// Create a compressed stream from an uncompressed stream and a compression filter, and returns the address of a pointer to the compressed stream [DllImport("avifil32.dll")] public static extern int AVIMakeCompressedStream(out IntPtr ppsCompressed, IntPtr psSource, ref AVICOMPRESSOPTIONS lpOptions, IntPtr pclsidHandler); /// Retrieve the save options for a file and returns them in a buffer [DllImport("avifil32.dll")] public static extern unsafe int AVISaveOptions(IntPtr hwnd, int flags, int streams, void* ppAvi, void* plpOptions); /// [DllImport("avifil32.dll")] public static extern int AVIStreamRelease(IntPtr pavi); /// Set the format of a stream at the specified position [DllImport("avifil32.dll")] public static extern int AVIStreamSetFormat(IntPtr pavi, int lPos, ref BITMAPINFOHEADER lpFormat, int cbFormat); /// [DllImport("avifil32.dll")] public static extern int AVIStreamSetFormat(IntPtr pavi, int lPos, ref WAVEFORMATEX lpFormat, int cbFormat); /// Write data to a stream [DllImport("avifil32.dll")] public static extern int AVIStreamWrite(IntPtr pavi, int lStart, int lSamples, IntPtr lpBuffer, int cbBuffer, int dwFlags, IntPtr plSampWritten, out int plBytesWritten); } }