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