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/interface/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     //int16_t payloadType();
     40     virtual void parseHeader();
     41     void parseHeader(webrtc::WebRtcRTPHeader* rtp_header);
     42     const webrtc::WebRtcRTPHeader* RTPinfo() const;
     43     uint8_t * datagram() const;
     44     uint8_t * payload() const;
     45     int16_t payloadLen();
     46     int16_t dataLen() const;
     47     bool isParsed() const;
     48     bool isLost() const;
     49     uint32_t time() const { return _receiveTime; };
     50 
     51     uint8_t  payloadType() const;
     52     uint16_t sequenceNumber() const;
     53     uint32_t timeStamp() const;
     54     uint32_t SSRC() const;
     55     uint8_t  markerBit() const;
     56 
     57     int setPayloadType(uint8_t pt);
     58     int setSequenceNumber(uint16_t sn);
     59     int setTimeStamp(uint32_t ts);
     60     int setSSRC(uint32_t ssrc);
     61     int setMarkerBit(uint8_t mb);
     62     void setTime(uint32_t receiveTime) { _receiveTime = receiveTime; };
     63 
     64     int setRTPheader(const webrtc::WebRtcRTPHeader* RTPinfo);
     65 
     66     int splitStereo(NETEQTEST_RTPpacket* slaveRtp, enum stereoModes mode);
     67 
     68     int extractRED(int index, webrtc::WebRtcRTPHeader& red);
     69 
     70     void scramblePayload(void);
     71 
     72     uint8_t *       _datagram;
     73     uint8_t *       _payloadPtr;
     74     int                 _memSize;
     75     int16_t         _datagramLen;
     76     int16_t         _payloadLen;
     77     webrtc::WebRtcRTPHeader _rtpInfo;
     78     bool                _rtpParsed;
     79     uint32_t        _receiveTime;
     80     bool                _lost;
     81     std::map<uint8_t, bool> _blockList;
     82 
     83 protected:
     84     static const int _kRDHeaderLen;
     85     static const int _kBasicHeaderLen;
     86 
     87     void parseBasicHeader(webrtc::WebRtcRTPHeader* RTPinfo, int *i_P, int *i_X,
     88                           int *i_CC) const;
     89     int calcHeaderLength(int i_X, int i_CC) const;
     90 
     91 private:
     92     void makeRTPheader(unsigned char* rtp_data, uint8_t payloadType,
     93                        uint16_t seqNo, uint32_t timestamp,
     94                        uint32_t ssrc, uint8_t markerBit) const;
     95     uint16_t parseRTPheader(webrtc::WebRtcRTPHeader* RTPinfo,
     96                             uint8_t **payloadPtr = NULL) const;
     97     uint16_t parseRTPheader(uint8_t **payloadPtr = NULL)
     98         { return parseRTPheader(&_rtpInfo, payloadPtr);};
     99     int calcPadLength(int i_P) const;
    100     void splitStereoSample(NETEQTEST_RTPpacket* slaveRtp, int stride);
    101     void splitStereoFrame(NETEQTEST_RTPpacket* slaveRtp);
    102     void splitStereoDouble(NETEQTEST_RTPpacket* slaveRtp);
    103 };
    104 
    105 #endif //NETEQTEST_RTPPACKET_H
    106