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; }
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; }