📄 repid.c
字号:
PID_Info[PortNo].PAT.PAT_Section=(unsigned char *)MemAlloc(RNG2ID,"GETPATPMT--PAT_Section",Section_Length);
if(PID_Info[PortNo].PAT.PAT_Section == NULL)
return;
MemCopy(PID_Info[PortNo].PAT.PAT_Section,Section,Section_Length);
/*--------------------------------------------------------*/
/* 计算节目个数 */
/*--------------------------------------------------------*/
PMT_Sections=( Section_Length - 5 -4 ) / 4;
/*----------------------------------------------*/
/* 先从PAT Section 中提取所有PMT 的 PID */
/* 保存在临时变量中 */
/*---------------------------------------------*/
DataAddr=(unsigned char *)(Section + 8);
for(i=0;i<PMT_Sections;i++)
{/*获取PAT中节目号和PMTPID*/
PrgNo[i]=*(unsigned short *)(DataAddr + 4 * i);
PMT_Pid[i]=(*(unsigned short *)(DataAddr + 4 * i + 2))&0x1FFF;
}
GotPAT=1;
break;
}
else
continue;
}
/*--------------------------------------------------------*/
/* 逐个提取PMT */
/*--------------------------------------------------------*/
if(GotPAT==0)
{
MemFree(Section);
return 0;
}
GotPMTs=0;
for(i=0;i<PMT_Sections;i++)
{
for(Loop=0;Loop<2;Loop++)
{
/*----------------------------------------------------------*/
/* NIT 不用提取 */
/*----------------------------------------------------------*/
if((PrgNo[i]==0)&&(PMT_Pid[i]==0x10))
continue;
/*从端口获得PMT段*/
Section_Length=GetPMTSection(PortNo,PMT_Pid[i],PrgNo[i],Section);
if(Section_Length==0)
{
Display("Get PMT section length=0, LOOP=%d \n",Loop);
continue;
}
/*----------------------------------------------------*/
/* 对PMT进行CRC校验 */
/*----------------------------------------------------*/
if(CRC_Verify(Section,Section_Length)==0)
{
/*------------------------------------------------*/
/* 校验正确,保存到全局变量中 */
/*------------------------------------------------*/
PID_Info[PortNo].PID_Map[GotPMTs].OldPrgNo =PrgNo[i];
PID_Info[PortNo].PID_Map[GotPMTs].OldPID =PMT_Pid[i];
PID_Info[PortNo].PID_Map[GotPMTs].StreamType=STREAM_TYPE_PMT;
Index++;
PID_Info[PortNo].PMT[GotPMTs].Section_Length=Section_Length;
PID_Info[PortNo].PMT[GotPMTs].PMT_PID=PMT_Pid[i];
if(PID_Info[PortNo].PMT[GotPMTs].PMT_Section!=NULL)
MemFree(PID_Info[PortNo].PMT[GotPMTs].PMT_Section);
PID_Info[PortNo].PMT[GotPMTs].PMT_Section=(unsigned char *)MemAlloc(RNG2ID,"GETPATPMT PMT_Section",Section_Length);
if(PID_Info[PortNo].PMT[GotPMTs].PMT_Section == NULL)
return;
MemCopy(PID_Info[PortNo].PMT[GotPMTs].PMT_Section,Section,Section_Length);
GotPMTs++;
break;
}
else
{
Display(" PMT CRC verify error!\n");
continue;
}
}
}
PID_Info[PortNo].PMTs=GotPMTs;
PID_Info[PortNo].PIDs=GotPMTs;
if(GotPMTs==0)
{
MemFree(Section);
return 0;
}
/*--------------------------------------------------------------------*/
/* 提取CAT */
/*--------------------------------------------------------------------*/
for(Loop=0;Loop<2;Loop++)
{
/* 从端口提取CAT段*/
Section_Length=GetCATSection(PortNo,Section);
if(Section_Length==0)
continue;
if(CRC_Verify(Section,Section_Length)==0)
{
/*------------------------------------------------*/
/* 校验正确,保存到全局变量中 */
/*------------------------------------------------*/
PID_Info[PortNo].CAT.Section_Length=Section_Length;
if(PID_Info[PortNo].CAT.CAT_Section!=NULL)
MemFree(PID_Info[PortNo].CAT.CAT_Section);
PID_Info[PortNo].CAT.CAT_Section=(unsigned char *)MemAlloc(RNG2ID,"GETPATPMT--CAT_Section",Section_Length);
if(PID_Info[PortNo].CAT.CAT_Section == NULL)
return;
MemCopy(PID_Info[PortNo].CAT.CAT_Section,Section,Section_Length);
/*------------------------------------------------*/
/* 提取EMM */
/*------------------------------------------------*/
CAT_Section_Head=(CAT_SECTION_TAG *)Section;
Rest=Section_Length - sizeof(CAT_SECTION_TAG);
CA_Head=(CA_DESCRIPTOR_TAG *)((unsigned char *)Section + sizeof(CAT_SECTION_TAG));
Index=PID_Info[PortNo].PIDs;
CA_PID_Index=0;
while(Rest>4)
{
if(CA_Head->Descriptor_tag==0x09)
{
PID_Info[PortNo].PID_Map[Index].OldPrgNo =0;
PID_Info[PortNo].PID_Map[Index].OldPID =CA_Head->CA_PID;
PID_Info[PortNo].PID_Map[Index].StreamType =STREAM_TYPE_EMM;
PID_Info[PortNo].PID_Map[Index].SetPrgNo =PID_Info[PortNo].PID_Map[Index].NewPrgNo =CA_Head->CA_system_ID;
PID_Info[PortNo].PID_Map[Index].SetPID =PID_Info[PortNo].PID_Map[Index].NewPID =CA_PID_List[PortNo] + CA_PID_Index;
CA_PID_Index++;
PID_Info[PortNo].PIDs++;
Index++;
}
Rest-=CA_Head->Descriptor_length + 2;
CA_Head=(CA_DESCRIPTOR_TAG *)((unsigned char *)CA_Head + CA_Head->Descriptor_length + 2);
}
break;
}
}
MemFree(Section);
return 1;
}
/*------------------------------------------------------------------*/
/* 计算新PID,保存到全局变量中 */
/*------------------------------------------------------------------*/
unsigned long PidReMap(unsigned char PortNo)
{
int i,j,k;
PMT_SECTION_TAG *PMT_Head;
ES_INFO_Tag *ES_Head;
CA_DESCRIPTOR_TAG *CA_Head;
unsigned short volatile ES_Info_Off;
unsigned char volatile ES_Info_Length;
unsigned short volatile Total_ES_Info_Length;
short volatile Rest,PrgRest,EsRest;
unsigned char volatile PIDIndex=PID_Info[PortNo].PIDs;
unsigned short volatile PID;
unsigned char volatile range;
unsigned short volatile PCR_PID;
unsigned char volatile HasThePID;
unsigned char volatile Found;
unsigned short PrgList[8]={0x2,0x40,0x80,0xC0,0x100,0x140,0x180,0x1C0};
unsigned short volatile PrgNoBase,PrgNo;
/*--------------------------------------------------------------*/
/* 分配新的节目号和PID */
/* 每个端口分配64个节目,节目号分配如下: */
/* 端口1:0x2 -0x40 */
/* 端口2:0x40 -0x80 */
/* 端口3:0x80 -0xC0 */
/* 端口4:0xC0 -0x110 */
/* 端口5:0x110-0x140 */
/* 端口6:0x140-0x180 */
/* 端口7:0x180-0x1C0 */
/* 端口8:0x1C0-0x1F0 */
/*--------------------------------------------------------------*/
PrgNoBase=PrgList[PortNo];
for(i=0;i<PID_Info[PortNo].PMTs;i++)
{
/*----------------------------------------------------------*/
/* 生成所有节目的新的PMT PID */
/*----------------------------------------------------------*/
PrgNo=PrgNoBase + i;
PID=PID_Info[PortNo].PID_Map[i].SetPID=PID_Info[PortNo].PID_Map[i].NewPID=(unsigned short)(PrgNo<<4);
PID_Info[PortNo].PID_Map[i].SetPrgNo =PID_Info[PortNo].PID_Map[i].NewPrgNo=PrgNo;
PID++;
/*--------------------------------------------------------------*/
/* 从PMT的section中得到所有基本流的 PID */
/*--------------------------------------------------------------*/
PMT_Head=(PMT_SECTION_TAG *)PID_Info[PortNo].PMT[i].PMT_Section;
/*--------------------------------------------------------------*/
/* 提取节目的ECM */
/*--------------------------------------------------------------*/
Rest=PMT_Head->Program_info_length;
CA_Head=(CA_DESCRIPTOR_TAG *)((unsigned char *)PMT_Head + sizeof(PMT_SECTION_TAG));
PIDIndex = PID_Info[PortNo].PIDs;
while(Rest>0)
{
if(CA_Head->Descriptor_tag==0x09)
{
/*----------------------------------------------------*/
/* 该PID是否已经被映射 */
/*----------------------------------------------------*/
HasThePID=0;
for(k=0;k<PID_Info[PortNo].PIDs;k++)
{
if(CA_Head->CA_PID==PID_Info[PortNo].PID_Map[k].OldPID)
{
HasThePID=1;
break;
}
}
if(!HasThePID)
{
PID_Info[PortNo].PID_Map[PIDIndex].OldPrgNo =PMT_Head->Program_number;
PID_Info[PortNo].PID_Map[PIDIndex].OldPID =CA_Head->CA_PID;
PID_Info[PortNo].PID_Map[PIDIndex].StreamType =STREAM_TYPE_ECM;
PID_Info[PortNo].PID_Map[PIDIndex].SetPrgNo =PID_Info[PortNo].PID_Map[PIDIndex].NewPrgNo =PrgNo;
PID_Info[PortNo].PID_Map[PIDIndex].SetPID =PID_Info[PortNo].PID_Map[PIDIndex].NewPID =PID++;
PID_Info[PortNo].PIDs++;
PIDIndex = PID_Info[PortNo].PIDs;
}
else
{
PID_Info[PortNo].PID_Map[PIDIndex].OldPrgNo =PMT_Head->Program_number;
PID_Info[PortNo].PID_Map[PIDIndex].OldPID =CA_Head->CA_PID;
PID_Info[PortNo].PID_Map[PIDIndex].StreamType =STREAM_TYPE_ECM;
PID_Info[PortNo].PID_Map[PIDIndex].SetPrgNo =PID_Info[PortNo].PID_Map[PIDIndex].NewPrgNo =PrgNo;
PID_Info[PortNo].PID_Map[PIDIndex].SetPID =PID_Info[PortNo].PID_Map[PIDIndex].NewPID =PID_Info[PortNo].PID_Map[k].NewPID;
PID_Info[PortNo].PIDs++;
PIDIndex = PID_Info[PortNo].PIDs;
}
}
Rest-=CA_Head->Descriptor_length + 2;
CA_Head=(CA_DESCRIPTOR_TAG *)((unsigned char *)CA_Head + CA_Head->Descriptor_length + 2);
}
/*****************************************************************/
ES_Head=(ES_INFO_Tag *)((unsigned char *)PMT_Head + sizeof(PMT_SECTION_TAG) + PMT_Head->Program_info_length);
Rest=PMT_Head->SectionLength - (sizeof(PMT_SECTION_TAG) - 3) - PMT_Head->Program_info_length;
PIDIndex=PID_Info[PortNo].PIDs;
for(;;)
{
/*----------------------------------------------------------*/
/* 剩下4字节的CRC校验 */
/*----------------------------------------------------------*/
if(Rest<=4)
break;
PID_Info[PortNo].PID_Map[PIDIndex].OldPrgNo=PMT_Head->Program_number;
PID_Info[PortNo].PID_Map[PIDIndex].SetPrgNo=PID_Info[PortNo].PID_Map[PIDIndex].NewPrgNo=PrgNo;
PID_Info[PortNo].PID_Map[PIDIndex].StreamType=ES_Head->Stream_type;
/*-----------------------------------------------------------*/
/*如果已经对该Old PID 作过一次映射,不需要再映射 */
/* modified 2001/8/3 */
/*-----------------------------------------------------------*/
range=PID_Info[PortNo].PIDs;
Found=0;
for(j=PID_Info[PortNo].PMTs;j<range;j++)
{
if(PID_Info[PortNo].PID_Map[j].OldPID==ES_Head->Elelmentary_PID)
{
Found=1;
break;
}
}
if(Found)
{
PID_Info[PortNo].PID_Map[PIDIndex].OldPID=ES_Head->Elelmentary_PID;
PID_Info[PortNo].PID_Map[PIDIndex].SetPID=PID_Info[PortNo].PID_Map[PIDIndex].NewPID=PID_Info[PortNo].PID_Map[j].NewPID;
PID_Info[PortNo].PIDs++;
}
else
{
PID_Info[PortNo].PID_Map[PIDIndex].OldPID=ES_Head->Elelmentary_PID;
PID_Info[PortNo].PID_Map[PIDIndex].SetPID=PID_Info[PortNo].PID_Map[PIDIndex].NewPID=PID++;
PID_Info[PortNo].PIDs++;
}
/************************************************************/
/*----------------------------------------------------------*/
/* 处理基本流的ECM */
/*----------------------------------------------------------*/
EsRest=ES_Head->ES_info_length;
CA_Head=(CA_DESCRIPTOR_TAG *)((unsigned char *)ES_Head + sizeof(ES_INFO_Tag));
PIDIndex=PID_Info[PortNo].PIDs;
while(EsRest>0)
{
if(CA_Head->Descriptor_tag==0x09)
{
/*----------------------------------------------------*/
/* 该PID是否已经被映射 */
/*----------------------------------------------------*/
HasThePID=0;
for(k=0;k<PID_Info[PortNo].PIDs;k++)
{
if(CA_Head->CA_PID==PID_Info[PortNo].PID_Map[k].OldPID)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -