📄 vidstrm.cpp
字号:
//==========================================================================;
//
// CWDMVideoStream - WDM Video Stream base class implementation
//
// $Date: 05 Aug 1998 11:10:52 $
// $Revision: 1.0 $
// $Author: Tashjian $
//
// $Copyright: (c) 1997 - 1998 ATI Technologies Inc. All Rights Reserved. $
//
//==========================================================================;
extern "C"
{
#include "strmini.h"
#include "ksmedia.h"
}
#include "wdmvdec.h"
#include "wdmdrv.h"
#include "device.h"
#include "aticonfg.h"
#include "capdebug.h"
#include "StrmInfo.h"
/*
** VideoReceiveDataPacket()
**
** Receives Video data packet commands
**
** Arguments:
**
** pSrb - Stream request block for the Video stream
**
** Returns: nothing
**
** Side Effects: none
*/
VOID STREAMAPI VideoReceiveDataPacket(IN PHW_STREAM_REQUEST_BLOCK pSrb)
{
CWDMVideoStream * pVideoStream = (CWDMVideoStream *)pSrb->StreamObject->HwStreamExtension;
pVideoStream->VideoReceiveDataPacket(pSrb);
}
/*
** VideoReceiveCtrlPacket()
**
** Receives packet commands that control the Video stream
**
** Arguments:
**
** pSrb - The stream request block for the Video stream
**
** Returns: nothing
**
** Side Effects: none
*/
VOID STREAMAPI VideoReceiveCtrlPacket(IN PHW_STREAM_REQUEST_BLOCK pSrb)
{
CWDMVideoStream * pVideoStream = (CWDMVideoStream *)pSrb->StreamObject->HwStreamExtension;
pVideoStream->VideoReceiveCtrlPacket(pSrb);
}
void CWDMVideoStream::TimeoutPacket(IN OUT PHW_STREAM_REQUEST_BLOCK pSrb)
{
if (m_KSState == KSSTATE_STOP || !m_pVideoDecoder->PreEventOccurred())
{
DBGTRACE(("Suspicious timeout. SRB %8x. \n", pSrb));
}
}
CWDMVideoStream::CWDMVideoStream(PHW_STREAM_OBJECT pStreamObject,
CWDMVideoDecoder * pVideoDecoder,
PUINT puiErrorCode)
: m_pStreamObject(pStreamObject),
m_pVideoDecoder(pVideoDecoder)
{
DBGTRACE(("CWDMVideoStream::CWDMVideoStream\n"));
m_pVideoPort = m_pVideoDecoder->GetVideoPort();
m_pDevice = m_pVideoDecoder->GetDevice();
KeInitializeSpinLock(&m_ctrlSrbLock);
InitializeListHead(&m_ctrlSrbQueue);
m_KSState = KSSTATE_STOP;
*puiErrorCode = WDMMINI_NOERROR;
}
CWDMVideoStream::~CWDMVideoStream()
{
KIRQL Irql;
DBGTRACE(("CWDMVideoStream::~CWDMVideoStream()\n"));
KeAcquireSpinLock(&m_ctrlSrbLock, &Irql);
if (!IsListEmpty(&m_ctrlSrbQueue))
{
TRAP();
}
KeReleaseSpinLock(&m_ctrlSrbLock, Irql);
}
/*
** VideoReceiveDataPacket()
**
** Receives Video data packet commands
**
** Arguments:
**
** pSrb - Stream request block for the Video stream
**
** Returns: nothing
**
** Side Effects: none
*/
VOID STREAMAPI CWDMVideoStream::VideoReceiveDataPacket(IN PHW_STREAM_REQUEST_BLOCK pSrb)
{
ASSERT(pSrb->StreamObject->StreamNumber == STREAM_AnalogVideoInput);
ASSERT(pSrb->Irp->MdlAddress);
DBGINFO(("Receiving SD---- SRB=%x\n", pSrb));
pSrb->Status = STATUS_SUCCESS;
switch (pSrb->Command) {
case SRB_WRITE_DATA:
m_pVideoDecoder->ReceivePacket(pSrb);
break;
default:
//
// invalid / unsupported command. Fail it as such
//
TRAP();
pSrb->Status = STATUS_NOT_IMPLEMENTED;
StreamClassStreamNotification( StreamRequestComplete,
pSrb->StreamObject,
pSrb);
break;
}
}
/*
** VideoReceiveCtrlPacket()
**
** Receives packet commands that control the Video stream
**
** Arguments:
**
** pSrb - The stream request block for the Video stream
**
** Returns: nothing
**
** Side Effects: none
*/
VOID STREAMAPI CWDMVideoStream::VideoReceiveCtrlPacket(IN PHW_STREAM_REQUEST_BLOCK pSrb)
{
KIRQL Irql;
PSRB_DATA_EXTENSION pSrbExt;
KeAcquireSpinLock(&m_ctrlSrbLock, &Irql);
if (m_processingCtrlSrb)
{
pSrbExt = (PSRB_DATA_EXTENSION)pSrb->SRBExtension;
pSrbExt->pSrb = pSrb;
InsertTailList(&m_ctrlSrbQueue, &pSrbExt->srbListEntry);
KeReleaseSpinLock(&m_ctrlSrbLock, Irql);
return;
}
m_processingCtrlSrb = TRUE;
KeReleaseSpinLock(&m_ctrlSrbLock, Irql);
// This will run until the queue is empty
while (TRUE)
{
// Assume success. Might be changed below
pSrb->Status = STATUS_SUCCESS;
switch (pSrb->Command)
{
case SRB_GET_STREAM_STATE:
VideoGetState(pSrb);
break;
case SRB_SET_STREAM_STATE:
{
BOOL bVPConnected, bVPVBIConnected;
PDEVICE_DATA_EXTENSION pDevExt = (PDEVICE_DATA_EXTENSION)pSrb->HwDeviceExtension;
bVPConnected = pDevExt->CWDMDecoder.IsVideoPortPinConnected();
bVPVBIConnected = pDevExt->CDevice.IsVBIEN();
VideoSetState(pSrb, bVPConnected, bVPVBIConnected);
}
break;
case SRB_GET_STREAM_PROPERTY:
VideoGetProperty(pSrb);
break;
case SRB_SET_STREAM_PROPERTY:
VideoSetProperty(pSrb);
break;
case SRB_INDICATE_MASTER_CLOCK:
VideoIndicateMasterClock (pSrb);
break;
case SRB_PROPOSE_DATA_FORMAT:
// This may be inappropriate for Bt829. CHECK!!!
DBGERROR(("Propose Data format\n"));
if (!(AdapterVerifyFormat (
pSrb->CommandData.OpenFormat,
pSrb->StreamObject->StreamNumber))) {
pSrb->Status = STATUS_NO_MATCH;
}
break;
default:
TRAP();
pSrb->Status = STATUS_NOT_IMPLEMENTED;
break;
}
StreamClassStreamNotification(StreamRequestComplete, pSrb->StreamObject, pSrb);
KeAcquireSpinLock(&m_ctrlSrbLock, &Irql);
if (IsListEmpty(&m_ctrlSrbQueue))
{
m_processingCtrlSrb = FALSE;
KeReleaseSpinLock(&m_ctrlSrbLock, Irql);
return;
}
else
{
pSrbExt = (PSRB_DATA_EXTENSION)RemoveHeadList(&m_ctrlSrbQueue);
KeReleaseSpinLock(&m_ctrlSrbLock, Irql);
pSrb = pSrbExt->pSrb;
}
}
}
/*
** VideoSetProperty()
**
** Routine to process video property requests
**
** Arguments:
**
** pSrb - pointer to the stream request block for properties
**
** Returns:
**
** Side Effects: none
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -