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