Using ICOpen etc to decompress the i420 stream into plain RGB but for some reason it fails on the call to ICDecompress.
I'm not sure if I need to load a specific decompressor somehow? But ICOpen doesn't fail just ICDecompress call? But it's my first time playing with this stuff.
My work in progress code is:
int cameraSize[2] = { 128, 128 };
HWND cameraWindow = 0;
GLuint webcamTexture = 0;
HIC decompressor = 0;
BITMAPINFO bitmapInfo[2];
BYTE* imageData;
LRESULT WINAPI webcam_callback(HWND window, LPVIDEOHDR video_hdr)
{
DWORD error = ICDecompress(decompressor, 0, &bitmapInfo[0].bmiHeader, video_hdr->lpData, &bitmapInfo[1].bmiHeader, imageData);
if(error != ICERR_OK)
_asm int 3;
/*
glBindTexture(TEXRECT, webcamTexture);
glTexSubImage2D(TEXRECT, 0, 0, 0, cameraSize[0], cameraSize[1], GL_BGR_EXT, GL_UNSIGNED_BYTE, imageData);
*/
return true;
};
bool webcam_init(HWND window)
{
CAPDRIVERCAPS driverCaps;
for(int driverIndex = 0; driverIndex < 10; ++driverIndex)
{
wchar_t deviceVersion[80];
wchar_t deviceName[80];
if(capGetDriverDescription( driverIndex,
deviceName,
sizeof(deviceName), deviceVersion,
sizeof(deviceVersion)))
{
int a = 3;
}
}
cameraWindow = capCreateCaptureWindow( L"CamDemo",
WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
0, 0,
1, 1,
window,
0);
if(!cameraWindow)
return false;
if(!capDriverConnect(cameraWindow, 0))
return false;
capDriverGetCaps(cameraWindow, &driverCaps, sizeof(driverCaps));
capSetCallbackOnFrame(cameraWindow, webcam_callback);
capPreviewScale(cameraWindow, FALSE);
capPreviewRate(cameraWindow, 400); //ms
capPreview(cameraWindow, true);
/*
CAPTUREPARMS p;
capCaptureGetSetup(cameraWindow, &p, sizeof(CAPTUREPARMS));
//p.dwRequestMicroSecPerFrame = 66667/2;
//capCaptureSetSetup(cameraWindow, &p, sizeof(CAPTUREPARMS));
*/
memset(&bitmapInfo[0], 0, sizeof(bitmapInfo[0]));
bitmapInfo[0].bmiHeader.biSize = sizeof(bitmapInfo[0].bmiHeader);
capGetVideoFormat(cameraWindow, &bitmapInfo[0], sizeof(bitmapInfo[0]));
cameraSize[0] = bitmapInfo[0].bmiHeader.biWidth;
cameraSize[1] = bitmapInfo[0].bmiHeader.biHeight;
decompressor = ICOpen(MAKEFOURCC('V','I','D','C'), bitmapInfo[0].bmiHeader.biCompression, ICMODE_FASTDECOMPRESS);
if(!decompressor)
_asm int 3;
memset(&bitmapInfo[1], 0, sizeof(bitmapInfo[1]));
bitmapInfo[1].bmiHeader.biSize = sizeof(bitmapInfo[1].bmiHeader);
bitmapInfo[1].bmiHeader.biWidth = cameraSize[0];
bitmapInfo[1].bmiHeader.biHeight = cameraSize[1];
bitmapInfo[1].bmiHeader.biCompression = BI_RGB;
bitmapInfo[1].bmiHeader.biBitCount = 24;
bitmapInfo[1].bmiHeader.biPlanes = 1;
bitmapInfo[1].bmiHeader.biSizeImage = cameraSize[0]*cameraSize[1]*3;
if(ICDecompressBegin(decompressor, &bitmapInfo[0], &bitmapInfo[1]) != ICERR_OK)
_asm int 3;
BYTE* imageData = new BYTE[cameraSize[0]*cameraSize[1]*3];
/*
glGenTextures(1, &webcamTexture);
glBindTexture(TEXRECT, webcamTexture);
glTexImage2D(TEXRECT, 0, 3, cameraSize[0], cameraSize[1], 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, imageData);
glTexParameteri(TEXRECT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(TEXRECT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameterf(TEXRECT, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(TEXRECT, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
*/
return true;
}
void webcam_destroy()
{
delete[] imageData;
ICDecompressEnd(decompressor);
ICClose(decompressor);
capSetCallbackOnFrame(cameraWindow, 0);
capDriverDisconnect(cameraWindow);
DestroyWindow(cameraWindow);
}












