diff -u bttv-0.5.8/XTV/Imakefile buz-XTV/Imakefile
--- bttv-0.5.8/XTV/Imakefile	Sun Feb 22 00:03:49 1998
+++ buz-XTV/Imakefile	Mon Aug 10 17:13:54 1998
@@ -2,7 +2,7 @@
 
 OBJS = xtvscreen.o visual.o TVscreen.o channel.o callbacks.o allwidgets.o snap.o sound.o 
 
-LOCAL_LIBRARIES = -ljpeg -lXm -lXpm $(XLIB) $(XTOOLLIB) -lXxf86dga -lg++ -lm -lX11 -lstdc++
+LOCAL_LIBRARIES = -ljpeg -lXm -lXpm $(XLIB) $(XTOOLLIB) -lXxf86dga -lXp -lm -lX11 -lstdc++
 
 NormalProgramTarget(xtvscreen,$(OBJS),$(SRCS),,$(LOCAL_LIBRARIES))
 
diff -u bttv-0.5.8/XTV/Makefile buz-XTV/Makefile
--- bttv-0.5.8/XTV/Makefile	Tue Mar 17 14:45:15 1998
+++ buz-XTV/Makefile	Sat Aug 22 03:00:50 1998
@@ -8,7 +8,7 @@
 #
 #
 #
-# $XFree86: xc/config/cf/Imake.tmpl,v 3.32.2.5 1997/07/06 07:27:59 dawes Exp $
+# $XFree86: xc/config/cf/Imake.tmpl,v 3.32.2.8 1998/02/08 11:19:24 dawes Exp $
 # ----------------------------------------------------------------------
 
 all::
@@ -25,22 +25,22 @@
 # site:  $XConsortium: site.def /main/revisionist/4 1996/12/31 08:02:07 kaleb $
 # site:  $XFree86: xc/config/cf/site.def,v 3.17.2.1 1997/06/22 10:32:21 dawes Exp $
 
-# $XFree86: xc/config/cf/xf86site.def,v 3.101.2.11 1997/06/22 10:32:22 dawes Exp $
+# $XFree86: xc/config/cf/xf86site.def,v 3.101.2.15 1998/02/24 19:05:42 hohndel Exp $
 
 # ----------------------------------------------------------------------
 # platform-specific configuration parameters - edit linux.cf to change
 
 # platform:  $TOG: linux.cf /main/36 1997/06/16 22:21:03 kaleb $
-# platform:  $XFree86: xc/config/cf/linux.cf,v 3.57.2.10 1997/07/28 14:17:25 dawes Exp $
+# platform:  $XFree86: xc/config/cf/linux.cf,v 3.57.2.12 1998/03/01 01:57:10 dawes Exp $
 
-# operating system:  Linux 2.1.72 i686 [ELF] (2.1.72)
-# libc:	(5.1073770848.0)
-# binutils:	(28)
+# operating system:  Linux 2.1.117 i686 [ELF] (2.1.117)
+# libc:	(6.0.7)
+# binutils:	(29)
 
 # $XConsortium: lnxLib.rules /main/13 1996/09/28 16:11:01 rws $
 # $XFree86: xc/config/cf/lnxLib.rules,v 3.28.2.3 1997/06/22 10:32:20 dawes Exp $
 
-# $XFree86: xc/config/cf/xfree86.cf,v 3.129.2.14 1997/07/06 07:28:00 dawes Exp $
+# $XFree86: xc/config/cf/xfree86.cf,v 3.129.2.22 1998/02/24 19:05:43 hohndel Exp $
 
 # $XConsortium: xfree86.cf /main/34 1996/12/06 11:45:18 rws $
 
@@ -102,7 +102,7 @@
 # ---------------------------------------------------------------------
 # Imake rules for building libraries, programs, scripts, and data files
 # rules:  $TOG: Imake.rules /main/222 1997/07/17 20:04:40 kaleb $
-# rules:  $XFree86: xc/config/cf/Imake.rules,v 3.33.2.5 1997/07/19 04:59:07 dawes Exp $
+# rules:  $XFree86: xc/config/cf/Imake.rules,v 3.33.2.7 1998/02/06 09:02:17 dawes Exp $
 
  _NULLCMD_ = @ echo -n
 
@@ -141,19 +141,19 @@
 
                AR = ar clq
   BOOTSTRAPCFLAGS =
-               CC = gcc -static
+               CC = gcc
                AS = as
 
 .SUFFIXES: .cc
 
-              CXX = c++ -static
+              CXX = c++
           CXXFILT = c++filt
            CXXLIB =
     CXXDEBUGFLAGS = -O2 -fno-strength-reduce
 CXXDEPENDINCLUDES =
  CXXEXTRA_DEFINES =
 CXXEXTRA_INCLUDES =
-   CXXSTD_DEFINES = -Dlinux -D__i386__ -D_POSIX_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -DX_LOCALE $(CXXPROJECT_DEFINES)
+   CXXSTD_DEFINES = -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE $(CXXPROJECT_DEFINES)
        CXXOPTIONS =
       CXXINCLUDES = $(INCLUDES) $(TOP_INCLUDES) $(CXXEXTRA_INCLUDES)
        CXXDEFINES = $(CXXINCLUDES) $(CXXSTD_DEFINES) $(THREADS_CXXDEFINES) $(CXXEXTRA_DEFINES) $(DEFINES)
@@ -162,7 +162,7 @@
          COMPRESS = compress
           GZIPCMD = gzip
               CPP = /lib/cpp $(STD_CPP_DEFINES)
-    PREPROCESSCMD = gcc -static -E $(STD_CPP_DEFINES)
+    PREPROCESSCMD = gcc -E $(STD_CPP_DEFINES)
           INSTALL = install
      INSTALLFLAGS = -c
                LD = ld
@@ -198,8 +198,8 @@
             LATEX = latex
 
      STD_INCLUDES =
-  STD_CPP_DEFINES = -traditional -Dlinux -D__i386__ -D_POSIX_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -DX_LOCALE $(PROJECT_DEFINES)
-      STD_DEFINES = -Dlinux -D__i386__ -D_POSIX_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -DX_LOCALE $(PROJECT_DEFINES)
+  STD_CPP_DEFINES = -traditional -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE $(PROJECT_DEFINES)
+      STD_DEFINES = -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L -D_BSD_SOURCE -D_SVID_SOURCE $(PROJECT_DEFINES)
  EXTRA_LOAD_FLAGS =
   EXTRA_LDOPTIONS =
   EXTRA_LIBRARIES =
@@ -281,7 +281,7 @@
 #
 #
 #
-# $XFree86: xc/config/cf/X11.tmpl,v 1.8.2.3 1997/05/21 15:02:13 dawes Exp $
+# $XFree86: xc/config/cf/X11.tmpl,v 1.8.2.4 1998/01/23 12:35:08 dawes Exp $
 
 # -----------------------------------------------------------------------
 # X Window System make variables; these need to be coordinated with rules
@@ -304,6 +304,8 @@
            LIBDIR = $(USRLIBDIR)/X11
    TOP_X_INCLUDES = -I$(XPROJECTROOT)/include
 
+           VARDIR = /var/X11
+
           FONTDIR = $(LIBDIR)/fonts
          XINITDIR = $(LIBDIR)/xinit
            XDMDIR = $(LIBDIR)/xdm
@@ -615,7 +617,7 @@
 
 OBJS = xtvscreen.o visual.o TVscreen.o channel.o callbacks.o allwidgets.o snap.o sound.o
 
-LOCAL_LIBRARIES = -ljpeg -lXm -lXpm $(XLIB) $(XTOOLLIB) -lXxf86dga -lg++ -lm -lX11 -lstdc++
+LOCAL_LIBRARIES = -ljpeg -lXm -lXpm $(XLIB) $(XTOOLLIB) -lXxf86dga -lXp -lm -lX11 -lstdc++
 
 xtvscreen: $(OBJS) $(SRCS)
 	$(RM) $@
diff -u bttv-0.5.8/XTV/TVscreen.c buz-XTV/TVscreen.c
--- bttv-0.5.8/XTV/TVscreen.c	Thu May  7 16:26:12 1998
+++ buz-XTV/TVscreen.c	Mon Aug 31 05:20:17 1998
@@ -28,13 +28,13 @@
 
 /*#define DEBUG*/
 
-#define DEFAULT_WIDTH    320
+#define DEFAULT_WIDTH    360
 #define DEFAULT_HEIGHT   240  
 
-#define PAL_WIDTH 768
+#define PAL_WIDTH 720
 #define PAL_HEIGHT 576
 
-#define NTSC_WIDTH 640
+#define NTSC_WIDTH 720
 #define NTSC_HEIGHT 480
 
 #define DEFAULT_DELAY 100
@@ -270,14 +270,16 @@
 		 tw->TVscreen.visual, *value_mask, attributes);
 
   if (tw->TVscreen.CAP_ON){
-    int v=tw->TVscreen.INPUT;
+    struct video_channel vc;
+    vc.channel=tw->TVscreen.INPUT;
+    vc.norm=tw->TVscreen.NORM;
     tw->TVscreen.Change=TRUE;
 #ifndef NOCARD
     if(ioctl(tw->TVscreen.fbttv, VIDIOCSWIN, &tw->TVscreen.vwin))
       perror("VIDIOCSWIN");
     /* Set the input */
-    if(ioctl(tw->TVscreen.fbttv, VIDIOCSCHAN, &v))
-      perror("VIDIOCSTUNER");
+    if(ioctl(tw->TVscreen.fbttv, VIDIOCSCHAN, &vc))
+      perror("VIDIOCSCHAN");
     /* Set the frequency */
     if(ioctl(tw->TVscreen.fbttv, VIDIOCSFREQ, &tw->TVscreen.frequency))
       perror("VIDIOCSFREQ");
@@ -370,20 +372,15 @@
 
 
 #ifndef NOCARD
-static void addclip(cr,ncr,x,y,x2,y2)
-struct cliprec *cr;
+static void addclip(cr,ncr,x,y,w,h)
+struct video_clip *cr;
 int *ncr; 
-uint x,y,x2,y2;
+uint x,y,w,h;
 {
   cr[*ncr].x=x;
   cr[*ncr].y=y;
-#ifdef OLDBTTV
-  cr[*ncr].x2=x2;
-  cr[*ncr].y2=y2;
-#else
-  cr[*ncr].x2=x2-x;
-  cr[*ncr].y2=y2-y;
-#endif
+  cr[*ncr].width=w;
+  cr[*ncr].height=h;
   *ncr=*ncr+1;
 } 
 #endif
@@ -426,7 +423,6 @@
   struct video_clip *cr; 
   Widget widpar;
 
-
   if (!XtIsRealized((Widget)w)) return;
 
   disp=XtDisplay((Widget)w);
@@ -445,17 +441,6 @@
   wx=vwin.x; wy=vwin.y;
   wh=vwin.height; ww=vwin.width;
 
-#if 0
-  if (wx<0)
-    addclip(cr, &ncr, 0, 0, (uint)(-wx), wh-1);
-  if (wy<0)
-    addclip(cr, &ncr, 0, 0, ww-1, (uint)(-wy));
-  if ((wx+ww) > vbuf.width)
-    addclip(cr, &ncr, vbuf.width-wx, 0, ww-1, wh-1);
-  if ((wy+wh) > vbuf.height)
-    addclip(cr, &ncr, 0, vbuf.height-wy, ww-1, wh-1);
-#endif
-    
   root=DefaultRootWindow(disp);
   swin=win;
   while (parent!=root) {
@@ -474,20 +459,8 @@
     if (!(wts.map_state & IsViewable))  continue;
     
     x=wts.x-vwin.x; y=wts.y-vwin.y;
-    x2=x+wts.width+2*wts.border_width-1;
-    y2=y+wts.height+2*wts.border_width-1;
-    if ((x2 < 0) || (x >= (int)ww) ||
-	(y2 < 0) || (y >= (int)wh))
-      continue;
-
-    if (x<0)
-      x=0;
-    if (y<0)
-      y=0;
-    if (x2>=(int)ww)
-      x2=ww-1;
-    if (y2>=(int)wh)
-      y2=wh-1;
+    x2=wts.width+2*wts.border_width;
+    y2=wts.height+2*wts.border_width;
     addclip(cr, &ncr, x, y, x2, y2);
   }
   XFree((char *) children);
@@ -697,8 +670,9 @@
   Colormap cmap;
   XColor *my;
   Visual *v;
-  unchar *tm;
+  __u8 *tm;
   int msize,ii;
+  struct video_mbuf mbuf;
 
 #ifndef NOCARD
   if(new->TVscreen.devname) bttvname=new->TVscreen.devname;
@@ -711,23 +685,23 @@
     exit(1);
   }
 
-	if(ioctl(new->TVscreen.fbttv, VIDIOCGWIN, &(new->TVscreen.vwin)))
-		perror("get window");
-	if(ioctl(new->TVscreen.fbttv, VIDIOCGFBUF, &(new->TVscreen.vwin)))
-		perror("get frame buffer");
-	if(ioctl(new->TVscreen.fbttv, VIDIOCGTUNER, &(new->TVscreen.vtuner)))
-		perror("get tuner");
-	new->TVscreen.vwin.width=DEFAULT_WIDTH;
-	new->TVscreen.vwin.height=DEFAULT_HEIGHT;
-	new->TVscreen.vwin.x=0;
-	new->TVscreen.vwin.y=0;
-	new->TVscreen.vbuf.width=XtScreen(tnew)->width;
-	new->TVscreen.vbuf.height=XtScreen(tnew)->height;
-	new->TVscreen.vbuf.base=0;
-	new->TVscreen.vwin.clipcount=0;
+  if(ioctl(new->TVscreen.fbttv, VIDIOCGWIN, &(new->TVscreen.vwin)))
+    perror("get window");
+  if(ioctl(new->TVscreen.fbttv, VIDIOCGFBUF, &(new->TVscreen.vwin)))
+    perror("get frame buffer");
+  if(ioctl(new->TVscreen.fbttv, VIDIOCGTUNER, &(new->TVscreen.vtuner)))
+    perror("get tuner");
+  new->TVscreen.vwin.width=DEFAULT_WIDTH;
+  new->TVscreen.vwin.height=DEFAULT_HEIGHT;
+  new->TVscreen.vwin.x=0;
+  new->TVscreen.vwin.y=0;
+  new->TVscreen.vbuf.width=XtScreen(tnew)->width;
+  new->TVscreen.vbuf.height=XtScreen(tnew)->height;
+  new->TVscreen.vbuf.base=0;
+  new->TVscreen.vwin.clipcount=0;
 
-	rwidth=new->TVscreen.vbuf.width;
-	disp=XtDisplay(tnew);
+  rwidth=new->TVscreen.vbuf.width;
+  disp=XtDisplay(tnew);
 #ifndef NODGA
   if (XF86DGAQueryVersion(disp, &major, &minor)) 
     XF86DGAGetVideoLL(disp, DefaultScreen(disp), &(new->TVscreen.vbuf.base),
@@ -750,7 +724,7 @@
     new->TVscreen.vbuf.depth=tnew->core.depth;
   if (new->TVscreen.dual)
     new->TVscreen.vbuf.depth=32;
-  new->TVscreen.vbuf.bytesperline=rwidth*(0x18&(new->TVscreen.vbuf.depth+1))/8;
+  new->TVscreen.vbuf.bytesperline=rwidth*(0x38&(new->TVscreen.vbuf.depth+1))/8;
   
   if(ioctl(new->TVscreen.fbttv, VIDIOCSFBUF, &new->TVscreen.vbuf))
     {
@@ -759,33 +733,21 @@
     }
 
   /* Alloc memory for snapshot */
-  msize = 2*BTTV_MAX_FBUF; /* largest possible picture with 3 bytes per pixel*/
-#define MMAP
-#ifdef MMAP
-  tm=(unchar *)mmap(0,msize,PROT_READ|PROT_WRITE,MAP_SHARED,new->TVscreen.fbttv,0);
-#else
-  if (!(tm=(unchar *)malloc(msize)))  {
-    printf("Cannot alloc memory for snapshot\n");
-    exit(1);
-  }
-  if (mlock(tm, msize)) {
-    printf("Cannot mlock()!\nMaybe no root priviliges??\n");  
+  if(ioctl(new->TVscreen.fbttv, VIDIOCGMBUF, &(new->TVscreen.mbuf)))
+    perror("get mbuf");
+  msize = new->TVscreen.mbuf.size;
+  printf("msize: 0x%08x\n",msize);
+  tm=(unsigned char *)mmap(0,msize,PROT_READ|PROT_WRITE,
+			   MAP_SHARED,new->TVscreen.fbttv,0);
+  if (tm==(unsigned char *)-1)  {
+    printf("Cannot mmap memory for snapshot\n");
     exit(1);
   }
-  /* The memory is formally allocated and locked but not really there yet!
-     Access one byte in each page (assumed to be 4096 Bytes) to really do it.
-     */
-  for (ii=0; ii<msize; ii+=4096)
-    tm[ii]=1;
-  /* Just in case memory is not page aligned*/
-  tm[msize-1]=1;
-#endif
  
 #ifdef DEBUG
   printf("tm: 0x%08x\n", (int) tm);
 #endif
   new->TVscreen.TargetMem=tm;
-  new->TVscreen.msize=msize;
   
 #endif
 
@@ -957,6 +919,7 @@
   Boolean do_redisplay = False;
   int pictmod=0;
   struct video_picture vp;
+  struct video_channel vc;
 
 #ifndef NOCARD
 
@@ -969,12 +932,14 @@
     }
   }
   else {
-    int v=newcw->TVscreen.INPUT;
+    vc.channel=newcw->TVscreen.INPUT;
+    vc.norm=newcw->TVscreen.NORM;
     if (curcw->TVscreen.CAP_ON) {
       cap(newcw,0);
       system("xrefresh");
     }
-    if(ioctl(newcw->TVscreen.fbttv, VIDIOCSCHAN, &v))
+    
+    if(ioctl(newcw->TVscreen.fbttv, VIDIOCSCHAN, &vc))
       perror("change tuner");
   }
 
@@ -991,21 +956,27 @@
   
   if (newcw->TVscreen.vtuner.mode != newcw->TVscreen.NORM)
     {
-      newcw->TVscreen.vtuner.mode=newcw->TVscreen.NORM;
+      vc.channel=newcw->TVscreen.INPUT;
+      newcw->TVscreen.vtuner.mode =
+	      vc.norm=
+	      newcw->TVscreen.NORM;
+      
       newcw->TVscreen.Change=TRUE;
       setmaxsize(newcw);
       SetGeo(newcw);
       if (newcw->TVscreen.NORM==NTSC)
 	newcw->TVscreen.Fresh=TRUE;
       SetGeo(newcw);
-      if(ioctl(newcw->TVscreen.fbttv, VIDIOCSTUNER, &newcw->TVscreen.vtuner))
-	perror("change format");
+      if(ioctl(newcw->TVscreen.fbttv, VIDIOCSCHAN, &vc))
+	perror("change norm");
     }
   
   if (curcw->TVscreen.INPUT !=newcw->TVscreen.INPUT)
     {
-      int v=newcw->TVscreen.INPUT;
-      if(ioctl(newcw->TVscreen.fbttv, VIDIOCSCHAN, &v))
+      struct video_channel vc;
+      vc.channel=newcw->TVscreen.INPUT;
+      vc.norm=newcw->TVscreen.NORM;
+      if(ioctl(newcw->TVscreen.fbttv, VIDIOCSCHAN, &vc))
 	perror("change input");
     }
   
@@ -1302,13 +1273,6 @@
   if (timer) XtRemoveTimeOut(timer);
   rootw=DefaultRootWindow(XtDisplay(nw));
   XtUnregisterDrawable(XtDisplay(nw),rootw);
-
-#ifndef NOCARD
-#ifndef MMAP
-  munlock(w->TVscreen.TargetMem, w->TVscreen.msize);
-  free(w->TVscreen.TargetMem);
-#endif
-#endif
 
   close(w->TVscreen.devname);
 #ifdef DEBUG
diff -u bttv-0.5.8/XTV/TVscreenP.h buz-XTV/TVscreenP.h
--- bttv-0.5.8/XTV/TVscreenP.h	Fri Apr 24 15:48:25 1998
+++ buz-XTV/TVscreenP.h	Tue Aug 25 11:59:22 1998
@@ -43,10 +43,8 @@
 #include <stdio.h>
 
 #ifndef NOCARD  
-#define __KERNEL__
-#include "../driver/videodev.h"
-#undef __KERNEL__
-#include "../driver/bttv.h"
+#include <linux/videodev.h>
+#include "../buz/buz.h"
 #endif
 
 #include "visual.h"
@@ -93,17 +91,13 @@
   int audio;
   /* private state */
 #ifndef NOCARD
-#ifdef OLDBTTV
-  struct bttv_window wtw;
-  struct cliprec cliprecs[MAX_CLIPRECS];
-#else
   struct video_window vwin;
   struct video_buffer vbuf;
   struct video_tuner vtuner;
   ulong frequency;
+  struct video_mbuf mbuf;
   struct video_clip cliprecs[MAX_CLIPRECS];
-#endif
-  unchar *TargetMem;
+  __u8 *TargetMem;
   int msize;
 #endif
   int fbttv;
diff -u bttv-0.5.8/XTV/callbacks.cc buz-XTV/callbacks.cc
--- bttv-0.5.8/XTV/callbacks.cc	Sun Feb 22 00:03:49 1998
+++ buz-XTV/callbacks.cc	Wed Aug 12 02:51:57 1998
@@ -784,7 +784,7 @@
   
   case 4:
     XtVaGetValues(screen,XtNcap,&CAP,NULL);
-    if (CAP){
+    if (TRUE||CAP){
       int nb;
       char nbr[5];
       ostrstream o(nbr,5);
@@ -797,7 +797,7 @@
 
   case 5:
     XtVaGetValues(screen,XtNcap,&CAP,NULL);
-    if (CAP){
+    if (TRUE||CAP){
       int nb;
       char nbr[5];
       ostrstream o(nbr,5);
diff -u bttv-0.5.8/XTV/snap.cc buz-XTV/snap.cc
--- bttv-0.5.8/XTV/snap.cc	Fri May  8 07:09:41 1998
+++ buz-XTV/snap.cc	Wed Aug 26 07:13:12 1998
@@ -22,8 +22,8 @@
  * snap.cc 
  */
 
-//#define PNM // if the jpeg library is not installed use pnm
-//#define RAW
+#define PNM // if the jpeg library is not installed use pnm
+#define RAW
 
 #include "snap.h"
 #include "TVscreenP.h"  /* let's do it the dirty way first */
@@ -37,10 +37,10 @@
 #define HEX(N) hex << setw(N) << setfill(int('0')) 
 #define DEC(N) dec << setw(N) << setfill(int('0')) 
 
-void flip(unchar *mem, int len)
+void flip(__u8 *mem, int len)
 {
   int i;
-  unchar tmp;
+  __u8 tmp;
 
   for (i=0;i<len;i++) {
     tmp=mem[2];
@@ -50,18 +50,16 @@
   }
 }
 
-void write_raw(char *filename, unchar *mem)
+void write_raw(char *filename, int len, __u8 *mem)
 {
   ofstream os(filename);
     
-  os << "P5\n" << dec << 2270 << "\n"
-     << dec << 288 << "\n255\n";
-  os.write(mem,288*2270);
+  os.write(mem,len);
   os.close();
 }
 
 #ifndef PNM
-void write_jpg(char *filename, int w, int h, unchar *mem)
+void write_jpg(char *filename, int w, int h, __u8 *mem)
 {
   struct jpeg_compress_struct cinfo;
   struct jpeg_error_mgr jerr;
@@ -103,10 +101,11 @@
 */
   jpeg_finish_compress(&cinfo);
   jpeg_destroy_compress(&cinfo);
+  fclose(outfile);
 }
 #else
 
-void write_pnm(char *filename, int w, int h, unchar *mem)
+void write_pnm(char *filename, int w, int h, __u8 *mem)
 {
   ofstream os(filename);
     
@@ -132,23 +131,25 @@
 {
   char name[80];
   static int number=0;
-  unchar *tm;
+  __u8 *tm;
   struct video_mmap gb;
+  int res;
 
 #ifndef NOCARD
 
   TVscreenWidget w=(TVscreenWidget) screen;
 
-  if (w->TVscreen.CAP_ON){
+  //if (w->TVscreen.CAP_ON)
+{
     ostrstream oname(name,80);
-#ifdef PNM
-    oname << nam << HEX(3) << number << ".pnm" << char(0);
-#else
-    oname << nam << HEX(3) << number << ".jpg" << char(0);
-#endif
 
     tm=w->TVscreen.TargetMem;
 
+#if defined(RAW)
+    gb.width=720;
+    gb.height=480;
+    gb.format=100;
+#else
     if (FULL){ 
       gb.width=w->TVscreen.max_width;
       gb.height=w->TVscreen.max_height;
@@ -156,29 +157,33 @@
       gb.width=w->TVscreen.vwin.width;
       gb.height=w->TVscreen.vwin.height;
     }
-#ifdef RAW
-    gb.width=768;
-    gb.height=576;
-    gb.format=BT848_COLOR_FMT_RAW;
-#else
     gb.format=BT848_COLOR_FMT_RGB24;
 #endif
     gb.frame=0;
-    ioctl(w->TVscreen.fbttv, VIDIOCMCAPTURE, &gb);
-    ioctl(w->TVscreen.fbttv, VIDIOCSYNC, 0);
-
-    int width=gb.width;
-    int height=gb.height;
-#ifdef RAW
-    write_raw(name,tm);
-#else
-#ifdef PNM    
-    write_pnm(name,width,height,tm);
+    res = ioctl(w->TVscreen.fbttv, VIDIOCMCAPTURE, &gb);
+    if (res < 0) {
+      perror("MCAPTURE");
+    } else {
+      res = ioctl(w->TVscreen.fbttv, VIDIOCSYNC, &gb.frame);
+      if (res < 0) {
+	perror("SYNC");
+      } else {
+	int width=gb.width;
+	int height=gb.height;
+
+#if defined(RAW)
+	oname << nam << HEX(3) << number << ".mjpg" << char(0);
+	write_raw(name,res,tm);
+#elif defined(PNM)
+	oname << nam << HEX(3) << number << ".pnm" << char(0);
+	write_pnm(name,width,height,tm);
 #else
-    write_jpg(name,width,height,tm);
+	oname << nam << HEX(3) << number << ".jpg" << char(0);
+	write_jpg(name,width,height,tm);
 #endif
-#endif
-    number++;
+	number++;
+      }
+    }
   }
 #endif
 return number;
@@ -190,69 +195,77 @@
 {
   char name[80];
   static int number=0;
-  unchar *tm,*ctm;
+  __u8 *tm,*ctm;
   struct video_mmap gb;
-  
+  int res;
+  int frame;
+  int grab_frame;
+  int sync_frame;
+
 #ifndef NOCARD
-  
+
   TVscreenWidget w=(TVscreenWidget) screen;
-  
-  if (w->TVscreen.CAP_ON){
+
+  //if (w->TVscreen.CAP_ON)
+{
     int width=w->TVscreen.vwin.width;
     int height=w->TVscreen.vwin.height;
     int old_bpp=w->TVscreen.vbuf.depth;
-    
+
     tm=w->TVscreen.TargetMem;
+#if defined(RAW)
+    gb.width = 720;
+    gb.height = 480;
+    gb.format=100;
+#else
     gb.width=w->TVscreen.vwin.width;
     gb.height=w->TVscreen.vwin.height;
     gb.format=BT848_COLOR_FMT_RGB24;
-    
-    int i=0;
-    gb.frame=0;
-    ioctl(w->TVscreen.fbttv, VIDIOCMCAPTURE, &gb);
-    for (int j=0;j< length;j++){
-      ctm=tm+gb.frame*BTTV_MAX_FBUF;
-      gb.frame^=1;
-      ioctl(w->TVscreen.fbttv, VIDIOCMCAPTURE, &gb);
-      ioctl(w->TVscreen.fbttv, VIDIOCSYNC, 0);
-
-      ostrstream oname(name,80);
-      oname << nam << HEX(3) << number<< "_" << HEX(3) << j ;
-#ifdef PNM
-      oname << ".pnm" << char(0);
-#else
-      oname << ".jpg" << char(0);
 #endif
-      
-#ifdef PNM
-      write_pnm(name,width,height,ctm);
-#else      
-      write_jpg(name,width,height,ctm);
-#endif
-      
-#if 1
-      if (height<289) {
-      j++;
-      ostrstream oname2(name,80);
-      oname2 << nam << HEX(3) << number<< "_" << HEX(3) << j ;
-#ifdef PNM
-      oname2 << ".pnm" << char(0);
+
+    grab_frame=0;
+    sync_frame=0;
+
+    gb.frame=(grab_frame++)%w->TVscreen.mbuf.frames;
+    res = ioctl(w->TVscreen.fbttv, VIDIOCMCAPTURE, &gb);
+    if (res < 0)
+      perror("MCAPTURE");
+    gb.format=0;
+
+    while (sync_frame < length){
+      while ((grab_frame - sync_frame) < w->TVscreen.mbuf.frames
+      && grab_frame < length) {
+	gb.frame=(grab_frame++)%w->TVscreen.mbuf.frames;
+	res = ioctl(w->TVscreen.fbttv, VIDIOCMCAPTURE, &gb);
+	if (res < 0)
+	  perror("MCAPTURE");
+      }
+
+      frame=sync_frame%w->TVscreen.mbuf.frames;
+      ctm=tm+w->TVscreen.mbuf.offsets[frame];
+      res = ioctl(w->TVscreen.fbttv, VIDIOCSYNC, &frame);
+      if (res < 0) {
+	perror("SYNC");
+      } else {
+	ostrstream oname(name,80);
+	oname << nam << HEX(3) << number<< "_" << HEX(3) << sync_frame ;
+#if defined(RAW)
+	oname << ".mjpg" << char(0);
+	write_raw(name,res,ctm);
+#elif defined(PNM)
+	oname << ".pnm" << char(0);
+	write_pnm(name,width,height,ctm);
 #else
-      oname2 << ".jpg" << char(0);
-#endif
-      
-#ifdef PNM
-      write_pnm(name,width,height,ctm+width*height*3);
-#else      
-      write_jpg(name,width,height,ctm+width*height*3);
-#endif
-    }
+	oname << ".jpg" << char(0);
+	write_jpg(name,width,height,ctm);
 #endif
+      }
+      sync_frame++;
     }
   }
-  
+
   number++;
-  
+
 #endif
   return number;
 }
diff -u bttv-0.5.8/XTV/sound.cc buz-XTV/sound.cc
--- bttv-0.5.8/XTV/sound.cc	Sun Feb 22 00:03:49 1998
+++ buz-XTV/sound.cc	Mon Aug 10 16:52:18 1998
@@ -62,7 +62,7 @@
 		 )<0) {
       cerr << "Can't initialize sound mixer !" << endl;
     } else {
-      cerr << "Sound mixer initilzed !" << endl;
+      cerr << "Sound mixer initialized !" << endl;
       for (int i=0;i<SOUND_MIXER_NRDEVICES;i++) {
 	if (devmask & (1<<i)) {
 	  /* read current volume */
diff -u bttv-0.5.8/XTV/xtvscreen.cc buz-XTV/xtvscreen.cc
--- bttv-0.5.8/XTV/xtvscreen.cc	Sat May  2 11:09:33 1998
+++ buz-XTV/xtvscreen.cc	Mon Aug 10 16:52:18 1998
@@ -142,7 +142,7 @@
   toplevel = XtVaAppCreateShell(NULL,name,applicationShellWidgetClass,dpy
 				,XmNminWidth,    12
 				,XmNminHeight ,  12
-				,XmNmaxWidth,    800
+				,XmNmaxWidth,    960
 				,XmNmaxHeight ,  680
 				,XmNwidthInc,  4
 				,XmNheightInc, 4
diff -u bttv-0.5.8/XTV/xtvscreen1 buz-XTV/xtvscreen1
--- bttv-0.5.8/XTV/xtvscreen1	Sun Feb 22 00:03:49 1998
+++ buz-XTV/xtvscreen1	Tue Sep  1 11:10:18 1998
@@ -1 +1 @@
-xtvscreen -dev /dev/bttv1 -in 0 &
+./xtvscreen -dev /dev/bttv0 -bpp 16 -in 1 -sn 1000 &
