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

📄 camerafunc.cpp

📁 Microsoft WinCE 6.0 BSP FINAL release source code for use with the i.MX27ADS TO2 WCE600_FINAL_MX27_S
💻 CPP
📖 第 1 页 / 共 4 页
字号:
//-----------------------------------------------------------------------------
//
// Copyright (C) 2006, Freescale Semiconductor, Inc. All Rights Reserved.
// THIS SOURCE CODE, AND ITS USE AND DISTRIBUTION, IS SUBJECT TO THE TERMS
// AND CONDITIONS OF THE APPLICABLE LICENSE AGREEMENT
//
//-----------------------------------------------------------------------------
//
// File: Camerafunc.cpp
//
// Provides the camera functions implementation.
//
//-----------------------------------------------------------------------------

#include "camera.h"
#include "camerafunc.h"
#include "camera_ext.h"

//------------------------------------------------------------------------------
// External Variables 
 
//------------------------------------------------------------------------------
// Global Variables 
//#define CodecDemo_DEBUG_MSG 1
//------------------------------------------------------------------------------
// Defines 
#define PIN_DESIRED_BUFFER_COUNT        2
#define FOURCC_YV12     mmioFOURCC('Y', 'V', '1', '2')

typedef enum CAMERA_RESOLUTION
{
    VGA,
    CIF,
    QVGA,
    QCIF,
    QQVGA
};
//------------------------------------------------------------------------------
// Types

//------------------------------------------------------------------------------
// Local Variables 
static HANDLE        ghCameraDll;
static HANDLE      ghPreviewPinDll;
static HANDLE      ghCapturePinDll;
static HANDLE      ghPreviewMsgQ;
static HANDLE      ghCaptureMsgQ;

static CS_DATAFORMAT_VIDEOINFOHEADER    gPreviewDataFormat;
static PCS_STREAM_DESCRIPTOR gpPreviewStreamDesc;
static CRITICAL_SECTION     gcsPreview;

static CS_DATAFORMAT_VIDEOINFOHEADER    gCaptureDataFormat;
static PCS_STREAM_DESCRIPTOR gpCaptureStreamDesc;
static CRITICAL_SECTION     gcsCapture;

static PCSMULTIPLE_ITEM g_pPreviewDataRanges, g_pCaptureDataRanges, g_pStillDataRanges;
static UINT32 g_iNumCaptureDataRanges, g_iNumStillDataRanges, g_iNumPreviewDataRanges;
static CSPROPERTY inputIOCTL;
static CSSTATE state;
static PCS_DATAFORMAT_VIDEOINFOHEADER g_pCapDataFormat;

CS_DATAFORMAT_VIDEOINFOHEADER VideoRGBDataFormat = 
{
    // CSDATARANGE
    {   
        sizeof (CS_DATARANGE_VIDEO),
        0,                  // Flags
        921600,             // SampleSize
        0,                  // Reserved
        STATIC_CSDATAFORMAT_TYPE_VIDEO,
        0xe436eb7b, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70, 
        STATIC_CSDATAFORMAT_SPECIFIER_VIDEOINFO
    },
    // CS_VIDEOINFOHEADER (default format)
    {
        0,0,0,0,                                // RECT  rcSource; 
        0,0,0,0,                                // RECT  rcTarget; 
        36864000,                                // DWORD dwBitRate; 153600 * 30FPS * 8 bit/Byte
        0L,                                        // DWORD dwBitErrorRate;   
        333333,                                    // DWORD dwBitRate; 
        {
            sizeof (CS_BITMAPINFOHEADER),       // DWORD biSize;
            320,                                // LONG  biWidth;
            240,                                // LONG  biHeight; -biHeight indicate TopDown for RGB
            1,                                  // WORD  biPlanes;
            16,                                    // WORD  biBitCount;
            CS_BI_BITFIELDS,                    // DWORD biCompression;
            153600,                             // DWORD biSizeImage;
            0,                                  // LONG  biXPelsPerMeter;
            0,                                  // LONG  biYPelsPerMeter;
            0,                                  // DWORD biClrUsed;
            0                                   // DWORD biClrImportant;
        },
        {
            0xF800,                             // DWORD dwBitMasks[CS_iMASK_COLORS];
            0x07E0, 
            0x001F
        }    

    }
};
#if 0
CS_DATAFORMAT_VIDEOINFOHEADER VideoYUVDataFormat = 
{
    // CSDATARANGE
    {   
        sizeof (CS_DATARANGE_VIDEO),            // Flags
        0,
        115200,                                    // SampleSize
        0,                                        // Reserved
        STATIC_CSDATAFORMAT_TYPE_VIDEO,  
        FOURCC_YV12, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71,
        STATIC_CSDATAFORMAT_SPECIFIER_VIDEOINFO
    },
    // CS_VIDEOINFOHEADER (default format)
    {
        0,0,CH2_CAPTURE_WIDTH,-CH2_CAPTURE_HEIGHT,       // RECT  rcSource; 
        0,0,CH2_CAPTURE_WIDTH,-CH2_CAPTURE_HEIGHT,       // RECT  rcTarget; 
        36864000,                           // DWORD dwBitRate; 153600 * 30FPS * 8 bit/Byte
        0L,                                 // DWORD dwBitErrorRate;   
        333333,                                // REFERENCE_TIME  AvgTimePerFrame; 
        sizeof (CS_BITMAPINFOHEADER),        // DWORD biSize;
        CH2_CAPTURE_WIDTH,                  // LONG  biWidth;
        -CH2_CAPTURE_HEIGHT,                // LONG  biHeight;
        1,                                    // WORD  biPlanes;
        12,                                    // WORD  biBitCount;
        FOURCC_YV12,                        // DWORD biCompression;
        115200,                                // DWORD biSizeImage;
        0,                                    // LONG  biXPelsPerMeter;
        0,                                    // LONG  biYPelsPerMeter;
        0,                                    // DWORD biClrUsed;
        0,                                    // DWORD biClrImportant;
        0, 0, 0                                // DWORD dwBitMasks[3]
    }
};  
#endif

CS_DATAFORMAT_VIDEOINFOHEADER VideoYUVDataFormat = 
{
    // CSDATARANGE
    {   
        sizeof (CS_DATARANGE_VIDEO),
        0,                  // Flags
        115200,             // SampleSize
        0,                  // Reserved
        STATIC_CSDATAFORMAT_TYPE_VIDEO,
              FOURCC_YV12, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71,
        STATIC_CSDATAFORMAT_SPECIFIER_VIDEOINFO
    },

    // CS_VIDEOINFOHEADER (default format)
    {
        0,0,320,-240,                            // RECT  rcSource; 
        0,0,320,-240,                            // RECT  rcTarget; 
        27648000,                          // DWORD dwBitRate;
        0L,                                 // DWORD dwBitErrorRate;   
        333333,                                // DWORD dwBitRate; 614400 * 30FPS * 8 bit/Byte
        {
            sizeof (CS_BITMAPINFOHEADER),       // DWORD biSize;
            320,                                 // LONG  biWidth;
            -240,                                 // LONG  biHeight; -biHeight indicate TopDown for RGB
            1,                                  // WORD  biPlanes;
            12,                          // WORD  biBitCount;
            FOURCC_YV12,                    // DWORD biCompression;
            115200,                             // DWORD biSizeImage;
            0,                                  // LONG  biXPelsPerMeter;
            0,                                  // LONG  biYPelsPerMeter;
            0,                                  // DWORD biClrUsed;
            0                                   // DWORD biClrImportant;
        },
        {
            0,                             // DWORD dwBitMasks[CS_iMASK_COLORS];
            0, 
            0
        }    

    }
};

void ReadPinDataRanges(UINT32 pinId);

bool CameraTestCapture(void);

//------------------------------------------------------------------------------
// Local Functions
//-----------------------------------------------------------------------------
//
// Function: LoadCamDriver
//
// Loader the Camera driver and initiate the preview and capture pin.
//
// Parameters:
//      None
//
// Returns:  
//      TRUE if successful; FALSE if failed.
//
//-----------------------------------------------------------------------------
BOOL LoadCamDriver()
{
    MSGQUEUEOPTIONS msgOptions;
    CSPROPERTY_STREAMEX_S CsPropStreamEx; 
    DWORD dBytesTransferred;
    BOOL bResult = FALSE;
    
    InitializeCriticalSection(&gcsPreview);
    gPreviewDataFormat =VideoRGBDataFormat;

    InitializeCriticalSection(&gcsCapture);
    gCaptureDataFormat =VideoYUVDataFormat;
    
    gpPreviewStreamDesc = (PCS_STREAM_DESCRIPTOR)malloc(sizeof(CS_STREAM_DESCRIPTOR));
    if (gpPreviewStreamDesc == NULL) {
        return FALSE;
    }

    gpCaptureStreamDesc = (PCS_STREAM_DESCRIPTOR)malloc(sizeof(CS_STREAM_DESCRIPTOR));
    if (gpCaptureStreamDesc == NULL)   {
        return FALSE;
    }

    ghCameraDll = CreateFile(TEXT("CAM1:"),          // "special" file name
                        GENERIC_READ|GENERIC_WRITE,   // desired access
                        FILE_SHARE_READ|FILE_SHARE_WRITE,   // sharing mode
                        NULL,                   // security attributes (=NULL)
                        OPEN_EXISTING,            // creation disposition
                        FILE_ATTRIBUTE_NORMAL,  // flags and attributes
                        NULL);                  // template file (ignored)

    if (INVALID_HANDLE_VALUE == ghCameraDll) {
        ERRORMSG(CodecDemo_ERROR_MSG, (TEXT("LoadCamDriver: CreateFile CAM1 failed!Last error code is %d \r\n"),GetLastError()));
        return FALSE;
    }
    RETAILMSG(CodecDemo_DEBUG_MSG, (TEXT("LoadCamDriver: CreateFile CAM1 Done!\r\n")));

    // open a pin for preview
    ghPreviewPinDll= CreateFile(TEXT("PIN1:"),          // "special" file name
                        GENERIC_READ|GENERIC_WRITE,   // desired access
                        0,                        // sharing mode
                        NULL,                   // security attributes (=NULL)
                        OPEN_ALWAYS,            // creation disposition
                        FILE_ATTRIBUTE_NORMAL,  // flags and attributes
                        NULL);                  // template file (ignored)
    if (INVALID_HANDLE_VALUE == ghPreviewPinDll) {
        ERRORMSG(CodecDemo_ERROR_MSG, (TEXT("LoadCamDriver: Open a pin for preview failed!Last error code is %d \r\n"),GetLastError()));
        return FALSE;
    }
    RETAILMSG(CodecDemo_DEBUG_MSG, (TEXT("LoadCamDriver: Open a pin for preview Done!\r\n")));

    // Open a pin for capture image
    ghCapturePinDll = CreateFile(TEXT("PIN1:"),          // "special" file name
                    GENERIC_READ|GENERIC_WRITE,          // desired access
                    0,                                   // sharing mode
                    NULL,                                // security attributes (=NULL)
                    OPEN_ALWAYS,                         // creation disposition
                    FILE_ATTRIBUTE_NORMAL,               // flags and attributes
                    NULL);                               // template file (ignored)
    if (INVALID_HANDLE_VALUE == ghCapturePinDll) {
        ERRORMSG(CodecDemo_ERROR_MSG, (TEXT("LoadCamDriver: Open a pin for capture image failed!Last error code is %d \r\n"),GetLastError()));
        return FALSE;
    }
    RETAILMSG(CodecDemo_DEBUG_MSG, (TEXT("LoadCamDriver: Open a pin for capture image done!\r\n")));

    // Open msg queue for Preview Pin
    msgOptions.dwSize = sizeof(MSGQUEUEOPTIONS);
    msgOptions.dwFlags = MSGQUEUE_ALLOW_BROKEN;
    msgOptions.dwMaxMessages = 0;
    msgOptions.cbMaxMessage  = sizeof(CS_MSGQUEUE_BUFFER);
    msgOptions.bReadAccess = TRUE;

    ghPreviewMsgQ = CreateMsgQueue(NULL, &msgOptions);

    if(!ghPreviewMsgQ) {
        RETAILMSG(CodecDemo_ERROR_MSG, (TEXT("LoadCamDriver: CreateMsgQueue for Preview pin failed!\r\n")));
        return FALSE;
    }

    RETAILMSG(CodecDemo_DEBUG_MSG, (TEXT("LoadCamDriver: CreateMsgQueue for Preview pin done!\r\n")));

    // Open msg queue for Capture Pin
    ghCaptureMsgQ = CreateMsgQueue(NULL, &msgOptions);
    if(!ghCaptureMsgQ) {
        RETAILMSG(CodecDemo_ERROR_MSG, (TEXT("LoadCamDriver: CreateMsgQueue for Capture pin failed!\r\n")));
        return FALSE;
    }

    RETAILMSG(CodecDemo_DEBUG_MSG, (TEXT("LoadCamDriver: CreateMsgQueue for Capture pin done!\r\n")));

    // create preview pin instance
    CsPropStreamEx.hMsgQueue = ghPreviewMsgQ; 
    CsPropStreamEx.CsPin.PinId = PREVIEW; //preview
    CsPropStreamEx.CsPin.Property.Set = CSPROPSETID_StreamEx;
    CsPropStreamEx.CsPin.Property.Id = CSPROPERTY_STREAMEX_INIT;
    CsPropStreamEx.CsPin.Property.Flags = CSPROPERTY_TYPE_SET;

    bResult = DeviceIoControl(ghPreviewPinDll,                  // file handle to the driver
                        IOCTL_STREAM_INSTANTIATE,               // I/O control code
                        &CsPropStreamEx,                        // in buffer
                        sizeof(CSPROPERTY_STREAMEX_S),          // in buffer size
                        NULL,                                   // out buffer
                        0,                                      // out buffer size
                        &dBytesTransferred,                     // number of bytes returned
                        NULL);                                  // ignored (=NULL)
    if (!bResult) {
        RETAILMSG(CodecDemo_ERROR_MSG, (TEXT("LoadCamDriver: create preview pin instance failed!\r\n")));
        return FALSE;
    }

    // create capture pin instance
    CsPropStreamEx.hMsgQueue = ghCaptureMsgQ; 
    CsPropStreamEx.CsPin.PinId = CAPTURE;  //capture      1:still 
    CsPropStreamEx.CsPin.Property.Set = CSPROPSETID_StreamEx;
    CsPropStreamEx.CsPin.Property.Id = CSPROPERTY_STREAMEX_INIT;
    CsPropStreamEx.CsPin.Property.Flags = CSPROPERTY_TYPE_SET;

    bResult = DeviceIoControl(ghCapturePinDll,                  // file handle to the driver
                        IOCTL_STREAM_INSTANTIATE,                // I/O control code
                        &CsPropStreamEx,                        // in buffer
                        sizeof(CSPROPERTY_STREAMEX_S),            // in buffer size
                        NULL,                        // out buffer
                        0,                           // out buffer size
                        &dBytesTransferred,          // number of bytes returned
                        NULL);                       // ignored (=NULL)
    if (!bResult) {
        RETAILMSG(CodecDemo_ERROR_MSG, (TEXT("LoadCamDriver: create capture pin instance failed!\r\n")));
        return FALSE;
    }
    
    // Add by Tony
    // Get Basic support
    CSPROPERTY csPropIn;
    CSALLOCATOR_FRAMING csAllocatorFramingOut;
    csPropIn.Set = CSPROPSETID_Connection;
    csPropIn.Id = CSPROPERTY_CONNECTION_ALLOCATORFRAMING;
    csPropIn.Flags = CSPROPERTY_TYPE_BASICSUPPORT;

    DeviceIoControl(ghCapturePinDll,                   // file handle to the driver
                    IOCTL_CS_PROPERTY,             // I/O control code
                    &csPropIn,                     // in buffer
                    sizeof(CSPROPERTY),            // in buffer size
                    &csAllocatorFramingOut,        // out buffer
                    sizeof(CSALLOCATOR_FRAMING),   // out buffer size
                    &dBytesTransferred,            // number of bytes returned
                    NULL);                         // ignored (=NULL)
                    
    // Read Capture pin DataRanges
    ReadPinDataRanges(0);

    // Read Preview pin DataRanges
    ReadPinDataRanges(2);
    
    CameraTestCapture();
    
#if 0  

    // Get Display Info from Display driver
    //...

    //set BitCount for preview pin
    CSPROPERTY IOCTLInput;
    
    IOCTLInput.Set = CSPROPSETID_Connection;
    IOCTLInput.Id = CSPROPERTY_CONNECTION_DATAFORMAT;

⌨️ 快捷键说明

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