On Mon, Jul 08, 2002 at 05:02:41PM +0000, Gerd Knorr wrote:
> Ville Syrj�l� wrote:
> > On Mon, Jul 08, 2002 at 08:43:11AM +0000, Gerd Knorr wrote:
> > > > And what about the overlay mode? Is there something in the API to provide
> > > > accurate syncing (even frame based) in overlay mode?
> > >
> > > No.
> >
> > I hacked the bttv driver in 2.4.19-rc1 to do field syncing and changed the
> > BTTV_FIELDNR ioctl to return the active field.
>
> Can I see the code for that?
Sure. I just declared a new wait queue and changed VIDIOCSYNC to use this
queue when called with the parameter '-1'. I included the whole diff
below. I haven't really done any kernel programming before so i don't know
if it's acceptable code. The global waitqueue would certainly be a problem
for multiple cards but I only have one card.
--- bttv-driver.c Mon Jul 8 20:52:31 2002
+++ bttv-new.c Mon Jul 8 20:53:32 2002
@@ -132,6 +132,7 @@
#define BURSTOFFSET 76
#define BTTV_ERRORS 5
+static DECLARE_WAIT_QUEUE_HEAD(vsync_wait);
/*******************************/
/* Memory management functions */
@@ -1294,6 +1295,7 @@
btv->needs_restart = 1;
spin_unlock(&btv->s_lock);
+ wake_up_interruptible(&vsync_wait);
wake_up_interruptible(&btv->vbiq);
wake_up_interruptible(&btv->capq);
}
@@ -1870,6 +1872,13 @@
if(copy_from_user((void *)&i,arg,sizeof(int)))
return -EFAULT;
+ if (i == -1) {
+ interruptible_sleep_on(&vsync_wait);
+ if (signal_pending(current))
+ return -EINTR;
+ return 0;
+ }
+
if (i < 0 || i >= gbuffers)
return -EINVAL;
switch (btv->gbuf[i].stat) {
@@ -1908,11 +1917,11 @@
}
case BTTV_FIELDNR:
- if(copy_to_user((void *) arg, (void *) &btv->last_field,
- sizeof(btv->last_field)))
+ if(copy_to_user((void *) arg, (void *) &btv->field,
+ sizeof(btv->field)))
return -EFAULT;
break;
-
+
case BTTV_PLLSET: {
struct bttv_pll_info p;
if(!capable(CAP_SYS_ADMIN))
@@ -2599,7 +2608,7 @@
btwrite(btv->triton1|
/*BT848_INT_PABORT|BT848_INT_RIPERR|BT848_INT_PPERR|
BT848_INT_FDSR|BT848_INT_FTRGT|BT848_INT_FBUS|*/
- (fieldnr ? BT848_INT_VSYNC : 0)|
+ BT848_INT_VSYNC|
BT848_INT_GPINT|
BT848_INT_SCERR|
BT848_INT_RISCI|BT848_INT_OCERR|BT848_INT_VPRES|
@@ -2684,8 +2693,10 @@
if (astat&BT848_INT_GPINT)
wake_up_interruptible(&btv->gpioq);
- if (astat&BT848_INT_VSYNC)
- btv->field++;
+ if (astat&BT848_INT_VSYNC) {
+ btv->field = (dstat&BT848_DSTATUS_FIELD) ? 1 : 0;
+ wake_up_interruptible(&vsync_wait);
+ }
if (astat&(BT848_INT_SCERR|BT848_INT_OCERR)) {
if (bttv_verbose)
--
Ville Syrj�l�
[EMAIL PROTECTED]
http://www.sci.fi/~syrjala/
_______________________________________________
Video4linux-list mailing list
[EMAIL PROTECTED]
https://listman.redhat.com/mailman/listinfo/video4linux-list