Функция COPPQueryStatus
Пример функции COPPQueryStatus извлекает состояние защищенного видеосеанса, связанного с устройством COPP DirectX VA.
Синтаксис
HRESULT COPPQueryStatus(
_In_ COPP_DeviceData pThis,
_In_ DXVA_COPPStatusInput *pInput,
_Out_ DXVA_COPPStatusOutput *pOutput
);
Параметры
pЭто [in]
- Указатель на объект устройства COPP DirectX VA.
pInput [in]
- Предоставляет указатель на структуру DXVA_COPPStatusInput, содержащую запрос на получение определенных сведений о состоянии.
pOutput [out]
- Указатель на структуру DXVA_COPPStatusOutput, которая получает сведения о состоянии используемого физического соединителя.
Возвращаемое значение
Возвращает ноль (S_OK или DD_OK) в случае успешного выполнения; в противном случае возвращает код ошибки.
Комментарии
Видеосеанс должен быть настроен в защищенный режим (то есть он должен быть активным), прежде чем связанное устройство COPP DirectX VA получит вызов своей функции COPPQueryStatus. То есть функция COPPSequenceStart должна вызываться перед COPPQueryStatus. Если COPPQueryStatus вызывается перед COPPSequenceStart, функция COPPQueryStatus должна возвращать E_UNEXPECTED.
Функция COPPQueryStatus получает заполненную структуру DXVA_COPPStatusInput pInput, содержащую запрос состояния. Функция COPPQueryStatus обрабатывает запрос и возвращает соответствующее состояние в структуре DXVA_COPPStatusOutput pOutput.
Сопоставление RenderMoComp с COPPQueryStatus
Пример функции COPPQueryStatus напрямую сопоставляется с вызовом элемента RenderMoComp структуры DD_MOTIONCOMPCALLBACKS. Элемент RenderMoComp указывает на функцию обратного вызова DdMoCompRender, предоставляемую драйвером дисплея, которая ссылается на структуру DD_RENDERMOCOMPDATA.
Функция обратного вызова 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;
}
Requirements
Целевая платформа | Версия |
---|---|
Персональный компьютер | Эта функция применяется только к Windows Server 2003 с пакетом обновления 1 (SP1) и более поздним версиям, а также Windows XP с пакетом обновления 2 (SP2) и более поздним версиям. |
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по