Condividi tramite


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.