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

📄 cameradriver.cpp

📁 三星2440原版bsp
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/*++


Module Name:

    CameraDriver.cpp

Abstract:

    Template camera driver for DSHOW

Notes:
    

Revision History:

--*/

#include <windows.h>
#include <devload.h>
#include <nkintr.h>

#define CAMINTERFACE
#include "CameraDriver.h"


#define RETAIL_ON	1
extern DWORD dwDisplayTimeout;
CAMINFO sCAMINFO;

extern UCHAR DRIVER_PREVIEW_ENABLE;

//TODO : More investigation needed for AdvertiseInterface

EXTERN_C
DWORD
CIS_Init(
    VOID * pContext
    )
{    
    CAMERADEVICE * pCamDev = NULL;
    DEBUGMSG(ZONE_INIT, (_T("CIS_Init: context %s\n"), pContext));
    RETAILMSG(1, (_T("Venus CIS_Init: context %s\n"), pContext));
    
    if( OEM_CERTIFY_TRUST != CeGetCallerTrust() )
    {
        SetLastError(ERROR_ACCESS_DENIED);
    }
    else
    {
        pCamDev = new CAMERADEVICE;
        
        if ( NULL != pCamDev )
        {
            // NOTE: real drivers would need to validate pContext before dereferencing the pointer
            if ( false == pCamDev->Initialize( pContext ) )
            {
                SetLastError( ERROR_INVALID_HANDLE );
                SAFEDELETE( pCamDev );
                DEBUGMSG( ZONE_INIT|ZONE_ERROR, ( _T("CIS_Init: Initialization Failed") ) );
            }
        }
        else
        {
            SetLastError( ERROR_OUTOFMEMORY );
        }
    }    
    DEBUGMSG( ZONE_INIT, ( _T("CIS_Init: returning 0x%08x\r\n"), reinterpret_cast<DWORD>( pCamDev ) ) );

    return reinterpret_cast<DWORD>( pCamDev );
}


EXTERN_C
BOOL
CIS_Deinit(
    DWORD dwContext
    )
{
    DEBUGMSG( ZONE_INIT, ( _T("CIS_Deinit\r\n") ) );

    CAMERADEVICE * pCamDevice = reinterpret_cast<CAMERADEVICE *>( dwContext );
    SAFEDELETE( pCamDevice );

    return TRUE;
}


EXTERN_C
BOOL
CIS_IOControl(
    DWORD   dwContext,
    DWORD   Ioctl,
    UCHAR * pInBufUnmapped,
    DWORD   InBufLen, 
    UCHAR * pOutBufUnmapped,
    DWORD   OutBufLen,
    DWORD * pdwBytesTransferred
   )
{
	RETAILMSG( RETAIL_ON, ( _T("+CIS_IOControl(%08x): IOCTL:0x%x, InBuf:0x%x, InBufLen:%d, OutBuf:0x%x, OutBufLen:0x%x)\r\n"), dwContext, Ioctl, pInBufUnmapped, InBufLen, pOutBufUnmapped, OutBufLen ) );

	UCHAR * pInBuf = NULL;
	UCHAR * pOutBuf = NULL;
	DWORD dwErr = ERROR_SUCCESS;//ERROR_INVALID_PARAMETER;
	BOOL  bRc   = FALSE;
	static unsigned int time=0,old_time=0;
	CSPROPERTY       * pCsProp = NULL;

	if(IOCTL_CS_PROPERTY == Ioctl)
	{
		if ( ( NULL == pInBufUnmapped )
	     		|| ( InBufLen < sizeof ( CSPROPERTY ) )
	     		|| ( NULL == pdwBytesTransferred ) )
		{
		    	SetLastError( dwErr );
			RETAILMSG(1, (TEXT("CIS_IOControl: Invalid input parameters\r\n")));
		    	return bRc;
		}

		pInBuf = (UCHAR*) MapCallerPtr( pInBufUnmapped, InBufLen );
		if(( pInBuf == NULL ) && ( pInBufUnmapped != NULL ))
		{
		    	RETAILMSG(1, ( _T("CIS_IOControl(%08x): CIS_IOControl. MapCallerPtr failed for incoming buffer.\r\n"), dwContext ) );

		    	return ERROR_INVALID_PARAMETER;
		}

		pOutBuf = (UCHAR*) MapCallerPtr( pOutBufUnmapped, OutBufLen );
		if (( NULL == pOutBuf ) && ( pOutBufUnmapped != NULL ))
		{
		    	RETAILMSG( 1, ( _T("CIS_IOControl(%08x): CIS_IOControl. MapCallerPtr failed for outgoing buffer.\r\n"), dwContext ) );

		    	return ERROR_INVALID_PARAMETER;
		}

		if ( NULL == MapCallerPtr( pdwBytesTransferred, sizeof ( DWORD ) ) )
		{
		    	RETAILMSG( 1, ( _T("CIS_IOControl(%08x): CIS_IOControl. MapCallerPtr failed for dwBytesTransferred.\r\n"), dwContext ) );

		    	return ERROR_INVALID_PARAMETER;
		}

		pCsProp = reinterpret_cast<CSPROPERTY *>( MapCallerPtr( pInBuf, sizeof ( CSPROPERTY ) ) );

		if ( NULL == pCsProp )
		{
		    	RETAILMSG( 1, (_T("CIS_IOControl(%08x): MapCallerPtr failed for input buffer.\r\n"), dwContext ) );

		    	return ERROR_INVALID_PARAMETER;
		}
	}

	RETAILMSG(RETAIL_ON, (TEXT("CIS_IOControl\r\n")));

	CAMERAOPENHANDLE * pCamOpenHandle = reinterpret_cast<CAMERAOPENHANDLE *>( dwContext );

	CAMERADEVICE     * pCamDevice     = pCamOpenHandle->pCamDevice;
	if(NULL == pCamDevice)
	{
		RETAILMSG(1, (TEXT("CIS_IOControl: pCamDevice is not valid\r\n")));
		return ERROR_INVALID_PARAMETER;
	}
    
    switch ( Ioctl )
    {
        case IOCTL_CS_PROPERTY:
        {
            DEBUGMSG( ZONE_IOCTL, ( _T("CIS_IOControl(%08x): IOCTL_CS_PROPERTY\r\n"), dwContext ) );

            __try 
            {
                if ( TRUE == IsEqualGUID( pCsProp->Set, CSPROPSETID_Pin ) )
                {   
                    dwErr = pCamDevice->AdapterHandlePinRequests( pInBuf, InBufLen, pOutBuf, OutBufLen, pdwBytesTransferred );
                }
                else if ( TRUE == IsEqualGUID( pCsProp->Set, CSPROPSETID_VERSION ) )
                {
                    dwErr = pCamDevice->AdapterHandleVersion( pOutBuf, OutBufLen, pdwBytesTransferred );
                }
                else if ( TRUE == IsEqualGUID( pCsProp->Set, PROPSETID_VIDCAP_VIDEOPROCAMP ) )
                {   
                    dwErr = pCamDevice->AdapterHandleVidProcAmpRequests( pInBuf,InBufLen, pOutBuf, OutBufLen, pdwBytesTransferred );
                }
                else if ( TRUE == IsEqualGUID( pCsProp->Set, PROPSETID_VIDCAP_CAMERACONTROL ) )
                {   
                    dwErr = pCamDevice->AdapterHandleCamControlRequests( pInBuf,InBufLen, pOutBuf, OutBufLen, pdwBytesTransferred );
                }
                else if ( TRUE == IsEqualGUID( pCsProp->Set, PROPSETID_VIDCAP_VIDEOCOMPRESSION ) )
                {   
                    dwErr = pCamDevice->AdapterHandleCompressionRequests( pInBuf,InBufLen, pOutBuf, OutBufLen, pdwBytesTransferred );
                }
                else if ( TRUE == IsEqualGUID( pCsProp->Set, PROPSETID_VIDCAP_VIDEOCONTROL ) )
                {   
                    dwErr = pCamDevice->AdapterHandleVideoControlRequests( pInBuf,InBufLen, pOutBuf, OutBufLen, pdwBytesTransferred );
                }
                else if ( TRUE == IsEqualGUID( pCsProp->Set, PROPSETID_VIDCAP_DROPPEDFRAMES) )
                {   
                    dwErr = pCamDevice->AdapterHandleDroppedFramesRequests( pInBuf,InBufLen, pOutBuf, OutBufLen, pdwBytesTransferred );
                }
                else
                {
                    DEBUGMSG( ZONE_IOCTL, ( _T("CIS_IOControl(%08x): Unsupported PropertySet Request%u\r\n"), dwContext, pCsProp->Set ) );
                    dwErr = ERROR_NOT_SUPPORTED;
                }
            }
            __except ( EXCEPTION_EXECUTE_HANDLER )
            {
                DEBUGMSG( ZONE_IOCTL, ( _T("CIS_IOControl(%08x):Exception in IOCTL_CS_PROPERTY"), dwContext ) );
            }

            break;
        }

		case IOCTL_CAM_SHOW :
			RETAILMSG(RETAIL_ON,(TEXT("CAMERA:IOCTL_CAM_SHOW(%x)\r\n"),InBufLen));
			break;

		case IOCTL_CAM_HIDE :
			RETAILMSG(RETAIL_ON,(TEXT("CAMERA:IOCTL_CAM_HIDE\r\n")));
			break;

		case IOCTL_CAM_SETPOS :
			time = GetTickCount();
			RETAILMSG(RETAIL_ON,(TEXT("Capture time:%d msec\r\n"), (time)));
			old_time = time;
			break;

		case CAM_IOCTL_MOVIE_START:			// for MPEG4
		case IOCTL_CAM_CONT :
			RETAILMSG(RETAIL_ON,(TEXT("CAMERA:IOCTL_CAM_CONT\r\n")));
/*
			// Enable camera interrupt
			pCamDevice->m_rS2440INT->INTMSK &= ~( 1 << IRQ_CAM );
			pCamDevice->m_rS2440INT->INTSUBMSK &= ~(( 1 << IRQ_SUB_CAM_P )|( 1 << IRQ_SUB_CAM_C ));

			pCamDevice->Camif_Capture(CAPTURE_ON, CAPTURE_ON);
*/
			pCamDevice->CameraEnable();
			dwDisplayTimeout = INFINITE;

			pCamDevice->m_dwFrameCount = 0;		// for MPEG4
			break;

		case CAM_IOCTL_MOVIE_STOP:		// for MPEG4
		case IOCTL_CAM_STOP :
			RETAILMSG(RETAIL_ON,(TEXT("CAMERA:IOCTL_CAM_STOP\r\n")));
/*
			// Disable camera interrupt
			pCamDevice->m_rS2440INT->INTMSK |= ( 1 << IRQ_CAM );
			pCamDevice->m_rS2440INT->INTSUBMSK |= (( 1 << IRQ_SUB_CAM_P )|( 1 << IRQ_SUB_CAM_C ));

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

			pCamDevice->Camif_Capture(CAPTURE_OFF, CAPTURE_OFF);

			//DisplayEnable = 0;

			DRIVER_PREVIEW_ENABLE = 2;
			RETAILMSG(RETAIL_ON,(TEXT("IOCTL_CAM_STOP: DRIVER_PREVIEW_ENABLE is 2\r\n")));
*/
			pCamDevice->CameraDisable();
			//dwDisplayTimeout = INFINITE;
			break;

		// for MPEG4

⌨️ 快捷键说明

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