COPP 操作の実行例
このセクションは、Windows Server 2003 SP1 以降および Windows XP SP2 以降にのみ適用されます。
次のコード例を使用して、認定出力保護プロトコル (COPP) に対する操作を実行します。 このコード例では、 DdMoCompRender コールバック関数を実装しています。 DD_MOTIONCOMPCALLBACKS 構造体の RenderMoComp メンバーは、このコールバック関数を指します。 このコード例では、COPP 操作に DdMoCompRenderを使用する方法のみを示しています。 ProcAmp 制御およびインターレース解除操作を実行するDdMoCompRender の実装については、ProcAmp 制御とインターレース解除操作の実行およびサブストリーム合成操作によるインターレース解除の実行を参照してください。
DWORD APIENTRY
MOCOMPCB_RENDER(
PDD_RENDERMOCOMPDATA lpData
)
{
// The driver saves the device class object in lpDriverReserved1
// during the DdMoCompCreate callback. For more information,
// see Creating Instances of DirectX VA Device Objects.
DXVA_DeviceBaseClass* pDXVABase =
(DXVA_DeviceBaseClass*)lpData->lpMoComp->lpDriverReserved1;
if (pDXVABase == NULL) {
lpData->ddRVal = E_POINTER;
return DDHAL_DRIVER_HANDLED;
}
// Process according to the device type in the class object.
// For more information, see Defining DirectX VA Device Classes.
switch (pDXVABase->m_DeviceType) {
// This is the COPP device.
case DXVA_DeviceCOPP:
{
DXVA_COPPDeviceClass* pDXVACopp =
(DXVA_COPPDeviceClass*)pDXVABase;
ULONG BytesReturned;
HANDLE handle = (HANDLE)GetDriverHandleFromPDEV(lpData->lpDD->lpGbl->dhpdev)
COPP_IO_InputBuffer InputBuffer;
InputBuffer.ppThis = &pDXVACopp->m_pThis;
InputBuffer.phr = &lpData->ddRVal;
switch (lpData->dwFunction) {
case DXVA_COPPGetCertificateLengthFnCode:
if (lpData->dwOutputDataSize < sizeof(ULONG)) {
lpData->ddRVal = E_INVALIDARG;
}
else {
InputBuffer.InputBuffer = NULL;
EngDeviceIoControl(handle,
IOCTL_COPP_GetCertificateLength,
&InputBuffer,
sizeof(InputBuffer),
lpData->lpOutputData,
lpData->dwOutputDataSize,
&BytesReturned);
}
break;
case DXVA_COPPKeyExchangeFnCode:
if (lpData->dwOutputDataSize < sizeof(DXVA_COPPKeyExchangeOutput)) {
lpData->ddRVal = E_INVALIDARG;
}
else {
InputBuffer.InputBuffer = NULL;
DD_SURFACE_LOCAL* lpCompSurf =
lpData->lpBufferInfo[0].lpCompSurface;
InputBuffer.InputBuffer = (PVOID)lpCompSurf->lpGbl->fpVidMem;
EngDeviceIoControl(handle
IOCTL_COPP_KeyExchange,
&InputBuffer,
sizeof(InputBuffer),
lpData->lpOutputData,
lpData->dwOutputDataSize,
&BytesReturned);
}
break;
case DXVA_COPPSequenceStartFnCode:
if (lpData->dwInputDataSize < sizeof(DXVA_COPPSignature)) {
lpData->ddRVal = E_INVALIDARG;
}
else {
InputBuffer.InputBuffer = lpData->lpInputData;
EngDeviceIoControl(handle,
IOCTL_COPP_StartSequence,
&InputBuffer,
sizeof(InputBuffer),
NULL,
0,
&BytesReturned);
}
break;
case DXVA_COPPCommandFnCode:
if (lpData->dwInputDataSize < sizeof(DXVA_COPPCommand)) {
lpData->ddRVal = E_INVALIDARG;
}
else {
InputBuffer.InputBuffer = lpData->lpInputData;
EngDeviceIoControl(handle,
IOCTL_COPP_Command,
&InputBuffer,
sizeof(InputBuffer),
NULL,
0,
&BytesReturned);
}
break;
case DXVA_COPPQueryStatusFnCode:
if (lpData->dwInputDataSize < sizeof(DXVA_COPPStatusInput) ||
lpData->dwOutputDataSize < sizeof(DXVA_COPPStatusOutput)) {
lpData->ddRVal = E_INVALIDARG;
}
else {
InputBuffer.InputBuffer = lpData->lpInputData;
EngDeviceIoControl(handle,
IOCTL_COPP_Status,
&InputBuffer,
sizeof(InputBuffer),
lpData->lpOutputData,
lpData->dwOutputDataSize,
&BytesReturned);
}
break;
default:
lpData->ddRVal = E_INVALIDARG;
break;
}
break;
}
}
return DDHAL_DRIVER_HANDLED;
}
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示