///////////////////////////////////////////////////////////////////////////////
//
// OPM API 
//
// Copyright (c) 2005, Microsoft Corporation.  All rights reserved.
///////////////////////////////////////////////////////////////////////////////

import "unknwn.idl";
import "dxva2api.idl";

cpp_quote("#ifndef OPM_API_DEFINED")
cpp_quote("#define OPM_API_DEFINED")

cpp_quote("#pragma pack( push, 1  )")

//=============================================================================
// Description:
//
//  OPM Information GUIDs.  These GUIDs are used by IOPMVideoOutput::GetInformation()
//

cpp_quote( "DEFINE_GUID( OPM_GET_CURRENT_HDCP_SRM_VERSION,           0x99c5ceff, 0x5f1d, 0x4879, 0x81, 0xc1, 0xc5, 0x24, 0x43, 0xc9, 0x48, 0x2b );" )

//=============================================================================
// Description:
//
//  OPM Information GUIDs.  These GUIDs are used by 
//  IOPMVideoOutput::COPPCompatibleGetInformation().
//

cpp_quote( "DEFINE_GUID( OPM_GET_CONNECTED_HDCP_DEVICE_INFORMATION,  0x0db59d74, 0xa992, 0x492e, 0xa0, 0xbd, 0xc2, 0x3f, 0xda, 0x56, 0x4e, 0x00 );" )
cpp_quote( "DEFINE_GUID( OPM_GET_ACP_AND_CGMSA_SIGNALING,            0x6629a591, 0x3b79, 0x4cf3, 0x92, 0x4a, 0x11, 0xe8, 0xe7, 0x81, 0x16, 0x71 );" )

//=============================================================================
// Description:
//
//  OPM Information GUIDs.  These GUIDs are used by IOPMVideoOutput::GetInformation() 
//  and IOPMVideoOutput::COPPCompatibleGetInformation().
//

cpp_quote( "DEFINE_GUID( OPM_GET_CONNECTOR_TYPE,                     0x81d0bfd5, 0x6afe, 0x48c2, 0x99, 0xc0, 0x95, 0xa0, 0x8f, 0x97, 0xc5, 0xda );" )
cpp_quote( "DEFINE_GUID( OPM_GET_SUPPORTED_PROTECTION_TYPES,         0x38f2a801, 0x9a6c, 0x48bb, 0x91, 0x07, 0xb6, 0x69, 0x6e, 0x6f, 0x17, 0x97 );" )
cpp_quote( "DEFINE_GUID( OPM_GET_VIRTUAL_PROTECTION_LEVEL,           0xb2075857, 0x3eda, 0x4d5d, 0x88, 0xdb, 0x74, 0x8f, 0x8c, 0x1a, 0x05, 0x49 );" ) 
cpp_quote( "DEFINE_GUID( OPM_GET_ACTUAL_PROTECTION_LEVEL,            0x1957210a, 0x7766, 0x452a, 0xb9, 0x9a, 0xd2, 0x7a, 0xed, 0x54, 0xf0, 0x3a );" )
cpp_quote( "DEFINE_GUID( OPM_GET_ACTUAL_OUTPUT_FORMAT,               0xd7bf1ba3, 0xad13, 0x4f8e, 0xaf, 0x98, 0x0d, 0xcb, 0x3c, 0xa2, 0x04, 0xcc );" )
cpp_quote( "DEFINE_GUID( OPM_GET_ADAPTER_BUS_TYPE,                   0xc6f4d673, 0x6174, 0x4184, 0x8e, 0x35, 0xf6, 0xdb, 0x52, 0x0,  0xbc, 0xba );" )
cpp_quote( "DEFINE_GUID( OPM_GET_OUTPUT_ID,                          0x72cb6df3, 0x244f, 0x40ce, 0xb0, 0x9e, 0x20, 0x50, 0x6a, 0xf6, 0x30, 0x2f );" )
cpp_quote( "DEFINE_GUID( OPM_GET_DVI_CHARACTERISTICS,                0xa470b3bb, 0x5dd7, 0x4172, 0x83, 0x9c, 0x3d, 0x37, 0x76, 0xe0, 0xeb, 0xf5 );" )
// {4F374491-8F5F-4445-9DBA-95588F6B58B4}
cpp_quote( "DEFINE_GUID( OPM_GET_CODEC_INFO,                         0x4f374491, 0x8f5f, 0x4445, 0x9d, 0xba, 0x95, 0x58, 0x8f, 0x6b, 0x58, 0xb4);")


//=============================================================================
// Description:
//
//  OPM Configuration GUIDs.  These GUIDs are used by IOPMVideoOutput::Configure().
//

cpp_quote( "DEFINE_GUID( OPM_SET_PROTECTION_LEVEL,                   0x9bb9327c, 0x4eb5, 0x4727, 0x9f, 0x00, 0xb4, 0x2b, 0x09, 0x19, 0xc0, 0xda );" )
cpp_quote( "DEFINE_GUID( OPM_SET_ACP_AND_CGMSA_SIGNALING,            0x09a631a5, 0xd684, 0x4c60, 0x8e, 0x4d, 0xd3, 0xbb, 0x0f, 0x0b, 0xe3, 0xee );" )
cpp_quote( "DEFINE_GUID( OPM_SET_HDCP_SRM,                           0x8b5ef5d1, 0xc30d, 0x44ff, 0x84, 0xa5, 0xea, 0x71, 0xdc, 0xe7, 0x8f, 0x13 );" )
cpp_quote( "DEFINE_GUID( OPM_SET_PROTECTION_LEVEL_ACCORDING_TO_CSS_DVD, 0x39ce333e, 0x4cc0, 0x44ae, 0xbf, 0xcc, 0xda, 0x50, 0xb5, 0xf8, 0x2e, 0x72);" )

//=============================================================================
// Description:
//
//  Constants used by the OPM API
//

enum
{
    OPM_OMAC_SIZE                                  = 16,
    OPM_128_BIT_RANDOM_NUMBER_SIZE                 = 16,
    OPM_ENCRYPTED_INITIALIZATION_PARAMETERS_SIZE   = 256,
    OPM_CONFIGURE_SETTING_DATA_SIZE                = 4056,
    OPM_GET_INFORMATION_PARAMETERS_SIZE            = 4056,
    OPM_REQUESTED_INFORMATION_SIZE                 = 4076,
    OPM_HDCP_KEY_SELECTION_VECTOR_SIZE             = 5,
    OPM_PROTECTION_TYPE_SIZE                       = 4,
    OPM_BUS_TYPE_MASK                              = 0xFFFF,
    OPM_BUS_IMPLEMENTATION_MODIFIER_MASK           = 0x7FFF,
};

//=============================================================================
// Description:
//
//  Enumerations used by OPMGetVideoOutputFromHMONITOR() and 
//  OPMGetVideoOutputFromIDirect3DDevice9Object().
//

typedef enum _OPM_VIDEO_OUTPUT_SEMANTICS
{
    OPM_VOS_COPP_SEMANTICS      = 0,
    OPM_VOS_OPM_SEMANTICS       = 1

} OPM_VIDEO_OUTPUT_SEMANTICS;

//=============================================================================
// Description:
//
//  Enumerations used by IOPMVideoOutput::COPPCompatibleGetInformation()
//

enum
{
    OPM_HDCP_FLAG_NONE           = 0x00,
    OPM_HDCP_FLAG_REPEATER       = 0x01
}; 

//=============================================================================
// Description:
//
//  Enumerations used by IOPMVideoOutput::GetInformation() and
//  IOPMVideoOutput::COPPCompatibleGetInformation()
//

enum 
{
    OPM_STATUS_NORMAL                           = 0x00,
    OPM_STATUS_LINK_LOST                        = 0x01,
    OPM_STATUS_RENEGOTIATION_REQUIRED           = 0x02,
    OPM_STATUS_TAMPERING_DETECTED               = 0x04,
    OPM_STATUS_REVOKED_HDCP_DEVICE_ATTACHED     = 0x08
};

enum
{
    OPM_CONNECTOR_TYPE_OTHER                        = -1,
    OPM_CONNECTOR_TYPE_VGA                          = 0,
    OPM_CONNECTOR_TYPE_SVIDEO                       = 1,
    OPM_CONNECTOR_TYPE_COMPOSITE_VIDEO              = 2,
    OPM_CONNECTOR_TYPE_COMPONENT_VIDEO              = 3,
    OPM_CONNECTOR_TYPE_DVI                          = 4,
    OPM_CONNECTOR_TYPE_HDMI                         = 5,
    OPM_CONNECTOR_TYPE_LVDS                         = 6, 
    OPM_CONNECTOR_TYPE_D_JPN                        = 8,
    OPM_CONNECTOR_TYPE_SDI                          = 9,
    OPM_CONNECTOR_TYPE_DISPLAYPORT_EXTERNAL         = 10,
    OPM_CONNECTOR_TYPE_DISPLAYPORT_EMBEDDED         = 11,
    OPM_CONNECTOR_TYPE_UDI_EXTERNAL                 = 12,
    OPM_CONNECTOR_TYPE_UDI_EMBEDDED                 = 13,
    OPM_COPP_COMPATIBLE_CONNECTOR_TYPE_INTERNAL     = 0x80000000
};

enum
{
    OPM_DVI_CHARACTERISTIC_1_0                      = 1,
    OPM_DVI_CHARACTERISTIC_1_1_OR_ABOVE             = 2
};

// NUAE stands for Non-User Accessible Enclosure
enum
{
    OPM_BUS_TYPE_OTHER                                                       = 0x00000000,
    OPM_BUS_TYPE_PCI                                                         = 0x00000001,
    OPM_BUS_TYPE_PCIX                                                        = 0x00000002,
    OPM_BUS_TYPE_PCIEXPRESS                                                  = 0x00000003,
    OPM_BUS_TYPE_AGP                                                         = 0x00000004,
    OPM_BUS_IMPLEMENTATION_MODIFIER_INSIDE_OF_CHIPSET                        = 0x00010000,
    OPM_BUS_IMPLEMENTATION_MODIFIER_TRACKS_ON_MOTHER_BOARD_TO_CHIP           = 0x00020000,
    OPM_BUS_IMPLEMENTATION_MODIFIER_TRACKS_ON_MOTHER_BOARD_TO_SOCKET         = 0x00030000,
    OPM_BUS_IMPLEMENTATION_MODIFIER_DAUGHTER_BOARD_CONNECTOR                 = 0x00040000,
    OPM_BUS_IMPLEMENTATION_MODIFIER_DAUGHTER_BOARD_CONNECTOR_INSIDE_OF_NUAE  = 0x00050000, 
    OPM_BUS_IMPLEMENTATION_MODIFIER_NON_STANDARD                             = 0x80000000,    
    OPM_COPP_COMPATIBLE_BUS_TYPE_INTEGRATED                                  = 0x80000000
};

//=============================================================================
// Description:
//
//  Enumerations used by IOPMVideoOutput::COPPCompatibleGetInformation(),
//  IOPMVideoOutput::GetInformation() and IOPMVideoOutput::Configure(). 
//

typedef enum _OPM_DPCP_PROTECTION_LEVEL
{
    OPM_DPCP_OFF            = 0,
    OPM_DPCP_ON             = 1,
    OPM_DPCP_FORCE_ULONG    = 0x7fffffff

} OPM_DPCP_PROTECTION_LEVEL;

typedef enum _OPM_HDCP_PROTECTION_LEVEL
{
    OPM_HDCP_OFF            = 0,
    OPM_HDCP_ON             = 1,
    OPM_HDCP_FORCE_ULONG    = 0x7fffffff

} OPM_HDCP_PROTECTION_LEVEL;

enum 
{
    OPM_CGMSA_OFF                                           = 0x00,
    OPM_CGMSA_COPY_FREELY                                   = 0x01,
    OPM_CGMSA_COPY_NO_MORE                                  = 0x02,
    OPM_CGMSA_COPY_ONE_GENERATION                           = 0x03,
    OPM_CGMSA_COPY_NEVER                                    = 0x04,
    OPM_CGMSA_REDISTRIBUTION_CONTROL_REQUIRED               = 0x08,
};

typedef enum _OPM_ACP_PROTECTION_LEVEL
{
    OPM_ACP_OFF             = 0,
    OPM_ACP_LEVEL_ONE       = 1,
    OPM_ACP_LEVEL_TWO       = 2,
    OPM_ACP_LEVEL_THREE     = 3,
    OPM_ACP_FORCE_ULONG     = 0x7fffffff

} OPM_ACP_PROTECTION_LEVEL;

enum
{
    OPM_PROTECTION_TYPE_OTHER                       = 0x80000000,
    OPM_PROTECTION_TYPE_NONE                        = 0x00000000,
    OPM_PROTECTION_TYPE_COPP_COMPATIBLE_HDCP        = 0x00000001,
    OPM_PROTECTION_TYPE_ACP                         = 0x00000002,
    OPM_PROTECTION_TYPE_CGMSA                       = 0x00000004,
    OPM_PROTECTION_TYPE_HDCP                        = 0x00000008,
    OPM_PROTECTION_TYPE_DPCP                        = 0x00000010
};

enum
{
    OPM_PROTECTION_STANDARD_OTHER                   = 0x80000000,
    OPM_PROTECTION_STANDARD_NONE                    = 0x00000000,
    OPM_PROTECTION_STANDARD_IEC61880_525I           = 0x00000001,
    OPM_PROTECTION_STANDARD_IEC61880_2_525I         = 0x00000002,
    OPM_PROTECTION_STANDARD_IEC62375_625P           = 0x00000004,
    OPM_PROTECTION_STANDARD_EIA608B_525             = 0x00000008,
    OPM_PROTECTION_STANDARD_EN300294_625I           = 0x00000010,
    OPM_PROTECTION_STANDARD_CEA805A_TYPEA_525P      = 0x00000020,
    OPM_PROTECTION_STANDARD_CEA805A_TYPEA_750P      = 0x00000040,
    OPM_PROTECTION_STANDARD_CEA805A_TYPEA_1125I     = 0x00000080,
    OPM_PROTECTION_STANDARD_CEA805A_TYPEB_525P      = 0x00000100,
    OPM_PROTECTION_STANDARD_CEA805A_TYPEB_750P      = 0x00000200,
    OPM_PROTECTION_STANDARD_CEA805A_TYPEB_1125I     = 0x00000400,
    OPM_PROTECTION_STANDARD_ARIBTRB15_525I          = 0x00000800,
    OPM_PROTECTION_STANDARD_ARIBTRB15_525P          = 0x00001000,
    OPM_PROTECTION_STANDARD_ARIBTRB15_750P          = 0x00002000,
    OPM_PROTECTION_STANDARD_ARIBTRB15_1125I         = 0x00004000,
};

typedef enum _OPM_IMAGE_ASPECT_RATIO_EN300294
{
    OPM_ASPECT_RATIO_EN300294_FULL_FORMAT_4_BY_3                        = 0,
    OPM_ASPECT_RATIO_EN300294_BOX_14_BY_9_CENTER                        = 1,
    OPM_ASPECT_RATIO_EN300294_BOX_14_BY_9_TOP                           = 2,
    OPM_ASPECT_RATIO_EN300294_BOX_16_BY_9_CENTER                        = 3,
    OPM_ASPECT_RATIO_EN300294_BOX_16_BY_9_TOP                           = 4,
    OPM_ASPECT_RATIO_EN300294_BOX_GT_16_BY_9_CENTER                     = 5,
    OPM_ASPECT_RATIO_EN300294_FULL_FORMAT_4_BY_3_PROTECTED_CENTER       = 6,
    OPM_ASPECT_RATIO_EN300294_FULL_FORMAT_16_BY_9_ANAMORPHIC            = 7,
    OPM_ASPECT_RATIO_FORCE_ULONG                                        = 0x7FFFFFFF

} OPM_IMAGE_ASPECT_RATIO_EN300294;

//=============================================================================
// Description:
//
//  Structures used by several functions
//

typedef struct _OPM_RANDOM_NUMBER
{
    BYTE abRandomNumber[OPM_128_BIT_RANDOM_NUMBER_SIZE];

} OPM_RANDOM_NUMBER;    

typedef struct _OPM_OMAC
{
    BYTE abOMAC[OPM_OMAC_SIZE];  

} OPM_OMAC;


//=============================================================================
// Description:
//
//  Structures used by IOPMVideoOutput::FinishInitialization()
//

typedef struct _OPM_ENCRYPTED_INITIALIZATION_PARAMETERS
{
    BYTE abEncryptedInitializationParameters[OPM_ENCRYPTED_INITIALIZATION_PARAMETERS_SIZE];

} OPM_ENCRYPTED_INITIALIZATION_PARAMETERS;

//=============================================================================
// Description:
//
//  Structures used by IOPMVideoOutput::GetInformation()
//

typedef struct _OPM_GET_INFO_PARAMETERS
{
    OPM_OMAC omac;  
    OPM_RANDOM_NUMBER rnRandomNumber;
    GUID guidInformation;
    ULONG ulSequenceNumber;
    ULONG cbParametersSize;
    BYTE abParameters[OPM_GET_INFORMATION_PARAMETERS_SIZE];

} OPM_GET_INFO_PARAMETERS;

//=============================================================================
// Description:
//
//  Structures used by IOPMVideoOutput::COPPCompatibleGetInformation()
//

typedef struct _OPM_COPP_COMPATIBLE_GET_INFO_PARAMETERS
{
    OPM_RANDOM_NUMBER rnRandomNumber;
    GUID guidInformation;
    ULONG ulSequenceNumber;
    ULONG cbParametersSize;
    BYTE abParameters[OPM_GET_INFORMATION_PARAMETERS_SIZE];

} OPM_COPP_COMPATIBLE_GET_INFO_PARAMETERS;

typedef struct _OPM_HDCP_KEY_SELECTION_VECTOR
{
    BYTE abKeySelectionVector[OPM_HDCP_KEY_SELECTION_VECTOR_SIZE];
    
} OPM_HDCP_KEY_SELECTION_VECTOR;

typedef struct _OPM_CONNECTED_HDCP_DEVICE_INFORMATION
{
    OPM_RANDOM_NUMBER rnRandomNumber;
    ULONG ulStatusFlags;
    ULONG ulHDCPFlags;    
    OPM_HDCP_KEY_SELECTION_VECTOR ksvB;
    BYTE Reserved[11];
    BYTE Reserved2[16];
    BYTE Reserved3[16];

} OPM_CONNECTED_HDCP_DEVICE_INFORMATION;

//=============================================================================
// Description:
//
//  Structures used by IOPMVideoOutput::GetInformation() and 
//  IOPMVideoOutput::COPPCompatibleGetInformation()
//

typedef struct _OPM_REQUESTED_INFORMATION
{
    OPM_OMAC omac;  
    ULONG cbRequestedInformationSize;
    BYTE abRequestedInformation[OPM_REQUESTED_INFORMATION_SIZE];

} OPM_REQUESTED_INFORMATION;

typedef struct _OPM_STANDARD_INFORMATION
{
    OPM_RANDOM_NUMBER rnRandomNumber;
    ULONG ulStatusFlags;
    ULONG ulInformation;
    ULONG ulReserved;
    ULONG ulReserved2;

} OPM_STANDARD_INFORMATION;

cpp_quote("#ifndef DO_NOT_USE_DIRECTX_OR_DXVA2")

typedef struct _OPM_ACTUAL_OUTPUT_FORMAT
{
    OPM_RANDOM_NUMBER rnRandomNumber;
    ULONG ulStatusFlags;
    ULONG ulDisplayWidth;
    ULONG ulDisplayHeight;
    DXVA2_SampleFormat dsfSampleInterleaveFormat;
    D3DFORMAT d3dFormat;
    ULONG ulFrequencyNumerator;
    ULONG ulFrequencyDenominator;

} OPM_ACTUAL_OUTPUT_FORMAT;

cpp_quote("#endif // DO_NOT_USE_DIRECTX_OR_DXVA2")

typedef struct _OPM_ACP_AND_CGMSA_SIGNALING
{
    OPM_RANDOM_NUMBER rnRandomNumber;
    ULONG ulStatusFlags;
    ULONG ulAvailableTVProtectionStandards;         
    ULONG ulActiveTVProtectionStandard;             
    ULONG ulReserved;
    ULONG ulAspectRatioValidMask1;
    ULONG ulAspectRatioData1;
    ULONG ulAspectRatioValidMask2;
    ULONG ulAspectRatioData2;
    ULONG ulAspectRatioValidMask3;
    ULONG ulAspectRatioData3;
    ULONG ulReserved2[4];
    ULONG ulReserved3[4];

} OPM_ACP_AND_CGMSA_SIGNALING;

typedef struct _OPM_OUTPUT_ID_DATA
{
    OPM_RANDOM_NUMBER rnRandomNumber;
    ULONG ulStatusFlags;
    UINT64 OutputId;
} OPM_OUTPUT_ID_DATA;

//=============================================================================
// Description:
//
//  Structures used by IOPMVideoOutput::Configure()
//

typedef struct _OPM_CONFIGURE_PARAMETERS
{
    OPM_OMAC omac;  
    GUID guidSetting;          
    ULONG ulSequenceNumber;     
    ULONG cbParametersSize;         
    BYTE abParameters[OPM_CONFIGURE_SETTING_DATA_SIZE];      

} OPM_CONFIGURE_PARAMETERS;

typedef struct _OPM_SET_PROTECTION_LEVEL_PARAMETERS
{
    ULONG ulProtectionType;
    ULONG ulProtectionLevel;
    ULONG Reserved;
    ULONG Reserved2;

} OPM_SET_PROTECTION_LEVEL_PARAMETERS;

typedef struct _OPM_SET_ACP_AND_CGMSA_SIGNALING_PARAMETERS
{
    ULONG ulNewTVProtectionStandard;           
    ULONG ulAspectRatioChangeMask1;
    ULONG ulAspectRatioData1;                     
    ULONG ulAspectRatioChangeMask2;
    ULONG ulAspectRatioData2;
    ULONG ulAspectRatioChangeMask3;
    ULONG ulAspectRatioData3;
    ULONG ulReserved[4];
    ULONG ulReserved2[4];
    ULONG ulReserved3;

} OPM_SET_ACP_AND_CGMSA_SIGNALING_PARAMETERS;

typedef struct _OPM_SET_HDCP_SRM_PARAMETERS
{
    ULONG ulSRMVersion;

} OPM_SET_HDCP_SRM_PARAMETERS;

//=============================================================================
//  Description:
//
//  Input parameter for OPM_GET_CODEC_INFO GetInformation request
//  This data is stored in the abParameters array of OPM_GET_INFO_PARAMETERS
typedef struct _OPM_GET_CODEC_INFO_PARAMETERS
{
    DWORD  cbVerifier;
    BYTE   Verifier[OPM_GET_INFORMATION_PARAMETERS_SIZE - 4];  // Class ID of MFT or symbolic link for AVStream 
                          // drivers
} OPM_GET_CODEC_INFO_PARAMETERS;

//=============================================================================
//  Description:
//
//  Output information for OPM_GET_CODEC_INFO GetInformation request
//  This data is returned in the abRequestedInformation array of 
//  OPM_REQUESTED_INFORMATION structure
typedef struct _OPM_GET_CODEC_INFO_INFORMATION
{
    OPM_RANDOM_NUMBER rnRandomNumber;
    DWORD Merit;   // Merit assigned to the codec
} OPM_GET_CODEC_INFO_INFORMATION;

//=============================================================================
// Description:
//
//  IOPMVideoOutput represents a virtualized video output.  It is used to 
//  establish a protected communications channel with an output, get 
//  information from an output and configure an output.
//
cpp_quote( "#if defined( _WIN32 ) && !defined( _NO_COM )" )
cpp_quote( "DEFINE_GUID( IID_IOPMVideoOutput, 0x0A15159D, 0x41C7, 0x4456, 0x93, 0xE1, 0x28, 0x4C, 0xD6, 0x1D, 0x4E, 0x8D );" )
cpp_quote( "#endif // defined( _WIN32 ) && !defined( _NO_COM )" )

[
    object,
    uuid(0A15159D-41C7-4456-93E1-284CD61D4E8D),
    local
]
interface IOPMVideoOutput : IUnknown
{
    HRESULT StartInitialization( 
        [out] [annotation("__out")] OPM_RANDOM_NUMBER* prnRandomNumber,
        [out] [annotation("__deref_out_bcount(*pulCertificateLength)")] BYTE** ppbCertificate,
        [out] [annotation("__out")] ULONG* pulCertificateLength
        );

    HRESULT FinishInitialization(
        [in] [annotation("__in")] const OPM_ENCRYPTED_INITIALIZATION_PARAMETERS* pParameters
        );

    HRESULT GetInformation(
        [in] [annotation("__in")] const OPM_GET_INFO_PARAMETERS* pParameters,
        [out][annotation("__out")] OPM_REQUESTED_INFORMATION* pRequestedInformation
        );

    HRESULT COPPCompatibleGetInformation( 
        [in] [annotation("__in")] const OPM_COPP_COMPATIBLE_GET_INFO_PARAMETERS* pParameters,
        [out][annotation("__out")] OPM_REQUESTED_INFORMATION* pRequestedInformation
        );

    HRESULT Configure(
        [in] [annotation("__in")] const OPM_CONFIGURE_PARAMETERS* pParameters,
        [in] [annotation("__in")] ULONG ulAdditionalParametersSize,
        [in] [annotation("__in_bcount_opt(ulAdditionalParametersSize)")] const BYTE* pbAdditionalParameters
        );
};

//=============================================================================
// Description:
//
//  Ks Property set to use with AVStram drivers
// KSPROPSETID_OPMVideoOutput {06F414BB-F43A-4fe2-A566-774B4C81F0DB}
cpp_quote( "#ifdef DEFINE_GUIDSTRUCT                                                                          " )
cpp_quote( "#define STATIC_KSPROPSETID_OPMVideoOutput                                                       \\" )
cpp_quote( "0x6f414bb, 0xf43a, 0x4fe2, 0xa5, 0x66, 0x77, 0x4b, 0x4c, 0x81, 0xf0, 0xdb                         " )
cpp_quote( "DEFINE_GUIDSTRUCT(\"06F414BB-F43A-4fe2-A566-774B4C81F0DB\", KSPROPSETID_OPMVideoOutput);          " )
cpp_quote( "#define KSPROPSETID_OPMVideoOutput DEFINE_GUIDNAMED(KSPROPSETID_OPMVideoOutput)                   " )
cpp_quote( "                                                                                                  " )
cpp_quote( "typedef enum {                                                                                    " )
cpp_quote( "    //  Output is OPM_RANDOM_NUMBER followed by certifiate                                        " )
cpp_quote( "    KSMETHOD_OPMVIDEOOUTPUT_STARTINITIALIZATION = 0,                                              " )
cpp_quote( "                                                                                                  " )
cpp_quote( "    //  Input OPM_ENCRYPTED_INITIALIZATION_PARAMETERS                                             " )
cpp_quote( "    //  Output OPM_STANDARD_INFORMATION                                                           " )
cpp_quote( "    KSMETHOD_OPMVIDEOOUTPUT_FINISHINITIALIZATION = 1,                                             " )
cpp_quote( "                                                                                                  " )
cpp_quote( "    //  Input is OPM_GET_INFO_PARAMETERS, output is OPM_REQUESTED_INFORMATION                     " )
cpp_quote( "    //  Use KsMethod - both input and output in the buffer (not after the KSMETHOD structure)     " )
cpp_quote( "    KSMETHOD_OPMVIDEOOUTPUT_GETINFORMATION = 2                                                    " )
cpp_quote( "} KSMETHOD_OPMVIDEOOUTPUT;                                                                        " )
cpp_quote( "#endif                                                                                            " )

//=============================================================================
// Description:
//
// These macros parse a ULONG which contains an OPM bus type constant and 
// possibly an OPM implementation constant.
//

cpp_quote( "#define GetBusType( ulBusTypeAndImplementation )                        ((ulBusTypeAndImplementation) & OPM_BUS_TYPE_MASK)" )
cpp_quote( "#define GetBusImplementation( ulBusTypeAndImplementation )              (((ulBusTypeAndImplementation) & OPM_BUS_IMPLEMENTATION_MODIFIER_MASK) >> 16) " )
cpp_quote( "#define IsNonStandardBusImplementation( ulBusTypeAndImplementation )    ((ulBusTypeAndImplementation) & OPM_BUS_IMPLEMENTATION_MODIFIER_NON_STANDARD) " )


//=============================================================================
// Description:
//
//  These functions create IOPMVideoOutput objects.
//

cpp_quote( "STDAPI OPMGetVideoOutputsFromHMONITOR(                                                      " )
cpp_quote( "    __in HMONITOR hMonitor,                                                                 " )
cpp_quote( "    __in OPM_VIDEO_OUTPUT_SEMANTICS vos,                                                    " )
cpp_quote( "    __out ULONG* pulNumVideoOutputs,                                                        " )
cpp_quote( "    __deref_out_ecount(*pulNumVideoOutputs) IOPMVideoOutput*** pppOPMVideoOutputArray       " )
cpp_quote( "    );                                                                                      " )

cpp_quote("#ifndef DO_NOT_USE_DIRECTX_OR_DXVA2")

cpp_quote( "STDAPI OPMGetVideoOutputsFromIDirect3DDevice9Object(                                        " )
cpp_quote( "    __in IDirect3DDevice9* pDirect3DDevice9,                                                " )
cpp_quote( "    __in OPM_VIDEO_OUTPUT_SEMANTICS vos,                                                    " )
cpp_quote( "    __out ULONG* pulNumVideoOutputs,                                                        " )
cpp_quote( "    __deref_out_ecount(*pulNumVideoOutputs) IOPMVideoOutput*** pppOPMVideoOutputArray       " )
cpp_quote( "    );                                                                                      " )

cpp_quote("#endif // DO_NOT_USE_DIRECTX_OR_DXVA2")

cpp_quote("#pragma pack( pop )")

cpp_quote("#endif // OPM_API_DEFINED ")

