/* * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #ifndef NETEQTEST_RTPPACKET_H #define NETEQTEST_RTPPACKET_H #include #include #include "typedefs.h" #include "webrtc_neteq_internal.h" enum stereoModes { stereoModeMono, stereoModeSample1, stereoModeSample2, stereoModeFrame, stereoModeDuplicate }; class NETEQTEST_RTPpacket { public: NETEQTEST_RTPpacket(); bool operator !() const { return (dataLen() < 0); }; virtual ~NETEQTEST_RTPpacket(); void reset(); static int skipFileHeader(FILE *fp); virtual int readFromFile(FILE *fp); int readFixedFromFile(FILE *fp, size_t len); virtual int writeToFile(FILE *fp); void blockPT(WebRtc_UWord8 pt); void selectSSRC(uint32_t ssrc); //WebRtc_Word16 payloadType(); void parseHeader(); void parseHeader(WebRtcNetEQ_RTPInfo & rtpInfo); WebRtcNetEQ_RTPInfo const * RTPinfo() const; WebRtc_UWord8 * datagram() const; WebRtc_UWord8 * payload() const; WebRtc_Word16 payloadLen(); WebRtc_Word16 dataLen() const; bool isParsed() const; bool isLost() const; WebRtc_UWord32 time() const { return _receiveTime; }; WebRtc_UWord8 payloadType() const; WebRtc_UWord16 sequenceNumber() const; WebRtc_UWord32 timeStamp() const; WebRtc_UWord32 SSRC() const; WebRtc_UWord8 markerBit() const; int setPayloadType(WebRtc_UWord8 pt); int setSequenceNumber(WebRtc_UWord16 sn); int setTimeStamp(WebRtc_UWord32 ts); int setSSRC(WebRtc_UWord32 ssrc); int setMarkerBit(WebRtc_UWord8 mb); void setTime(WebRtc_UWord32 receiveTime) { _receiveTime = receiveTime; }; int setRTPheader(const WebRtcNetEQ_RTPInfo *RTPinfo); 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; WebRtc_Word16 _datagramLen; WebRtc_Word16 _payloadLen; WebRtcNetEQ_RTPInfo _rtpInfo; bool _rtpParsed; WebRtc_UWord32 _receiveTime; bool _lost; std::map _blockList; uint32_t _selectSSRC; bool _filterSSRC; protected: static const int _kRDHeaderLen; static const int _kBasicHeaderLen; void parseBasicHeader(WebRtcNetEQ_RTPInfo *RTPinfo, int *i_P, int *i_X, int *i_CC) const; int calcHeaderLength(int i_X, int i_CC) const; private: void makeRTPheader(unsigned char* rtp_data, WebRtc_UWord8 payloadType, WebRtc_UWord16 seqNo, WebRtc_UWord32 timestamp, WebRtc_UWord32 ssrc, WebRtc_UWord8 markerBit) const; WebRtc_UWord16 parseRTPheader(WebRtcNetEQ_RTPInfo *RTPinfo, WebRtc_UWord8 **payloadPtr = NULL) const; WebRtc_UWord16 parseRTPheader(WebRtc_UWord8 **payloadPtr = NULL) { return parseRTPheader(&_rtpInfo, payloadPtr);}; int calcPadLength(int i_P) const; void splitStereoSample(NETEQTEST_RTPpacket* slaveRtp, int stride); void splitStereoFrame(NETEQTEST_RTPpacket* slaveRtp); void splitStereoDouble(NETEQTEST_RTPpacket* slaveRtp); }; #endif //NETEQTEST_RTPPACKET_H