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

📄 camtest.cpp

📁 Microsoft WinCE 6.0 BSP FINAL release source code for use with the i.MX27ADS TO2 WCE600_FINAL_MX27_S
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    if (!GetDataFormat(1, QCIF, pStillDataRange))
    {
        g_pKato->Log(CAM_ZONE_ERROR,(TEXT("Could not find QCIF datarange for STILL pin...bummer.\r\n")));
    }

    inputIOCTL.Set = CSPROPSETID_Pin;
    inputIOCTL.Id = CSPROPERTY_PIN_DATAINTERSECTION;
    inputIOCTL.Flags = CSPROPERTY_TYPE_GET;

    // Get Dataformat using PININTERSECTION
    dwStructSize = sizeof(CSP_PIN) + sizeof(CSMULTIPLE_ITEM) + sizeof(CS_DATARANGE_VIDEO);
    pCsPin = (PCSP_PIN) malloc(dwStructSize);

    if (NULL == pCsPin )
        return; 

    pCsPin->Property = inputIOCTL;
    pCsPin->PinId = 1;
    pCSDataRangeItems = (PCSMULTIPLE_ITEM) (pCsPin + 1);
    pCSDataRangeItems->Count = 1;
    pCSDataRangeItems->Size = sizeof(CSMULTIPLE_ITEM) + sizeof(CS_DATARANGE_VIDEO);
    pCSDataRangeVideo = (PCS_DATARANGE_VIDEO) (pCSDataRangeItems + 1);
    memcpy(pCSDataRangeVideo, pStillDataRange, sizeof(CS_DATARANGE_VIDEO));

    pStillDataFormat = (PCS_DATAFORMAT_VIDEOINFOHEADER) malloc(sizeof(CS_DATAFORMAT_VIDEOINFOHEADER));

    if (NULL == pStillDataFormat )
        return; 

    // Get Still format
    if (!DeviceIoControl(hCamera,                   // file handle to the driver
             IOCTL_CS_PROPERTY,                     // I/O control code
             pCsPin,                                // in buffer
             dwStructSize,                          // in buffer size
             pStillDataFormat,                      // out buffer
             sizeof(CS_DATAFORMAT_VIDEOINFOHEADER), // out buffer size
             &gBytesTransferred,                    // number of bytes returned
             NULL))                                 // ignored (=NULL)
    {
        g_pKato->Log(CAM_ZONE_ERROR,(TEXT("Could not perform DATAINTERSECTION GET. Dang.\r\n")));
        return;
    }


    // Set Still format to QCIF
    inputIOCTL.Set = CSPROPSETID_Connection;
    inputIOCTL.Id = CSPROPERTY_CONNECTION_DATAFORMAT;
    inputIOCTL.Flags = CSPROPERTY_TYPE_SET;
    if (!DeviceIoControl(hStillPin,                  // file handle to the driver
             IOCTL_CS_PROPERTY,                      // I/O control code
             &inputIOCTL,                            // in buffer
             sizeof(CSPROPERTY),                     // in buffer size
             pStillDataFormat,                       // out buffer
             sizeof(CS_DATAFORMAT_VIDEOINFOHEADER),  // out buffer size
             &gBytesTransferred,                     // number of bytes returned
             NULL))                                  // ignored (=NULL)
    {
        g_pKato->Log(CAM_ZONE_ERROR,(TEXT("Could not perform DATAFORMAT SET. Dang.\r\n")));
        return;
    }


    // Pause Capture Stream
    if (!CaptureSetState(CAMERA_STATE_PAUSE))
    {
        g_pKato->Log(CAM_ZONE_ERROR,(TEXT("Could not set capture pin to PAUSE. Dang.\r\n")));
        return;
    }

    // allocate buffer for capture pin
    csBufferInfo.dwCommand = CS_ALLOCATE;
    csBufferInfo.pStreamDescriptor = &captureStreamDesc;

    DeviceIoControl(hCapturePin,                  // file handle to the driver
                    IOCTL_CS_BUFFERS,             // I/O control code
                    &csBufferInfo,                // in buffer
                    sizeof(csBufferInfo),         // in buffer size
                    &captureStreamDesc,           // out buffer
                    sizeof(CS_STREAM_DESCRIPTOR), // out buffer size
                    &gBytesTransferred,           // number of bytes returned
                    NULL);                        // ignored (=NULL)

    // Pause Still Stream
    if (!StillSetState(CAMERA_STATE_PAUSE))
    {
        g_pKato->Log(CAM_ZONE_ERROR,(TEXT("Could not set still pin to PAUSE. Dang.\r\n")));
        return;
    }

    // allocate buffer for still pin
    csBufferInfo.dwCommand = CS_ALLOCATE;
    csBufferInfo.pStreamDescriptor = &stillStreamDesc;

    DeviceIoControl(hStillPin,                    // file handle to the driver
                    IOCTL_CS_BUFFERS,             // I/O control code
                    &csBufferInfo,                // in buffer
                    sizeof(csBufferInfo),         // in buffer size
                    &stillStreamDesc,             // out buffer
                    sizeof(CS_STREAM_DESCRIPTOR), // out buffer size
                    &gBytesTransferred,           // number of bytes returned
                    NULL);                        // ignored (=NULL)

    // Add buffer to the message queue
    csBufferInfo.dwCommand = CS_ENQUEUE;
    csBufferInfo.pStreamDescriptor = &stillStreamDesc;

    bResult = DeviceIoControl(hStillPin,              // file handle to the driver
             IOCTL_CS_BUFFERS,              // I/O control code
             &csBufferInfo,                 // in buffer
             sizeof(csBufferInfo),          // in buffer size
             &stillStreamDesc,              // out buffer
             sizeof(CS_STREAM_DESCRIPTOR),  // out buffer size
             &gBytesTransferred,            // number of bytes returned
             NULL);                         // ignored (=NULL)

    if (!DeviceIoControl(hCamera,                        // file handle to the driver
                IOCTL_CS_PROPERTY,                       // I/O control code
                &stillIOCTL,                             // in buffer
                sizeof(CSPROPERTY_VIDEOCONTROL_MODE_S),  // in buffer size
                NULL,                                    // out buffer
                0,                                       // out buffer size
                &gBytesTransferred,                      // number of bytes returned
                NULL))                                   // ignored (=NULL)
    {
        g_pKato->Log(CAM_ZONE_ERROR,(TEXT("Could not perform still image capture. Dang.\r\n")));
        return;
    }

    if (TRUE == bResult)
    {
        g_pKato->Log(CAM_ZONE_ERROR, (TEXT("StillCaptureAndDisplay: WaitForSingleObject\r\n")));

        // Wait for message queue to be signaled
        if (WaitForSingleObject(hStillMsgQ, INFINITE) != WAIT_OBJECT_0)
        {
            g_pKato->Log(CAM_ZONE_ERROR, (TEXT("StillCaptureAndDisplay: WaitForSingleObject Timeout!\r\n")));
        }

        // Our message queue handle has been signaled.
        // Now try to read a captured image from the buffer queue.
        if (!ReadMsgQueue(hStillMsgQ, &CsMsgQBuff, sizeof(CS_MSGQUEUE_BUFFER), &size, 10, &flags))
        {
            g_pKato->Log(CAM_ZONE_ERROR, (TEXT("StillCaptureAndDisplay: Could not read from buffer queue!\r\n")));
        }

        // Stop still pin
        if (!StillSetState(CAMERA_STATE_STOP))
        {
            g_pKato->Log(CAM_ZONE_ERROR,(TEXT("Still pin STOP error.\r\n")));
        }

        pStillBuffer = reinterpret_cast<PUINT8>(CsMsgQBuff.pStreamDescriptor->CsStreamHeader.Data);

        g_pKato->Log(CAM_ZONE_ERROR,
            (TEXT("FrameBufferVirtualAddr: %x\n bufferSize: %x\r\n")),
            FrameBufferVirtualAddr, bufferSize);

        rcFBDest.top = 20;
        rcFBDest.left = 20;

        DrawToFrameBuffer(pStillBuffer, abs(pStillDataFormat->VideoInfoHeader.bmiHeader.biWidth),
            abs(pStillDataFormat->VideoInfoHeader.bmiHeader.biHeight), &rcFBDest);

        g_pKato->Log(CAM_ZONE_ERROR,(TEXT("Still image being displayed now for 4 seconds\n.\n.\n.\r\n")));
    }
   
    Sleep(4000);

    if (NULL != pStillDataRange)    
       free(pStillDataRange);
    if (NULL != pCsPin)    
       free(pCsPin);
    if (NULL != pStillDataFormat)        
       free(pStillDataFormat);
    
    g_pKato->Log(CAM_ZONE_ERROR,(TEXT("write finish...............\r\n")));
}

#else

//------------------------------------------------------------------------------
//
// Function: StillPreviewAndDisplay
//
// This function turns on the still pin, captures an image, and
// writes it to the framebuffer.
//
// Parameters:
//      None.
//
// Returns:
//      None.
//
//------------------------------------------------------------------------------
static void StillPreviewAndDisplay()
{
    CS_MSGQUEUE_BUFFER CsMsgQBuff;
    DWORD size, flags;
    CSPROPERTY_VIDEOCONTROL_MODE_S stillIOCTL;
    //DWORD dwBufferCommand;
    PCS_DATARANGE_VIDEO pStillDataRange;
    PCS_DATAFORMAT_VIDEOINFOHEADER pStillDataFormat;
    RECT rcFBDest;
    PCSP_PIN pCsPin;
    PCSMULTIPLE_ITEM pCSDataRangeItems;
    PCS_DATARANGE_VIDEO pCSDataRangeVideo;
    DWORD dwStructSize;
    CSBUFFER_INFO csBufferInfo;
    BOOL bResult = FALSE;

    stillIOCTL.Property.Set = PROPSETID_VIDCAP_VIDEOCONTROL;
    stillIOCTL.Property.Id = CSPROPERTY_VIDEOCONTROL_MODE;
    stillIOCTL.Property.Flags = CSPROPERTY_TYPE_SET;
    stillIOCTL.StreamIndex = 1;
    stillIOCTL.Mode = CS_VideoControlFlag_Trigger;

    // modify Still data format to fit LCD screen (240x320)

    pStillDataRange = (PCS_DATARANGE_VIDEO) malloc(sizeof(CS_DATARANGE_VIDEO));

    if (NULL == pStillDataRange )
        return; 

    if (!GetDataFormat(2, QCIF, pStillDataRange))
    {
        g_pKato->Log(CAM_ZONE_ERROR,(TEXT("Could not find QCIF datarange for STILL pin...bummer.\r\n")));
    }

    inputIOCTL.Set = CSPROPSETID_Pin;
    inputIOCTL.Id = CSPROPERTY_PIN_DATAINTERSECTION;
    inputIOCTL.Flags = CSPROPERTY_TYPE_GET;

    // Get Dataformat using PININTERSECTION
    dwStructSize = sizeof(CSP_PIN) + sizeof(CSMULTIPLE_ITEM) + sizeof(CS_DATARANGE_VIDEO);
    pCsPin = (PCSP_PIN) malloc(dwStructSize);

    if (NULL == pCsPin )
        return; 
    
    pCsPin->Property = inputIOCTL;
    pCsPin->PinId = 2;
    pCSDataRangeItems = (PCSMULTIPLE_ITEM) (pCsPin + 1);
    pCSDataRangeItems->Count = 1;
    pCSDataRangeItems->Size = sizeof(CSMULTIPLE_ITEM) + sizeof(CS_DATARANGE_VIDEO);
    pCSDataRangeVideo = (PCS_DATARANGE_VIDEO) (pCSDataRangeItems + 1);
    memcpy(pCSDataRangeVideo, pStillDataRange, sizeof(CS_DATARANGE_VIDEO));

    pStillDataFormat = (PCS_DATAFORMAT_VIDEOINFOHEADER) malloc(sizeof(CS_DATAFORMAT_VIDEOINFOHEADER));

    if (NULL == pStillDataFormat )
        return; 

    // Get Still format
    if (!DeviceIoControl(hCamera,                   // file handle to the driver
             IOCTL_CS_PROPERTY,                     // I/O control code
             pCsPin,                                // in buffer
             dwStructSize,                          // in buffer size
             pStillDataFormat,                      // out buffer
             sizeof(CS_DATAFORMAT_VIDEOINFOHEADER), // out buffer size
             &gBytesTransferred,                    // number of bytes returned
             NULL))                                 // ignored (=NULL)
    {
        g_pKato->Log(CAM_ZONE_ERROR,(TEXT("Could not perform DATAINTERSECTION GET. Dang.\r\n")));
        return;
    }

    if (!PreviewSetState(CAMERA_STATE_STOP))
    {
        g_pKato->Log(CAM_ZONE_ERROR,(TEXT("Could not set capture pin to STOP. Dang.\r\n")));
        return;
    }

    // Set Still format to QCIF
    inputIOCTL.Set = CSPROPSETID_Connection;
    inputIOCTL.Id = CSPROPERTY_CONNECTION_DATAFORMAT;
    inputIOCTL.Flags = CSPROPERTY_TYPE_SET;  
  
    if (!DeviceIoControl(hPreviewPin,                  // file handle to the driver
             IOCTL_CS_PROPERTY,                      // I/O control code
             &inputIOCTL,                            // in buffer
             sizeof(CSPROPERTY),                     // in buffer size
             pStillDataFormat,                       // out buffer
             sizeof(CS_DATAFORMAT_VIDEOINFOHEADER),  // out buffer size
             &gBytesTransferred,                     // number of bytes returned
             NULL))                                  // ignored (=NULL)
    {
        g_pKato->Log(CAM_ZONE_ERROR,(TEXT("Could not perform DATAFORMAT SET. Dang.\r\n")));
        return;
    }

    // Pause Capture Stream
    if (!PreviewSetState(CAMERA_STATE_PAUSE))
    {
        g_pKato->Log(CAM_ZONE_ERROR,(TEXT("Could not set capture pin to PAUSE. Dang.\r\n")));
        return;
    }
    
    // Start Capture Stream
    if (!PreviewSetState(CAMERA_STATE_RUN))
    {
        g_pKato->Log(CAM_ZONE_ERROR,(TEXT("Could not set capture pin to PAUSE. Dang.\r\n")));
        return;
    }

    Sleep(500);
    // Pause Capture Stream
    if (!PreviewSetState(CAMERA_STATE_PAUSE))
    {
        g_pKato->Log(CAM_ZONE_ERROR,(TEXT("Could not set capture pin to PAUSE. Dang.\r\n")));
        return;
    }

    // Pause Still Stream
    if (!StillSetState(CAMERA_STATE_PAUSE))
    {
        g_pKato->Log(CAM_ZONE_ERROR,(TEXT("Could not set still pin to PAUSE. Dang.\r\n")));
        return;
    }
    // allocate buffer for still pin
    csBufferInfo.dwCommand = CS_ALLOCATE;
    csBufferInfo.pStreamDescriptor = &stillStreamDesc;

    DeviceIoControl(hStillPin,                    // file handle to the driver
                    IOCTL_CS_BUFFERS,             // I/O control code
                    &csBufferInfo,                // in buffer
                    sizeof(csBufferInfo),         // in buffer size
                    &stillStreamDesc,             // out buffer
                    sizeof(CS_STREAM_DESCRIPTOR), // out buffer size
                    &gBytesTransferred,           // number of bytes returned
                    NULL);                        // ignored (=NULL)

    // Add buffer to the message queue
    csBufferInfo.dwCommand = CS_ENQUEUE;
    csBufferInfo.pStreamDescriptor = &stillStreamDesc;

    bResult = DeviceIoControl(hStillPin,              // file handle to the driver
             IOCTL_CS_BUFFERS,              // I/O control code
             &csBufferInfo,                // in buffer
             sizeof(csBufferInfo),         // in buffer size
             &stillStreamDesc,              // out buffer
             sizeof(CS_STREAM_DESCRIPTOR),  // out buffer size
             &gBytesTransferred,            // number of bytes returned
             NULL);                         // ignored (=NULL)

    if (!DeviceIoControl(hCamera,                        // file handle to the driver
                IOCTL_CS_PROPERTY,                       // I/O control code
                &stillIOCTL,                             // in buffer
                sizeof(CSPROPERTY_VIDEOCONTROL_MODE_S),  // in buffer size
                NULL,                                    // out buffer
                0,                                       // out buffer size
                &gBytesTransferred,                      // number of bytes returned
                NULL))                                   // ignored (=NULL)
    {
        g_pKato->Log(CAM_ZONE_ERROR,(TEXT("Could not perform still image capture. Dang.\r\n")));
        return;
    }

    if (TRUE == bResult)
    {
        g_pKato->Log(CAM_ZONE_ERROR, (TEXT("StillCaptureAndDisplay: WaitForSingleObject\r\n")));

        // Wait for message queue to be signaled
        if (WaitForSingleObject(hStillMsgQ, INFINITE) != WAIT_OBJECT_0)
        {
            g_pKato->Log(CAM_ZONE_ERROR, (TEX

⌨️ 快捷键说明

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