⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 saa7111.c

📁 driver wdk
💻 C
📖 第 1 页 / 共 2 页
字号:
	//polarity
	buf[0]=15|0x80;
	buf[1]=18;
	buf[2]=FBKGP|DWE|VSP;
	IICWriteBytes(pDE, IIC_SUB_OSD, 3, buf);
	//set each row to single height & double width)
	for(i=0; i<15; i++){
		buf[0]=i|0x80;
		buf[1]=30;
		buf[2]=0x01;
		IICWriteBytes(pDE, IIC_SUB_OSD, 3, buf);
	}
	//Added on 03-3-4 by wjq to adjust OSD following video system changing
	/*nVideoFormat= GetVideoType(pDE, 0);
	if(nVideoFormat==VIDEOTYPE_NONE)
	{
		pDE->VideoType[0]=pDE->nPreVideoType[0];
	}
	else
	{
		pDE->VideoType[0]=nVideoFormat;
		pDE->nPreVideoType[0]=nVideoFormat;
	}*/

}
void ExtendString(PDEVICE_EXTENSION pDE, char *pDest, const unsigned char *pSrc, int nMaxChar, unsigned char *pHanLib)
{
	int i;
	unsigned char c;
	for(i=0; i<nMaxChar; i++){
		c=*pSrc++;
		if(c==0){
			memset(pDest, 0, (nMaxChar-i)*2);
			return;
		}
		if(c==' ')
			c=0;
		if(c&0x80){//chinese character
			if(pHanLib && pDE->nReplace<0xff){
				SetOwnerChar(pDE, (c<<8)|(*pSrc++), pHanLib, pDE->nReplace-BASE_OWNER_CHAR);
				*pDest++=pDE->nReplace++;
				pDest++;
				*pDest++=pDE->nReplace++;
				pDest++;
			}
			else{
				*pDest++=0;
				*pDest++=0;
				*pDest++=0;
				*pDest++=0;
			}
			i++;
		}
		else{
			*pDest++=c;
			pDest++;
		}
	}
}

VOID
Ave2kDpcForOSD(
    IN PKDPC Dpc,
    IN PVOID DeferredContext,
    IN PVOID SystemArgument1,
    IN PVOID SystemArgument2
	)
{
    PDEVICE_OBJECT DeviceObject = DeferredContext;
	PDEVICE_EXTENSION pDE = DeviceObject->DeviceExtension;
	unsigned char buf[40];
	unsigned char sDTString[10];//date & time string
	LARGE_INTEGER Time, LocalTime, TimeBias;
	TIME_FIELDS TimeFields;
	int nDay, nMon, nYear, nHour, nMin, nSec;
	//Get date & time
	KeQuerySystemTime(&Time);
#if _WIN32_WINNT==0x0400 || !TD_WIN98
	//NT, 2000 & later
	ExSystemTimeToLocalTime(&Time, &LocalTime);
#else
	//win98 (& me?)
	TimeBias.QuadPart=pDE->nTimeBias;
	TimeBias.QuadPart*=60*10000000;
	LocalTime=RtlLargeIntegerAdd(Time, TimeBias);
#endif
	RtlTimeToTimeFields(&LocalTime, &TimeFields);
	if(pDE->nDay!=TimeFields.Day)
		pDE->nOSDUpdate|=UPDATE_DATE;
	nDay=TimeFields.Day;
	nMon=TimeFields.Month;
	nYear=(TimeFields.Year+1600-2000)%100;
	nHour=TimeFields.Hour;
	nMin=TimeFields.Minute;
	nSec=TimeFields.Second;
	if(nSec==0){
		InitOSD(pDE, TRUE);
		AdjustOSDOffset(pDE);
		SetMaskWindow(pDE);
		pDE->nOSDUpdate|=UPDATE_NAME|UPDATE_DATE;//|UPDATE_BLANK;
	}
	if(pDE->nOSDUpdate&UPDATE_BLANK){
		//SetChannelName;
		buf[0]=(pDE->nOSDTextRow+1)|0x80;//row
		buf[1]=16|0x40;//column
		memset(buf+2, 0, 14);
		IICWriteBytes(pDE, IIC_SUB_OSD, 6*2+2, buf);
		pDE->nOSDUpdate &= ~UPDATE_BLANK;
	}
	if(pDE->nOSDUpdate&UPDATE_NAME){
		//SetChannelName;
		buf[0]=pDE->nOSDTextRow|0x80;//row
		buf[1]=16|0x40;//column
		buf[2]=0;
		buf[3]=0;
		memcpy(buf+4, pDE->pChannelName, 12);
		IICWriteBytes(pDE, IIC_SUB_OSD, 7*2+2, buf);
		buf[0]=pDE->nOSDTextRow|0xa0;//row
		buf[1]=16|0x40;//column
		memset((char *)buf+2, 0x07, 7*2);
		IICWriteBytes(pDE, IIC_SUB_OSD, 7*2+2, buf);
		pDE->nOSDUpdate &= ~UPDATE_NAME;
	}
	if(pDE->nOSDUpdate&UPDATE_DATE){
		//build date string
		char cSpace;
		cSpace=(unsigned char)(pDE->nSpaceChar);
		switch(pDE->nOSDMode){
		case 1:
			sprintf(sDTString, sDateFormat[0], nYear, cSpace, nMon, cSpace, nDay);
			break;
		case 2:
			sprintf(sDTString, sDateFormat[0], nYear, cSpace, nDay, cSpace, nMon);
			break;
		case 3:
			sprintf(sDTString, sDateFormat[0], nDay, cSpace, nMon, cSpace, nYear);
			break;
		case 4:
			sprintf(sDTString, sDateFormat[1], sMon[nMon-1], nDay, cSpace, nYear);
			break;
		case 5:
			sprintf(sDTString, sDateFormat[2], nYear, cSpace, sMon[nMon-1], nDay);
			break;
		}
		//Set date string
		buf[0]=pDE->nOSDTextRow|0x80;//row
		buf[1]=0|0x40;//column
		ExtendString(pDE, (char *)buf+2, sDTString, 9, NULL);
		IICWriteBytes(pDE, IIC_SUB_OSD, 9*2+2, buf);
		buf[0]=pDE->nOSDTextRow|0xa0;//row
		buf[1]=0|0x40;//column
		memset((char *)buf+2, 0x07, 9*2);
		IICWriteBytes(pDE, IIC_SUB_OSD, 9*2+2, buf);

		pDE->nOSDUpdate &= ~UPDATE_DATE;
	}
	//build time string
	sprintf(sDTString, "%02d:%02d:%02d ", nHour, nMin, nSec);
	//Set date & time string
	buf[0]=(pDE->nOSDTextRow+1)|0x80;//row
	buf[1]=0|0x40;//column
	ExtendString(pDE, (char *)buf+2, sDTString, 9, NULL);
	IICWriteBytes(pDE, IIC_SUB_OSD, 9*2+2, buf);
	buf[0]=(pDE->nOSDTextRow+1)|0xa0;//row
	buf[1]=0|0x40;//column
	memset((char *)buf+2, 0x07, 9*2);
	IICWriteBytes(pDE, IIC_SUB_OSD, 9*2+2, buf);
}

void SetOwnerChar(PDEVICE_EXTENSION pDE, ULONG nCnChar, unsigned char *pHanLib, int nIndex)
{
	unsigned char c1, c2;
	unsigned char buf[40];
	int nRow=nIndex;
	int i;
	unsigned char byData;
	c1=(unsigned char)(nCnChar>>8);
	c2=(unsigned char)(nCnChar&0xff);
	if(c1<0xa1 || c1>0xf7 || c2<0xa1 || c2>0xfe)
		return;
	if(c1>=0xb0)
		c1-=4;
	
	pHanLib+=((c1-0xa1)*0x5e+c2-0xa1)*32;
	// 1/2
	buf[0]=nRow|0xc0;
	buf[1]=0|0x40;
	buf[2]=0;
	buf[3]=0;
	buf[36]=0;
	buf[37]=0;
	for(i=0; i<16; i++){
		byData=*(pHanLib+i);
		buf[i*2+4]=byData>>4;
		buf[i*2+5]=(byData&0x0f)<<4;
	}
	IICWriteBytes(pDE, IIC_SUB_OSD, 38, buf);
	nRow++;
	// 2/2
	buf[0]=nRow|0xc0;
	buf[1]=0|0x40;//column
	for(i=0; i<16; i++){
		byData=*(pHanLib+i+16);
		buf[i*2+4]=byData;
		buf[i*2+5]=0;
	}
	IICWriteBytes(pDE, IIC_SUB_OSD, 38, buf);
}

void SetUserBitmap(PDEVICE_EXTENSION pDE, unsigned char *pBitmap)
{
	int i,j;
	unsigned char buf[40];
	unsigned char *pData;
	for(i=0; i<3; i++){
		// 1/2
		buf[0]=(i*2)|0xc0;
		buf[1]=0|0x40;
		for(j=0; j<18; j++){
			pData=pBitmap+j*9+i*3;
			buf[j*2+2]=*pData;
			buf[j*2+3]=*(pData+1);
		}
		IICWriteBytes(pDE, IIC_SUB_OSD, 38, buf);
		// 2/2
		buf[0]=(i*2+1)|0xc0;
		buf[1]=0|0x40;
		for(j=0; j<18; j++){
			pData=pBitmap+j*9+i*3+1;
			buf[j*2+2]=(*pData<<4)|(*(pData+1)>>4);
			buf[j*2+3]=*(pData+1)<<4;
		}
		IICWriteBytes(pDE, IIC_SUB_OSD, 38, buf);
	}
}
#define HORPOS_LEFT		0
#define HORPOS_RIGHT	1
#define HORPOS_FLOAT	2
#define VERPOS_TOP		0
#define VERPOS_BOTTOM	1

#define HOR_GRID		6
#define VER_GRID_PAL	19
#define VER_GRID_NTSC	18 //18->16 on 02-11-27
int AdjustOSDOffset(PDEVICE_EXTENSION pDE)
{
	int nGridLeft, nGridRight;
	int nGridTop, nGridBottom;
	int	nHorPos, nVerPos;
	int nOSDPosition=0;
	unsigned char buf[6];
	int nLineSpace;
	int nVerGrid;
	//Vertival position
	if(pDE->VideoType[0] == VIDEOTYPE_NTSC)
	{
		nVerGrid=VER_GRID_NTSC;
		nLineSpace=0;
		if(pDE->nOSDMaskBottom>234)
			pDE->nOSDMaskBottom=234;
	}
	else
	{
		nVerGrid=VER_GRID_PAL;
		nLineSpace=1;
	}
	pDE->nOSDVerOff=5;
	if(pDE->nOSDCorner&AVE2K_OSD_TOP)
	{
		pDE->nOSDTextRow=0;
		nOSDPosition|=0x40000000;//indicate OSD_TOP
	}
	else
	{
		if(pDE->VideoType[0] == VIDEOTYPE_NTSC)
			pDE->nOSDTextRow=11;
		else
			pDE->nOSDTextRow=13;
	}
	//Horizonal position
	if(!pDE->bOSDMaskEnable)
	{
		if(pDE->nOSDCorner&AVE2K_OSD_LEFT)
		{
			pDE->nOSDHorOff=4;
			nOSDPosition=nOSDPosition|0x20000000;//indicate OSD_LEFT
		}
		else
		{
			pDE->nOSDHorOff=61;	
			nOSDPosition=nOSDPosition|0x10000000;
		}	
	}
	else
	{
		if(pDE->nOSDCorner&AVE2K_OSD_LEFT)
		{
			if(pDE->nOSDMaskRight<180)//fit for left area
				nHorPos=HORPOS_LEFT;
			else
			{
				if(pDE->nOSDMaskLeft>180)//fit for right area
					nHorPos=HORPOS_RIGHT;
				else//float area
					nHorPos=HORPOS_FLOAT;
			}
		}
		else
		{
			if(pDE->nOSDMaskLeft>180)//fit for right area
				nHorPos=HORPOS_RIGHT;
			else
			{
				if(pDE->nOSDMaskRight<180)//fit for left area
					nHorPos=HORPOS_LEFT;
				else//float area
					nHorPos=HORPOS_FLOAT;
			}
		}
		switch(nHorPos)
		{
		case HORPOS_LEFT:
			pDE->nOSDHorOff=4;
			nOSDPosition|=0x20000000;
			nGridLeft=pDE->nOSDMaskLeft/HOR_GRID;
			nGridRight=(pDE->nOSDMaskRight)/HOR_GRID;
			break;
		case HORPOS_RIGHT:
			pDE->nOSDHorOff=61;
			nOSDPosition|=0x10000000;
			nGridLeft=(pDE->nOSDMaskLeft-180)/HOR_GRID;
			nGridRight=(pDE->nOSDMaskRight-180)/HOR_GRID;
			break;
		case HORPOS_FLOAT:
			pDE->nOSDHorOff=pDE->nOSDMaskLeft/3;
			nOSDPosition|=(pDE->nOSDMaskLeft/16)|0x80000000;
			nGridLeft=0;
			nGridRight=(pDE->nOSDMaskRight-pDE->nOSDMaskLeft)/HOR_GRID;
			break;
		}
		//vertical grid
		nGridTop=pDE->nOSDMaskTop/nVerGrid;
		nGridBottom=pDE->nOSDMaskBottom/nVerGrid;

		pDE->nOSDMaskGridTop=nGridTop;
		pDE->nOSDMaskGridBottom=nGridBottom;
		pDE->nOSDMaskGridLeft=nGridLeft;
		pDE->nOSDMaskGridRight=nGridRight;
	}
	//horizonal offset
	buf[0]=15|0x80;
	buf[1]=13;
	buf[2]=(unsigned char)pDE->nOSDHorOff;//81;
	IICWriteBytes(pDE, IIC_SUB_OSD, 3, buf);
	//vertical offset
	buf[0]=15|0x80;
	buf[1]=12;
	buf[2]=(unsigned char)pDE->nOSDVerOff;
	IICWriteBytes(pDE, IIC_SUB_OSD, 3, buf);
	//line space
	buf[0]=15|0x80;
	buf[1]=16;
	buf[2]=(unsigned char)nLineSpace;
	IICWriteBytes(pDE, IIC_SUB_OSD, 3, buf);
	return nOSDPosition;
}

int SetMaskWindow(PDEVICE_EXTENSION pDE)
{
	unsigned char buf[6];
	int bEnable;
	if(!pDE->bOSDMaskEnable){
		buf[0]=15|0x80;//row
		buf[1]=0|0x40;//column
		buf[2]=0;
		buf[3]=0;
		IICWriteBytes(pDE, IIC_SUB_OSD, 4, buf);
	}
	else{
		pDE->nOSDUpdate=UPDATE_NAME|UPDATE_DATE;
		buf[0]=15|0x80;//row
		buf[1]=0|0x40;//column
		buf[2]=(pDE->nOSDMaskGridTop<<4)|pDE->nOSDMaskGridBottom; //Row start~end Address 
		buf[3]=(pDE->nOSDMaskGridLeft<<3)|0x04;//0x04 is enable //write COL START ADDR
		buf[4]=(pDE->nOSDMaskGridRight<<3);//write COL END ADDR
		IICWriteBytes(pDE, IIC_SUB_OSD, 5, buf);
	}
	return TRUE;
}

VOID
Ave2kDpcForAudioReport(
    IN PKDPC Dpc,
    IN PVOID DeferredContext,
    IN PVOID SystemArgument1,
    IN PVOID SystemArgument2
	)
{

}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -