示例#1
0
 void  CA_SectionCallback(BU32 ChannelID, BU32 FilterID ,BU08 *u8Buffer, BU32 u32BufferLength)
{
	BS32 i, j;
	BU16 pid;
	BU32 reqid;
//	CAS_DMX_MUTEX_LOCK();
	DEBUG_DVTCA("CA_SectionCallback channelid = %d, filterid = %d\n", ChannelID, FilterID);
	BU08 sectionflag;



	for (i = 0; i < CA_REQID_NUM; i++)
	{
		if (CAReqID[i].u32ChannelID == ChannelID && CAReqID[i].u32FilterID == FilterID)
			break;
	}
	reqid = CAReqID[i].u16reqid;
	if (FYF_NULL == u8Buffer)
	{printf("CA_SectionCallback FYF_NULL\n");
		sectionflag = FYF_FALSE;
		u32BufferLength = 0;
	}
	else
		sectionflag = FYF_TRUE;
	if (i >= CA_REQID_NUM)
	{
		DEBUG_DVTCA("CA_SectionCallback error\n");
//		CAS_DMX_MUTEX_UNLOCK();
		return;
	}
	
//EMM数据 长度小于16,暂时不丢弃
	if ( i >= 2 && i < 10 &&u32BufferLength <= 16)
	{
//		CAS_DMX_MUTEX_UNLOCK();
//		return;
	}


	//DEBUG_DVTCA("\n +++ CA_SectionCallback i=%d datafilterid =%d\n", i, FilterID);
	pid = CAReqID[i].u16tspid;

	//ECM数据包,停止过滤,释放过滤器
	if (i < 2 || i >= 10)
	{
		CA_Stop_Demux(&(CAReqID[i].u32ChannelID), &(CAReqID[i].u32FilterID));
		CAReqID[i].u8runflag = 0;
		CAReqID[i].u16reqid = 0x1fff;
		CAReqID[i].u16tspid = 0x1fff;
		
	}
DEBUG_DVTCA("DVTCASTB_StreamGuardDataGot reqid = %d,pid=%x,sectionflag=%d,u32BufferLength=%d\n",reqid,pid,sectionflag,u32BufferLength);
	
	if(APP_CA_API_GetCardIn()==1)
		DVTCASTB_StreamGuardDataGot((BYTE)reqid, (bool)FYF_FALSE, (WORD)pid, (WORD)0, NULL);
	else	
	DVTCASTB_StreamGuardDataGot((BYTE)reqid, (bool)sectionflag, (WORD)pid, (WORD)u32BufferLength, (BYTE *)u8Buffer);
//	CAS_DMX_MUTEX_UNLOCK();

}
示例#2
0
/*=============================================================================
  
  Description:
 
  Paramenters:  @para 
 
  Return:           

==============================================================================*/
void cas_dmx_timeout_check()
{
	BU32 i;
	BU32 times;
	BU16 pid;
    BU32 reqid;
//	CAS_DMX_MUTEX_LOCK();
	for (i = 0; i < CA_REQID_NUM; i++)
	{
		if (CAReqID[i].u8runflag == 1 && CAReqID[i].u32waittime != 1000*1000)
		{
			times = FYF_API_time_ms();
			if (times - CAReqID[i].u32tick > CAReqID[i].u32waittime)
			{
			    pid = CAReqID[i].u16tspid;
				reqid = CAReqID[i].u16reqid;
				if (i < 2 || i >= 10)
				{
					printf("times = %d %d %d %d\n", i, times, CAReqID[i].u32tick, CAReqID[i].u32waittime);
					CA_Stop_Demux(&(CAReqID[i].u32ChannelID), &(CAReqID[i].u32FilterID));
					CAReqID[i].u8runflag = 0;
					
					CAReqID[i].u16reqid = 0x1fff;
					CAReqID[i].u16tspid = 0x1fff;
				}
				DVTCASTB_StreamGuardDataGot((BYTE)reqid, (bool)false, (WORD)pid, (WORD)0, NULL );

			}
		}
	}
//	CAS_DMX_MUTEX_UNLOCK();
}
示例#3
0
long EMM_data_got(WORD emm_pid, PBYTE ts_buf)
{
	if(ts_buf[0] != 0x47)
		return -1;

	//仅有调整字段
	if(0x20 == (ts_buf[3] & 0x30))
		return -1;

	//载荷前面有调整字段
	WORD wAdaptionLen = 0;
	if(0x30 == (ts_buf[3] & 0x30))
	{
		wAdaptionLen = ts_buf[4];
	}
	BYTE* pStart = (BYTE*)(&ts_buf[0] + wAdaptionLen + 5);
	int nEmmLen = 0;
	while(pStart < (BYTE*)&ts_buf[0] + 188)
	{
		nEmmLen = ((pStart[1] & 0x0f) << 8) | (pStart[2] & 0xFF);
		nEmmLen += 3;
		if(pStart + nEmmLen > (BYTE*)&ts_buf[0] + 188)
		{
			break;
		}
		DVTCASTB_StreamGuardDataGot(DVTCA_STB_EMM_TYPE, emm_pid, nEmmLen, pStart);
		pStart += nEmmLen;
	}
	return 0;
}
示例#4
0
void CDCASTB_PrivateDataGot( 
		CDCA_U8        byReqID,
		CDCA_BOOL      bTimeout,
		CDCA_U16       wPid,
		const CDCA_U8* pbyReceiveData,
		CDCA_U16       wLen )
{
	dxreport("DVTCASTB_StreamGuardDataGot begin >>>\n");
	bool bSuccess=true;
	if(wLen == 0) bSuccess = false;
	// dvt reqID 要变回原样
	DVTCASTB_StreamGuardDataGot(byReqID & 0x7F, bSuccess, wPid, wLen, pbyReceiveData);
	dxreport("DVTCASTB_StreamGuardDataGot end <<<\n");
}
示例#5
0
/*=============================================================================
  
  Description:
 
  Paramenters:  @para 
 
  Return:           

==============================================================================*/
void cas_demux_stopECMFilter()
{
	BU32 i = 0;
	BU16 pid;
    BU32 reqid;
	for (i = 10; i < CA_REQID_NUM; i++)
	{
		if (CAReqID[i].u8runflag && CAReqID[i].u16tspid != 0x10)
		{
				CA_Stop_Demux(&(CAReqID[i].u32ChannelID), &(CAReqID[i].u32FilterID));
				pid = CAReqID[i].u16tspid;
				reqid = CAReqID[i].u16reqid;
	
				CAReqID[i].u8runflag = 0;
				CAReqID[i].u16reqid = 0x1fff;
				CAReqID[i].u16tspid = 0x1fff;
				CAReqID[i].u8callbackflag = 0;
				CAReqID[i].u32tick = 0;
				CAReqID[i].u32waittime = 0;
			 	DVTCASTB_StreamGuardDataGot(CAReqID[i].u16reqid,false,CAReqID[i].u16tspid, 0,NULL);
		}
	}
}
示例#6
0
void cas_demux_stopEMMFilter()
{
	BU32 i = 0;
	BU32 channel_id = 0;
	BU16 pid;
    BU32 reqid;

	DVTCASTB_SetEmmPid(0);
	APP_IPI_Semaphore_Wait_Demux();
	for (i = 2; i < 10; i++)
	{
		if (CAReqID[i].u8runflag && CAReqID[i].u32ChannelID != 0 && CAReqID[i].u32FilterID != 0)
		{
				channel_id = CAReqID[i].u32ChannelID;
				pid = CAReqID[i].u16tspid;
				reqid = CAReqID[i].u16reqid;
				//CA_Stop_Demux(&(CAReqID[i].u32ChannelID), &(CAReqID[i].u32FilterID));
				FYF_API_demux_disable_filter(CAReqID[i].u32ChannelID, CAReqID[i].u32FilterID);
                FYF_API_demux_destroy_filter(CAReqID[i].u32ChannelID, CAReqID[i].u32FilterID);

				CAReqID[i].u8runflag = 0;
				CAReqID[i].u16reqid = 0x1fff;
				CAReqID[i].u16tspid = 0x1fff;
				CAReqID[i].u8callbackflag = 0;
				CAReqID[i].u32tick = 0;
				CAReqID[i].u32waittime = 0;
				DVTCASTB_StreamGuardDataGot(reqid,false,pid, 0,NULL); 
		}
	}
	if (channel_id != 0)
	{
		FYF_API_demux_stop_channel(channel_id);
		FYF_API_demux_destroy_channel(channel_id);
	}
	APP_IPI_Semaphore_Release_Demux();
}
示例#7
0
long ECM_data_got(WORD ecm_pid, PBYTE ts_buf)
{

	if(ts_buf[0] != 0x47)
		return -1;

	//仅有调整字段
	if(0x20 == (ts_buf[3] & 0x30))
		return -1;

	//载荷前面有调整字段
	WORD wAdaptionLen = 0;
	if(0x30 == (ts_buf[3] & 0x30))
	{
		wAdaptionLen = ts_buf[4];
	}
	BYTE* pStart = (BYTE*)(&ts_buf[0] + wAdaptionLen + 5);
	int nEcmLen = 0;
	while(pStart < (BYTE*)&ts_buf[0] + 188)
	{
		nEcmLen = ((pStart[1] & 0x0f)<<8) | (pStart[2] & 0xFF);
		nEcmLen += 3;
		if(pStart + nEcmLen > (BYTE*)&ts_buf[0] + 188)
		{
			break;
		}
		if(ecm_pid != g_wCurrentEcmPid)
		{
			DVTCASTB_SetCurEcmPid(ecm_pid);//解扰前要设置PID
			g_wCurrentEcmPid = ecm_pid;
		}
		DVTCASTB_StreamGuardDataGot(DVTCA_STB_ECM_TYPE, ecm_pid, nEcmLen, pStart);
		pStart += nEcmLen;
	}
	return 0;
}