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