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

📄 overlay.cpp

📁 vc ad
💻 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 + -