Share via


COPPQueryStatus 함수

샘플 COPPQueryStatus 함수는 COPP DirectX VA 디바이스와 연결된 보호된 비디오 세션에서 상태 검색합니다.

구문

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

매개 변수

pThis [in]

  • COPP DirectX VA 디바이스 개체에 대한 포인터입니다.

pInput [in]

  • 특정 상태 정보를 검색하는 요청을 포함하는 DXVA_COPPStatusInput 구조체에 대한 포인터를 제공합니다.

pOutput [out]

  • 사용 중인 물리적 커넥터에 대한 상태 정보를 수신하는 DXVA_COPPStatusOutput 구조체에 대한 포인터입니다.

반환 값

성공하면 0(S_OK 또는 DD_OK)을 반환합니다. 그렇지 않으면 은 오류 코드를 반환합니다.

설명

연결된 COPP DirectX VA 디바이스가 COPPQueryStatus 함수에 대한 호출을 수신하기 전에 비디오 세션을 보호 모드(즉, 활성 상태여야)로 설정해야 합니다. 즉, COPPQueryStatus 전에 COPPSequenceStart 함수를 호출해야 합니다. COPPSequenceStart 전에 COPPQueryStatus가 호출되면 COPPQueryStatus는 E_UNEXPECTED 반환해야 합니다.

COPPQueryStatus 함수는 상태 요청을 포함하는 pInput에서 채워진 DXVA_COPPStatusInput 구조를 받습니다. COPPQueryStatus 함수는 요청을 처리하고 pOutput의 DXVA_COPPStatusOutput 구조에서 적절한 상태 반환합니다.

RenderMoComp를 COPPQueryStatus에 매핑

샘플 COPPQueryStatus 함수는 DD_MOTIONCOMPCALLBACKS 구조체의 RenderMoComp 멤버에 대한 호출에 직접 매핑됩니다. RenderMoComp 멤버는 DD_RENDERMOCOMPDATA 구조를 참조하는 디스플레이 드라이버 제공 DdMoCompRender 콜백 함수를 가리킵니다.

RenderMoComp 콜백 함수는 디스플레이 드라이버 제공 BeginMoCompFrame 또는 EndMoCompFrame 함수가 먼저 호출되지 않고 호출됩니다.

DD_RENDERMOCOMPDATA 구조체는 다음과 같이 채워집니다.

멤버
dwNumBuffers 단계 없음.
lpBufferInfo NULL
dwFunction DXVA_COPPQueryStatusFnCode 상수(dxva.h에 정의됨).
lpInputData DXVA_COPPStatusInput 구조체에 대한 포인터입니다.
lpOutputData DXVA_COPPStatusOutput 구조체에 대한 포인터입니다.

코드 예

다음 코드는 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;
}

요구 사항

대상 플랫폼 버전
데스크톱 이 함수는 WINDOWS Server 2003 SP1 이상 및 Windows XP SP2 이상에만 적용됩니다.