Hi,
Iam starting to build an USB Webcam Driver for a toucam webcam from
Phillips. When i start receiving frames from the webcam i wonder that the
framenumber not increase by the numbers of frames i receive. This is my
code. To detect the end of a video frame iam looking for a packet that is
smaller then the normal size. But i receive the small frames at at irregular
intervals so maybe i dont get all frames.
DWORD TransferComplete(PVOID lpParam) {
DWORD dwError[NFRAMES_PER_XFR];
DWORD recvLens[NFRAMES_PER_XFR];
BOOL print = FALSE;
UINT i;
PTUCAMDRIVER_USB_CLIENT pUsbClient = (PTUCAMDRIVER_USB_CLIENT) lpParam;
CALL_USBD_FUNC(pUsbClient,lpGetIsochResults)(pUsbClient->hTransferHandle,
NFRAMES_PER_XFR,
&recvLens[0],
&dwError[0]);
if(pUsbClient->hFrameFile != NULL) {
DWORD ticks = GetTickCount();
DWORD written;
char buffer[50];
DWORD frame;
CHAR tmp[8];
CALL_USBD_FUNC(pUsbClient,lpGetFrameNumber)(pUsbClient->hUsbClient,
&frame);
memset(buffer, 0, sizeof(buffer));
sprintf(buffer, "\r\n[%d,%d,%d] Frames: " , ticks, frame,
pUsbClient->frame_total_size);
WriteFile(pUsbClient->hFrameFile, buffer, sizeof(buffer), &written, 0);
for(i=0; i < NFRAMES_PER_XFR; i++) {
memset(tmp, 0, sizeof(tmp));
sprintf(tmp, "%d,", recvLens[i]);
WriteFile(pUsbClient->hFrameFile, tmp, sizeof(tmp), &written, 0);
}
}
SetEvent(pUsbClient->hEventComplete);
return 0;
}
DWORD WINAPI GrabbingFramesThread( LPVOID lpParam )
{
PTUCAMDRIVER_USB_CLIENT pUsbClient = (PTUCAMDRIVER_USB_CLIENT) lpParam;
USB_PIPE hPipe;
UINT i;
UINT frameSize;;
pUsbClient->hEventComplete = CreateEvent( NULL, FALSE, FALSE, NULL);
frameSize = pUsbClient->IsochInEp[0].MaxUSBPacketSize;
hPipe = pUsbClient->IsochInEp[0].PipeInfo.AsDataPipe.hPipe;
pUsbClient->frameBuf = (PBYTE)malloc(sizeof(BYTE) * frameSize *
NFRAMES_PER_XFR);
CALL_USBD_FUNC(pUsbClient,lpResetPipe)(hPipe);
//CALL_USBD_FUNC(pUsbClient, lpSyncFrame)(pUsbClient->hUsbClient, NULL,
NULL, 0, pUsbClient->IsochInEp[0].PipeInfo.AsDataPipe.Address,
&pUsbClient->FrameNumber);
//CALL_USBD_FUNC(pUsbClient,lpGetFrameNumber)(pUsbClient->hUsbClient,
&pUsbClient->FrameNumber);
while(pUsbClient->Grabbing) {
if(hPipe == NULL) {
MsgBox(TEXT("Pipe not open"));
pUsbClient->Grabbing = FALSE;
break;
}
for (i=0; i<NFRAMES_PER_XFR; ++i)
pUsbClient->frameLen[i] = frameSize;
pUsbClient->hTransferHandle =
CALL_USBD_FUNC(pUsbClient,lpIssueIsochTransfer)(
hPipe,
TransferComplete,
pUsbClient,
(USB_NO_WAIT | USB_IN_TRANSFER | USB_START_ISOCH_ASAP),
0, //pUsbClient->FrameNumber,
NFRAMES_PER_XFR,
&pUsbClient->frameLen[0],
pUsbClient->frameBuf,
0);
if(pUsbClient->hTransferHandle == NULL) {
DISPLAY_ERROR_CODE(TEXT("Isoch Failed"));
pUsbClient->Grabbing = FALSE;
break;
}
WaitForSingleObject(pUsbClient->hEventComplete,INFINITE);
if (pUsbClient->hTransferHandle != NULL) /* free this transfer */
CALL_USBD_FUNC(pUsbClient,lpCloseTransfer)(pUsbClient->hTransferHandle);
//pUsbClient->FrameNumber += NFRAMES_PER_XFR;
}
return 0;
}
Thanks,
Sebastian