📄 camtest.cpp
字号:
// Set Still format to QQVGA
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
pPreviewDataFormat, // 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 change image size while camera is running. We will now stop it and try again.\r\n")));
}
else
{
g_pKato->Log(CAM_ZONE_ERROR,(TEXT("We should not be able to change image while camera running. Arrrgh, I die.\r\n")));
return FALSE;
}
// Stop viewfinder
if (!PreviewSetState(CAMERA_STATE_STOP))
return FALSE;
inputIOCTL.Set = CSPROPSETID_Connection;
inputIOCTL.Id = CSPROPERTY_CONNECTION_DATAFORMAT;
inputIOCTL.Flags = CSPROPERTY_TYPE_SET;
// Try again to change image size
if (!DeviceIoControl(hPreviewPin, // file handle to the driver
IOCTL_CS_PROPERTY, // I/O control code
&inputIOCTL, // in buffer
sizeof(CSPROPERTY), // in buffer size
pPreviewDataFormat, // 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 change image size. Aborting\r\n")));
goto vf_error;
}
// Restart viewfinder
if (!PreviewSetState(CAMERA_STATE_PAUSE))
return FALSE;
if (!PreviewSetState(CAMERA_STATE_RUN))
return FALSE;
task++;
g_pKato->Log(CAM_ZONE_ERROR,
(TEXT("PreviewISR: Image size modified by 1/4.\r\n")));
}
#ifndef BSP_MX27
else if ((elapsedTicks > 20000) && (task == 4)) // 20 seconds
{
// Stop viewfinder
if (!PreviewSetState(CAMERA_STATE_STOP))
return FALSE;
// change window offset for preview
pPreviewDataFormat->VideoInfoHeader.rcTarget.left = 3;
pPreviewDataFormat->VideoInfoHeader.rcTarget.top = 3;
if (!ChangeOffset(pPreviewDataFormat))
{
goto vf_error;
}
// Restart viewfinder
if (!PreviewSetState(CAMERA_STATE_PAUSE))
return FALSE;
if (!PreviewSetState(CAMERA_STATE_RUN))
return FALSE;
task++;
g_pKato->Log(CAM_ZONE_ERROR,
(TEXT("PreviewISR: Offset modified.\r\n")));
}
else if ((elapsedTicks > 24000) && (task == 5)) // 25 seconds
{
// Stop viewfinder
if (!PreviewSetState(CAMERA_STATE_STOP))
return FALSE;
// change window offset for preview
pPreviewDataFormat->VideoInfoHeader.rcTarget.left = 5;
pPreviewDataFormat->VideoInfoHeader.rcTarget.top = 5;
if (!ChangeOffset(pPreviewDataFormat))
{
goto vf_error;
}
// Restart viewfinder
if (!PreviewSetState(CAMERA_STATE_PAUSE))
return FALSE;
if (!PreviewSetState(CAMERA_STATE_RUN))
return FALSE;
task++;
g_pKato->Log(CAM_ZONE_ERROR,
(TEXT("PreviewISR: Offset modified.\r\n")));
}
else if ((elapsedTicks > 32000) && (task == 6)) // 25 seconds
{
// Stop viewfinder
if (!PreviewSetState(CAMERA_STATE_STOP))
return FALSE;
// change window offset for preview
pPreviewDataFormat->VideoInfoHeader.rcTarget.left = 20;
pPreviewDataFormat->VideoInfoHeader.rcTarget.top = 20;
if (!ChangeOffset(pPreviewDataFormat))
{
goto vf_error;
}
// Restart viewfinder
if (!PreviewSetState(CAMERA_STATE_PAUSE))
return FALSE;
if (!PreviewSetState(CAMERA_STATE_RUN))
return FALSE;
task++;
g_pKato->Log(CAM_ZONE_ERROR,
(TEXT("PreviewISR: Offset modified.\r\n")));
}
else if ((elapsedTicks > 40000) && (task == 7)) // 25 seconds
{
// Stop viewfinder
if (!PreviewSetState(CAMERA_STATE_STOP))
return FALSE;
// change window offset for preview
pPreviewDataFormat->VideoInfoHeader.rcTarget.left = 50;
pPreviewDataFormat->VideoInfoHeader.rcTarget.top = 50;
if (!ChangeOffset(pPreviewDataFormat))
{
goto vf_error;
}
// Restart viewfinder
if (!PreviewSetState(CAMERA_STATE_PAUSE))
return FALSE;
if (!PreviewSetState(CAMERA_STATE_RUN))
return FALSE;
task++;
g_pKato->Log(CAM_ZONE_ERROR,
(TEXT("PreviewISR: Offset modified.\r\n")));
}
else if ((elapsedTicks > 51000) && (task == 8)) // 44 seconds
{
// Stop viewfinder
if (!PreviewSetState(CAMERA_STATE_STOP))
return FALSE;
// rotate image horizontally for capture
if (!ChangeFlipping(CS_VideoControlFlag_FlipHorizontal))
{
goto vf_error;
}
// Restart viewfinder
if (!PreviewSetState(CAMERA_STATE_PAUSE))
return FALSE;
if (!PreviewSetState(CAMERA_STATE_RUN))
return FALSE;
task++;
g_pKato->Log(CAM_ZONE_ERROR,
(TEXT("PreviewISR: Offset modified.\r\n")));
}
else if ((elapsedTicks > 57000) && (task == 9)) // 44 seconds
{
// Stop viewfinder
if (!PreviewSetState(CAMERA_STATE_STOP))
return FALSE;
// rotate image vertically for capture
if (!ChangeFlipping(CS_VideoControlFlag_FlipVertical))
{
goto vf_error;
}
// Restart viewfinder
if (!PreviewSetState(CAMERA_STATE_PAUSE))
return FALSE;
if (!PreviewSetState(CAMERA_STATE_RUN))
return FALSE;
task++;
g_pKato->Log(CAM_ZONE_ERROR,
(TEXT("PreviewISR: Offset modified.\r\n")));
}
else if ((elapsedTicks > 62000) && (task == 10)) // 44 seconds
{
// Stop viewfinder
if (!PreviewSetState(CAMERA_STATE_STOP))
return FALSE;
if (!ChangeRotation(90))
{
goto vf_error;
}
// Restart viewfinder
if (!PreviewSetState(CAMERA_STATE_PAUSE))
return FALSE;
if (!PreviewSetState(CAMERA_STATE_RUN))
return FALSE;
task++;
g_pKato->Log(CAM_ZONE_ERROR,
(TEXT("PreviewISR: Rotated 90 degrees.\r\n")));
}
else if ((elapsedTicks > 72000) && (task == 11)) // 44 seconds
{
// Stop viewfinder
if (!PreviewSetState(CAMERA_STATE_STOP))
return FALSE;
if (!ChangeRotation(0))
{
goto vf_error;
}
g_pKato->Log(CAM_ZONE_ERROR,
(TEXT("PreviewISR: Done operations... Ending viewfinding.\r\n")));
g_bKillFrameRateThread = TRUE;
WaitForSingleObject(hFrameRateThreadShutdown, 10000);
if (hFrameRateThread)
{
TerminateThread(hFrameRateThread, 0);
CloseHandle(hFrameRateThread);
hFrameRateThread = NULL;
}
if (NULL != pCsPin)
free(pCsPin);
if (NULL != pPreviewDataRange)
free(pPreviewDataRange);
if (NULL != pPreviewDataFormat)
free(pPreviewDataFormat);
return TRUE;
}
#else
else if ((elapsedTicks > 20000) && (task == 4)) // 20S
{
// Stop viewfinder
if (!PreviewSetState(CAMERA_STATE_STOP))
return FALSE;
g_pKato->Log(CAM_ZONE_ERROR,
(TEXT("PreviewISR: Done operations... Ending viewfinding.\r\n")));
g_bKillFrameRateThread = TRUE;
WaitForSingleObject(hFrameRateThreadShutdown, 10000);
if (hFrameRateThread)
{
TerminateThread(hFrameRateThread, 0);
CloseHandle(hFrameRateThread);
hFrameRateThread = NULL;
}
if (NULL != pCsPin)
free(pCsPin);
if (NULL != pPreviewDataRange)
free(pPreviewDataRange);
if (NULL != pPreviewDataFormat)
free(pPreviewDataFormat);
return TRUE;
}
#endif
}
vf_error:
// Stop viewfinder
PreviewSetState(CAMERA_STATE_STOP);
if (NULL != pCsPin)
free(pCsPin);
if (NULL != pPreviewDataRange)
free(pPreviewDataRange);
if (NULL != pPreviewDataFormat)
free(pPreviewDataFormat);
CAM_TEST_FUNCTION_EXIT();
return FALSE;
}
#ifndef BSP_MX27
//------------------------------------------------------------------------------
//
// Function: StillCaptureAndDisplay
//
// This function turns on the still pin, captures an image, and
// writes it to the framebuffer.
//
// Parameters:
// None.
//
// Returns:
// None.
//
//------------------------------------------------------------------------------
static void StillCaptureAndDisplay()
{
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -