Added Capture Area ioctl - BT848[SG]CAPAREA.

Normally the full 640x480 (768x576 PAL) image is grabbed. This ioctl
allows a smaller area  from anywhere within the video image to be
grabbed, eg a 400x300 image from (50,10).
See restrictions in BT848SCAPAREA.

Submitted by: Roger Hardiman <roger@cs.strath.ac.uk>
This commit is contained in:
Søren Schmidt 1998-08-31 18:31:36 +00:00
parent 9898afa1f1
commit 5d0c8abac1
8 changed files with 369 additions and 55 deletions

View File

@ -1,4 +1,4 @@
# $Id: options,v 1.90 1998/08/08 19:24:38 jkh Exp $
# $Id: options,v 1.91 1998/08/26 12:13:39 sos Exp $
#
# On the handling of kernel options
#
@ -259,6 +259,9 @@ NFS_DEBUG opt_nfs.h
# give bktr an opt_bktr.h file
OVERRIDE_CARD opt_bktr.h
OVERRIDE_TUNER opt_bktr.h
OVERRIDE_DBX opt_bktr.h
OVERRIDE_MSP opt_bktr.h
BROOKTREE_SYSTEM_DEFAULT opt_bktr.h
# meteor opt_meteor.h
METEOR_ALLOC_PAGES opt_meteor.h

View File

@ -1,4 +1,4 @@
/* BT848 1.39 Driver for Brooktree's Bt848 based cards.
/* BT848 1.40 Driver for Brooktree's Bt848 based cards.
The Brooktree BT848 Driver driver is based upon Mark Tinguely and
Jim Lowe's driver for the Matrox Meteor PCI card . The
Philips SAA 7116 and SAA 7196 are very different chipsets than
@ -273,7 +273,14 @@
Updated Hauppauge detection code for Tuner ID 0x0a
for newer NTSC WinCastTV 404 with Bt878 chipset.
Tidied up PAL default in video_open()
1.40 10 August 1998 Roger Hardiman <roger@cs.strath.ac.uk>
Added Capture Area ioctl - BT848[SG]CAPAREA.
Normally the full 640x480 (768x576 PAL) image
is grabbed. This ioctl allows a smaller area
from anywhere within the video image to be
grabbed, eg a 400x300 image from (50,10).
See restrictions in BT848SCAPAREA.
*/
#define DDB(x) x
@ -1677,6 +1684,8 @@ video_open( bktr_ptr_t bktr )
bktr->format = METEOR_GEO_RGB16;
bktr->pixfmt = oformat_meteor_to_bt( bktr->format );
bktr->capture_area_enabled = FALSE;
bt848->int_mask = BT848_INT_MYSTERYBIT; /* if you take this out triton
based motherboards will
operate unreliably */
@ -1906,6 +1915,7 @@ video_ioctl( bktr_ptr_t bktr, int unit, int cmd, caddr_t arg, struct proc* pr )
struct meteor_geomet *geo;
struct meteor_counts *cnt;
struct meteor_video *video;
struct bktr_capture_area *cap_area;
vm_offset_t buf;
struct format_params *fp;
int i;
@ -2409,6 +2419,55 @@ video_ioctl( bktr_ptr_t bktr, int unit, int cmd, caddr_t arg, struct proc* pr )
break;
/* end of METEORSETGEO */
/* FIXME. The Capture Area currently has the following restrictions
GENERAL
y_offset may need to be even in interlaced modes
RGB24 - Interlaced mode
x_size must be greater than or equal to 1.666*METEORSETGEO width (cols)
y_size must be greater than or equal to METEORSETGEO height (rows)
RGB24 - Even Only (or Odd Only) mode
x_size must be greater than or equal to 1.666*METEORSETGEO width (cols)
y_size must be greater than or equal to 2*METEORSETGEO height (rows)
YUV12 - Interlaced mode
x_size must be greater than or equal to METEORSETGEO width (cols)
y_size must be greater than or equal to METEORSETGEO height (rows)
YUV12 - Even Only (or Odd Only) mode
x_size must be greater than or equal to METEORSETGEO width (cols)
y_size must be greater than or equal to 2*METEORSETGEO height (rows)
*/
case BT848SCAPAREA: /* set capture area of each video frame */
/* can't change parameters while capturing */
if (bktr->flags & METEOR_CAP_MASK)
return( EBUSY );
cap_area = (struct bktr_capture_area *) arg;
bktr->capture_area_x_offset = cap_area->x_offset;
bktr->capture_area_y_offset = cap_area->y_offset;
bktr->capture_area_x_size = cap_area->x_size;
bktr->capture_area_y_size = cap_area->y_size;
bktr->capture_area_enabled = TRUE;
bktr->dma_prog_loaded = FALSE;
break;
case BT848GCAPAREA: /* get capture area of each video frame */
cap_area = (struct bktr_capture_area *) arg;
if (bktr->capture_area_enabled == FALSE) {
cap_area->x_offset = 0;
cap_area->y_offset = 0;
cap_area->x_size = format_params[
bktr->format_params].scaled_hactive;
cap_area->y_size = format_params[
bktr->format_params].vactive;
} else {
cap_area->x_offset = bktr->capture_area_x_offset;
cap_area->y_offset = bktr->capture_area_y_offset;
cap_area->x_size = bktr->capture_area_x_size;
cap_area->y_size = bktr->capture_area_y_size;
}
break;
default:
return common_ioctl( bktr, bt848, cmd, arg );
}
@ -3664,63 +3723,103 @@ build_dma_prog( bktr_ptr_t bktr, char i_flag )
bt848->gpio_dma_ctl &= ~FIFO_RISC_ENABLED;
/* set video parameters */
temp = ((quad_t ) fp->htotal* (quad_t) fp->horizontal * 4096
/ fp->vertical / bktr->cols) - 4096;
if (bktr->capture_area_enabled)
temp = ((quad_t ) fp->htotal* (quad_t) bktr->capture_area_x_size * 4096
/ fp->scaled_htotal / bktr->cols) - 4096;
else
temp = ((quad_t ) fp->htotal* (quad_t) fp->scaled_hactive * 4096
/ fp->scaled_htotal / bktr->cols) - 4096;
/* printf("HSCALE value is %d\n",temp); */
bt848->e_hscale_lo = temp & 0xff;
bt848->o_hscale_lo = temp & 0xff;
bt848->e_hscale_hi = (temp >> 8) & 0xff;
bt848->o_hscale_hi = (temp >> 8) & 0xff;
/* horizontal active */
temp = bktr->cols;
/* printf("HACTIVE value is %d\n",temp); */
bt848->e_hactive_lo = temp & 0xff;
bt848->o_hactive_lo = temp & 0xff;
bt848->e_crop &= ~0x3;
bt848->o_crop &= ~0x3;
bt848->e_crop |= (temp >> 8) & 0x3;
bt848->o_crop |= (temp >> 8) & 0x3;
/* horizontal delay */
temp = (fp->hdelay * bktr->cols) / fp->hactive;
if (bktr->capture_area_enabled)
temp = ( (fp->hdelay* fp->scaled_hactive + bktr->capture_area_x_offset* fp->scaled_htotal)
* bktr->cols) / (bktr->capture_area_x_size * fp->hactive);
else
temp = (fp->hdelay * bktr->cols) / fp->hactive;
temp = temp & 0x3fe;
/* printf("HDELAY value is %d\n",temp); */
bt848->e_delay_lo = temp & 0xff;
bt848->o_delay_lo = temp & 0xff;
bt848->e_crop &= ~0xc;
bt848->o_crop &= ~0xc;
bt848->e_crop |= (temp >> 6) & 0xc;
bt848->o_crop |= (temp >> 6) & 0xc;
/* vertical scale */
if (bktr->flags & METEOR_ONLY_ODD_FIELDS ||
bktr->flags & METEOR_ONLY_EVEN_FIELDS)
tmp_int = 65536 -
if (bktr->capture_area_enabled) {
if (bktr->flags & METEOR_ONLY_ODD_FIELDS ||
bktr->flags & METEOR_ONLY_EVEN_FIELDS)
tmp_int = 65536 -
(((bktr->capture_area_y_size * 256 + (bktr->rows/2)) / bktr->rows) - 512);
else {
tmp_int = 65536 -
(((bktr->capture_area_y_size * 512 + (bktr->rows / 2)) / bktr->rows) - 512);
}
} else {
if (bktr->flags & METEOR_ONLY_ODD_FIELDS ||
bktr->flags & METEOR_ONLY_EVEN_FIELDS)
tmp_int = 65536 -
(((fp->vactive * 256 + (bktr->rows/2)) / bktr->rows) - 512);
else {
tmp_int = 65536 -
else {
tmp_int = 65536 -
(((fp->vactive * 512 + (bktr->rows / 2)) / bktr->rows) - 512);
}
}
tmp_int &= 0x1fff;
/* printf("VSCALE value is %d\n",tmp_int); */
bt848->e_vscale_lo = tmp_int & 0xff;
bt848->o_vscale_lo = tmp_int & 0xff;
bt848->e_vscale_hi &= ~0x1f;
bt848->o_vscale_hi &= ~0x1f;
bt848->e_vscale_hi |= (tmp_int >> 8) & 0x1f;
bt848->o_vscale_hi |= (tmp_int >> 8) & 0x1f;
/* vertical active */
if (bktr->capture_area_enabled)
temp = bktr->capture_area_y_size;
else
temp = fp->vactive;
/* printf("VACTIVE is %d\n",temp); */
bt848->e_crop &= ~0x30;
bt848->e_crop |= (fp->vactive >> 4) & 0x30;
bt848->e_vactive_lo = fp->vactive & 0xff;
bt848->e_crop |= (temp >> 4) & 0x30;
bt848->e_vactive_lo = temp & 0xff;
bt848->o_crop &= ~0x30;
bt848->o_crop |= (fp->vactive >> 4) & 0x30;
bt848->o_vactive_lo = fp->vactive & 0xff;
bt848->o_crop |= (temp >> 4) & 0x30;
bt848->o_vactive_lo = temp & 0xff;
/* vertical delay */
bt848->e_vdelay_lo = fp->vdelay;
bt848->o_vdelay_lo = fp->vdelay;
if (bktr->capture_area_enabled)
temp = fp->vdelay + (bktr->capture_area_y_offset);
else
temp = fp->vdelay;
/* printf("VDELAY is %d\n",temp); */
bt848->e_crop &= ~0xC0;
bt848->e_crop |= (temp >> 2) & 0xC0;
bt848->e_vdelay_lo = temp & 0xff;
bt848->o_crop &= ~0xC0;
bt848->o_crop |= (temp >> 2) & 0xC0;
bt848->o_vdelay_lo = temp & 0xff;
/* end of video params */
@ -4394,6 +4493,35 @@ checkTuner:
}
}
/* The Hauppauge Windows driver gives the following Tuner Table */
/* To the right of this is the tuner models we select */
/*
1 External
2 Unspecified
3 Phillips FI1216
4 Phillips FI1216MF
5 Phillips FI1236 PHILIPS_NTSC
6 Phillips FI1246
7 Phillips FI1256
8 Phillips FI1216 MK2 PHILIPS_PALI
9 Phillips FI1216MF MK2
a Phillips FI1236 MK2 PHILIPS_FR1236_NTSC
b Phillips FI1246 MK2 PHILIPS_PALI
c Phillips FI1256 MK2
d Temic 4032FY5
e Temic 4002FH5 TEMIC_PAL
f Temic 4062FY5 TEMIC_PALI
10 Phillips FR1216 MK2
11 Phillips FR1216MF MK2
12 Phillips FR1236 MK2 PHILIPS_FR1236_NTSC
13 Phillips FR1246 MK2
14 Phillips FR1256 MK2
15 Phillips FM1216 PHILIPS_FR1216_PAL
16 Phillips FM1216MF
17 Phillips FM1236 PHILIPS_FR1236_NTSC
*/
if ( card == CARD_HAUPPAUGE ) {
bktr->card.tuner = &tuners[ TEMIC_PAL ];
readEEProm(bktr, 0, 128, (u_char *) &probe_eeprom );

View File

@ -343,13 +343,13 @@ struct format_params {
int vtotal, vdelay, vactive;
/* Total unscaled horizontal pixels, pixels before image, image pixels */
int htotal, hdelay, hactive;
/* visible active horizontal and vertical : 480 640 for NTSC */
int horizontal, vertical;
/* frame rate . for ntsc is 30 frames per second */
/* Scaled horizontal image pixels, Total Scaled horizontal pixels */
int scaled_hactive, scaled_htotal;
/* frame rate . for ntsc is 30 frames per second */
int frame_rate;
/* A-delay and B-delay */
/* A-delay and B-delay */
u_char adelay, bdelay;
/* Iform XTSEL value */
/* Iform XTSEL value */
int iform_xtsel;
};
@ -384,6 +384,11 @@ struct bktr_softc {
short current; /* frame number in buffer (1-frames) */
short rows; /* number of rows in a frame */
short cols; /* number of columns in a frame */
int capture_area_x_offset; /* Usually the full 640x480(NTSC) image is */
int capture_area_y_offset; /* captured. The capture area allows for */
int capture_area_x_size; /* example 320x200 pixels from the centre */
int capture_area_y_size; /* of the video image to be captured. */
char capture_area_enabled; /* When TRUE use user's capture area. */
int pixfmt; /* active pixel format (idx into fmt tbl) */
int pixfmt_compat; /* Y/N - in meteor pix fmt compat mode */
u_long format; /* frame format rgb, yuv, etc.. */

View File

@ -197,6 +197,21 @@ struct _bktr_clip {
#define BT848SCBUF _IOW('x', 68, int)
#define BT848GCBUF _IOR('x', 68, int)
/* set capture area */
/* The capture area is the area of the video image which is grabbed */
/* Usually the capture area is 640x480 (768x576 PAL) pixels */
/* This area is then scaled to the dimensions the user requires */
/* using the METEORGEO ioctl */
/* However, the capture area could be 400x300 pixels from the top right */
/* corner of the video image */
struct bktr_capture_area {
int x_offset;
int y_offset;
int x_size;
int y_size;
};
#define BT848SCAPAREA _IOW('x', 69, struct bktr_capture_area)
#define BT848GCAPAREA _IOR('x', 69, struct bktr_capture_area)
/* Read/Write the BT848's I2C bus directly
* b7-b0: data (read/write)

View File

@ -197,6 +197,21 @@ struct _bktr_clip {
#define BT848SCBUF _IOW('x', 68, int)
#define BT848GCBUF _IOR('x', 68, int)
/* set capture area */
/* The capture area is the area of the video image which is grabbed */
/* Usually the capture area is 640x480 (768x576 PAL) pixels */
/* This area is then scaled to the dimensions the user requires */
/* using the METEORGEO ioctl */
/* However, the capture area could be 400x300 pixels from the top right */
/* corner of the video image */
struct bktr_capture_area {
int x_offset;
int y_offset;
int x_size;
int y_size;
};
#define BT848SCAPAREA _IOW('x', 69, struct bktr_capture_area)
#define BT848GCAPAREA _IOR('x', 69, struct bktr_capture_area)
/* Read/Write the BT848's I2C bus directly
* b7-b0: data (read/write)

View File

@ -343,13 +343,13 @@ struct format_params {
int vtotal, vdelay, vactive;
/* Total unscaled horizontal pixels, pixels before image, image pixels */
int htotal, hdelay, hactive;
/* visible active horizontal and vertical : 480 640 for NTSC */
int horizontal, vertical;
/* frame rate . for ntsc is 30 frames per second */
/* Scaled horizontal image pixels, Total Scaled horizontal pixels */
int scaled_hactive, scaled_htotal;
/* frame rate . for ntsc is 30 frames per second */
int frame_rate;
/* A-delay and B-delay */
/* A-delay and B-delay */
u_char adelay, bdelay;
/* Iform XTSEL value */
/* Iform XTSEL value */
int iform_xtsel;
};
@ -384,6 +384,11 @@ struct bktr_softc {
short current; /* frame number in buffer (1-frames) */
short rows; /* number of rows in a frame */
short cols; /* number of columns in a frame */
int capture_area_x_offset; /* Usually the full 640x480(NTSC) image is */
int capture_area_y_offset; /* captured. The capture area allows for */
int capture_area_x_size; /* example 320x200 pixels from the centre */
int capture_area_y_size; /* of the video image to be captured. */
char capture_area_enabled; /* When TRUE use user's capture area. */
int pixfmt; /* active pixel format (idx into fmt tbl) */
int pixfmt_compat; /* Y/N - in meteor pix fmt compat mode */
u_long format; /* frame format rgb, yuv, etc.. */

View File

@ -1,4 +1,4 @@
/* BT848 1.39 Driver for Brooktree's Bt848 based cards.
/* BT848 1.40 Driver for Brooktree's Bt848 based cards.
The Brooktree BT848 Driver driver is based upon Mark Tinguely and
Jim Lowe's driver for the Matrox Meteor PCI card . The
Philips SAA 7116 and SAA 7196 are very different chipsets than
@ -273,7 +273,14 @@
Updated Hauppauge detection code for Tuner ID 0x0a
for newer NTSC WinCastTV 404 with Bt878 chipset.
Tidied up PAL default in video_open()
1.40 10 August 1998 Roger Hardiman <roger@cs.strath.ac.uk>
Added Capture Area ioctl - BT848[SG]CAPAREA.
Normally the full 640x480 (768x576 PAL) image
is grabbed. This ioctl allows a smaller area
from anywhere within the video image to be
grabbed, eg a 400x300 image from (50,10).
See restrictions in BT848SCAPAREA.
*/
#define DDB(x) x
@ -1677,6 +1684,8 @@ video_open( bktr_ptr_t bktr )
bktr->format = METEOR_GEO_RGB16;
bktr->pixfmt = oformat_meteor_to_bt( bktr->format );
bktr->capture_area_enabled = FALSE;
bt848->int_mask = BT848_INT_MYSTERYBIT; /* if you take this out triton
based motherboards will
operate unreliably */
@ -1906,6 +1915,7 @@ video_ioctl( bktr_ptr_t bktr, int unit, int cmd, caddr_t arg, struct proc* pr )
struct meteor_geomet *geo;
struct meteor_counts *cnt;
struct meteor_video *video;
struct bktr_capture_area *cap_area;
vm_offset_t buf;
struct format_params *fp;
int i;
@ -2409,6 +2419,55 @@ video_ioctl( bktr_ptr_t bktr, int unit, int cmd, caddr_t arg, struct proc* pr )
break;
/* end of METEORSETGEO */
/* FIXME. The Capture Area currently has the following restrictions
GENERAL
y_offset may need to be even in interlaced modes
RGB24 - Interlaced mode
x_size must be greater than or equal to 1.666*METEORSETGEO width (cols)
y_size must be greater than or equal to METEORSETGEO height (rows)
RGB24 - Even Only (or Odd Only) mode
x_size must be greater than or equal to 1.666*METEORSETGEO width (cols)
y_size must be greater than or equal to 2*METEORSETGEO height (rows)
YUV12 - Interlaced mode
x_size must be greater than or equal to METEORSETGEO width (cols)
y_size must be greater than or equal to METEORSETGEO height (rows)
YUV12 - Even Only (or Odd Only) mode
x_size must be greater than or equal to METEORSETGEO width (cols)
y_size must be greater than or equal to 2*METEORSETGEO height (rows)
*/
case BT848SCAPAREA: /* set capture area of each video frame */
/* can't change parameters while capturing */
if (bktr->flags & METEOR_CAP_MASK)
return( EBUSY );
cap_area = (struct bktr_capture_area *) arg;
bktr->capture_area_x_offset = cap_area->x_offset;
bktr->capture_area_y_offset = cap_area->y_offset;
bktr->capture_area_x_size = cap_area->x_size;
bktr->capture_area_y_size = cap_area->y_size;
bktr->capture_area_enabled = TRUE;
bktr->dma_prog_loaded = FALSE;
break;
case BT848GCAPAREA: /* get capture area of each video frame */
cap_area = (struct bktr_capture_area *) arg;
if (bktr->capture_area_enabled == FALSE) {
cap_area->x_offset = 0;
cap_area->y_offset = 0;
cap_area->x_size = format_params[
bktr->format_params].scaled_hactive;
cap_area->y_size = format_params[
bktr->format_params].vactive;
} else {
cap_area->x_offset = bktr->capture_area_x_offset;
cap_area->y_offset = bktr->capture_area_y_offset;
cap_area->x_size = bktr->capture_area_x_size;
cap_area->y_size = bktr->capture_area_y_size;
}
break;
default:
return common_ioctl( bktr, bt848, cmd, arg );
}
@ -3664,63 +3723,103 @@ build_dma_prog( bktr_ptr_t bktr, char i_flag )
bt848->gpio_dma_ctl &= ~FIFO_RISC_ENABLED;
/* set video parameters */
temp = ((quad_t ) fp->htotal* (quad_t) fp->horizontal * 4096
/ fp->vertical / bktr->cols) - 4096;
if (bktr->capture_area_enabled)
temp = ((quad_t ) fp->htotal* (quad_t) bktr->capture_area_x_size * 4096
/ fp->scaled_htotal / bktr->cols) - 4096;
else
temp = ((quad_t ) fp->htotal* (quad_t) fp->scaled_hactive * 4096
/ fp->scaled_htotal / bktr->cols) - 4096;
/* printf("HSCALE value is %d\n",temp); */
bt848->e_hscale_lo = temp & 0xff;
bt848->o_hscale_lo = temp & 0xff;
bt848->e_hscale_hi = (temp >> 8) & 0xff;
bt848->o_hscale_hi = (temp >> 8) & 0xff;
/* horizontal active */
temp = bktr->cols;
/* printf("HACTIVE value is %d\n",temp); */
bt848->e_hactive_lo = temp & 0xff;
bt848->o_hactive_lo = temp & 0xff;
bt848->e_crop &= ~0x3;
bt848->o_crop &= ~0x3;
bt848->e_crop |= (temp >> 8) & 0x3;
bt848->o_crop |= (temp >> 8) & 0x3;
/* horizontal delay */
temp = (fp->hdelay * bktr->cols) / fp->hactive;
if (bktr->capture_area_enabled)
temp = ( (fp->hdelay* fp->scaled_hactive + bktr->capture_area_x_offset* fp->scaled_htotal)
* bktr->cols) / (bktr->capture_area_x_size * fp->hactive);
else
temp = (fp->hdelay * bktr->cols) / fp->hactive;
temp = temp & 0x3fe;
/* printf("HDELAY value is %d\n",temp); */
bt848->e_delay_lo = temp & 0xff;
bt848->o_delay_lo = temp & 0xff;
bt848->e_crop &= ~0xc;
bt848->o_crop &= ~0xc;
bt848->e_crop |= (temp >> 6) & 0xc;
bt848->o_crop |= (temp >> 6) & 0xc;
/* vertical scale */
if (bktr->flags & METEOR_ONLY_ODD_FIELDS ||
bktr->flags & METEOR_ONLY_EVEN_FIELDS)
tmp_int = 65536 -
if (bktr->capture_area_enabled) {
if (bktr->flags & METEOR_ONLY_ODD_FIELDS ||
bktr->flags & METEOR_ONLY_EVEN_FIELDS)
tmp_int = 65536 -
(((bktr->capture_area_y_size * 256 + (bktr->rows/2)) / bktr->rows) - 512);
else {
tmp_int = 65536 -
(((bktr->capture_area_y_size * 512 + (bktr->rows / 2)) / bktr->rows) - 512);
}
} else {
if (bktr->flags & METEOR_ONLY_ODD_FIELDS ||
bktr->flags & METEOR_ONLY_EVEN_FIELDS)
tmp_int = 65536 -
(((fp->vactive * 256 + (bktr->rows/2)) / bktr->rows) - 512);
else {
tmp_int = 65536 -
else {
tmp_int = 65536 -
(((fp->vactive * 512 + (bktr->rows / 2)) / bktr->rows) - 512);
}
}
tmp_int &= 0x1fff;
/* printf("VSCALE value is %d\n",tmp_int); */
bt848->e_vscale_lo = tmp_int & 0xff;
bt848->o_vscale_lo = tmp_int & 0xff;
bt848->e_vscale_hi &= ~0x1f;
bt848->o_vscale_hi &= ~0x1f;
bt848->e_vscale_hi |= (tmp_int >> 8) & 0x1f;
bt848->o_vscale_hi |= (tmp_int >> 8) & 0x1f;
/* vertical active */
if (bktr->capture_area_enabled)
temp = bktr->capture_area_y_size;
else
temp = fp->vactive;
/* printf("VACTIVE is %d\n",temp); */
bt848->e_crop &= ~0x30;
bt848->e_crop |= (fp->vactive >> 4) & 0x30;
bt848->e_vactive_lo = fp->vactive & 0xff;
bt848->e_crop |= (temp >> 4) & 0x30;
bt848->e_vactive_lo = temp & 0xff;
bt848->o_crop &= ~0x30;
bt848->o_crop |= (fp->vactive >> 4) & 0x30;
bt848->o_vactive_lo = fp->vactive & 0xff;
bt848->o_crop |= (temp >> 4) & 0x30;
bt848->o_vactive_lo = temp & 0xff;
/* vertical delay */
bt848->e_vdelay_lo = fp->vdelay;
bt848->o_vdelay_lo = fp->vdelay;
if (bktr->capture_area_enabled)
temp = fp->vdelay + (bktr->capture_area_y_offset);
else
temp = fp->vdelay;
/* printf("VDELAY is %d\n",temp); */
bt848->e_crop &= ~0xC0;
bt848->e_crop |= (temp >> 2) & 0xC0;
bt848->e_vdelay_lo = temp & 0xff;
bt848->o_crop &= ~0xC0;
bt848->o_crop |= (temp >> 2) & 0xC0;
bt848->o_vdelay_lo = temp & 0xff;
/* end of video params */
@ -4394,6 +4493,35 @@ checkTuner:
}
}
/* The Hauppauge Windows driver gives the following Tuner Table */
/* To the right of this is the tuner models we select */
/*
1 External
2 Unspecified
3 Phillips FI1216
4 Phillips FI1216MF
5 Phillips FI1236 PHILIPS_NTSC
6 Phillips FI1246
7 Phillips FI1256
8 Phillips FI1216 MK2 PHILIPS_PALI
9 Phillips FI1216MF MK2
a Phillips FI1236 MK2 PHILIPS_FR1236_NTSC
b Phillips FI1246 MK2 PHILIPS_PALI
c Phillips FI1256 MK2
d Temic 4032FY5
e Temic 4002FH5 TEMIC_PAL
f Temic 4062FY5 TEMIC_PALI
10 Phillips FR1216 MK2
11 Phillips FR1216MF MK2
12 Phillips FR1236 MK2 PHILIPS_FR1236_NTSC
13 Phillips FR1246 MK2
14 Phillips FR1256 MK2
15 Phillips FM1216 PHILIPS_FR1216_PAL
16 Phillips FM1216MF
17 Phillips FM1236 PHILIPS_FR1236_NTSC
*/
if ( card == CARD_HAUPPAUGE ) {
bktr->card.tuner = &tuners[ TEMIC_PAL ];
readEEProm(bktr, 0, 128, (u_char *) &probe_eeprom );

View File

@ -197,6 +197,21 @@ struct _bktr_clip {
#define BT848SCBUF _IOW('x', 68, int)
#define BT848GCBUF _IOR('x', 68, int)
/* set capture area */
/* The capture area is the area of the video image which is grabbed */
/* Usually the capture area is 640x480 (768x576 PAL) pixels */
/* This area is then scaled to the dimensions the user requires */
/* using the METEORGEO ioctl */
/* However, the capture area could be 400x300 pixels from the top right */
/* corner of the video image */
struct bktr_capture_area {
int x_offset;
int y_offset;
int x_size;
int y_size;
};
#define BT848SCAPAREA _IOW('x', 69, struct bktr_capture_area)
#define BT848GCAPAREA _IOR('x', 69, struct bktr_capture_area)
/* Read/Write the BT848's I2C bus directly
* b7-b0: data (read/write)