COPPSequenceStart 函数

示例 COPPSequenceStart 函数将当前视频会话设置为保护模式。

语法

HRESULT COPPSequenceStart(
  _In_ COPP_DeviceData    pThis,
  _In_ DXVA_COPPSignature *pSeqStartInfo
);

参数

pThis [in]

  • 指向 COPP DirectX VA 设备对象的指针。

pSeqStartInfo [in]

  • 提供指向DXVA_COPPSignature 结构的指针,该结构包含有关开始序列的信息。

返回值

如果成功,则返回零 (S_OK 或DD_OK) ;否则,将返回错误代码。

注解

COPP DirectX VA 设备应在收到对其 COPPSequenceStart 函数的调用之前向 VMR 提供图形硬件证书。 也就是说,应在 COPPSequenceStart 之前调用 COPPKeyExchange 函数。 如果在 COPPKeyExchange 之前调用 COPPSequenceStart,则 COPPSequenceStart 应返回E_UNEXPECTED。

提供图形硬件证书后,COPP DirectX VA 设备应仅接收对其 COPPSequenceStart 函数的一次调用。 如果 COPP DirectX VA 设备收到另一个 COPPSequenceStart 调用,它应返回E_UNEXPECTED。

COPPSequenceStart 函数接收一个填充DXVA_COPPSignature结构,该结构包含一个启动序列,其中包含以下串联在一起的项:

  • 由驱动程序生成并通过调用驱动程序的 COPPKeyExchange 函数返回的 128 位随机数
  • 128 位随机数据完整性会话密钥
  • 32 位随机启动状态序列号
  • 32 位随机启动命令序列号

使用图形硬件的公钥加密启动序列。

将 RenderMoComp 映射到 COPPSequenceStart

示例 COPPSequenceStart 函数直接映射到对 DD_MOTIONCOMPCALLBACKS 结构的 RenderMoComp 成员的调用。 RenderMoComp 成员指向引用 DD_RENDERMOCOMPDATA 结构的显示驱动程序提供的 DdMoCompRender 回调函数。

调用 RenderMoComp 回调函数时不首先调用显示驱动程序提供的 BeginMoCompFrame 或 EndMoCompFrame 函数。

填充DD_RENDERMOCOMPDATA结构如下所示。

成员 Value
dwNumBuffers Zero。
lpBufferInfo NULL。
dwFunction 在 dxva.h) 中定义的DXVA_COPPSequenceStartFnCode常量 (。
lpInputData 指向DXVA_COPPSignature结构的指针。
lpOutputData NULL。

示例代码

以下代码提供了如何实现 COPPSequenceStart 函数的示例:

HRESULT
COPP_RSADecryptData(
    const BYTE* lpPrivateKey,
    DXVA_COPPSignature* pOutput,
    DXVA_COPPSignature* pInput
    )
{
    DWORD dwLen = sizeof(DXVA_COPPSignature);
    return RSADecPrivate(lpPrivateKey, (const BYTE *)pInput,
                         sizeof(DXVA_COPPSignature), (BYTE*) pOutput, &dwLen);
}

HRESULT
COPPSequenceStart(
    COPP_DeviceData* pThis,
    DXVA_COPPSignature* pSeqStartInfo
    )
{
    if (pThis->m_COPPDevState == COPP_KEY_EXCHANGED) {
        BYTE* pByte;
        DXVA_COPPSignature Decrypted;
        GUID rGraphicsDriver;
        HRESULT hr;
        COPP_RSADecryptData(PrivateKey, &Decrypted, pSeqStartInfo);
        pByte = (BYTE*)&Decrypted;
        memcpy(&rGraphicsDriver, pByte, sizeof(DWORD));
        pByte += sizeof(DWORD);
        memcpy(&pThis->m_KDI, pByte, sizeof(GUID));
        pByte += sizeof(GUID);
        memcpy(&pThis->m_StatusSeqNumber, pByte, sizeof(DWORD));
        pByte += sizeof(DWORD);
        memcpy(&pThis->m_CmdSeqNumber, pByte, sizeof(DWORD));
        pByte += sizeof(DWORD);
        hr = SetKey(&pThis->m_AesHelper, (BYTE*)&pThis->m_KDI, sizeof(GUID));
        if (hr != S_OK) {
            return hr;
        }
        if (!IsEqualGUID(&rGraphicsDriver, &pThis->m_rGraphicsDriver)) {
            return E_UNEXPECTED;
        }
        pThis->m_COPPDevState = COPP_SESSION_ACTIVE;
    }
    else {
        return E_UNEXPECTED;
    }
    return NO_ERROR;
}

要求

目标平台 版本
桌面 此函数仅适用于带有 SP1 及更高版本的 Windows Server 2003 以及 SP2 及更高版本的 Windows XP。