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. |
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour