/**
 * @details
 * Constructs the LOFAR UDP emulator.
 */
LofarUdpEmulator::LofarUdpEmulator(const ConfigNode& configNode)
: AbstractUdpEmulator(configNode)
{
    // Load data (packet) parameters from the configuration.
    _subbandsPerPacket = configNode.getOption("packet", "subbands", "1").toInt();
    _samplesPerPacket = configNode.getOption("packet", "samples", "1").toInt();
    _nrPolarisations = configNode.getOption("packet", "polarisations", "2").toInt();
    _clock = configNode.getOption("params", "clock").toInt();
    int sampleSize = configNode.getOption("packet", "sampleSize", "8").toInt();

    // Load Emulator parameters. (Interval = microseconds between sending packets)
    _interval = configNode.getOption("packet", "interval", "100000").toULong();
    _startDelay = configNode.getOption("packet", "startDelay", "0").toInt();
    _nPackets = configNode.getOption("packet", "nPackets", "-1").toInt();

    // Setup emulator class variables.
    switch (sampleSize)
    {
        case 8: { _sampleType = i8complex;  break; }
        case 16:{ _sampleType = i16complex; break; }
        default: throw QString("LofarUdpEmulator: Unsupported sample size.");
    }
    _blockid = _samplesPerPacket; // blockid offset
    _timestamp = 1;
    _packetCounter = 0;
    _packetSize = sizeof(UDPPacket);

    // Fill the packet.
    setPacketHeader(0);
    fillPacket();
}
예제 #2
0
SMSSendRequestPacket::SMSSendRequestPacket()
      : RequestPacket( SMSPACKETLENGTH,
                       SMS_REQ_PRIO,
                       Packet::PACKETTYPE_SMSREQUEST,
                       0, // packetID
                       0, // reqID
                       MAX_UINT32)
{
   fillPacket(CONVERSION_NO, "", "", 0, NULL);
}
예제 #3
0
SMSSendRequestPacket::SMSSendRequestPacket(uint32 packetID,
                                           uint32 reqID,
                                           uint32 origIP,
                                           uint16 origPort)
      : RequestPacket( SMSPACKETLENGTH,
                       SMS_REQ_PRIO,
                       Packet::PACKETTYPE_SMSREQUEST,
                       packetID,
                       reqID,
                       MAX_UINT32)
{
   setOriginIP(origIP);
   setOriginPort(origPort);
   fillPacket(CONVERSION_NO, "", "", 0, NULL);
}
예제 #4
0
 void TSOutput::fillPacket(const char * data, const size_t dataLen){
   
   if (!packData.getBytesFree()){
     ///\todo only resend the PAT/PMT for HLS
     if ( (sendRepeatingHeaders && packCounter % 42 == 0) || !packCounter){
       TS::Packet tmpPack;
       tmpPack.FromPointer(TS::PAT);
       tmpPack.setContinuityCounter(++contCounters[0]);
       sendTS(tmpPack.checkAndGetBuffer());
       sendTS(TS::createPMT(selectedTracks, myMeta, ++contCounters[4096]));
       packCounter += 2;
     }
     sendTS(packData.checkAndGetBuffer());
     packCounter ++;
     packData.clear();
   }
   
   if (!dataLen){return;}
   
   if (packData.getBytesFree() == 184){
     packData.clear();      
     packData.setPID(thisPacket.getTrackId());      
     packData.setContinuityCounter(++contCounters[packData.getPID()]);
     if (first[thisPacket.getTrackId()]){
       packData.setUnitStart(1);
       packData.setDiscontinuity(true);
       if (myMeta.tracks[thisPacket.getTrackId()].type == "video"){
         if (thisPacket.getInt("keyframe")){
           packData.setRandomAccess(1);
         }      
         packData.setPCR(thisPacket.getTime() * 27000);      
       }
       first[thisPacket.getTrackId()] = false;
     }
   }
   
   int tmp = packData.fillFree(data, dataLen);     
   if (tmp != dataLen){
     return fillPacket(data+tmp, dataLen-tmp);
   }
 }
예제 #5
0
 void TSOutput::sendNext(){
   first[thisPacket.getTrackId()] = true;
   char * dataPointer = 0;
   unsigned int dataLen = 0;
   thisPacket.getString("data", dataPointer, dataLen); //data
   if (thisPacket.getTime() >= until){ //this if should only trigger for HLS       
     stop();
     wantRequest = true;
     parseData = false;
     sendTS("",0);      
     return;
   }
   std::string bs;
   //prepare bufferstring    
   if (myMeta.tracks[thisPacket.getTrackId()].type == "video"){      
     unsigned int extraSize = 0;      
     //dataPointer[4] & 0x1f is used to check if this should be done later: fillPacket("\000\000\000\001\011\360", 6);
     if (myMeta.tracks[thisPacket.getTrackId()].codec == "H264" && (dataPointer[4] & 0x1f) != 0x09){
       extraSize += 6;
     }
     if (thisPacket.getInt("keyframe")){
       if (myMeta.tracks[thisPacket.getTrackId()].codec == "H264"){
         if (!haveAvcc){
           avccbox.setPayload(myMeta.tracks[thisPacket.getTrackId()].init);
           haveAvcc = true;
         }
         bs = avccbox.asAnnexB();
         extraSize += bs.size();
       }
     }
     
     unsigned int watKunnenWeIn1Ding = 65490-13;
     unsigned int splitCount = (dataLen+extraSize) / watKunnenWeIn1Ding;
     unsigned int currPack = 0;
     unsigned int ThisNaluSize = 0;
     unsigned int i = 0;
     unsigned int nalLead = 0;
     
     while (currPack <= splitCount){
       unsigned int alreadySent = 0;
       long long unsigned int tempTime = thisPacket.getTime();
       if (appleCompat){tempTime -= ts_from;}
       bs = TS::Packet::getPESVideoLeadIn((currPack != splitCount ? watKunnenWeIn1Ding : dataLen+extraSize - currPack*watKunnenWeIn1Ding), tempTime * 90, thisPacket.getInt("offset") * 90, !currPack);
       fillPacket(bs.data(), bs.size());
       if (!currPack){
         if (myMeta.tracks[thisPacket.getTrackId()].codec == "H264" && (dataPointer[4] & 0x1f) != 0x09){
           //End of previous nal unit, if not already present
           fillPacket("\000\000\000\001\011\360", 6);
           alreadySent += 6;
         }
         if (thisPacket.getInt("keyframe")){
           if (myMeta.tracks[thisPacket.getTrackId()].codec == "H264"){
             bs = avccbox.asAnnexB();
             fillPacket(bs.data(), bs.size());
             alreadySent += bs.size();
           }
         }
       }
       while (i + 4 < (unsigned int)dataLen){
         if (nalLead){
           fillPacket("\000\000\000\001"+4-nalLead,nalLead);
           i += nalLead;
           alreadySent += nalLead;
           nalLead = 0;
         }
         if (!ThisNaluSize){
           ThisNaluSize = (dataPointer[i] << 24) + (dataPointer[i+1] << 16) + (dataPointer[i+2] << 8) + dataPointer[i+3];
           if (ThisNaluSize + i + 4 > (unsigned int)dataLen){
             DEBUG_MSG(DLVL_WARN, "Too big NALU detected (%u > %d) - skipping!", ThisNaluSize + i + 4, dataLen);
             break;
           }
           if (alreadySent + 4 > watKunnenWeIn1Ding){
             nalLead = 4 - (watKunnenWeIn1Ding-alreadySent);
             fillPacket("\000\000\000\001",watKunnenWeIn1Ding-alreadySent);
             i += watKunnenWeIn1Ding-alreadySent;
             alreadySent += watKunnenWeIn1Ding-alreadySent;
           }else{
             fillPacket("\000\000\000\001",4);
             alreadySent += 4;
             i += 4;
           }
         }
         if (alreadySent + ThisNaluSize > watKunnenWeIn1Ding){
           fillPacket(dataPointer+i,watKunnenWeIn1Ding-alreadySent);
           i += watKunnenWeIn1Ding-alreadySent;
           ThisNaluSize -= watKunnenWeIn1Ding-alreadySent;
           alreadySent += watKunnenWeIn1Ding-alreadySent;
         }else{
           fillPacket(dataPointer+i,ThisNaluSize);
           alreadySent += ThisNaluSize;
           i += ThisNaluSize;
           ThisNaluSize = 0;
         }          
         if (alreadySent == watKunnenWeIn1Ding){
           packData.addStuffing();
           fillPacket(0, 0);
           first[thisPacket.getTrackId()] = true;
           break;
         }
       }
       currPack++;
     }
   }else if (myMeta.tracks[thisPacket.getTrackId()].type == "audio"){
     long unsigned int tempLen = dataLen;
     if ( myMeta.tracks[thisPacket.getTrackId()].codec == "AAC"){
       tempLen += 7;
     }
     long long unsigned int tempTime;
     if (appleCompat){
       tempTime = 0;// myMeta.tracks[thisPacket.getTrackId()].rate / 1000;
     }else{
       tempTime = thisPacket.getTime() * 90;
     }
     bs = TS::Packet::getPESAudioLeadIn(tempLen, tempTime);// myMeta.tracks[thisPacket.getTrackId()].rate / 1000 );
     fillPacket(bs.data(), bs.size());
     if (myMeta.tracks[thisPacket.getTrackId()].codec == "AAC"){        
       bs = TS::getAudioHeader(dataLen, myMeta.tracks[thisPacket.getTrackId()].init);      
       fillPacket(bs.data(), bs.size());
     }
     fillPacket(dataPointer,dataLen);
   }
   if (packData.getBytesFree() < 184){
     packData.addStuffing();
     fillPacket(0, 0);
   }
 }
예제 #6
0
  void TSOutput::sendNext(){
    //Get ready some data to speed up accesses
    uint32_t trackId = thisPacket.getTrackId();
    DTSC::Track & Trk = myMeta.tracks[trackId];
    bool & firstPack = first[trackId];
    uint32_t pkgPid = 255 + trackId;
    int & contPkg = contCounters[pkgPid];
    uint64_t packTime = thisPacket.getTime();
    bool video = (Trk.type == "video");
    bool keyframe = thisPacket.getInt("keyframe");
    firstPack = true;

    char * dataPointer = 0;
    unsigned int dataLen = 0;
    thisPacket.getString("data", dataPointer, dataLen); //data
    //apple compatibility timestamp correction
    if (appleCompat){
      packTime -= ts_from;
      if (Trk.type == "audio"){
        packTime = 0;
      }
    }
    packTime *= 90;
    std::string bs;
    //prepare bufferstring    
    if (video){
      unsigned int extraSize = 0;      
      //dataPointer[4] & 0x1f is used to check if this should be done later: fillPacket("\000\000\000\001\011\360", 6);
      if (Trk.codec == "H264" && (dataPointer[4] & 0x1f) != 0x09){
        extraSize += 6;
      }
      if (keyframe){
        if (Trk.codec == "H264"){
          if (!haveAvcc){
            avccbox.setPayload(Trk.init);
            haveAvcc = true;
          }
          bs = avccbox.asAnnexB();
          extraSize += bs.size();
        }
      }
      
      unsigned int watKunnenWeIn1Ding = 65490-13;
      unsigned int splitCount = (dataLen+extraSize) / watKunnenWeIn1Ding;
      unsigned int currPack = 0;
      unsigned int ThisNaluSize = 0;
      unsigned int i = 0;
      unsigned int nalLead = 0;
      uint64_t offset = thisPacket.getInt("offset") * 90;

      while (currPack <= splitCount){
        unsigned int alreadySent = 0;
        bs = TS::Packet::getPESVideoLeadIn((currPack != splitCount ? watKunnenWeIn1Ding : dataLen+extraSize - currPack*watKunnenWeIn1Ding), packTime, offset, !currPack);
        fillPacket(bs.data(), bs.size(), firstPack, video, keyframe, pkgPid, contPkg);
        if (!currPack){
          if (Trk.codec == "H264" && (dataPointer[4] & 0x1f) != 0x09){
            //End of previous nal unit, if not already present
            fillPacket("\000\000\000\001\011\360", 6, firstPack, video, keyframe, pkgPid, contPkg);
            alreadySent += 6;
          }
          if (keyframe){
            if (Trk.codec == "H264"){
              bs = avccbox.asAnnexB();
              fillPacket(bs.data(), bs.size(), firstPack, video, keyframe, pkgPid, contPkg);
              alreadySent += bs.size();
            }
          }
        }
        while (i + 4 < (unsigned int)dataLen){
          if (nalLead){
            fillPacket("\000\000\000\001"+4-nalLead,nalLead, firstPack, video, keyframe, pkgPid, contPkg);
            i += nalLead;
            alreadySent += nalLead;
            nalLead = 0;
          }
          if (!ThisNaluSize){
            ThisNaluSize = (dataPointer[i] << 24) + (dataPointer[i+1] << 16) + (dataPointer[i+2] << 8) + dataPointer[i+3];
            if (ThisNaluSize + i + 4 > (unsigned int)dataLen){
              DEBUG_MSG(DLVL_WARN, "Too big NALU detected (%u > %d) - skipping!", ThisNaluSize + i + 4, dataLen);
              break;
            }
            if (alreadySent + 4 > watKunnenWeIn1Ding){
              nalLead = 4 - (watKunnenWeIn1Ding-alreadySent);
              fillPacket("\000\000\000\001",watKunnenWeIn1Ding-alreadySent, firstPack, video, keyframe, pkgPid, contPkg);
              i += watKunnenWeIn1Ding-alreadySent;
              alreadySent += watKunnenWeIn1Ding-alreadySent;
            }else{
              fillPacket("\000\000\000\001",4, firstPack, video, keyframe, pkgPid, contPkg);
              alreadySent += 4;
              i += 4;
            }
          }
          if (alreadySent + ThisNaluSize > watKunnenWeIn1Ding){
            fillPacket(dataPointer+i,watKunnenWeIn1Ding-alreadySent, firstPack, video, keyframe, pkgPid, contPkg);
            i += watKunnenWeIn1Ding-alreadySent;
            ThisNaluSize -= watKunnenWeIn1Ding-alreadySent;
            alreadySent += watKunnenWeIn1Ding-alreadySent;
          }else{
            fillPacket(dataPointer+i,ThisNaluSize, firstPack, video, keyframe, pkgPid, contPkg);
            alreadySent += ThisNaluSize;
            i += ThisNaluSize;
            ThisNaluSize = 0;
          }          
          if (alreadySent == watKunnenWeIn1Ding){
            packData.addStuffing();
            fillPacket(0, 0, firstPack, video, keyframe, pkgPid, contPkg);
            firstPack = true;
            break;
          }
        }
        currPack++;
      }
    }else if (Trk.type == "audio"){
      long unsigned int tempLen = dataLen;
      if (Trk.codec == "AAC"){
        tempLen += 7;
      }
      bs = TS::Packet::getPESAudioLeadIn(tempLen, packTime);// myMeta.tracks[thisPacket.getTrackId()].rate / 1000 );
      fillPacket(bs.data(), bs.size(), firstPack, video, keyframe, pkgPid, contPkg);
      if (Trk.codec == "AAC"){        
        bs = TS::getAudioHeader(dataLen, Trk.init);      
        fillPacket(bs.data(), bs.size(), firstPack, video, keyframe, pkgPid, contPkg);
      }
      fillPacket(dataPointer,dataLen, firstPack, video, keyframe, pkgPid, contPkg);
    }
    if (packData.getBytesFree() < 184){
      packData.addStuffing();
      fillPacket(0, 0, firstPack, video, keyframe, pkgPid, contPkg);
    }
  }