Bool16 SourceInfo::Equal(SourceInfo* inInfo) { // Check to make sure the # of streams matches up if (this->GetNumStreams() != inInfo->GetNumStreams()) return false; // Check the src & dest addr, and port of each stream. for (UInt32 x = 0; x < this->GetNumStreams(); x++) { if (GetStreamInfo(x)->fDestIPAddr != inInfo->GetStreamInfo(x)->fDestIPAddr) return false; if (GetStreamInfo(x)->fSrcIPAddr != inInfo->GetStreamInfo(x)->fSrcIPAddr) return false; // If either one of the comparators is 0 (the "wildcard" port), then we know at this point // they are equivalent if ((GetStreamInfo(x)->fPort == 0) || (inInfo->GetStreamInfo(x)->fPort == 0)) return true; // Neither one is the wildcard port, so they must be the same if (GetStreamInfo(x)->fPort != inInfo->GetStreamInfo(x)->fPort) return false; } return true; }
float CAviToBmp::GetFrameRate() const { AVISTREAMINFO si; return(GetStreamInfo(si) ? float(si.dwRate) / si.dwScale : 0); }
void cLivePatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length) { if (Pid == 0x00 && Tid == 0x00) { SI::PAT pat(Data, false); if (!pat.CheckCRCAndParse()) return; SI::PAT::Association assoc; for (SI::Loop::Iterator it; pat.associationLoop.getNext(assoc, it); ) { if (!assoc.isNITPid()) { const cChannel *Channel = Channels.GetByServiceID(Source(), Transponder(), assoc.getServiceId()); if (Channel && (Channel == m_Channel)) { int prevPmtPid = m_pmtPid; if (0 != (m_pmtPid = assoc.getPid())) { m_pmtSid = assoc.getServiceId(); if (m_pmtPid != prevPmtPid) { Add(m_pmtPid, 0x02); m_pmtVersion = -1; } return; } } } } } else if (Pid == m_pmtPid && Tid == SI::TableIdPMT && Source() && Transponder()) { SI::PMT pmt(Data, false); if (!pmt.CheckCRCAndParse() || pmt.getServiceId() != m_pmtSid) return; if (m_pmtVersion != -1) { if (m_pmtVersion != pmt.getVersionNumber()) { cFilter::Del(m_pmtPid, 0x02); m_pmtPid = 0; // this triggers PAT scan } return; } m_pmtVersion = pmt.getVersionNumber(); // get cached channel data if(m_ChannelCache.size() == 0) m_ChannelCache = cChannelCache::GetFromCache(CreateChannelUID(m_Channel)); // get all streams and check if there are new (currently unknown) streams SI::PMT::Stream stream; cChannelCache cache; for (SI::Loop::Iterator it; pmt.streamLoop.getNext(stream, it); ) { struct StreamInfo info; if (GetStreamInfo(stream, info) && cache.size() < MAXRECEIVEPIDS) cache.AddStream(info); } // no new streams found -> exit if (cache == m_ChannelCache) return; m_Streamer->m_FilterMutex.Lock(); // create new stream demuxers cache.CreateDemuxers(m_Streamer); INFOLOG("Currently unknown new streams found, requesting stream change"); // write changed data back to the cache m_ChannelCache = cache; cChannelCache::AddToCache(CreateChannelUID(m_Channel), m_ChannelCache); m_Streamer->RequestStreamChange(); m_Streamer->m_FilterMutex.Unlock(); } }
void cLivePatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length) { if (Pid == 0x00 && Tid == 0x00) { SI::PAT pat(Data, false); if (!pat.CheckCRCAndParse()) return; SI::PAT::Association assoc; for (SI::Loop::Iterator it; pat.associationLoop.getNext(assoc, it); ) { if (!assoc.isNITPid()) { XVDRChannels.Lock(false); const cChannel *Channel = XVDRChannels.Get()->GetByServiceID(Source(), Transponder(), assoc.getServiceId()); if (Channel && (Channel == m_Channel)) { int prevPmtPid = m_pmtPid; if (0 != (m_pmtPid = assoc.getPid())) { m_pmtSid = assoc.getServiceId(); if (m_pmtPid != prevPmtPid) { Add(m_pmtPid, 0x02); m_pmtVersion = -1; } XVDRChannels.Unlock(); return; } } XVDRChannels.Unlock(); } } } else if (Pid == m_pmtPid && Tid == SI::TableIdPMT && Source() && Transponder()) { SI::PMT pmt(Data, false); if (!pmt.CheckCRCAndParse() || pmt.getServiceId() != m_pmtSid) return; if (m_pmtVersion != -1) { if (m_pmtVersion != pmt.getVersionNumber()) { cFilter::Del(m_pmtPid, 0x02); m_pmtPid = 0; // this triggers PAT scan } return; } m_pmtVersion = pmt.getVersionNumber(); // get cached channel data if(m_ChannelCache.size() == 0) m_ChannelCache = cChannelCache::GetFromCache(CreateChannelUID(m_Channel)); // get all streams and check if there are new (currently unknown) streams SI::PMT::Stream stream; cChannelCache cache; for (SI::Loop::Iterator it; pmt.streamLoop.getNext(stream, it); ) { cStreamInfo info; if (GetStreamInfo(stream, info) && cache.size() < MAXRECEIVEPIDS) { info.SetContent(); cache.AddStream(info); } } // no new streams found -> exit if (m_ChannelCache.ismetaof(cache)) return; m_Streamer->m_FilterMutex.Lock(); // create new stream demuxers m_Streamer->Detach(); cache.CreateDemuxers(m_Streamer); m_Streamer->m_ready = false; INFOLOG("Currently unknown new streams found, requesting stream change"); m_Streamer->RequestStreamChange(); // write changed data back to the cache m_ChannelCache = cache; cChannelCache::AddToCache(CreateChannelUID(m_Channel), m_ChannelCache); // try to attach receiver int c = 0; for(; c < 3 && !m_Streamer->Attach(); c++) { INFOLOG("Unable to attach receiver, retrying ..."); usleep(100 * 1000); } // unable to attach receiver if(c == 3) { ERRORLOG("failed to attach receiver, sending detach ..."); m_Streamer->sendDetach(); } m_Streamer->m_FilterMutex.Unlock(); } }
int main(int argc,char* argv[]) { int ret; GMI_RESULT gmiret; std::vector<SysPkgEncodeCfg*> cfgs; std::vector<SysPkgAudioEncodeCfg*> audiocfgs; std::auto_ptr<SysPkgEncodeCfg> pCfgs2(new SysPkgEncodeCfg); std::auto_ptr<SysPkgAudioEncodeCfg> pAudio2(new SysPkgAudioEncodeCfg); SysPkgAudioEncodeCfg *pAudios=pAudio2.get(); SysPkgEncodeCfg* pCfgs=pCfgs2.get(); unsigned int i; FD_HANDLE hd=NULL; int sdkport=-1; int localport=-1; if (argc < 2) { Usage(3,NULL); } if (argc >= 4) { localport = atoi(argv[3]); } else { localport = __GetBindPort(); } if (argc >= 5) { sdkport = atoi(argv[4]); } else { sdkport = __GetSdkPort(); } hd = GMI_RudpSocket(localport); if (hd ==NULL) { ret = -errno ? -errno : -1; ERROR_INFO("could not bind port %d\n",localport); goto out; } DEBUG_INFO("localport %d sdkport %d\n",localport ,sdkport); if (strcmp(argv[1],"--start") == 0) { if (argc < 3) { Usage(3,"%s need config file",argv[1]); } ret = GetStreamInfo(argv[2],cfgs); if (ret < 0) { ERROR_INFO("\n"); goto out; } ret = GetAudioInfo(argv[2],audiocfgs); if (ret < 0) { ERROR_INFO("\n"); goto out; } pCfgs2.reset(new SysPkgEncodeCfg[cfgs.size()]); pCfgs = pCfgs2.get(); pAudio2.reset(new SysPkgAudioEncodeCfg[audiocfgs.size()]); pAudios = pAudio2.get(); for (i=0; i<cfgs.size(); i++) { memcpy(&(pCfgs[i]),cfgs[i],sizeof(*pCfgs)); } for (i=0;i<audiocfgs.size();i++) { memcpy(&(pAudios[i]),audiocfgs[i],sizeof(*pAudios)); } gmiret = StartStreamTransfer(hd,sdkport,pCfgs,cfgs.size(),pAudios,audiocfgs.size(),10); if (gmiret != GMI_SUCCESS) { ret = -errno ? -errno : -1; ERROR_INFO("\n"); goto out; } fprintf(stdout,"start succ\n"); } else if (strcmp(argv[1],"--stop") == 0) { gmiret = StopStreamTransfer(hd,sdkport,10); if (gmiret != GMI_SUCCESS) { ret = -errno ? -errno : -1; goto out; } fprintf(stdout,"stop succ\n"); } else if (strcmp(argv[1],"--resume") == 0) { if (argc < 3) { Usage(3,"%s need config file",argv[1]); } ret = GetStreamInfo(argv[2],cfgs); if (ret < 0) { goto out; } ret = GetAudioInfo(argv[2],audiocfgs); if (ret < 0) { ERROR_INFO("\n"); goto out; } pCfgs2.reset(new SysPkgEncodeCfg[cfgs.size()]); pCfgs = pCfgs2.get(); pAudio2.reset(new SysPkgAudioEncodeCfg[audiocfgs.size()]); pAudios = pAudio2.get(); for (i=0; i<cfgs.size(); i++) { memcpy(&(pCfgs[i]),cfgs[i],sizeof(*pCfgs)); } for (i=0;i<audiocfgs.size();i++) { memcpy(&(pAudios[i]),audiocfgs[i],sizeof(*pAudios)); } gmiret = ResumeStreamTransfer(hd,sdkport,pCfgs,cfgs.size(),pAudios,audiocfgs.size(),10); if (gmiret != GMI_SUCCESS) { ret = -errno ? -errno : -1; goto out; } fprintf(stdout,"resume succ\n"); } else if (strcmp(argv[1],"--pause") == 0) { gmiret = PauseStreamTransfer(hd,sdkport,10); if (gmiret != GMI_SUCCESS) { ret = -errno ? -errno : -1; goto out; } fprintf(stdout,"pause succ\n"); } else if (strcmp(argv[1],"--query")==0) { int started; gmiret = QueryStreamTransfer(hd,sdkport,10,&started); if (gmiret != GMI_SUCCESS) { ret = -errno ? -errno : -1; goto out; } fprintf(stdout,"stream state %d\n",started); } else { Usage(3,NULL); } out: if (hd != NULL) { GMI_RudpSocketClose(hd); } hd = NULL; return ret; }