コード例 #1
0
ファイル: SourceInfo.cpp プロジェクト: ACEZLY/EasyDarwin
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;
}
コード例 #2
0
ファイル: AviToBmp.cpp プロジェクト: fdiskcn/Whorld
float CAviToBmp::GetFrameRate() const
{
	AVISTREAMINFO si;
	return(GetStreamInfo(si) ? float(si.dwRate) / si.dwScale : 0);
}
コード例 #3
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();
  }
}
コード例 #4
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())
      {
    	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();
  }
}
コード例 #5
0
ファイル: main.cpp プロジェクト: JammyWei/ver30
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;
}