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(); }
/*============================================================================= 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(); }
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; }
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"); }
/*============================================================================= 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); } } }
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(); }
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; }