亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pindevice.cpp

?? Windows CE 5.0 攝像頭分層驅動代碼
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
//

#define PININTERFACE
#include <windows.h>
#include <pm.h>
#include <Msgqueue.h>
#include <pwinbase.h>

#include "Cs.h"
#include "Csmedia.h"

#include "CameraPDDProps.h"
#include "dstruct.h"
#include "dbgsettings.h"
#include <camera.h>
#include "CameraDriver.h"
#include "PinDriver.h"
#include "wchar.h"


CPinDevice :: CPinDevice( )
{
    m_dwMemoryModel             = CSPROPERTY_BUFFER_CLIENT_LIMITED;
    m_fClientInitialized        = false;
    m_fDiscontinuity            = true;
    m_ulPinId                   = -1; // Invalid Pin Id
    m_ulMaxNumOfBuffers         = 0;
    m_ulFrameSize               = 0;
    m_ulFramesDropped           = 0;
    m_ulPictureNumber           = 0;
    m_RtAveTimePerFrame         = 0;
    m_hMsgQ                     = NULL;
    m_CsState                   = CSSTATE_STOP;
    m_msStart                   = 0xFFFFFFFF;
    m_msLastPT                  = 0;
    m_pStreamDescriptorList     = NULL;
    m_dwBufferCount             = 0;
    m_lStillCount               = 0;    

    InitializeCriticalSection( &m_csStreamBuffer );    
    InitializeCriticalSection( &m_csStreamIO );    
}

CPinDevice :: ~CPinDevice( )
{
    ResetBufferList( );
    
    if ( NULL != m_hMsgQ )
    {
        CloseMsgQueue( m_hMsgQ );
    }

    if ( NULL != m_pStreamDescriptorList )
    {
        LocalFree( m_pStreamDescriptorList );
        m_pStreamDescriptorList = NULL;
    }

    m_CsState = CSSTATE_STOP;
    DeleteCriticalSection( &m_csStreamBuffer );
    DeleteCriticalSection( &m_csStreamIO );
}

bool CPinDevice :: InitializeSubDevice( PCAMERADEVICE pCamDevice )
{
    TCHAR *tszLibraryName = NULL;
    TCHAR *tszFunctionName = NULL;
    DWORD dwDataSize = 0;
    DWORD dwDataType = 0;

    m_pCamAdapter = pCamDevice ;
    if (NULL == m_pCamAdapter)
    {
        return false ;   
    }

    return true ;
}

DWORD CPinDevice :: CloseSubDevice()
{
    DWORD dwRet = FALSE;
    dwRet = m_pCamAdapter->DecrCInstances( m_ulPinId ) ;
    if( dwRet )
    {
        dwRet = m_pCamAdapter->PDDClosePin( m_ulPinId );
    }

    return dwRet;
}


DWORD CPinDevice :: StreamInstantiate( PCSPROPERTY_STREAMEX_S pCsPropStreamEx, PUCHAR pOutBuf, DWORD  OutBufLen, PDWORD pdwBytesTransferred )
{
    DWORD   dwError  = ERROR_INVALID_PARAMETER;
    HANDLE  hProcess = NULL;
    PCS_DATARANGE_VIDEO pCsDataRangeVid = NULL;

    
    if ( -1 != m_ulPinId )
    {
        DEBUGMSG(ZONE_IOCTL|ZONE_ERROR, (_T("PIN_IOControl(%08x): Pin %d is already instantiated.\r\n"), this, m_ulPinId )) ;
        return dwError ;
    }

    if( NULL == m_pCamAdapter )
    {
        DEBUGMSG(ZONE_IOCTL|ZONE_ERROR, (_T("PIN_IOControl(%08x): Initialization incomplete.\r\n"), this, m_ulPinId )) ;
        return dwError;
    }

    if ( false == m_pCamAdapter->IsValidPin( pCsPropStreamEx->CsPin.PinId ) )
    {
        DEBUGMSG(ZONE_IOCTL|ZONE_ERROR, (_T("PIN_IOControl(%08x): Invalid Pin Id\r\n"), this)) ;
        return dwError ;
    }
    
    m_ulPinId = pCsPropStreamEx->CsPin.PinId ;
    
    SENSORMODEINFO SensorModeInfo;
    if( ERROR_SUCCESS != m_pCamAdapter->PDDGetPinInfo( m_ulPinId, &SensorModeInfo ) )
    {
        DEBUGMSG(ZONE_IOCTL|ZONE_ERROR, (_T("PIN_IOControl(%08x): Failed to retrieve sub-device information\r\n"), this)) ;
        return dwError ;
    }

    m_dwMemoryModel     = SensorModeInfo.MemoryModel;
    m_ulMaxNumOfBuffers = SensorModeInfo.MaxNumOfBuffers;
    
    // Let us set a default format for this pin

    if ( false == m_pCamAdapter->GetPinFormat( m_ulPinId, 1, &pCsDataRangeVid ) )
    {
        DEBUGMSG(ZONE_IOCTL|ZONE_ERROR, (_T("PIN_IOControl(%08x): No Pin Format provided for pin\r\n"), this)) ;
        return dwError ;
    }
    
    memcpy(&m_CsDataRangeVideo,pCsDataRangeVid, sizeof(CS_DATARANGE_VIDEO) ) ;

    if ( NULL == pCsPropStreamEx->hMsgQueue )
    {
        DEBUGMSG(ZONE_IOCTL|ZONE_ERROR, (_T("PIN_IOControl(%08x): NULL Handle provided for msgqueue\r\n"), this)) ;
        return dwError ;
    }    

    //TODO : Check whether the client created msgqueue with enough buffersize and number of buffers.

    MSGQUEUEOPTIONS msgQueueOptions;
    msgQueueOptions.bReadAccess = FALSE; // we need write-access to msgqueue
    msgQueueOptions.dwSize      = sizeof(MSGQUEUEOPTIONS);

    hProcess = OpenProcess(NULL, FALSE, GetCallerVMProcessId());
    if(NULL == hProcess)
    {
        DEBUGMSG(ZONE_IOCTL|ZONE_ERROR, (_T("PIN_IOControl(%08x): Failed to open Process\r\n"), this)) ;
        return dwError ;
    }

    ASSERT( m_hMsgQ == NULL );

    if ( NULL == (m_hMsgQ = OpenMsgQueue(hProcess, pCsPropStreamEx->hMsgQueue, &msgQueueOptions ) ) )
    {
        DEBUGMSG(ZONE_IOCTL|ZONE_ERROR, (_T("PIN_IOControl(%08x): Failed to open MsgQueue\r\n"), this)) ;
        CloseHandle(hProcess);
        return dwError ;
    }

    CloseHandle(hProcess);

    if ( false == m_pCamAdapter->IncrCInstances( m_ulPinId, this ) )
    {
        DEBUGMSG(ZONE_IOCTL|ZONE_ERROR, (_T("PIN_IOControl(%08x): Pin %d is already instantiated.\r\n"), this, m_ulPinId)) ;
        return dwError ;
    }

    return ERROR_SUCCESS ;
}

void CPinDevice :: SetState( CSSTATE CsState, CSSTATE *CsPrevState )
{
    EnterCriticalSection(&m_csStreamIO);
    if ( NULL != CsPrevState )
    {
        *CsPrevState = m_CsState ;
    }

     //Check if we are not already in the target state
    if(m_CsState != CsState)
    {
        m_CsState = CsState ;

        if ( STILL != m_ulPinId || CSSTATE_RUN != CsState )
        {
            m_pCamAdapter->PDDSetPinState( m_ulPinId, CsState );
        }

        if( STILL == m_ulPinId && CSSTATE_RUN == CsState )
        {
            m_fDiscontinuity = true;
        }
        
        DEBUGMSG(ZONE_IOCTL|ZONE_ERROR, (_T("Pin: %d Setting State to 0x%X\r\n"), m_ulPinId, CsState)) ;
    }
    LeaveCriticalSection(&m_csStreamIO);
    return ;
}

BOOL CPinDevice::InitMsgQueueDescriptor (PCS_MSGQUEUE_BUFFER pCsMsgQBuff, PCS_STREAM_DESCRIPTOR pCsStreamDesc, PVOID pMappedData, PVOID pUnmappedData, BOOL bBufferFill)
{
    PCSSTREAM_HEADER pCsStreamHeader = reinterpret_cast<PCSSTREAM_HEADER>(pCsStreamDesc);
    PCS_FRAME_INFO   pCsFrameInfo    = reinterpret_cast<PCS_FRAME_INFO>(pCsStreamHeader + 1);

    if(( pCsStreamHeader == NULL ) || ( pCsFrameInfo == NULL ))
    {
        DEBUGMSG(ZONE_FUNCTION|ZONE_ERROR, (_T("InitMsgQueueDescriptor(%08x): Invalid Stream Descriptor\r\n"), this));
        return false;
    }

    if( bBufferFill )
    {
        // The buffer fill function must use the pointer that's been mapped into this process.
        pCsStreamHeader->Data = pMappedData;

        EnterCriticalSection(&m_csStreamBuffer) ;
        pCsStreamHeader->DataUsed = m_pCamAdapter->PDDFillPinBuffer( m_ulPinId, (PUCHAR) pMappedData ) ;
        LeaveCriticalSection(&m_csStreamBuffer) ;

        pCsFrameInfo->PictureNumber = (LONGLONG)++m_ulPictureNumber;
        pCsFrameInfo->DropCount     = (LONGLONG)m_ulFramesDropped;
    }

    // The message queue requires the original pointer value.
    pCsStreamHeader->Data = pUnmappedData;

    // Init the flags to zero
    pCsStreamHeader->OptionsFlags = 0;

    // Set the discontinuity flag if frames have been previously
    // dropped, and then reset our internal flag

    if ( true == m_fDiscontinuity ) 
    {
        pCsStreamHeader->OptionsFlags |= CSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY;
        m_fDiscontinuity = false;
    }

    DWORD msNow = GetTickCount();

    if (m_msStart == 0xFFFFFFFF)
    {
        m_msStart = msNow;
    }

    //
    // Return the timestamp for the frame
    //
    pCsStreamHeader->PresentationTime.Numerator   = 1;
    pCsStreamHeader->PresentationTime.Denominator = 1;
    pCsStreamHeader->Duration                     = m_RtAveTimePerFrame;
    DWORD prevPT = m_msLastPT;

    m_msLastPT = msNow - m_msStart;
    pCsStreamHeader->PresentationTime.Time        = (LONGLONG) m_msLastPT * 10000;  // presentation time stamp in 100s of ns


    DEBUGMSG(ZONE_FUNCTION, (_T("InitMsgQueueDescriptor: LastPT = %d, elapsed = %d\n"), m_msLastPT, m_msLastPT - prevPT));

    // clear the timestamp valid flags
    pCsStreamHeader->OptionsFlags &= ~( CSSTREAM_HEADER_OPTIONSF_TIMEVALID | CSSTREAM_HEADER_OPTIONSF_DURATIONVALID );

    // Every frame we generate is a key frame (aka SplicePoint)
    // Delta frames (B or P) should not set this flag

    pCsStreamHeader->OptionsFlags |= CSSTREAM_HEADER_OPTIONSF_SPLICEPOINT;

    pCsMsgQBuff->CsMsgQueueHeader.Size    = sizeof(CS_MSGQUEUE_HEADER);
    pCsMsgQBuff->CsMsgQueueHeader.Flags   = FLAG_MSGQ_FRAME_BUFFER;
    pCsMsgQBuff->CsMsgQueueHeader.Context = NULL;

    //Get the unmarshalled StreamDescriptor in order to send the message to the application
    pCsMsgQBuff->pStreamDescriptor = NULL;
    for (UINT ii = 0; ii < m_dwBufferCount; ii++)
    {
        if(m_pStreamDescriptorList[ii].csStreamDescriptorShadow.CsStreamHeader.Data == pUnmappedData)
        {
            pCsMsgQBuff->pStreamDescriptor = m_pStreamDescriptorList[ii].m_pUnMarshalledStreamDesc;
            break;
        }
    }

    if(NULL == pCsMsgQBuff->pStreamDescriptor)
    {
        DEBUGMSG(ZONE_FUNCTION, (_T("InitMsgQueueDescriptor(%08x): Unable to find Unmarshalled Stream Desc\n"), this));
        return FALSE;
    }
    
    DEBUGMSG(ZONE_FUNCTION, (_T("InitMsgQueueDescriptor(%08x): Frame buf queued: %d (dropped %d), start %d, time %d\n"), 
        this,
        (LONG)pCsFrameInfo->PictureNumber, 
        (LONG)pCsFrameInfo->DropCount, 
        (LONG)m_msStart,
        (LONG)(pCsStreamHeader->PresentationTime.Time / 10000)));

    return TRUE;
   
}

void  CPinDevice::FlushBufferQueue()
{
    PCS_STREAM_DESCRIPTOR pCsStreamDesc = NULL;
    PVOID                 pMappedData   = NULL;
    PVOID                 pUnmappedData = NULL;
    CS_MSGQUEUE_BUFFER    CsMsgQBuff ;    

    while (( true == RemoveBufferFromList( &pCsStreamDesc, &pMappedData, &pUnmappedData )) && ( NULL != pCsStreamDesc ) && ( m_hMsgQ != NULL ))
    {
        if (!InitMsgQueueDescriptor (&CsMsgQBuff, pCsStreamDesc, pMappedData, pUnmappedData, FALSE))
        {
            continue;
        }

        if ( false == WriteMsgQueue( m_hMsgQ, reinterpret_cast<LPVOID>(&CsMsgQBuff),  sizeof(CS_MSGQUEUE_BUFFER), PIN_TIMEOUT, 0 ) )
        {
            DEBUGMSG(ZONE_FUNCTION|ZONE_ERROR, (_T("PIN_Function(%08x): WriteMsgQueue returned false\r\n"), this));
        }
    }    

    return;
}

DWORD CPinDevice :: HandlePinIO()
{    
    DWORD dwRet = ERROR_SUCCESS;
    BOOL bOK = TRUE;

    EnterCriticalSection(&m_csStreamIO);
    if ( CSSTATE_RUN != m_CsState ) 
    {
        LeaveCriticalSection(&m_csStreamIO);
        return ERROR_INVALID_STATE;
    }
   
    PCS_STREAM_DESCRIPTOR pCsStreamDesc = NULL;
    PVOID                 pMappedData   = NULL;
    PVOID                 pUnmappedData = NULL;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人app网站| 亚洲国产日产av| 国产精品正在播放| www久久久久| 成人国产亚洲欧美成人综合网| 久久精品欧美一区二区三区不卡 | 日本韩国一区二区| 亚洲乱码精品一二三四区日韩在线| 色综合天天做天天爱| 亚洲激情男女视频| 3d成人h动漫网站入口| 美国精品在线观看| 久久欧美一区二区| 不卡的av电影在线观看| 亚洲欧美日韩一区| 日韩一级精品视频在线观看| 国产一二三精品| 亚洲精品成人少妇| 欧美一区二区在线视频| 黄色日韩网站视频| 亚洲精品视频一区| 91精品国产色综合久久ai换脸| 国产一区999| 亚洲激情成人在线| 精品剧情v国产在线观看在线| 成人综合婷婷国产精品久久蜜臀 | 国产婷婷色一区二区三区四区| 成人精品免费网站| 亚洲国产精品一区二区久久恐怖片| 日韩欧美www| 91女神在线视频| 久久av资源网| 一区二区三区日本| 久久综合一区二区| 男男视频亚洲欧美| 欧美三级中文字幕在线观看| 一区二区三区 在线观看视频| 国产麻豆精品95视频| 欧美巨大另类极品videosbest| 99视频有精品| 夜夜嗨av一区二区三区网页 | 91国内精品野花午夜精品| 亚洲欧美偷拍另类a∨色屁股| 欧美一级欧美一级在线播放| k8久久久一区二区三区| 日本伊人色综合网| 亚洲人成精品久久久久久| 欧美www视频| 欧美三电影在线| jiyouzz国产精品久久| 久久精品国内一区二区三区 | 久久久久久久综合日本| 成人午夜视频网站| 久久激情综合网| 性久久久久久久久久久久| 国产蜜臀av在线一区二区三区 | 久久欧美中文字幕| 在线不卡一区二区| 91国偷自产一区二区开放时间| 国内成人自拍视频| 青娱乐精品视频在线| 一区二区三区中文免费| 中文字幕一区二区不卡| 国产欧美一区二区三区网站| 精品日韩一区二区三区免费视频| 欧美日韩免费电影| 色婷婷精品久久二区二区蜜臀av| 高清视频一区二区| 国产精品一区一区三区| 韩国欧美一区二区| 精品一区二区在线视频| 丝袜脚交一区二区| 日韩av中文字幕一区二区三区| 亚洲成人精品一区| 亚洲成av人在线观看| 亚洲一区二区在线免费观看视频| 一色桃子久久精品亚洲| 国产精品欧美经典| 中文字幕人成不卡一区| 亚洲欧美日韩综合aⅴ视频| 国产精品乱码人人做人人爱| 国产女人aaa级久久久级| 国产拍欧美日韩视频二区| 国产日韩精品一区| 亚洲欧洲精品一区二区三区| 自拍偷在线精品自拍偷无码专区| 亚洲欧洲美洲综合色网| 亚洲精品一卡二卡| 天天综合色天天| 看片网站欧美日韩| 国产成人在线视频网站| 成人免费毛片嘿嘿连载视频| www.亚洲人| 在线影院国内精品| 欧美一区永久视频免费观看| 欧美亚洲一区二区在线| 日韩你懂的在线播放| 欧美日韩一本到| 国产高清在线精品| 美日韩一级片在线观看| 亚洲一级电影视频| 视频一区二区三区中文字幕| 免费观看在线色综合| 国产米奇在线777精品观看| 国产成人高清在线| 日本精品一区二区三区高清| 91精品久久久久久久久99蜜臂 | 91精品1区2区| 精品视频一区二区不卡| 欧美一级在线免费| 国产午夜精品一区二区三区嫩草| 中文字幕在线一区免费| 亚洲一区在线观看免费观看电影高清| 日日摸夜夜添夜夜添精品视频| 九一九一国产精品| 99久久婷婷国产综合精品电影| 欧美日韩国产影片| 国产女同互慰高潮91漫画| 亚洲一区二区精品视频| 久久精品久久综合| 日韩精品一区二区在线| 欧美一级高清大全免费观看| 成人免费毛片aaaaa**| 高清视频一区二区| 色av一区二区| 久久影院电视剧免费观看| 亚洲精品日韩综合观看成人91| 日本成人超碰在线观看| 成人免费va视频| 欧美一区二区三区成人| 亚洲欧洲日韩在线| 九九久久精品视频| 欧美特级限制片免费在线观看| 久久理论电影网| 日韩精品成人一区二区三区| 99久久99久久精品免费观看| 精品成人一区二区三区| 亚洲一区日韩精品中文字幕| 国产成人av电影在线播放| 欧美一区二区三区男人的天堂| 亚洲精品免费电影| 成人午夜大片免费观看| 日韩视频中午一区| 天堂一区二区在线免费观看| 99国产精品视频免费观看| 国产午夜精品美女毛片视频| 免费精品99久久国产综合精品| 国产**成人网毛片九色 | 久久国产乱子精品免费女| 国产乱妇无码大片在线观看| 在线电影国产精品| 亚洲综合图片区| 99在线热播精品免费| 国产日产欧产精品推荐色 | 亚洲一区二区三区爽爽爽爽爽| 国产精品99久| 久久久午夜精品| 久久99精品一区二区三区| 5566中文字幕一区二区电影 | 欧美一级理论片| 亚洲国产精品天堂| 色视频成人在线观看免| 亚洲欧洲成人精品av97| 国产xxx精品视频大全| 久久免费美女视频| 国产精品一区在线| 久久免费精品国产久精品久久久久| 毛片av一区二区| 欧美一级片在线观看| 轻轻草成人在线| 首页国产欧美日韩丝袜| 粉嫩嫩av羞羞动漫久久久 | 午夜精品福利在线| 欧美亚洲禁片免费| 午夜欧美在线一二页| 欧美精品久久99| 日韩一区欧美二区| 日韩欧美电影一区| 国产一区二区在线观看视频| 久久青草欧美一区二区三区| voyeur盗摄精品| 综合电影一区二区三区| 日本韩国一区二区三区| 午夜精品一区二区三区电影天堂| 欧美日韩另类一区| 蜜臀精品久久久久久蜜臀| 欧美大白屁股肥臀xxxxxx| 九九在线精品视频| 国产精品女主播av| 欧美伊人久久久久久久久影院| 肉丝袜脚交视频一区二区| 精品女同一区二区| 成人激情免费视频| 亚洲精品第一国产综合野| 欧美理论在线播放| 国产真实精品久久二三区| 中文无字幕一区二区三区 | 亚洲视频1区2区| 狠狠色丁香久久婷婷综| 开心九九激情九九欧美日韩精美视频电影 |