Fonction COPPQueryStatus

L’exemple de fonction COPPQueryStatus récupère status sur une session vidéo protégée associée à un appareil COPP DirectX VA.

Syntaxe

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

Paramètres

pThis [in]

  • Pointeur vers l’objet d’appareil COPP DirectX VA.

pInput [in]

  • Fournit un pointeur vers une structure de DXVA_COPPStatusInput qui contient une demande de récupération d’informations status spécifiques.

pOutput [out]

  • Pointeur vers une structure DXVA_COPPStatusOutput qui reçoit status informations sur le connecteur physique utilisé.

Valeur retournée

Retourne zéro (S_OK ou DD_OK) en cas de réussite ; sinon, retourne un code d’erreur.

Remarques

La session vidéo doit être définie sur le mode protégé (autrement dit, elle doit être active) avant que l’appareil COPP DirectX VA associé reçoive un appel à sa fonction COPPQueryStatus. Autrement dit, la fonction COPPSequenceStart doit être appelée avant COPPQueryStatus. Si COPPQueryStatus est appelé avant COPPSequenceStart, COPPQueryStatus doit retourner E_UNEXPECTED.

La fonction COPPQueryStatus reçoit une structure DXVA_COPPStatusInput remplie au niveau de pInput qui contient une requête status. La fonction COPPQueryStatus traite la requête et retourne les status appropriées dans une structure de DXVA_COPPStatusOutput sur pOutput.

Mappage de RenderMoComp à COPPQueryStatus

L’exemple de fonction COPPQueryStatus correspond directement à un appel au membre RenderMoComp de la structure DD_MOTIONCOMPCALLBACKS. Le membre RenderMoComp pointe vers la fonction de rappel DdMoCompRender fournie par le pilote d’affichage qui fait référence à la structure DD_RENDERMOCOMPDATA.

La fonction de rappel RenderMoComp est appelée sans que la fonction BeginMoCompFrame ou EndMoCompFrame fournie par le pilote d’affichage soit appelée en premier.

La structure DD_RENDERMOCOMPDATA est remplie comme suit.

Membre Valeur
dwNumBuffers Zéro.
lpBufferInfo NULL.
dwFunction DXVA_COPPQueryStatusFnCode constante (définie dans dxva.h).
lpInputData Pointeur vers une structure DXVA_COPPStatusInput.
lpOutputData Pointeur vers une structure DXVA_COPPStatusOutput.

Exemple de code

Le code suivant fournit un exemple de la façon dont vous pouvez implémenter votre fonction 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;
}

Configuration requise

Plateforme cible Version
Desktop (Expérience utilisateur) Cette fonction s’applique uniquement à Windows Server 2003 avec SP1 et versions ultérieures, et à Windows XP avec SP2 et versions ultérieures.