📄 dvbsect.c
字号:
U16 P_Info_Length;
U16 ES_Info_Length;
P_Info_Length = extract(&Buffer_p[10], LENGTH_MASK);
(void)GetDescriptorData( &Buffer_p[PMT_HEAD_SIZE], P_Info_Length, ECM_DESCRIPTOR );
DISPLAY(("---- PMT - Transport Id %5d ----\n", Header.StreamId));
DISPLAY((" %-20s Pid %5d ECM %04X\n",
"Pcr",
extract(&Buffer_p[ 8], PID_MASK),
Desc.Info.ECMPid ));
for ( i = PMT_HEAD_SIZE + P_Info_Length;
i < (Header.SectionLength - CRC_SIZE);
i += (PMT_DATA_SIZE + ES_Info_Length))
{
ES_Info_Length = extract(&Buffer_p[i+3], LENGTH_MASK);
(void)GetDescriptorData( &Buffer_p[i+PMT_DATA_SIZE], ES_Info_Length, 0 );
DISPLAY((" %-20s Pid %5d ECM %04X\n",
StreamTypeNameLookup(Buffer_p[i]),
extract(&Buffer_p[i+1], PID_MASK),
Desc.Info.ECMPid ));
}
}
break;
case NIT_TABLE_ID: /* Network Information Table */
{
U16 n_desc_length;
U16 t_loop_length;
U16 t_desc_length;
n_desc_length = extract(&Buffer_p[8], LENGTH_MASK);
t_desc_length = 0;
/* Get Network name from descriptor */
if ( Buffer_p[NIT_HEAD_SIZE] == NETWORK_NAME_DESCRIPTOR )
{
DISPLAY(("Name \'%-*.*s\'",
Buffer_p[NIT_HEAD_SIZE+1], Buffer_p[NIT_HEAD_SIZE+1],
&Buffer_p[NIT_HEAD_SIZE+2] ));
}
if ( Header.SectionNumber == 0 )
{
DISPLAY(("---- NIT - Id %5d ----\n", Header.StreamId ));
DISPLAY(("TS_Id freq (kHz) Poln FEC SRate\n"));
DISPLAY(("----- ---------- ----- --- -----\n"));
}
t_loop_length = extract(&Buffer_p[NIT_HEAD_SIZE+n_desc_length], LENGTH_MASK);
for ( i = NIT_HEAD_SIZE + n_desc_length + 2;
i < t_loop_length;
i += NIT_DATA_SIZE + t_desc_length )
{
U32 Frequency;
STTUNER_Polarization_t Polarization;
STTUNER_FECRate_t FECRates;
U16 SymbolRate;
DISPLAY(("%5d ", extract(&Buffer_p[i], PROG_MASK)));
Frequency = extractBCD( &Buffer_p[i+ 8] );
Frequency *= 100;
Frequency += extractBCD( &Buffer_p[i+ 9] );
Frequency *= 100;
Frequency += extractBCD( &Buffer_p[i+10] );
Frequency *= 100;
Frequency += extractBCD( &Buffer_p[i+11] );
Frequency *= 10;
DISPLAY(("%10d ", Frequency ));
switch ( ( Buffer_p[i+14] & 0x60 ) >> 5 )
{
case 0x0:
Polarization = STTUNER_PLR_HORIZONTAL;
break;
case 0x1:
Polarization = STTUNER_PLR_VERTICAL;
break;
default:
Polarization = STTUNER_PLR_ALL;
break;
}
#if 0 // EXT_SHARE
DISPLAY(("%-6.6s ", PolarityToStr( Polarization )));
#endif
/* convert DVB format to STTUNER format */
switch ( Buffer_p[i+18] & 0x0f )
{
case 0x1:
FECRates = STTUNER_FEC_1_2;
break;
case 0x2:
FECRates = STTUNER_FEC_2_3;
break;
case 0x3:
FECRates = STTUNER_FEC_3_4;
break;
case 0x4:
FECRates = STTUNER_FEC_5_6;
break;
case 0x5:
FECRates = STTUNER_FEC_6_7;
break;
default:
FECRates = STTUNER_FEC_ALL;
break;
}
#if 0 // EXT_SHARE
DISPLAY(("%s ", FecToStr(FECRates) ));
#endif
/* symbol rate in M/Symbols / 1000 */
SymbolRate = extractBCD( &Buffer_p[i+15] );
SymbolRate *= 100;
SymbolRate += extractBCD( &Buffer_p[i+16] );
SymbolRate *= 100;
DISPLAY(("%5d\n", SymbolRate ));
t_desc_length = extract(&Buffer_p[i+4], LENGTH_MASK);
}
}
break;
case SDT_TABLE_ID: /* Service Descriptor Table */
if ( Header.SectionNumber == 0 )
{
DISPLAY(("---- SDT - Transport Id %d ----\n", Header.StreamId ));
DISPLAY(("prog# status CA type Provider name service name\n"));
DISPLAY(("----- ------ ---- -------------- ------------------ --------------------\n"));
}
for ( i = SDT_HEAD_SIZE, j=1;
i < (Header.SectionLength - CRC_SIZE);
i += SDT_DATA_SIZE + DescLoopLength )
{
DISPLAY(("%5d ", extract(&Buffer_p[i], PROG_MASK)));
/* schedule_flag */
/* present_following_flag */
DISPLAY(("%-7.7s ", StatusTypeNames[LIMITED_TO_(5,((Buffer_p[i+3] & 0xE0 ) >> 5),0)] ));
DISPLAY(("%-4.4s ", ((Buffer_p[i+3] & 0x10 ) >> 4==0) ? "free":"lock"));
/*
** descriptor data
*/
DescLoopLength = extract(&Buffer_p[i+3], LENGTH_MASK);
(void)GetDescriptorData( &Buffer_p[i+SDT_DATA_SIZE],
DescLoopLength,
SERVICE_DESCRIPTOR );
if ( Desc.Tag == SERVICE_DESCRIPTOR )
{
DISPLAY(("%-15s ", ServiceTypeNames[LIMITED_TO_(11,Desc.Info.Service.Type,0)] ));
if ( Desc.Info.Service.ProviderLen > 0 )
{
DISPLAY(( "%-20.*s", Desc.Info.Service.ProviderLen,
Desc.Info.Service.ProviderName_p ));
}
else
DISPLAY(("%-20.20s", "Unknown"));
if ( Desc.Info.Service.ServiceLen > 0 )
{
DISPLAY(( "%-20.*s", Desc.Info.Service.ServiceLen,
Desc.Info.Service.ServiceName_p ));
for(k=0; k < ((MAX_NAME_LEN < Desc.Info.Service.ServiceLen) ? MAX_NAME_LEN : Desc.Info.Service.ServiceLen); k++)
{
ChannelInfo[j].ChannelName[k]=Desc.Info.Service.ServiceName_p[k];
}
ChannelInfo[j].ChannelName[k]='\0';
j++;
}
else
{
DISPLAY(("%-20.20s", "Unknown"));
}
}
DISPLAY(("\n"));
}
break;
case EIT_TABLE_ID: /* Event Information Table */
{
U16 Year, Month, Day;
DescLoopLength = 0;
if ( Header.SectionNumber == 0 )
{
DISPLAY(("---- EIT - Id %d ----\n", Header.StreamId ));
DISPLAY(("EvId Start Date/Time Duration Status CA\n"));
DISPLAY(("---- ------------------- -------- ------- ----\n"));
}
/*
STTBX_Print(("Transport %d, Network %d, SegLast %d, LastTable %d\n",
extract(&Buffer_p[8], PROG_MASK),
extract(&Buffer_p[10], PROG_MASK),
Buffer_p[12], Buffer_p[13] ));
*/
for ( i = EIT_HEAD_SIZE;
i < (Header.SectionLength - CRC_SIZE);
i += EIT_DATA_SIZE + DescLoopLength )
{
/*
** descriptor data
*/
MJD2YMD( extract(&Buffer_p[i+2],PROG_MASK), &Year, &Month, &Day );
DISPLAY(("%4x %04d/%02d/%02d %02x:%02x:%02x %02x:%02x:%02x %-7.7s %-4.4s\t",
extract(&Buffer_p[i], PROG_MASK),
Year+1900, Month, Day,
Buffer_p[i+4],Buffer_p[i+5],Buffer_p[i+6],
Buffer_p[i+7],Buffer_p[i+8],Buffer_p[i+9],
StatusTypeNames[LIMITED_TO_(5,((Buffer_p[i+10] & 0xE0 ) >> 5),0)],
((Buffer_p[i+10] & 0x10 ) >> 4==0) ? "free":"lock" ));
DescLoopLength = extract(&Buffer_p[i+10], LENGTH_MASK);
(void)GetDescriptorData( &Buffer_p[i+EIT_DATA_SIZE],
DescLoopLength, SHORT_EVENT_DESCRIPTOR );
DISPLAY(("%-*.*s\n", Desc.Info.ShortEvent.NameLen, Desc.Info.ShortEvent.NameLen, Desc.Info.ShortEvent.Name_p ));
DISPLAY(("%-*.*s\n", Desc.Info.ShortEvent.TextLen, Desc.Info.ShortEvent.TextLen, Desc.Info.ShortEvent.Text_p));
DISPLAY(("%d,%d,%d\n", Desc.Info.ShortEvent.NameLen, Desc.Info.ShortEvent.TextLen,
DescLoopLength ));
}
}
break;
default:
break;
}
}
/*-------------------------------------------------------------------------
* Function : DVB_GetPids
* Input :
* Output :
* Return : Error code
* ----------------------------------------------------------------------*/
void DVB_GetPids( U8 *Buffer_p, LISTS_Channel_t *Channel_p)
{
SECTION_Header_t Header;
U16 i;
DVB_HeaderExtract(Buffer_p, &Header);
if ( Header.TableId == PMT_TABLE_ID ) /* Program Map Table */
{
U16 P_Info_Length;
U16 ES_Info_Length;
P_Info_Length = extract(&Buffer_p[10], LENGTH_MASK);
(void)GetDescriptorData( &Buffer_p[PMT_HEAD_SIZE], P_Info_Length, ECM_DESCRIPTOR );
Channel_p->PcrPid = extract(&Buffer_p[ 8], PID_MASK);
for ( i = PMT_HEAD_SIZE + P_Info_Length;
i < (Header.SectionLength - CRC_SIZE);
i += (PMT_DATA_SIZE + ES_Info_Length))
{
ES_Info_Length = extract(&Buffer_p[i+3], LENGTH_MASK);
(void)GetDescriptorData( &Buffer_p[i+PMT_DATA_SIZE], ES_Info_Length, 0 );
switch ( (LISTS_StreamType_t)Buffer_p[i] )
{
case MP1V:
case MP2V:
if (Channel_p->VideoPid == 0) /* get first video PID */
{
Channel_p->VideoPid = extract(&Buffer_p[i+1], PID_MASK);
}
break;
case MP1A:
case MP2A:
case AC3:
case AAC:
if (Channel_p->AudioPid == 0) /* get first audio PID */
{
Channel_p->AudioType = (LISTS_StreamType_t)Buffer_p[i];
Channel_p->AudioPid = extract(&Buffer_p[i+1], PID_MASK);
}
break;
case PRIVATE_DATA:
if (Channel_p->TtxPid == 0) /* get first ttx PID */
{
Channel_p->TtxPid = extract(&Buffer_p[i+1], PID_MASK);
}
break;
default:
break;
}
}
}
}
/* EOF --------------------------------------------------------------------- */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -