Would it be at all possible that someone could clear up the order in setting up the various structures when doing mmap? Currently I do... Set CaptureWindow Settings Confirm they are correct Set Picture Settings Confirm Depth and Palette are correct Set Channel Set Tuner to 1 (just to make sure) After this, I would do read() with my current usb webcam driver, however using the mmap, the documentation is a bit thin. It seems to say that I should do... fill video_mmap with depth, height width and palette, the same as the Picture and CaptureWindow settings. Call ioctl VIDIOCMCAPTURE to set this Call ioctl VIDIOCGMBUF get details about buffer lenght Call mmap(0, p_video_mbuf->size, PROT_WRITE, 0, device->Descriptor(), 0) to get a pointer to the capture area Finally do ioctl(device->Descriptor(), VIDIOCMCAPTURE, 0) to start capture, then in my main loop, do ioctl(device->Descriptor(), VIDIOSYNC,0) memcpy from capture buffer to my processing buffer ioctl(device->Descriptor(), VIDIOCMCAPTURE, 0); and repeat ad infinitum, My program doesn't get a valid return result from the mmap() call, it returns MAP_FAILED instead. I've re-read the kernel API reference for v4l several times, and even looked in the bttv-driver.c and videodev.h files but I still don't understand the order I'm supposed to do all ofthis in in order to make it work. I'm going to try a new bttv driver, but installing a new kernel is probably not welcome as we have several custom hardware drivers that have only just been brought from 2.2 to 2.4 :( I hate dealing with legacy stuff :( Ah well, thanks again, here I go :) Michael Spall ECM Systems