⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cameradevice.cpp.svn-base

📁 PXA270 平台 Windows Mobile 5 摄像头驱动
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
                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 + -