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

📄 cameradevice.cpp

📁 三星2440原版bsp
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    // TODO : Set the following caps to 0 for this null DD.
    m_PinVideoCaps[CAPTURE].ulVideoControlCaps     = DefaultVideoControlCaps[CAPTURE];
    m_PinVideoCaps[STILL].ulVideoControlCaps       = DefaultVideoControlCaps[STILL];
    // Note PREVIEW control caps are the same, so we don't differentiate
    m_PinVideoCaps[PREVIEW].ulVideoControlCaps     = DefaultVideoControlCaps[PREVIEW];

    return true;
}


bool
CCameraDevice::BindApplicationProc(
    HANDLE hCurrentProc
    )
{
    if ( NULL != m_hCallerProcess )
    {
        return false;
    }

    m_ulCTypes = 3;

    // Check the registry to see what format and number of pins we support.
    HKEY hKey = NULL;

    if ( ERROR_SUCCESS == RegOpenKeyEx( HKEY_LOCAL_MACHINE, L"Drivers\\BuiltIn\\Camera", 0, 0, &hKey ) )
    {
        DWORD dwType  = 0;
        DWORD dwSize  = sizeof ( DWORD );
        DWORD dwValue = 0;

        WCHAR szGuid[MAX_PATH];
        GUID  guid;

        // Find out if we should be using some other number of pins. The only
        // valid options are 2 or 3. Default to 3.
        if ( ERROR_SUCCESS == RegQueryValueEx( hKey, L"PinCount", 0, &dwType, (BYTE *)&dwValue, &dwSize ) )
        {
            if ( REG_DWORD == dwType
                 && sizeof ( DWORD ) == dwSize
                 && 2 == dwValue )
            {
                m_ulCTypes = 2;
            }
        }

        if ( ERROR_SUCCESS == RegQueryValueEx( hKey, L"StreamGuid0", 0, &dwType, (BYTE *)szGuid, &dwSize ) )
        {
            if ( REG_SZ == dwType
                 && ConvertStringToGuid( szGuid, &guid ) )
            {
                DCAM_StreamMode_0.DataRange.SubFormat = guid;
            }
        }

        if ( ERROR_SUCCESS == RegQueryValueEx( hKey, L"StreamGuid1", 0, &dwType, (BYTE *)szGuid, &dwSize ) )
        {
            if ( REG_SZ == dwType
                 && ConvertStringToGuid( szGuid, &guid ) )
            {
                DCAM_StreamMode_1.DataRange.SubFormat = guid;
            }
        }

        if ( ERROR_SUCCESS == RegQueryValueEx( hKey, L"StreamGuid2", 0, &dwType, (BYTE *)szGuid, &dwSize ) )
        {
            if ( REG_SZ == dwType
                 && ConvertStringToGuid( szGuid, &guid ) )
            {
                DCAM_StreamMode_2.DataRange.SubFormat = guid;
            }
        }

        if ( ERROR_SUCCESS == RegQueryValueEx( hKey, L"StreamGuid3", 0, &dwType, (BYTE *)szGuid, &dwSize ) )
        {
            if ( REG_SZ == dwType
                 && ConvertStringToGuid( szGuid, &guid ) )
            {
                DCAM_StreamMode_3.DataRange.SubFormat = guid;
            }
        }

        if ( ERROR_SUCCESS == RegQueryValueEx( hKey, L"StreamGuid4", 0, &dwType, (BYTE *)szGuid, &dwSize ) )
        {
            if ( REG_SZ == dwType
                 && ConvertStringToGuid( szGuid, &guid ) )
            {
                DCAM_StreamMode_4.DataRange.SubFormat = guid;
            }
        }

        if ( ERROR_SUCCESS == RegQueryValueEx( hKey, L"StreamGuid6", 0, &dwType, (BYTE *)szGuid, &dwSize ) )
        {
            if ( REG_SZ == dwType
                 && ConvertStringToGuid( szGuid, &guid ) )
            {
                DCAM_StreamMode_6.DataRange.SubFormat = guid;
            }
        }

        RegCloseKey( hKey );
    }

    m_hCallerProcess = hCurrentProc;

    return true;
}


bool
CCameraDevice::UnBindApplicationProc( )
{
    RETAILMSG( RETAIL_ON, ( _T("CAM_Close: Unbind application from camera device\r\n") ) );

    m_hCallerProcess = NULL;

    return true;
}

bool
CCameraDevice::IsValidPin(
    ULONG ulPinId
    )
{
    if ( ulPinId >= m_ulCTypes )
    {
        return false;
    }

    return true;
}

bool
CCameraDevice::IncrCInstances(
    ULONG        ulPinId,
    CPinDevice * pPinDev
    )
{
    if ( false == IsValidPin( ulPinId ) || 1 == m_StrmInstances[ulPinId].ulCInstances )
    {
        return false;
    }
    else
    {
        m_StrmInstances[ulPinId].ulCInstances++;
        m_StrmInstances[ulPinId].pPinDev = pPinDev;
    }

    return true;
}

bool
CCameraDevice::DecrCInstances(
    ULONG ulPinId
    )
{
    if ( false == IsValidPin( ulPinId ) || 0 == m_StrmInstances[ulPinId].ulCInstances )
    {
        return false;
    }
    else
    {
        m_StrmInstances[ulPinId].ulCInstances--;
        m_StrmInstances[ulPinId].pPinDev = NULL;
    }

    return true;
}

bool
CCameraDevice::PauseCaptureAndPreview( void )
{
	RETAILMSG( RETAIL_ON, ( _T("+-CCameraDevice::PauseCaptureAndPreview\r\n") ) );
    if ( PREVIEW < m_ulCTypes )
    {
        if ( NULL != m_StrmInstances[PREVIEW].pPinDev )
        {
            m_StrmInstances[PREVIEW].pPinDev->SetState( CSSTATE_PAUSE, &m_StrmInstances[PREVIEW].CsPrevState );
        }
    }

    if ( NULL != m_StrmInstances[CAPTURE].pPinDev )
    {
        m_StrmInstances[CAPTURE].pPinDev->SetState( CSSTATE_PAUSE, &m_StrmInstances[CAPTURE].CsPrevState );
    }

    return true;
}

bool
CCameraDevice::RevertCaptureAndPreviewState( void )
{
	RETAILMSG( RETAIL_ON, ( _T("+-CCameraDevice::RevertCaptureAndPreviewState\r\n") ) );
    if ( PREVIEW < m_ulCTypes )
    {
        m_StrmInstances[PREVIEW].pPinDev->SetState( m_StrmInstances[PREVIEW].CsPrevState, NULL );
    }

    m_StrmInstances[CAPTURE].pPinDev->SetState( m_StrmInstances[CAPTURE].CsPrevState, NULL );

    return true;
}

void CCameraDevice::GetCurrentCBufferAddress(DWORD *pdwYAddress,
						DWORD *pdwCBAddress, DWORD *pdwCRAddress)
{

	RETAILMSG( 0/*RETAIL_ON*/, ( _T("+-CCameraDevice::GetCurrentCBufferAddress\r\n") ) );
	//return the latest codec buffer addresses
	Lock(m_csIST);
	*pdwYAddress 	= m_nYAddress;
	*pdwCBAddress	= m_nCBAddress;
	*pdwCRAddress	= m_nCRAddress;
	Unlock(m_csIST);
	RETAILMSG( 0/*RETAIL_ON*/, ( _T("-YAddress 0x%x\n"), m_nYAddress ) );
	RETAILMSG( 0/*RETAIL_ON*/, ( _T("-CBAddress 0x%x\n"), m_nCBAddress) );
	RETAILMSG( 0/*RETAIL_ON*/, ( _T("-CRAddress 0x%x\n"), m_nCRAddress) );
	RETAILMSG( 0/*RETAIL_ON*/, ( _T("--CCameraDevice::GetCurrentCBufferAddress\r\n") ) );
}



void CCameraDevice::GetCurrentPBufferAddress(DWORD *pdwPAddress)
{
	RETAILMSG( 0/*RETAIL_ON*/, ( _T("+-CCameraDevice::GetCurrentPBufferAddress\r\n") ) );
	//return the latest preview buffer address
	Lock(m_csIST);
	*pdwPAddress 	= m_nRGBAddress;
	Unlock(m_csIST);
	RETAILMSG( 0/*RETAIL_ON*/, ( _T("-RGBAddress 0x%x\n"), m_nRGBAddress) );
	RETAILMSG( 0/*RETAIL_ON*/, ( _T("--CCameraDevice::GetCurrentPBufferAddress\r\n") ) );
}

bool
CCameraDevice::GetPinFormat(
    ULONG                 ulPinId,
    ULONG                 ulIndex,
    PCS_DATARANGE_VIDEO * ppCsDataRangeVid
    )
{
	RETAILMSG( RETAIL_ON, ( _T("+CCameraDevice::GetPinFormat: ulPinId=%d, ulIndex=%d\r\n"),ulPinId, ulIndex) );
    if ( 0 >= ulIndex || ulIndex > m_PinVideoFormat[ulPinId].ulAvailFormats )
    {
 		RETAILMSG( RETAIL_ON, ( _T("------------------->CCameraDevice::GetPinFormat: ERROR\r\n")) );
        return false;
    }

    *ppCsDataRangeVid = m_PinVideoFormat[ulPinId].pCsDataRangeVideo[ulIndex-1];
	RETAILMSG( RETAIL_ON, ( _T("-CCameraDevice::GetPinFormat\r\n")) );

    return true;
}

void CCameraDevice::CameraEnable()
{
	m_rS2440INT->INTMSK &= ~( 1 << IRQ_CAM );
	m_rS2440INT->INTSUBMSK &= ~(( 1 << IRQ_SUB_CAM_P )|( 1 << IRQ_SUB_CAM_C ));
	Camif_Capture(CAPTURE_ON, CAPTURE_ON);
	RETAILMSG( RETAIL_ON, ( _T("-CCameraDevice::CameraEnable\r\n")) );

}



void CCameraDevice::CameraDisable()
{
	m_rS2440INT->INTMSK |= ( 1 << IRQ_CAM );
	m_rS2440INT->INTSUBMSK |= (( 1 << IRQ_SUB_CAM_P )|( 1 << IRQ_SUB_CAM_C ));

	//clear the pending interrupts
	if (m_rS2440INT->INTPND & ( 1 << IRQ_CAM ))
		m_rS2440INT->INTPND |= ( 1 << IRQ_CAM );
	m_rS2440INT->SRCPND |= ( 1 << IRQ_CAM );
	m_rS2440INT->SUBSRCPND |= (( 1 << IRQ_SUB_CAM_P )|( 1 << IRQ_SUB_CAM_C ));

	Camif_Capture(CAPTURE_OFF, CAPTURE_OFF);
	RETAILMSG( RETAIL_ON, ( _T("-CCameraDevice::CameraDisable\r\n")) );

	//DisplayEnable = 0;

	DRIVER_PREVIEW_ENABLE = 2;
}

bool
CCameraDevice::AdapterCompareFormat(
    ULONG                       ulPinId,
    const PCS_DATARANGE_VIDEO   pCsDataRangeVideoToCompare,
    PCS_DATARANGE_VIDEO       * ppCsDataRangeVideoMatched,
    bool                        fDetailedComparison
    )
{
	RETAILMSG( RETAIL_ON, ( _T("++CCameraDevice::AdapterCompareFormat drv: ulPinId=%d\r\n"),ulPinId ) );
    for ( ULONG ulCount = 0 ; ulCount < m_PinVideoFormat[ulPinId].ulAvailFormats ; ulCount++ )
    {
        PCS_DATARANGE_VIDEO pCsDataRangeVideo = m_PinVideoFormat[ulPinId].pCsDataRangeVideo[ulCount];
		RETAILMSG( RETAIL_ON, ( _T("++CCameraDevice::AdapterCompareFormat: ulCount=%d\r\n"),ulCount ) );

        if ( false == AdapterCompareGUIDsAndFormatSize( reinterpret_cast<PCSDATARANGE>( pCsDataRangeVideo ),
                                                        reinterpret_cast<PCSDATARANGE>( pCsDataRangeVideoToCompare ) ) )
        {
 		   RETAILMSG( RETAIL_ON, ( _T("------------->1\r\n") ) );
           continue;
        }

        if ( true == fDetailedComparison )
        {
            if ( ( pCsDataRangeVideoToCompare->bFixedSizeSamples != pCsDataRangeVideo->bFixedSizeSamples )
                  || ( pCsDataRangeVideoToCompare->bTemporalCompression   != pCsDataRangeVideo->bTemporalCompression )
                  || ( pCsDataRangeVideoToCompare->StreamDescriptionFlags != pCsDataRangeVideo->StreamDescriptionFlags )
                  || ( pCsDataRangeVideoToCompare->MemoryAllocationFlags  != pCsDataRangeVideo->MemoryAllocationFlags ) )
            {
 				RETAILMSG( RETAIL_ON, ( _T("++++++++++++++++++++++++++++>2\r\n") ) );
				RETAILMSG( RETAIL_ON, ( _T("bFixedSizeSamples: %d, %d\r\n"), pCsDataRangeVideoToCompare->bFixedSizeSamples,pCsDataRangeVideo->bFixedSizeSamples) );
				RETAILMSG( RETAIL_ON, ( _T("bTemporalCompression: %d, %d\r\n"), pCsDataRangeVideoToCompare->bTemporalCompression,pCsDataRangeVideo->bTemporalCompression) );
				RETAILMSG( RETAIL_ON, ( _T("StreamDescriptionFlags: %d, %d\r\n"), pCsDataRangeVideoToCompare->StreamDescriptionFlags,pCsDataRangeVideo->StreamDescriptionFlags) );
				RETAILMSG( RETAIL_ON, ( _T("MemoryAllocationFlags: %d, %d\r\n"), pCsDataRangeVideoToCompare->MemoryAllocationFlags,pCsDataRangeVideo->MemoryAllocationFlags) );

 				RETAILMSG( RETAIL_ON, ( _T("---------------------------->2\r\n") ) );
                continue;
            }

            if( pCsDataRangeVideoToCompare->VideoInfoHeader.AvgTimePerFrame < pCsDataRangeVideo->ConfigCaps.MinFrameInterval  ||
                pCsDataRangeVideoToCompare->VideoInfoHeader.AvgTimePerFrame > pCsDataRangeVideo->ConfigCaps.MaxFrameInterval  )
            {
 				RETAILMSG( RETAIL_ON, ( _T("------------->3\r\n") ) );
                continue;
            }

            // Real Camera drivers can now do ConfigCaps related intersection. Null driver doesn't do such comparison
            if ( 0 != memcmp(&pCsDataRangeVideoToCompare->VideoInfoHeader.bmiHeader, &pCsDataRangeVideo->VideoInfoHeader.bmiHeader, sizeof (pCsDataRangeVideo->VideoInfoHeader.bmiHeader) ) )
            {
 				RETAILMSG( RETAIL_ON, ( _T("------------->4\r\n") ) );
                continue;
            }

        }

⌨️ 快捷键说明

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