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

📄 dvbepg.c

📁 MiniWinOuterSM MiniWinOuterSM
💻 C
📖 第 1 页 / 共 2 页
字号:
	FilterSetNotify(fltPMT,PMTCBK,0);
#endif
	TRACE("msgQEPG=0x%08X msgQPlay=0x%08X\r\n",msgQEPG,msgQPlay);
	return 0;
}
int EpgReset(void)
{
	ResetSystemDB();
	FreeAllTS();
	DeleteAllFavGroup();
	return PrOK;
} 
int EpgTerm(void)
{
	int i; 
	epgInited=0;
	PrThreadDestroy(playThread);
	PrThreadDestroy(schThread);
	PrMsgQDestroy(msgQEPG);
	PrMsgQDestroy(msgQPlay);
	for(i=0;i<MAX_TS_SERVICE;i++){
		memset(&Schedules[i],0,sizeof(SCHEDULE));
		DestroySectionDB(Schedules[i].secDB);
	}
	return 0;
}
int DVBInit(void)
{
	PrVideoInit();
	PrAudioInit();
	PrNvmInit();
	PrTunerInit();
//	PrInputInit(2);
//	PrInputEnable();
	CreateSystemDB();
	DMXFiltInit();
	EpgInit(3072000);
	BookingInit();
   //LoadDVBData(0); 
   //UpdateAllGroup();
   //CreateGroupByBouquet(); 
}
int DVBTerm(void)
{
//	PrInputTerm();
	PrTunerTerm();
	PrAudioTerm();
	PrVideoTerm();
	DMX_Init();
	EpgTerm();
	PrThreadSleep(1000);
	BookingTerm();
	DestroySystemDB();
}
PRStatus LockDVBSI(void)
{
	return PrMutexLock(epgMutex,-1);
}
PRStatus UnlockDVBSI(void)
{
	return PrMutexUnlock(epgMutex);
}

void*hwndNotify;
void RegisterEPGNotify(void*hwnd)
{
	hwndNotify=hwnd;
}

static SCHEDULE*GetScheduleSlot(USHORT netid,USHORT tsid,USHORT sid,int alloc)
{
	int i;
	for(i=0;i<MAX_TS_SERVICE;i++){
		SCHEDULE*sch=Schedules+i;
		if((sch->netid==netid)&&(sch->tsid==tsid)&&(sch->serviceId==sid))
			return sch;
	}
	if(!alloc)return NULL;
	for(i=0;i<MAX_TS_SERVICE;i++){
		SCHEDULE*sch=Schedules+i;
		if((sch->serviceId==0)&&(sch->netid==0)&&(sch->tsid==0)){
			FreeDBSections(sch->secDB);
			sch->serviceId=sid;
			sch->tsid=tsid;
			sch->netid=netid;
			sch->version=0;
			TRACE("Alloc CH for %d.%d.%d\r\n",netid,tsid,sid);
			return sch;
		}
	}
	for(i=0;i<MAX_TS_SERVICE;i++){
		SCHEDULE*sch=Schedules+i;
		if((sch->netid!=netid)||(sch->tsid!=tsid)){
			FreeDBSections(sch->secDB);
			TRACE("Free Sections %d.%d.%d\r\n",sch->netid,sch->tsid,sch->serviceId);
			sch->serviceId=sid;
			sch->tsid=tsid;
			sch->netid=netid;
			sch->version=0;
			return sch;
		}
	}
	return NULL;
}
SECTIONDB*LockScheduleDB(const SERVICELOCATOR*svr)
{
	int i;
	if(svr){
		SCHEDULE*sch;
		for(i=0;i<MAX_TS_SERVICE;i++){
			sch=Schedules+i;
			if((sch->netid==svr->netId)&&(sch->tsid==svr->tsId)
				&&(sch->serviceId==svr->serviceId)){
				PrMutexLock(sch->lock,-1);
				return sch->secDB;
			}
		}
	}
	return NULL;
}
void UnlockScheduleDB(const SERVICELOCATOR*svr)
{
	if(svr){
		SCHEDULE*sch;
		int i;
		for(i=0;i<MAX_TS_SERVICE;i++){
			sch=Schedules+i;
			if((sch->netid==svr->netId)&&(sch->tsid==svr->tsId)
				&&(sch->serviceId==svr->serviceId)){
				PrMutexUnlock(sch->lock);
				break;
			}
		}
	}
}
SECTIONDB*GetEITPFDB(void)
{
	return SchedulePF;
}

int RequestEPG(const SERVICELOCATOR*service,short type)
{
	EPGREQUEST req;
	int rc;
	req.msgID=WM_REQUESTSI;
	req.wParam=0;
	GetScheduleSlot(service->netId,service->tsId,service->serviceId,1);
	//rc=PrMsgQSendTimeout(msgQEPG,&req,sizeof(EPGREQUEST),100);
	return rc==0?1:0;
}
static void SearchProc(void*params)
{
	UINT idx=0,noRequestTimes=0;
	PRSem sem=PrSemCreate(0);
	PRMpgFilt filt;
	INT siState=0;/*0=NONE,1 NIT 2 SDT 3 PAT,4 PMT */
	TRACE("EpgProc\r\n");
	filt=FilterCreate(0,MPGFILT_SECTION);
	while(epgInited){
		PRStatus rc;
		EPGREQUEST msg;
		rc=PrMsgQRecvTimeout(msgQEPG,&msg,sizeof(EPGREQUEST),100);
		if(rc==PrERR)continue;//接收所用户请求的数据
		switch(msg.msgID){
		case 0x40:;//NIT
		}
	}
}

INT EnumEvents(SERVICELOCATOR*sloc,void*userData,DVBENUMPROC enumProc)
{
	SECTIONDB*db=LockScheduleDB(sloc);
	SECTIONDATA*sd=NULL;
	int count=0;
	if(db)sd=db->sections;
	while(sd){
		int i,ec=GetEitEventCount(sd->Data);
		for(i=0;i<ec;i++){
			DVBEvent evt;
			GetEitEvent(sd->Data,&evt,i);
			if(enumProc)count+=enumProc(&evt,userData);
		}
		sd=sd->next;
	}
	if(db)UnlockScheduleDB(sloc);
	return count;
}
PRBool SetTunerByService(const SERVICELOCATOR*svr)
{
	TSDATA*ts=FindTS(svr->netId,svr->tsId);
	if(ts){
		TRACE("Tuning to TS %d.%d Frequency %d\r\n",
			ts->netId,ts->tsId,ts->tunerParams.frequency);
		return PrTunerSet(0,&ts->tunerParams)==PrOK;
	}
	return PR_TRUE;
}

int SearchSingleTS(void)
{
	//PrThreadCreate(8192,SEARCH_PRIORITY,SearchProc,);
	return 0;
}
int SearchNetwork(void)
{
	int nc,tsCount=0;
	SECTIONDATA*sd=NULL;
	PRSem sem=PrSemCreate(0);
	PRMpgFilt filt=FilterCreate(0,MPGFILT_SECTION);
	//nc=GetNIT(filt,sem);
	FilterDestroy(filt);
	PrSemDestroy(sem);
	if(nc){
		SECTIONDB*db=GetNetworkDB();
		sd=db->sections;
		FreeAllTS();
		CreateDefaultGroup(1);//重建系统分组,并清空所有分组数据
	}
	while(sd){
		int i,cc=GetNitTSCount(sd->Data);
		tsCount+=cc;
		for(i=0;i<cc;i++){
			DVBStream stm;
			TSDATA*ts;
			GetNitTSStream(sd->Data,&stm,i);
			ts=CreateTS(stm.original_network_id,stm.transport_stream_id);
			GetDeliveryTuneInfo(&stm,&ts->tunerParams);
			if(PrTunerSet(0,&ts->tunerParams)==PrOK)
				SearchSingleTS();
		}
		sd=sd->next;
	}
	return tsCount;
}
int GetCurrentService(SERVICELOCATOR*svr)
{
	*svr=CurrentService;
	return 1;
}
static int PlayService(const SERVICELOCATOR*svr)
{
	TSDATA*ts;
	LockDVBSI();
	ts=FindTS(svr->netId,svr->tsId);
	TRACE("**Play service %d.%d.%d\r\n",svr->netId,svr->tsId,svr->serviceId);
	if(ts){
		USHORT pcrPID[16],vid[16],aid[16];
		SetTunerByService(svr);
		CurrentService=*svr;
		if(GetServicePIDS(svr,pcrPID,vid,aid)>1){
			TRACE("###VideoPID=%d AudioPID=%d PcrPID=%d\r\n",
				vid[0],aid[0],pcrPID[0]);
			/*PrVideoSetPid(vid[0]);
			PrPCRSetPid(pcrPID[0]);
			PrVideoStart();
			PrAudioSetPid(aid[0]);
			PrAudioStart();*/
			PrAVPlay(vid[0],aid[0],pcrPID[0]);
			UnlockDVBSI();
			return 1;
		}
	}
	UnlockDVBSI();
	return 0;
} 
int PlayByService(const SERVICELOCATOR*svr)
{
	PRStatus rc=PrMsgQSendTimeout(msgQPlay,(void*)svr,sizeof(SERVICELOCATOR),10);
	return rc==PrOK;
} 
static int PreparePSI(const SERVICELOCATOR*svc)
{
	TSDATA*ts=FindTS(svc->netId,svc->tsId);
	USHORT pmtpid=0;
#ifdef USE_PSI_MONITOR
	if(ts){
		if(ts->pat&&ts->pat->sections){
			int i,cnt;
			UCHAR*sdata;
			PrMutexLock(ts->lock,-1);
			sdata=ts->pat->sections->Data;
			cnt=GetPatProgramCount(sdata);
			for(i=0;i<cnt;i++){
				DVBProgram prg;
				GetPatProgram(sdata,&prg,i);
				if(prg.program_number==svc->serviceId){
					pmtpid=prg.pmt_PID;
					break;
				}
			}
			PrMutexUnlock(ts->lock);
		}
		if(pmtpid){
			UCHAR mask=0xFF;
			UCHAR data=0x02;
			FilterStop(fltPMT);		
			FilterSetMask(fltPMT,&mask,&data,1);
			FilterSetCrcMode(fltPMT,1);
			FilterSetNotify(fltPMT,PMTCBK,0);
			FilterSetPID(fltPMT,pmtpid);
			TRACE("Recv [%d]'s PMT PID=%d\r\n",svc->serviceId,pmtpid);
			FilterStart(fltPMT);		
		}
	}
#endif
	return 0;
}
void PlayProc(void*param)
{
	TRACE("PlayThread Started %d\r\n",epgInited);
	while(epgInited){
		SERVICELOCATOR service;
		UINT msgCount=0;
		PRStatus rc;
		rc=PrMsgQNumOfMsgs(msgQPlay,&msgCount);
		if(rc!=PrOK){
			TRACE("PrMsgQNumOfMsgs failed,AVPlay task terminated\r\n");
			return ;
		}
		if(msgCount>0){
			TRACE("Play Queue has some request do all requests\r\n");
			while(msgCount){
				rc=PrMsgQRecvTimeout(msgQPlay,&service,sizeof(SERVICELOCATOR),500);
				PrMsgQNumOfMsgs(msgQPlay,&msgCount);
				if(msgCount!=0){
					TRACE("Play Queue has %d request skip(%d.%d.%d)\r\n",
						msgCount,service.netId,service.tsId,service.serviceId);
				}
			}
		}else{
			//TRACE("Play Queue is empty wait for new Play request\r\n");
			rc=PrMsgQRecvTimeout(msgQPlay,&service,sizeof(SERVICELOCATOR),500);
		}
		if(rc==PrOK){
			EPGREQUEST req;
			int pfsc;
			int  st=GetServiceType(&service);
			PreparePSI(&service);
			RequestEPG(&service,REQUEST_EITSCH);
			TRACE("Play Service(%d.%d.%d)\r\n",service.netId,service.tsId,service.serviceId);
			PlayService(&service);
			/*if((st!=ST_NVODREF)&&(st!=ST_NVODSHIFT)){
				GetScheduleSlot(service.netId,service.tsId,service.serviceId,1);
			}*/
		}
	}
}

⌨️ 快捷键说明

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