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 MODULES_AUDIO_CODING_TEST_RTPFILE_H_ 12 #define MODULES_AUDIO_CODING_TEST_RTPFILE_H_ 13 14 #include <stdio.h> 15 16 #include <queue> 17 18 #include "absl/strings/string_view.h" 19 #include "api/rtp_headers.h" 20 #include "rtc_base/synchronization/mutex.h" 21 #include "rtc_base/thread_annotations.h" 22 23 namespace webrtc { 24 25 class RTPStream { 26 public: ~RTPStream()27 virtual ~RTPStream() {} 28 29 virtual void Write(uint8_t payloadType, 30 uint32_t timeStamp, 31 int16_t seqNo, 32 const uint8_t* payloadData, 33 size_t payloadSize, 34 uint32_t frequency) = 0; 35 36 // Returns the packet's payload size. Zero should be treated as an 37 // end-of-stream (in the case that EndOfFile() is true) or an error. 38 virtual size_t Read(RTPHeader* rtp_Header, 39 uint8_t* payloadData, 40 size_t payloadSize, 41 uint32_t* offset) = 0; 42 virtual bool EndOfFile() const = 0; 43 44 protected: 45 void MakeRTPheader(uint8_t* rtpHeader, 46 uint8_t payloadType, 47 int16_t seqNo, 48 uint32_t timeStamp, 49 uint32_t ssrc); 50 51 void ParseRTPHeader(RTPHeader* rtp_header, const uint8_t* rtpHeader); 52 }; 53 54 class RTPPacket { 55 public: 56 RTPPacket(uint8_t payloadType, 57 uint32_t timeStamp, 58 int16_t seqNo, 59 const uint8_t* payloadData, 60 size_t payloadSize, 61 uint32_t frequency); 62 63 ~RTPPacket(); 64 65 uint8_t payloadType; 66 uint32_t timeStamp; 67 int16_t seqNo; 68 uint8_t* payloadData; 69 size_t payloadSize; 70 uint32_t frequency; 71 }; 72 73 class RTPBuffer : public RTPStream { 74 public: 75 RTPBuffer() = default; 76 77 ~RTPBuffer() = default; 78 79 void Write(uint8_t payloadType, 80 uint32_t timeStamp, 81 int16_t seqNo, 82 const uint8_t* payloadData, 83 size_t payloadSize, 84 uint32_t frequency) override; 85 86 size_t Read(RTPHeader* rtp_header, 87 uint8_t* payloadData, 88 size_t payloadSize, 89 uint32_t* offset) override; 90 91 bool EndOfFile() const override; 92 93 private: 94 mutable Mutex mutex_; 95 std::queue<RTPPacket*> _rtpQueue RTC_GUARDED_BY(&mutex_); 96 }; 97 98 class RTPFile : public RTPStream { 99 public: ~RTPFile()100 ~RTPFile() {} 101 RTPFile()102 RTPFile() : _rtpFile(NULL), _rtpEOF(false) {} 103 104 void Open(absl::string_view outFilename, absl::string_view mode); 105 106 void Close(); 107 108 void WriteHeader(); 109 110 void ReadHeader(); 111 112 void Write(uint8_t payloadType, 113 uint32_t timeStamp, 114 int16_t seqNo, 115 const uint8_t* payloadData, 116 size_t payloadSize, 117 uint32_t frequency) override; 118 119 size_t Read(RTPHeader* rtp_header, 120 uint8_t* payloadData, 121 size_t payloadSize, 122 uint32_t* offset) override; 123 EndOfFile()124 bool EndOfFile() const override { return _rtpEOF; } 125 126 private: 127 FILE* _rtpFile; 128 bool _rtpEOF; 129 }; 130 131 } // namespace webrtc 132 133 #endif // MODULES_AUDIO_CODING_TEST_RTPFILE_H_ 134