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