Bagikan melalui


Fungsi COPPQueryStatus

Contoh fungsi COPPQueryStatus mengambil status pada sesi video yang dilindungi yang terkait dengan perangkat VA COPP DirectX.

Sintaks

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

Parameter

pThis [in]

  • Arahkan ke objek perangkat COPP DirectX VA.

pInput [in]

  • Memasok pointer ke struktur DXVA_COPPStatusInput yang berisi permintaan untuk mengambil informasi status tertentu.

pOutput [out]

  • Arahkan ke struktur DXVA_COPPStatusOutput yang menerima informasi status tentang konektor fisik yang digunakan.

Mengembalikan nilai

Mengembalikan nol (S_OK atau DD_OK) jika berhasil; jika tidak, mengembalikan kode kesalahan.

Keterangan

Sesi video harus diatur ke mode yang dilindungi (yaitu, harus aktif) sebelum perangkat COPP DirectX VA terkait menerima panggilan ke fungsi COPPQueryStatus-nya. Artinya, fungsi COPPSequenceStart harus dipanggil sebelum COPPQueryStatus. Jika COPPQueryStatus dipanggil sebelum COPPSequenceStart, COPPQueryStatus harus mengembalikan E_UNEXPECTED.

Fungsi COPPQueryStatus menerima struktur DXVA_COPPStatusInput yang diisi di pInput yang berisi permintaan status. Fungsi COPPQueryStatus memproses permintaan dan mengembalikan status yang sesuai dalam struktur DXVA_COPPStatusOutput di pOutput.

Pemetaan RenderMoComp ke COPPQueryStatus

Contoh fungsi COPPQueryStatus memetakan langsung ke panggilan ke anggota RenderMoComp dari struktur DD_MOTIONCOMPCALLBACKS. Anggota RenderMoComp menunjuk ke fungsi panggilan balik DdMoCompRender yang disediakan driver tampilan yang mereferensikan struktur DD_RENDERMOCOMPDATA.

Fungsi panggilan balik RenderMoComp dipanggil tanpa fungsi BeginMoCompFrame atau EndMoCompFrame yang disediakan driver tampilan dipanggil terlebih dahulu.

Struktur DD_RENDERMOCOMPDATA diisi sebagai berikut.

Anggota Nilai
dwNumBuffers Nol.
lpBufferInfo NULL.
dwFunction DXVA_COPPQueryStatusFnCode konstanta (didefinisikan dalam dxva.h).
lpInputData Penunjuk ke struktur DXVA_COPPStatusInput.
lpOutputData Arahkan ke struktur DXVA_COPPStatusOutput.

Contoh Kode

Kode berikut memberikan contoh bagaimana Anda dapat mengimplementasikan fungsi COPPQueryStatus Anda:

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;
}

Persyaratan

Platform target Versi
Desktop Fungsi ini hanya berlaku untuk Windows Server 2003 dengan SP1 dan yang lebih baru, dan Windows XP dengan SP2 dan yang lebih baru.