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

📄 dvb_si.c

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

	u8CurTotalSrv = DVB_ServiceGetTotal (EN_SERVICE_TYPE_RADIO);
	for (u8CheckLoop = 0; u8CheckLoop < u8CurTotalSrv; u8CheckLoop++)
	{
		DVB_ServiceReadDetail(EN_SERVICE_TYPE_RADIO, u8CheckLoop, &pstSrvItemInDB, &pstSrvRel);
		if (pstSrvItemInDB.bitLCNGet == TRUE)
		{
			if (pstSrvItemInDB.u16LCN > u16CurMaxLCN)
			{
				u16CurMaxLCN = pstSrvItemInDB.u16LCN;
			}
		}
	}

	u8CurTotalSrv = DVB_SI_GetTotalService();
	for (u8CheckLoop = 0; u8CheckLoop < u8CurTotalSrv; u8CheckLoop++)
	{
		for(pstLCNTmp = m_pstLCNList; pstLCNTmp; pstLCNTmp = pstLCNTmp->pNext)
		{
			if (pstLCNTmp->u16ServiceID == pstSrvItem[u8CheckLoop].u16ServiceId)
			{
				if ((pstLCNTmp->u16LCN & u16LCNMask) > u16CurMaxLCN)
				{
					u16CurMaxLCN = (pstLCNTmp->u16LCN & u16LCNMask);
				}
			}	
		}
	}
	u16CurMaxLCN ++;
	return u16CurMaxLCN;
}
#endif

/*******************************************************************************************/          
bool8 check_current_onid (EN_SERVICE_TYPE enServiceType)
{
	EN_SYS_COUNTRY_TYPE enCountry;
	
	enCountry = DVB_GetSystemCountry ();
	
	switch (enCountry)
	{
		case EN_SYS_COUNTRY_ANDORRA: 
			return DVB_CheckONIDinDB (enServiceType, ONID_ANDORRA_DTT);
		case EN_SYS_COUNTRY_AUSTRALIA: 
		{
			u16 u16OnidCount;
			
			if (DVB_CheckONIDinDB (enServiceType, ONID_AUSTRALIAN_DTT))
			{
				return TRUE;
			}
			for (u16OnidCount = ONID_AUSTRALIAN_MIN; u16OnidCount <= ONID_AUSTRALIAN_MAX; u16OnidCount++)
			{
				if (DVB_CheckONIDinDB (enServiceType, u16OnidCount))
				{
					return TRUE;
				}	
			}
			return FALSE;
		}
		case EN_SYS_COUNTRY_AUSTRIA: 
			return DVB_CheckONIDinDB (enServiceType, ONID_AUSTRIAN_DTT);
			
		case EN_SYS_COUNTRY_BELGIUM: 
			return DVB_CheckONIDinDB (enServiceType, ONID_BELGIAN_DTT);
			
		case EN_SYS_COUNTRY_TAIWAN: 
			return DVB_CheckONIDinDB (enServiceType, ONID_TAIWANESE_DTT);
			
		case EN_SYS_COUNTRY_CZECH: 
			return DVB_CheckONIDinDB (enServiceType, ONID_CZECH_DTT);
			
		case EN_SYS_COUNTRY_DENMARK: 
			return DVB_CheckONIDinDB (enServiceType, ONID_DANISH_DTT);
			
		case EN_SYS_COUNTRY_ESTONIA: 
			return DVB_CheckONIDinDB (enServiceType, ONID_ESTONIAN_DTT);
			
		case EN_SYS_COUNTRY_FINLAND: 
			return DVB_CheckONIDinDB (enServiceType, ONID_FINNISH_DTT);
			
		case EN_SYS_COUNTRY_FRANCE: 
			return DVB_CheckONIDinDB (enServiceType, ONID_FRENCH_DTT);
			
		case EN_SYS_COUNTRY_GERMANY: 
			return DVB_CheckONIDinDB (enServiceType, ONID_GERMAN_DTT);
		case EN_SYS_COUNTRY_IRISH: return DVB_CheckONIDinDB (enServiceType, ONID_IRISH_DTT);
		
		case EN_SYS_COUNTRY_ISRAEL: 
			return DVB_CheckONIDinDB (enServiceType, ONID_ISRAELI_DTT);
			
		case EN_SYS_COUNTRY_ITALY: 
			if (DVB_CheckONIDinDB (enServiceType, ONID_ITALIAN_DTT) == TRUE)
			{
				return TRUE;
			}
			else if (DVB_CheckONIDinDB (enServiceType, ONID_ITALIAN_MEDIASET_DTT) == TRUE)
			{
				return TRUE;
			}
			else if (DVB_CheckONIDinDB (enServiceType, ONID_ITALIAN_EUTELSAT_1) == TRUE)
			{
				return TRUE;
			}
			else if (DVB_CheckONIDinDB (enServiceType, ONID_ITALIAN_EUTELSAT_2) == TRUE)
			{
				return TRUE;
			}
			return FALSE;
			
		case EN_SYS_COUNTRY_HOLLAND: 
			return DVB_CheckONIDinDB (enServiceType, ONID_NETHERLANDS_DTT);
			
		case EN_SYS_COUNTRY_NORWAY: 
			return DVB_CheckONIDinDB (enServiceType, ONID_NORWEGIAN_DTT);
			
		case EN_SYS_COUNTRY_SINGAPORE: 
			return DVB_CheckONIDinDB (enServiceType, ONID_SINGAPORE_DTT);
			
		case EN_SYS_COUNTRY_SLOVENIA: 
			return DVB_CheckONIDinDB (enServiceType, ONID_SLOVENIA_DTT);
			
		case EN_SYS_COUNTRY_SPAIN: 
			return DVB_CheckONIDinDB (enServiceType, ONID_SPANISH_DTT);
			
		case EN_SYS_COUNTRY_SWEDEN: 
			return DVB_CheckONIDinDB (enServiceType, ONID_SWEDISH_DTT);
			
		case EN_SYS_COUNTRY_SWITZERLAND: 
			return DVB_CheckONIDinDB (enServiceType, ONID_SWISS_DTT);
			
		case EN_SYS_COUNTRY_ENGLAND: 
			return DVB_CheckONIDinDB (enServiceType, ONID_UK_DTT);
			
		case EN_SYS_COUNTRY_CHINA:
		case EN_SYS_COUNTRY_PORTUGAL:
		case EN_SYS_COUNTRY_AMERICA:
		case EN_SYS_COUNTRY_VIETNAM:
		case EN_SYS_COUNTRY_NUMBER:
		default:
			return FALSE;
	}
}
/*******************************************************************************************/          

bool8 si_region_control(u16 u16onid)
{
    #ifdef LCN_COUNTRY_CHECK_DISABLE
//    printf("si_region_control u16onid 0x%04x\n", u16onid);    
    return TRUE;
    #else
	EN_SYS_COUNTRY_TYPE enCountry;

	enCountry = DVB_GetSystemCountry ();

    SI_DBG(("si_region_control u16onid 0x%d\n", u16onid));

	switch (u16onid)
	{
		case ONID_ANDORRA_DTT: 
			if (enCountry == EN_SYS_COUNTRY_ANDORRA) 
			{
				return TRUE;
			}	
			break;
		case ONID_AUSTRALIAN_DTT:
			if (enCountry == EN_SYS_COUNTRY_AUSTRALIA) 
			{
				return TRUE;
			}	
			break;
		case ONID_AUSTRIAN_DTT:
			if (enCountry == EN_SYS_COUNTRY_AUSTRIA) 
			{
				return TRUE;
			}
			break;
		case ONID_BELGIAN_DTT:
			if (enCountry == EN_SYS_COUNTRY_BELGIUM) 
			{
				return TRUE;
			}
			break;
		case ONID_TAIWANESE_DTT:
			if (enCountry == EN_SYS_COUNTRY_TAIWAN) 
			{
				return TRUE;
			}
			break;
		case ONID_CZECH_DTT:
			if (enCountry == EN_SYS_COUNTRY_CZECH) 
			{
				return TRUE;
			}
			break;
		case ONID_DANISH_DTT:
			if (enCountry == EN_SYS_COUNTRY_DENMARK) 
			{
				return TRUE;
			}
			break;
		case ONID_ESTONIAN_DTT:
			if (enCountry == EN_SYS_COUNTRY_ESTONIA) 
			{
				return TRUE;
			}
			break;
		case ONID_FINNISH_DTT:
			if (enCountry == EN_SYS_COUNTRY_FINLAND) 
			{
				return TRUE;
			}
			break;
		case ONID_FRENCH_DTT:
			if (enCountry == EN_SYS_COUNTRY_FRANCE) 
			{
				return TRUE;
			}
			break;
		case ONID_GERMAN_DTT:
			if (enCountry == EN_SYS_COUNTRY_GERMANY) 
			{
				return TRUE;
			}
			break;
		case ONID_IRISH_DTT:
			if (enCountry == EN_SYS_COUNTRY_IRISH) 
			{
				return TRUE;
			}
			break;
		case ONID_ISRAELI_DTT:
			if (enCountry == EN_SYS_COUNTRY_ISRAEL) 
			{
				return TRUE;
			}
			break;
		case ONID_ITALIAN_DTT:
		case ONID_ITALIAN_MEDIASET_DTT:
		case ONID_ITALIAN_EUTELSAT_1:
		case ONID_ITALIAN_EUTELSAT_2:
			if (enCountry == EN_SYS_COUNTRY_ITALY) 
			{
				return TRUE;
			}
			break;
		case ONID_NETHERLANDS_DTT:
			if (enCountry == EN_SYS_COUNTRY_HOLLAND) 
			{
				return TRUE;
			}
			break;
		case ONID_NORWEGIAN_DTT:
			if (enCountry == EN_SYS_COUNTRY_NORWAY) 
			{
				return TRUE;
			}
			break;
		case ONID_SINGAPORE_DTT:
			if (enCountry == EN_SYS_COUNTRY_SINGAPORE) 
			{
				return TRUE;
			}
			break;
		case ONID_SLOVENIA_DTT:
			if (enCountry == EN_SYS_COUNTRY_SLOVENIA) 
			{
				return TRUE;
			}
			break;
		case ONID_SPANISH_DTT:
			if (enCountry == EN_SYS_COUNTRY_SPAIN) 
			{
				return TRUE;
			}
			break;
		case ONID_SWEDISH_DTT:
			if (enCountry == EN_SYS_COUNTRY_SWEDEN) 
			{
				return TRUE;
			}
			break;
		case ONID_SWISS_DTT:
			if (enCountry == EN_SYS_COUNTRY_SWITZERLAND) 
			{
				return TRUE;
			}				
			break;
		case ONID_UK_DTT:
			if (enCountry == EN_SYS_COUNTRY_ENGLAND) 
			{
				return TRUE;
			}	
			break;
		default:
			if ((u16onid >= ONID_AUSTRALIAN_MIN) && (u16onid <= ONID_AUSTRALIAN_MAX))
			{
				if (enCountry == EN_SYS_COUNTRY_AUSTRALIA) 
					return TRUE;
			}
			break;
	}
	return FALSE;
    #endif
}
/*******************************************************************************************/          

void parser_nit( u8* pu8Section )
{
	u8* pu8Descriptor;

	u16 u16TransStreamID, u16OrgNetworkID;
	u16 u16TotlaDescriptorLength;
	u8* pu8NITLoop;
	u16 u16Length=0, u16LcnLoop=0;
	ST_LCNItem	*pstLCNTmp = NULL;

	if (pu8Section==NULL)
	{
		return;
	}
	u16NetworkID=(u16)((((*(pu8Section+3))<<8)&0xFF00)|((*(pu8Section+4))&0x00FF));
	u8VersionNo=((PU8TOU16(pu8Section+5))>>1)&0x1F;

	// first loop

	pu8NITLoop=DVB_ParserFindFirstLoop(pu8Section, EN_NIT);

	// get each loop of transport atream id
	while (pu8NITLoop!=NULL)
	{
		u16TransStreamID=PU8TOU16(pu8NITLoop);

		u16OrgNetworkID=PU8TOU16(pu8NITLoop+2);

		u16TotlaDescriptorLength=PU8TOU16(pu8NITLoop+4)&0x0fff;
		
		if ((enLCN_Mode != LCN_NULL_MODE) && (enLCN_Mode != GERMANY_MAPPING_MODE))
		{
			pu8Descriptor = DVB_ParserFindTag( pu8NITLoop+6, TAG_LCD, u16TotlaDescriptorLength);
			while (pu8Descriptor!=NULL)
			{
				u16Length=pu8Descriptor [1]/4;

				for (u16LcnLoop=0; u16LcnLoop<u16Length; u16LcnLoop++)
				{
					gen_point = 210;
					pstLCNTmp = DVB_MemoryAllocate(sizeof(ST_LCNItem));
					if(pstLCNTmp == NULL)
					{
						SI_DBG(("\n\n LCN item is NULL!\n\n"));
						break;
					}
				
					pstLCNTmp->u16ServiceID = 
						((pu8Descriptor [2+4*u16LcnLoop]<<8)&0xFF00)|pu8Descriptor [3+4*u16LcnLoop];
					pstLCNTmp->u16LCN =
						((pu8Descriptor [4+4*u16LcnLoop]<<8)&0xFF00)|pu8Descriptor [5+4*u16LcnLoop];
				
					pstLCNTmp->pNext = m_pstLCNList;
					m_pstLCNList = pstLCNTmp;
				
					SI_DBG(("service_id=%d, LCN=%d, Mask=0x%04X)\n", pstLCNTmp->u16ServiceID, pstLCNTmp->u16LCN & u16LCNMask, u16LCNMask));
				}

				pu8Descriptor = DVB_ParserFindNextTag (pu8Descriptor, pu8NITLoop+6, TAG_LCD, u16TotlaDescriptorLength);
			}
		}

		pu8NITLoop=DVB_ParserFindNextLoop(pu8Section, pu8NITLoop, EN_NIT);
	}
}
#endif
/*******************************************************************************************/          

static void pmt_cb( u8 u8FID, EN_FILTER_STATUS enStatus )
{
	SI_DBG(("PMT : FID = %d, ", (int)u8FID));

	switch (enStatus)
	{
		case EN_FILTER_SECTION_AVAILABLE:

#ifdef PMT_BURST_MODIFY

			if (pu8Section==NULL)
			{
				break;
			}	
			memset(pu8Section, 0x00, SECTION_1K);
			if (DVB_FilterGetSection(u8FID, pu8Section, SECTION_1K)==FALSE)
			{
				SI_MSG(("get section error\n"));

				DVB_FilterStop(u8FID);
				DVB_FilterStart(u8FID, 5000, FALSE);
				break;
			}
			if (DVB_FilterCheckCRC32(pu8Section)==FALSE)
			{
				au8CrcErrorCounter [u8FID]++;

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

				{
					sec_flt_show_para(u8FID);

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

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

					au8FID2ItemIdx [u8FID]=0xff;
				}
				else
				{
					DVB_FilterStop(u8FID);

					DVB_FilterStart(u8FID, 5000, FALSE);
				}
			}
			else
			{
				if (au8CrcErrorCounter [u8FID]!=0)
				{
					dump_section(pu8Section);
				}

				au8CrcErrorCounter [u8FID]=0;
				pstSecHeader=(DVB_SectionHeader*)pu8Section;

				if (pstSecHeader->u8LastSectionNumber>0)
				{
					SI_MSG(("warning, more then one section in PMT!!\n"));
				}

				parser_pmt(u8FID, pu8Section);

				if (CheckPmtCloseFilter(u8FID)==TRUE)
				{
					parse_CloseFilter(u8FID);

					au8FID2ItemIdx [u8FID]=0xff;
				}
			}
			break;
#else

			if (DVB_FilterGetSection(u8FID, pu8Section, SECTION_1K)==FALSE)
			{
				break;
			}	
			if (DVB_FilterCheckCRC32(pu8Section)==FALSE)
			{
				au8CrcErrorCounter [u8FID]++;

				SI_MSG(("check CRC error\n"));
				break;
			}
			else
			{
				au8CrcErrorCounter [u8FID]=0;
			}
			pstSecHeader=(DVB_SectionHeader*)pu8Section;
			if (pstSecHeader->u8LastSectionNumber>0)
			{
				SI_MSG(("warning, more then one section in PMT!!\n"));
			}
			parser_pmt(u8FID, pu8Section);
			break;
#endif

		default:
		case EN_FILTER_TIMEOUT:
			SI_MSG(("PMT timeout : SID %04X \n", (int)(pstPATItem+au8FID2ItemIdx [u8FID])->u16ProgramNumber));

#ifdef PMT_BURST_MODIFY

			parse_CloseFilter(u8FID);
			au8FID2ItemIdx [u8FID]=0xff;
#endif

			break;
	}

#ifndef PMT_BURST_MODIFY

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

		au8FID2ItemIdx [u8FID] = 0xFF;
	}
	else
	{
		DVB_FilterStop(u8FID);

		DVB_FilterStart(u8FID, 5000, FALSE);
	}
#endif

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

#ifdef ATSC_SYSTEM
static void psip_tvct_cb ( u8 u8FID, EN_FILTER_STATUS enStatus )
{
	switch (enStatus)
	{
		case EN_FILTER_SECTION_AVAILABLE:

⌨️ 快捷键说明

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