151 lines
7.0 KiB
C#
151 lines
7.0 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Runtime.InteropServices;
|
|||
|
using NAudio.Wave;
|
|||
|
using System.Runtime.InteropServices.ComTypes;
|
|||
|
|
|||
|
namespace NAudio.MediaFoundation
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Interop definitions for MediaFoundation
|
|||
|
/// thanks to Lucian Wischik for the initial work on many of these definitions (also various interfaces)
|
|||
|
/// n.b. the goal is to make as much of this internal as possible, and provide
|
|||
|
/// better .NET APIs using the MediaFoundationApi class instead
|
|||
|
/// </summary>
|
|||
|
public static class MediaFoundationInterop
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Initializes Microsoft Media Foundation.
|
|||
|
/// </summary>
|
|||
|
[DllImport("mfplat.dll", ExactSpelling = true, PreserveSig = false)]
|
|||
|
public static extern void MFStartup(int version, int dwFlags = 0);
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Shuts down the Microsoft Media Foundation platform
|
|||
|
/// </summary>
|
|||
|
[DllImport("mfplat.dll", ExactSpelling = true, PreserveSig = false)]
|
|||
|
public static extern void MFShutdown();
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Creates an empty media type.
|
|||
|
/// </summary>
|
|||
|
[DllImport("mfplat.dll", ExactSpelling = true, PreserveSig = false)]
|
|||
|
internal static extern void MFCreateMediaType(out IMFMediaType ppMFType);
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Initializes a media type from a WAVEFORMATEX structure.
|
|||
|
/// </summary>
|
|||
|
[DllImport("mfplat.dll", ExactSpelling = true, PreserveSig = false)]
|
|||
|
internal static extern void MFInitMediaTypeFromWaveFormatEx([In] IMFMediaType pMFType, [In] WaveFormat pWaveFormat, [In] int cbBufSize);
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Converts a Media Foundation audio media type to a WAVEFORMATEX structure.
|
|||
|
/// </summary>
|
|||
|
/// TODO: try making second parameter out WaveFormatExtraData
|
|||
|
[DllImport("mfplat.dll", ExactSpelling = true, PreserveSig = false)]
|
|||
|
internal static extern void MFCreateWaveFormatExFromMFMediaType(IMFMediaType pMFType, ref IntPtr ppWF, ref int pcbSize, int flags = 0);
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Creates the source reader from a URL.
|
|||
|
/// </summary>
|
|||
|
[DllImport("mfreadwrite.dll", ExactSpelling = true, PreserveSig = false)]
|
|||
|
public static extern void MFCreateSourceReaderFromURL([In, MarshalAs(UnmanagedType.LPWStr)] string pwszURL, [In] IMFAttributes pAttributes,
|
|||
|
[Out, MarshalAs(UnmanagedType.Interface)] out IMFSourceReader ppSourceReader);
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Creates the source reader from a byte stream.
|
|||
|
/// </summary>
|
|||
|
[DllImport("mfreadwrite.dll", ExactSpelling = true, PreserveSig = false)]
|
|||
|
public static extern void MFCreateSourceReaderFromByteStream([In] IMFByteStream pByteStream, [In] IMFAttributes pAttributes, [Out, MarshalAs(UnmanagedType.Interface)] out IMFSourceReader ppSourceReader);
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Creates the sink writer from a URL or byte stream.
|
|||
|
/// </summary>
|
|||
|
[DllImport("mfreadwrite.dll", ExactSpelling = true, PreserveSig = false)]
|
|||
|
public static extern void MFCreateSinkWriterFromURL([In, MarshalAs(UnmanagedType.LPWStr)] string pwszOutputURL,
|
|||
|
[In] IMFByteStream pByteStream, [In] IMFAttributes pAttributes, [Out] out IMFSinkWriter ppSinkWriter);
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Creates a Microsoft Media Foundation byte stream that wraps an IRandomAccessStream object.
|
|||
|
/// </summary>
|
|||
|
[DllImport("mfplat.dll", ExactSpelling = true, PreserveSig = false)]
|
|||
|
public static extern void MFCreateMFByteStreamOnStreamEx([MarshalAs(UnmanagedType.IUnknown)] object punkStream, out IMFByteStream ppByteStream);
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Creates a Microsoft Media Foundation byte stream that wraps an IRandomAccessStream object.
|
|||
|
/// </summary>
|
|||
|
[DllImport("mfplat.dll", ExactSpelling = true, PreserveSig = false)]
|
|||
|
public static extern void MFCreateMFByteStreamOnStream([In] IStream punkStream, out IMFByteStream ppByteStream);
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets a list of Microsoft Media Foundation transforms (MFTs) that match specified search criteria.
|
|||
|
/// </summary>
|
|||
|
[DllImport("mfplat.dll", ExactSpelling = true, PreserveSig = false)]
|
|||
|
public static extern void MFTEnumEx([In] Guid guidCategory, [In] _MFT_ENUM_FLAG flags, [In] MFT_REGISTER_TYPE_INFO pInputType, [In] MFT_REGISTER_TYPE_INFO pOutputType,
|
|||
|
[Out] out IntPtr pppMFTActivate, [Out] out int pcMFTActivate);
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Creates an empty media sample.
|
|||
|
/// </summary>
|
|||
|
[DllImport("mfplat.dll", ExactSpelling = true, PreserveSig = false)]
|
|||
|
internal static extern void MFCreateSample([Out] out IMFSample ppIMFSample);
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Allocates system memory and creates a media buffer to manage it.
|
|||
|
/// </summary>
|
|||
|
[DllImport("mfplat.dll", ExactSpelling = true, PreserveSig = false)]
|
|||
|
internal static extern void MFCreateMemoryBuffer(
|
|||
|
int cbMaxLength, [Out] out IMFMediaBuffer ppBuffer);
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Creates an empty attribute store.
|
|||
|
/// </summary>
|
|||
|
[DllImport("mfplat.dll", ExactSpelling = true, PreserveSig = false)]
|
|||
|
internal static extern void MFCreateAttributes(
|
|||
|
[Out, MarshalAs(UnmanagedType.Interface)] out IMFAttributes ppMFAttributes,
|
|||
|
[In] int cInitialSize);
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets a list of output formats from an audio encoder.
|
|||
|
/// </summary>
|
|||
|
[DllImport("mf.dll", ExactSpelling = true, PreserveSig = false)]
|
|||
|
public static extern void MFTranscodeGetAudioOutputAvailableTypes(
|
|||
|
[In, MarshalAs(UnmanagedType.LPStruct)] Guid guidSubType,
|
|||
|
[In] _MFT_ENUM_FLAG dwMFTFlags,
|
|||
|
[In] IMFAttributes pCodecConfig,
|
|||
|
[Out, MarshalAs(UnmanagedType.Interface)] out IMFCollection ppAvailableTypes);
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// All streams
|
|||
|
/// </summary>
|
|||
|
public const int MF_SOURCE_READER_ALL_STREAMS = unchecked((int)0xFFFFFFFE);
|
|||
|
/// <summary>
|
|||
|
/// First audio stream
|
|||
|
/// </summary>
|
|||
|
public const int MF_SOURCE_READER_FIRST_AUDIO_STREAM = unchecked((int)0xFFFFFFFD);
|
|||
|
/// <summary>
|
|||
|
/// First video stream
|
|||
|
/// </summary>
|
|||
|
public const int MF_SOURCE_READER_FIRST_VIDEO_STREAM = unchecked((int)0xFFFFFFFC);
|
|||
|
/// <summary>
|
|||
|
/// Media source
|
|||
|
/// </summary>
|
|||
|
public const int MF_SOURCE_READER_MEDIASOURCE = unchecked((int)0xFFFFFFFF);
|
|||
|
/// <summary>
|
|||
|
/// Media Foundation SDK Version
|
|||
|
/// </summary>
|
|||
|
public const int MF_SDK_VERSION = 0x2;
|
|||
|
/// <summary>
|
|||
|
/// Media Foundation API Version
|
|||
|
/// </summary>
|
|||
|
public const int MF_API_VERSION = 0x70;
|
|||
|
/// <summary>
|
|||
|
/// Media Foundation Version
|
|||
|
/// </summary>
|
|||
|
public const int MF_VERSION = (MF_SDK_VERSION << 16) | MF_API_VERSION;
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
}
|