コード例 #1
0
ファイル: RtpSource.cpp プロジェクト: Azzuro/MediaPortal-1
unsigned int RtpSource::GetPacketData(char* buffer, unsigned int length, unsigned int *firstSequenceNumber, unsigned int *lastSequenceNumber, bool getUncontinousPackets) 
{
  unsigned int result = UINT_MAX;
  bool setFirstSequenceNumber = false;

  if ((this->firstRtpPacket != NULL) && (firstSequenceNumber != NULL) && (lastSequenceNumber != NULL))
  {
    result = 0;
    bool finishWork = false;
    RtpPacket *currentRtpPacket = this->firstRtpPacket;

    while (!finishWork)
    {
      unsigned int freeSpace = length - result;
      finishWork = (currentRtpPacket->GetDataLength() >= freeSpace);
      if (!finishWork)
      {
        // in buffer is enough free space for data from first RTP packet
        int copiedDataLength = currentRtpPacket->GetData(buffer + result, freeSpace);
        if (copiedDataLength >= 0)
        {
          // no error occured
          result += copiedDataLength;
          if (!setFirstSequenceNumber)
          {
            *firstSequenceNumber = currentRtpPacket->GetSequenceNumber();
            setFirstSequenceNumber = true;
          }
          else
          {
            *lastSequenceNumber = currentRtpPacket->GetSequenceNumber();
          }
        }
        // if error occured we skip this RTP packet

        if (currentRtpPacket->GetNextPacket() != NULL)
        {
          // check if next packet is continous
          bool isContinous = this->IsSequenceContinuous(currentRtpPacket->GetSequenceNumber(), currentRtpPacket->GetNextPacket()->GetSequenceNumber());
          if (!isContinous)
          {
            this->logger->Log(LOGGER_WARNING, _T("%s: %s: got uncontinous packet, last sequence number: %u"), PROTOCOL_IMPLEMENTATION_NAME, METHOD_GET_PACKET_DATA_NAME, currentRtpPacket->GetSequenceNumber());
          }

          finishWork |= ((!getUncontinousPackets) && (!isContinous));
        }

        finishWork |= (currentRtpPacket->GetNextPacket() == NULL);

        if (!finishWork)
        {
          // move to next packet
          currentRtpPacket = currentRtpPacket->GetNextPacket();
        }
      }
    }
  }

  return result;
}
コード例 #2
0
ファイル: RtpSource.cpp プロジェクト: Azzuro/MediaPortal-1
RtpPacket *RtpSource::GetInternalRtpPacket(unsigned int sequenceNumber)
{
  RtpPacket *result = NULL;

  RtpPacket *currentRtpPacket = this->firstRtpPacket;
  while ((currentRtpPacket != NULL) && (result == NULL))
  {
    if (currentRtpPacket->GetSequenceNumber() == sequenceNumber)
    {
      result = currentRtpPacket;
    }
    currentRtpPacket = currentRtpPacket->GetNextPacket();
  }

  return result;
}