xref: /aosp_15_r20/external/webrtc/modules/audio_coding/test/RTPFile.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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