📄 usbcam.c
字号:
#define U8 unsigned char
#define U16 unsigned short
#define U32 unsigned int
#include "usbcam.h"
#include "zc3xx.h"
HANDLE CameraThread;
#define DOTNET_DRIVER 1
unsigned int DisplayTime = INFINITE;
//unsigned char DisplayEnable=0;
unsigned char buffer_num=0xff; // ping pong buffer
unsigned char image_size = 2; // 1: QCIF, 2:CIF (default)
//#define DRIVER_PREVIEW_ENABLE 2 // 0: onTimeTek, 1: Preview, 2:Samsung Camcorder
unsigned char DRIVER_PREVIEW_ENABLE = 2; // 0: onTimeTek, 1: Preview, 2:Samsung Camcorder
unsigned int frame_count=0; // for MPEG4
DWORD Tick_GET_FRAME_CUR;
DWORD Tick_GET_FRAME_PREV;
DWORD Tick_COPY_FRAME;
PUSBCAM_CONTEXT
GetContextFromReg(
LPTSTR ActivePath
);
BOOL
DllEntry(
HANDLE hDllHandle,
DWORD dwReason,
LPVOID lpreserved
)
{
UNREFERENCED_PARAMETER(hDllHandle);
UNREFERENCED_PARAMETER(lpreserved);
switch (dwReason) {
case DLL_PROCESS_ATTACH:
DEBUGREGISTER((HINSTANCE)hDllHandle);
DisableThreadLibraryCalls((HMODULE) hDllHandle);
break;
case DLL_PROCESS_DETACH:
break;
default:
break;
}
return TRUE;
}
void Display_Cam_Image(U32 pos_x, U32 pos_y, U32 size_x, U32 size_y, U8* buffer_rgb)
{
U32 y;
int temp;
//unsigned short *ptr = (unsigned short *)(FRAMEBUF_BASE+0x5dc0);
//RETAILMSG(1,(_T("Display_Cam_Image()\r\n")));
#if (DOTNET_DRIVER)
SetKMode(TRUE);
#endif
// buffer_rgb += VIRTUAL_OFFSET;
// time = GetTickCount();
// RETAILMSG(1,(TEXT("+:%d\r\n"),(time - old_time)));
#if 1
for (y=0;y<(size_y-2);y++) // YCbCr 4:2:0 format
{
//memcpy((void *)(FRAMEBUF_BASE+0x5e00+y*240*2),(void *)buffer_rgb,(QCIF_XSIZE)*2);
memcpy((void *)(FRAMEBUF_BASE+ (240*pos_y + pos_x) + y*240*2),(void *)buffer_rgb,(QCIF_XSIZE)*2);
buffer_rgb += (QCIF_XSIZE*2);
}
#endif
#if (DOTNET_DRIVER)
SetKMode(FALSE);
#endif
// old_time = GetTickCount();
// RETAILMSG(1,(TEXT("-:%d\r\n"),(old_time - time)));
}
DWORD CameraCaptureThread(LPVOID Context)
{
unsigned char tmp=0;
static unsigned int time,old_time;
static unsigned int cam_intr;
PUSBCAM_CONTEXT pUsbCam=(PUSBCAM_CONTEXT)Context;
static unsigned short transfer_data[PQVGA_XSIZE*PQVGA_YSIZE];
while(1)
{
CAM_Read(pUsbCam,(LPVOID)transfer_data,sizeof(transfer_data));
WaitForSingleObject(pUsbCam->BulkIn.hEvent, DisplayTime);
ResetEvent(pUsbCam->BulkIn.hEvent);
RETAILMSG(MSG_EN_1,(_T("CameraCaptureThread(%d)++\r\n"), frame_count));
//if( DisplayEnable )
{
frame_count++;
// display the image
// if ((DRIVER_PREVIEW_ENABLE == 1) & (cam_intr == BIT_SUB_CAM_P))
Display_Cam_Image(64, 64, QCIF_XSIZE, QCIF_YSIZE, (U8*)transfer_data);
}
}
}
BOOL CAM_Close(PUSBCAM_CONTEXT Context)
{
PUSBCAM_CONTEXT pUsbCam = Context;
RETAILMSG(1,(TEXT("CAM_Close(0x%x)\n"),pUsbCam));
if ( VALID_CONTEXT( pUsbCam ) ) {
EnterCriticalSection(&pUsbCam->Lock);
pUsbCam->Flags.Open = FALSE;
fzc3xx.stop0(pUsbCam);
LeaveCriticalSection(&pUsbCam->Lock);
//
// Note: any waiters are run as soon as we signal this event
//
return SetEvent( pUsbCam->hCloseEvent );
} else {
DEBUGMSG( ZONE_ERR,(TEXT("LPT_Close: ERROR_INVALID_HANDLE\n")));
SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
return TRUE;
}
BOOL CAM_Deinit(PUSBCAM_CONTEXT pUsbCam)
{
BOOL bRc = FALSE;
RETAILMSG(1, (TEXT(">CAM_Deinit\n")));
if ( VALID_CONTEXT( pUsbCam ) ) {
EnterCriticalSection( &pUsbCam->Lock );
bRc = TRUE;
LeaveCriticalSection(&pUsbCam->Lock);
}
return bRc;
}
BOOL CAM_IOControl(PUSBCAM_CONTEXT pUsbCam,DWORD dwCode,PBYTE pBufIn,DWORD dwLenIn,PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut)
{
BOOL RetVal = TRUE;
DWORD dwErr = ERROR_SUCCESS;
static unsigned int time=0,old_time=0;
switch (dwCode)
{
//-----------------------------------------------------------------------------------------
case IOCTL_CAM_SHOW :
// Charlie. Show Menu
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SHOW(%x)\r\n"),dwLenIn));
break;
case IOCTL_CAM_HIDE :
// Charlie. Close display window
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_HIDE\r\n")));
break;
case IOCTL_CAM_SETPOS :
time = GetTickCount();
// RETAILMSG(MSG_EN_1,(TEXT("Capture time:%d msec\r\n"), (time-old_time)));
RETAILMSG(MSG_EN_1,(TEXT("Capture time:%d msec\r\n"), (time)));
old_time = time;
break;
case CAM_IOCTL_MOVIE_START: // for MPEG4
case IOCTL_CAM_CONT :
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_CONT\r\n")));
// Charlie. Play
//DisplayEnable = 1;
fzc3xx.start(pUsbCam);
// Enable camera interrupt
frame_count = 0; // for MPEG4
break;
case CAM_IOCTL_MOVIE_STOP: // for MPEG4
case IOCTL_CAM_STOP :
// Charlie. Stop
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_STOP\r\n")));
// Disable camera interrupt
fzc3xx.stop0(pUsbCam);
//DisplayEnable = 0;
DRIVER_PREVIEW_ENABLE = 2;
DisplayTime = INFINITE;
break;
// for MPEG4
case CAM_IOCTL_GET_LATEST_FRAME:
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:CAM_IOCTL_GET_LATEST_FRAME\r\n")));
//RETAILMSG(MSG_EN_1,(TEXT("pBufIn = 0x%x\r\n"), pBufIn));
//RETAILMSG(MSG_EN_1,(TEXT("no function available, TBD\r\n")));
if (frame_count < 2) {
RETAILMSG(1,(TEXT("CAMERA:CAM_IOCTL_GET_LATEST_FRAME - frame not available!!!\r\n")));
return FALSE;
}
Tick_GET_FRAME_PREV = Tick_GET_FRAME_CUR;
Tick_GET_FRAME_CUR = GetTickCount();
// Copy_Cam_Image(pBufOut, QCIF_XSIZE, QCIF_YSIZE, PORT_A);
break;
case CAM_IOCTL_SAMSUNG_CAM: // ID=0x520
RETAILMSG(MSG_EN_1,(_T("CAM_IOCTL_SAMSUNG_CAM\r\n")));
//Samsung_camcoder(pBufOut);
break;
case CAM_IOCTL_SAMSUNG_CAM_PR: // ID=0x522
RETAILMSG(MSG_EN_1,(_T("CAM_IOCTL_SAMSUNG_CAM_PR\r\n")));
//Samsung_camcoder_pr(pBufOut);
break;
case CAM_IOCTL_SAMSUNG_PREVIEW_START : // ID=0x523
DRIVER_PREVIEW_ENABLE = 1;
RETAILMSG(MSG_EN_1,(_T("CAM_IOCTL_SAMSUNG_PREVIEW_START(%x)\r\n"),*pBufOut, DRIVER_PREVIEW_ENABLE));
break;
case CAM_IOCTL_SAMSUNG_PREVIEW_STOP : // ID=0x524
DRIVER_PREVIEW_ENABLE = 2;
RETAILMSG(MSG_EN_1,(_T("CAM_IOCTL_SAMSUNG_PREVIEW_STOP(%x)\r\n"),*pBufOut, DRIVER_PREVIEW_ENABLE));
break;
case IOCTL_CAM_SETGAMMA :
if( *pBufOut == 1 ){
DRIVER_PREVIEW_ENABLE = 1;
}
else if( *pBufOut == 2 ){
DRIVER_PREVIEW_ENABLE = 2;
}
RETAILMSG(MSG_EN_1,(_T("IOCTL_CAM_SETGAMMA:*pBufOut(%x):DRIVER_PREVIEW_ENABLE(%x)\r\n"),*pBufOut, DRIVER_PREVIEW_ENABLE));
break;
case CAM_IOCTL_IMAGE_SIZE: // ID=0x521
if( *pBufOut == 1 ){
image_size = 1;
}
else if( *pBufOut == 2 ){
image_size = 2;
}
RETAILMSG(MSG_EN_1,(TEXT("image_size:%d,0x%x,0x%x\r\n"),image_size,pBufOut,*pBufOut));
break;
case IOCTL_CAM_COPY :
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_COPY(dwLenIn:%x)\r\n"), dwLenIn));
break;
case IOCTL_CAM_SETCOLKEY :
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETCOLKEY\r\n")));
break;
case IOCTL_CAM_SETALPHA :
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETALPHA\r\n")));
break;
case IOCTL_CAM_GETINFO :
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_GETINFO\r\n")));
break;
case IOCTL_CAM_SETSCALE :
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETSCALE\r\n")));
break;
case IOCTL_CAM_SETHUE :
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETHUE\r\n")));
break;
#if 0
case IOCTL_CAM_SETGAMMA :
// Get which ping -pong buffer have data
//DisplayEnable = 0;
Sleep(200);
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_BUFFER:%d\r\n"),buffer_num));
break;
#endif
case IOCTL_CAM_SETWBCOORD :
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETWBCOORD\r\n")));
break;
case IOCTL_CAM_SETAELIMIT :
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETAELIMIT\r\n")));
break;
case IOCTL_CAM_SETADCOFS :
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETADCOFS\r\n")));
break;
case IOCTL_CAM_SETWBGAIN :
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETWBGAIN\r\n")));
break;
case IOCTL_CAM_SETCBCRGAIN :
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETCBCRGAIN\r\n")));
break;
case IOCTL_CAM_SETLEGAIN :
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETLEGAIN\r\n")));
break;
case IOCTL_CAM_SETBRIGHTNESS :
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETBRIGHTNESS\r\n")));
pUsbCam->brightness = *pBufOut;
fzc3xx.set_bright(pUsbCam);
break;
case IOCTL_CAM_SETCLIP :
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETCLIP\r\n")));
break;
case IOCTL_CAM_SETSLICELMT :
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETSLICELMT\r\n")));
break;
case IOCTL_CAM_WBACCLMT :
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_WBACCLMT\r\n")));
break;
case IOCTL_CAM_CSEDGELMT :
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_CSEDGELMT\r\n")));
break;
case IOCTL_CAM_ENVINT :
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_ENVINT\r\n")));
break;
case IOCTL_CAM_DISVINT :
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_DISVINT\r\n")));
break;
case IOCTL_CAM_SETCAMERA :
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETCAMERA\r\n")));
break;
default :
RETAILMSG(MSG_EN_1,(TEXT("CAMERA:Ioctl code = 0x%x\r\n"), dwCode));
return FALSE;
}
return TRUE;
}
BOOL InitInterruptThread(PUSBCAM_CONTEXT pUsbCam)
{
DWORD threadID; // thread ID
BOOL bSuccess;
CameraThread = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)CameraCaptureThread,
(LPVOID)pUsbCam,
0,
&threadID);
if (NULL == CameraThread ) {
RETAILMSG(1,(TEXT("Create Camera Thread Fail\r\n")));
}
RETAILMSG(1,(_T("CAMERA.DLL::InterruptThread Initialized.\r\n")));
return TRUE;
}
PUSBCAM_CONTEXT CAM_Init(PVOID Context)
{
LPTSTR ActivePath = (LPTSTR)Context; // HKLM\Drivers\Active\xx
PUSBCAM_CONTEXT pUsbCam = NULL;
BOOL bRc = FALSE;
DEBUGMSG(ZONE_LPT_INIT, (TEXT(">CAM_Init(%p)\n"), Context));
//
// get our Context
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -