Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

224 lines
5.0 KiB

/*
* 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);
}