Compartir a través de


Función COPPQueryStatus

La función COPPQueryStatus de ejemplo recupera el estado en una sesión de vídeo protegida asociada a un dispositivo COPP DirectX VA.

Sintaxis

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

Parámetros

pThis [in]

  • Puntero al objeto de dispositivo COPP DirectX VA.

pInput [in]

  • Proporciona un puntero a una estructura de DXVA_COPPStatusInput que contiene una solicitud para recuperar información de estado específica.

pOutput [out]

  • Puntero a una estructura de DXVA_COPPStatusOutput que recibe información de estado sobre el conector físico que se está usando.

Valor devuelto

Devuelve cero (S_OK o DD_OK) si se ejecuta correctamente; de lo contrario, devuelve un código de error.

Comentarios

La sesión de vídeo debe establecerse en modo protegido (es decir, debe estar activo) antes de que el dispositivo COPP DirectX VA asociado reciba una llamada a su función COPPQueryStatus. Es decir, se debe llamar a la función COPPSequenceStart antes de COPPQueryStatus. Si se llama a COPPQueryStatus antes de COPPSequenceStart, COPPQueryStatus debe devolver E_UNEXPECTED.

La función COPPQueryStatus recibe una estructura de DXVA_COPPStatusInput rellenada en pInput que contiene una solicitud de estado. La función COPPQueryStatus procesa la solicitud y devuelve el estado adecuado en una estructura de DXVA_COPPStatusOutput en pOutput.

Asignación de RenderMoComp a COPPQueryStatus

La función COPPQueryStatus de ejemplo se asigna directamente a una llamada al miembro RenderMoComp de la estructura DD_MOTIONCOMPCALLBACKS. El miembro RenderMoComp apunta a la función de devolución de llamada DdMoCompRender proporcionada por el controlador de pantalla que hace referencia a la estructura DD_RENDERMOCOMPDATA.

Se llama a la función de devolución de llamada RenderMoComp sin que se llame primero a la función BeginMoCompFrame o EndMoCompFrame proporcionada por el controlador de pantalla.

La estructura DD_RENDERMOCOMPDATA se rellena de la siguiente manera.

Miembro Valor
dwNumBuffers Cero.
lpBufferInfo NULL.
dwFunction DXVA_COPPQueryStatusFnCode constante (definida en dxva.h).
lpInputData Puntero a una estructura de DXVA_COPPStatusInput.
lpOutputData Puntero a una estructura de DXVA_COPPStatusOutput.

Código de ejemplo

El código siguiente proporciona un ejemplo de cómo puede implementar la función 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;
}

Requisitos

Plataforma de destino Versión
Escritorio Esta función solo se aplica a Windows Server 2003 con SP1 y versiones posteriores, y Windows XP con SP2 y versiones posteriores.