
А вот тут снег начал отваливаться от неё:

Веб-камеры Philips SPC 900NC, работает с pwc драйвером. Кроме нескольких замечаний, работает нормально.
update: забыл, драйвер работает на ядре linux 2.6.8.
void
swab (const void *bfrom, void *bto, ssize_t n)
{
const char *from = (const char *) bfrom;
char *to = (char *) bto;
n &= ~((ssize_t) 1);
while (n > 1)
{
const char b0 = from[--n], b1 = from[--n];
to[n] = b0;
to[n + 1] = b1;
}
}
void swab_sse2(const void *from, void *to, ssize_t n) {
const char xmm_mask_1[] __attribute__ ((aligned(16))) = {0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};
const char xmm_mask_2[] __attribute__ ((aligned(16))) = {0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00};
const char *cfrom = (const char *) from;
char *cto = (char *) to;
asm("\
movapd (%0),%%xmm2; \n\
movapd (%1),%%xmm3; \n\
" :
: "r" (xmm_mask_1), "r" (xmm_mask_2)
);
ssize_t i = 0;
while( i < n && ( n - i ) >= 16 ){
asm("\
movupd (%0),%%xmm0; \n\
movapd %%xmm0,%%xmm1; \n\
pslldq $1,%%xmm0; \n\
psrldq $1,%%xmm1; \n\
andpd %%xmm2,%%xmm0; \n\
andpd %%xmm3,%%xmm1; \n\
orpd %%xmm0,%%xmm1; \n\
movupd %%xmm1,(%1); \n\
" :
: "r" (from + i), "r" ( to + i ) );
i += 16;
}
while ( i < n && ( n - i ) >= 2 ){
const char b0 = cfrom[i++], b1 = cfrom[i++];
cto[i - 1] = b0;
cto[i - 2] = b1;
}
}