Philips WebCam 드라이버가 리눅스 커널 2.4.6에 기본으로 포함되어 있는데
여러가지 이유로 프로그램과 주고받는 스트림형식이 틀려져서 기존의
linux4video나 bttv를 지원하는 많은 프로그램들이 실행이 안됩니다.
장치를 사용하기 위해서는 드라이버 개발자가 직접 만든 프로그램으로만
가능한데(camstream) 이 프로그램의 단점이 항상 창을 띄어놓아야 한다는 것과
(최소화 시켜도 안됩니다), CPU 리소스를 많이 먹는다는 점입니다.
그래서 단순히 웹캠을 테스트하기 위해 xawtv와 같은 개발자가 만든 webcam
프로그램을 사용하기 위해 약간의 패치를 했습니다.
큰 건 없고 yuv420p 형식을 rgb24 형식으로 변환하는 함수를
추가해준 것 뿐입니다.
현재 저희 연구실에서 잘 사용하고 있습니다...
;
(필립스 베스타 프로인데... 정말 화질 괜찮군요...)
다음은 패치 내용입니다.
diff -uNr xawtv-3.55.orig/libng/color_yuv2rgb.c xawtv-3.55/libng/color_yuv2rgb.c
--- xawtv-3.55.orig/libng/color_yuv2rgb.c Wed May 30 16:32:15 2001
+++ xawtv-3.55/libng/color_yuv2rgb.c Fri Jul 13 14:56:02 2001
@@ -191,6 +191,40 @@
}
}
+static void
+yuv420p_to_rgb24(void *h, struct ng_video_buf *out, struct ng_video_buf *in)
+{
+ unsigned char *y,*u,*v, *_u, *_v;
+ unsigned char *dp,*d;
+ int i,j,gray;
+
+ dp = out->data;
+ y = in->data;
+ u = y + in->fmt.width * in->fmt.height;
+ v = u + in->fmt.width * in->fmt.height / 4;
+
+ for (i = 0; i < in->fmt.height; i++) {
+ d = dp;
+ _u = u; _v = v;
+ for (j = 0; j < in->fmt.width; j+= 2) {
+ gray = GRAY(*y);
+ *(d++) = RED(gray,*_v);
+ *(d++) = GREEN(gray,*_v,*_u);
+ *(d++) = BLUE(gray,*_u);
+ y++;
+ gray = GRAY(*y);
+ *(d++) = RED(gray,*_v);
+ *(d++) = GREEN(gray,*_v,*_u);
+ *(d++) = BLUE(gray,*_u);
+ y++; _u++; _v++;
+ }
+ if (i % 2) {
+ u = _u; v = _v;
+ }
+ dp += out->fmt.bytesperline;
+ }
+}
+
void
ng_yuv422p_to_lut2(void *h, struct ng_video_buf *out, struct ng_video_buf *in)
{
@@ -275,6 +309,12 @@
fini: ng_conv_nop_fini,
frame: yuv422p_to_rgb24,
fmtid_in: VIDEO_YUV422P,
+ fmtid_out: VIDEO_RGB24,
+ },{
+ init: ng_conv_nop_init,
+ fini: ng_conv_nop_fini,
+ frame: yuv420p_to_rgb24,
+ fmtid_in: VIDEO_YUV420P,
fmtid_out: VIDEO_RGB24,
},{
init: ng_conv_nop_init,--Carpediem...