NetEQ tests
Adding capability to parse RED payloads to the RTPanalyze tool. Also adding a method to scramble an RTP payload (currently not used). Review URL: http://webrtc-codereview.appspot.com/276006 git-svn-id: http://webrtc.googlecode.com/svn/trunk@945 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
@ -19,6 +19,8 @@
|
||||
#include <netinet/in.h> // for htons, htonl, etc
|
||||
#endif
|
||||
|
||||
#include <cstdlib>
|
||||
|
||||
#define HDR_SIZE 8 // rtpplay packet header size in bytes
|
||||
|
||||
|
||||
@ -802,3 +804,68 @@ void NETEQTEST_RTPpacket::splitStereoFrame(NETEQTEST_RTPpacket& slaveRtp)
|
||||
slaveRtp._payloadLen = _payloadLen;
|
||||
}
|
||||
|
||||
// Get the RTP header for the RED payload indicated by argument index.
|
||||
// The first RED payload is index = 0.
|
||||
int NETEQTEST_RTPpacket::extractRED(int index, WebRtcNetEQ_RTPInfo& red)
|
||||
{
|
||||
//
|
||||
// 0 1 2 3
|
||||
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// |1| block PT | timestamp offset | block length |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// |1| ... |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// |0| block PT |
|
||||
// +-+-+-+-+-+-+-+-+
|
||||
//
|
||||
|
||||
parseHeader();
|
||||
|
||||
WebRtc_UWord8* ptr = payload();
|
||||
WebRtc_UWord8* payloadEndPtr = ptr + payloadLen();
|
||||
int num_encodings = 0;
|
||||
int total_len = 0;
|
||||
|
||||
while ((ptr < payloadEndPtr) && (*ptr & 0x80))
|
||||
{
|
||||
int len = ((ptr[2] & 0x03) << 8) + ptr[3];
|
||||
if (num_encodings == index)
|
||||
{
|
||||
// Header found.
|
||||
red.payloadType = ptr[0] & 0x7F;
|
||||
WebRtc_UWord32 offset = (ptr[1] << 6) + ((ptr[2] & 0xFC) >> 2);
|
||||
red.sequenceNumber = sequenceNumber();
|
||||
red.timeStamp = timeStamp() - offset;
|
||||
red.markerBit = markerBit();
|
||||
red.SSRC = SSRC();
|
||||
return len;
|
||||
}
|
||||
++num_encodings;
|
||||
total_len += len;
|
||||
ptr += 4;
|
||||
}
|
||||
if ((ptr < payloadEndPtr) && (num_encodings == index))
|
||||
{
|
||||
// Last header.
|
||||
red.payloadType = ptr[0] & 0x7F;
|
||||
red.sequenceNumber = sequenceNumber();
|
||||
red.timeStamp = timeStamp();
|
||||
red.markerBit = markerBit();
|
||||
red.SSRC = SSRC();
|
||||
++ptr;
|
||||
return payloadLen() - (ptr - payload()) - total_len;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Randomize the payload, not the RTP header.
|
||||
void NETEQTEST_RTPpacket::scramblePayload(void)
|
||||
{
|
||||
parseHeader();
|
||||
|
||||
for (int i = 0; i < _payloadLen; ++i)
|
||||
{
|
||||
_payloadPtr[i] = static_cast<WebRtc_UWord8>(std::rand());
|
||||
}
|
||||
}
|
||||
|
@ -66,6 +66,10 @@ public:
|
||||
|
||||
int splitStereo(NETEQTEST_RTPpacket& slaveRtp, enum stereoModes mode);
|
||||
|
||||
int extractRED(int index, WebRtcNetEQ_RTPInfo& red);
|
||||
|
||||
void scramblePayload(void);
|
||||
|
||||
WebRtc_UWord8 * _datagram;
|
||||
WebRtc_UWord8 * _payloadPtr;
|
||||
int _memSize;
|
||||
|
@ -8,6 +8,7 @@
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <vector>
|
||||
|
||||
@ -20,6 +21,7 @@
|
||||
|
||||
#define FIRSTLINELEN 40
|
||||
|
||||
enum {kRedPayloadType = 127};
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
@ -56,6 +58,18 @@ int main(int argc, char* argv[])
|
||||
fprintf(outFile, "%5u %10u %10u %5i %5i %2i\n",
|
||||
packet.sequenceNumber(), packet.timeStamp(), packet.time(),
|
||||
packet.dataLen(), packet.payloadType(), packet.markerBit());
|
||||
if (packet.payloadType() == kRedPayloadType) {
|
||||
WebRtcNetEQ_RTPInfo redHdr;
|
||||
int len;
|
||||
int redIndex = 0;
|
||||
while ((len = packet.extractRED(redIndex++, redHdr)) >= 0)
|
||||
{
|
||||
fprintf(outFile, "* %5u %10u %10u %5i %5i\n",
|
||||
redHdr.sequenceNumber, redHdr.timeStamp, packet.time(),
|
||||
len, redHdr.payloadType);
|
||||
}
|
||||
assert(redIndex > 1); // We must get at least one payload.
|
||||
}
|
||||
}
|
||||
|
||||
fclose(inFile);
|
||||
|
Reference in New Issue
Block a user