--- On Thu, 7/22/10, Laurent Pinchart <[email protected]> wrote: > > Could you try to modify the userspace application to mmap > buffers only right > before reading from them (after VIDIOC_DQBUF) and unmap > them when you're done > (before requeuing the buffer with VIDIOC_QBUF) ? > Great idea! I tried this, and it resolved all corruption. It incurs a slight drop in frame rate, but I think this is an acceptable trade-off.
Also, without this workaround in place, I was able to extract two copies
of a JPEG via two methods:
1. Through my application
2. Through an in-line hardware USB analyzer
The copy obtained through the application is corrupt, while the "sniffed"
copy is not. A binary diff between them shows that two 32-byte chunks have
been replaced with random data. Sorry to keep harping on this, but 32
bytes is the size of a cache line on my platform.
I thought that perhaps the uvc_video_queue's mem buffer was susceptible to
cache aliasing because it has 2 mappings:
1. from vmalloc_32
2. from mmap
I added a call to flush_dcache_page() (looping over the appropriate pages)
after memcpy-ing from the urb's transfer_buffer to the uvc_video_queue's
mem, but this had no effect on the corruption.
I've attached the two JPEGs mentioned above.
<<attachment: corrupt.jpg>>
<<attachment: correct.jpg>>
_______________________________________________ Linux-uvc-devel mailing list [email protected] https://lists.berlios.de/mailman/listinfo/linux-uvc-devel
