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

📄 dvb_filt.c

📁 DVB软件,基于CT216软件的开发源程序.
💻 C
📖 第 1 页 / 共 5 页
字号:
		FILT_DBG(( "Create Filter Task Fail\n"));
		return DRVERR_NOTOK;
	}

	status = CT_OS_CreateMsgQueue(&stDFQueue, "DFQ", &u32DFQueueMsg[0], QUEUE_SIZE_DF, EN_CTOS_SUSPEND_FIFO);
	if (EN_CTOS_SUCCESS != status)
	{
		FILT_DBG(( "Create Filter Queue Fail\n"));
		return DRVERR_NOTOK;
	}


	b8FilterInitialied = TRUE;		//<--- init ok

	status = CT_OS_CreateSemaphore (&DVBFilterSemaphore, "DVBFLT2", 1, EN_CTOS_SUSPEND_FIFO);
	if (status != EN_CTOS_SUCCESS)
	{
		FILT_DBG(( "CT_OS_CreateSemaphore Fail status[%d]\n", status));
		return (DRVERR_NOTOK);
	}

	status = CT_OS_CreateSemaphore (&DVBDPSemaphore, "DVBFLT3", 1, EN_CTOS_SUSPEND_FIFO);
	if (status != EN_CTOS_SUCCESS)
	{
		FILT_DBG(( "CT_OS_CreateSemaphore Fail status[%d]\n", status));
		return (DRVERR_NOTOK);
	}

	if (CT_OS_ResumeTask (&stDVBFilterTask) != EN_CTOS_SUCCESS)
	{
		return (DRVERR_NOTOK);
	}

	if (CT_OS_ResumeTask (&stDVBTimerTask) != EN_CTOS_SUCCESS)
	{
		return (DRVERR_NOTOK);
	}

	return (DRV_OK);
}

#if (defined(TONGFANG) || defined(DVNCA))
//typedef void (*tFuncVoidU8Status)(u8 , EN_FILTER_STATUS ) ;
//typedef unsigned char   BYTE;
static int  NewPatternTrans(DVB_SectionHeader *stMatch, DVB_SectionHeader *stMask , const unsigned char * pbyFilter, const unsigned char * pbyMask, char maskFilterLen) ;
static void new_dvb_filterset (u8 u8FID, u16 u16PID, DVB_SectionHeader* pstMask, DVB_SectionHeader* pstMatch,
	void (*sec_cb)(u8 u8FID, EN_FILTER_STATUS enStatus));

EN_FILTER_STATUS DVB_New_SectionMonitor (u16 u16PID,
										BYTE* pbyFilter, 
										BYTE* pbyMask,
										BYTE byLen, 
										tFuncVoidU8Status sec_cb, 
										u16 u16TimeoutMilliSec, 
										u8* pu8FID)
{
	DVB_SectionHeader stMatch, stMask;
	//BYTE  ayMask[8];
	u32 u32SecBufSize;
	//int i;
	
	/* check parameter */
	if (pu8FID == NULL || sec_cb == NULL)
	{
		FILT_DBG(("Error in %s , at %d\r\n" ,__FUNCTION__ , __LINE__));
		return(EN_FILTER_ERROR);
	}

	/* open a free filter */
	u32SecBufSize = DEF_SECTION_BUFFER_SIZE+1024;

	CT_OS_WaitOnSemaphore (&DVBFilterSemaphore, CTOS_WAIT);
	gen_point = 105;
	*pu8FID = dvb_filteropen (u32SecBufSize);
	if(*pu8FID == INVALID_FILTER_ID)
	{
		FILT_DBG(("Error in %s , at %d\r\n" ,__FUNCTION__ , __LINE__));
		CT_OS_FreeSemaphore (&DVBFilterSemaphore);
		return (EN_FILTER_ERROR);
	}

	astSectionFilter[*pu8FID].u16PID = u16PID;
	astSectionFilter[*pu8FID].u16TableID = *pbyFilter; 
	CT_OS_GetRunningTaskName (astSectionFilter[*pu8FID].u8TaskName, CTOS_MAX_NAME + 1);
	
	/* set filter mask and match */
	
	memset (&stMatch, 0xff, sizeof(DVB_SectionHeader));
	memset (&stMask,  0xff, sizeof(DVB_SectionHeader));	
//2006.8.21' code
	NewPatternTrans(&stMatch, &stMask , pbyFilter, pbyMask,byLen);
	
	#if 1
	new_dvb_filterset (*pu8FID, u16PID, &stMask, &stMatch, sec_cb);
#else
	dvb_filterset (*pu8FID, u16PID, &stMask, &stMatch, sec_cb);
#endif

	dvb_filtercleanbuffer (*pu8FID);
	dvb_filterstart (*pu8FID, u16TimeoutMilliSec, 0);

	CT_OS_FreeSemaphore (&DVBFilterSemaphore);
	
	return (EN_FILTER_NO_ERROR);
}


static int  NewPatternTrans(DVB_SectionHeader *stMatch, DVB_SectionHeader *stMask , const unsigned char * pbyFilter, const unsigned char * pbyMask, char maskFilterLen)
{
	unsigned char *pMatch , *pMask;
	int i;
	pMatch = (unsigned char *)(stMatch) ;
	pMask = (unsigned char *)(stMask) ;

	*(pMask) = ~(* (pbyMask));
	*(pMatch) = (* (pbyFilter)) | (*(pMask) );
	if (maskFilterLen <=12 )
	{
		for (i=3 ; i< maskFilterLen+2 ; i++)
		{
			*(pMask+i) = ~(* (pbyMask+i-2));
			*(pMatch+i) = (* (pbyFilter+i-2)) | (*(pMask+i) );
		}	
		return 0;
	}
	else
	{
		FILT_DBG(("Error mask len=%d>max=10\r\n"  , maskFilterLen));
		return 1;
	}
}


static void new_dvb_filterset (u8 u8FID, u16 u16PID, DVB_SectionHeader* pstMask, DVB_SectionHeader* pstMatch,
	void (*sec_cb)(u8 u8FID, EN_FILTER_STATUS enStatus))
{
	u8 pu8MatchByte[12]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
	u8 pu8MaskByte [12]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};

	/* check parameter and status */
	if ((u8FID >= MAX_FILTER_NUMBER)
		|| (astSectionFilter[u8FID].b8Allocated == FALSE)
		|| (astSectionFilter[u8FID].b8Running == TRUE)
 		|| (u16PID > 8192))
	{
		FILT_DBG(( "{dvb_filterset} FAIL u8FID[0x%x] Allocated[%d] Running[%d] u16PID[%d]\n",
			u8FID, astSectionFilter[u8FID].b8Allocated, astSectionFilter[u8FID].b8Running, u16PID));
		return;
	}

#if (defined (CT216U)||defined (CT956))
	/* set filter PID*/
	CT_FILT_SetFilterPID (astSectionFilter[u8FID].u32SecFltNo, u16PID);
#endif

	/* set call back function */
	astSectionFilter[u8FID].pfCallBack = sec_cb;
	/* set PID Filter PID value */
	CT_PF_SetPid (astSectionFilter[u8FID].u32PidFltNo, u16PID);
	/* reset PID Filter DataPath */
	CT_PF_SelectDataPath (astSectionFilter[u8FID].u32PidFltNo, DEMUX_DATAPATH_NON);
	/* set PID Filter DataPath */
	//CT_PF_SelectDataPath (astSectionFilter[u8FID].u32PidFltNo, DEMUX_DATAPATH_0);
	#ifdef CT_INSTANT_DELAY
	CT_PF_SelectDataPath (astSectionFilter[u8FID].u32PidFltNo, DEMUX_DATAPATH_2);
	#else
	CT_PF_SelectDataPath (astSectionFilter[u8FID].u32PidFltNo, DVB_Filter_GetCtDemuxDpByDvbNimDp(DVB_Filter_GetLiveTsNimDp()));
	#endif
    /* set pattern */
	
	memcpy(pu8MaskByte, (u8 *)(pstMask) , sizeof(u8)*10);
	memcpy(pu8MatchByte, (u8 *)(pstMatch) , sizeof(u8)*10);
	
	CT_FILT_SetPattern (astSectionFilter[u8FID].u32SecFltNo, pu8MatchByte, pu8MaskByte, FALSE);
}

#endif



/*! \fn EN_FILTER_STATUS DVB_SectionMonitor (u16 u16PID, u16 u16TableID, u32 u32SubTableID, u16 u16SectionNum, void (code *sec_cb)(u8 u8FID, EN_FILTER_STATUS enStatus), u16 u16TimeoutMilliSec, u8* pu8FID )
\brief Asynchronous function, get a specific section by callback function, user should close the filter ID in callback.
\param u16PID (Input) PID for this section.
\param u16TableID (Input) table ID for this section.
\param u32SubTableID (Input) sub-table ID fot this section.
\param u16SectionNum (Input) section number for this section.
\param sec_cb (Input) a callback function to process timeout or section available.
\param u16TimeoutMilliSec (Input) timeout in milli-second, or using TIMEOUT_INFINITE.
\param pu8FID (Output) return used filter id.
\return EN_FILTER_STATUS reference define.
*/
EN_FILTER_STATUS DVB_SectionMonitor (u16 u16PID, u16 u16TableID, u32 u32SubTableID, u16 u16SectionNum,
	void (*sec_cb)(u8 u8FID, EN_FILTER_STATUS enStatus), u16 u16TimeoutMilliSec, u8* pu8FID )
{
	DVB_SectionHeader stMatch, stMask;
	u32 u32SecBufSize;

	/* check parameter */
	if (pu8FID == NULL || sec_cb == NULL)
	{
		FILT_DBG( ("DVB_SectionMonitor retrn FAIL because check parameter \n"));
		return(EN_FILTER_ERROR);
	}

	/* open a free filter */
	if (u16PID == PID_EIT)
	{
		/* EIT will need bigger buffer */
		u32SecBufSize = DEF_EIT_SECTION_BUFFER_SIZE;
	}
	else
	{
		u32SecBufSize = DEF_SECTION_BUFFER_SIZE;
	}

    CT_OS_WaitOnSemaphore (&DVBFilterSemaphore, CTOS_WAIT);
	gen_point = 104;
	*pu8FID = dvb_filteropen (u32SecBufSize);
	if(*pu8FID == INVALID_FILTER_ID)
	{
		FILT_DBG( ("DVB_SectionMonitor retrn FAIL because error filter \n"));
        CT_OS_FreeSemaphore (&DVBFilterSemaphore);
		return (EN_FILTER_ERROR);
	}

	astSectionFilter[*pu8FID].u16PID = u16PID;
	astSectionFilter[*pu8FID].u16TableID = u16TableID;
	CT_OS_GetRunningTaskName (astSectionFilter[*pu8FID].u8TaskName, CTOS_MAX_NAME + 1);

	/* set filter mask and match */
	memset (&stMatch, 0xff, sizeof(DVB_SectionHeader));
	memset (&stMask,  0xff, sizeof(DVB_SectionHeader));	//<--- MaskBit = 1 means don't care

	if (u16TableID != DONT_CARE_TABLE_ID)			//1.table id pattern
	{
		stMatch.u8TableID = u16TableID;
		stMask.u8TableID = 0x00;
	}
	if(u32SubTableID != DONT_CARE_SUB_TABLE_ID)		//2.sub table id pattern
	{
		stMatch.u16SubTableID=u32SubTableID;
    	stMask.u16SubTableID=0x0000;
	}
	if(u16SectionNum!=DONT_CARE_SECTION_NUM)		//3.section number pattern
	{
		stMatch.u8SectionNumber=u16SectionNum;
		stMask.u8SectionNumber=0x00;
	}
	dvb_filterset (*pu8FID, u16PID, &stMask, &stMatch, sec_cb);
	/* reset fifo of the filter */
	dvb_filtercleanbuffer (*pu8FID);
	/* start the filter */
	dvb_filterstart (*pu8FID, u16TimeoutMilliSec, FALSE);
//	FILT_DBG(( "{DVB_SectionMonitor} u16PID[0x%x] TableID[0x%x], SubTableID[0x%x] *pu8FID[0x%x]\n",
//		u16PID, u16TableID, u32SubTableID, *pu8FID));

//FILT_DBG( ("{DVB_SecMonitor} u16PID[0x%x] TableID[0x%x] SubTableID[0x%x] *pu8FID[0x%x]\n",
//		u16PID, u16TableID, u32SubTableID, *pu8FID));
    CT_OS_FreeSemaphore (&DVBFilterSemaphore);
	return (EN_FILTER_NO_ERROR);
}

/*! \fn EN_FILTER_STATUS DVB_SectionMonitorEIT (u16 u16PID, u16 u16TableID, u32 u32SubTableID, u16 u16SectionNum, void (code *sec_cb)(u8 u8FID, EN_FILTER_STATUS enStatus), u16 u16TimeoutMilliSec, u8* pu8FID )
\brief Asynchronous function, get a specific section by callback function, user should close the filter ID in callback.
\param u16PID (Input) PID for this section.
\param u16TableID (Input) table ID for this section.
\param u32SubTableID (Input) sub-table ID fot this section.
\param u16SectionNum (Input) section number for this section.
\param u16TransportStreamId (Input) transport stream ID fot this section.
\param u16OriginalNetworkId (Input) original network ID fot this section.
\param sec_cb (Input) a callback function to process timeout or section available.
\param u16TimeoutMilliSec (Input) timeout in milli-second, or using TIMEOUT_INFINITE.
\param pu8FID (Output) return used filter id.
\return EN_FILTER_STATUS reference define.
*/
EN_FILTER_STATUS DVB_SectionMonitorEIT (u16 u16PID, u16 u16TableID, u32 u32SubTableID, u16 u16SectionNum,
	u16 u16TransportStreamId, u16 u16OriginalNetworkId,
	void (*sec_cb)(u8 u8FID, EN_FILTER_STATUS enStatus), u16 u16TimeoutMilliSec, u8* pu8FID )
{
	DVB_SectionHeader stMatch, stMask;
	u32 u32SecBufSize;

	/* check parameter */
	if (pu8FID == NULL || sec_cb == NULL)
	{
		return(EN_FILTER_ERROR);
	}

	/* open a free filter */
	if (u16PID == PID_EIT)
	{
		/* EIT will need bigger buffer */
		u32SecBufSize = DEF_EIT_SECTION_BUFFER_SIZE;
	}
	else
	{
		u32SecBufSize = DEF_SECTION_BUFFER_SIZE;
	}
CT_OS_WaitOnSemaphore (&DVBFilterSemaphore, CTOS_WAIT);
	gen_point = 103;
	*pu8FID = dvb_filteropen (u32SecBufSize);
	if(*pu8FID == INVALID_FILTER_ID)
	{
		FILT_DBG( ("DVB_SectionMonitor retrn FAIL because error filter \n"));
CT_OS_FreeSemaphore (&DVBFilterSemaphore);
		return (EN_FILTER_ERROR);
	}


	astSectionFilter[*pu8FID].u16PID = u16PID;
	astSectionFilter[*pu8FID].u16TableID = u16TableID;
	CT_OS_GetRunningTaskName (astSectionFilter[*pu8FID].u8TaskName, CTOS_MAX_NAME + 1);

	/* set filter mask and match */
	memset (&stMatch, 0xff, sizeof(DVB_SectionHeader));
	memset (&stMask,  0xff, sizeof(DVB_SectionHeader));	//<--- MaskBit = 1 means don't care

	if (u16TableID != DONT_CARE_TABLE_ID)			//1.table id pattern
	{
		stMatch.u8TableID = u16TableID;
		stMask.u8TableID = 0x00;
	}
	if(u32SubTableID != DONT_CARE_SUB_TABLE_ID)		//2.sub table id pattern
	{
		stMatch.u16SubTableID=u32SubTableID;
    	stMask.u16SubTableID=0x0000;
	}
	if(u16SectionNum!=DONT_CARE_SECTION_NUM)		//3.section number pattern
	{
		stMatch.u8SectionNumber=u16SectionNum;
		stMask.u8SectionNumber=0x00;
	}

	if (u16TransportStreamId != DONT_CARE_TP_ID)
	{
		stMatch.au8ExtendIDs[0]= ((u16TransportStreamId >>8)& 0xff);
		stMask.au8ExtendIDs[0]=0x00;
		stMatch.au8ExtendIDs[1]= ((u16TransportStreamId >>0)& 0xff);
		stMask.au8ExtendIDs[1]=0x00;
	}

	if (u16OriginalNetworkId != DONT_CARE_ORG_NETWORK_ID)
	{
		stMatch.au8ExtendIDs[2]= ((u16OriginalNetworkId >>8)& 0xff);
		stMask.au8ExtendIDs[2]=0x00;
		stMatch.au8ExtendIDs[3]= ((u16OriginalNetworkId >>0)& 0xff);
		stMask.au8ExtendIDs[3]=0x00;
	}

	dvb_filterset (*pu8FID, u16PID, &stMask, &stMatch, sec_cb);

	/* reset fifo of the filter */
	dvb_filtercleanbuffer (*pu8FID);

	/* start the filter */
	dvb_filterstart (*pu8FID, u16TimeoutMilliSec, FALSE);

//	FILT_DBG(( "{DVB_SectionMonitorEIT} u16PID[0x%x] TableID[0x%x], SubTableID[0x%x] *pu8FID[0x%x]\n",
//		u16PID, u16TableID, u32SubTableID, *pu8FID));

	CT_OS_FreeSemaphore (&DVBFilterSemaphore);

	return (EN_FILTER_NO_ERROR);
}

#ifdef ATSC_SYSTEM
EN_FILTER_STATUS DVB_SectionMonitorPSIP (u16 u16PID, u16 u16TableID, u32 u32TableIDExtension,
	u16 u16SectionNum, u16 u16SourceID, u32 u32SecBufSize,
	void (*sec_cb)(u8 u8FID, EN_FILTER_STATUS enStatus), u16 u16TimeoutMilliSec, u8* pu8FID )
{
	DVB_SectionHeader stMatch, stMask;
//	u32 u32SecBufSize;

	/* check parameter */
	if (pu8FID == NULL || sec_cb == NULL)
	{
		FILT_DBG( ("DVB_SectionMonitor retrn FAIL because check parameter \n"));
		return(EN_FILTER_ERROR);
	}

//	u32SecBufSize = DEF_SECTION_BUFFER_SIZE;

    CT_OS_WaitOnSemaphore (&DVBFilterSemaphore, CTOS_WAIT);
	gen_point = 104;
	*pu8FID = dvb_filteropen (u32SecBufSize);
	if(*pu8FID == INVALID_FILTER_ID)
	{
		FILT_DBG( ("DVB_SectionMonitorPSIP retrn FAIL because error filter \n"));
        CT_OS_FreeSemaphore (&DVBFilterSemaphore);
		return (EN_FILTER_ERROR);
	}

	astSectionFilter[*pu8FID].u16PID = u16PID;
	astSectionFilter[*pu8FID].u16TableID = u16TableID;
	CT_OS_GetRunningTaskName (astSectionFilter[*pu8FID].u8TaskName, CTOS_MAX_NAME + 1);

	/* set filter mask and match */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -