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