📄 camtest.cpp
字号:
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 + -