#include <stdio.h>
#include <string.h>
-#include <algorithm> // max
-
#ifdef WIN32
#include <winsock2.h>
#else
uint16_t length, plen;
uint32_t offset;
- int packetLen;
+ int packetLen = 0;
bool readNextPacket = true;
while (readNextPacket) {
- readNextPacket = false;
- if (fread(&length, 2, 1, fp) == 0)
- {
- reset();
- return -2;
- }
- length = ntohs(length);
-
- if (fread(&plen, 2, 1, fp) == 0)
- {
- reset();
- return -1;
- }
- packetLen = ntohs(plen);
+ readNextPacket = false;
+ if (fread(&length, 2, 1, fp) == 0)
+ {
+ reset();
+ return -2;
+ }
+ length = ntohs(length);
- if (fread(&offset, 4, 1, fp) == 0)
- {
- reset();
- return -1;
- }
- // Store in local variable until we have passed the reset below.
- uint32_t receiveTime = ntohl(offset);
-
- // Use length here because a plen of 0 specifies rtcp.
- length = (uint16_t) (length - _kRDHeaderLen);
-
- // check buffer size
- if (_datagram && _memSize < length + 1)
- {
- reset();
- }
-
- if (!_datagram)
- {
- // Add one extra byte, to be able to fake a dummy payload of one byte.
- _datagram = new uint8_t[length + 1];
- _memSize = length + 1;
- }
- memset(_datagram, 0, length + 1);
-
- if (length == 0)
- {
- _datagramLen = 0;
- return packetLen;
- }
-
- // Read basic header
- if (fread(_datagram, 1, _kBasicHeaderLen, fp)
- != (size_t)_kBasicHeaderLen)
- {
- reset();
- return -1;
- }
- _receiveTime = receiveTime;
- _datagramLen = _kBasicHeaderLen;
- int header_length = _kBasicHeaderLen;
-
- // Parse the basic header
- WebRtcNetEQ_RTPInfo tempRTPinfo;
- int P, X, CC;
- parseBasicHeader(&tempRTPinfo, &P, &X, &CC);
-
- // Check if we have to extend the header
- if (X != 0 || CC != 0)
- {
- int newLen = _kBasicHeaderLen + CC * 4 + X * 4;
- assert(_memSize >= newLen + 1);
-
- // Read extension from file
- size_t readLen = newLen - _kBasicHeaderLen;
- if (fread(_datagram + _kBasicHeaderLen, 1, readLen,
- fp) != readLen)
+ if (fread(&plen, 2, 1, fp) == 0)
{
- reset();
- return -1;
+ reset();
+ return -1;
}
- _datagramLen = newLen;
- header_length = newLen;
+ packetLen = ntohs(plen);
- if (X != 0)
+ if (fread(&offset, 4, 1, fp) == 0)
{
- int totHdrLen = calcHeaderLength(X, CC);
- assert(_memSize >= totHdrLen);
-
- // Read extension from file
- size_t readLen = totHdrLen - newLen;
- if (fread(_datagram + newLen, 1, readLen, fp)
- != readLen)
- {
reset();
return -1;
- }
- _datagramLen = totHdrLen;
- header_length = totHdrLen;
}
- }
- // Make sure that we have at least one byte of dummy payload.
- _datagramLen = std::max(static_cast<int>(length), header_length + 1);
- assert(_datagramLen <= _memSize);
-
- if (!_blockList.empty() && _blockList.count(payloadType()) > 0)
- {
- // discard this payload
- readNextPacket = true;
- }
-
- if (_filterSSRC && _selectSSRC != SSRC())
- {
- // Discard this payload.
- readNextPacket = true;
- }
+ // Store in local variable until we have passed the reset below.
+ uint32_t receiveTime = ntohl(offset);
+
+ // Use length here because a plen of 0 specifies rtcp.
+ length = (uint16_t) (length - _kRDHeaderLen);
+
+ // check buffer size
+ if (_datagram && _memSize < length + 1)
+ {
+ reset();
+ }
+
+ if (!_datagram)
+ {
+ // Add one extra byte, to be able to fake a dummy payload of 1 byte.
+ _datagram = new uint8_t[length + 1];
+ _memSize = length + 1;
+ }
+ memset(_datagram, 0, length + 1);
+
+ if (length == 0)
+ {
+ _datagramLen = 0;
+ _rtpParsed = false;
+ return packetLen;
+ }
+
+ // Read basic header
+ if (fread((unsigned short *) _datagram, 1, _kBasicHeaderLen, fp)
+ != (size_t)_kBasicHeaderLen)
+ {
+ reset();
+ return -1;
+ }
+ _receiveTime = receiveTime;
+ _datagramLen = _kBasicHeaderLen;
+
+ // Parse the basic header
+ webrtc::WebRtcRTPHeader tempRTPinfo;
+ int P, X, CC;
+ parseBasicHeader(&tempRTPinfo, &P, &X, &CC);
+
+ // Check if we have to extend the header
+ if (X != 0 || CC != 0)
+ {
+ int newLen = _kBasicHeaderLen + CC * 4 + X * 4;
+ assert(_memSize >= newLen);
+
+ // Read extension from file
+ size_t readLen = newLen - _kBasicHeaderLen;
+ if (fread(&_datagram[_kBasicHeaderLen], 1, readLen, fp) != readLen)
+ {
+ reset();
+ return -1;
+ }
+ _datagramLen = newLen;
+
+ if (X != 0)
+ {
+ int totHdrLen = calcHeaderLength(X, CC);
+ assert(_memSize >= totHdrLen);
+
+ // Read extension from file
+ size_t readLen = totHdrLen - newLen;
+ if (fread(&_datagram[newLen], 1, readLen, fp) != readLen)
+ {
+ reset();
+ return -1;
+ }
+ _datagramLen = totHdrLen;
+ }
+ }
+ _datagramLen = length;
+
+ if (!_blockList.empty() && _blockList.count(payloadType()) > 0)
+ {
+ readNextPacket = true;
+ }
}
+ _rtpParsed = false;
+ assert(_memSize > _datagramLen);
+ _payloadLen = 1; // Set the length to 1 byte.
return packetLen;
}
}
+void NETEQTEST_DummyRTPpacket::parseHeader() {
+ NETEQTEST_RTPpacket::parseHeader();
+ // Change _payloadLen to 1 byte. The memory should always be big enough.
+ assert(_memSize > _datagramLen);
+ _payloadLen = 1;
+}