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

📄 favgroup.c

📁 MiniWinOuterSM MiniWinOuterSM
💻 C
字号:
#include"FavGroup.h"
#include"stdio.h"
#include"Prmem.h"
static FAVGROUP*favGroups=NULL;
int EnumGroupService(FAVGROUP*grp,ENUMSERVICEPROC proc,void*userData)
{
	int i;
	int ret=0;
	for(i=0;i<grp->serviceCount;i++){
		int rc=0;
		if(proc)
			rc=proc(grp->Services+i,userData);
		if(rc)ret++;
	}
	return ret;
}
FAVGROUP*CreateFavGroup(const char*name,int favID)
{
	FAVGROUP*fav=(FAVGROUP*)PrMalloc(sizeof(FAVGROUP));
	strcpy(fav->name,name);
	fav->FavId=favID;
	fav->serviceCount=0;
	fav->next=NULL;
	fav->Services=NULL;
	fav->Capacity=0;
	return fav;
}
int AddFavGroup(FAVGROUP*fav)
{
	int grpCount=1;
	if(favGroups==NULL){
		favGroups=fav;
	}else{
		FAVGROUP*t=favGroups;
		while(t){
			if(t->next==NULL){
				t->next=fav;
				grpCount++;
				break;
			}
			grpCount++;
			t=t->next;
		}
	}
	return grpCount;
}
int GetServiceInFavGroup(FAVGROUP*fav,int idx,SERVICELOCATOR*svc)
{
    if(fav&&(idx<fav->serviceCount)&&(idx>=0))
    {
	*svc=fav->Services[idx];
	return 1;
    }
    return 0;
}
int UpdateGroupFromTS(TSDATA*ts)
{//把一个TS中的SERVICE更新到所有GROUP,不包含用户分组
	int count=0;
	PrMutexLock(ts->lock,-1);
	if(ts->sdt){
		SECTIONDATA*sd=ts->sdt->sections;
		while(sd){
			unsigned char*sec=sd->Data;
			int i,serviceCount;
			unsigned short nid,tid;
			serviceCount=GetSdtServiceCount(sec);
			nid=GetSdtNetID(sd->Data);
			tid=GetSdtStreamID(sd->Data);
			for(i=0;i<serviceCount;i++){
				unsigned char *des;
				DVBService service;
				SERVICELOCATOR sloc;
				unsigned char st;
				GetSdtService(sec,&service,i);
				des=FindDescriptor(service.descriptors,service.descriptor_loop_length,SERVICE_DESCRIPTOR_TAG);
				if(des==NULL)continue;
				sloc.serviceId=service.service_id;
				sloc.netId=nid;			sloc.tsId=tid;
				st=des[2];
				switch(st){
				case ST_VIDEO:
					AddServiceToFavGroup(FindFavGroupByID(GROUP_VIDEO),&sloc);
					AddServiceToFavGroup(FindFavGroupByID(GROUP_ALL),&sloc);break;
				case ST_AUDIO:
					AddServiceToFavGroup(FindFavGroupByID(GROUP_AUDIO),&sloc);break;
				case ST_NVODREF:
				case ST_NVODSHIFT:
					AddServiceToFavGroup(FindFavGroupByID(GROUP_NVOD),&sloc);break;
				case ST_TELETEXT:
					AddServiceToFavGroup(FindFavGroupByID(GROUP_TELETEXT),&sloc);break;
				case ST_DATA:
				case ST_MHP:
					AddServiceToFavGroup(FindFavGroupByID(GROUP_DATA),&sloc);break;
				}
				count++;
			}
			sd=sd->next;
		}
	}
	if(ts->pmt&&ts->pat&&ts->pat->sections){//按照PMT取分组数据
		SECTIONDATA*sd=ts->pmt->sections;
		unsigned short tsid=GetPatStreamID(ts->pat->sections->Data);
		FAVGROUP*favNvod=FindFavGroupByID(GROUP_NVOD);
		while(sd){
			ProgElement prg;
			int i,ec=GetPmtElementCount(sd->Data);
			SERVICELOCATOR sloc;
			sloc.tsId=tsid;
			sloc.serviceId=GetPmtServiceID(sd->Data);
			sloc.netId=ts->netId;
			if(favNvod&&FindServiceInFavGroup(favNvod,&sloc))
				ec=0;//如果是NVOD则不做处理
			for(i=0;i<ec;i++){
				GetPmtElement(sd->Data,&prg,i);
				switch(prg.stream_type){
				case 1:
				case 2:
					AddServiceToFavGroup(FindFavGroupByID(GROUP_VIDEO),&sloc);
					AddServiceToFavGroup(FindFavGroupByID(GROUP_ALL),&sloc);break;
					break;
				case 3:
				case 4:
					AddServiceToFavGroup(FindFavGroupByID(GROUP_AUDIO),&sloc);
					break;
				case 6:
					if(FindDescriptor(prg.descriptors,prg.ES_info_length,TELETEXT_DESCRIPTOR_TAG))
						AddServiceToFavGroup(FindFavGroupByID(GROUP_TELETEXT),&sloc);
					break;
				case 0x0B:
					AddServiceToFavGroup(FindFavGroupByID(GROUP_DATA),&sloc);
					break;
				}
			}
			sd=sd->next;
			count++;
		}//end of while sd(section)
	}
	PrMutexUnlock(ts->lock);
	return count;
}
static CreateDefGroup(const char*name,unsigned int favID,int clearmode)
{//
	FAVGROUP*grp=FindFavGroupByID(favID);//全部业务
	if(grp&&clearmode)
		ClearServiceInFavGroup(grp);
	else{
		grp=CreateFavGroup(name,favID);
		AddFavGroup(grp);
	}
}
int CreateDefaultGroup(int clearIfExist)
{//建立系统缺省分组,清空其中的service并根据TS更新
	CreateDefGroup("ALL",GROUP_ALL,clearIfExist);
	CreateDefGroup("Video",GROUP_VIDEO,clearIfExist);
	CreateDefGroup("Audio",GROUP_AUDIO,clearIfExist);
	
	CreateDefGroup("NVOD",GROUP_NVOD,clearIfExist);
	CreateDefGroup("Teletext",GROUP_TELETEXT,clearIfExist);
	CreateDefGroup("Data",GROUP_DATA,clearIfExist);
	return 5;
}
int UpdateAllGroup(void)
{
	int rc=0;
	TSDATA*ts=GetFirstTS();
	while(ts){
		UpdateGroupFromTS(ts);
		rc++;
		ts=ts->next;
	}
	return rc;
}
int DeleteFavGroup(FAVGROUP*fav)
{
	FAVGROUP*grp=favGroups;
	if(grp==fav){
		favGroups=favGroups->next;
	}else{
		while(grp){
			if(grp->next==fav){
				grp->next=fav->next;
				break;
			}
			grp=grp->next;
		}
	}
	if(fav->Services)
		PrFree(fav->Services);
	PrFree(fav);
	return 0;
}
void DeleteAllFavGroup(){
	FAVGROUP*grp=favGroups;
	while(grp){
		FAVGROUP*t=grp->next;
		if(grp->serviceCount>0)
			PrFree(grp->Services);
		PrFree(grp);
		grp=t;
	}
	favGroups=NULL;
}

FAVGROUP*FindFavGroupByName(const char*name)
{
	FAVGROUP*fav=favGroups;
	while(fav){
		if(name&&(strcmp(fav->name,name)==0))
			return fav;
		fav=fav->next;
	}
	return NULL;
}
FAVGROUP*FindFavGroupByID(int FavId)
{
	FAVGROUP*fav=favGroups;
	while(fav){
		if(fav->FavId==FavId)
			return fav;
		fav=fav->next;
	}
	return NULL;
}
FAVGROUP*GetFirstFavGroup(void)
{
	return favGroups;
}
int AddServiceToFavGroup(FAVGROUP*fav,SERVICELOCATOR*service)
{
	if((fav==NULL)||(FindServiceInFavGroup(fav,service)>=0))
		return 0;
	if(fav->serviceCount>=fav->Capacity){
		SERVICELOCATOR*tmp=fav->Services;
		fav->Capacity+=8;
		fav->Services=(SERVICELOCATOR*)PrMalloc(sizeof(SERVICELOCATOR)*fav->Capacity);
		memcpy(fav->Services,tmp,sizeof(SERVICELOCATOR)*fav->serviceCount);
		if(fav->Services==NULL){
			fav->Services=tmp;
			return 0;
		}
		if(tmp)PrFree(tmp);
	}
	fav->Services[fav->serviceCount++]=*service;
	return 1;
}
int FindServiceInFavGroup(FAVGROUP*fav,SERVICELOCATOR*service)
{//返回service在Group中的位置
	int i;
	if(fav!=NULL){	
		for(i=0;i<fav->serviceCount;i++){
			SERVICELOCATOR s=fav->Services[i];
			if((s.tsId==service->tsId)&&(s.serviceId==service->serviceId))
				return i;
		}
	}
	return -1;
}
int DeleteServiceFromFavGroup(FAVGROUP*fav,SERVICELOCATOR*service)
{
	int i;
	FAVGROUP*grp=GetFirstFavGroup();
	while(grp){
		if((fav==NULL)||(fav==grp))
		for(i=0;i<grp->serviceCount;i++){
			SERVICELOCATOR s=grp->Services[i];
			if((s.tsId==service->tsId)&&(s.serviceId==service->serviceId)){
				memcpy(grp->Services+i,grp->Services+i+1,
					(grp->serviceCount-i-1)*sizeof(SERVICELOCATOR));
				grp->serviceCount--;
				return 1;
			}
		}
		grp=grp->next;
	}
	return 0;
}
void ClearServiceInFavGroup(FAVGROUP*fav)
{//清除FavGroup中的所有service
	if(fav&&fav->Services){
		PrFree(fav->Services);
		fav->Services=NULL;
		fav->serviceCount=0;
		fav->Capacity=0;
	}
}
int ExcahgeServiceInFavGroup(FAVGROUP*fav,int idx1,int idx2)
{//交换两个service在FavGroup中的位置
	SERVICELOCATOR tmp;
	if((idx1<0)||(idx2<0)||(fav==NULL)||(idx1>=fav->serviceCount)||(idx2>=fav->serviceCount))
		return 0;
	tmp=fav->Services[idx1];
	fav->Services[idx1]=fav->Services[idx2];
	fav->Services[idx2]=tmp;
	return 1;
}

int CreateGroupByBouquet(void)
{
	SECTIONDB*db;
	SECTIONDATA*sd;
	unsigned short bid;
	FAVGROUP*grp;
	db=GetBouquetDB();
	grp=GetFirstFavGroup();
	if((db==NULL)||((sd=db->sections)==NULL))
		return 0;
	while(grp){
		if(grp->FavId&BOUQUET_FAVID_PREFIX)
			ClearServiceInFavGroup(grp);
		grp=grp->next;
	}
	while(sd){
		int slen=GetNitFirstLoopLen(sd->Data);
		unsigned char*des;
		char name[256];
		int tsCount,i;
		if(sd->Data[0]!=0x4A){
			PrDbgPrintf("CreateGroupByBouquet::sd->Data is not BAT Section tableID=0x%02X\n",
				sd->Data[0]);
			sd=sd->next;continue;
		}
		bid=GetExtTableID(sd->Data);
		des=FindDescriptor(sd->Data+10,(unsigned short)slen,BOUQUET_NAME_DESCRIPTOR_TAG);
		if(GetBatBouquetName(sd->Data,(unsigned char*)name,NULL)==0)
			sprintf(name,"Bouquet%d",bid);
		grp=CreateFavGroup(name, bid | BOUQUET_FAVID_PREFIX );
		AddFavGroup(grp);
		tsCount=GetNitTSCount(sd->Data);
		for(i=0;i<tsCount;i++){
			DVBStream ts;
			unsigned char*p;
			int dlen;
			GetNitTSStream(sd->Data,&ts,i);
			p=FindDescriptor(ts.descriptors,ts.transport_descriptor_length,SERVICE_LIST_DESCRIPTOR_TAG);
			if(p==NULL)
				continue;
			dlen=p[1];
			p+=2;
			for(;dlen>0;dlen-=3,p+=3){
				SERVICELOCATOR sloc;
				sloc.netId=ts.original_network_id;
				sloc.tsId=ts.transport_stream_id;
				sloc.serviceId=(p[0]<<8)|p[1];
				AddServiceToFavGroup(grp,&sloc);
			}
		}
		sd=sd->next;
	}
	return  0;
}

⌨️ 快捷键说明

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