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

📄 dvb_si.c

📁 DVB软件,基于CT216软件的开发源程序.
💻 C
📖 第 1 页 / 共 5 页
字号:
			if (DVB_FilterGetSection(u8FID, pu8Section, SECTION_1K)==FALSE)
				break;
			if (DVB_FilterCheckCRC32(pu8Section)==FALSE)
			{
				au8CrcErrorCounter [u8FID]++;

				SI_MSG(("TVCT check CRC error\n"));
				break;
			}
			else
			{
				au8CrcErrorCounter [u8FID] = 0;
			}
			SI_DBG(("############# got tvct \n"));			
			pstSecHeader=(DVB_SectionHeader*)pu8Section;
			SI_DBG(("TVCT section#: %d/%d\n", (int)pstSecHeader->u8SectionNumber,
					(int)pstSecHeader->u8LastSectionNumber));

			parser_tvct (pu8Section);
			
			if (u8FIDofFirstTVCT != INVALID_FILTER_ID)
			{
				u8PioneerSectionOfTVCT = pstSecHeader->u8SectionNumber;

				u8LastSectionOfTVCT = pstSecHeader->u8LastSectionNumber;
			}
			b8TVCTExist = TRUE;
			
			break;
		default:
		case EN_FILTER_TIMEOUT:
			SI_MSG(("SDT timeout\n"));
			break;
	}

	if (au8CrcErrorCounter [u8FID]>6||au8CrcErrorCounter [u8FID]==0)
	{
		parse_CloseFilter(u8FID);

		u8FIDofFirstTVCT = INVALID_FILTER_ID;
		
		deletetfilter (u8FID);
		
	}
	else
	{
		DVB_FilterStop (u8FID);

		DVB_FilterStart (u8FID, 10000, FALSE);
	}				
}	
#else
static void sdt_cb( u8 u8FID, EN_FILTER_STATUS enStatus )
{
	switch (enStatus)
	{
		case EN_FILTER_SECTION_AVAILABLE:
			if (DVB_FilterGetSection(u8FID, pu8Section, SECTION_1K)==FALSE)
				break;
			if (DVB_FilterCheckCRC32(pu8Section)==FALSE)
			{
				au8CrcErrorCounter [u8FID]++;

				SI_MSG(("SDT check CRC error\n"));

				{
					sec_flt_show_para(u8FID);

					sec_isr_show_int_count(u8FID);
					pid_flt_show_config(u8FID);
					dump_section(pu8Section);
				}

				break;
			}
			else
			{
				au8CrcErrorCounter [u8FID]=0;
			}
			pstSecHeader=(DVB_SectionHeader*)pu8Section;
			SI_DBG(("SDT section#: %d/%d\n", (int)pstSecHeader->u8SectionNumber,
					(int)pstSecHeader->u8LastSectionNumber));

			parser_sdt(pu8Section);
			if (u8FIDofFirstSDT!=INVALID_FILTER_ID)
			{
				u8PioneerSectionOfSDT=pstSecHeader->u8SectionNumber;

				u8LastSectionOfSDT=pstSecHeader->u8LastSectionNumber;
			}
			b8SDTExist = TRUE;
			break;

		default:
		case EN_FILTER_TIMEOUT:
			SI_MSG(("SDT timeout\n"));
			break;
	}

	if (au8CrcErrorCounter [u8FID]>6||au8CrcErrorCounter [u8FID]==0)
	{
		parse_CloseFilter(u8FID);

		u8FIDofFirstSDT = INVALID_FILTER_ID;

		deletetfilter (u8FID);		
	}
	else
	{
		DVB_FilterStop(u8FID);

		DVB_FilterStart(u8FID, 10000, FALSE);
	}
}
#endif /* end ATSC_SYSTEM */

#ifdef ENABLE_LCN_SUPPORT
static void nit_cb( u8 u8FID, EN_FILTER_STATUS enStatus )
{
	switch (enStatus)
	{
		case EN_FILTER_SECTION_AVAILABLE:
			if (pu8Section==NULL)
			{
				break;
			}

			if (DVB_FilterGetSection(u8FID, pu8Section, SECTION_1K)==FALSE)
			{
				au8CrcErrorCounter[u8FID]++;
				SI_DBG(( "NIT get section error\n"));
				break;
			}

			if (DVB_FilterCheckCRC32(pu8Section)==FALSE)
			{
				au8CrcErrorCounter [u8FID]++;

				SI_DBG(( "NIT check CRC error\n"));
				break;
			}
			else
			{
				au8CrcErrorCounter [u8FID]=0;
			}
			pstSecHeader=(DVB_SectionHeader *)pu8Section;
			DVB_Msg(MSG_4_AP, "NIT section#: %d/%d\n", (int)pstSecHeader->u8SectionNumber,
					(int)pstSecHeader->u8LastSectionNumber);

			parser_nit(pu8Section);
			if (u8FIDofFirstNIT!=INVALID_FILTER_ID)
			{
				u8PioneerSectionOfNIT=pstSecHeader->u8SectionNumber;

				u8LastSectionOfNIT=pstSecHeader->u8LastSectionNumber;
			}
			break;

		case EN_FILTER_TIMEOUT:
			SI_DBG(( "NIT timeout\n"));
			break;

		default:
			break;
	}

	if (au8CrcErrorCounter [u8FID]>6||au8CrcErrorCounter [u8FID]==0)
	{
		au8CrcErrorCounter [u8FID]=0;

		DVB_FilterClose(u8FID);
		u8FIDofFirstNIT=INVALID_FILTER_ID;
		u8OpenedFilter--;
	}
	else
	{
		DVB_FilterStop(u8FID);

		DVB_FilterStart(u8FID, 10000, FALSE);
	}
}
#endif
/*******************************************************************************************/          

void DVB_SI_Init( void ) 
{
//    CTOS_SEMAPHORE TDTSemaphore, TOTSemaphore;
//
//    if( CT_OS_CreateSemaphore(&TDTSemaphore, "TDT", 1, EN_CTOS_SUSPEND_FIFO)!=EN_CTOS_SUCCESS)
//    {
//        SI_DBG(( "no section filter available!!\n"));
//    }
//
//    if( CT_OS_CreateSemaphore(&TOTSemaphore, "TOT", 1, EN_CTOS_SUSPEND_FIFO)!=EN_CTOS_SUCCESS)
//    {
//        SI_DBG(( "no section filter available!!\n"));
//    }
}
/*******************************************************************************************/          

EN_PARSER_STATUS DVB_SI_ParserTP( bool8 b8AutoScanMode )
{
	EN_FILTER_STATUS enStatus;

	u8 u8ParserTPCount = 0;

#ifdef ATSC_SYSTEM
	u8 u8ParserSectionCount = 0;
#endif

#ifdef PMT_BURST_MODIFY

	u32 u32SubTableID;
#endif

#ifndef BUSY_WAIT

	ST_DVB_TimerWait stTimerWait;
#endif
	
	u16 u16TimeoutMilliSec;

#ifdef ATSC_SYSTEM
	u16 u16TVCTTimeoutMilliSec, u16NITTimeoutMilliSec;	
#else	
	u16 u16SDTTimeoutMilliSec, u16NITTimeoutMilliSec;
#endif	
	
	u8 u8FID;
	u16 u16Key;
	
	if (b8StartParserTP==TRUE)
		return EN_PARSER_ERROR;

	b8StartParserTP=TRUE;
#ifdef ATSC_SYSTEM
	b8TVCTExist = FALSE;
#else	
	b8SDTExist = FALSE;
#endif	
	if (DVB_FilterTotalUnusedFilter()==0)
	{
		SI_MSG(("no section filter available!!\n"));

		return EN_PARSER_ERROR;
	}

	if (pstPATItem)
	{
		DVB_MemoryFree (pstPATItem);
		pstPATItem = NULL;
	}	
	gen_point = 209;
	pstPATItem=(stPATItem*)DVB_MemoryAllocate(sizeof(stPATItem)*MAX_NUM_OF_SERVICE_ITEM);
	
	if (pstSrvItem)
	{
		DVB_MemoryFree (pstSrvItem);
		pstSrvItem = NULL;
	}
	gen_point = 208;
	pstSrvItem=(DB_SrvDetail*)DVB_MemoryAllocate(sizeof(DB_SrvDetail)*MAX_NUM_OF_SERVICE_ITEM);
	
	if (pu8Section)
	{
		DVB_MemoryFree (pu8Section);
		pu8Section = NULL;
	}
	gen_point = 207;
	pu8Section=(u8*)DVB_MemoryAllocate(SECTION_1K);

	if (pu8Section==NULL||pstPATItem==NULL||pstSrvItem==NULL)
	{
		SI_MSG(("dvb_si memory allocate fail!!\n"));

		DVB_SI_EndOfParserTP();
		return EN_PARSER_ERROR;
	}

	memset(& m_stNetItem, 0, sizeof(DB_NetDetail));

	/* reset original network id and transport stream id */
	u16OrgNID=0xffff;
	u16TPID=0xffff;
	// disable AV pid
	DVB_AudioSetPID(0);
	DVB_VideoSetPID(0);

	// reset DSP/RISC
	DVB_AudioVideoStop();

	// initial variable
	u8OpenedFilter=0;
	u8TOpenedFilter = 0;

	memset(pstSrvItem, 0x00, sizeof(DB_SrvDetail)*MAX_NUM_OF_SERVICE_ITEM);

	for (u8ParserTPCount=0; u8ParserTPCount<MAX_NUM_OF_SERVICE_ITEM; u8ParserTPCount++)
	{
#ifdef CHECK_SCRAMBLE_BY_BOTH
		(pstSrvItem+u8ParserTPCount)->u8Type=SCRAMBLE_TYPE;
#else
		(pstSrvItem+u8ParserTPCount)->u8Type=0x00;
#endif

#ifdef CHECK_SERVICE_TYPE_BY_TVCT
		(pstSrvItem+u8ParserTPCount)->u16TypeEX = 0x1000;
#endif

#ifdef CHECK_SERVICETYPE_BY_SDT
		(pstSrvItem+u8ParserTPCount)->u16TypeEX=0x1000;
#endif

	}

	memset(pstPATItem, 0x00, sizeof(stPATItem)*MAX_NUM_OF_SERVICE_ITEM);

	for (u8ParserTPCount=0; u8ParserTPCount<MAX_FILTER_NUMBER; u8ParserTPCount++)
	{
		au8FID2ItemIdx [u8ParserTPCount] = 0xFF;
		au8CrcErrorCounter [u8ParserTPCount]=0;
		au8TFiterID[u8ParserTPCount] = INVALID_FILTER_ID;
	}

	if (b8AutoScanMode==TRUE)
	{
		u16TimeoutMilliSec=5*1000;     // 5 sec.
	}
	else
	{
		u16TimeoutMilliSec=7*1000;     // 7 sec.
	}

#ifdef ATSC_SYSTEM
	u16TVCTTimeoutMilliSec = 10*1000;
#else
	u16SDTTimeoutMilliSec=10*1000;  // 10 sec.
	u16NITTimeoutMilliSec=17*1000;  // 17 sec.
#endif /* end if ATSC_SYSTEM */		

#ifdef ENABLE_LCN_SUPPORT
	// get NIT
	u8LastSectionOfNIT=0;
	u8PioneerSectionOfNIT=0;
	u8FIDofFirstNIT=INVALID_FILTER_ID;
	SI_DBG(( "monitor NIT...\n"));

	if (DVB_SectionMonitor(PID_NIT,               TABLEID_NISA, DONT_CARE_SUB_TABLE_ID, DONT_CARE_SECTION_NUM, nit_cb,
						   u16NITTimeoutMilliSec, & u8FID)==EN_FILTER_ERROR)
	{
		   SI_DBG(( "monitor NIT fail!!\n"));
	}
	else
	{
		u8FIDofFirstNIT=u8FID;

		u8OpenedFilter++;
	}
#endif

#ifdef PARALLEL_SDT

	// parallel table recieve
	// get first SDT

	SI_DBG(("monitor SDT...\n"));
	u8LastSectionOfSDT=0;
	u8PioneerSectionOfSDT=0;
	u8FIDofFirstSDT=INVALID_FILTER_ID;

	if (DVB_SectionMonitor(PID_SDT,               TABLEID_SDSA, DONT_CARE_SUB_TABLE_ID, DONT_CARE_SECTION_NUM, sdt_cb,
						   u16SDTTimeoutMilliSec, & u8FID)==EN_FILTER_ERROR)
	{
		SI_MSG(("monitor SDT fail!!\n"));
	}
	else
	{
		u8FIDofFirstSDT=u8FID;

		u8OpenedFilter++;
	}
#endif
	/* looking for transpoert stream id */
	SI_DBG(("getting PAT...\n"));
	enStatus=DVB_SectionGet(PID_PAT, TABLEID_PAS, DONT_CARE_SUB_TABLE_ID, 0x00, pu8Section, SECTION_1K,
							u16TimeoutMilliSec);

	u8NumOfPatItem=0;

	switch (enStatus)
	{
		case EN_FILTER_SECTION_AVAILABLE:
			pstSecHeader=(DVB_SectionHeader*)pu8Section;
			if (pstSecHeader->u8LastSectionNumber>0)
			{
				SI_MSG(("warning, more then one PAT section!!\n"));
			}	
			u8NumOfPatItem=(pstSecHeader->u16SectionLength-5-4)>>2;
			if (u8NumOfPatItem>MAX_NUM_OF_SERVICE_ITEM)
			{
				u8NumOfPatItem=MAX_NUM_OF_SERVICE_ITEM;

				SI_MSG(("warning, lost some service, since buffer size!!\n"));
			}
			parser_pat(pstPATItem, pu8Section);

			break;

		case EN_FILTER_USER_ABORT:
			DVB_SI_EndOfParserTP();
			return EN_PARSER_USER_ABORT;

#if 0
		case EN_FILTER_TIMEOUT:
			DVB_SI_EndOfParserTP();
			SI_MSG(("PAT timeout\n"));
			return EN_PARSER_TIMEOUT;

		case EN_FILTER_CRC_ERROR:
			SI_MSG(("PAT crc error\n"));
#else
		case EN_FILTER_TIMEOUT:
			SI_MSG(("PAT timeout\n"));
			DVB_SI_EndOfParserTP();
			return EN_PARSER_TIMEOUT;
		case EN_FILTER_CRC_ERROR:
		    SI_MSG(("PAT crc error\n"));
			DVB_SI_EndOfParserTP();
			return EN_PARSER_TIMEOUT;
#endif

		case EN_FILTER_ERROR:
		default:
			DVB_SI_EndOfParserTP();
			return EN_PARSER_ERROR;
	}

#ifdef ATSC_SYSTEM
	/* get ATSC table */
	u8LastSectionOfTVCT = 0;
	u8PioneerSectionOfTVCT = 0;
	u8FIDofFirstTVCT = INVALID_FILTER_ID;

	if (DVB_SectionMonitorPSIP (PID_PSIP_BASE, TABLEID_PSIP_TVCT, u16TPID, 
		DONT_CARE_SECTION_NUM, DONT_CARE_SOURCE_ID, (SECTION_1K * 4), 
		psip_tvct_cb, u16TVCTTimeoutMilliSec, &u8FID) 
		== EN_FILTER_ERROR)
	{
		SI_MSG(("monitor TVCT fail!!\n"));
	}
	else
	{
		u8FIDofFirstTVCT = u8FID;
		u8OpenedFilter++;
	}
	//
	//    while(u8FIDofFirstSDT!=INVALID_FILTER_ID)
	//    {
	//	#ifdef BUSY_WAIT
	//        dvb_filter_poll();
	//	#else
	//        DVB_TimerWait (&stTimerWait, 200);
	//	#endif
	//    }

	while (u8FIDofFirstTVCT != INVALID_FILTER_ID)
	{
		if (DVB_DetectKey()==TRUE)
		{
			u16Key=DVB_CheckKey();

			DVB_CleanKey();

			if (u16Key==KEY_EXIT || u16Key==EVENT_KEY_FORCE_EXIT)
			{
				DVB_SI_EndOfParserTP();

				return EN_PARSER_USER_ABORT;
			}
		}

#ifdef BUSY_WAIT
		dvb_filter_poll();
#else
		DVB_TimerWait(& stTimerWait, 200);
#endif
	}
	// get multiple TVCT
	for (u8ParserSectionCount=0; u8ParserSectionCount<=u8LastSectionOfTVCT; u8ParserSectionCount++)
	{
		if (u8ParserSectionCount == u8PioneerSectionOfTVCT)
		{
			/* already got it, so skip this one */
			continue;
		}	
		
		/* base on section number to get tvct one by one */
		while (DVB_SectionMonitorPSIP (PID_PSIP_BASE, TABLEID_PSIP_TVCT, u16TPID, 
			u8ParserSectionCount, DONT_CARE_SOURCE_ID, (SECTION_1K * 4), 
			psip_tvct_cb, u16TVCTTimeoutMilliSec, &u8FID) 
			== EN_FILTER_ERROR)
		{
			/* here means there is no available filter and still needs to wait */
			if (DVB_DetectKey() == TRUE)
			{
				u16Key = DVB_CheckKey();

				DVB_CleanKey();

				if (u16Key==KEY_EXIT || u16Key==EVENT_KEY_FORCE_EXIT)
				{
					DVB_SI_EndOfParserTP();

					return EN_PARSER_USER_ABORT;

⌨️ 快捷键说明

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