📄 overlay.cpp
字号:
#include "stdafx.h"
//
//File name: AVE2KOVERLAY.C
//This file contains code to control overlay function of SAA7146A
//#include "ave2koverlay.h"
#include "card.h"
#include "vdec.h"
#include "hpsv.h"
#include "hpsh.h"
static ULONG Dcgx(ULONG x);
static void GetHScaleParas(int nip, int nop, ULONG hxo, ULONG *HPreScale, ULONG *HScale);
static void GetVScaleParas(int nil, int nol, ULONG hyo, ULONG *VScale, ULONG *VGain);
//static BOOLEAN JudgeInterlace(PDEVICE_EXTENSION pDE);
#define HXO 0x10
#define HYO 0x1a
void CCard::SetDisplayPara(PAVE2KLIB_DISPLAY_PARAMETER pPara, ULONG uPhyAdd)
{
m_DisplayParameter=*pPara;
m_PhysicalAddress=uPhyAdd;
}
//This function make SAA7146A ready for overlay function
int CCard::Overlay(RECT *pWindow, int nChannel, BOOL bOpen)
{
ULONG outformat;
ULONG bSwitch=0;
//ULONG ClipDmaPhyAddr;
//StartVideo();
//return 1;
StopVideo();
DisableAllClip();
WriteReg(RPS_TOV1, 0);
WriteReg(DD1_INIT, 0x07000700);
WriteReg(PCI_BT_V1, 0x1f1f1f1f);
//WriteReg(DD1_INIT, 0x01000100);
if(!bOpen)
return 1;
m_OverlayWindow=*pWindow;
//Get current video type
m_NIP = 702;
if(m_nVideoType[nChannel]==VIDEOTYPE_UNKNOWN)
m_nVideoType[nChannel] = GetVideoType(0);
if(m_nVideoType[nChannel] == VIDEOTYPE_NTSC)
m_NIL = 240;
else
m_NIL = 288;
//------ setup HPS ------
if(m_OverlayWindow.bottom - m_OverlayWindow.top > 2*m_NIL)
m_OverlayWindow.bottom=m_OverlayWindow.top+2*m_NIL;
Shift(nChannel);
Setup_HScale(m_NIP, (m_OverlayWindow.right - m_OverlayWindow.left), HXO);
Setup_VScale(m_NIL, m_OverlayWindow.bottom - m_OverlayWindow.top, HYO);
if(nChannel==0)
WriteReg(HPS_CTRL, (HYO << 12)); // port_a & vert offs
else
WriteReg(HPS_CTRL, (1<<30)|(1<<28)|(HYO << 12));
//ClipDmaPhyAddr=MmGetPhysicalAddress(&m_Clips[0].ClipDmaBuffer[0]).u.LowPart;
//------ setup BCS ------
WriteReg(BCS_CTRL, 0x90430040); // brig cont xx sat
//--- outformat & clip --
if(m_DisplayParameter.BitCount&0x80000000){
outformat = YUV422;
}
else{
// 80 = 64K, 81= RGB24, 82 = True Color, 83=RGB1555
if(m_DisplayParameter.Depth == 2) //64k colors
{
if(m_DisplayParameter.BitCount == 15)
outformat = RGB1555;
else
outformat = RGB16;
}
else if(m_DisplayParameter.Depth == 3)//24 bits colors
outformat = RGB24;
else if(m_DisplayParameter.Depth == 4)//32 bits colors
outformat = RGB32;
else if(m_DisplayParameter.Depth == 1)//8 bits colors
outformat = RGB8;
}
m_outformat= (m_outformat & 0xffff)|(((0x00|outformat) << 24)+0x10000);
WriteReg(CLIP_FORMAT_CTRL, m_outformat); // outformat w.o. clip,chroma
//WriteReg(PITCH2,0x00000000);
//WriteReg(BASE_PAGE2,0x00000004);
//WriteReg(NUM_LINE_BYTE2,0x4040);
UploadVideo();
//WriteReg(MC1, ((TR_E_2<<16)|TR_E_2));
StartVideo();
return 1;
}
static ULONG Dcgx(ULONG x)
{
ULONG dcgx = HpsH[x] & 0xffff;
if (x>31) dcgx=dcgx/8;
else if (x>15) dcgx=dcgx/4;
else if (x>7) dcgx=dcgx/2;
if (dcgx==16) dcgx=7;
else if (dcgx==8) dcgx=3;
else dcgx=dcgx/2;
return dcgx;
}
void CCard::UploadVideo()
{
// upload all video regs
WriteReg(MC2, 0x06f406f4);
}
void CCard::Setup_HScale(int nip, int nop, ULONG hxo)
{
ULONG HPreScale, HScale;
GetHScaleParas(nip, nop, hxo, &HPreScale, &HScale);
WriteReg(HPS_H_PRESCALE, HPreScale);
WriteReg(HPS_H_SCALE, HScale);
}
static void GetHScaleParas(int nip, int nop, ULONG hxo, ULONG *HPreScale, ULONG *HScale)
{
ULONG xpsc=64;
ULONG xsci=4095;
ULONG dcgx;
ULONG cxyuv;
ULONG hpsc;
if (nop != 0)
{
if(nop>nip){
xpsc=0;
xsci=1024l*nip/nop;
dcgx = 0;
}
else{
xpsc = nip / nop;
if(xpsc>64) xpsc = 64;
xsci = 1024l * nip / (nop * xpsc--);
if(xsci>4095) xsci = 4095;
dcgx = Dcgx(xpsc);
}
}
cxyuv = HpsH[xpsc] >> 16;
hpsc = (xpsc<<18) + cxyuv + (cxyuv<<8) + (dcgx<<27);
if(nop>nip)
hpsc=hpsc+(1l<<17);
*HPreScale=hpsc;
*HScale=(xsci<<12) + hxo;
}
void CCard::Setup_VScale(int nil, int nol, ULONG hyo)
{
ULONG VScale,VGain;
GetVScaleParas(nil, nol, hyo, &VScale, &VGain);
WriteReg(HPS_V_SCALE, VScale);
WriteReg(HPS_V_GAIN, VGain);
}
static void GetVScaleParas(int nil, int nol, ULONG hyo, ULONG *VScale, ULONG *VGain)
{
ULONG yacl;
ULONG ysci;
ULONG ypo;
ULONG ype;
ULONG yacm;
ULONG factor;
ULONG dcgy;
ULONG hpsv;
ULONG cya;
ULONG cyb;
ULONG pfy;
ULONG pfuv;
//ULONG weight;
int index;
if(nol!=0){
if(nol>nil){
nol++;
nol/=2;
}
if(nol*2==nil || nol*3== nil || nol*4==nil)
nol++;
if(nol*3<=nil*2){ //nol/nil < 2/3
index=nil/nol;
hpsv=HpsV[index-1];
cya=(hpsv>>24)&0xff;
cyb=(hpsv>>16)&0xff;
//Output(cya+" "+cyb+"\n");
//weight=hpsv&0xff;
dcgy=index/2;
//if(index>=2)
//dcgy=1;
//else
//dcgy=0;
yacm=1;
yacl=nil/nol-1;
ysci=1020-1024l*nol/nil;
ype=ysci/16;
ypo=ype;
}
else{
dcgy=0;
cya=0;
cyb=255;
yacm=0;
factor=1000l*nil/nol;
yacl=nil/nol-1;
ysci=factor-factor*nol/nil;
ype=ysci/16;
ypo=ype;
}
*VScale=(yacm<<31)+(ysci<<21)+(yacl<<15)+(ypo<<8)+(ype<<1);
pfy=0;
pfuv=1;
*VGain=(pfuv<<24)+(dcgy<<16)+(cya<<8)+cyb;
}
}
void CCard::StopVideo()
{
WriteReg(MC1, 0x20000000); //Disable EPS1
WriteReg(MC1, TR_E_1<<16);
}
void CCard::StartVideo()
{
WriteReg(MC1, (TR_E_1<<16)|TR_E_1);
}
void CCard::Shift(int nChannel)
{
ULONG nX;
ULONG nY;
ULONG dFrame;
ULONG pitch;
ULONG nol;
ULONG nil;
nX=m_OverlayWindow.left;
nY=m_OverlayWindow.top;
dFrame=m_PhysicalAddress +
nY*m_DisplayParameter.Pitch +
nX*m_DisplayParameter.Depth;
pitch = m_DisplayParameter.Pitch;
nol = m_OverlayWindow.bottom - m_OverlayWindow.top;
nil = m_NIL;
if(nol>nil){
WriteReg(BASE_ODD1, dFrame+pitch);
WriteReg(BASE_EVEN1, dFrame);
WriteReg(PROT_ADDR1, dFrame + pitch * nol);
WriteReg(PITCH1, pitch*2);
}
else{
WriteReg(BASE_ODD1, dFrame);
WriteReg(BASE_EVEN1, dFrame + pitch * nol +4);
WriteReg(PROT_ADDR1, dFrame + pitch * nol);
WriteReg(PITCH1, pitch);
}
if(m_DisplayParameter.BitCount==0x8000000f)
WriteReg(BASE_PAGE1, 0x00000001);
else
WriteReg(BASE_PAGE1, 0x00000000);
WriteReg(NUM_LINE_BYTE1, (nil << 16) + m_NIP);
WriteReg(MC2, (UPLD_DMA1<<16)|UPLD_DMA1);
}
void CCard::DisableAllClip()
{
//disable clipping rectangle
m_outformat= m_outformat&0xffff0000;
WriteReg(CLIP_FORMAT_CTRL,m_outformat);
//Upload format register
WriteReg(MC2,(UPLD_HPS_V<<16)|UPLD_HPS_V); //bit 5: U
//disable DMA 2
WriteReg(MC1, ((TR_E_2<<16)));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -