📄 capture1.cpp
字号:
{
#ifdef AUTO_ADJUST
W(0x13, 0xa3); //enable AGC, AEC
W(0x06, 0x80); //brightness
W(0x10, 0x00); //exposure
W(0x00, 0x00); //gain
#else
W(0x13, 0xa0); //disable AGC, AEC
W(0x06, 0xa0); //brightness
W(0x10, 0x20); //exposure
W(0x00, 0x1f); //gain
//W(0x11, 0x00); //gain
//{ 0x14, 0x04 }, //00(04), bit5:QVGA
//{ 0x28, 0x60 }, //60(80) //select for 7141
#endif
}
void StartCapture()
{
HANDLE hthrd;
int cbInput, cbOutput;
if(!inited)
return;
if(started)
return;
started = 1;
// lightcontrol(1, 1);
cbInput = 0;
cbOutput = 0;
cbInput = sizeof(XLLP_OVERLAY_T);
if (bCapturingVideo == FALSE)
{
#ifdef DISPLAY_PIC
ExtEscape(hDC, OVERLAY2_ENABLE, cbInput, (LPCSTR)&XllpOverlay, cbOutput, NULL);
#endif
hthrd = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)CameraCaptureThread,NULL,0,NULL);
CloseHandle(hthrd);
}
}
void PauseCapture()
{
if(!inited)
return;
if(!started)
return;
if(!bPauseCapture) {
bPauseCapture = TRUE;
WaitForSingleObject(hPausedEvent, 300);
// lightcontrol(0, 0);
} else { //save picture
// extern int savetobmpfile(const void * buf, unsigned int len, unsigned int width, unsigned int height, unsigned int bpp, const char * path);
//savetobmpfile(pOverlay2_Y, XllpOverlay.ch2_size, XllpOverlay.OverlayWidth, \
// XllpOverlay.OverlayHeight, 8, "/cap-lcd.bmp");
// savetobmpfile(ring_buffer_address[frameCount], CameraApp.VideoWidth * CameraApp.VideoHeight, \
// CameraApp.VideoWidth, CameraApp.VideoHeight, 8, "/cap-raw.bmp");
}
}
void ContinueCapture()
{
if(!inited)
return;
if(!started)
return;
if(bPauseCapture) {
// lightcontrol(1, 1);
bPauseCapture = FALSE;
SetEvent(hContinueEvent);
}
}
void StopCapture()
{
int cbInput, cbOutput;
if(!inited)
return;
if(!started)
return;
started = 0;
// lightcontrol(0, 0);
cbInput = 0;
cbOutput = 0;
cbInput = sizeof(XLLP_OVERLAY_T);
// can't disable when the L clk is too high
#ifdef DISPLAY_PIC
ExtEscape(hDC, OVERLAY2_DISABLE, cbInput, (LPCSTR)&XllpOverlay, cbOutput, NULL);
#endif
bCapturingVideo = FALSE;
// for the case that capture already paused, let the thread go and exit
ContinueCapture();
}
int InitCapture()
{
int cbInput, cbOutput;
unsigned int i;
cbInput = sizeof(XLLP_OVERLAY_T);
cbOutput = 0;
hDC = CreateDC(NULL, NULL, NULL, NULL);
NKDbgPrintfW(_T("\t\thDC:0x%x\r\n"), hDC);
// Fill in the overlay parameters, then query for the dynamic address of the overlay channels
//XllpOverlay.OverlayWidth = 240;
//XllpOverlay.OverlayHeight = 270;
//XllpOverlay.X_Position = (240 - XllpOverlay.OverlayWidth) / 2;
//XllpOverlay.Y_Position = 25;
#ifdef DISPLAY_PIC
XllpOverlay.OverlayWidth = 214;
XllpOverlay.OverlayHeight = 160;
XllpOverlay.X_Position = 13;
XllpOverlay.Y_Position = 50;
XllpOverlay.Format = FORMAT_PLANAR_422;
XllpOverlay.OverlayBPP = O_BPP_16;
XllpOverlay.DegradeBaseFrame = FALSE;
if(ExtEscape(hDC, GET_OVERLAY2_ADDRESS, cbInput, (LPCSTR)&XllpOverlay, cbOutput, NULL) <= 0)
{
//error or not support
ERRORMSG(1,(TEXT("ExtEscape get_overlay2_address error\r\n")));
return -1;
}
// Copy YUV data to buffers pointed to by .CH2, .CH3, .CH4 (addresses filled in by video driver)
pOverlay2_Y = (PBYTE)VirtualAllocCopy(320*240*4,"pOverlay2_Y",(PVOID)(XllpOverlay.CH2_Y));
pOverlay2_Cb = (PBYTE)VirtualAllocCopy(320*240,"pOverlay2_Cb",(PVOID)(XllpOverlay.CH3_Cb));
pOverlay2_Cr = (PBYTE)VirtualAllocCopy(320*240,"pOverlay2_Cr",(PVOID)(XllpOverlay.CH4_Cr));
#endif
#ifdef FULL_CAPTURE_SIZE
CameraApp.VideoWidth = 640;
CameraApp.VideoHeight = 480;
#else
CameraApp.VideoWidth = XllpOverlay.OverlayWidth;
CameraApp.VideoHeight = XllpOverlay.OverlayHeight;
#endif
CameraApp.StillWidth = 640;
CameraApp.StillHeight = 480;
CameraApp.CaptureFormat = FORMAT_RAW_8;
CameraApp.FrameRate = 0; // 0 = max frame rate available
// Initialize the Camera with our settings
cbInput = sizeof(CAMERA_APP_T);
if(ExtEscape(hDC, CAMERA_INITIALIZE, cbInput, (LPCSTR)&CameraApp, cbOutput, NULL) <= 0) {
ERRORMSG(1,(TEXT("ExtEscape camera_initialize error\r\n")));
return -2;
}
if(CameraApp.frame_nums <= 0) {
ERRORMSG(1,(TEXT("got camera frame nums: %d!\r\n"), CameraApp.frame_nums));
return -3;
}
for (i = 0; i < CameraApp.frame_nums; i++)
{
ring_buffer_address[i] = (void *)VirtualAllocCopy(CameraApp.VideoWidth * CameraApp.VideoHeight ,"ringbuffer",(PVOID)(CameraApp.ring_buffer_address[i]));
if(!ring_buffer_address[i]) {
ERRORMSG(1,(TEXT("map ring buffer(%d) address error!\r\n"), i));
return -4;
}
}
// capture thread waits on this event for each frame
hEvent = CreateEvent(NULL, FALSE, FALSE, CAMERA_EVENT_NAME);
if(!hEvent) {
ERRORMSG(1,(TEXT("create event failed! 0x%x\r\n"),GetLastError()));
return -5;
}
hContinueEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
hPausedEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
//wsizecontrol();
//cisizecontrol();
setregisters();
inited = 1;
return 0;
}
void DeinitCapture()
{
int status;
if(!inited)
return;
if(started)
StopCapture();
status = ExtEscape(hDC, CAMERA_DEINIT, 0, NULL, 0, NULL);
if(status <= 0)
ERRORMSG(1,(TEXT("deinit capture fail, 0x%x(0x%x)\r\n"), status, GetLastError()));
}
#define PAGE_SIZE 0x1000
#define ALIGNMENT_MASK (PAGE_SIZE-1)
extern "C" BOOL VirtualCopy(
LPVOID lpvDest,
LPVOID lpvSrc,
DWORD cbSize,
DWORD fdwProtect
);
static PVOID VirtualAllocCopy(unsigned size,char *str,PVOID pVirtualAddress)
{
PVOID ptr;
unsigned offset;
offset = (unsigned)pVirtualAddress & ALIGNMENT_MASK;
size +=offset ? PAGE_SIZE : 0;
ptr = VirtualAlloc(0,size,MEM_RESERVE,PAGE_NOACCESS);
if (ptr == NULL) {
ERRORMSG(1,(TEXT("VirtualAlloc failed! %s : size=0x%x, (0x%x)\r\n"),str,size,GetLastError()));
return(0);
}
if (!VirtualCopy((PVOID)ptr,(PVOID)((unsigned)pVirtualAddress - offset),size,PAGE_READWRITE|PAGE_NOCACHE)) {
ERRORMSG(1,(TEXT("VirtualCopy failed! %s : addr=0x%x, offset=0x%x(0x%x)\r\n"),str,(unsigned)pVirtualAddress,offset,GetLastError()));
return(0);
}
return((PVOID)((PBYTE)ptr+offset));
}
void SavePic(void *p)
{
memcpy(p, ring_buffer_address[frameCount], 640*480);
}
void SeePic(void *p)
{
// XllpOverlay.OverlayWidth = 230;
// XllpOverlay.OverlayHeight = 188;
// CameraApp.StillWidth = 640;
// CameraApp.StillHeight = 480;
/* unsigned int i,j,t,w;
unsigned char * src = new unsigned char[XllpOverlay.OverlayHeight*XllpOverlay.OverlayWidth];
unsigned char * dst = pOverlay2_Y;
int rt_Height = (CameraApp.StillHeight-
(CameraApp.StillHeight % XllpOverlay.OverlayHeight))/
XllpOverlay.OverlayHeight;
int rt_Width = (CameraApp.StillWidth-
(CameraApp.StillWidth % XllpOverlay.OverlayWidth))
/XllpOverlay.OverlayWidth;
unsigned long rtf_Height = CameraApp.StillHeight/XllpOverlay.OverlayHeight;
unsigned long rtf_Width = CameraApp.StillWidth/XllpOverlay.OverlayWidth;
//图片缩放
for(i=0; i<XllpOverlay.OverlayHeight; i++)
for (j=0; j<XllpOverlay.OverlayWidth; j++)
{
t=(int)((i+1)*rtf_Height);
w=(int)((j+1)*rtf_Width);
if (t>CameraApp.StillHeight||w>CameraApp.StillWidth)
{
AfxMessageBox(_T("chang size error"));
return;
}
t-=1;
w-=1;
*(src + i*XllpOverlay.OverlayWidth +j)=*((unsigned char *)p + t*CameraApp.StillWidth+w);
}
memcpy(dst, src, XllpOverlay.OverlayHeight*XllpOverlay.OverlayWidth);
delete(src);
*/
#ifdef DISPLAY_PIC
unsigned int i,j;
unsigned int size;
size = XllpOverlay.OverlayHeight*XllpOverlay.OverlayWidth;
unsigned char * src = new unsigned char[size];
unsigned char * dst = pOverlay2_Y;
memset(src, 0, size);
for(i=0; i<XllpOverlay.OverlayHeight; i++)
{
for (j=0; j<XllpOverlay.OverlayWidth; j++)
{
// *(src + i*XllpOverlay.OverlayWidth +j)=*((unsigned char *)p + (TOP_SPACE_LINE+i*2)*CameraApp.StillWidth+LEFT_SPACE_LINE+j*2);
*(src + i*XllpOverlay.OverlayWidth +j)=*((unsigned char *)p + 3*i*CameraApp.StillWidth+3*j);
}
}
memcpy(dst, src, XllpOverlay.OverlayHeight*XllpOverlay.OverlayWidth);
delete(src);
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -