📄 wdmvdec.cpp
字号:
if (OnlyWantsSize) {
break;
}
// Caller wants the full data format
if (IntersectInfo->SizeOfDataFormatBuffer < FormatSize) {
pSrb->Status = STATUS_BUFFER_TOO_SMALL;
return FALSE;
}
RtlCopyMemory(
IntersectInfo->DataFormatBuffer,
&StreamFormatVideoPort,
sizeof (KSDATAFORMAT));
((PKSDATAFORMAT)IntersectInfo->DataFormatBuffer)->FormatSize = FormatSize;
break;
}
// -------------------------------------------------------------------
// Specifier KSDATAFORMAT_SPECIFIER_NONE for VP VBI
// -------------------------------------------------------------------
else if (IsEqualGUID (DataRange->Specifier,
KSDATAFORMAT_SPECIFIER_NONE) &&
IsEqualGUID (DataRange->SubFormat, KSDATAFORMAT_SUBTYPE_VPVBI)) {
// MATCH FOUND!
MatchFound = TRUE;
FormatSize = sizeof (KSDATAFORMAT);
if (OnlyWantsSize) {
break;
}
// Caller wants the full data format
if (IntersectInfo->SizeOfDataFormatBuffer < FormatSize) {
pSrb->Status = STATUS_BUFFER_TOO_SMALL;
return FALSE;
}
RtlCopyMemory(
IntersectInfo->DataFormatBuffer,
&StreamFormatVideoPortVBI,
sizeof (KSDATAFORMAT));
((PKSDATAFORMAT)IntersectInfo->DataFormatBuffer)->FormatSize = FormatSize;
break;
}
// -------------------------------------------------------------------
// Specifier STATIC_KSDATAFORMAT_TYPE_NONE for VBI capture stream
// -------------------------------------------------------------------
else if (IsEqualGUID (DataRange->Specifier,
KSDATAFORMAT_SPECIFIER_VBI)) {
PKS_DATARANGE_VIDEO_VBI DataRangeVBIToVerify =
(PKS_DATARANGE_VIDEO_VBI) DataRange;
PKS_DATARANGE_VIDEO_VBI DataRangeVBI =
(PKS_DATARANGE_VIDEO_VBI) *pAvailableFormats;
//
// Check that the other fields match
//
if ((DataRangeVBIToVerify->bFixedSizeSamples != DataRangeVBI->bFixedSizeSamples) ||
(DataRangeVBIToVerify->bTemporalCompression != DataRangeVBI->bTemporalCompression) ||
(DataRangeVBIToVerify->StreamDescriptionFlags != DataRangeVBI->StreamDescriptionFlags) ||
(DataRangeVBIToVerify->MemoryAllocationFlags != DataRangeVBI->MemoryAllocationFlags) ||
(RtlCompareMemory (&DataRangeVBIToVerify->ConfigCaps,
&DataRangeVBI->ConfigCaps,
sizeof (KS_VIDEO_STREAM_CONFIG_CAPS)) !=
sizeof (KS_VIDEO_STREAM_CONFIG_CAPS))) {
continue;
}
// MATCH FOUND!
MatchFound = TRUE;
FormatSize = sizeof (KS_DATAFORMAT_VBIINFOHEADER);
if (OnlyWantsSize) {
break;
}
// Caller wants the full data format
if (IntersectInfo->SizeOfDataFormatBuffer < FormatSize) {
pSrb->Status = STATUS_BUFFER_TOO_SMALL;
return FALSE;
}
// Copy over the KSDATAFORMAT, followed by the
// actual VBIInfoHeader
RtlCopyMemory(
&((PKS_DATAFORMAT_VBIINFOHEADER)IntersectInfo->DataFormatBuffer)->DataFormat,
&DataRangeVBIToVerify->DataRange,
sizeof (KSDATARANGE));
((PKSDATAFORMAT)IntersectInfo->DataFormatBuffer)->FormatSize = FormatSize;
RtlCopyMemory(
&((PKS_DATAFORMAT_VBIINFOHEADER) IntersectInfo->DataFormatBuffer)->VBIInfoHeader,
&DataRangeVBIToVerify->VBIInfoHeader,
sizeof (KS_VBIINFOHEADER));
}
} // End of loop on all formats for this stream
if (!MatchFound) {
pSrb->Status = STATUS_NO_MATCH;
return FALSE;
}
if (OnlyWantsSize) {
// Check for special case where there is no buffer being passed
if ( IntersectInfo->SizeOfDataFormatBuffer == 0 ) {
pSrb->Status = STATUS_BUFFER_OVERFLOW;
}
else {
*(PULONG) IntersectInfo->DataFormatBuffer = FormatSize;
FormatSize = sizeof(ULONG);
}
}
pSrb->ActualBytesTransferred = FormatSize;
return TRUE;
}
void CWDMVideoDecoder::SrbGetStreamInfo(PHW_STREAM_REQUEST_BLOCK pSrb)
{
DBGTRACE(("CWDMVideoDecoder:SrbGetStreamInfo()\n"));
//
// verify that the buffer is large enough to hold our return data
//
DEBUG_ASSERT (pSrb->NumberOfBytesToTransfer >=
sizeof (HW_STREAM_HEADER) +
sizeof (HW_STREAM_INFORMATION) * NumStreams);
//
// Set the header
//
PHW_STREAM_HEADER pstrhdr =
(PHW_STREAM_HEADER)&(pSrb->CommandData.StreamBuffer->StreamHeader);
pstrhdr->NumberOfStreams = NumStreams;
pstrhdr->SizeOfHwStreamInformation = sizeof (HW_STREAM_INFORMATION);
pstrhdr->NumDevPropArrayEntries = NumAdapterProperties();
pstrhdr->DevicePropertiesArray = (PKSPROPERTY_SET)AdapterProperties;
pstrhdr->Topology = &Topology;
//
// stuff the contents of each HW_STREAM_INFORMATION struct
//
PHW_STREAM_INFORMATION pstrinfo =
(PHW_STREAM_INFORMATION)&(pSrb->CommandData.StreamBuffer->StreamInfo);
for (unsigned j = 0; j < NumStreams; j++) {
*pstrinfo++ = Streams[j].hwStreamInfo;
}
DBGTRACE(("Exit: CWDMVideoDecoder:SrbGetStreamInfo()\n"));
}
VOID CWDMVideoDecoder::SrbSetProperty (PHW_STREAM_REQUEST_BLOCK pSrb)
{
PSTREAM_PROPERTY_DESCRIPTOR pSPD = pSrb->CommandData.PropertyInfo;
if (IsEqualGUID(PROPSETID_VIDCAP_CROSSBAR, pSPD->Property->Set)) {
m_pDevice->SetCrossbarProperty (pSrb);
}
else if (IsEqualGUID(PROPSETID_VIDCAP_VIDEOPROCAMP, pSPD->Property->Set)) {
ASSERT (pSPD->PropertyOutputSize >= sizeof (KSPROPERTY_VIDEOPROCAMP_S));
ULONG Id = pSPD->Property->Id; // index of the property
PKSPROPERTY_VIDEOPROCAMP_S pS = (PKSPROPERTY_VIDEOPROCAMP_S) pSPD->PropertyInfo; // pointer to the data
pSrb->Status = m_pDevice->SetProcAmpProperty(Id, pS->Value);
}
else if (IsEqualGUID(PROPSETID_VIDCAP_VIDEODECODER, pSPD->Property->Set)) {
m_pDevice->SetDecoderProperty (pSrb);
}
else
DBGERROR(("CWDMVideoDecoder:SrbSetProperty() unknown property\n"));
}
VOID CWDMVideoDecoder::SrbGetProperty (PHW_STREAM_REQUEST_BLOCK pSrb)
{
PSTREAM_PROPERTY_DESCRIPTOR pSPD = pSrb->CommandData.PropertyInfo;
if (IsEqualGUID (PROPSETID_VIDCAP_CROSSBAR, pSPD->Property->Set)) {
m_pDevice->GetCrossbarProperty (pSrb);
}
else if (IsEqualGUID(PROPSETID_VIDCAP_VIDEOPROCAMP, pSPD->Property->Set)) {
ASSERT (pSPD->PropertyOutputSize >= sizeof (KSPROPERTY_VIDEOPROCAMP_S));
ULONG Id = pSPD->Property->Id; // index of the property
PKSPROPERTY_VIDEOPROCAMP_S pS = (PKSPROPERTY_VIDEOPROCAMP_S) pSPD->PropertyInfo; // pointer to the data
RtlCopyMemory(pS, pSPD->Property, sizeof(KSPROPERTY));
pS->Capabilities = KSPROPERTY_VIDEOPROCAMP_FLAGS_MANUAL;
pSrb->Status = m_pDevice->GetProcAmpProperty(Id, &pS->Value);
pSrb->ActualBytesTransferred = pSrb->Status == STATUS_SUCCESS ?
sizeof (KSPROPERTY_VIDEOPROCAMP_S) : 0;
}
else if (IsEqualGUID(PROPSETID_VIDCAP_VIDEODECODER, pSPD->Property->Set)) {
m_pDevice->GetDecoderProperty (pSrb);
}
else
DBGERROR(("CWDMVideoDecoder:SrbGetProperty() unknown property\n"));
}
void CWDMVideoDecoder::SetTunerInfo( PHW_STREAM_REQUEST_BLOCK pSrb)
{
PKSSTREAM_HEADER pDataPacket = pSrb->CommandData.DataBufferArray;
ASSERT (pDataPacket->FrameExtent == sizeof (KS_TVTUNER_CHANGE_INFO));
KIRQL Irql;
if (m_pVBICaptureStream)
m_pVBICaptureStream->DataLock(&Irql);
RtlCopyMemory( &m_TVTunerChangeInfo,
pDataPacket->Data,
sizeof (KS_TVTUNER_CHANGE_INFO));
m_TVTunerChanged = TRUE;
if (m_pVBICaptureStream)
m_pVBICaptureStream->DataUnLock(Irql);
}
BOOL CWDMVideoDecoder::GetTunerInfo(KS_TVTUNER_CHANGE_INFO* pTVChangeInfo)
{
if (m_TVTunerChanged) {
KIRQL Irql;
m_pVBICaptureStream->DataLock(&Irql);
RtlCopyMemory(pTVChangeInfo, &m_TVTunerChangeInfo, sizeof (KS_TVTUNER_CHANGE_INFO));
m_TVTunerChanged = FALSE;
m_pVBICaptureStream->DataUnLock(Irql);
return TRUE;
}
else
return FALSE;
}
BOOL CWDMVideoDecoder::SrbChangePowerState(PHW_STREAM_REQUEST_BLOCK pSrb)
{
DBGTRACE(("CWDMVideoDecoder:SrbChangePowerState()\n"));
switch (pSrb->CommandData.DeviceState)
{
case PowerDeviceD3:
m_preEventOccurred = TRUE;
m_pDevice->SaveState();
break;
case PowerDeviceD2:
m_preEventOccurred = TRUE;
m_pDevice->SaveState();
break;
case PowerDeviceD1:
m_preEventOccurred = TRUE;
m_pDevice->SaveState();
break;
case PowerDeviceD0:
m_postEventOccurred = TRUE;
m_pDevice->RestoreState(m_OpenStreams);
break;
}
pSrb->Status = STATUS_SUCCESS;
return(TRUE);
}
VOID CWDMVideoPortStream::AttemptRenegotiation()
{
int streamNumber = m_pStreamObject->StreamNumber;
if (m_EventCount)
{
DBGINFO(("Attempting renegotiation on stream %d\n", streamNumber));
if (streamNumber == STREAM_VPVideo)
{
StreamClassStreamNotification(
SignalMultipleStreamEvents,
m_pStreamObject,
&MY_KSEVENTSETID_VPNOTIFY,
KSEVENT_VPNOTIFY_FORMATCHANGE);
}
else if (streamNumber == STREAM_VPVBI)
{
StreamClassStreamNotification(
SignalMultipleStreamEvents,
m_pStreamObject,
&MY_KSEVENTSETID_VPVBINOTIFY,
KSEVENT_VPVBINOTIFY_FORMATCHANGE);
}
else
ASSERT(0);
}
else
{
DBGINFO(("NOT attempting renegotiation on stream %d\n", streamNumber));
}
}
NTSTATUS CWDMVideoDecoder::EventProc( IN PHW_EVENT_DESCRIPTOR pEventDescriptor)
{
if( pEventDescriptor->Enable)
m_nMVDetectionEventCount++;
else
m_nMVDetectionEventCount--;
return( STATUS_SUCCESS);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -