📄 pindevice.cpp
字号:
CS_MSGQUEUE_BUFFER CsMsgQBuff ;
if ( false == RemoveBufferFromList( &pCsStreamDesc, &pMappedData, &pUnmappedData ) || NULL == pCsStreamDesc )
{
// We dropped a frame
m_ulFramesDropped++;
m_fDiscontinuity = true;
bOK = FALSE;
dwRet = ERROR_OUTOFMEMORY;
goto exit;
}
if (!InitMsgQueueDescriptor (&CsMsgQBuff, pCsStreamDesc, pMappedData, pUnmappedData, TRUE))
{
bOK = FALSE;
dwRet = ERROR_INVALID_DATA;
goto exit;
}
if ( NULL == m_hMsgQ )
{
DEBUGMSG(ZONE_FUNCTION|ZONE_ERROR, (_T("PIN_Function(%08x): MsgQueue is not opened\r\n"), this)) ;
bOK = FALSE;
goto exit;
}
if ( false == WriteMsgQueue( m_hMsgQ, reinterpret_cast<LPVOID>(&CsMsgQBuff), sizeof(CS_MSGQUEUE_BUFFER), PIN_TIMEOUT, 0 ) )
{
DEBUGMSG(ZONE_FUNCTION|ZONE_ERROR, (_T("PIN_Function(%08x): WriteMsgQueue returned false\r\n"), this));
dwRet = ERROR_WRITE_FAULT;
}
exit:
if ( STILL == m_ulPinId )
{
if((bOK) && (0 == DecrementStillCount()))
{
m_CsState = CSSTATE_PAUSE;
}
}
LeaveCriticalSection(&m_csStreamIO);
return dwRet;
}
DWORD CPinDevice ::PauseStream( )
{
if( m_CsState == CSSTATE_STOP )
{
// Let's allocate our resources
if( m_pStreamDescriptorList == NULL )
{
m_pStreamDescriptorList = (PCS_STREAM_DESCRIPTOR_SHADOW) LocalAlloc( LMEM_ZEROINIT, sizeof( CS_STREAM_DESCRIPTOR_SHADOW ) * m_ulMaxNumOfBuffers );
if( NULL == m_pStreamDescriptorList )
return ERROR_OUTOFMEMORY;
}
// m_dwBufferCount = 0;
}
if ( false == m_fClientInitialized )
{
// By this time the buffers must be allocated
if( ERROR_SUCCESS == m_pCamAdapter->PDDInitPin( m_ulPinId, this ) )
{
m_fClientInitialized = true;
}
}
if( m_fClientInitialized == false )
{
return ERROR_INTERNAL_ERROR;
}
m_CsState = CSSTATE_PAUSE ;
m_pCamAdapter->PDDSetPinState( m_ulPinId, m_CsState );
return ERROR_SUCCESS ;
}
DWORD CPinDevice :: PinHandleConnectionRequests(
PCSPROPERTY pCsProp,
PUCHAR pOutBuf, // Unsafe, use with caution
DWORD OutBufLen,
PDWORD pdwBytesTransferred // Unsafe, use with caution
)
{
DEBUGMSG( ZONE_IOCTL, (_T("PIN_IOControl(%08x): PinHandleConnectionRequests\r\n"), this));
DWORD dwError = ERROR_INVALID_PARAMETER;
PCSALLOCATOR_FRAMING pCsAllocatorFraming = NULL;
PCS_DATAFORMAT_VIDEOINFOHEADER pCsDataFormatVidInfoHdr = NULL;
PCS_DATAFORMAT_VIDEOINFOHEADER pCsDataFormatVidInfoHdrCopy = NULL;
if ( NULL == pCsProp )
{
return dwError;
}
__try
{
*pdwBytesTransferred = 0 ;
}
__except( EXCEPTION_EXECUTE_HANDLER )
{
return ERROR_INVALID_PARAMETER;
}
// we support PROPSETID_Pin, so just return success
if ( CSPROPERTY_TYPE_SETSUPPORT == pCsProp->Flags )
{
return ERROR_SUCCESS;
}
switch ( pCsProp->Id )
{
case CSPROPERTY_CONNECTION_STATE:
dwError = PinHandleConnStateSubReqs( pCsProp->Flags, pOutBuf, OutBufLen, pdwBytesTransferred ) ;
break ;
case CSPROPERTY_CONNECTION_DATAFORMAT:
pCsDataFormatVidInfoHdr = (PCS_DATAFORMAT_VIDEOINFOHEADER) pOutBuf;
DWORD dwStructSize;
if(( OutBufLen < sizeof( PCS_DATAFORMAT_VIDEOINFOHEADER )) || ( pOutBuf == NULL ))
{
return dwError;
}
// The video info header can be modified by the caller while it's being accessed in the subroutine.
// The Subroutine needs to make a copy of the video info header before accessing it.
__try
{
dwStructSize = sizeof( CS_DATAFORMAT_VIDEOINFOHEADER ) + pCsDataFormatVidInfoHdr->VideoInfoHeader.bmiHeader.biSize - sizeof( CS_BITMAPINFOHEADER );
pCsDataFormatVidInfoHdrCopy = (PCS_DATAFORMAT_VIDEOINFOHEADER) LocalAlloc( LMEM_ZEROINIT, dwStructSize );
if( pCsDataFormatVidInfoHdrCopy == NULL )
{
return ERROR_INVALID_PARAMETER;
}
if( CeSafeCopyMemory( pCsDataFormatVidInfoHdrCopy, pCsDataFormatVidInfoHdr, dwStructSize ))
{
dwError = PinHandleConnDataFormatSubReqs( pCsProp->Flags, pCsDataFormatVidInfoHdrCopy, pdwBytesTransferred ) ;
}
}
__except( EXCEPTION_EXECUTE_HANDLER )
{
dwError = ERROR_INVALID_PARAMETER;
DEBUGMSG(ZONE_IOCTL|ZONE_ERROR, (_T("PIN_IOControl(%08x): CSPROPERTY_CONNECTION_DATAFORMAT: Exception occured\r\n"), this)) ;
}
LocalFree( pCsDataFormatVidInfoHdrCopy );
break ;
case CSPROPERTY_CONNECTION_ALLOCATORFRAMING:
switch ( pCsProp->Flags )
{
case CSPROPERTY_TYPE_GET:
case CSPROPERTY_TYPE_BASICSUPPORT:
CSALLOCATOR_FRAMING csAllocatorFraming;
if(( OutBufLen < sizeof( CSALLOCATOR_FRAMING )) || ( pOutBuf == NULL ))
{
dwError = ERROR_MORE_DATA;
break;
}
{
csAllocatorFraming.RequirementsFlags = m_dwMemoryModel;
csAllocatorFraming.PoolType = PagedPool;
csAllocatorFraming.Frames = m_ulMaxNumOfBuffers;
csAllocatorFraming.FrameSize = m_CsDataRangeVideo.VideoInfoHeader.bmiHeader.biSizeImage;
csAllocatorFraming.FileAlignment = FILE_BYTE_ALIGNMENT;
csAllocatorFraming.Reserved = 0;
}
__try
{
memcpy( pOutBuf, &csAllocatorFraming, sizeof( CSALLOCATOR_FRAMING ));
*pdwBytesTransferred = sizeof( CSALLOCATOR_FRAMING );
}
__except( EXCEPTION_EXECUTE_HANDLER )
{
dwError = ERROR_INVALID_PARAMETER;
break;
}
dwError = ERROR_SUCCESS;
break ;
case CSPROPERTY_TYPE_SET:
if( OutBufLen < sizeof( CSALLOCATOR_FRAMING ))
{
dwError = ERROR_INVALID_PARAMETER;
break;
}
pCsAllocatorFraming = (PCSALLOCATOR_FRAMING) pOutBuf;
if(( m_CsState != CSSTATE_STOP ) || ( m_dwMemoryModel != pCsAllocatorFraming->RequirementsFlags ))
{
dwError = ERROR_INVALID_PARAMETER;
break;
}
m_ulMaxNumOfBuffers = pCsAllocatorFraming->Frames ;
dwError = ERROR_SUCCESS;
break ;
default :
DEBUGMSG(ZONE_IOCTL|ZONE_ERROR, (_T("PIN_IOControl(%08x): CSPROPERTY_CONNECTION_ALLOCATORFRAMING Invalid Request\r\n"), this)) ;
}
break ;
case CSPROPERTY_CONNECTION_PROPOSEDATAFORMAT :
// I don't want to support dynamic format changes for this test driver
break ;
default :
DEBUGMSG(ZONE_IOCTL|ZONE_ERROR, (_T("PIN_IOControl(%08x): Invalid Request\r\n"), this)) ;
}
return dwError ;
}
DWORD
CPinDevice::PinHandleBufferRequest(
CSBUFFER_INFO csBufferInfo,
PUCHAR pOutBuf,
DWORD OutBufLen,
DWORD *pdwBytesTransferred
)
{
DWORD dwError = ERROR_INVALID_PARAMETER;
DWORD dwCommand = csBufferInfo.dwCommand;
PCS_STREAM_DESCRIPTOR pCsDescriptor = (PCS_STREAM_DESCRIPTOR) csBufferInfo.pStreamDescriptor;
if ( pdwBytesTransferred )
{
*pdwBytesTransferred = 0;
}
// The pOutBuf argument has already been probed with MapCallerPointer, and the upper layer
// has already checked for the size of the buffer to be at least sizeof( CS_STREAM_DESCRIPTOR )
switch( dwCommand )
{
case CS_ALLOCATE:
// Let's allocate our resources
if( m_pStreamDescriptorList == NULL )
{
m_pStreamDescriptorList = (PCS_STREAM_DESCRIPTOR_SHADOW) LocalAlloc( LMEM_ZEROINIT, sizeof( CS_STREAM_DESCRIPTOR_SHADOW ) * m_ulMaxNumOfBuffers );
if( NULL == m_pStreamDescriptorList )
return ERROR_OUTOFMEMORY;
}
dwError = AllocateBuffer( csBufferInfo.pStreamDescriptor, pOutBuf, OutBufLen, pdwBytesTransferred );
break;
case CS_ENQUEUE:
dwError = EnqueueDescriptor( csBufferInfo.pStreamDescriptor );
break;
case CS_DEALLOCATE:
dwError = DeallocateBuffer( csBufferInfo.pStreamDescriptor );
default:
break;
}
return dwError;
}
DWORD
CPinDevice::PinHandleConnStateSubReqs(
ULONG ulReqFlags,
PUCHAR pOutBuf, // Unsafe, use with caution
DWORD OutBufLen,
PDWORD pdwBytesTransferred
)
{
DWORD dwError = ERROR_INVALID_PARAMETER;
PCSSTATE pCsState = NULL;
switch( ulReqFlags )
{
case CSPROPERTY_TYPE_GET:
if( OutBufLen < sizeof ( CSSTATE ) )
{
dwError = ERROR_MORE_DATA;
break;
}
if( NULL == pOutBuf )
{
dwError = ERROR_INVALID_PARAMETER;
break;
}
__try
{
memcpy( pOutBuf, &m_CsState, sizeof ( CSSTATE ) );
*pdwBytesTransferred = sizeof ( CSSTATE );
}
__except( EXCEPTION_EXECUTE_HANDLER )
{
dwError = ERROR_MORE_DATA;
break;
}
dwError = ERROR_SUCCESS;
break;
case CSPROPERTY_TYPE_SET:
CSSTATE csState;
if( OutBufLen < sizeof( CSSTATE ))
{
dwError = ERROR_MORE_DATA;
break;
}
if( NULL == pOutBuf )
{
dwError = ERROR_INVALID_PARAMETER;
break;
}
if( !CeSafeCopyMemory( &csState, pOutBuf, sizeof( CSSTATE )))
{
dwError = ERROR_MORE_DATA;
break;
}
if( csState == m_CsState )
{
dwError = ERROR_SUCCESS;
break;
}
EnterCriticalSection(&m_csStreamIO);
switch ( csState )
{
case CSSTATE_STOP:
m_ulPictureNumber = 0;
m_ulFramesDropped = 0;
m_msLastPT = 0;
// We can get to the CSSTATE_STOP state from any other state.
if ( CSSTATE_STOP == m_CsState )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -