📄 favgroup.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 + -