📄 filter.c
字号:
if ((Program & PROGRAM_DONT_CARE) == 0 )
{
PROGRAM_NUM_1(Filter_p->FilterMasks) = 0xff;
PROGRAM_NUM_1(Filter_p->FilterBytes) = (U8)((Program >> 8) & 0xff);
PROGRAM_NUM_2(Filter_p->FilterMasks) = 0xff;
PROGRAM_NUM_2(Filter_p->FilterBytes) = (U8)(Program & 0xff);
}
#if defined(FILTER_ON_CURRENT_NEXT)
/* set current/next indicator */
if ((Current & CURRENT_OR_NEXT_DONT_CARE) == 0 )
{
U8 value;
value = ((Version & CURRENT_NEXT_INDICATOR_MASK)
? CURRENT_TABLE
: NEXT_TABLE );
VERSION_NUM(Filter_p->FilterMasks) = CURRENT_OR_NEXT_INDICATOR_MASK;
VERSION_NUM(Filter_p->FilterBytes) = value;
}
#endif
/* set version number */
if ((Version & VERSION_DONT_CARE) == 0 )
{
VERSION_NUM(Filter_p->FilterMasks) |= (VERSION_NUMBER_MASK << 1);
VERSION_NUM(Filter_p->FilterBytes) |= (((U8)Version & VERSION_NUMBER_MASK) << 1);
}
/* set section number */
if ((Section & SECTION_DONT_CARE) == 0)
{
SECTION_NUM(Filter_p->FilterMasks) = SECTION_NUMBER_MASK;
SECTION_NUM(Filter_p->FilterBytes) = Section;
}
#if defined(DEBUG_MASKS)
STTBX_Print(("Masks %02x %02x %02x %02x %02x %02x %02x %02x\n",
Filter_p->FilterMasks[0], Filter_p->FilterMasks[1], Filter_p->FilterMasks[2], Filter_p->FilterMasks[3],
Filter_p->FilterMasks[4], Filter_p->FilterMasks[5], Filter_p->FilterMasks[6], Filter_p->FilterMasks[7]));
STTBX_Print(("Bytes %02x %02x %02x %02x %02x %02x %02x %02x\n",
Filter_p->FilterBytes[0], Filter_p->FilterBytes[1], Filter_p->FilterBytes[2], Filter_p->FilterBytes[3],
Filter_p->FilterBytes[4], Filter_p->FilterBytes[5], Filter_p->FilterBytes[6], Filter_p->FilterBytes[7]));
#endif
}
/*-------------------------------------------------------------------------
* Function : Testool FilterStart
* Input :
* Output :
* Return : None
* ----------------------------------------------------------------------*/
ST_ErrorCode_t EITDump(S32 Pgm)
{
ST_ErrorCode_t ErrCode=ST_NO_ERROR;
S32 Table, Pid;
Table = EIT_TABLE_ID;
Pid = EIT_PID;
if ( Pgm == 0 )
{
STTBX_Print(("Invalid Pgm number\n"));
return ST_ERROR_BAD_PARAMETER;
}
DVB_FilterCreate( &Filter[SECTION], Table, Pgm, VERSION_DONT_CARE, SECTION_DONT_CARE );
ErrCode = FilterStart( &Filter[SECTION], Pid, Table );
if ( ErrCode == ST_NO_ERROR )
DVB_BufferDecode( Filter[SECTION].Buffer, TRUE );
else
STTBX_Print(("Error in starting filter for EIT\n"));
return ErrCode;
}
ST_ErrorCode_t NITDump(S32 Pid)
{
ST_ErrorCode_t ErrCode=ST_NO_ERROR;
S32 Table;
S32 Section = 0;
Table = NIT_TABLE_ID;
do
{
DVB_FilterCreate( &Filter[SECTION], Table, PROGRAM_DONT_CARE, VERSION_DONT_CARE, Section );
ErrCode = FilterStart( &Filter[SECTION], Pid, Table );
if ( ErrCode == ST_NO_ERROR )
DVB_BufferDecode( Filter[SECTION].Buffer, TRUE );
else
{
STTBX_Print(("Error in starting filter for NIT\n"));
break;
}
} while ( Section++ < Filter[SECTION].Buffer[LASTSECT_IDX] );
return ErrCode;
}
/*-------------------------------------------------------------------------
* Function : PATDump
* Input :
* Output :
* Return : None
* ----------------------------------------------------------------------*/
ST_ErrorCode_t PATDump(void)
{
ST_ErrorCode_t ErrCode=ST_NO_ERROR;
S32 Table, Pid;
Table = PAT_TABLE_ID;
Pid = PAT_PID;
DVB_FilterCreate( &Filter[SECTION], Table, PROGRAM_DONT_CARE, VERSION_DONT_CARE, SECTION_DONT_CARE );
ErrCode = FilterStart( &Filter[SECTION], Pid, Table );
if ( ErrCode == ST_NO_ERROR )
DVB_BufferDecode( Filter[SECTION].Buffer, TRUE );
else
STTBX_Print(("Error in starting filter for PAT\n"));
return ErrCode;
}
/*-------------------------------------------------------------------------
* Function : PMTDump
* Input :
* Output :
* Return : None
* ----------------------------------------------------------------------*/
ST_ErrorCode_t PMTDump(S32 Pid , LISTS_Channel_t *Channel_p)
{
ST_ErrorCode_t ErrCode=ST_NO_ERROR;
S32 Table;
Table = PMT_TABLE_ID;
if ( Pid == 0 )
{
STTBX_Print(("Invalid PMT Pid\n"));
return ST_ERROR_BAD_PARAMETER;
}
DVB_FilterCreate( &Filter[SECTION], Table, PROGRAM_DONT_CARE, VERSION_DONT_CARE, SECTION_DONT_CARE );
ErrCode = FilterStart( &Filter[SECTION], Pid, Table );
if ( ErrCode == ST_NO_ERROR )
{
DVB_BufferDecode( Filter[SECTION].Buffer, TRUE );
DVB_GetPids( Filter[SECTION].Buffer, Channel_p);
}
else
{
STTBX_Print(("Error in starting filter for PMT\n"));
}
return ErrCode;
}
/*-------------------------------------------------------------------------
* Function : SDTDump
* Input :
* Output :
* Return : None
* ----------------------------------------------------------------------*/
ST_ErrorCode_t SDTDump(void)
{
ST_ErrorCode_t ErrCode=ST_NO_ERROR;
S32 Table, Pid;
S32 Section = 0;
Table = SDT_TABLE_ID;
Pid = SDT_PID;
do
{
DVB_FilterCreate( &Filter[SECTION], Table, PROGRAM_DONT_CARE, VERSION_DONT_CARE, Section );
ErrCode = FilterStart( &Filter[SECTION], Pid, Table );
if ( ErrCode == ST_NO_ERROR )
DVB_BufferDecode( Filter[SECTION].Buffer, TRUE );
else
{
STTBX_Print(("Error in starting filter for SDT\n"));
break;
}
} while ( Section++ < Filter[SECTION].Buffer[LASTSECT_IDX] );
return ErrCode;
}
/*-------------------------------------------------------------------------
* Function : ListChannels
* Display available channels in current stream
* Input :
* Output :
* Return :
* ----------------------------------------------------------------------*/
void ListChannels(void)
{
U16 i;
STTBX_Print(( "\n\n ***** Available channels in this stream: *****\n\n"));
STTBX_Print(("Chan# Channel Name VideoPid PcrPid AudioPid TtxPid \n"));
STTBX_Print(("----- ------------ -------- -------- -------- --------\n"));
for (i=1;i<=NumChannels;i++)
{
STTBX_Print(("%-5d %-13s 0x%-6x 0x%-6x 0x%-7x 0x%-6x\n", i,
ChannelInfo[i].ChannelName, ChannelInfo[i].VideoPid,
ChannelInfo[i].PcrPid, ChannelInfo[i].AudioPid,
ChannelInfo[i].TtxPid));
}
STTBX_Print(("\n\n"));
}
/*-------------------------------------------------------------------------
* Function : Filter_Run
* Dump tables & collect info like PIDs, audio type, etc
* Input : VID_BcastProfile
* Output :
* Return : Error code
* ----------------------------------------------------------------------*/
ST_ErrorCode_t Filter_Run(STVID_BroadcastProfile_t VID_BcastProfile)
{
ST_ErrorCode_t ST_ErrorCode;
U16 i,j;
LISTS_Channel_t TempPMTData;
/* initialize global variables that holds number of available channels in the current stream */
NumChannels = 0; /* valid AV channels with nonzero PMT pid */
NumPrograms = 0; /* all programs in PAT table */
/* clean global channel info list */
memset((U8*)ChannelInfo, 0, MAX_PAT_DATA_SIZE*sizeof(LISTS_Channel_t));
/* dump PAT */
ST_ErrorCode = PATDump();
if(ST_ErrorCode == ST_NO_ERROR)
{
for (i=1, j=1; i<=NumPrograms; i++)
{
memset((U8*)&TempPMTData, 0, sizeof(LISTS_Channel_t));
/* dump PMT for all valid programs, PMT PID 0 is not av AV program */
if (PAT_Data[i].PmtPid != 0)
{
/* get PMT data into TempPMTData */
ST_ErrorCode = PMTDump(PAT_Data[i].PmtPid , &TempPMTData);
/* fill global channel info with info in TempPMTData */
if ( (ST_ErrorCode == ST_NO_ERROR) /*&& (TempPMTData.VideoPid !=0)*/ )
{
ChannelInfo[j].PgmPid = PAT_Data[i].PgmPid;
ChannelInfo[j].VideoPid = TempPMTData.VideoPid;
ChannelInfo[j].PcrPid = TempPMTData.PcrPid;
ChannelInfo[j].AudioPid = TempPMTData.AudioPid;
ChannelInfo[j].TtxPid = TempPMTData.TtxPid;
ChannelInfo[j].AudioType = TempPMTData.AudioType;
j++;
NumChannels++;
}
}
}
if (VID_BcastProfile == STVID_BROADCAST_DVB)
{
/* dump SDT, valid only for DVB broadcast */
ST_ErrorCode = SDTDump();
}
}
/*Display avaliable channels*/
ListChannels();
return( ST_ErrorCode );
}
/* EOF --------------------------------------------------------------------- */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -