#ifndef __DMOREG_H__
#define __DMOREG_H__

#include "mediaobj.h"

DEFINE_GUID(DMOCATEGORY_ACOUSTIC_ECHO_CANCEL, 0xBF963D80, 0xC559, 0x11D0, 0x8A, 0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1);
DEFINE_GUID(DMOCATEGORY_AGC,                  0xE88C9BA0, 0xC557, 0x11D0, 0x8A, 0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1);
DEFINE_GUID(DMOCATEGORY_AUDIO_CAPTURE_EFFECT, 0xF665AAba, 0x3E09, 0x4920, 0xAA, 0x5F,0x21,0x98,0x11,0x14,0x8F,0x09);
DEFINE_GUID(DMOCATEGORY_AUDIO_DECODER,        0x57F2db8b, 0xE6BB, 0x4513, 0x9D, 0x43,0xDC,0xD2,0xA6,0x59,0x31,0x25);
DEFINE_GUID(DMOCATEGORY_AUDIO_EFFECT,         0xF3602b3f, 0x0592, 0x48DF, 0xA4, 0xCD,0x67,0x47,0x21,0xE7,0xEB,0xEB);
DEFINE_GUID(DMOCATEGORY_AUDIO_ENCODER,        0x33D9A761, 0x90C8, 0x11D0, 0xBD, 0x43,0x00,0xA0,0xC9,0x11,0xCE,0x86);
DEFINE_GUID(DMOCATEGORY_AUDIO_NOISE_SUPPRESS, 0xE07f903f, 0x62FD, 0x4e60, 0x8C, 0xDD,0xDE,0xA7,0x23,0x66,0x65,0xB5);
DEFINE_GUID(DMOCATEGORY_VIDEO_DECODER,        0x4A69b442, 0x28BE, 0x4991, 0x96, 0x9C,0xB5,0x00,0xAD,0xF5,0xd8,0xA8);
DEFINE_GUID(DMOCATEGORY_VIDEO_EFFECT,         0xd990eE14, 0x776C, 0x4723, 0xBE, 0x46,0x3D,0xA2,0xF5,0x6F,0x10,0xB9);
DEFINE_GUID(DMOCATEGORY_VIDEO_ENCODER,        0x33D9A760, 0x90C8, 0x11D0, 0xBD, 0x43,0x00,0xA0,0xC9,0x11,0xCE,0x86);

typedef struct _DMO_PARTIAL_MEDIATYPE
{
  GUID type;
  GUID subtype;
} DMO_PARTIAL_MEDIATYPE, *PDMO_PARTIAL_MEDIATYPE;

enum DMO_REGISTER_FLAGS
{
  DMO_REGISTERF_IS_KEYED = 0x00000001
};

enum DMO_ENUM_FLAGS
{
  DMO_ENUMF_INCLUDE_KEYED = 0x00000001
};

STDAPI
DMOEnum(
  REFGUID guidCategory,
  DWORD dwFlags,
  DWORD cInTypes,
  const DMO_PARTIAL_MEDIATYPE *pInTypes,
  DWORD cOutTypes,
  const DMO_PARTIAL_MEDIATYPE *pOutTypes,
  IEnumDMO **ppEnum);

STDAPI
DMOGetName(
  REFCLSID clsidDMO,
  WCHAR szName[80]);

STDAPI DMOGetTypes(
   REFCLSID clsidDMO,
   unsigned long ulInputTypesRequested,
   unsigned long *pulInputTypesSupplied,
   DMO_PARTIAL_MEDIATYPE *pInputTypes,
   unsigned long ulOutputTypesRequested,
   unsigned long *pulOutputTypesSupplied,
   DMO_PARTIAL_MEDIATYPE *pOutputTypes
);

STDAPI
DMORegister(
  LPCWSTR szName,
  REFCLSID clsidDMO,
  REFGUID guidCategory,
  DWORD dwFlags,
  DWORD cInTypes,
  const DMO_PARTIAL_MEDIATYPE *pInTypes,
  DWORD cOutTypes,
  const DMO_PARTIAL_MEDIATYPE *pOutTypes);

STDAPI
DMOUnregister(
  REFCLSID clsidDMO,
  REFGUID guidCategory);

#endif

