blob: 56ed72fcee9a3ea8e27f159bde557b7888b8e9bd [file] [log] [blame]
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001/*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef NETEQTEST_RTPPACKET_H
12#define NETEQTEST_RTPPACKET_H
13
14#include <map>
15#include <stdio.h>
16#include "webrtc/typedefs.h"
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010017#include "webrtc/modules/include/module_common_types.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000018
19enum stereoModes {
20 stereoModeMono,
21 stereoModeSample1,
22 stereoModeSample2,
23 stereoModeFrame,
24 stereoModeDuplicate
25};
26
27class NETEQTEST_RTPpacket
28{
29public:
30 NETEQTEST_RTPpacket();
31 bool operator !() const { return (dataLen() < 0); };
32 virtual ~NETEQTEST_RTPpacket();
33 void reset();
34 static int skipFileHeader(FILE *fp);
35 virtual int readFromFile(FILE *fp);
36 int readFixedFromFile(FILE *fp, size_t len);
37 virtual int writeToFile(FILE *fp);
pbos@webrtc.org0946a562013-04-09 00:28:06 +000038 void blockPT(uint8_t pt);
henrik.lundin@webrtc.orge6ab21b2014-02-05 08:46:46 +000039 virtual void parseHeader();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000040 void parseHeader(webrtc::WebRtcRTPHeader* rtp_header);
41 const webrtc::WebRtcRTPHeader* RTPinfo() const;
pbos@webrtc.org0946a562013-04-09 00:28:06 +000042 uint8_t * datagram() const;
43 uint8_t * payload() const;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000044 size_t payloadLen();
pbos@webrtc.org0946a562013-04-09 00:28:06 +000045 int16_t dataLen() const;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000046 bool isParsed() const;
47 bool isLost() const;
pbos@webrtc.org0946a562013-04-09 00:28:06 +000048 uint32_t time() const { return _receiveTime; };
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000049
pbos@webrtc.org0946a562013-04-09 00:28:06 +000050 uint8_t payloadType() const;
51 uint16_t sequenceNumber() const;
52 uint32_t timeStamp() const;
53 uint32_t SSRC() const;
54 uint8_t markerBit() const;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000055
pbos@webrtc.org0946a562013-04-09 00:28:06 +000056 int setPayloadType(uint8_t pt);
57 int setSequenceNumber(uint16_t sn);
58 int setTimeStamp(uint32_t ts);
59 int setSSRC(uint32_t ssrc);
60 int setMarkerBit(uint8_t mb);
61 void setTime(uint32_t receiveTime) { _receiveTime = receiveTime; };
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000062
63 int setRTPheader(const webrtc::WebRtcRTPHeader* RTPinfo);
64
65 int splitStereo(NETEQTEST_RTPpacket* slaveRtp, enum stereoModes mode);
66
67 int extractRED(int index, webrtc::WebRtcRTPHeader& red);
68
69 void scramblePayload(void);
70
pbos@webrtc.org0946a562013-04-09 00:28:06 +000071 uint8_t * _datagram;
72 uint8_t * _payloadPtr;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000073 int _memSize;
pbos@webrtc.org0946a562013-04-09 00:28:06 +000074 int16_t _datagramLen;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000075 size_t _payloadLen;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000076 webrtc::WebRtcRTPHeader _rtpInfo;
77 bool _rtpParsed;
pbos@webrtc.org0946a562013-04-09 00:28:06 +000078 uint32_t _receiveTime;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000079 bool _lost;
pbos@webrtc.org0946a562013-04-09 00:28:06 +000080 std::map<uint8_t, bool> _blockList;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000081
82protected:
83 static const int _kRDHeaderLen;
84 static const int _kBasicHeaderLen;
85
86 void parseBasicHeader(webrtc::WebRtcRTPHeader* RTPinfo, int *i_P, int *i_X,
87 int *i_CC) const;
88 int calcHeaderLength(int i_X, int i_CC) const;
89
90private:
pbos@webrtc.org0946a562013-04-09 00:28:06 +000091 void makeRTPheader(unsigned char* rtp_data, uint8_t payloadType,
92 uint16_t seqNo, uint32_t timestamp,
93 uint32_t ssrc, uint8_t markerBit) const;
94 uint16_t parseRTPheader(webrtc::WebRtcRTPHeader* RTPinfo,
95 uint8_t **payloadPtr = NULL) const;
96 uint16_t parseRTPheader(uint8_t **payloadPtr = NULL)
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000097 { return parseRTPheader(&_rtpInfo, payloadPtr);};
98 int calcPadLength(int i_P) const;
99 void splitStereoSample(NETEQTEST_RTPpacket* slaveRtp, int stride);
100 void splitStereoFrame(NETEQTEST_RTPpacket* slaveRtp);
101 void splitStereoDouble(NETEQTEST_RTPpacket* slaveRtp);
102};
103
104#endif //NETEQTEST_RTPPACKET_H