📄 cameradevice.cpp.svn-base
字号:
break;
}
//Copy the CSPROPERTY structure to the output buffer just in case!
memcpy( pCsPropVideoControlCapsOutput, pCsPropVideoControlCapsInput, sizeof( CSPROPERTY ) );
pCsPropVideoControlCapsOutput->StreamIndex = lIndex;
pCsPropVideoControlCapsOutput->VideoControlCaps = m_PinVideoCaps[lIndex].ulVideoControlCaps;
dwError = ERROR_SUCCESS;
break;
case CSPROPERTY_TYPE_SET:
lIndex = pCsPropVideoControlCapsInput->StreamIndex;
ulCaps = pCsPropVideoControlCapsInput->VideoControlCaps;
if ( ulCaps & ~( CS_VideoControlFlag_FlipHorizontal |
CS_VideoControlFlag_FlipVertical |
CS_VideoControlFlag_ExternalTriggerEnable |
CS_VideoControlFlag_Trigger ) )
{
DEBUGMSG( ZONE_IOCTL, ( _T("CAM_IOControl(%08x): Invalid flag specified as Video Control Caps.\r\n"), this ) );
break;
}
if( false == IsValidPin( lIndex ))
{
DEBUGMSG( ZONE_IOCTL, ( _T("CAM_IOControl(%08x): Invalid pin index.\r\n"), this ) );
break;
}
m_PinVideoCaps[lIndex].ulVideoControlCaps = ulCaps;
dwError = ERROR_SUCCESS;
break;
case CSPROPERTY_TYPE_DEFAULTVALUES:
*pdwBytesTransferred = sizeof(CSPROPERTY_VIDEOCONTROL_CAPS_S);
if ( NULL == ( pCsPropVideoControlCapsOutput = reinterpret_cast<PCSPROPERTY_VIDEOCONTROL_CAPS_S>( ValidateBuffer( pOutBuf, OutBufLen, *pdwBytesTransferred, &dwError ) ) ) )
{
dwError = ERROR_MORE_DATA;
break;
}
lIndex = pCsPropVideoControlCapsInput->StreamIndex;
if( false == IsValidPin( lIndex ))
{
DEBUGMSG( ZONE_IOCTL, ( _T("CAM_IOControl(%08x): Invalid pin index.\r\n"), this ) );
break;
}
//Copy the CSPROPERTY structure to the output buffer just in case!
memcpy( pCsPropVideoControlCapsOutput, pCsPropVideoControlCapsInput, sizeof ( CSPROPERTY ) );
pCsPropVideoControlCapsOutput->StreamIndex = lIndex;
pCsPropVideoControlCapsOutput->VideoControlCaps = DefaultVideoControlCaps[ lIndex ];
dwError = ERROR_SUCCESS;
break;
default:
DEBUGMSG( ZONE_IOCTL, ( _T("CAM_IOControl(%08x): Invalid Request\r\n"), this ) );
break;
}
break;
case CSPROPERTY_VIDEOCONTROL_MODE:
if( NULL == ( pCsPropVideoControlModeInput = reinterpret_cast<PCSPROPERTY_VIDEOCONTROL_MODE_S>(ValidateBuffer( pInBuf, InBufLen, sizeof(CSPROPERTY_VIDEOCONTROL_MODE_S), &dwError ) ) ) )
{
break;
}
lIndex = pCsPropVideoControlModeInput->StreamIndex;
if ( false == IsValidPin( lIndex ) )
{
DEBUGMSG( ZONE_IOCTL, (_T("CAM_IOControl(%08x): Invalid PinId\r\n"), this ) );
break;
}
switch( csProp.Flags )
{
case CSPROPERTY_TYPE_SET:
ulCaps = pCsPropVideoControlModeInput->Mode;
if ( ulCaps != CS_VideoControlFlag_Trigger )
{
DEBUGMSG( ZONE_IOCTL, (_T("CAM_IOControl(%08x): Invalid flag specified as Video Control Mode.\r\n"), this ) );
break;
}
if ( m_StrmInstances[lIndex].pPinDev &&
( lIndex == CAPTURE ||
lIndex == STILL ) )
{
m_StrmInstances[lIndex].pPinDev->SetState( CSSTATE_RUN, NULL );
dwError = ERROR_SUCCESS;
}
else
{
DEBUGMSG( ZONE_IOCTL, (_T("CAM_IOControl(%08x): Invalid pin for Trigger.\r\n"), this ) );
}
break ;
default :
DEBUGMSG(ZONE_IOCTL, (_T("CAM_IOControl(%08x): Invalid Request\r\n"), this)) ;
break ;
}
default:
DEBUGMSG(ZONE_IOCTL, (_T("CAM_IOControl(%08x): Invalid Property\r\n"), this)) ;
return dwError ;
}
return dwError;
}
DWORD
CCameraDevice::AdapterHandleDroppedFramesRequests(
PUCHAR pInBuf, // Warning: This is an unsafe buffer, access with care
DWORD InBufLen,
PUCHAR pOutBuf, // Warning: This is an unsafe buffer, access with care
DWORD OutBufLen,
PDWORD pdwBytesTransferred // Warning: This is an unsafe buffer, access with care
)
{
// Note: This whole function is wrapped in a __try/__except block
DEBUGMSG( ZONE_IOCTL, (_T("CAM_IOControl(%08x): HandleDroppedFramesRequests\r\n"), this ) );
DWORD dwError = ERROR_INVALID_PARAMETER;
LONG lValue = 0;
ULONG ulCaps = 0;
CSPROPERTY csProp;
CSPROPERTY_DROPPEDFRAMES_CURRENT_S csPropDroppedFramesOutput = {0};
if( !CeSafeCopyMemory( &csProp, pInBuf, InBufLen ))
{
return dwError;
}
*pdwBytesTransferred = 0;
switch( csProp.Id )
{
case CSPROPERTY_DROPPEDFRAMES_CURRENT:
switch ( csProp.Flags )
{
case CSPROPERTY_TYPE_GET:
*pdwBytesTransferred = sizeof(CSPROPERTY_DROPPEDFRAMES_CURRENT_S);
if( OutBufLen < *pdwBytesTransferred )
{
dwError = ERROR_MORE_DATA;
break;
}
//Copy the CSPROPERTY structure to the output buffer just in case!
memcpy( &csPropDroppedFramesOutput, &csProp, sizeof( CSPROPERTY ) );
if ( m_StrmInstances[CAPTURE].pPinDev )
{
csPropDroppedFramesOutput.PictureNumber = m_StrmInstances[CAPTURE].pPinDev->PictureNumber( );
csPropDroppedFramesOutput.DropCount = m_StrmInstances[CAPTURE].pPinDev->FramesDropped( );
csPropDroppedFramesOutput.AverageFrameSize = m_StrmInstances[CAPTURE].pPinDev->FrameSize( );
if( CeSafeCopyMemory( pOutBuf, &csPropDroppedFramesOutput, sizeof( CSPROPERTY_DROPPEDFRAMES_CURRENT_S )))
{
dwError = ERROR_SUCCESS;
}
}
break;
}
default:
DEBUGMSG(ZONE_IOCTL, (_T("CAM_IOControl(%08x): Invalid Property\r\n"), this)) ;
return dwError;
}
return dwError;
}
void
CCameraDevice::GetBasicSupportInfo(
PUCHAR pOutBuf,
DWORD OutBufLen,
PDWORD pdwBytesTransferred,
PDEV_PROPERTY pDevProp,
PDWORD pdwError
)
{
PCSPROPERTY_DESCRIPTION pCsPropDesc = NULL;
PCSPROPERTY_MEMBERSHEADER pCsPropMembersHeader = NULL;
if ( OutBufLen >= sizeof(CSPROPERTY_DESCRIPTION) )
{
if( OutBufLen >= StandardSizeOfBasicValues )
{
*pdwBytesTransferred = StandardSizeOfBasicValues;
}
else
{
*pdwBytesTransferred = sizeof(CSPROPERTY_DESCRIPTION);
}
pCsPropDesc = reinterpret_cast<PCSPROPERTY_DESCRIPTION>( ValidateBuffer( pOutBuf, OutBufLen, sizeof (CSPROPERTY_DESCRIPTION), pdwError ) );
if ( NULL == pCsPropDesc )
{
*pdwError = ERROR_MORE_DATA;
return;
}
pCsPropDesc->AccessFlags = (CSPROPERTY_TYPE_GET | CSPROPERTY_TYPE_SET | CSPROPERTY_TYPE_DEFAULTVALUES);
pCsPropDesc->MembersListCount = 1;
pCsPropDesc->Reserved = 0;
pCsPropDesc->DescriptionSize = StandardSizeOfBasicValues;
memcpy( &pCsPropDesc->PropTypeSet, &pDevProp->pCsPropValues->PropTypeSet, sizeof (CSIDENTIFIER) );
if( OutBufLen >= StandardSizeOfBasicValues )
{
pCsPropMembersHeader = reinterpret_cast<PCSPROPERTY_MEMBERSHEADER>( pCsPropDesc + 1 );
// Copy the CSPROPERTY_MEMBERSHEADER
memcpy( pCsPropMembersHeader, pDevProp->pCsPropValues->MembersList, sizeof (CSPROPERTY_MEMBERSHEADER) );
// Copy the CSPROPERTY_STEPPING_LONG
memcpy( pCsPropMembersHeader + 1, pDevProp->pCsPropValues->MembersList->Members, sizeof (CSPROPERTY_STEPPING_LONG) );
*pdwError = ERROR_SUCCESS;
}
else
{
DEBUGMSG( ZONE_IOCTL|ZONE_ERROR, (_T("CAM_IOControl(%08x): Not all available data could be written\r\n"), this ) );
*pdwError = ERROR_MORE_DATA;
}
}
else if ( OutBufLen >= sizeof(ULONG) )
{
// We just need to return AccessFlags. For this null driver, all PROCAMP properties support get/set/default support
DEBUGMSG( ZONE_IOCTL, (_T("CAM_IOControl(%08x): Returning AccessFlags\r\n"), this ) );
*pdwBytesTransferred = sizeof(ULONG);
if ( NULL == ValidateBuffer( pOutBuf, OutBufLen, sizeof (ULONG), pdwError ) )
{
*pdwError = ERROR_MORE_DATA;
return;
}
*((PULONG)pOutBuf) = static_cast<ULONG>( CSPROPERTY_TYPE_GET | CSPROPERTY_TYPE_SET | CSPROPERTY_TYPE_DEFAULTVALUES );
*pdwError = ERROR_SUCCESS;
}
else
{
DEBUGMSG( ZONE_IOCTL, (_T("CAM_IOControl(%08x): Output buffer is not large enough\r\n"), this ) );
*pdwError = ERROR_INSUFFICIENT_BUFFER;
}
return;
}
void
CCameraDevice::GetDefaultValues(
PUCHAR pOutBuf,
DWORD OutBufLen,
PDWORD pdwBytesTransferred,
PDEV_PROPERTY pDevProp,
PDWORD pdwError
)
{
PCSPROPERTY_DESCRIPTION pCsPropDesc = NULL;
PCSPROPERTY_MEMBERSHEADER pCsPropMembersHeader = NULL;
if ( OutBufLen >= sizeof(CSPROPERTY_DESCRIPTION) )
{
if( OutBufLen >= StandardSizeOfDefaultValues )
{
*pdwBytesTransferred = StandardSizeOfDefaultValues;
}
else
{
*pdwBytesTransferred = sizeof(CSPROPERTY_DESCRIPTION);
}
pCsPropDesc = reinterpret_cast<PCSPROPERTY_DESCRIPTION>( ValidateBuffer( pOutBuf, OutBufLen, sizeof (CSPROPERTY_DESCRIPTION), pdwError ) );
if ( NULL == pCsPropDesc )
{
*pdwError = ERROR_MORE_DATA;
return;
}
pCsPropDesc->AccessFlags = (CSPROPERTY_TYPE_GET | CSPROPERTY_TYPE_SET | CSPROPERTY_TYPE_DEFAULTVALUES);
pCsPropDesc->MembersListCount = 1;
pCsPropDesc->Reserved = 0;
pCsPropDesc->DescriptionSize = StandardSizeOfDefaultValues;
memcpy( &pCsPropDesc->PropTypeSet, &pDevProp->pCsPropValues->PropTypeSet, sizeof (CSIDENTIFIER) );
if( OutBufLen >= StandardSizeOfDefaultValues )
{
pCsPropMembersHeader = reinterpret_cast<PCSPROPERTY_MEMBERSHEADER>( pCsPropDesc + 1 );
// Copy the CSPROPERTY_MEMBERSHEADER
memcpy( pCsPropMembersHeader, &(pDevProp->pCsPropValues->MembersList[1]), sizeof (CSPROPERTY_MEMBERSHEADER) );
// Copy the LONG (default value)
memcpy( pCsPropMembersHeader + 1, pDevProp->pCsPropValues->MembersList[1].Members, sizeof (LONG) );
*pdwError = ERROR_SUCCESS;
}
else
{
DEBUGMSG( ZONE_IOCTL|ZONE_ERROR, (_T("CAM_IOControl(%08x): Not all available data could be written\r\n"), this ) );
*pdwError = ERROR_MORE_DATA;
}
}
else if ( OutBufLen >= sizeof(ULONG) )
{
// We just need to return AccessFlags. For this null driver, all PROCAMP properties support get/set/default support
DEBUGMSG( ZONE_IOCTL, (_T("CAM_IOControl(%08x): Returning AccessFlags\r\n"), this ) );
*pdwBytesTransferred = sizeof(ULONG);
if ( NULL == ValidateBuffer( pOutBuf, OutBufLen, sizeof (ULONG), pdwError ) )
{
*pdwError = ERROR_MORE_DATA;
return;
}
*((PULONG)pOutBuf) = static_cast<ULONG>( CSPROPERTY_TYPE_GET | CSPROPERTY_TYPE_SET | CSPROPERTY_TYPE_DEFAULTVALUES );
*pdwError = ERROR_SUCCESS;
}
else
{
DEBUGMSG( ZONE_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -