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

📄 dvb_si.c

📁 DVB软件,基于CT216软件的开发源程序.
💻 C
📖 第 1 页 / 共 5 页
字号:
#endif

		(pstSrvItem+u8PatCount)->u16PMTPid=(pstPATBuffer+u8PatCount)->u16PID;
#ifdef CHECK_SERVICE_BY_TRUST_PAT
		(pstSrvItem+u8PatCount)->u16ServiceId=(pstPATBuffer+u8PatCount)->u16ProgramNumber;
#endif
		pu8SectionBuffer+=4;
	}

#ifdef PMT_BURST_MODIFY

	for (u8PatCount=0; u8PatCount<u8NumOfPatItem; u8PatCount++)
	{
		SI_DBG(("Item %03d, SID: %04X, PID: %04X, GROUP: %02X\n",
				  (int)u8PatCount,
				  (pstPATBuffer+u8PatCount)->u16ProgramNumber,
				  (pstPATBuffer+u8PatCount)->u16PID,
				  (pstPATBuffer+u8PatCount)->b8GroupPID));
	}
#endif

}
/*******************************************************************************************/          

void parser_pmt( u8 u8FID, u8* pu8Section )
{
	bool8 			b8CAdescriptor;
	u8 				u8AudioIdx;
	u8				u8DesLen;
	u8* 				pu8Descriptor = NULL;
	u8 				au8AudioLang [4];
#ifdef SUPPORT_SECOND_AUDIO_LANGUAGE
	u8 				au8AudioLang2 [4];
	bool8           b8MultiAudio = FALSE;
	bool8           b8UseSecondAudio = FALSE;
#endif//SUPPORT_SECOND_AUDIO_LANGUAGE
	DB_SrvDetail* 	pstSrvItemPtr=NULL;
	u8* 				pu8Temp;
	u16 				u16Ac3PID;
	
#ifdef MULTI_AUDIO_SURPPORT 
	u8				u8tempi = 0;
	u8 				u8AuIndex = 0;
	u16 				au16AudioPID[MAX_AUDIO_PID_NUMBER];

	memset(au16AudioPID, 0, sizeof(u16)*MAX_AUDIO_PID_NUMBER);
#endif 
	u16 u161stPriorityAudioPID, u162ndPriorityAudioPID;
	u16 u16FirstAudioPID = 0;


#ifdef PMT_BURST_MODIFY
	u16 				u32SubTableID;
	u8 				u8PatItemNo=0;
#endif

	if (pu8Section==NULL||pstSrvItem==NULL)
	{
		return;
	}
#ifndef PMT_BURST_MODIFY

	pstSrvItemPtr=(DB_SrvDetail*)(pstSrvItem+au8FID2ItemIdx [u8FID]);
#else

	if ((pstPATItem+au8FID2ItemIdx [u8FID])->b8GroupPID==TRUE)
	{
		u32SubTableID=PU8TOU16(pu8Section+3);

		if (FindPatItemNumber(u32SubTableID, & u8PatItemNo)!=TRUE)
		{
			return;
		}
		else
		{
			pstSrvItemPtr=(DB_SrvDetail*)(pstSrvItem+u8PatItemNo);

			(pstPATItem+u8PatItemNo)->b8Received=TRUE;
		}
	}
	else
	{
		pstSrvItemPtr=(DB_SrvDetail*)(pstSrvItem+au8FID2ItemIdx [u8FID]);

		(pstPATItem+au8FID2ItemIdx [u8FID])->b8Received=TRUE;
	}
#endif	//#ifndef PMT_BURST_MODIFY

	u8AudioIdx=0;
	b8CAdescriptor=FALSE;
	u16FirstAudioPID=0;
	u161stPriorityAudioPID = 0;
	u162ndPriorityAudioPID = 0;
	u16Ac3PID=0;

#ifdef ATSC_SYSTEM
	#ifdef CHECK_SERVICE_EXIST_BY_TVCT
	if (!b8TVCTExist)
	#endif
	{
		pstSrvItemPtr->u16ServiceId=PU8TOU16(pu8Section+3);
	}
#else
#ifndef CHECK_SERVICE_BY_TRUST_PAT	/* if defined, the service was added by PAT. */
#ifdef CHECK_SERVICE_BY_TRUST_SDT
	if (!b8SDTExist)
#endif
	{
		pstSrvItemPtr->u16ServiceId=PU8TOU16(pu8Section+3);
	}
#endif
#endif	

	pstSrvItemPtr->u16PCRPid=PU8TOU16(pu8Section+8)&0x1fff;
	SI_DBG(("SID: %04X, PCR: %04X", pstSrvItemPtr->u16ServiceId, pstSrvItemPtr->u16PCRPid));

#if defined(CHECK_SCRAMBLE_BY_PMT) || defined(CHECK_SCRAMBLE_BY_BOTH)

	if (b8CAdescriptor==FALSE)
	{
		pu8Descriptor=DVB_ParserFindTag(pu8Section+12, TAG_CaD, PU8TOU16(pu8Section+10)&0x0fff);

		if (pu8Descriptor!=NULL)
		{
	#ifdef CI_ENABLE

			pstSrvItemPtr->u16CASystemID=PU8TOU16(pu8Descriptor+2);
	#endif
	#ifdef D_UI
			pstSrvItemPtr->u16EcmPid = PU8TOU16(pu8Descriptor+4) & 0x1fff;
	#endif

			b8CAdescriptor=TRUE;
		}
	}
#endif

	pu8Temp=DVB_ParserFindFirstLoop(pu8Section, EN_PMT);

	while (pu8Temp!=NULL)
	{
		switch (pu8Temp [0])
		{
            /* Modify for HDTV service (20080804, Iris) */
            case 0x10: // H.264 over MPEG2
			case 0x1B: // MPEG4 over MPEG2
			case 0x88: // VC9 over MPEG2
#ifdef  HDTV_DETECTION_ENABLE
	       pstSrvItemPtr->u8StreamType = 0x01;
#endif
			case 0x01: // mpeg 1 video
			case 0x02: // mpeg 2 video
				if (pstSrvItemPtr->u16VideoPid!=0)
					break;
				pstSrvItemPtr->u16VideoPid=PU8TOU16(pu8Temp+1)&0x1fff;
				SI_DBG((", VID: %04X", pstSrvItemPtr->u16VideoPid));

#if defined(CHECK_SCRAMBLE_BY_PMT) || defined(CHECK_SCRAMBLE_BY_BOTH)

				if (b8CAdescriptor==FALSE)
				{
					pu8Descriptor=DVB_ParserFindTag(pu8Temp+5, TAG_CaD, PU8TOU16(pu8Temp+3)&0x0fff);

					if (pu8Descriptor!=NULL)
					{
	#ifdef CI_ENABLE

						pstSrvItemPtr->u16CASystemID=PU8TOU16(pu8Descriptor+2);
	#endif
	#ifdef D_UI
						pstSrvItemPtr->u16EcmPid = PU8TOU16(pu8Descriptor+4) & 0x1fff;
	#endif

						b8CAdescriptor=TRUE;
					}
				}
#endif

				break;

			case 0x03: // mpeg 1 audio
			case 0x04: // mpeg 2 audio
				SI_DBG((", AID: %04X", PU8TOU16(pu8Temp+1)&0x1fff));

#if defined(CHECK_SCRAMBLE_BY_PMT) || defined(CHECK_SCRAMBLE_BY_BOTH)

				if (b8CAdescriptor==FALSE)
				{
					pu8Descriptor=DVB_ParserFindTag(pu8Temp+5, TAG_CaD, PU8TOU16(pu8Temp+3)&0x0fff);

					if (pu8Descriptor!=NULL)
					{
	#ifdef CI_ENABLE

						pstSrvItemPtr->u16CASystemID=PU8TOU16(pu8Descriptor+2);
	#endif
	#ifdef D_UI
						pstSrvItemPtr->u16EcmPid = PU8TOU16(pu8Descriptor+4) & 0x1fff;
	#endif

						b8CAdescriptor=TRUE;
					}
				}
#endif

				pu8Descriptor=DVB_ParserFindTag(pu8Temp+5, TAG_LnD, PU8TOU16(pu8Temp+3)&0x0fff);
				
				if (u16FirstAudioPID == 0)
				{
					u16FirstAudioPID = PU8TOU16(pu8Temp+1)&0x1fff;

					u8AudioIdx++;
				}

#ifdef MULTI_AUDIO_SURPPORT
				if(au16AudioPID[u8AuIndex] == 0)
				{
					au16AudioPID[u8AuIndex] = PU8TOU16(pu8Temp+1)&0x1fff;
				}
				u8AuIndex++;
#endif
				
				if (pu8Descriptor!=NULL)
				{
					au8AudioLang [0]=*(pu8Descriptor+2);

					au8AudioLang [1]=*(pu8Descriptor+3);
					au8AudioLang [2]=*(pu8Descriptor+4);
					au8AudioLang [3]=0;
					SI_DBG((" %c%c%c", pu8Descriptor [2], pu8Descriptor [3], pu8Descriptor [4]));
#ifdef SUPPORT_SECOND_AUDIO_LANGUAGE
					if(*(pu8Descriptor+1)>6)//If there're two Audio Language in the same PID)
					{
						memset( au8AudioLang2, 0x00, 4);
						memcpy( au8AudioLang2, pu8Descriptor+6, 3);
						b8MultiAudio = TRUE;
						pstSrvItemPtr->u8MultiAudio = TRUE;
					}
#endif//SUPPORT_SECOND_AUDIO_LANGUAGE
					if (u161stPriorityAudioPID==0)
					{
						if (strstr(& acFirstAudio [0], & au8AudioLang [0])!=0)
						{
							u161stPriorityAudioPID=PU8TOU16(pu8Temp+1)&0x1fff;

							break;
						}
#ifdef SUPPORT_SECOND_AUDIO_LANGUAGE
						if(b8MultiAudio == TRUE)
						{
							if (strstr(& acFirstAudio [0], & au8AudioLang2 [0])!=0)
							{
								u161stPriorityAudioPID=PU8TOU16(pu8Temp+1)&0x1fff;
								b8UseSecondAudio = TRUE;
								break;
							}
						}
#endif//SUPPORT_SECOND_AUDIO_LANGUAGE
					}	

					if (u162ndPriorityAudioPID==0)
					{
						if (strstr(& acSecondAudio [0], & au8AudioLang [0])!=0)
						{
							u162ndPriorityAudioPID=PU8TOU16(pu8Temp+1)&0x1fff;

							break;
						}
#ifdef SUPPORT_SECOND_AUDIO_LANGUAGE
						if(b8MultiAudio == TRUE)
						{
							if (strstr(& acSecondAudio [0], & au8AudioLang2 [0])!=0)
							{
								u162ndPriorityAudioPID=PU8TOU16(pu8Temp+1)&0x1fff;
								b8UseSecondAudio = TRUE;
								break;
							}
						}
#endif//SUPPORT_SECOND_AUDIO_LANGUAGE
					}
				}
				
				break;

			case 0x06: // ttx
				if (DVB_ParserFindTag(pu8Temp+5, TAG_TtD, PU8TOU16(pu8Temp+3)&0x0fff)!=NULL)
				{
					if (pstSrvItemPtr->u16TTXPid==0)
					{
						pstSrvItemPtr->u16TTXPid=PU8TOU16(pu8Temp+1)&0x1fff;
					}

					SI_DBG(("\n ttxid: %d", PU8TOU16(pu8Temp+1)&0x1fff));

					u8DesLen=pu8Descriptor [1];
					SI_DBG(("des len %d", (u16)u8DesLen));
					pu8Descriptor+=2;

					while (u8DesLen>=5)
					{
						SI_DBG(("%c%c%c", pu8Descriptor [0], pu8Descriptor [1], pu8Descriptor [2]));

						SI_DBG(("ttx type: %hx", pu8Descriptor [3]>>3));
						SI_DBG(("page %hx %hx", pu8Descriptor [3]&0x07, pu8Descriptor [4]));

						if ((pu8Descriptor [3]>>3)==0x01) // ttx type == initial ttx page
						{
							pstSrvItemPtr->u16TTXPid=PU8TOU16(pu8Temp+1)&0x1fff;
						}

						u8DesLen-=5;
						pu8Descriptor+=5;
					}
				}
				else if (DVB_ParserFindTag(pu8Temp+5, TAG_AC3D, PU8TOU16(pu8Temp+3)&0x0fff)!=NULL)
				{
					u16Ac3PID=PU8TOU16(pu8Temp+1)&0x1fff;
				}
				break;

			case 0x81:
				u16Ac3PID=PU8TOU16(pu8Temp+1)&0x1fff;
				break;

			case 0x08: // DSM-CC
			case 0x0B: // DSM-CC U-N
				SI_DBG((" DSM-CC"));
				if (DVB_ParserFindTag(pu8Temp+5, TAG_DBID, PU8TOU16(pu8Temp+3)&0x0fff)!=NULL)
				{
					SI_DBG((", DBID Des."));
				}
				break;

			default:
				break;
		}
		pu8Temp=DVB_ParserFindNextLoop(pu8Section, pu8Temp, EN_PMT);
	}

	if (DVB_SI_GetPerferAudioType()==MPG)
	{
#ifdef MULTI_AUDIO_SURPPORT

		if (u16FirstAudioPID!=0)
		{
			if (u161stPriorityAudioPID!=0)
			{
				pstSrvItemPtr->u16AudioPid=u16AudioPID;
			}
			else if (u162ndPriorityAudioPID!=0)
			{
				pstSrvItemPtr->u16AudioPid=u162ndPriorityAudioPID;
			}
			else
			{
				pstSrvItemPtr->u16AudioPid = u16FirstAudioPID;
			}
			pstSrvItemPtr->bitAc3Flag=0;

			for(u8tempi = 0;u8tempi<=u8AuIndex;u8tempi++ )
			{
				if(au16AudioPID[u8tempi] != 0)
				{
					pstSrvItemPtr->au16AudioPid[u8tempi]=au16AudioPID[u8tempi];
				}
			}
		}
		else if (u16Ac3PID!=0)
		{
			pstSrvItemPtr->u16AudioPid=u16Ac3PID;
			pstSrvItemPtr->bitAc3Flag=0x0001;
		}
#else
		/* consider first priority */
		if (u161stPriorityAudioPID != 0)
		{
			pstSrvItemPtr->u16AudioPid=u161stPriorityAudioPID;
			pstSrvItemPtr->bitAc3Flag = 0;
		}
		/* consider second priority */
		else if (u162ndPriorityAudioPID != 0)
		{
			pstSrvItemPtr->u16AudioPid = u162ndPriorityAudioPID;
			pstSrvItemPtr->bitAc3Flag = 0;
		}
		/* consider first audio */
		else if (u16FirstAudioPID != 0)
		{
			pstSrvItemPtr->u16AudioPid = u16FirstAudioPID;
			pstSrvItemPtr->bitAc3Flag = 0;
		}	
		else if (u16Ac3PID!=0)
		{
			pstSrvItemPtr->u16AudioPid = u16Ac3PID;
			pstSrvItemPtr->bitAc3Flag = 0x0001;
		}
#ifdef SUPPORT_SECOND_AUDIO_LANGUAGE
		if(b8MultiAudio == TRUE)
		{
		    if(b8UseSecondAudio == FALSE)
		        pstSrvItemPtr->u8Type=0x02;
			else
			    pstSrvItemPtr->u8Type=0x03;
		}
#endif//SUPPORT_SECOND_AUDIO_LANGUAGE

#endif
	}
	else
	{
		if (u16Ac3PID!=0)
		{
			pstSrvItemPtr->u16AudioPid=u16Ac3PID;

			pstSrvItemPtr->bitAc3Flag = 0x0001;
		}
		/* consider first priority */
		else if (u161stPriorityAudioPID !=0)
		{
			pstSrvItemPtr->u16AudioPid=u161stPriorityAudioPID;
			pstSrvItemPtr->bitAc3Flag = 0;
#ifdef SUPPORT_SECOND_AUDIO_LANGUAGE
			if(b8MultiAudio ==TRUE)
			{
			    if(b8UseSecondAudio == FALSE)
			        pstSrvItemPtr->u8Type=0x02;
				else
				    pstSrvItemPtr->u8Type=0x03;
			}
#endif//SUPPORT_SECOND_AUDIO_LANGUAGE
		}
		/* consider second priority */
		else if (u162ndPriorityAudioPID !=0)
		{
			pstSrvItemPtr->u16AudioPid=u162ndPriorityAudioPID;
			pstSrvItemPtr->bitAc3Flag = 0;
#ifdef SUPPORT_SECOND_AUDIO_LANGUAGE
			if(b8MultiAudio ==TRUE)
			{
			    if(b8UseSecondAudio == FALSE)
			        pstSrvItemPtr->u8Type=0x02;
				else
				    pstSrvItemPtr->u8Type=0x03;
			}
#endif//SUPPORT_SECOND_AUDIO_LANGUAGE
		}
		/* consider first audio */
		else if (u16FirstAudioPID != 0)
		{
			pstSrvItemPtr->u16AudioPid = u16FirstAudioPID;
			pstSrvItemPtr->bitAc3Flag =0 ;
#ifdef SUPPORT_SECOND_AUDIO_LANGUAGE
			if(b8MultiAudio ==TRUE)
			{
			    if(b8UseSecondAudio == FALSE)
			        pstSrvItemPtr->u8Type=0x02;
				else
				    pstSrvItemPtr->u8Type=0x03;
			}
#endif//SUPPORT_SECOND_AUDIO_LANGUAGE
		}
	}
	if (b8CAdescriptor==FALSE)
	{
#ifdef SUPPORT_SECOND_AUDIO_LANGUAGE
		if(b8MultiAudio == TRUE)
		{
			#ifdef CHECK_SCRAMBLE_BY_PMT
			pstSrvItemPtr->u8Type &= 0x03;
			#endif

			#ifdef CHECK_SCRAMBLE_BY_BOTH
   			pstSrvItemPtr->u8Type |= 0xFC;
			#endif
		}
		else
#endif//SUPPORT_SECOND_AUDIO_LANGUAGE
		{
#ifdef CHECK_SCRAMBLE_BY_PMT
			pstSrvItemPtr->u8Type = 0x00;
#endif

#ifdef CHECK_SCRAMBLE_BY_BOTH
			pstSrvItemPtr->u8Type = FREE_TYPE;
#endif
		}
		SI_DBG((", No CA"));
	}
	else
	{
#ifdef CHECK_SCRAMBLE_BY_PMT
	#ifdef CHECK_SCRAMBLE_BY_BOTH
	    if(b8MultiAudio == TRUE)
	    {
	        pstSrvItemPtr->u8Type |= 0x40;
	        pstSrvItemPtr->u8MultiAudio = TRUE;
	        printf("\n u8MultiAudio = TRUE, CA des\n");
		}
		else
	#endif
		{
		    pstSrvItemPtr->u8Type = 0x01<<6;
		}
#endif
		SI_DBG((", CA des"));
	}

	SI_DBG(("\n"));
}
/*******************************************************************************************/          

#ifdef ATSC_SYSTEM
void parser_tvct (u8* pu8Section)
{
	u8 u8num_channels_in_section = 0;
	u8 u8channel_idx = 0; // need to add the previous if there are more than 1 section */
	u8 *pu8channel_info = NULL;

⌨️ 快捷键说明

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