BizHawk/BizHawk.Common/Win32/AVIWriterImports.cs

142 lines
4.3 KiB
C#

#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);
}
}
/// <summary>Create a new stream in an existing file and creates an interface to the new stream</summary>
[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);
/// <summary>Release an open AVI stream</summary>
[DllImport("avifil32.dll")]
public static extern int AVIFileRelease(IntPtr pfile);
/// <summary>Create a compressed stream from an uncompressed stream and a compression filter, and returns the address of a pointer to the compressed stream</summary>
[DllImport("avifil32.dll")]
public static extern int AVIMakeCompressedStream(out IntPtr ppsCompressed, IntPtr psSource, ref AVICOMPRESSOPTIONS lpOptions, IntPtr pclsidHandler);
/// <summary>Retrieve the save options for a file and returns them in a buffer</summary>
[DllImport("avifil32.dll")]
public static extern unsafe int AVISaveOptions(IntPtr hwnd, int flags, int streams, void* ppAvi, void* plpOptions);
/// <inheritdoc cref="AVIFileRelease"/>
[DllImport("avifil32.dll")]
public static extern int AVIStreamRelease(IntPtr pavi);
/// <summary>Set the format of a stream at the specified position</summary>
[DllImport("avifil32.dll")]
public static extern int AVIStreamSetFormat(IntPtr pavi, int lPos, ref BITMAPINFOHEADER lpFormat, int cbFormat);
/// <inheritdoc cref="AVIStreamSetFormat(System.IntPtr,int,ref BizHawk.Common.AVIWriterImports.BITMAPINFOHEADER,int)"/>
[DllImport("avifil32.dll")]
public static extern int AVIStreamSetFormat(IntPtr pavi, int lPos, ref WAVEFORMATEX lpFormat, int cbFormat);
/// <summary>Write data to a stream</summary>
[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);
}
}