Функция COPPQueryStatus

Пример функции COPPQueryStatus извлекает состояние защищенного видеосеанса, связанного с устройством COPP DirectX VA.

Синтаксис

HRESULT COPPQueryStatus(
  _In_  COPP_DeviceData       pThis,
  _In_  DXVA_COPPStatusInput  *pInput,
  _Out_ DXVA_COPPStatusOutput *pOutput
);

Параметры

pЭто [in]

  • Указатель на объект устройства COPP DirectX VA.

pInput [in]

  • Предоставляет указатель на структуру DXVA_COPPStatusInput, содержащую запрос на получение определенных сведений о состоянии.

pOutput [out]

  • Указатель на структуру DXVA_COPPStatusOutput, которая получает сведения о состоянии используемого физического соединителя.

Возвращаемое значение

Возвращает ноль (S_OK или DD_OK) в случае успешного выполнения; в противном случае возвращает код ошибки.

Комментарии

Видеосеанс должен быть настроен в защищенный режим (то есть он должен быть активным), прежде чем связанное устройство COPP DirectX VA получит вызов своей функции COPPQueryStatus. То есть функция COPPSequenceStart должна вызываться перед COPPQueryStatus. Если COPPQueryStatus вызывается перед COPPSequenceStart, функция COPPQueryStatus должна возвращать E_UNEXPECTED.

Функция COPPQueryStatus получает заполненную структуру DXVA_COPPStatusInput pInput, содержащую запрос состояния. Функция COPPQueryStatus обрабатывает запрос и возвращает соответствующее состояние в структуре DXVA_COPPStatusOutput pOutput.

Сопоставление RenderMoComp с COPPQueryStatus

Пример функции COPPQueryStatus напрямую сопоставляется с вызовом элемента RenderMoComp структуры DD_MOTIONCOMPCALLBACKS. Элемент RenderMoComp указывает на функцию обратного вызова DdMoCompRender, предоставляемую драйвером дисплея, которая ссылается на структуру DD_RENDERMOCOMPDATA.

Функция обратного вызова RenderMoComp вызывается без первого вызова функции BeginMoCompFrame или EndMoCompFrame, предоставленной драйвером дисплея.

Структура DD_RENDERMOCOMPDATA заполняется следующим образом.

Член Значение
DwNumBuffers Ноль.
lpBufferInfo NULL.
DwFunction DXVA_COPPQueryStatusFnCode константы (определяется в dxva.h).
lpInputData Указатель на структуру DXVA_COPPStatusInput.
lpOutputData Указатель на структуру DXVA_COPPStatusOutput.

Пример кода

В следующем коде приведен пример реализации функции COPPQueryStatus:

HRESULT
COPPQueryStatus(
    COPP_DeviceData* pThis,
    DXVA_COPPStatusInput* pStatusInput,
    DXVA_COPPStatusOutput* pStatusOutput
    )
{
    if (pThis->m_COPPDevState != COPP_SESSION_ACTIVE) {
        return E_UNEXPECTED;
    }
    if (pStatusInput->dwSequence != pThis->m_StatusSeqNumber) {
        return E_INVALIDARG;
    }
    //
    // reset the output buffer
    //
    memset(pStatusOutput, 0, sizeof(DXVA_COPPStatusOutput));
    if (IsEqualGUID(&DXVA_COPPQueryConnectorType, &pStatusInput->guidStatusRequestID)) {
        // Verify no input data for this status request.
        if (pStatusInput->cbSizeData != 0) {
            return E_INVALIDARG;
        }
        DXVA_COPPStatusData Tmp;
        Tmp.rApp = pStatusInput->rApp;
        Tmp.dwData = g_ConnectorInfo[pThis->m_DevID].ConnType;
        Tmp.dwFlags = COPP_StatusNormal;
        pStatusOutput->cbSizeData = sizeof(Tmp);
        memcpy(pStatusOutput->COPPStatus, &Tmp,sizeof(Tmp));
    }
    else if (IsEqualGUID(&DXVA_COPPQueryProtectionType, &pStatusInput->guidStatusRequestID)) {
        // verify that there is no input data for this status request
        if (pStatusInput->cbSizeData != 0) {
            return E_INVALIDARG;
        }
        DXVA_COPPStatusData Tmp;
        Tmp.rApp = pStatusInput->rApp;
        Tmp.dwData = g_ConnectorInfo[pThis->m_DevID].ProtectionTypeMask;
        Tmp.dwFlags = COPP_StatusNormal;
        pStatusOutput->cbSizeData = sizeof(Tmp);
        memcpy(pStatusOutput->COPPStatus, &Tmp,sizeof(Tmp));
    }
    else if (IsEqualGUID(&DXVA_COPPQueryLocalProtectionLevel, &pStatusInput->guidStatusRequestID) ||
             IsEqualGUID(&DXVA_COPPQueryGlobalProtectionLevel, &pStatusInput->guidStatusRequestID)) {
        DWORD ProtType;
        DWORD ProtIndex;
        DWORD Level;
        // verify that there is a single DWORD input data for this status request
        if (pStatusInput->cbSizeData != sizeof (DWORD)) {
            return E_INVALIDARG;
        }
        memcpy(&ProtType, (LPVOID)&pStatusInput->StatusData[0], sizeof(DWORD));
        // verify that no invalid protection type bits are set
        if (ProtType & ~COPP_ProtectionType_Mask) {
            return E_INVALIDARG;
        }
        // verify that only the protection level of a single protection type is requested
        ProtIndex = MapProtectionTypeToProtectionIndex(ProtType);
        if (ProtIndex == COPP_ProtectionTypeIndex_Unkonwn) {
            return E_INVALIDARG;
        }
        // verify that the video session supports the protection type
        if (!(g_ConnectorInfo[pThis->m_DevID].ProtectionTypeMask & ProtType)) {
            return E_INVALIDARG;
        }
        if (IsEqualGUID(&DXVA_COPPQueryLocalProtectionLevel,
                        &pStatusInput->guidStatusRequestID)) {
            Level = pThis->m_LocalLevel[ProtIndex];
        }
        else {
            Level = g_nLevels[ProtIndex] - 1;
            for ( ; Level != 0; Level--) {
                if (g_COPPLevels[pThis->m_DevID].Levels[ProtIndex][Level]) {
                    break;
                }
            }
        }
        DXVA_COPPStatusData Tmp;
        Tmp.rApp = pStatusInput->rApp;
        Tmp.dwData = Level;
        Tmp.dwFlags = COPP_StatusNormal;
        pStatusOutput->cbSizeData = sizeof(Tmp);
        memcpy(pStatusOutput->COPPStatus, &Tmp, sizeof(Tmp));
    }
    pThis->m_StatusSeqNumber++;
    pStatusOutput->macKDI = COPP_CalculateMAC(&pThis->m_AesHelper,
                                    (BYTE*)&pStatusOutput->cbSizeData,
                         sizeof(DXVA_COPPStatusOutput) - sizeof(GUID),
                                     &pThis->m_KDI);
    return NO_ERROR;
}

Requirements

Целевая платформа Версия
Персональный компьютер Эта функция применяется только к Windows Server 2003 с пакетом обновления 1 (SP1) и более поздним версиям, а также Windows XP с пакетом обновления 2 (SP2) и более поздним версиям.