📄 saa7111.c
字号:
//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 + -