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

📄 repid.c

📁 有线电视系统前端设备复用器原代码。 用语接受卫星信号
💻 C
📖 第 1 页 / 共 5 页
字号:
			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 + -