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

📄 cameradevice.cpp

📁 三星2440原版bsp
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                    pCsDataRangeVideo = reinterpret_cast<PCS_DATARANGE_VIDEO>(pCsDataRangeVideo + 1) ;
                }
            }
            break;
        }

        case CSPROPERTY_PIN_CATEGORY:
        {
            RETAILMSG( RETAIL_ON, (_T("CAM_IOControl(%08x): CSPROPERTY_PIN_CATEGORY\r\n"), this ) );

            if ( NULL == ( pCsPin = reinterpret_cast<PCSP_PIN>( ValidateBuffer( pInBuf, InBufLen, sizeof (CSP_PIN), &dwError ) ) ) )
            {
                break;
            }

            lPinId = pCsPin->PinId;
            if ( false == IsValidPin( lPinId ) )
            {
                RETAILMSG( RETAIL_ON, (_T("CAM_IOControl(%08x): Invalid PinId\r\n"), this ) );
                break;
            }

            *pdwBytesTransferred = sizeof( GUID );

            if( OutBufLen < *pdwBytesTransferred )
            {
                dwError = ERROR_MORE_DATA;
                break;
            }

            if ( CeSafeCopyMemory( pOutBuf, &m_PinVideoFormat[lPinId].categoryGUID, sizeof( GUID ) ))
            {
                dwError = ERROR_SUCCESS;
            }

            break;
        }

        case CSPROPERTY_PIN_NAME:
        {
            RETAILMSG( RETAIL_ON, (_T("CAM_IOControl(%08x): Property CSPROPERTY_PIN_NAME\r\n"), this ) );

            if ( NULL == ( pCsPin = reinterpret_cast<PCSP_PIN>( ValidateBuffer( pInBuf, InBufLen, sizeof(CSP_PIN), &dwError ) ) ) )
            {
                break;
            }

            lPinId = pCsPin->PinId;

            if ( false == IsValidPin( lPinId ) )
            {
                RETAILMSG( RETAIL_ON, (_T("CAM_IOControl(%08x): Invalid PinId\r\n"), this ) );
                break;
            }

            *pdwBytesTransferred = ( wcslen(g_wszPinNames[lPinId] ) + 1 ) * sizeof( g_wszPinNames[0][0] );

            if( OutBufLen < *pdwBytesTransferred )
            {
                dwError = ERROR_MORE_DATA;
                break;
            }

            if( CeSafeCopyMemory( pOutBuf, g_wszPinNames[lPinId], *pdwBytesTransferred ))
            {
                dwError = ERROR_SUCCESS;
            }

            break;
        }

        case CSPROPERTY_PIN_DEVICENAME:
        {
            RETAILMSG( RETAIL_ON, (_T("CAM_IOControl(%08x): Property CSPROPERTY_PIN_NAME\r\n"), this ) );

            if ( NULL == ( pCsPin = reinterpret_cast<PCSP_PIN>( ValidateBuffer( pInBuf, InBufLen, sizeof(CSP_PIN), &dwError ) ) ) )
            {
                break;
            }

            lPinId = pCsPin->PinId;
            if ( false == IsValidPin( lPinId ) )
            {
                RETAILMSG( RETAIL_ON, (_T("CAM_IOControl(%08x): Invalid PinId\r\n"), this ) );
                break;
            }

            *pdwBytesTransferred = ( wcslen( g_wszPinDeviceNames[lPinId] ) + 1 ) * sizeof( g_wszPinDeviceNames[0][0] ) ;

            if( OutBufLen < *pdwBytesTransferred )
            {
                dwError = ERROR_MORE_DATA;
                break;
            }

            if( CeSafeCopyMemory( pOutBuf, g_wszPinDeviceNames[lPinId], *pdwBytesTransferred ))
            {
                dwError = ERROR_SUCCESS;
            }

            break;
        }

        default:
        {
            RETAILMSG( RETAIL_ON, (_T("CAM_IOControl(%08x): Invalid Property\r\n"), this ) );

            break;
        }
    }

    return dwError;
}

DWORD
CCameraDevice::AdapterHandleVidProcAmpRequests(
    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

    RETAILMSG( RETAIL_ON, (_T("CAM_IOControl(%08x): HandleVidProcAmpRequests\r\n"), this ) );

    DWORD                      dwError                 = ERROR_INVALID_PARAMETER;
    LONG                       lValue                  = 0;
    PDEV_PROPERTY              pDevProp                = NULL;
    PCSPROPERTY_VIDEOPROCAMP_S pCsPropVidProcAmpOutput = NULL;
    PCSPROPERTY_VIDEOPROCAMP_S pCsPropVidProcAmpInput  = NULL;
    PCSPROPERTY_DESCRIPTION    pCsPropDesc             = NULL;
    PCSPROPERTY_VALUES         pCsPropValues           = NULL;

    CSPROPERTY                 csProp = {0};

    if( !CeSafeCopyMemory( &csProp, pInBuf, sizeof( CSPROPERTY )))
    {
        return dwError;
    }

    *pdwBytesTransferred = 0;

    // we support PROPSETID_Pin, so just return success
    if ( CSPROPERTY_TYPE_SETSUPPORT == csProp.Flags )
    {
        return ERROR_SUCCESS;
    }

    // TODO: This check would only make sense once we have all the PROCAMP properties defined.
    //       The initial checkin supports property values for brightness, sharpness, hue, saturation
    //       and whitebalance. Value structures for the rest of the properties are initialized to 0 in constructor.

    if ( csProp.Id < CSPROPERTY_VIDEOPROCAMP_BRIGHTNESS || csProp.Id > ENUM_GAIN )
    {
        RETAILMSG( RETAIL_ON, (_T("CAM_IOControl(%08x): Invalid Property\r\n"), this ) );

        return dwError;
    }

    pDevProp = m_DevProps + csProp.Id;

    switch( csProp.Flags )
    {
    case CSPROPERTY_TYPE_GET:


        if ( FALSE == pDevProp->fGetSupported )
        {
            SetLastError(ERROR_INVALID_OPERATION);
            break;
        }

        *pdwBytesTransferred = sizeof(CSPROPERTY_VIDEOPROCAMP_S);
        if ( NULL == ( pCsPropVidProcAmpInput = reinterpret_cast<PCSPROPERTY_VIDEOPROCAMP_S>( ValidateBuffer( pInBuf, InBufLen, sizeof (CSPROPERTY_VIDEOPROCAMP_S), &dwError ) ) ) )
        {
            return dwError;
        }

        if( NULL == ( pCsPropVidProcAmpOutput = reinterpret_cast<PCSPROPERTY_VIDEOPROCAMP_S>( ValidateBuffer( pOutBuf, OutBufLen, *pdwBytesTransferred, &dwError ) ) ) )
        {
            dwError = ERROR_MORE_DATA;
            break;
        }

        //Copy the CSPROPERTY structure to the output buffer just in case!
        memcpy( pCsPropVidProcAmpOutput, pCsPropVidProcAmpInput, sizeof(CSPROPERTY) );

        pCsPropVidProcAmpOutput->Value        = pDevProp->ulCurrentValue;
        pCsPropVidProcAmpOutput->Flags        = pDevProp->ulFlags;
        pCsPropVidProcAmpOutput->Capabilities = pDevProp->ulCapabilities;

        dwError = ERROR_SUCCESS;
        break;

    case CSPROPERTY_TYPE_SET:

        if ( NULL == ( pCsPropVidProcAmpInput = reinterpret_cast<PCSPROPERTY_VIDEOPROCAMP_S>( ValidateBuffer( pInBuf, InBufLen, sizeof (CSPROPERTY_VIDEOPROCAMP_S), &dwError ) ) ) )
        {
            return dwError;
        }

        if ( FALSE == pDevProp->fSetSupported )
        {
            SetLastError(ERROR_INVALID_OPERATION);
            break;
        }

        // CSPROPERTY_VIDEOPROCAMP_FLAGS_MANUAL and CSPROPERTY_VIDEOPROCAMP_FLAGS_AUTO are mutually exclusive
        if( pCsPropVidProcAmpInput->Flags != CSPROPERTY_VIDEOPROCAMP_FLAGS_MANUAL && 
            pCsPropVidProcAmpInput->Flags != CSPROPERTY_VIDEOPROCAMP_FLAGS_AUTO )
        {
            SetLastError(ERROR_INVALID_OPERATION);
            break;
        }

        lValue = pCsPropVidProcAmpInput->Value;

        if( pCsPropVidProcAmpInput->Flags & ~pDevProp->ulCapabilities )
        {
            break;
        }

        if( CSPROPERTY_VIDEOPROCAMP_FLAGS_MANUAL == pCsPropVidProcAmpInput->Flags )
        {
            if ( lValue < pDevProp->pRangeNStep->Bounds.SignedMinimum ||
                lValue > pDevProp->pRangeNStep->Bounds.SignedMaximum ||
                0 != ((lValue - pDevProp->pRangeNStep->Bounds.SignedMinimum) % pDevProp->pRangeNStep->SteppingDelta) )
            {
                break;
            }
            pDevProp->ulCurrentValue = lValue;
        }

        pDevProp->ulFlags        = pCsPropVidProcAmpInput->Flags;

        dwError = ERROR_SUCCESS;
        break;

    case CSPROPERTY_TYPE_DEFAULTVALUES:

        GetDefaultValues( pOutBuf, OutBufLen, pdwBytesTransferred, pDevProp, &dwError );
        break;

    case CSPROPERTY_TYPE_BASICSUPPORT:

        GetBasicSupportInfo( pOutBuf, OutBufLen, pdwBytesTransferred, pDevProp, &dwError );
        break;

    default :
        RETAILMSG(RETAIL_ON, (_T("CAM_IOControl(%08x): Invalid Request\r\n"), this));
        return dwError;
    }

    return dwError;
}

DWORD
CCameraDevice::AdapterHandleCamControlRequests(
    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

    RETAILMSG( RETAIL_ON, ( _T("CAM_IOControl(%08x): HandleCamControlRequests\r\n"), this ) );
    DWORD dwError = ERROR_INVALID_PARAMETER;
    long  lValue  = 0;
    long  lFlags  = 0;
    PDEV_PROPERTY pDevProp = NULL;
    PCSPROPERTY_CAMERACONTROL_S pCsPropCamControlOutput = NULL;
    PCSPROPERTY_CAMERACONTROL_S pCsPropCamControlInput  = NULL;

    CSPROPERTY   csProp = {0};
    if( !CeSafeCopyMemory( &csProp, pInBuf, sizeof( CSPROPERTY )))
    {
        return dwError;
    }

    *pdwBytesTransferred = 0;

    // we support PROPSETID_Pin, so just return success
    if ( CSPROPERTY_TYPE_SETSUPPORT == csProp.Flags )
    {
        return ERROR_SUCCESS;
    }

    // TODO :    This check would only make sense once we have all the CAMERACONTROL properties defined.
    //            The initial checkin supports property values for Zoom and Flash.
    //            Value structures for the rest of the properties are initialized to 0 in constructor.

    if ( csProp.Id < CSPROPERTY_CAMERACONTROL_PAN || csProp.Id > CSPROPERTY_CAMERACONTROL_FLASH )
    {
        RETAILMSG(RETAIL_ON, (_T("CAM_IOControl(%08x): Invalid Property\r\n"), this));
        return dwError;
    }

    pDevProp = m_DevProps + (csProp.Id + NUM_VIDEOPROCAMP_ITEMS);

    switch( csProp.Flags )
    {
    case CSPROPERTY_TYPE_GET:

        if ( NULL == ( pCsPropCamControlInput = reinterpret_cast<PCSPROPERTY_CAMERACONTROL_S>( ValidateBuffer( pInBuf, InBufLen, sizeof(CSPROPERTY_CAMERACONTROL_S), &dwError ) ) ) )
        {
            return dwError;
        }

        if ( FALSE == pDevProp->fGetSupported )
        {
            SetLastError(ERROR_INVALID_OPERATION);
            break;
        }

        *pdwBytesTransferred = sizeof(CSPROPERTY_CAMERACONTROL_S);
        if( NULL == ( pCsPropCamControlOutput = reinterpret_cast<PCSPROPERTY_CAMERACONTROL_S>(ValidateBuffer( pOutBuf, OutBufLen, *pdwBytesTransferred, &dwError ) ) ) )
        {
            dwError = ERROR_MORE_DATA;
            break;
        }

        //Copy the CSPROPERTY structure to the output buffer just in case!
        memcpy( pCsPropCamControlOutput, pCsPropCamControlInput, sizeof(CSPROPERTY) );

        pCsPropCamControlOutput->Value         = pDevProp->ulCurrentValue;
        pCsPropCamControlOutput->Flags         = pDevProp->ulFlags;
        pCsPropCamControlOutput->Capabilities  = pDevProp->ulCapabilities;

        dwError = ERROR_SUCCESS;
        break;

    case CSPROPERTY_TYPE_SET:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -