mirror of https://github.com/UMSKT/xpmgr.git
2184 lines
74 KiB
C
2184 lines
74 KiB
C
//*@@@+++@@@@******************************************************************
|
|
//
|
|
// Microsoft Windows Media Foundation
|
|
// Copyright (C) Microsoft Corporation. All rights reserved.
|
|
//
|
|
//*@@@---@@@@******************************************************************
|
|
//
|
|
|
|
//
|
|
// MFAPI.h is the header containing the APIs for using the MF platform.
|
|
//
|
|
|
|
#pragma once
|
|
#if !defined(__MFAPI_H__)
|
|
#define __MFAPI_H__
|
|
|
|
#pragma pack(push, mfhrds)
|
|
#include <mfobjects.h>
|
|
#pragma pack(pop, mfhrds)
|
|
|
|
#include "mmreg.h"
|
|
|
|
#include <avrt.h>
|
|
#ifndef AVRT_DATA
|
|
#define AVRT_DATA
|
|
#endif
|
|
#ifndef AVRT_BSS
|
|
#define AVRT_BSS
|
|
#endif
|
|
|
|
#if !defined(MF_VERSION)
|
|
|
|
#if (WINVER >= _WIN32_WINNT_WIN7)
|
|
|
|
#define MF_SDK_VERSION 0x0002
|
|
|
|
#else // Vista
|
|
|
|
#define MF_SDK_VERSION 0x0001
|
|
|
|
#endif // (WINVER >= _WIN32_WINNT_WIN7)
|
|
|
|
#define MF_API_VERSION 0x0070 // This value is unused in the Win7 release and left at its Vista release value
|
|
#define MF_VERSION (MF_SDK_VERSION << 16 | MF_API_VERSION)
|
|
|
|
#endif //!defined(MF_VERSION)
|
|
|
|
|
|
#define MFSTARTUP_NOSOCKET 0x1
|
|
#define MFSTARTUP_LITE (MFSTARTUP_NOSOCKET)
|
|
#define MFSTARTUP_FULL 0
|
|
|
|
#if defined(__cplusplus)
|
|
extern "C" {
|
|
#endif
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////// Startup/Shutdown ////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// Initializes the platform object.
|
|
// Must be called before using Media Foundation.
|
|
// A matching MFShutdown call must be made when the application is done using
|
|
// Media Foundation.
|
|
// The "Version" parameter should be set to MF_API_VERSION.
|
|
// Application should not call MFStartup / MFShutdown from workqueue threads
|
|
//
|
|
#if defined(__cplusplus)
|
|
STDAPI MFStartup( ULONG Version, DWORD dwFlags = MFSTARTUP_FULL );
|
|
#else
|
|
STDAPI MFStartup( ULONG Version, DWORD dwFlags );
|
|
#endif
|
|
|
|
//
|
|
// Shuts down the platform object.
|
|
// Releases all resources including threads.
|
|
// Application should call MFShutdown the same number of times as MFStartup
|
|
// Application should not call MFStartup / MFShutdown from workqueue threads
|
|
//
|
|
STDAPI MFShutdown();
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////// Platform ///////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// These functions can be used to keep the MF platform object in place.
|
|
// Every call to MFLockPlatform should have a matching call to MFUnlockPlatform
|
|
//
|
|
STDAPI MFLockPlatform();
|
|
STDAPI MFUnlockPlatform();
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// MF workitem functions
|
|
//
|
|
typedef unsigned __int64 MFWORKITEM_KEY;
|
|
|
|
STDAPI MFPutWorkItem(
|
|
DWORD dwQueue,
|
|
IMFAsyncCallback * pCallback,
|
|
IUnknown * pState);
|
|
|
|
STDAPI MFPutWorkItemEx(
|
|
DWORD dwQueue,
|
|
IMFAsyncResult * pResult);
|
|
|
|
STDAPI MFScheduleWorkItem(
|
|
IMFAsyncCallback * pCallback,
|
|
IUnknown * pState,
|
|
INT64 Timeout,
|
|
__out_opt MFWORKITEM_KEY * pKey);
|
|
|
|
STDAPI MFScheduleWorkItemEx(
|
|
IMFAsyncResult * pResult,
|
|
INT64 Timeout,
|
|
__out_opt MFWORKITEM_KEY * pKey);
|
|
|
|
//
|
|
// The CancelWorkItem method is used by objects to cancel scheduled operation
|
|
// Due to asynchronous nature of timers, application might still get a
|
|
// timer callback after MFCancelWorkItem has returned.
|
|
//
|
|
STDAPI MFCancelWorkItem(
|
|
MFWORKITEM_KEY Key);
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// MF periodic callbacks
|
|
//
|
|
STDAPI MFGetTimerPeriodicity(
|
|
__out DWORD * Periodicity);
|
|
|
|
typedef void (*MFPERIODICCALLBACK)(IUnknown* pContext);
|
|
|
|
STDAPI MFAddPeriodicCallback(
|
|
MFPERIODICCALLBACK Callback,
|
|
IUnknown * pContext,
|
|
__out_opt DWORD * pdwKey);
|
|
|
|
STDAPI MFRemovePeriodicCallback(
|
|
DWORD dwKey);
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// MF work queues
|
|
//
|
|
|
|
#if (WINVER >= _WIN32_WINNT_WIN7)
|
|
//
|
|
// MFASYNC_WORKQUEUE_TYPE: types of work queue used by MFAllocateWorkQueueEx
|
|
//
|
|
typedef enum
|
|
{
|
|
// MF_STANDARD_WORKQUEUE: Work queue in a thread without Window
|
|
// message loop.
|
|
MF_STANDARD_WORKQUEUE = 0,
|
|
|
|
// MF_WINDOW_WORKQUEUE: Work queue in a thread running Window
|
|
// Message loop that calls PeekMessage() / DispatchMessage()..
|
|
MF_WINDOW_WORKQUEUE = 1,
|
|
} MFASYNC_WORKQUEUE_TYPE;
|
|
|
|
STDAPI MFAllocateWorkQueueEx(
|
|
__in MFASYNC_WORKQUEUE_TYPE WorkQueueType,
|
|
__out OUT DWORD * pdwWorkQueue);
|
|
#endif // (WINVER >= _WIN32_WINNT_WIN7)
|
|
|
|
//
|
|
// Allocate a standard work queue. the behaviour is the same with:
|
|
// MFAllocateWorkQueueEx( MF_STANDARD_WORKQUEUE, pdwWorkQueue )
|
|
//
|
|
STDAPI MFAllocateWorkQueue(
|
|
__out OUT DWORD * pdwWorkQueue);
|
|
|
|
|
|
STDAPI MFLockWorkQueue(
|
|
__in DWORD dwWorkQueue);
|
|
|
|
STDAPI MFUnlockWorkQueue(
|
|
__in DWORD dwWorkQueue);
|
|
|
|
STDAPI MFBeginRegisterWorkQueueWithMMCSS(
|
|
DWORD dwWorkQueueId,
|
|
__in LPCWSTR wszClass,
|
|
DWORD dwTaskId,
|
|
__in IMFAsyncCallback * pDoneCallback,
|
|
__in IUnknown * pDoneState );
|
|
|
|
STDAPI MFEndRegisterWorkQueueWithMMCSS(
|
|
__in IMFAsyncResult * pResult,
|
|
__out DWORD * pdwTaskId );
|
|
|
|
STDAPI MFBeginUnregisterWorkQueueWithMMCSS(
|
|
DWORD dwWorkQueueId,
|
|
__in IMFAsyncCallback * pDoneCallback,
|
|
__in IUnknown * pDoneState );
|
|
|
|
STDAPI MFEndUnregisterWorkQueueWithMMCSS(
|
|
__in IMFAsyncResult * pResult );
|
|
|
|
STDAPI MFGetWorkQueueMMCSSClass(
|
|
DWORD dwWorkQueueId,
|
|
__out_ecount_part_opt(*pcchClass,*pcchClass) LPWSTR pwszClass,
|
|
__inout DWORD *pcchClass );
|
|
|
|
STDAPI MFGetWorkQueueMMCSSTaskId(
|
|
DWORD dwWorkQueueId,
|
|
__out LPDWORD pdwTaskId );
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////// Async Model //////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// Instantiates the MF-provided Async Result implementation
|
|
//
|
|
STDAPI MFCreateAsyncResult(
|
|
IUnknown * punkObject,
|
|
IMFAsyncCallback * pCallback,
|
|
IUnknown * punkState,
|
|
__out IMFAsyncResult ** ppAsyncResult );
|
|
|
|
//
|
|
// Helper for calling IMFAsyncCallback::Invoke
|
|
//
|
|
STDAPI MFInvokeCallback(
|
|
IMFAsyncResult * pAsyncResult );
|
|
|
|
|
|
//
|
|
// MFASYNCRESULT struct.
|
|
// Any implementation of IMFAsyncResult must inherit from this struct;
|
|
// the Media Foundation workqueue implementation depends on this.
|
|
//
|
|
#if defined(__cplusplus) && !defined(CINTERFACE)
|
|
typedef struct tagMFASYNCRESULT : public IMFAsyncResult
|
|
{
|
|
OVERLAPPED overlapped;
|
|
IMFAsyncCallback * pCallback;
|
|
HRESULT hrStatusResult;
|
|
DWORD dwBytesTransferred;
|
|
HANDLE hEvent;
|
|
} MFASYNCRESULT;
|
|
#else /* C style interface */
|
|
typedef struct tagMFASYNCRESULT
|
|
{
|
|
IMFAsyncResult AsyncResult;
|
|
OVERLAPPED overlapped;
|
|
IMFAsyncCallback * pCallback;
|
|
HRESULT hrStatusResult;
|
|
DWORD dwBytesTransferred;
|
|
HANDLE hEvent;
|
|
} MFASYNCRESULT;
|
|
#endif /* C style interface */
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////// Files //////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// Regardless of the access mode with which the file is opened, the sharing
|
|
// permissions will allow shared reading and deleting.
|
|
//
|
|
STDAPI MFCreateFile(
|
|
MF_FILE_ACCESSMODE AccessMode,
|
|
MF_FILE_OPENMODE OpenMode,
|
|
MF_FILE_FLAGS fFlags,
|
|
LPCWSTR pwszFileURL,
|
|
__out IMFByteStream **ppIByteStream );
|
|
|
|
STDAPI MFCreateTempFile(
|
|
MF_FILE_ACCESSMODE AccessMode,
|
|
MF_FILE_OPENMODE OpenMode,
|
|
MF_FILE_FLAGS fFlags,
|
|
__out IMFByteStream **ppIByteStream );
|
|
|
|
STDAPI MFBeginCreateFile(
|
|
MF_FILE_ACCESSMODE AccessMode,
|
|
MF_FILE_OPENMODE OpenMode,
|
|
MF_FILE_FLAGS fFlags,
|
|
LPCWSTR pwszFilePath,
|
|
IMFAsyncCallback * pCallback,
|
|
IUnknown * pState,
|
|
__out IUnknown ** ppCancelCookie);
|
|
|
|
STDAPI MFEndCreateFile(
|
|
IMFAsyncResult * pResult,
|
|
__out IMFByteStream **ppFile );
|
|
|
|
STDAPI MFCancelCreateFile(
|
|
IUnknown * pCancelCookie);
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////// Buffers //////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// Creates an IMFMediaBuffer in memory
|
|
//
|
|
STDAPI MFCreateMemoryBuffer(
|
|
__in DWORD cbMaxLength,
|
|
__out IMFMediaBuffer ** ppBuffer );
|
|
|
|
//
|
|
// Creates an IMFMediaBuffer wrapper at the given offset and length
|
|
// within an existing IMFMediaBuffer
|
|
//
|
|
STDAPI MFCreateMediaBufferWrapper(
|
|
__in IMFMediaBuffer * pBuffer,
|
|
__in DWORD cbOffset,
|
|
__in DWORD dwLength,
|
|
__out IMFMediaBuffer ** ppBuffer );
|
|
|
|
//
|
|
// Creates a legacy buffer (IMediaBuffer) wrapper at the given offset within
|
|
// an existing IMFMediaBuffer.
|
|
// pSample is optional. It can point to the original IMFSample from which this
|
|
// IMFMediaBuffer came. If provided, then *ppMediaBuffer will succeed
|
|
// QueryInterface for IID_IMFSample, from which the original sample's attributes
|
|
// can be obtained
|
|
//
|
|
STDAPI MFCreateLegacyMediaBufferOnMFMediaBuffer(
|
|
__in_opt IMFSample * pSample,
|
|
__in IMFMediaBuffer * pMFMediaBuffer,
|
|
__in DWORD cbOffset,
|
|
__deref_out IMediaBuffer ** ppMediaBuffer );
|
|
|
|
//
|
|
// Create a DirectX surface buffer
|
|
//
|
|
STDAPI MFCreateDXSurfaceBuffer(
|
|
__in REFIID riid,
|
|
__in IUnknown * punkSurface,
|
|
__in BOOL fBottomUpWhenLinear,
|
|
__deref_out IMFMediaBuffer ** ppBuffer );
|
|
|
|
|
|
//
|
|
// Create an aligned memory buffer.
|
|
// The following constants were chosen for parity with the alignment constants
|
|
// in ntioapi.h
|
|
//
|
|
#define MF_1_BYTE_ALIGNMENT 0x00000000
|
|
#define MF_2_BYTE_ALIGNMENT 0x00000001
|
|
#define MF_4_BYTE_ALIGNMENT 0x00000003
|
|
#define MF_8_BYTE_ALIGNMENT 0x00000007
|
|
#define MF_16_BYTE_ALIGNMENT 0x0000000f
|
|
#define MF_32_BYTE_ALIGNMENT 0x0000001f
|
|
#define MF_64_BYTE_ALIGNMENT 0x0000003f
|
|
#define MF_128_BYTE_ALIGNMENT 0x0000007f
|
|
#define MF_256_BYTE_ALIGNMENT 0x000000ff
|
|
#define MF_512_BYTE_ALIGNMENT 0x000001ff
|
|
|
|
STDAPI MFCreateAlignedMemoryBuffer(
|
|
__in DWORD cbMaxLength,
|
|
__in DWORD cbAligment,
|
|
__out IMFMediaBuffer ** ppBuffer );
|
|
|
|
//
|
|
// This GUID is used in IMFGetService::GetService calls to retrieve
|
|
// interfaces from the buffer. Its value is defined in evr.h
|
|
//
|
|
EXTERN_C const GUID MR_BUFFER_SERVICE;
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////// Events //////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// Instantiates the MF-provided Media Event implementation.
|
|
//
|
|
STDAPI MFCreateMediaEvent(
|
|
__in MediaEventType met,
|
|
__in REFGUID guidExtendedType,
|
|
__in HRESULT hrStatus,
|
|
__in_opt const PROPVARIANT * pvValue,
|
|
__out IMFMediaEvent ** ppEvent );
|
|
|
|
//
|
|
// Instantiates an object that implements IMFMediaEventQueue.
|
|
// Components that provide an IMFMediaEventGenerator can use this object
|
|
// internally to do their Media Event Generator work for them.
|
|
// IMFMediaEventGenerator calls should be forwarded to the similar call
|
|
// on this object's IMFMediaEventQueue interface (e.g. BeginGetEvent,
|
|
// EndGetEvent), and the various IMFMediaEventQueue::QueueEventXXX methods
|
|
// can be used to queue events that the caller will consume.
|
|
//
|
|
STDAPI MFCreateEventQueue(
|
|
__out IMFMediaEventQueue **ppMediaEventQueue );
|
|
|
|
//
|
|
// Event attributes
|
|
// Some of the common Media Foundation events have associated attributes
|
|
// that go in their IMFAttributes stores
|
|
//
|
|
|
|
//
|
|
// MESessionCapabilitiesChanged attributes
|
|
//
|
|
|
|
// MF_EVENT_SESSIONCAPS {7E5EBCD0-11B8-4abe-AFAD-10F6599A7F42}
|
|
// Type: UINT32
|
|
DEFINE_GUID(MF_EVENT_SESSIONCAPS,
|
|
0x7e5ebcd0, 0x11b8, 0x4abe, 0xaf, 0xad, 0x10, 0xf6, 0x59, 0x9a, 0x7f, 0x42);
|
|
|
|
// MF_EVENT_SESSIONCAPS_DELTA {7E5EBCD1-11B8-4abe-AFAD-10F6599A7F42}
|
|
// Type: UINT32
|
|
DEFINE_GUID(MF_EVENT_SESSIONCAPS_DELTA,
|
|
0x7e5ebcd1, 0x11b8, 0x4abe, 0xaf, 0xad, 0x10, 0xf6, 0x59, 0x9a, 0x7f, 0x42);
|
|
|
|
// Session capabilities bitflags
|
|
#define MFSESSIONCAP_START 0x00000001
|
|
#define MFSESSIONCAP_SEEK 0x00000002
|
|
#define MFSESSIONCAP_PAUSE 0x00000004
|
|
#define MFSESSIONCAP_RATE_FORWARD 0x00000010
|
|
#define MFSESSIONCAP_RATE_REVERSE 0x00000020
|
|
|
|
//
|
|
// MESessionTopologyStatus attributes
|
|
//
|
|
|
|
// Possible values for MF_EVENT_TOPOLOGY_STATUS attribute.
|
|
//
|
|
// For a given topology, these status values will arrive via
|
|
// MESessionTopologyStatus in the order below.
|
|
//
|
|
// However, there are no guarantees about how these status values will be
|
|
// ordered between two consecutive topologies. For example,
|
|
// MF_TOPOSTATUS_READY could arrive for topology n+1 before
|
|
// MF_TOPOSTATUS_ENDED arrives for topology n if the application called
|
|
// IMFMediaSession::SetTopology for topology n+1 well enough in advance of the
|
|
// end of topology n. Conversely, if topology n ends before the application
|
|
// calls IMFMediaSession::SetTopology for topology n+1, then
|
|
// MF_TOPOSTATUS_ENDED will arrive for topology n before MF_TOPOSTATUS_READY
|
|
// arrives for topology n+1.
|
|
typedef enum
|
|
{
|
|
// MF_TOPOSTATUS_INVALID: Invalid value; will not be sent
|
|
MF_TOPOSTATUS_INVALID = 0,
|
|
|
|
// MF_TOPOSTATUS_READY: The topology has been put in place and is
|
|
// ready to start. All GetService calls to the Media Session will use
|
|
// this topology.
|
|
MF_TOPOSTATUS_READY = 100,
|
|
|
|
// MF_TOPOSTATUS_STARTED_SOURCE: The Media Session has started to read
|
|
// and process data from the Media Source(s) in this topology.
|
|
MF_TOPOSTATUS_STARTED_SOURCE = 200,
|
|
|
|
|
|
#if (WINVER >= _WIN32_WINNT_WIN7)
|
|
// MF_TOPOSTATUS_DYNAMIC_CHANGED: The topology has been dynamic changed
|
|
// due to the format change.
|
|
MF_TOPOSTATUS_DYNAMIC_CHANGED = 210,
|
|
#endif // (WINVER >= _WIN32_WINNT_WIN7)
|
|
|
|
// MF_TOPOSTATUS_SINK_SWITCHED: The Media Sinks in the pipeline have
|
|
// switched from a previous topology to this topology.
|
|
// Note that this status does not get sent for the first topology;
|
|
// applications can assume that the sinks are playing the first
|
|
// topology when they receive MESessionStarted.
|
|
MF_TOPOSTATUS_SINK_SWITCHED = 300,
|
|
|
|
// MF_TOPOSTATUS_ENDED: Playback of this topology is complete.
|
|
// Before deleting this topology, however, the application should wait
|
|
// for either MESessionEnded or the MF_TOPOSTATUS_STARTED_SOURCE status
|
|
// on the next topology to ensure that the Media Session is no longer
|
|
// using this topology.
|
|
MF_TOPOSTATUS_ENDED = 400,
|
|
|
|
} MF_TOPOSTATUS;
|
|
|
|
// MF_EVENT_TOPOLOGY_STATUS {30C5018D-9A53-454b-AD9E-6D5F8FA7C43B}
|
|
// Type: UINT32 {MF_TOPOLOGY_STATUS}
|
|
DEFINE_GUID(MF_EVENT_TOPOLOGY_STATUS,
|
|
0x30c5018d, 0x9a53, 0x454b, 0xad, 0x9e, 0x6d, 0x5f, 0x8f, 0xa7, 0xc4, 0x3b);
|
|
|
|
//
|
|
// MESessionNotifyPresentationTime attributes
|
|
//
|
|
|
|
// MF_EVENT_START_PRESENTATION_TIME {5AD914D0-9B45-4a8d-A2C0-81D1E50BFB07}
|
|
// Type: UINT64
|
|
DEFINE_GUID(MF_EVENT_START_PRESENTATION_TIME,
|
|
0x5ad914d0, 0x9b45, 0x4a8d, 0xa2, 0xc0, 0x81, 0xd1, 0xe5, 0xb, 0xfb, 0x7);
|
|
|
|
// MF_EVENT_PRESENTATION_TIME_OFFSET {5AD914D1-9B45-4a8d-A2C0-81D1E50BFB07}
|
|
// Type: UINT64
|
|
DEFINE_GUID(MF_EVENT_PRESENTATION_TIME_OFFSET,
|
|
0x5ad914d1, 0x9b45, 0x4a8d, 0xa2, 0xc0, 0x81, 0xd1, 0xe5, 0xb, 0xfb, 0x7);
|
|
|
|
// MF_EVENT_START_PRESENTATION_TIME_AT_OUTPUT {5AD914D2-9B45-4a8d-A2C0-81D1E50BFB07}
|
|
// Type: UINT64
|
|
DEFINE_GUID(MF_EVENT_START_PRESENTATION_TIME_AT_OUTPUT,
|
|
0x5ad914d2, 0x9b45, 0x4a8d, 0xa2, 0xc0, 0x81, 0xd1, 0xe5, 0xb, 0xfb, 0x7);
|
|
|
|
//
|
|
|
|
//
|
|
// MESourceStarted attributes
|
|
//
|
|
|
|
// MF_EVENT_SOURCE_FAKE_START {a8cc55a7-6b31-419f-845d-ffb351a2434b}
|
|
// Type: UINT32
|
|
DEFINE_GUID(MF_EVENT_SOURCE_FAKE_START,
|
|
0xa8cc55a7, 0x6b31, 0x419f, 0x84, 0x5d, 0xff, 0xb3, 0x51, 0xa2, 0x43, 0x4b);
|
|
|
|
// MF_EVENT_SOURCE_PROJECTSTART {a8cc55a8-6b31-419f-845d-ffb351a2434b}
|
|
// Type: UINT64
|
|
DEFINE_GUID(MF_EVENT_SOURCE_PROJECTSTART,
|
|
0xa8cc55a8, 0x6b31, 0x419f, 0x84, 0x5d, 0xff, 0xb3, 0x51, 0xa2, 0x43, 0x4b);
|
|
|
|
// MF_EVENT_SOURCE_ACTUAL_START {a8cc55a9-6b31-419f-845d-ffb351a2434b}
|
|
// Type: UINT64
|
|
DEFINE_GUID(MF_EVENT_SOURCE_ACTUAL_START,
|
|
0xa8cc55a9, 0x6b31, 0x419f, 0x84, 0x5d, 0xff, 0xb3, 0x51, 0xa2, 0x43, 0x4b);
|
|
|
|
//
|
|
// MEEndOfPresentationSegment attributes
|
|
//
|
|
|
|
// MF_EVENT_SOURCE_TOPOLOGY_CANCELED {DB62F650-9A5E-4704-ACF3-563BC6A73364}
|
|
// Type: UINT32
|
|
DEFINE_GUID(MF_EVENT_SOURCE_TOPOLOGY_CANCELED,
|
|
0xdb62f650, 0x9a5e, 0x4704, 0xac, 0xf3, 0x56, 0x3b, 0xc6, 0xa7, 0x33, 0x64);
|
|
|
|
//
|
|
// MESourceCharacteristicsChanged attributes
|
|
//
|
|
|
|
// MF_EVENT_SOURCE_CHARACTERISTICS {47DB8490-8B22-4f52-AFDA-9CE1B2D3CFA8}
|
|
// Type: UINT32
|
|
DEFINE_GUID(MF_EVENT_SOURCE_CHARACTERISTICS,
|
|
0x47db8490, 0x8b22, 0x4f52, 0xaf, 0xda, 0x9c, 0xe1, 0xb2, 0xd3, 0xcf, 0xa8);
|
|
|
|
// MF_EVENT_SOURCE_CHARACTERISTICS_OLD {47DB8491-8B22-4f52-AFDA-9CE1B2D3CFA8}
|
|
// Type: UINT32
|
|
DEFINE_GUID(MF_EVENT_SOURCE_CHARACTERISTICS_OLD,
|
|
0x47db8491, 0x8b22, 0x4f52, 0xaf, 0xda, 0x9c, 0xe1, 0xb2, 0xd3, 0xcf, 0xa8);
|
|
|
|
//
|
|
// MESourceRateChangeRequested attributes
|
|
//
|
|
|
|
// MF_EVENT_DO_THINNING {321EA6FB-DAD9-46e4-B31D-D2EAE7090E30}
|
|
// Type: UINT32
|
|
DEFINE_GUID(MF_EVENT_DO_THINNING,
|
|
0x321ea6fb, 0xdad9, 0x46e4, 0xb3, 0x1d, 0xd2, 0xea, 0xe7, 0x9, 0xe, 0x30);
|
|
|
|
//
|
|
// MEStreamSinkScrubSampleComplete attributes
|
|
//
|
|
|
|
// MF_EVENT_SCRUBSAMPLE_TIME {9AC712B3-DCB8-44d5-8D0C-37455A2782E3}
|
|
// Type: UINT64
|
|
DEFINE_GUID(MF_EVENT_SCRUBSAMPLE_TIME,
|
|
0x9ac712b3, 0xdcb8, 0x44d5, 0x8d, 0xc, 0x37, 0x45, 0x5a, 0x27, 0x82, 0xe3);
|
|
|
|
//
|
|
// MESinkInvalidated and MESessionStreamSinkFormatChanged attributes
|
|
//
|
|
|
|
// MF_EVENT_OUTPUT_NODE {830f1a8b-c060-46dd-a801-1c95dec9b107}
|
|
// Type: UINT64
|
|
DEFINE_GUID(MF_EVENT_OUTPUT_NODE,
|
|
0x830f1a8b, 0xc060, 0x46dd, 0xa8, 0x01, 0x1c, 0x95, 0xde, 0xc9, 0xb1, 0x07);
|
|
|
|
#if (WINVER >= _WIN32_WINNT_WIN7)
|
|
//
|
|
// METransformNeedInput attributes
|
|
//
|
|
|
|
// MF_EVENT_MFT_INPUT_STREAM_ID {F29C2CCA-7AE6-42d2-B284-BF837CC874E2}
|
|
// Type: UINT32
|
|
DEFINE_GUID(MF_EVENT_MFT_INPUT_STREAM_ID,
|
|
0xf29c2cca, 0x7ae6, 0x42d2, 0xb2, 0x84, 0xbf, 0x83, 0x7c, 0xc8, 0x74, 0xe2);
|
|
|
|
//
|
|
// METransformDrainComplete and METransformMarker attributes
|
|
//
|
|
|
|
// MF_EVENT_MFT_CONTEXT {B7CD31F1-899E-4b41-80C9-26A896D32977}
|
|
// Type: UINT64
|
|
DEFINE_GUID(MF_EVENT_MFT_CONTEXT,
|
|
0xb7cd31f1, 0x899e, 0x4b41, 0x80, 0xc9, 0x26, 0xa8, 0x96, 0xd3, 0x29, 0x77);
|
|
|
|
#endif // (WINVER >= _WIN32_WINNT_WIN7)
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////// Samples //////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// Creates an instance of the Media Foundation implementation of IMFSample
|
|
//
|
|
STDAPI MFCreateSample( __out IMFSample **ppIMFSample );
|
|
|
|
//
|
|
// Sample attributes
|
|
// These are the well-known attributes that can be present on an MF Sample's
|
|
// IMFAttributes store
|
|
//
|
|
|
|
// MFSampleExtension_CleanPoint {9cdf01d8-a0f0-43ba-b077-eaa06cbd728a}
|
|
// Type: UINT32
|
|
// If present and nonzero, indicates that the sample is a clean point (key
|
|
// frame), and decoding can begin at this sample.
|
|
DEFINE_GUID(MFSampleExtension_CleanPoint,
|
|
0x9cdf01d8, 0xa0f0, 0x43ba, 0xb0, 0x77, 0xea, 0xa0, 0x6c, 0xbd, 0x72, 0x8a);
|
|
|
|
// MFSampleExtension_Discontinuity {9cdf01d9-a0f0-43ba-b077-eaa06cbd728a}
|
|
// Type: UINT32
|
|
// If present and nonzero, indicates that the sample data represents the first
|
|
// sample following a discontinuity (gap) in the stream of samples.
|
|
// This can happen, for instance, if the previous sample was lost in
|
|
// transmission.
|
|
DEFINE_GUID(MFSampleExtension_Discontinuity,
|
|
0x9cdf01d9, 0xa0f0, 0x43ba, 0xb0, 0x77, 0xea, 0xa0, 0x6c, 0xbd, 0x72, 0x8a);
|
|
|
|
// MFSampleExtension_Token {8294da66-f328-4805-b551-00deb4c57a61}
|
|
// Type: IUNKNOWN
|
|
// When an IMFMediaStream delivers a sample via MEMediaStream, this attribute
|
|
// should be set to the IUnknown *pToken argument that was passed with the
|
|
// IMFMediaStream::RequestSample call to which this sample corresponds.
|
|
DEFINE_GUID(MFSampleExtension_Token,
|
|
0x8294da66, 0xf328, 0x4805, 0xb5, 0x51, 0x00, 0xde, 0xb4, 0xc5, 0x7a, 0x61);
|
|
|
|
//
|
|
// The following four sample attributes are used for encrypted samples
|
|
//
|
|
DEFINE_GUID(MFSampleExtension_DescrambleData, // UINT64
|
|
0x43483be6, 0x4903, 0x4314, 0xb0, 0x32, 0x29, 0x51, 0x36, 0x59, 0x36, 0xfc);
|
|
DEFINE_GUID(MFSampleExtension_SampleKeyID, // UINT32
|
|
0x9ed713c8, 0x9b87, 0x4b26, 0x82, 0x97, 0xa9, 0x3b, 0x0c, 0x5a, 0x8a, 0xcc);
|
|
DEFINE_GUID(MFSampleExtension_GenKeyFunc, // UINT64
|
|
0x441ca1ee, 0x6b1f, 0x4501, 0x90, 0x3a, 0xde, 0x87, 0xdf, 0x42, 0xf6, 0xed);
|
|
DEFINE_GUID(MFSampleExtension_GenKeyCtx, // UINT64
|
|
0x188120cb, 0xd7da, 0x4b59, 0x9b, 0x3e, 0x92, 0x52, 0xfd, 0x37, 0x30, 0x1c);
|
|
DEFINE_GUID(MFSampleExtension_PacketCrossOffsets, // BLOB
|
|
0x2789671d, 0x389f, 0x40bb, 0x90, 0xd9, 0xc2, 0x82, 0xf7, 0x7f, 0x9a, 0xbd);
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// MFSample STANDARD EXTENSION ATTRIBUTE GUIDs
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// {b1d5830a-deb8-40e3-90fa-389943716461} MFSampleExtension_Interlaced {UINT32 (BOOL)}
|
|
DEFINE_GUID(MFSampleExtension_Interlaced,
|
|
0xb1d5830a, 0xdeb8, 0x40e3, 0x90, 0xfa, 0x38, 0x99, 0x43, 0x71, 0x64, 0x61);
|
|
|
|
// {941ce0a3-6ae3-4dda-9a08-a64298340617} MFSampleExtension_BottomFieldFirst {UINT32 (BOOL)}
|
|
DEFINE_GUID(MFSampleExtension_BottomFieldFirst,
|
|
0x941ce0a3, 0x6ae3, 0x4dda, 0x9a, 0x08, 0xa6, 0x42, 0x98, 0x34, 0x06, 0x17);
|
|
|
|
// {304d257c-7493-4fbd-b149-9228de8d9a99} MFSampleExtension_RepeatFirstField {UINT32 (BOOL)}
|
|
DEFINE_GUID(MFSampleExtension_RepeatFirstField,
|
|
0x304d257c, 0x7493, 0x4fbd, 0xb1, 0x49, 0x92, 0x28, 0xde, 0x8d, 0x9a, 0x99);
|
|
|
|
// {9d85f816-658b-455a-bde0-9fa7e15ab8f9} MFSampleExtension_SingleField {UINT32 (BOOL)}
|
|
DEFINE_GUID(MFSampleExtension_SingleField,
|
|
0x9d85f816, 0x658b, 0x455a, 0xbd, 0xe0, 0x9f, 0xa7, 0xe1, 0x5a, 0xb8, 0xf9);
|
|
|
|
// {6852465a-ae1c-4553-8e9b-c3420fcb1637} MFSampleExtension_DerivedFromTopField {UINT32 (BOOL)}
|
|
DEFINE_GUID(MFSampleExtension_DerivedFromTopField,
|
|
0x6852465a, 0xae1c, 0x4553, 0x8e, 0x9b, 0xc3, 0x42, 0x0f, 0xcb, 0x16, 0x37);
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////// Attributes ////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
STDAPI
|
|
MFCreateAttributes(
|
|
__out IMFAttributes** ppMFAttributes,
|
|
__in UINT32 cInitialSize
|
|
);
|
|
|
|
STDAPI
|
|
MFInitAttributesFromBlob(
|
|
__in IMFAttributes* pAttributes,
|
|
__in_bcount(cbBufSize) const UINT8* pBuf,
|
|
__in UINT cbBufSize
|
|
);
|
|
|
|
STDAPI
|
|
MFGetAttributesAsBlobSize(
|
|
__in IMFAttributes* pAttributes,
|
|
__out UINT32* pcbBufSize
|
|
);
|
|
|
|
STDAPI
|
|
MFGetAttributesAsBlob(
|
|
__in IMFAttributes* pAttributes,
|
|
__out_bcount(cbBufSize) UINT8* pBuf,
|
|
__in UINT cbBufSize
|
|
);
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////// MFT Register & Enum ////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// MFT Registry categories
|
|
//
|
|
|
|
#ifdef MF_INIT_GUIDS
|
|
#include <initguid.h>
|
|
#endif
|
|
|
|
// {d6c02d4b-6833-45b4-971a-05a4b04bab91} MFT_CATEGORY_VIDEO_DECODER
|
|
DEFINE_GUID(MFT_CATEGORY_VIDEO_DECODER,
|
|
0xd6c02d4b, 0x6833, 0x45b4, 0x97, 0x1a, 0x05, 0xa4, 0xb0, 0x4b, 0xab, 0x91);
|
|
|
|
// {f79eac7d-e545-4387-bdee-d647d7bde42a} MFT_CATEGORY_VIDEO_ENCODER
|
|
DEFINE_GUID(MFT_CATEGORY_VIDEO_ENCODER,
|
|
0xf79eac7d, 0xe545, 0x4387, 0xbd, 0xee, 0xd6, 0x47, 0xd7, 0xbd, 0xe4, 0x2a);
|
|
|
|
// {12e17c21-532c-4a6e-8a1c-40825a736397} MFT_CATEGORY_VIDEO_EFFECT
|
|
DEFINE_GUID(MFT_CATEGORY_VIDEO_EFFECT,
|
|
0x12e17c21, 0x532c, 0x4a6e, 0x8a, 0x1c, 0x40, 0x82, 0x5a, 0x73, 0x63, 0x97);
|
|
|
|
// {059c561e-05ae-4b61-b69d-55b61ee54a7b} MFT_CATEGORY_MULTIPLEXER
|
|
DEFINE_GUID(MFT_CATEGORY_MULTIPLEXER,
|
|
0x059c561e, 0x05ae, 0x4b61, 0xb6, 0x9d, 0x55, 0xb6, 0x1e, 0xe5, 0x4a, 0x7b);
|
|
|
|
// {a8700a7a-939b-44c5-99d7-76226b23b3f1} MFT_CATEGORY_DEMULTIPLEXER
|
|
DEFINE_GUID(MFT_CATEGORY_DEMULTIPLEXER,
|
|
0xa8700a7a, 0x939b, 0x44c5, 0x99, 0xd7, 0x76, 0x22, 0x6b, 0x23, 0xb3, 0xf1);
|
|
|
|
// {9ea73fb4-ef7a-4559-8d5d-719d8f0426c7} MFT_CATEGORY_AUDIO_DECODER
|
|
DEFINE_GUID(MFT_CATEGORY_AUDIO_DECODER,
|
|
0x9ea73fb4, 0xef7a, 0x4559, 0x8d, 0x5d, 0x71, 0x9d, 0x8f, 0x04, 0x26, 0xc7);
|
|
|
|
// {91c64bd0-f91e-4d8c-9276-db248279d975} MFT_CATEGORY_AUDIO_ENCODER
|
|
DEFINE_GUID(MFT_CATEGORY_AUDIO_ENCODER,
|
|
0x91c64bd0, 0xf91e, 0x4d8c, 0x92, 0x76, 0xdb, 0x24, 0x82, 0x79, 0xd9, 0x75);
|
|
|
|
// {11064c48-3648-4ed0-932e-05ce8ac811b7} MFT_CATEGORY_AUDIO_EFFECT
|
|
DEFINE_GUID(MFT_CATEGORY_AUDIO_EFFECT,
|
|
0x11064c48, 0x3648, 0x4ed0, 0x93, 0x2e, 0x05, 0xce, 0x8a, 0xc8, 0x11, 0xb7);
|
|
|
|
#if (WINVER >= _WIN32_WINNT_WIN7)
|
|
// {302EA3FC-AA5F-47f9-9F7A-C2188BB163021}...MFT_CATEGORY_VIDEO_PROCESSOR
|
|
DEFINE_GUID(MFT_CATEGORY_VIDEO_PROCESSOR,
|
|
0x302ea3fc, 0xaa5f, 0x47f9, 0x9f, 0x7a, 0xc2, 0x18, 0x8b, 0xb1, 0x63, 0x2);
|
|
#endif // (WINVER >= _WIN32_WINNT_WIN7)
|
|
|
|
// {90175d57-b7ea-4901-aeb3-933a8747756f} MFT_CATEGORY_OTHER
|
|
DEFINE_GUID(MFT_CATEGORY_OTHER,
|
|
0x90175d57, 0xb7ea, 0x4901, 0xae, 0xb3, 0x93, 0x3a, 0x87, 0x47, 0x75, 0x6f);
|
|
|
|
//
|
|
// "Flags" is for future expansion - for now must be 0
|
|
//
|
|
STDAPI
|
|
MFTRegister(
|
|
__in CLSID clsidMFT,
|
|
__in GUID guidCategory,
|
|
__in LPWSTR pszName,
|
|
__in UINT32 Flags,
|
|
__in UINT32 cInputTypes,
|
|
__in_ecount_opt(cInputTypes) MFT_REGISTER_TYPE_INFO* pInputTypes,
|
|
__in UINT32 cOutputTypes,
|
|
__in_ecount_opt(cOutputTypes) MFT_REGISTER_TYPE_INFO* pOutputTypes,
|
|
__in_opt IMFAttributes* pAttributes
|
|
);
|
|
|
|
STDAPI
|
|
MFTUnregister(
|
|
__in CLSID clsidMFT
|
|
);
|
|
|
|
#if (WINVER >= _WIN32_WINNT_WIN7)
|
|
// Register an MFT class in-process
|
|
STDAPI
|
|
MFTRegisterLocal(
|
|
__in IClassFactory* pClassFactory,
|
|
__in REFGUID guidCategory,
|
|
__in LPCWSTR pszName,
|
|
__in UINT32 Flags,
|
|
__in UINT32 cInputTypes,
|
|
__in_ecount_opt(cInputTypes)const MFT_REGISTER_TYPE_INFO* pInputTypes,
|
|
__in UINT32 cOutputTypes,
|
|
__in_ecount_opt(cOutputTypes)const MFT_REGISTER_TYPE_INFO* pOutputTypes
|
|
);
|
|
|
|
// Unregister locally registered MFT
|
|
// If pClassFactory is NULL all local MFTs are unregistered
|
|
STDAPI
|
|
MFTUnregisterLocal(
|
|
__in_opt IClassFactory * pClassFactory
|
|
);
|
|
|
|
// Register an MFT class in-process, by CLSID
|
|
STDAPI
|
|
MFTRegisterLocalByCLSID(
|
|
__in REFCLSID clisdMFT,
|
|
__in REFGUID guidCategory,
|
|
__in LPCWSTR pszName,
|
|
__in UINT32 Flags,
|
|
__in UINT32 cInputTypes,
|
|
__in_ecount_opt(cInputTypes)const MFT_REGISTER_TYPE_INFO* pInputTypes,
|
|
__in UINT32 cOutputTypes,
|
|
__in_ecount_opt(cOutputTypes)const MFT_REGISTER_TYPE_INFO* pOutputTypes
|
|
);
|
|
|
|
// Unregister locally registered MFT by CLSID
|
|
STDAPI
|
|
MFTUnregisterLocalByCLSID(
|
|
__in CLSID clsidMFT
|
|
);
|
|
#endif // (WINVER >= _WIN32_WINNT_WIN7)
|
|
|
|
//
|
|
// result *ppclsidMFT must be freed with CoTaskMemFree.
|
|
//
|
|
STDAPI
|
|
MFTEnum(
|
|
__in GUID guidCategory,
|
|
__in UINT32 Flags,
|
|
__in_opt MFT_REGISTER_TYPE_INFO* pInputType,
|
|
__in_opt MFT_REGISTER_TYPE_INFO* pOutputType,
|
|
__in_opt IMFAttributes* pAttributes,
|
|
__deref_out_ecount(*pcMFTs) CLSID** ppclsidMFT, // must be freed with CoTaskMemFree
|
|
__out UINT32* pcMFTs
|
|
);
|
|
|
|
#if (WINVER >= _WIN32_WINNT_WIN7)
|
|
|
|
enum _MFT_ENUM_FLAG
|
|
{
|
|
MFT_ENUM_FLAG_SYNCMFT = 0x00000001, // Enumerates V1 MFTs. This is default.
|
|
MFT_ENUM_FLAG_ASYNCMFT = 0x00000002, // Enumerates only software async MFTs also known as V2 MFTs
|
|
MFT_ENUM_FLAG_HARDWARE = 0x00000004, // Enumerates V2 hardware async MFTs
|
|
MFT_ENUM_FLAG_FIELDOFUSE = 0x00000008, // Enumerates MFTs that require unlocking
|
|
MFT_ENUM_FLAG_LOCALMFT = 0x00000010, // Enumerates Locally (in-process) registered MFTs
|
|
MFT_ENUM_FLAG_TRANSCODE_ONLY = 0x00000020, // Enumerates decoder MFTs used by transcode only
|
|
MFT_ENUM_FLAG_SORTANDFILTER = 0x00000040, // Apply system local, do not use and preferred sorting and filtering
|
|
MFT_ENUM_FLAG_ALL = 0x0000003F // Enumerates all MFTs including SW and HW MFTs and applies filtering
|
|
};
|
|
|
|
//
|
|
// result *pppMFTActivate must be freed with CoTaskMemFree. Each IMFActivate pointer inside this
|
|
// buffer should be released.
|
|
//
|
|
|
|
STDAPI
|
|
MFTEnumEx(
|
|
__in GUID guidCategory,
|
|
__in UINT32 Flags,
|
|
__in_opt const MFT_REGISTER_TYPE_INFO* pInputType,
|
|
__in_opt const MFT_REGISTER_TYPE_INFO* pOutputType,
|
|
__deref_out_ecount(*pnumMFTActivate) IMFActivate*** pppMFTActivate,
|
|
__out UINT32* pnumMFTActivate
|
|
);
|
|
#endif // (WINVER >= _WIN32_WINNT_WIN7)
|
|
|
|
//
|
|
// results *pszName, *ppInputTypes, and *ppOutputTypes must be freed with CoTaskMemFree.
|
|
// *ppAttributes must be released.
|
|
//
|
|
STDAPI
|
|
MFTGetInfo(
|
|
__in CLSID clsidMFT,
|
|
__out_opt LPWSTR* pszName,
|
|
__deref_opt_out_ecount(*pcInputTypes) MFT_REGISTER_TYPE_INFO** ppInputTypes,
|
|
__out_opt UINT32* pcInputTypes,
|
|
__deref_opt_out_ecount(*pcOutputTypes) MFT_REGISTER_TYPE_INFO** ppOutputTypes,
|
|
__out_opt UINT32* pcOutputTypes,
|
|
__deref_opt_out_opt IMFAttributes** ppAttributes
|
|
);
|
|
|
|
|
|
#if (WINVER >= _WIN32_WINNT_WIN7)
|
|
|
|
//
|
|
// Get the plugin control API
|
|
//
|
|
STDAPI
|
|
MFGetPluginControl(
|
|
__out IMFPluginControl **ppPluginControl
|
|
);
|
|
|
|
//
|
|
// Get MFT's merit - checking that is has a valid certificate
|
|
//
|
|
STDAPI
|
|
MFGetMFTMerit(
|
|
__inout IUnknown *pMFT,
|
|
__in UINT32 cbVerifier,
|
|
__in_bcount(cbVerifier) const BYTE * verifier,
|
|
__out DWORD *merit
|
|
);
|
|
|
|
#endif // (WINVER >= _WIN32_WINNT_WIN7)
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////// MFT Attributes GUIDs ////////////////////////////
|
|
// {53476A11-3F13-49fb-AC42-EE2733C96741} MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE {UINT32 (BOOL)}
|
|
DEFINE_GUID(MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE,
|
|
0x53476a11, 0x3f13, 0x49fb, 0xac, 0x42, 0xee, 0x27, 0x33, 0xc9, 0x67, 0x41);
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////// Media Type GUIDs ////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// GUIDs for media types
|
|
//
|
|
|
|
//
|
|
// In MF, media types for uncompressed video formats MUST be composed from a FourCC or D3DFORMAT combined with
|
|
// the "base GUID" {00000000-0000-0010-8000-00AA00389B71} by replacing the initial 32 bits with the FourCC/D3DFORMAT
|
|
//
|
|
// Audio media types for types which already have a defined wFormatTag value can be constructed similarly, by
|
|
// putting the wFormatTag (zero-extended to 32 bits) into the first 32 bits of the base GUID.
|
|
//
|
|
// Compressed video or audio can also use any well-known GUID that exists, or can create a new GUID.
|
|
//
|
|
// GUIDs for common media types are defined below.
|
|
//
|
|
|
|
|
|
#ifndef FCC
|
|
#define FCC(ch4) ((((DWORD)(ch4) & 0xFF) << 24) | \
|
|
(((DWORD)(ch4) & 0xFF00) << 8) | \
|
|
(((DWORD)(ch4) & 0xFF0000) >> 8) | \
|
|
(((DWORD)(ch4) & 0xFF000000) >> 24))
|
|
#endif
|
|
|
|
|
|
//
|
|
// this macro creates a media type GUID from a FourCC, D3DFMT, or WAVE_FORMAT
|
|
//
|
|
#ifndef DEFINE_MEDIATYPE_GUID
|
|
#define DEFINE_MEDIATYPE_GUID(name, format) \
|
|
DEFINE_GUID(name, \
|
|
format, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
|
|
#endif
|
|
|
|
//
|
|
// video media types
|
|
//
|
|
|
|
//
|
|
// If no D3D headers have been included yet, define local versions of D3DFMT constants we use.
|
|
// We can't include D3D headers from this header because we need it to be compatible with all versions
|
|
// of D3D.
|
|
//
|
|
#ifndef DIRECT3D_VERSION
|
|
#define D3DFMT_R8G8B8 20
|
|
#define D3DFMT_A8R8G8B8 21
|
|
#define D3DFMT_X8R8G8B8 22
|
|
#define D3DFMT_R5G6B5 23
|
|
#define D3DFMT_X1R5G5B5 24
|
|
#define D3DFMT_P8 41
|
|
#define LOCAL_D3DFMT_DEFINES 1
|
|
#endif
|
|
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_Base, 0x00000000 );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_RGB32, D3DFMT_X8R8G8B8 );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_ARGB32, D3DFMT_A8R8G8B8 );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_RGB24, D3DFMT_R8G8B8 );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_RGB555, D3DFMT_X1R5G5B5 );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_RGB565, D3DFMT_R5G6B5 );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_RGB8, D3DFMT_P8 );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_AI44, FCC('AI44') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_AYUV, FCC('AYUV') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_YUY2, FCC('YUY2') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_YVYU, FCC('YVYU') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_YVU9, FCC('YVU9') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_UYVY, FCC('UYVY') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_NV11, FCC('NV11') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_NV12, FCC('NV12') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_YV12, FCC('YV12') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_I420, FCC('I420') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_IYUV, FCC('IYUV') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_Y210, FCC('Y210') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_Y216, FCC('Y216') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_Y410, FCC('Y410') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_Y416, FCC('Y416') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_Y41P, FCC('Y41P') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_Y41T, FCC('Y41T') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_Y42T, FCC('Y42T') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_P210, FCC('P210') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_P216, FCC('P216') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_P010, FCC('P010') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_P016, FCC('P016') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_v210, FCC('v210') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_v216, FCC('v216') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_v410, FCC('v410') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_MP43, FCC('MP43') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_MP4S, FCC('MP4S') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_M4S2, FCC('M4S2') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_MP4V, FCC('MP4V') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_WMV1, FCC('WMV1') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_WMV2, FCC('WMV2') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_WMV3, FCC('WMV3') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_WVC1, FCC('WVC1') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_MSS1, FCC('MSS1') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_MSS2, FCC('MSS2') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_MPG1, FCC('MPG1') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_DVSL, FCC('dvsl') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_DVSD, FCC('dvsd') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_DVHD, FCC('dvhd') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_DV25, FCC('dv25') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_DV50, FCC('dv50') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_DVH1, FCC('dvh1') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_DVC, FCC('dvc ') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_H264, FCC('H264') );
|
|
DEFINE_MEDIATYPE_GUID( MFVideoFormat_MJPG, FCC('MJPG') );
|
|
|
|
//
|
|
// undef the local D3DFMT definitions to avoid later clashes with D3D headers
|
|
//
|
|
#ifdef LOCAL_D3DFMT_DEFINES
|
|
#undef D3DFMT_R8G8B8
|
|
#undef D3DFMT_A8R8G8B8
|
|
#undef D3DFMT_X8R8G8B8
|
|
#undef D3DFMT_R5G6B5
|
|
#undef D3DFMT_X1R5G5B5
|
|
#undef D3DFMT_P8
|
|
#undef LOCAL_D3DFMT_DEFINES
|
|
#endif
|
|
|
|
//
|
|
// some legacy formats that don't fit the common pattern
|
|
//
|
|
|
|
// {e06d8026-db46-11cf-b4d1-00805f6cbbea} MFVideoFormat_MPEG2
|
|
DEFINE_GUID(MFVideoFormat_MPEG2,
|
|
0xe06d8026, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea);
|
|
|
|
#define MFVideoFormat_MPG2 MFVideoFormat_MPEG2
|
|
|
|
//
|
|
// audio media types
|
|
//
|
|
DEFINE_MEDIATYPE_GUID( MFAudioFormat_Base, 0x00000000 );
|
|
DEFINE_MEDIATYPE_GUID( MFAudioFormat_PCM, WAVE_FORMAT_PCM );
|
|
DEFINE_MEDIATYPE_GUID( MFAudioFormat_Float, WAVE_FORMAT_IEEE_FLOAT );
|
|
DEFINE_MEDIATYPE_GUID( MFAudioFormat_DTS, WAVE_FORMAT_DTS );
|
|
DEFINE_MEDIATYPE_GUID( MFAudioFormat_Dolby_AC3_SPDIF, WAVE_FORMAT_DOLBY_AC3_SPDIF );
|
|
DEFINE_MEDIATYPE_GUID( MFAudioFormat_DRM, WAVE_FORMAT_DRM );
|
|
DEFINE_MEDIATYPE_GUID( MFAudioFormat_WMAudioV8, WAVE_FORMAT_WMAUDIO2 );
|
|
DEFINE_MEDIATYPE_GUID( MFAudioFormat_WMAudioV9, WAVE_FORMAT_WMAUDIO3 );
|
|
DEFINE_MEDIATYPE_GUID( MFAudioFormat_WMAudio_Lossless, WAVE_FORMAT_WMAUDIO_LOSSLESS );
|
|
DEFINE_MEDIATYPE_GUID( MFAudioFormat_WMASPDIF, WAVE_FORMAT_WMASPDIF );
|
|
DEFINE_MEDIATYPE_GUID( MFAudioFormat_MSP1, WAVE_FORMAT_WMAVOICE9 );
|
|
DEFINE_MEDIATYPE_GUID( MFAudioFormat_MP3, WAVE_FORMAT_MPEGLAYER3 );
|
|
DEFINE_MEDIATYPE_GUID( MFAudioFormat_MPEG, WAVE_FORMAT_MPEG );
|
|
DEFINE_MEDIATYPE_GUID( MFAudioFormat_AAC, WAVE_FORMAT_MPEG_HEAAC );
|
|
DEFINE_MEDIATYPE_GUID( MFAudioFormat_ADTS, WAVE_FORMAT_MPEG_ADTS_AAC );
|
|
|
|
//
|
|
// MPEG-4 media types
|
|
//
|
|
|
|
// {00000000-767a-494d-b478-f29d25dc9037} MFMPEG4Format_Base
|
|
DEFINE_GUID(MFMPEG4Format_Base,
|
|
0x00000000, 0x767a, 0x494d, 0xb4, 0x78, 0xf2, 0x9d, 0x25, 0xdc, 0x90, 0x37);
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////// Media Type Attributes GUIDs ////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// GUIDs for IMFMediaType properties - prefix 'MF_MT_' - basic prop type in {},
|
|
// with type to cast to in ().
|
|
//
|
|
|
|
|
|
//
|
|
// core info for all types
|
|
//
|
|
// {48eba18e-f8c9-4687-bf11-0a74c9f96a8f} MF_MT_MAJOR_TYPE {GUID}
|
|
DEFINE_GUID(MF_MT_MAJOR_TYPE,
|
|
0x48eba18e, 0xf8c9, 0x4687, 0xbf, 0x11, 0x0a, 0x74, 0xc9, 0xf9, 0x6a, 0x8f);
|
|
|
|
// {f7e34c9a-42e8-4714-b74b-cb29d72c35e5} MF_MT_SUBTYPE {GUID}
|
|
DEFINE_GUID(MF_MT_SUBTYPE,
|
|
0xf7e34c9a, 0x42e8, 0x4714, 0xb7, 0x4b, 0xcb, 0x29, 0xd7, 0x2c, 0x35, 0xe5);
|
|
|
|
// {c9173739-5e56-461c-b713-46fb995cb95f} MF_MT_ALL_SAMPLES_INDEPENDENT {UINT32 (BOOL)}
|
|
DEFINE_GUID(MF_MT_ALL_SAMPLES_INDEPENDENT,
|
|
0xc9173739, 0x5e56, 0x461c, 0xb7, 0x13, 0x46, 0xfb, 0x99, 0x5c, 0xb9, 0x5f);
|
|
|
|
// {b8ebefaf-b718-4e04-b0a9-116775e3321b} MF_MT_FIXED_SIZE_SAMPLES {UINT32 (BOOL)}
|
|
DEFINE_GUID(MF_MT_FIXED_SIZE_SAMPLES,
|
|
0xb8ebefaf, 0xb718, 0x4e04, 0xb0, 0xa9, 0x11, 0x67, 0x75, 0xe3, 0x32, 0x1b);
|
|
|
|
// {3afd0cee-18f2-4ba5-a110-8bea502e1f92} MF_MT_COMPRESSED {UINT32 (BOOL)}
|
|
DEFINE_GUID(MF_MT_COMPRESSED,
|
|
0x3afd0cee, 0x18f2, 0x4ba5, 0xa1, 0x10, 0x8b, 0xea, 0x50, 0x2e, 0x1f, 0x92);
|
|
|
|
//
|
|
// MF_MT_SAMPLE_SIZE is only valid if MF_MT_FIXED_SIZED_SAMPLES is TRUE
|
|
//
|
|
// {dad3ab78-1990-408b-bce2-eba673dacc10} MF_MT_SAMPLE_SIZE {UINT32}
|
|
DEFINE_GUID(MF_MT_SAMPLE_SIZE,
|
|
0xdad3ab78, 0x1990, 0x408b, 0xbc, 0xe2, 0xeb, 0xa6, 0x73, 0xda, 0xcc, 0x10);
|
|
|
|
// 4d3f7b23-d02f-4e6c-9bee-e4bf2c6c695d MF_MT_WRAPPED_TYPE {Blob}
|
|
DEFINE_GUID(MF_MT_WRAPPED_TYPE,
|
|
0x4d3f7b23, 0xd02f, 0x4e6c, 0x9b, 0xee, 0xe4, 0xbf, 0x2c, 0x6c, 0x69, 0x5d);
|
|
|
|
//
|
|
// AUDIO data
|
|
//
|
|
|
|
// {37e48bf5-645e-4c5b-89de-ada9e29b696a} MF_MT_AUDIO_NUM_CHANNELS {UINT32}
|
|
DEFINE_GUID(MF_MT_AUDIO_NUM_CHANNELS,
|
|
0x37e48bf5, 0x645e, 0x4c5b, 0x89, 0xde, 0xad, 0xa9, 0xe2, 0x9b, 0x69, 0x6a);
|
|
|
|
// {5faeeae7-0290-4c31-9e8a-c534f68d9dba} MF_MT_AUDIO_SAMPLES_PER_SECOND {UINT32}
|
|
DEFINE_GUID(MF_MT_AUDIO_SAMPLES_PER_SECOND,
|
|
0x5faeeae7, 0x0290, 0x4c31, 0x9e, 0x8a, 0xc5, 0x34, 0xf6, 0x8d, 0x9d, 0xba);
|
|
|
|
// {fb3b724a-cfb5-4319-aefe-6e42b2406132} MF_MT_AUDIO_FLOAT_SAMPLES_PER_SECOND {double}
|
|
DEFINE_GUID(MF_MT_AUDIO_FLOAT_SAMPLES_PER_SECOND,
|
|
0xfb3b724a, 0xcfb5, 0x4319, 0xae, 0xfe, 0x6e, 0x42, 0xb2, 0x40, 0x61, 0x32);
|
|
|
|
// {1aab75c8-cfef-451c-ab95-ac034b8e1731} MF_MT_AUDIO_AVG_BYTES_PER_SECOND {UINT32}
|
|
DEFINE_GUID(MF_MT_AUDIO_AVG_BYTES_PER_SECOND,
|
|
0x1aab75c8, 0xcfef, 0x451c, 0xab, 0x95, 0xac, 0x03, 0x4b, 0x8e, 0x17, 0x31);
|
|
|
|
// {322de230-9eeb-43bd-ab7a-ff412251541d} MF_MT_AUDIO_BLOCK_ALIGNMENT {UINT32}
|
|
DEFINE_GUID(MF_MT_AUDIO_BLOCK_ALIGNMENT,
|
|
0x322de230, 0x9eeb, 0x43bd, 0xab, 0x7a, 0xff, 0x41, 0x22, 0x51, 0x54, 0x1d);
|
|
|
|
// {f2deb57f-40fa-4764-aa33-ed4f2d1ff669} MF_MT_AUDIO_BITS_PER_SAMPLE {UINT32}
|
|
DEFINE_GUID(MF_MT_AUDIO_BITS_PER_SAMPLE,
|
|
0xf2deb57f, 0x40fa, 0x4764, 0xaa, 0x33, 0xed, 0x4f, 0x2d, 0x1f, 0xf6, 0x69);
|
|
|
|
// {d9bf8d6a-9530-4b7c-9ddf-ff6fd58bbd06} MF_MT_AUDIO_VALID_BITS_PER_SAMPLE {UINT32}
|
|
DEFINE_GUID(MF_MT_AUDIO_VALID_BITS_PER_SAMPLE,
|
|
0xd9bf8d6a, 0x9530, 0x4b7c, 0x9d, 0xdf, 0xff, 0x6f, 0xd5, 0x8b, 0xbd, 0x06);
|
|
|
|
// {aab15aac-e13a-4995-9222-501ea15c6877} MF_MT_AUDIO_SAMPLES_PER_BLOCK {UINT32}
|
|
DEFINE_GUID(MF_MT_AUDIO_SAMPLES_PER_BLOCK,
|
|
0xaab15aac, 0xe13a, 0x4995, 0x92, 0x22, 0x50, 0x1e, 0xa1, 0x5c, 0x68, 0x77);
|
|
|
|
// {55fb5765-644a-4caf-8479-938983bb1588}` MF_MT_AUDIO_CHANNEL_MASK {UINT32}
|
|
DEFINE_GUID(MF_MT_AUDIO_CHANNEL_MASK,
|
|
0x55fb5765, 0x644a, 0x4caf, 0x84, 0x79, 0x93, 0x89, 0x83, 0xbb, 0x15, 0x88);
|
|
|
|
//
|
|
// MF_MT_AUDIO_FOLDDOWN_MATRIX stores folddown structure from multichannel to stereo
|
|
//
|
|
typedef struct _MFFOLDDOWN_MATRIX
|
|
{
|
|
UINT32 cbSize;
|
|
UINT32 cSrcChannels; // number of source channels
|
|
UINT32 cDstChannels; // number of destination channels
|
|
UINT32 dwChannelMask; // mask
|
|
LONG Coeff[64];
|
|
} MFFOLDDOWN_MATRIX;
|
|
|
|
// {9d62927c-36be-4cf2-b5c4-a3926e3e8711}` MF_MT_AUDIO_FOLDDOWN_MATRIX {BLOB, MFFOLDDOWN_MATRIX}
|
|
DEFINE_GUID(MF_MT_AUDIO_FOLDDOWN_MATRIX,
|
|
0x9d62927c, 0x36be, 0x4cf2, 0xb5, 0xc4, 0xa3, 0x92, 0x6e, 0x3e, 0x87, 0x11);
|
|
|
|
// {0x9d62927d-36be-4cf2-b5c4-a3926e3e8711}` MF_MT_AUDIO_WMADRC_PEAKREF {UINT32}
|
|
DEFINE_GUID(MF_MT_AUDIO_WMADRC_PEAKREF,
|
|
0x9d62927d, 0x36be, 0x4cf2, 0xb5, 0xc4, 0xa3, 0x92, 0x6e, 0x3e, 0x87, 0x11);
|
|
|
|
// {0x9d62927e-36be-4cf2-b5c4-a3926e3e8711}` MF_MT_AUDIO_WMADRC_PEAKTARGET {UINT32}
|
|
DEFINE_GUID(MF_MT_AUDIO_WMADRC_PEAKTARGET,
|
|
0x9d62927e, 0x36be, 0x4cf2, 0xb5, 0xc4, 0xa3, 0x92, 0x6e, 0x3e, 0x87, 0x11);
|
|
|
|
|
|
// {0x9d62927f-36be-4cf2-b5c4-a3926e3e8711}` MF_MT_AUDIO_WMADRC_AVGREF {UINT32}
|
|
DEFINE_GUID(MF_MT_AUDIO_WMADRC_AVGREF,
|
|
0x9d62927f, 0x36be, 0x4cf2, 0xb5, 0xc4, 0xa3, 0x92, 0x6e, 0x3e, 0x87, 0x11);
|
|
|
|
// {0x9d629280-36be-4cf2-b5c4-a3926e3e8711}` MF_MT_AUDIO_WMADRC_AVGTARGET {UINT32}
|
|
DEFINE_GUID(MF_MT_AUDIO_WMADRC_AVGTARGET,
|
|
0x9d629280, 0x36be, 0x4cf2, 0xb5, 0xc4, 0xa3, 0x92, 0x6e, 0x3e, 0x87, 0x11);
|
|
|
|
//
|
|
// MF_MT_AUDIO_PREFER_WAVEFORMATEX tells the converter to prefer a plain WAVEFORMATEX rather than
|
|
// a WAVEFORMATEXTENSIBLE when converting to a legacy type. It is set by the WAVEFORMATEX->IMFMediaType
|
|
// conversion routines when the original format block is a non-extensible WAVEFORMATEX.
|
|
//
|
|
// This preference can be overridden and does not guarantee that the type can be correctly expressed
|
|
// by a non-extensible type.
|
|
//
|
|
// {a901aaba-e037-458a-bdf6-545be2074042} MF_MT_AUDIO_PREFER_WAVEFORMATEX {UINT32 (BOOL)}
|
|
DEFINE_GUID(MF_MT_AUDIO_PREFER_WAVEFORMATEX,
|
|
0xa901aaba, 0xe037, 0x458a, 0xbd, 0xf6, 0x54, 0x5b, 0xe2, 0x07, 0x40, 0x42);
|
|
|
|
#if (WINVER >= _WIN32_WINNT_WIN7)
|
|
//
|
|
// AUDIO - AAC extra data
|
|
//
|
|
|
|
// {BFBABE79-7434-4d1c-94F0-72A3B9E17188} MF_MT_AAC_PAYLOAD_TYPE {UINT32}
|
|
DEFINE_GUID(MF_MT_AAC_PAYLOAD_TYPE,
|
|
0xbfbabe79, 0x7434, 0x4d1c, 0x94, 0xf0, 0x72, 0xa3, 0xb9, 0xe1, 0x71, 0x88);
|
|
|
|
// {7632F0E6-9538-4d61-ACDA-EA29C8C14456} MF_MT_AAC_AUDIO_PROFILE_LEVEL_INDICATION {UINT32}
|
|
DEFINE_GUID(MF_MT_AAC_AUDIO_PROFILE_LEVEL_INDICATION,
|
|
0x7632f0e6, 0x9538, 0x4d61, 0xac, 0xda, 0xea, 0x29, 0xc8, 0xc1, 0x44, 0x56);
|
|
|
|
#endif // (WINVER >= _WIN32_WINNT_WIN7)
|
|
|
|
//
|
|
// VIDEO core data
|
|
//
|
|
|
|
// {1652c33d-d6b2-4012-b834-72030849a37d} MF_MT_FRAME_SIZE {UINT64 (HI32(Width),LO32(Height))}
|
|
DEFINE_GUID(MF_MT_FRAME_SIZE,
|
|
0x1652c33d, 0xd6b2, 0x4012, 0xb8, 0x34, 0x72, 0x03, 0x08, 0x49, 0xa3, 0x7d);
|
|
|
|
// {c459a2e8-3d2c-4e44-b132-fee5156c7bb0} MF_MT_FRAME_RATE {UINT64 (HI32(Numerator),LO32(Denominator))}
|
|
DEFINE_GUID(MF_MT_FRAME_RATE,
|
|
0xc459a2e8, 0x3d2c, 0x4e44, 0xb1, 0x32, 0xfe, 0xe5, 0x15, 0x6c, 0x7b, 0xb0);
|
|
|
|
// {c6376a1e-8d0a-4027-be45-6d9a0ad39bb6} MF_MT_PIXEL_ASPECT_RATIO {UINT64 (HI32(Numerator),LO32(Denominator))}
|
|
DEFINE_GUID(MF_MT_PIXEL_ASPECT_RATIO,
|
|
0xc6376a1e, 0x8d0a, 0x4027, 0xbe, 0x45, 0x6d, 0x9a, 0x0a, 0xd3, 0x9b, 0xb6);
|
|
|
|
// {8772f323-355a-4cc7-bb78-6d61a048ae82} MF_MT_DRM_FLAGS {UINT32 (anyof MFVideoDRMFlags)}
|
|
DEFINE_GUID(MF_MT_DRM_FLAGS,
|
|
0x8772f323, 0x355a, 0x4cc7, 0xbb, 0x78, 0x6d, 0x61, 0xa0, 0x48, 0xae, 0x82);
|
|
|
|
typedef enum _MFVideoDRMFlags {
|
|
MFVideoDRMFlag_None = 0,
|
|
MFVideoDRMFlag_AnalogProtected = 1,
|
|
MFVideoDRMFlag_DigitallyProtected = 2,
|
|
} MFVideoDRMFlags;
|
|
|
|
|
|
// {4d0e73e5-80ea-4354-a9d0-1176ceb028ea} MF_MT_PAD_CONTROL_FLAGS {UINT32 (oneof MFVideoPadFlags)}
|
|
DEFINE_GUID(MF_MT_PAD_CONTROL_FLAGS,
|
|
0x4d0e73e5, 0x80ea, 0x4354, 0xa9, 0xd0, 0x11, 0x76, 0xce, 0xb0, 0x28, 0xea);
|
|
|
|
typedef enum _MFVideoPadFlags {
|
|
MFVideoPadFlag_PAD_TO_None = 0,
|
|
MFVideoPadFlag_PAD_TO_4x3 = 1,
|
|
MFVideoPadFlag_PAD_TO_16x9 = 2
|
|
} MFVideoPadFlags;
|
|
|
|
// {68aca3cc-22d0-44e6-85f8-28167197fa38} MF_MT_SOURCE_CONTENT_HINT {UINT32 (oneof MFVideoSrcContentHintFlags)}
|
|
DEFINE_GUID(MF_MT_SOURCE_CONTENT_HINT,
|
|
0x68aca3cc, 0x22d0, 0x44e6, 0x85, 0xf8, 0x28, 0x16, 0x71, 0x97, 0xfa, 0x38);
|
|
|
|
typedef enum _MFVideoSrcContentHintFlags {
|
|
MFVideoSrcContentHintFlag_None = 0,
|
|
MFVideoSrcContentHintFlag_16x9 = 1,
|
|
MFVideoSrcContentHintFlag_235_1 = 2
|
|
} MFVideoSrcContentHintFlags;
|
|
|
|
// {65df2370-c773-4c33-aa64-843e068efb0c} MF_MT_CHROMA_SITING {UINT32 (anyof MFVideoChromaSubsampling)}
|
|
DEFINE_GUID(MF_MT_VIDEO_CHROMA_SITING,
|
|
0x65df2370, 0xc773, 0x4c33, 0xaa, 0x64, 0x84, 0x3e, 0x06, 0x8e, 0xfb, 0x0c);
|
|
|
|
// {e2724bb8-e676-4806-b4b2-a8d6efb44ccd} MF_MT_INTERLACE_MODE {UINT32 (oneof MFVideoInterlaceMode)}
|
|
DEFINE_GUID(MF_MT_INTERLACE_MODE,
|
|
0xe2724bb8, 0xe676, 0x4806, 0xb4, 0xb2, 0xa8, 0xd6, 0xef, 0xb4, 0x4c, 0xcd);
|
|
|
|
// {5fb0fce9-be5c-4935-a811-ec838f8eed93} MF_MT_TRANSFER_FUNCTION {UINT32 (oneof MFVideoTransferFunction)}
|
|
DEFINE_GUID(MF_MT_TRANSFER_FUNCTION,
|
|
0x5fb0fce9, 0xbe5c, 0x4935, 0xa8, 0x11, 0xec, 0x83, 0x8f, 0x8e, 0xed, 0x93);
|
|
|
|
// {dbfbe4d7-0740-4ee0-8192-850ab0e21935} MF_MT_VIDEO_PRIMARIES {UINT32 (oneof MFVideoPrimaries)}
|
|
DEFINE_GUID(MF_MT_VIDEO_PRIMARIES,
|
|
0xdbfbe4d7, 0x0740, 0x4ee0, 0x81, 0x92, 0x85, 0x0a, 0xb0, 0xe2, 0x19, 0x35);
|
|
|
|
// {47537213-8cfb-4722-aa34-fbc9e24d77b8} MF_MT_CUSTOM_VIDEO_PRIMARIES {BLOB (MT_CUSTOM_VIDEO_PRIMARIES)}
|
|
DEFINE_GUID(MF_MT_CUSTOM_VIDEO_PRIMARIES,
|
|
0x47537213, 0x8cfb, 0x4722, 0xaa, 0x34, 0xfb, 0xc9, 0xe2, 0x4d, 0x77, 0xb8);
|
|
|
|
typedef struct _MT_CUSTOM_VIDEO_PRIMARIES {
|
|
float fRx;
|
|
float fRy;
|
|
float fGx;
|
|
float fGy;
|
|
float fBx;
|
|
float fBy;
|
|
float fWx;
|
|
float fWy;
|
|
} MT_CUSTOM_VIDEO_PRIMARIES;
|
|
|
|
// {3e23d450-2c75-4d25-a00e-b91670d12327} MF_MT_YUV_MATRIX {UINT32 (oneof MFVideoTransferMatrix)}
|
|
DEFINE_GUID(MF_MT_YUV_MATRIX,
|
|
0x3e23d450, 0x2c75, 0x4d25, 0xa0, 0x0e, 0xb9, 0x16, 0x70, 0xd1, 0x23, 0x27);
|
|
|
|
// {53a0529c-890b-4216-8bf9-599367ad6d20} MF_MT_VIDEO_LIGHTING {UINT32 (oneof MFVideoLighting)}
|
|
DEFINE_GUID(MF_MT_VIDEO_LIGHTING,
|
|
0x53a0529c, 0x890b, 0x4216, 0x8b, 0xf9, 0x59, 0x93, 0x67, 0xad, 0x6d, 0x20);
|
|
|
|
// {c21b8ee5-b956-4071-8daf-325edf5cab11} MF_MT_VIDEO_NOMINAL_RANGE {UINT32 (oneof MFNominalRange)}
|
|
DEFINE_GUID(MF_MT_VIDEO_NOMINAL_RANGE,
|
|
0xc21b8ee5, 0xb956, 0x4071, 0x8d, 0xaf, 0x32, 0x5e, 0xdf, 0x5c, 0xab, 0x11);
|
|
|
|
// {66758743-7e5f-400d-980a-aa8596c85696} MF_MT_GEOMETRIC_APERTURE {BLOB (MFVideoArea)}
|
|
DEFINE_GUID(MF_MT_GEOMETRIC_APERTURE,
|
|
0x66758743, 0x7e5f, 0x400d, 0x98, 0x0a, 0xaa, 0x85, 0x96, 0xc8, 0x56, 0x96);
|
|
|
|
// {d7388766-18fe-48c6-a177-ee894867c8c4} MF_MT_MINIMUM_DISPLAY_APERTURE {BLOB (MFVideoArea)}
|
|
DEFINE_GUID(MF_MT_MINIMUM_DISPLAY_APERTURE,
|
|
0xd7388766, 0x18fe, 0x48c6, 0xa1, 0x77, 0xee, 0x89, 0x48, 0x67, 0xc8, 0xc4);
|
|
|
|
// {79614dde-9187-48fb-b8c7-4d52689de649} MF_MT_PAN_SCAN_APERTURE {BLOB (MFVideoArea)}
|
|
DEFINE_GUID(MF_MT_PAN_SCAN_APERTURE,
|
|
0x79614dde, 0x9187, 0x48fb, 0xb8, 0xc7, 0x4d, 0x52, 0x68, 0x9d, 0xe6, 0x49);
|
|
|
|
// {4b7f6bc3-8b13-40b2-a993-abf630b8204e} MF_MT_PAN_SCAN_ENABLED {UINT32 (BOOL)}
|
|
DEFINE_GUID(MF_MT_PAN_SCAN_ENABLED,
|
|
0x4b7f6bc3, 0x8b13, 0x40b2, 0xa9, 0x93, 0xab, 0xf6, 0x30, 0xb8, 0x20, 0x4e);
|
|
|
|
// {20332624-fb0d-4d9e-bd0d-cbf6786c102e} MF_MT_AVG_BITRATE {UINT32}
|
|
DEFINE_GUID(MF_MT_AVG_BITRATE,
|
|
0x20332624, 0xfb0d, 0x4d9e, 0xbd, 0x0d, 0xcb, 0xf6, 0x78, 0x6c, 0x10, 0x2e);
|
|
|
|
// {799cabd6-3508-4db4-a3c7-569cd533deb1} MF_MT_AVG_BIT_ERROR_RATE {UINT32}
|
|
DEFINE_GUID(MF_MT_AVG_BIT_ERROR_RATE,
|
|
0x799cabd6, 0x3508, 0x4db4, 0xa3, 0xc7, 0x56, 0x9c, 0xd5, 0x33, 0xde, 0xb1);
|
|
|
|
// {c16eb52b-73a1-476f-8d62-839d6a020652} MF_MT_MAX_KEYFRAME_SPACING {UINT32}
|
|
DEFINE_GUID(MF_MT_MAX_KEYFRAME_SPACING,
|
|
0xc16eb52b, 0x73a1, 0x476f, 0x8d, 0x62, 0x83, 0x9d, 0x6a, 0x02, 0x06, 0x52);
|
|
|
|
//
|
|
// VIDEO - uncompressed format data
|
|
//
|
|
|
|
// {644b4e48-1e02-4516-b0eb-c01ca9d49ac6} MF_MT_DEFAULT_STRIDE {UINT32 (INT32)} // in bytes
|
|
DEFINE_GUID(MF_MT_DEFAULT_STRIDE,
|
|
0x644b4e48, 0x1e02, 0x4516, 0xb0, 0xeb, 0xc0, 0x1c, 0xa9, 0xd4, 0x9a, 0xc6);
|
|
|
|
// {6d283f42-9846-4410-afd9-654d503b1a54} MF_MT_PALETTE {BLOB (array of MFPaletteEntry - usually 256)}
|
|
DEFINE_GUID(MF_MT_PALETTE,
|
|
0x6d283f42, 0x9846, 0x4410, 0xaf, 0xd9, 0x65, 0x4d, 0x50, 0x3b, 0x1a, 0x54);
|
|
|
|
//
|
|
// the following is only used for legacy data that was stuck at the end of the format block when the type
|
|
// was converted from a VIDEOINFOHEADER or VIDEOINFOHEADER2 block in an AM_MEDIA_TYPE.
|
|
//
|
|
// {b6bc765f-4c3b-40a4-bd51-2535b66fe09d} MF_MT_USER_DATA {BLOB}
|
|
DEFINE_GUID(MF_MT_USER_DATA,
|
|
0xb6bc765f, 0x4c3b, 0x40a4, 0xbd, 0x51, 0x25, 0x35, 0xb6, 0x6f, 0xe0, 0x9d);
|
|
|
|
// {73d1072d-1870-4174-a063-29ff4ff6c11e}
|
|
DEFINE_GUID(MF_MT_AM_FORMAT_TYPE,
|
|
0x73d1072d, 0x1870, 0x4174, 0xa0, 0x63, 0x29, 0xff, 0x4f, 0xf6, 0xc1, 0x1e);
|
|
|
|
//
|
|
// VIDEO - MPEG1/2 extra data
|
|
//
|
|
|
|
// {91f67885-4333-4280-97cd-bd5a6c03a06e} MF_MT_MPEG_START_TIME_CODE {UINT32}
|
|
DEFINE_GUID(MF_MT_MPEG_START_TIME_CODE,
|
|
0x91f67885, 0x4333, 0x4280, 0x97, 0xcd, 0xbd, 0x5a, 0x6c, 0x03, 0xa0, 0x6e);
|
|
|
|
// {ad76a80b-2d5c-4e0b-b375-64e520137036} MF_MT_MPEG2_PROFILE {UINT32 (oneof AM_MPEG2Profile)}
|
|
DEFINE_GUID(MF_MT_MPEG2_PROFILE,
|
|
0xad76a80b, 0x2d5c, 0x4e0b, 0xb3, 0x75, 0x64, 0xe5, 0x20, 0x13, 0x70, 0x36);
|
|
|
|
// {96f66574-11c5-4015-8666-bff516436da7} MF_MT_MPEG2_LEVEL {UINT32 (oneof AM_MPEG2Level)}
|
|
DEFINE_GUID(MF_MT_MPEG2_LEVEL,
|
|
0x96f66574, 0x11c5, 0x4015, 0x86, 0x66, 0xbf, 0xf5, 0x16, 0x43, 0x6d, 0xa7);
|
|
|
|
// {31e3991d-f701-4b2f-b426-8ae3bda9e04b} MF_MT_MPEG2_FLAGS {UINT32 (anyof AMMPEG2_xxx flags)}
|
|
DEFINE_GUID(MF_MT_MPEG2_FLAGS,
|
|
0x31e3991d, 0xf701, 0x4b2f, 0xb4, 0x26, 0x8a, 0xe3, 0xbd, 0xa9, 0xe0, 0x4b);
|
|
|
|
// {3c036de7-3ad0-4c9e-9216-ee6d6ac21cb3} MF_MT_MPEG_SEQUENCE_HEADER {BLOB}
|
|
DEFINE_GUID(MF_MT_MPEG_SEQUENCE_HEADER,
|
|
0x3c036de7, 0x3ad0, 0x4c9e, 0x92, 0x16, 0xee, 0x6d, 0x6a, 0xc2, 0x1c, 0xb3);
|
|
|
|
//
|
|
// INTERLEAVED - DV extra data
|
|
//
|
|
// {84bd5d88-0fb8-4ac8-be4b-a8848bef98f3} MF_MT_DV_AAUX_SRC_PACK_0 {UINT32}
|
|
DEFINE_GUID(MF_MT_DV_AAUX_SRC_PACK_0,
|
|
0x84bd5d88, 0x0fb8, 0x4ac8, 0xbe, 0x4b, 0xa8, 0x84, 0x8b, 0xef, 0x98, 0xf3);
|
|
|
|
// {f731004e-1dd1-4515-aabe-f0c06aa536ac} MF_MT_DV_AAUX_CTRL_PACK_0 {UINT32}
|
|
DEFINE_GUID(MF_MT_DV_AAUX_CTRL_PACK_0,
|
|
0xf731004e, 0x1dd1, 0x4515, 0xaa, 0xbe, 0xf0, 0xc0, 0x6a, 0xa5, 0x36, 0xac);
|
|
|
|
// {720e6544-0225-4003-a651-0196563a958e} MF_MT_DV_AAUX_SRC_PACK_1 {UINT32}
|
|
DEFINE_GUID(MF_MT_DV_AAUX_SRC_PACK_1,
|
|
0x720e6544, 0x0225, 0x4003, 0xa6, 0x51, 0x01, 0x96, 0x56, 0x3a, 0x95, 0x8e);
|
|
|
|
// {cd1f470d-1f04-4fe0-bfb9-d07ae0386ad8} MF_MT_DV_AAUX_CTRL_PACK_1 {UINT32}
|
|
DEFINE_GUID(MF_MT_DV_AAUX_CTRL_PACK_1,
|
|
0xcd1f470d, 0x1f04, 0x4fe0, 0xbf, 0xb9, 0xd0, 0x7a, 0xe0, 0x38, 0x6a, 0xd8);
|
|
|
|
// {41402d9d-7b57-43c6-b129-2cb997f15009} MF_MT_DV_VAUX_SRC_PACK {UINT32}
|
|
DEFINE_GUID(MF_MT_DV_VAUX_SRC_PACK,
|
|
0x41402d9d, 0x7b57, 0x43c6, 0xb1, 0x29, 0x2c, 0xb9, 0x97, 0xf1, 0x50, 0x09);
|
|
|
|
// {2f84e1c4-0da1-4788-938e-0dfbfbb34b48} MF_MT_DV_VAUX_CTRL_PACK {UINT32}
|
|
DEFINE_GUID(MF_MT_DV_VAUX_CTRL_PACK,
|
|
0x2f84e1c4, 0x0da1, 0x4788, 0x93, 0x8e, 0x0d, 0xfb, 0xfb, 0xb3, 0x4b, 0x48);
|
|
|
|
|
|
#if (WINVER >= _WIN32_WINNT_WIN7)
|
|
//
|
|
// ARBITRARY
|
|
//
|
|
|
|
//
|
|
// MT_ARBITRARY_HEADER stores information about the format of an arbitrary media type
|
|
//
|
|
typedef struct _MT_ARBITRARY_HEADER
|
|
{
|
|
GUID majortype;
|
|
GUID subtype;
|
|
BOOL bFixedSizeSamples;
|
|
BOOL bTemporalCompression;
|
|
ULONG lSampleSize;
|
|
GUID formattype;
|
|
}
|
|
MT_ARBITRARY_HEADER;
|
|
|
|
// {9E6BD6F5-0109-4f95-84AC-9309153A19FC} MF_MT_ARBITRARY_HEADER {MT_ARBITRARY_HEADER}
|
|
DEFINE_GUID(MF_MT_ARBITRARY_HEADER,
|
|
0x9e6bd6f5, 0x109, 0x4f95, 0x84, 0xac, 0x93, 0x9, 0x15, 0x3a, 0x19, 0xfc );
|
|
|
|
// {5A75B249-0D7D-49a1-A1C3-E0D87F0CADE5} MF_MT_ARBITRARY_FORMAT {Blob}
|
|
DEFINE_GUID(MF_MT_ARBITRARY_FORMAT,
|
|
0x5a75b249, 0xd7d, 0x49a1, 0xa1, 0xc3, 0xe0, 0xd8, 0x7f, 0xc, 0xad, 0xe5);
|
|
|
|
|
|
//
|
|
// IMAGE
|
|
//
|
|
// {ED062CF4-E34E-4922-BE99-934032133D7C} MF_MT_IMAGE_LOSS_TOLERANT {UINT32 (BOOL)}
|
|
DEFINE_GUID(MF_MT_IMAGE_LOSS_TOLERANT,
|
|
0xed062cf4, 0xe34e, 0x4922, 0xbe, 0x99, 0x93, 0x40, 0x32, 0x13, 0x3d, 0x7c);
|
|
|
|
|
|
//
|
|
// MPEG-4 Media Type Attributes
|
|
//
|
|
// {261E9D83-9529-4B8F-A111-8B9C950A81A9} MF_MT_MPEG4_SAMPLE_DESCRIPTION {BLOB}
|
|
DEFINE_GUID(MF_MT_MPEG4_SAMPLE_DESCRIPTION,
|
|
0x261e9d83, 0x9529, 0x4b8f, 0xa1, 0x11, 0x8b, 0x9c, 0x95, 0x0a, 0x81, 0xa9);
|
|
|
|
// {9aa7e155-b64a-4c1d-a500-455d600b6560} MF_MT_MPEG4_CURRENT_SAMPLE_ENTRY {UINT32}
|
|
DEFINE_GUID(MF_MT_MPEG4_CURRENT_SAMPLE_ENTRY,
|
|
0x9aa7e155, 0xb64a, 0x4c1d, 0xa5, 0x00, 0x45, 0x5d, 0x60, 0x0b, 0x65, 0x60);
|
|
|
|
//
|
|
// Save original format information for AVI and WAV files
|
|
//
|
|
// {d7be3fe0-2bc7-492d-b843-61a1919b70c3} MF_MT_ORIGINAL_4CC (UINT32)
|
|
DEFINE_GUID(MF_MT_ORIGINAL_4CC,
|
|
0xd7be3fe0, 0x2bc7, 0x492d, 0xb8, 0x43, 0x61, 0xa1, 0x91, 0x9b, 0x70, 0xc3);
|
|
|
|
// {8cbbc843-9fd9-49c2-882f-a72586c408ad} MF_MT_ORIGINAL_WAVE_FORMAT_TAG (UINT32)
|
|
DEFINE_GUID(MF_MT_ORIGINAL_WAVE_FORMAT_TAG,
|
|
0x8cbbc843, 0x9fd9, 0x49c2, 0x88, 0x2f, 0xa7, 0x25, 0x86, 0xc4, 0x08, 0xad);
|
|
|
|
|
|
//
|
|
// Video Capture Media Type Attributes
|
|
//
|
|
|
|
// {D2E7558C-DC1F-403f-9A72-D28BB1EB3B5E} MF_MT_FRAME_RATE_RANGE_MIN {UINT64 (HI32(Numerator),LO32(Denominator))}
|
|
DEFINE_GUID(MF_MT_FRAME_RATE_RANGE_MIN,
|
|
0xd2e7558c, 0xdc1f, 0x403f, 0x9a, 0x72, 0xd2, 0x8b, 0xb1, 0xeb, 0x3b, 0x5e);
|
|
|
|
// {E3371D41-B4CF-4a05-BD4E-20B88BB2C4D6} MF_MT_FRAME_RATE_RANGE_MAX {UINT64 (HI32(Numerator),LO32(Denominator))}
|
|
DEFINE_GUID(MF_MT_FRAME_RATE_RANGE_MAX,
|
|
0xe3371d41, 0xb4cf, 0x4a05, 0xbd, 0x4e, 0x20, 0xb8, 0x8b, 0xb2, 0xc4, 0xd6);
|
|
|
|
|
|
#endif // (WINVER >= _WIN32_WINNT_WIN7)
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////// Media Type GUIDs //////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// Major types
|
|
//
|
|
DEFINE_GUID(MFMediaType_Default,
|
|
0x81A412E6, 0x8103, 0x4B06, 0x85, 0x7F, 0x18, 0x62, 0x78, 0x10, 0x24, 0xAC);
|
|
DEFINE_GUID(MFMediaType_Audio,
|
|
0x73647561, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71);
|
|
DEFINE_GUID(MFMediaType_Video,
|
|
0x73646976, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71);
|
|
DEFINE_GUID(MFMediaType_Protected,
|
|
0x7b4b6fe6, 0x9d04, 0x4494, 0xbe, 0x14, 0x7e, 0x0b, 0xd0, 0x76, 0xc8, 0xe4);
|
|
DEFINE_GUID(MFMediaType_SAMI,
|
|
0xe69669a0, 0x3dcd, 0x40cb, 0x9e, 0x2e, 0x37, 0x08, 0x38, 0x7c, 0x06, 0x16);
|
|
DEFINE_GUID(MFMediaType_Script,
|
|
0x72178C22, 0xE45B, 0x11D5, 0xBC, 0x2A, 0x00, 0xB0, 0xD0, 0xF3, 0xF4, 0xAB);
|
|
DEFINE_GUID(MFMediaType_Image,
|
|
0x72178C23, 0xE45B, 0x11D5, 0xBC, 0x2A, 0x00, 0xB0, 0xD0, 0xF3, 0xF4, 0xAB);
|
|
DEFINE_GUID(MFMediaType_HTML,
|
|
0x72178C24, 0xE45B, 0x11D5, 0xBC, 0x2A, 0x00, 0xB0, 0xD0, 0xF3, 0xF4, 0xAB);
|
|
DEFINE_GUID(MFMediaType_Binary,
|
|
0x72178C25, 0xE45B, 0x11D5, 0xBC, 0x2A, 0x00, 0xB0, 0xD0, 0xF3, 0xF4, 0xAB);
|
|
DEFINE_GUID(MFMediaType_FileTransfer,
|
|
0x72178C26, 0xE45B, 0x11D5, 0xBC, 0x2A, 0x00, 0xB0, 0xD0, 0xF3, 0xF4, 0xAB);
|
|
|
|
//
|
|
// Representations
|
|
//
|
|
DEFINE_GUID(AM_MEDIA_TYPE_REPRESENTATION,
|
|
0xe2e42ad2, 0x132c, 0x491e, 0xa2, 0x68, 0x3c, 0x7c, 0x2d, 0xca, 0x18, 0x1f);
|
|
DEFINE_GUID(FORMAT_MFVideoFormat,
|
|
0xaed4ab2d, 0x7326, 0x43cb, 0x94, 0x64, 0xc8, 0x79, 0xca, 0xb9, 0xc4, 0x3d);
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////// Media Type functions //////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// Forward declaration
|
|
//
|
|
struct tagVIDEOINFOHEADER;
|
|
typedef struct tagVIDEOINFOHEADER VIDEOINFOHEADER;
|
|
struct tagVIDEOINFOHEADER2;
|
|
typedef struct tagVIDEOINFOHEADER2 VIDEOINFOHEADER2;
|
|
struct tagMPEG1VIDEOINFO;
|
|
typedef struct tagMPEG1VIDEOINFO MPEG1VIDEOINFO;
|
|
struct tagMPEG2VIDEOINFO;
|
|
typedef struct tagMPEG2VIDEOINFO MPEG2VIDEOINFO;
|
|
struct _AMMediaType;
|
|
typedef struct _AMMediaType AM_MEDIA_TYPE;
|
|
|
|
STDAPI
|
|
MFValidateMediaTypeSize(
|
|
__in GUID FormatType,
|
|
__in_bcount_opt(cbSize) UINT8* pBlock,
|
|
__in UINT32 cbSize
|
|
);
|
|
|
|
STDAPI
|
|
MFCreateMediaType(
|
|
__deref_out IMFMediaType** ppMFType
|
|
);
|
|
|
|
STDAPI
|
|
MFCreateMFVideoFormatFromMFMediaType(
|
|
__in IMFMediaType* pMFType,
|
|
__out MFVIDEOFORMAT** ppMFVF, // must be deleted with CoTaskMemFree
|
|
__out_opt UINT32* pcbSize
|
|
);
|
|
|
|
typedef enum _MFWaveFormatExConvertFlags {
|
|
MFWaveFormatExConvertFlag_Normal = 0,
|
|
MFWaveFormatExConvertFlag_ForceExtensible = 1
|
|
} MFWaveFormatExConvertFlags;
|
|
|
|
#ifdef __cplusplus
|
|
|
|
//
|
|
// declarations with default parameters
|
|
//
|
|
|
|
STDAPI
|
|
MFCreateWaveFormatExFromMFMediaType(
|
|
__in IMFMediaType* pMFType,
|
|
__out WAVEFORMATEX** ppWF,
|
|
__out_opt UINT32* pcbSize,
|
|
__in UINT32 Flags = MFWaveFormatExConvertFlag_Normal
|
|
);
|
|
|
|
STDAPI
|
|
MFInitMediaTypeFromVideoInfoHeader(
|
|
__in IMFMediaType* pMFType,
|
|
__in_bcount(cbBufSize) const VIDEOINFOHEADER* pVIH,
|
|
__in UINT32 cbBufSize,
|
|
__in_opt const GUID* pSubtype = NULL
|
|
);
|
|
|
|
STDAPI
|
|
MFInitMediaTypeFromVideoInfoHeader2(
|
|
__in IMFMediaType* pMFType,
|
|
__in_bcount(cbBufSize) const VIDEOINFOHEADER2* pVIH2,
|
|
__in UINT32 cbBufSize,
|
|
__in_opt const GUID* pSubtype = NULL
|
|
);
|
|
|
|
STDAPI
|
|
MFInitMediaTypeFromMPEG1VideoInfo(
|
|
__in IMFMediaType* pMFType,
|
|
__in_bcount(cbBufSize) const MPEG1VIDEOINFO* pMP1VI,
|
|
__in UINT32 cbBufSize,
|
|
__in_opt const GUID* pSubtype = NULL
|
|
);
|
|
|
|
STDAPI
|
|
MFInitMediaTypeFromMPEG2VideoInfo(
|
|
__in IMFMediaType* pMFType,
|
|
__in_bcount(cbBufSize) const MPEG2VIDEOINFO* pMP2VI,
|
|
__in UINT32 cbBufSize,
|
|
__in_opt const GUID* pSubtype = NULL
|
|
);
|
|
|
|
STDAPI
|
|
MFCalculateBitmapImageSize(
|
|
__in_bcount(cbBufSize) const BITMAPINFOHEADER* pBMIH,
|
|
__in UINT32 cbBufSize,
|
|
__out UINT32* pcbImageSize,
|
|
__out_opt BOOL* pbKnown = NULL
|
|
);
|
|
|
|
#else
|
|
|
|
//
|
|
// same declarations without default parameters
|
|
//
|
|
|
|
STDAPI
|
|
MFCreateWaveFormatExFromMFMediaType(
|
|
__in IMFMediaType* pMFType,
|
|
__out WAVEFORMATEX** ppWF,
|
|
__out_opt UINT32* pcbSize,
|
|
__in UINT32 Flags
|
|
);
|
|
|
|
STDAPI
|
|
MFInitMediaTypeFromVideoInfoHeader(
|
|
__in IMFMediaType* pMFType,
|
|
__in_bcount(cbBufSize) const VIDEOINFOHEADER* pVIH,
|
|
__in UINT32 cbBufSize,
|
|
__in_opt const GUID* pSubtype
|
|
);
|
|
|
|
STDAPI
|
|
MFInitMediaTypeFromVideoInfoHeader2(
|
|
__in IMFMediaType* pMFType,
|
|
__in_bcount(cbBufSize) const VIDEOINFOHEADER2* pVIH2,
|
|
__in UINT32 cbBufSize,
|
|
__in_opt const GUID* pSubtype
|
|
);
|
|
|
|
STDAPI
|
|
MFInitMediaTypeFromMPEG1VideoInfo(
|
|
__in IMFMediaType* pMFType,
|
|
__in_bcount(cbBufSize) const MPEG1VIDEOINFO* pMP1VI,
|
|
__in UINT32 cbBufSize,
|
|
__in_opt const GUID* pSubtype
|
|
);
|
|
|
|
STDAPI
|
|
MFInitMediaTypeFromMPEG2VideoInfo(
|
|
__in IMFMediaType* pMFType,
|
|
__in_bcount(cbBufSize) const MPEG2VIDEOINFO* pMP2VI,
|
|
__in UINT32 cbBufSize,
|
|
__in_opt const GUID* pSubtype
|
|
);
|
|
|
|
STDAPI
|
|
MFCalculateBitmapImageSize(
|
|
__in_bcount(cbBufSize) const BITMAPINFOHEADER* pBMIH,
|
|
__in UINT32 cbBufSize,
|
|
__out UINT32* pcbImageSize,
|
|
__out_opt BOOL* pbKnown
|
|
);
|
|
|
|
#endif
|
|
|
|
STDAPI
|
|
MFCalculateImageSize(
|
|
__in REFGUID guidSubtype,
|
|
__in UINT32 unWidth,
|
|
__in UINT32 unHeight,
|
|
__out UINT32* pcbImageSize
|
|
);
|
|
|
|
STDAPI
|
|
MFFrameRateToAverageTimePerFrame(
|
|
__in UINT32 unNumerator,
|
|
__in UINT32 unDenominator,
|
|
__out UINT64* punAverageTimePerFrame
|
|
);
|
|
|
|
STDAPI
|
|
MFAverageTimePerFrameToFrameRate(
|
|
__in UINT64 unAverageTimePerFrame,
|
|
__out UINT32* punNumerator,
|
|
__out UINT32* punDenominator
|
|
);
|
|
|
|
STDAPI
|
|
MFInitMediaTypeFromMFVideoFormat(
|
|
__in IMFMediaType* pMFType,
|
|
__in_bcount(cbBufSize) const MFVIDEOFORMAT* pMFVF,
|
|
__in UINT32 cbBufSize
|
|
);
|
|
|
|
STDAPI
|
|
MFInitMediaTypeFromWaveFormatEx(
|
|
__in IMFMediaType* pMFType,
|
|
__in_bcount(cbBufSize) const WAVEFORMATEX* pWaveFormat,
|
|
__in UINT32 cbBufSize
|
|
);
|
|
|
|
STDAPI
|
|
MFInitMediaTypeFromAMMediaType(
|
|
__in IMFMediaType* pMFType,
|
|
__in const AM_MEDIA_TYPE* pAMType
|
|
);
|
|
|
|
STDAPI
|
|
MFInitAMMediaTypeFromMFMediaType(
|
|
__in IMFMediaType* pMFType,
|
|
__in GUID guidFormatBlockType,
|
|
__inout AM_MEDIA_TYPE* pAMType
|
|
);
|
|
|
|
STDAPI
|
|
MFCreateAMMediaTypeFromMFMediaType(
|
|
__in IMFMediaType* pMFType,
|
|
__in GUID guidFormatBlockType,
|
|
__inout AM_MEDIA_TYPE** ppAMType // delete with DeleteMediaType
|
|
);
|
|
|
|
|
|
//
|
|
// This function compares a full media type to a partial media type.
|
|
//
|
|
// A "partial" media type is one that is given out by a component as a possible
|
|
// media type it could accept. Many attributes may be unset, which represents
|
|
// a "don't care" status for that attribute.
|
|
//
|
|
// For example, a video effect may report that it supports YV12,
|
|
// but not want to specify a particular size. It simply creates a media type and sets
|
|
// the major type to MFMediaType_Video and the subtype to MEDIASUBTYPE_YV12.
|
|
//
|
|
// The comparison function succeeds if the partial type contains at least a major type,
|
|
// and all of the attributes in the partial type exist in the full type and are set to
|
|
// the same value.
|
|
//
|
|
STDAPI_(BOOL)
|
|
MFCompareFullToPartialMediaType(
|
|
__in IMFMediaType* pMFTypeFull,
|
|
__in IMFMediaType* pMFTypePartial
|
|
);
|
|
|
|
|
|
STDAPI
|
|
MFWrapMediaType(
|
|
__in IMFMediaType* pOrig,
|
|
__in REFGUID MajorType,
|
|
__in REFGUID SubType,
|
|
__out IMFMediaType ** ppWrap
|
|
);
|
|
|
|
STDAPI
|
|
MFUnwrapMediaType(
|
|
__in IMFMediaType* pWrap,
|
|
__out IMFMediaType ** ppOrig
|
|
);
|
|
|
|
|
|
//
|
|
// MFCreateVideoMediaType
|
|
//
|
|
|
|
#ifdef _KSMEDIA_
|
|
STDAPI MFCreateVideoMediaTypeFromVideoInfoHeader(
|
|
__in const KS_VIDEOINFOHEADER* pVideoInfoHeader,
|
|
DWORD cbVideoInfoHeader,
|
|
DWORD dwPixelAspectRatioX,
|
|
DWORD dwPixelAspectRatioY,
|
|
MFVideoInterlaceMode InterlaceMode,
|
|
QWORD VideoFlags,
|
|
__in_opt const GUID * pSubtype,
|
|
__out IMFVideoMediaType** ppIVideoMediaType
|
|
);
|
|
|
|
STDAPI MFCreateVideoMediaTypeFromVideoInfoHeader2(
|
|
__in const KS_VIDEOINFOHEADER2* pVideoInfoHeader,
|
|
DWORD cbVideoInfoHeader,
|
|
QWORD AdditionalVideoFlags,
|
|
__in_opt const GUID * pSubtype,
|
|
__out IMFVideoMediaType** ppIVideoMediaType
|
|
);
|
|
|
|
#endif
|
|
|
|
STDAPI MFCreateVideoMediaType(
|
|
__in const MFVIDEOFORMAT* pVideoFormat,
|
|
__out IMFVideoMediaType** ppIVideoMediaType
|
|
);
|
|
|
|
STDAPI MFCreateVideoMediaTypeFromSubtype(
|
|
__in const GUID * pAMSubtype,
|
|
__out IMFVideoMediaType **ppIVideoMediaType
|
|
);
|
|
|
|
STDAPI_(BOOL)
|
|
MFIsFormatYUV(
|
|
DWORD Format
|
|
);
|
|
|
|
//
|
|
// These depend on BITMAPINFOHEADER being defined
|
|
//
|
|
STDAPI MFCreateVideoMediaTypeFromBitMapInfoHeader(
|
|
__in const BITMAPINFOHEADER* pbmihBitMapInfoHeader,
|
|
DWORD dwPixelAspectRatioX,
|
|
DWORD dwPixelAspectRatioY,
|
|
MFVideoInterlaceMode InterlaceMode,
|
|
QWORD VideoFlags,
|
|
QWORD qwFramesPerSecondNumerator,
|
|
QWORD qwFramesPerSecondDenominator,
|
|
DWORD dwMaxBitRate,
|
|
__out IMFVideoMediaType** ppIVideoMediaType
|
|
);
|
|
|
|
STDAPI MFGetStrideForBitmapInfoHeader(
|
|
DWORD format,
|
|
DWORD dwWidth,
|
|
__out LONG* pStride
|
|
);
|
|
|
|
STDAPI MFGetPlaneSize(
|
|
DWORD format,
|
|
DWORD dwWidth,
|
|
DWORD dwHeight,
|
|
__out DWORD* pdwPlaneSize
|
|
);
|
|
|
|
#if (WINVER >= _WIN32_WINNT_WIN7)
|
|
//
|
|
// MFCreateVideoMediaTypeFromBitMapInfoHeaderEx
|
|
//
|
|
|
|
STDAPI MFCreateVideoMediaTypeFromBitMapInfoHeaderEx(
|
|
__in_bcount(cbBitMapInfoHeader) const BITMAPINFOHEADER* pbmihBitMapInfoHeader,
|
|
__in UINT32 cbBitMapInfoHeader,
|
|
DWORD dwPixelAspectRatioX,
|
|
DWORD dwPixelAspectRatioY,
|
|
MFVideoInterlaceMode InterlaceMode,
|
|
QWORD VideoFlags,
|
|
DWORD dwFramesPerSecondNumerator,
|
|
DWORD dwFramesPerSecondDenominator,
|
|
DWORD dwMaxBitRate,
|
|
__out IMFVideoMediaType** ppIVideoMediaType
|
|
);
|
|
#endif // (WINVER >= _WIN32_WINNT_WIN7)
|
|
|
|
//
|
|
// MFCreateMediaTypeFromRepresentation
|
|
//
|
|
|
|
STDAPI MFCreateMediaTypeFromRepresentation(
|
|
GUID guidRepresentation,
|
|
__in LPVOID pvRepresentation,
|
|
__out IMFMediaType** ppIMediaType
|
|
);
|
|
|
|
|
|
//
|
|
// MFCreateAudioMediaType
|
|
//
|
|
|
|
STDAPI
|
|
MFCreateAudioMediaType(
|
|
__in const WAVEFORMATEX* pAudioFormat,
|
|
__out IMFAudioMediaType** ppIAudioMediaType
|
|
);
|
|
|
|
|
|
DWORD
|
|
STDMETHODCALLTYPE
|
|
MFGetUncompressedVideoFormat(
|
|
__in const MFVIDEOFORMAT* pVideoFormat
|
|
);
|
|
|
|
STDAPI
|
|
MFInitVideoFormat(
|
|
__in MFVIDEOFORMAT* pVideoFormat,
|
|
__in MFStandardVideoFormat type
|
|
);
|
|
|
|
STDAPI
|
|
MFInitVideoFormat_RGB(
|
|
__in MFVIDEOFORMAT* pVideoFormat,
|
|
__in DWORD dwWidth,
|
|
__in DWORD dwHeight,
|
|
__in DWORD D3Dfmt /* 0 indicates sRGB */
|
|
);
|
|
|
|
STDAPI
|
|
MFConvertColorInfoToDXVA(
|
|
__out DWORD* pdwToDXVA,
|
|
__in const MFVIDEOFORMAT* pFromFormat
|
|
);
|
|
STDAPI
|
|
MFConvertColorInfoFromDXVA(
|
|
__inout MFVIDEOFORMAT* pToFormat,
|
|
__in DWORD dwFromDXVA
|
|
);
|
|
|
|
//
|
|
// Optimized stride copy function
|
|
//
|
|
STDAPI MFCopyImage(
|
|
__out_bcount(abs(lDestStride) * dwLines) BYTE* pDest,
|
|
LONG lDestStride,
|
|
__in_bcount(abs(lSrcStride) * dwLines) const BYTE* pSrc,
|
|
LONG lSrcStride,
|
|
__out_range(<=, min(abs(lSrcStride), abs(lDestStride))) DWORD dwWidthInBytes,
|
|
DWORD dwLines
|
|
);
|
|
|
|
STDAPI MFConvertFromFP16Array(
|
|
__out_ecount(dwCount) float* pDest,
|
|
__in_ecount(dwCount) const WORD* pSrc,
|
|
DWORD dwCount
|
|
);
|
|
|
|
STDAPI MFConvertToFP16Array(
|
|
__out_ecount(dwCount) WORD* pDest,
|
|
__in_ecount(dwCount) const float* pSrc,
|
|
DWORD dwCount
|
|
);
|
|
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////// Attributes Utility functions ////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifdef __cplusplus
|
|
|
|
//
|
|
// IMFAttributes inline UTILITY FUNCTIONS - used for IMFMediaType as well
|
|
//
|
|
inline
|
|
UINT32
|
|
HI32(UINT64 unPacked)
|
|
{
|
|
return (UINT32)(unPacked >> 32);
|
|
}
|
|
|
|
inline
|
|
UINT32
|
|
LO32(UINT64 unPacked)
|
|
{
|
|
return (UINT32)unPacked;
|
|
}
|
|
|
|
inline
|
|
UINT64
|
|
Pack2UINT32AsUINT64(UINT32 unHigh, UINT32 unLow)
|
|
{
|
|
return ((UINT64)unHigh << 32) | unLow;
|
|
}
|
|
|
|
inline
|
|
void
|
|
Unpack2UINT32AsUINT64(UINT64 unPacked, __out UINT32* punHigh, __out UINT32* punLow)
|
|
{
|
|
*punHigh = HI32(unPacked);
|
|
*punLow = LO32(unPacked);
|
|
}
|
|
|
|
inline
|
|
UINT64
|
|
PackSize(UINT32 unWidth, UINT32 unHeight)
|
|
{
|
|
return Pack2UINT32AsUINT64(unWidth, unHeight);
|
|
}
|
|
|
|
inline
|
|
void
|
|
UnpackSize(UINT64 unPacked, __out UINT32* punWidth, __out UINT32* punHeight)
|
|
{
|
|
Unpack2UINT32AsUINT64(unPacked, punWidth, punHeight);
|
|
}
|
|
|
|
inline
|
|
UINT64
|
|
PackRatio(INT32 nNumerator, UINT32 unDenominator)
|
|
{
|
|
return Pack2UINT32AsUINT64((UINT32)nNumerator, unDenominator);
|
|
}
|
|
|
|
inline
|
|
void
|
|
UnpackRatio(UINT64 unPacked, __out INT32* pnNumerator, __out UINT32* punDenominator)
|
|
{
|
|
Unpack2UINT32AsUINT64(unPacked, (UINT32*)pnNumerator, punDenominator);
|
|
}
|
|
|
|
|
|
//
|
|
// "failsafe" inline get methods - return the stored value or return a default
|
|
//
|
|
inline
|
|
UINT32
|
|
MFGetAttributeUINT32(
|
|
IMFAttributes* pAttributes,
|
|
REFGUID guidKey,
|
|
UINT32 unDefault
|
|
)
|
|
{
|
|
UINT32 unRet;
|
|
if (FAILED(pAttributes->GetUINT32(guidKey, &unRet))) {
|
|
unRet = unDefault;
|
|
}
|
|
return unRet;
|
|
}
|
|
|
|
inline
|
|
UINT64
|
|
MFGetAttributeUINT64(
|
|
IMFAttributes* pAttributes,
|
|
REFGUID guidKey,
|
|
UINT64 unDefault
|
|
)
|
|
{
|
|
UINT64 unRet;
|
|
if (FAILED(pAttributes->GetUINT64(guidKey, &unRet))) {
|
|
unRet = unDefault;
|
|
}
|
|
return unRet;
|
|
}
|
|
|
|
inline
|
|
double
|
|
MFGetAttributeDouble(
|
|
IMFAttributes* pAttributes,
|
|
REFGUID guidKey,
|
|
double fDefault
|
|
)
|
|
{
|
|
double fRet;
|
|
if (FAILED(pAttributes->GetDouble(guidKey, &fRet))) {
|
|
fRet = fDefault;
|
|
}
|
|
return fRet;
|
|
}
|
|
|
|
//
|
|
// helpers for getting/setting ratios and sizes
|
|
//
|
|
|
|
inline
|
|
HRESULT
|
|
MFGetAttribute2UINT32asUINT64(
|
|
IMFAttributes* pAttributes,
|
|
REFGUID guidKey,
|
|
__out UINT32* punHigh32,
|
|
__out UINT32* punLow32
|
|
)
|
|
{
|
|
UINT64 unPacked;
|
|
HRESULT hr = S_OK;
|
|
|
|
hr = pAttributes->GetUINT64(guidKey, &unPacked);
|
|
if (FAILED(hr)) {
|
|
return hr;
|
|
}
|
|
Unpack2UINT32AsUINT64(unPacked, punHigh32, punLow32);
|
|
|
|
return hr;
|
|
}
|
|
|
|
inline
|
|
HRESULT
|
|
MFSetAttribute2UINT32asUINT64(
|
|
IMFAttributes* pAttributes,
|
|
REFGUID guidKey,
|
|
UINT32 unHigh32,
|
|
UINT32 unLow32
|
|
)
|
|
{
|
|
return pAttributes->SetUINT64(guidKey, Pack2UINT32AsUINT64(unHigh32, unLow32));
|
|
}
|
|
|
|
inline
|
|
HRESULT
|
|
MFGetAttributeRatio(
|
|
IMFAttributes* pAttributes,
|
|
REFGUID guidKey,
|
|
__out UINT32* punNumerator,
|
|
__out UINT32* punDenominator
|
|
)
|
|
{
|
|
return MFGetAttribute2UINT32asUINT64(pAttributes, guidKey, punNumerator, punDenominator);
|
|
}
|
|
|
|
inline
|
|
HRESULT
|
|
MFGetAttributeSize(
|
|
IMFAttributes* pAttributes,
|
|
REFGUID guidKey,
|
|
__out UINT32* punWidth,
|
|
__out UINT32* punHeight
|
|
)
|
|
{
|
|
return MFGetAttribute2UINT32asUINT64(pAttributes, guidKey, punWidth, punHeight);
|
|
}
|
|
|
|
inline
|
|
HRESULT
|
|
MFSetAttributeRatio(
|
|
IMFAttributes* pAttributes,
|
|
REFGUID guidKey,
|
|
UINT32 unNumerator,
|
|
UINT32 unDenominator
|
|
)
|
|
{
|
|
return MFSetAttribute2UINT32asUINT64(pAttributes, guidKey, unNumerator, unDenominator);
|
|
}
|
|
|
|
inline
|
|
HRESULT
|
|
MFSetAttributeSize(
|
|
IMFAttributes* pAttributes,
|
|
REFGUID guidKey,
|
|
UINT32 unWidth,
|
|
UINT32 unHeight
|
|
)
|
|
{
|
|
return MFSetAttribute2UINT32asUINT64(pAttributes, guidKey, unWidth, unHeight);
|
|
}
|
|
#endif
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////// Memory Management ////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// Heap alloc/free
|
|
//
|
|
typedef enum _EAllocationType
|
|
{
|
|
eAllocationTypeDynamic,
|
|
eAllocationTypeRT,
|
|
eAllocationTypePageable,
|
|
eAllocationTypeIgnore
|
|
} EAllocationType;
|
|
|
|
EXTERN_C void* WINAPI MFHeapAlloc( size_t nSize,
|
|
ULONG dwFlags,
|
|
__in_opt char *pszFile,
|
|
int line,
|
|
EAllocationType eat);
|
|
EXTERN_C void WINAPI MFHeapFree( void * pv );
|
|
|
|
/////////////////////////////// Collection ////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// Instantiates the MF-provided IMFCollection implementation
|
|
//
|
|
STDAPI MFCreateCollection(
|
|
__out IMFCollection **ppIMFCollection );
|
|
|
|
|
|
////////////////////////// SourceResolver ////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
DEFINE_GUID(CLSID_MFSourceResolver,
|
|
0x90eab60f,
|
|
0xe43a,
|
|
0x4188,
|
|
0xbc, 0xc4, 0xe4, 0x7f, 0xdf, 0x04, 0x86, 0x8c);
|
|
|
|
#if (WINVER >= _WIN32_WINNT_WIN7)
|
|
// Return (a * b + d) / c
|
|
// Returns _I64_MAX or LLONG_MIN on failure or _I64_MAX if mplat.dll is not available
|
|
LONGLONG WINAPI MFllMulDiv(LONGLONG a, LONGLONG b, LONGLONG c, LONGLONG d);
|
|
#endif // (WINVER >= _WIN32_WINNT_WIN7)
|
|
|
|
#if defined(__cplusplus)
|
|
}
|
|
#endif
|
|
|
|
#endif //#if !defined(__MFAPI_H__)
|
|
|
|
|