📄 dvb_si.c
字号:
}
}
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 + -