Exemplo n.º 1
0
//Debug
void
Packet::Print ()
{
  std::cout <<
      " ********** \n **Packet:"
	  "\n  ** ID " <<  GetID () <<
      " timeStamp " <<  GetTimeStamp () <<
      "\n  ** size: " << GetSize() <<
      "\n  ** sourcePort "  << GetSourcePort() <<
      " destinationPort " << GetDestinationPort() <<
      "\n  ** srcIP " << GetSourceID() <<
      " dstIP " << GetDestinationID() <<
      "\n  ** srcMAC " << GetSourceMAC() <<
      " dstMAC " << GetDestinationMAC() << std::endl;

  if (m_RLCHeader->IsAFragment())
	  std::cout << "  ** IsAFragment TRUE ";
  else
	  std::cout << "  ** IsAFragment FALSE ";

  if (m_RLCHeader->IsTheLatestFragment())
	  std::cout << " IsTheLatestFragment TRUE ";
  else
	  std::cout << " IsTheLatestFragment FALSE ";

      std::cout << "\n **********"  << std::endl;
}
Exemplo n.º 2
0
Packet*
Packet::Copy (void)
{
  Packet *p = new Packet ();
  p->m_id = m_id;
  p->m_timeStamp = m_timeStamp;

  if (m_UDPHeader != NULL)
    {
	  UDPHeader *udp = new UDPHeader (GetSourcePort(), GetDestinationPort());
	  p->AddUDPHeader(udp);
    }

  if (m_IPHeader != NULL)
    {
	  IPHeader *ip = new IPHeader (GetSourceID(), GetDestinationID());
	  p->AddIPHeader(ip);
    }

  if (m_PDCPHeader != NULL)
    {
	  PDCPHeader *pdcp = new PDCPHeader ();
	  p->AddPDCPHeader (pdcp);
    }

  if (m_RLCHeader != NULL)
    {
      RLCHeader *rlc = new RLCHeader ();

      if (GetRLCHeader ()->IsAFragment ())
    	  rlc->SetAFragment (true);
      if (!GetRLCHeader ()->IsTheLatestFragment ())
          rlc->SetTheLatestFragment (false);

      rlc->SetFragmentNumber (GetRLCHeader ()->GetFragmentNumber());
      rlc->SetRlcEntityIndex (GetRLCHeader ()->GetRlcEntityIndex ());

      rlc->SetRlcPduSequenceNumber (GetRLCHeader ()->GetRlcPduSequenceNumber());
      rlc->SetStartByte (GetRLCHeader ()->GetStartByte ());
      rlc->SetEndByte (GetRLCHeader ()->GetEndByte ());

      p->AddRLCHeader (rlc);
    }

  if (m_MACHeader != NULL)
    {
	  MACHeader *mac = new MACHeader (GetSourceMAC (), GetDestinationMAC ());
	  p->AddMACHeader(mac);
    }

  if (m_tags != NULL)
    {
	  PacketTAGs *tags = new PacketTAGs ();
	  tags->SetApplicationType(GetPacketTags()->GetApplicationType());
	  tags->SetFrameNumber (GetPacketTags ()->GetFrameNuber ());
	  tags->SetStartByte (GetPacketTags ()->GetStartByte ());
	  tags->SetEndByte (GetPacketTags ()->GetEndByte ());
	  tags->SetApplicationSize (GetPacketTags ()->GetApplicationSize ());
      p->SetPacketTags(tags);
    }

  p->m_size = m_size;

  return p;
}
Exemplo n.º 3
0
bool DTVChannel::SetChannelByString(const QString &channum)
{
    QString loc = LOC + QString("SetChannelByString(%1): ").arg(channum);
    LOG(VB_CHANNEL, LOG_INFO, loc);

    ClearDTVInfo();

    if (!IsOpen() && !Open())
    {
        LOG(VB_GENERAL, LOG_ERR, loc + "Channel object "
                "will not open, can not change channels.");

        return false;
    }

    if (!m_inputid)
        return false;

    uint mplexid_restriction;
    uint chanid_restriction;
    if (!IsInputAvailable(mplexid_restriction, chanid_restriction))
    {
        LOG(VB_GENERAL, LOG_INFO, loc +
            QString("Requested channel '%1' is on input '%2' "
                    "which is in a busy input group")
                .arg(channum).arg(m_inputid));

        return false;
    }

    // Fetch tuning data from the database.
    QString tvformat, modulation, freqtable, freqid, si_std;
    int finetune;
    uint64_t frequency;
    int mpeg_prog_num;
    uint atsc_major, atsc_minor, mplexid, chanid, tsid, netid;

    if (!ChannelUtil::GetChannelData(
        m_sourceid, chanid, channum,
        tvformat, modulation, freqtable, freqid,
        finetune, frequency,
        si_std, mpeg_prog_num, atsc_major, atsc_minor, tsid, netid,
        mplexid, m_commfree))
    {
        LOG(VB_GENERAL, LOG_ERR, loc + "Unable to find channel in database.");

        return false;
    }

    if ((mplexid_restriction && (mplexid != mplexid_restriction)) ||
        (!mplexid_restriction &&
         chanid_restriction && (chanid != chanid_restriction)))
    {
        LOG(VB_GENERAL, LOG_ERR, loc +
            QString("Requested channel '%1' is not available because "
                    "the tuner is currently in use on another transport.")
                .arg(channum));

        return false;
    }

    // If the frequency is zeroed out, don't use it directly.
    if (frequency == 0)
    {
        frequency = (freqid.toULongLong() + finetune) * 1000;
        mplexid = 0;
    }
    bool isFrequency = (frequency > 10000000);
    bool hasTuneToChan =
        !m_tuneToChannel.isEmpty() && m_tuneToChannel != "Undefined";

    // If we are tuning to a freqid, rather than an actual frequency,
    // we may need to set the frequency table to use.
    if (!isFrequency || hasTuneToChan)
        SetFreqTable(freqtable);

    // Set NTSC, PAL, ATSC, etc.
    SetFormat(tvformat);

    // If a tuneToChannel is set make sure we're still on it
    if (hasTuneToChan)
        Tune(m_tuneToChannel, 0);

    // Clear out any old PAT or PMT & save version info
    uint version = 0;
    if (genPAT)
    {
        version = (genPAT->Version()+1) & 0x1f;
        delete genPAT; genPAT = NULL;
        delete genPMT; genPMT = NULL;
    }

    bool ok = true;
    if (m_externalChanger.isEmpty())
    {
        if (IsIPTV())
        {
            int chanid = ChannelUtil::GetChanID(m_sourceid, channum);
            IPTVTuningData tuning = ChannelUtil::GetIPTVTuningData(chanid);
            if (!Tune(tuning, false))
            {
                LOG(VB_GENERAL, LOG_ERR, loc + "Tuning to IPTV URL");
                ClearDTVInfo();
                ok = false;
            }
        }
        else if (m_name.contains("composite", Qt::CaseInsensitive) ||
                 m_name.contains("component", Qt::CaseInsensitive) ||
                 m_name.contains("s-video", Qt::CaseInsensitive))
        {
            LOG(VB_GENERAL, LOG_WARNING, loc + "You have not set "
                    "an external channel changing"
                    "\n\t\t\tscript for a component|composite|s-video "
                    "input. Channel changing will do nothing.");
        }
        else if (isFrequency && Tune(frequency))
        {
        }
        else if (isFrequency)
        {
            // Initialize basic the tuning parameters
            DTVMultiplex tuning;
            if (!mplexid || !tuning.FillFromDB(tunerType, mplexid))
            {
                LOG(VB_GENERAL, LOG_ERR, loc +
                        "Failed to initialize multiplex options");
                ok = false;
            }
            else
            {
                // Try to fix any problems with the multiplex
                CheckOptions(tuning);

                // Tune to proper multiplex
                if (!Tune(tuning))
                {
                    LOG(VB_GENERAL, LOG_ERR, loc + "Tuning to frequency.");

                    ClearDTVInfo();
                    ok = false;
                }
            }
        }
        else
        {
            // ExternalChannel justs wants the channum
            ok = freqid.isEmpty() && finetune == 0 ?
                 Tune(channum) : Tune(freqid, finetune);
        }
    }

    LOG(VB_CHANNEL, LOG_INFO, loc + ((ok) ? "success" : "failure"));

    if (!ok)
        return false;

    if (atsc_minor || (mpeg_prog_num>=0))
    {
        SetSIStandard(si_std);
        SetDTVInfo(atsc_major, atsc_minor, netid, tsid, mpeg_prog_num);
    }
    else if (IsPIDTuningSupported())
    {
        // We need to pull the pid_cache since there are no tuning tables
        pid_cache_t pid_cache;
        int chanid = ChannelUtil::GetChanID(m_sourceid, channum);
        ChannelUtil::GetCachedPids(chanid, pid_cache);
        if (pid_cache.empty())
        {
            LOG(VB_GENERAL, LOG_ERR, loc + "PID cache is empty");
            return false;
        }

        // Now we construct the PAT & PMT
        vector<uint> pnum; pnum.push_back(1);
        vector<uint> pid;  pid.push_back(9999);
        genPAT = ProgramAssociationTable::Create(0,version,pnum,pid);

        int pcrpid = -1;
        vector<uint> pids;
        vector<uint> types;
        pid_cache_t::iterator pit = pid_cache.begin();
        for (; pit != pid_cache.end(); ++pit)
        {
            if (!pit->GetStreamID())
                continue;
            pids.push_back(pit->GetPID());
            types.push_back(pit->GetStreamID());
            if (pit->IsPCRPID())
                pcrpid = pit->GetPID();
            if ((pcrpid < 0) && StreamID::IsVideo(pit->GetStreamID()))
                pcrpid = pit->GetPID();
        }
        if (pcrpid < 0)
            pcrpid = pid_cache[0].GetPID();

        genPMT = ProgramMapTable::Create(
            pnum.back(), pid.back(), pcrpid, version, pids, types);

        SetSIStandard("mpeg");
        SetDTVInfo(0,0,0,0,-1);
    }

    // Set the current channum to the new channel's channum
    m_curchannelname = channum;

    // Setup filters & recording picture attributes for framegrabing recorders
    // now that the new curchannelname has been established.
    if (m_pParent)
        m_pParent->SetVideoFiltersForChannel(GetSourceID(), channum);
    InitPictureAttributes();

    HandleScript(freqid);

    return ok;
}