Funzione COPPCommand
La funzione COPPCommand di esempio esegue un'operazione in un dispositivo COPP DirectX VA.
Sintassi
HRESULT COPPCommand(
_In_ COPP_DeviceData pThis,
_In_ DXVA_COPPCommand *pCommand
);
Parametri
pThis [in]
- Puntatore all'oggetto dispositivo COPP DirectX VA.
pCommand [in]
- Fornisce un puntatore a una struttura DXVA_COPPCommand che contiene informazioni sull'operazione da eseguire nel dispositivo COPP.
Valore restituito
Restituisce zero (S_OK o DD_OK) se riuscito; in caso contrario, restituisce un codice di errore.
Commenti
La sessione video deve essere impostata sulla modalità protetta, ovvero deve essere attiva, prima che il dispositivo COPP DirectX VA associato riceva una chiamata alla relativa funzione COPPCommand. Vale a dire, la funzione COPPSequenceStart deve essere chiamata prima di COPPCommand. Se COPPCommand viene chiamato prima di COPPSequenceStart, COPPCommand deve restituire E_UNEXPECTED.
La funzione COPPCommand riceve una struttura DXVA_COPPCommand popolata che contiene un comando COPP. Sono supportati i comandi COPP seguenti:
- DXVA_COPPSetProtectionLevel
Istruzione della sessione video per impostare il livello di protezione sul connettore fisico associato al dispositivo COPP. Un driver miniport video deve essere in grado di supportare più sessioni video tutti i contenuti riprodotti tramite lo stesso connettore fisico. - DXVA_COPPSetSignaling
Istruzioni su come proteggere il segnale che passa attraverso il connettore fisico associato al dispositivo DirectX VA COPP.
La funzione COPPCommand deve verificare che i parametri passati siano validi per il connettore fisico specificato in uso e devono restituire E_INVALIDARG se uno o più parametri non sono validi.
Se il comando di protezione passato a COPPCommand non è compatibile con la risoluzione dello schermo del monitor, COPPCommand deve restituire DDERR_TOOBIGSIZE.
Mapping di RenderMoComp a COPPCommand
La funzione COPPCommand di esempio esegue il mapping direttamente a una chiamata al membro RenderMoComp della struttura DD_MOTIONCOMPCALLBACKS. Il membro RenderMoComp punta alla funzione di callback DdMoCompRender fornita dal driver visualizzato che fa riferimento alla struttura DD_RENDERMOCOMPDATA.
La funzione callback RenderMoComp viene chiamata senza la funzione BeginMoCompFrame fornita dal driver visualizzato o dalla funzione EndMoCompFrame chiamata prima.
La struttura DD_RENDERMOCOMPDATA viene riempita come indicato di seguito.
Membro | Valore |
---|---|
dwNumBuffers | Zero. |
lpBufferInfo | NULL |
dwFunction | DXVA_COPPCommandFnCode costante (definita in dxva.h). |
lpInputData | Puntatore a una struttura di DXVA_COPPCommand. |
lpOutputData | NULL |
Codice di esempio
Il codice seguente fornisce un esempio di come implementare la funzione COPPCommand:
GUID
COPP_CalculateMAC(
AESHelper* pAesHelper,
BYTE* pInputData,
DWORD dwDataLength,
GUID* pKDI
)
{
GUID rgbTag;
memset(&rgbTag, 0, sizeof(GUID));
SignData(pAesHelper, pInputData, dwDataLength, (BYTE*)&rgbTag);
return rgbTag;
}
HRESULT
COPPCommand(
COPP_DeviceData* pThis,
DXVA_COPPCommand* pCommand
)
{
DXVA_COPPSetProtectionLevelCmdData CmdData;
DWORD ProtIndex = COPP_ProtectionTypeIndex_Unkonwn;
if (pThis->m_COPPDevState != COPP_SESSION_ACTIVE) {
return E_UNEXPECTED;
}
if (pCommand->dwSequence != pThis->m_CmdSeqNumber) {
return E_INVALIDARG;
}
if (!IsEqualGUID(&pCommand->guidCommandID, &DXVA_COPPSetProtectionLevel)) {
return E_INVALIDARG;
}
//
// ensure that enough data is passed
//
if (pCommand->cbSizeData < sizeof(DXVA_COPPSetProtectionLevelCmdData)) {
return E_INVALIDARG;
}
//
// verify that the command message was sent by the application
// over the secure channel by validating the MAC on the message
//
GUID macCalculated = COPP_CalculateMAC(&pThis->m_AesHelper,
(BYTE*)&pCommand->guidCommandID,
sizeof(DXVA_COPPCommand) - sizeof(GUID),
&pThis->m_KDI);
if (!IsEqualGUID(&macCalculated, &pCommand->macKDI)) {
return E_UNEXPECTED;
}
memcpy(&CmdData, pCommand->CommandData, sizeof(DXVA_COPPSetProtectionLevelCmdData));
//
// determine which protection level (CmdData.ProtType) was passed and
// set ProtIndex accordingly (for example, ProtIndex = COPP_ProtectionTypeIndex_ACP)
//
//
// ensure that the request is valid
//
if (CmdData.ProtLevel >= g_nLevels[ProtIndex]) {
return E_INVALIDARG;
}
// set the new local level and store the former local level
DWORD oldLevel = pThis->m_LocalLevel[ProtIndex];
pThis->m_LocalLevel[ProtIndex] = CmdData.ProtLevel;
// decrement the former global level and increment the new
g_COPPLevels[pThis->m_DevID].Levels[ProtIndex][oldLevel]--;
g_COPPLevels[pThis->m_DevID].Levels[ProtIndex][CmdData.ProtLevel]++;
pThis->m_CmdSeqNumber++;
return NO_ERROR;
}
Requisiti
Piattaforma di destinazione | Versione |
---|---|
Desktop | Questa funzione si applica solo a Windows Server 2003 con SP1 e versioni successive e Windows XP con SP2 e versioni successive. |
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per