⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filter.c

📁 ST5100 driver files for ST chipset
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -