uint16_t length, plen;
uint32_t offset;
+ int packetLen;
- if (fread(&length, 2, 1, fp) == 0)
- {
- reset();
- return -2;
- }
- length = ntohs(length);
-
- if (fread(&plen, 2, 1, fp) == 0)
- {
- reset();
- return -1;
- }
- int packetLen = ntohs(plen);
-
- 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);
+ bool readNextPacket = true;
+ while (readNextPacket) {
+ readNextPacket = false;
+ if (fread(&length, 2, 1, fp) == 0)
+ {
+ reset();
+ return -2;
+ }
+ length = ntohs(length);
- // check buffer size
- if (_datagram && _memSize < length)
- {
- reset();
- }
+ if (fread(&plen, 2, 1, fp) == 0)
+ {
+ reset();
+ return -1;
+ }
+ packetLen = ntohs(plen);
- if (!_datagram)
- {
- _datagram = new uint8_t[length];
- _memSize = length;
- }
- memset(_datagram, 0, 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);
- if (length == 0)
- {
- _datagramLen = 0;
- _rtpParsed = false;
- return packetLen;
- }
+ // Use length here because a plen of 0 specifies rtcp.
+ length = (uint16_t) (length - _kRDHeaderLen);
- // Read basic header
- if (fread((unsigned short *) _datagram, 1, _kBasicHeaderLen, fp)
- != (size_t)_kBasicHeaderLen)
- {
- reset();
- return -1;
- }
- _receiveTime = receiveTime;
- _datagramLen = _kBasicHeaderLen;
+ // check buffer size
+ if (_datagram && _memSize < length + 1)
+ {
+ reset();
+ }
- // Parse the basic header
- webrtc::WebRtcRTPHeader tempRTPinfo;
- int P, X, CC;
- parseBasicHeader(&tempRTPinfo, &P, &X, &CC);
+ 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);
- // Check if we have to extend the header
- if (X != 0 || CC != 0)
- {
- int newLen = _kBasicHeaderLen + CC * 4 + X * 4;
- assert(_memSize >= newLen);
+ if (length == 0)
+ {
+ _datagramLen = 0;
+ _rtpParsed = false;
+ return packetLen;
+ }
- // Read extension from file
- size_t readLen = newLen - _kBasicHeaderLen;
- if (fread((unsigned short *) _datagram + _kBasicHeaderLen, 1, readLen,
- fp) != readLen)
+ // Read basic header
+ if (fread((unsigned short *) _datagram, 1, _kBasicHeaderLen, fp)
+ != (size_t)_kBasicHeaderLen)
{
reset();
return -1;
}
- _datagramLen = newLen;
+ _receiveTime = receiveTime;
+ _datagramLen = _kBasicHeaderLen;
- if (X != 0)
+ // 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 totHdrLen = calcHeaderLength(X, CC);
- assert(_memSize >= totHdrLen);
+ int newLen = _kBasicHeaderLen + CC * 4 + X * 4;
+ assert(_memSize >= newLen);
// Read extension from file
- size_t readLen = totHdrLen - newLen;
- if (fread((unsigned short *) _datagram + newLen, 1, readLen, fp)
- != readLen)
+ size_t readLen = newLen - _kBasicHeaderLen;
+ if (fread(&_datagram[_kBasicHeaderLen], 1, readLen, fp) != readLen)
{
reset();
return -1;
}
- _datagramLen = totHdrLen;
+ _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;
+ _datagramLen = length;
- if (!_blockList.empty() && _blockList.count(payloadType()) > 0)
- {
- // discard this payload
- return readFromFile(fp);
+ 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;
+}