Home | History | Annotate | Download | only in test
      1 /*
      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"
     17 #include "webrtc/modules/include/module_common_types.h"
     18 
     19 enum stereoModes {
     20     stereoModeMono,
     21     stereoModeSample1,
     22     stereoModeSample2,
     23     stereoModeFrame,
     24     stereoModeDuplicate
     25 };
     26 
     27 class NETEQTEST_RTPpacket
     28 {
     29 public:
     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);
     38     void blockPT(uint8_t pt);
     39     virtual void parseHeader();
     40     void parseHeader(webrtc::WebRtcRTPHeader* rtp_header);
     41     const webrtc::WebRtcRTPHeader* RTPinfo() const;
     42     uint8_t * datagram() const;
     43     uint8_t * payload() const;
     44     size_t payloadLen();
     45     int16_t dataLen() const;
     46     bool isParsed() const;
     47     bool isLost() const;
     48     uint32_t time() const { return _receiveTime; };
     49 
     50     uint8_t  payloadType() const;
     51     uint16_t sequenceNumber() const;
     52     uint32_t timeStamp() const;
     53     uint32_t SSRC() const;
     54     uint8_t  markerBit() const;
     55 
     56     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; };
     62 
     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 
     71     uint8_t *       _datagram;
     72     uint8_t *       _payloadPtr;
     73     int                 _memSize;
     74     int16_t         _datagramLen;
     75     size_t          _payloadLen;
     76     webrtc::WebRtcRTPHeader _rtpInfo;
     77     bool                _rtpParsed;
     78     uint32_t        _receiveTime;
     79     bool                _lost;
     80     std::map<uint8_t, bool> _blockList;
     81 
     82 protected:
     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 
     90 private:
     91     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)
     97         { 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
    105