225 lines
5.0 KiB
C
225 lines
5.0 KiB
C
/*
|
|
* config.c
|
|
*
|
|
* 32-bit Video Capture driver
|
|
* configuration callback support
|
|
*
|
|
* Geraint Davies, Feb 93
|
|
*/
|
|
|
|
#include <vckernel.h>
|
|
#include <bravado.h>
|
|
#include "hardware.h"
|
|
#include "vidcio.h"
|
|
|
|
|
|
/*
|
|
* Configure the destination format - the size, bitdepth of the
|
|
* destination dib, and set any necessary translation table to
|
|
* translate from YUV to the specified format.
|
|
*/
|
|
BOOLEAN
|
|
HW_ConfigFormat(PDEVICE_INFO pDevInfo, PCONFIG_INFO pGeneric)
|
|
{
|
|
PCONFIG_FORMAT pConfig;
|
|
PHWINFO pHw;
|
|
int ImageSize;
|
|
|
|
pConfig = (PCONFIG_FORMAT) pGeneric;
|
|
|
|
if (pConfig->ulSize != sizeof(CONFIG_FORMAT)) {
|
|
return(FALSE);
|
|
}
|
|
|
|
pHw = (PHWINFO) VC_GetHWInfo(pDevInfo);
|
|
|
|
ImageSize = pConfig->ulWidth * pConfig->ulHeight;
|
|
|
|
switch(pConfig->Format) {
|
|
case FmtYUV:
|
|
case FmtRGB24:
|
|
|
|
if(pHw->pXlate) {
|
|
VC_FreeMem(pDevInfo, pHw->pXlate, pHw->ulSizeXlate);
|
|
pHw->pXlate = NULL;
|
|
}
|
|
|
|
ImageSize *= (pConfig->Format == FmtYUV ? 2 : 3);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case FmtRGB555:
|
|
/*
|
|
* build yuv->rgb555 xlate if format is not already FmtRGB555
|
|
*/
|
|
if (pHw->Format != FmtRGB555) {
|
|
if (pHw->pXlate != NULL) {
|
|
VC_FreeMem(pDevInfo, pHw->pXlate, pHw->ulSizeXlate);
|
|
pHw->pXlate = NULL;
|
|
}
|
|
|
|
if (!HW_BuildYUVToRGB555(pDevInfo, pHw)) {
|
|
pHw->Format = FmtInvalid;
|
|
return(FALSE);
|
|
}
|
|
}
|
|
ImageSize *= 2;
|
|
break;
|
|
|
|
case FmtPal8:
|
|
|
|
/*
|
|
* we are passed xlate table - free up any existing table
|
|
*/
|
|
|
|
if (pHw->pXlate) {
|
|
VC_FreeMem(pDevInfo, pHw->pXlate, pHw->ulSizeXlate);
|
|
pHw->pXlate = NULL;
|
|
}
|
|
|
|
/*
|
|
* if no xlate table is passed, then build a default translation
|
|
* (for a 64-level grey scale palette)
|
|
*/
|
|
if (pConfig->pXlate == NULL) {
|
|
dprintf2(("building default xlate"));
|
|
if (!HW_BuildDefaultXlate(pDevInfo, pHw)) {
|
|
pHw->Format = FmtInvalid;
|
|
return(FALSE);
|
|
}
|
|
break;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* check that the xlate passed is the right size
|
|
*/
|
|
if (pConfig->ulSizeXlate != PAL_TO_RGB555_SIZE) {
|
|
dprintf(("bad xlate table passed"));
|
|
return(FALSE);
|
|
}
|
|
|
|
/* we need to wrap the access to the table in a call
|
|
* to VC_AccessData in order to ensure valid kernel-mode
|
|
* access to the data
|
|
*/
|
|
if (!VC_AccessData(pDevInfo, pConfig->pXlate, pConfig->ulSizeXlate,
|
|
HW_BuildYuvToPal, NULL)) {
|
|
dprintf(("xlate access failed"));
|
|
pHw->Format = FmtInvalid;
|
|
return(FALSE);
|
|
}
|
|
break;
|
|
|
|
|
|
default:
|
|
dprintf(("bad dib format requested"));
|
|
return(FALSE);
|
|
}
|
|
|
|
pHw->Format = pConfig->Format;
|
|
pHw->dwWidth = (DWORD) pConfig->ulWidth;
|
|
pHw->dwHeight = (DWORD) pConfig->ulHeight;
|
|
|
|
dprintf2(("dest format %d, %d x %d", pHw->Format, pHw->dwWidth, pHw->dwHeight));
|
|
|
|
HW_SetScale(pDevInfo, pHw->dwWidth, pHw->dwHeight);
|
|
|
|
VC_SetImageSize(pDevInfo, ImageSize);
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
/*
|
|
* Configure the adjustable parameters of the overlay or
|
|
* external monitor display. Changing these variables will not
|
|
* change the captured image.
|
|
*/
|
|
BOOLEAN
|
|
HW_ConfigDisplay(PDEVICE_INFO pDevInfo, PCONFIG_INFO pGeneric)
|
|
{
|
|
PCONFIG_DISPLAY pConfig;
|
|
PHWINFO pHw;
|
|
|
|
if (pGeneric->ulSize != sizeof(CONFIG_DISPLAY)) {
|
|
dprintf(("bad config struct"));
|
|
return(FALSE);
|
|
}
|
|
|
|
pConfig = (PCONFIG_DISPLAY) pGeneric;
|
|
pHw = (PHWINFO) VC_GetHWInfo(pDevInfo);
|
|
|
|
HW_Set4680Reg(pDevInfo, 0, (BYTE) (pConfig->ulBrightness & 0x3f));
|
|
HW_Set4680Reg(pDevInfo, 1, (BYTE) (pConfig->ulSaturation & 0x3f));
|
|
HW_Set4680Reg(pDevInfo, 2, (BYTE) (pConfig->ulContrast & 0x3f));
|
|
HW_Set4680Reg(pDevInfo, 4, (BYTE) (pConfig->ulRed & 0x3f));
|
|
HW_Set4680Reg(pDevInfo, 5, (BYTE) (pConfig->ulGreen & 0x3f));
|
|
HW_Set4680Reg(pDevInfo, 6, (BYTE) (pConfig->ulBlue & 0x3f));
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
/*
|
|
* configure the source parameters - this controls the acquisition
|
|
* of the source image, and will thus affect both the overlay/monitor output,
|
|
* and the captured data.
|
|
*/
|
|
BOOLEAN
|
|
HW_ConfigSource(PDEVICE_INFO pDevInfo, PCONFIG_INFO pGeneric)
|
|
{
|
|
PCONFIG_SOURCE pConfig;
|
|
PHWINFO pHw;
|
|
int RegA, Reg6;
|
|
|
|
if (pGeneric->ulSize != sizeof(CONFIG_SOURCE)) {
|
|
dprintf(("bad config struct"));
|
|
return(FALSE);
|
|
}
|
|
|
|
pConfig = (PCONFIG_SOURCE) pGeneric;
|
|
pHw = (PHWINFO) VC_GetHWInfo(pDevInfo);
|
|
|
|
/* set the HUE register - this is 0..3F like all the other
|
|
* colour settings: we need to convert this to 0..FF before
|
|
* outputing the data.
|
|
*/
|
|
HW_Set9051Reg(pDevInfo, 7, (BYTE) ((pConfig->ulHue & 0xff) * 4));
|
|
|
|
|
|
/* select pal/ntsc video standard */
|
|
pHw->VideoStd = pConfig->VideoStd;
|
|
HW_SetVideoStd(pDevInfo, pHw);
|
|
|
|
|
|
/* set the cable format and source connector */
|
|
RegA = HW_Get9051Reg(pDevInfo, 0xa);
|
|
Reg6 = HW_Get9051Reg(pDevInfo, 0x6);
|
|
|
|
/* strip out source select and composite/svideo bits */
|
|
RegA &= 0xC7;
|
|
Reg6 &= 0x7f;
|
|
|
|
/* add back in source connector number */
|
|
RegA |= ((pConfig->ulConnector & 0x3) << 3);
|
|
|
|
/* add back in composite/svideo bits */
|
|
if (pConfig->CableFormat == SVideo) {
|
|
RegA |= 0x20;
|
|
Reg6 |= 0x80;
|
|
}
|
|
|
|
/* set the new values */
|
|
HW_Set9051Reg(pDevInfo, 0xa, (BYTE) RegA);
|
|
HW_Set9051Reg(pDevInfo, 0x6, (BYTE) Reg6);
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
|