1 /*
2  *  Copyright (c) 2013 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_ACM2_ACM_RECEIVER_H_
12 #define MODULES_AUDIO_CODING_ACM2_ACM_RECEIVER_H_
13 
14 #include <stdint.h>
15 
16 #include <map>
17 #include <memory>
18 #include <string>
19 #include <utility>
20 #include <vector>
21 
22 #include "absl/types/optional.h"
23 #include "api/array_view.h"
24 #include "api/audio_codecs/audio_decoder.h"
25 #include "api/audio_codecs/audio_format.h"
26 #include "modules/audio_coding/acm2/acm_resampler.h"
27 #include "modules/audio_coding/acm2/call_statistics.h"
28 #include "modules/audio_coding/include/audio_coding_module.h"
29 #include "rtc_base/synchronization/mutex.h"
30 #include "rtc_base/thread_annotations.h"
31 
32 namespace webrtc {
33 
34 class Clock;
35 class NetEq;
36 struct RTPHeader;
37 
38 namespace acm2 {
39 
40 class AcmReceiver {
41  public:
42   // Constructor of the class
43   explicit AcmReceiver(const AudioCodingModule::Config& config);
44 
45   // Destructor of the class.
46   ~AcmReceiver();
47 
48   //
49   // Inserts a payload with its associated RTP-header into NetEq.
50   //
51   // Input:
52   //   - rtp_header           : RTP header for the incoming payload containing
53   //                            information about payload type, sequence number,
54   //                            timestamp, SSRC and marker bit.
55   //   - incoming_payload     : Incoming audio payload.
56   //   - length_payload       : Length of incoming audio payload in bytes.
57   //
58   // Return value             : 0 if OK.
59   //                           <0 if NetEq returned an error.
60   //
61   int InsertPacket(const RTPHeader& rtp_header,
62                    rtc::ArrayView<const uint8_t> incoming_payload);
63 
64   //
65   // Asks NetEq for 10 milliseconds of decoded audio.
66   //
67   // Input:
68   //   -desired_freq_hz       : specifies the sampling rate [Hz] of the output
69   //                            audio. If set -1 indicates to resampling is
70   //                            is required and the audio returned at the
71   //                            sampling rate of the decoder.
72   //
73   // Output:
74   //   -audio_frame           : an audio frame were output data and
75   //                            associated parameters are written to.
76   //   -muted                 : if true, the sample data in audio_frame is not
77   //                            populated, and must be interpreted as all zero.
78   //
79   // Return value             : 0 if OK.
80   //                           -1 if NetEq returned an error.
81   //
82   int GetAudio(int desired_freq_hz, AudioFrame* audio_frame, bool* muted);
83 
84   // Replace the current set of decoders with the specified set.
85   void SetCodecs(const std::map<int, SdpAudioFormat>& codecs);
86 
87   //
88   // Sets a minimum delay for packet buffer. The given delay is maintained,
89   // unless channel condition dictates a higher delay.
90   //
91   // Input:
92   //   - delay_ms             : minimum delay in milliseconds.
93   //
94   // Return value             : 0 if OK.
95   //                           <0 if NetEq returned an error.
96   //
97   int SetMinimumDelay(int delay_ms);
98 
99   //
100   // Sets a maximum delay [ms] for the packet buffer. The target delay does not
101   // exceed the given value, even if channel condition requires so.
102   //
103   // Input:
104   //   - delay_ms             : maximum delay in milliseconds.
105   //
106   // Return value             : 0 if OK.
107   //                           <0 if NetEq returned an error.
108   //
109   int SetMaximumDelay(int delay_ms);
110 
111   // Sets a base minimum delay in milliseconds for the packet buffer.
112   // Base minimum delay sets lower bound minimum delay value which
113   // is set via SetMinimumDelay.
114   //
115   // Returns true if value was successfully set, false overwise.
116   bool SetBaseMinimumDelayMs(int delay_ms);
117 
118   // Returns current value of base minimum delay in milliseconds.
119   int GetBaseMinimumDelayMs() const;
120 
121   //
122   // Resets the initial delay to zero.
123   //
124   void ResetInitialDelay();
125 
126   // Returns the sample rate of the decoder associated with the last incoming
127   // packet. If no packet of a registered non-CNG codec has been received, the
128   // return value is empty. Also, if the decoder was unregistered since the last
129   // packet was inserted, the return value is empty.
130   absl::optional<int> last_packet_sample_rate_hz() const;
131 
132   // Returns last_output_sample_rate_hz from the NetEq instance.
133   int last_output_sample_rate_hz() const;
134 
135   //
136   // Get the current network statistics from NetEq.
137   //
138   // Output:
139   //   - statistics           : The current network statistics.
140   //
141   void GetNetworkStatistics(NetworkStatistics* statistics,
142                             bool get_and_clear_legacy_stats = true) const;
143 
144   //
145   // Flushes the NetEq packet and speech buffers.
146   //
147   void FlushBuffers();
148 
149   //
150   // Remove all registered codecs.
151   //
152   void RemoveAllCodecs();
153 
154   // Returns the RTP timestamp for the last sample delivered by GetAudio().
155   // The return value will be empty if no valid timestamp is available.
156   absl::optional<uint32_t> GetPlayoutTimestamp();
157 
158   // Returns the current total delay from NetEq (packet buffer and sync buffer)
159   // in ms, with smoothing applied to even out short-time fluctuations due to
160   // jitter. The packet buffer part of the delay is not updated during DTX/CNG
161   // periods.
162   //
163   int FilteredCurrentDelayMs() const;
164 
165   // Returns the current target delay for NetEq in ms.
166   //
167   int TargetDelayMs() const;
168 
169   //
170   // Get payload type and format of the last non-CNG/non-DTMF received payload.
171   // If no non-CNG/non-DTMF packet is received absl::nullopt is returned.
172   //
173   absl::optional<std::pair<int, SdpAudioFormat>> LastDecoder() const;
174 
175   //
176   // Enable NACK and set the maximum size of the NACK list. If NACK is already
177   // enabled then the maximum NACK list size is modified accordingly.
178   //
179   // If the sequence number of last received packet is N, the sequence numbers
180   // of NACK list are in the range of [N - |max_nack_list_size|, N).
181   //
182   // |max_nack_list_size| should be positive (none zero) and less than or
183   // equal to |Nack::kNackListSizeLimit|. Otherwise, No change is applied and -1
184   // is returned. 0 is returned at success.
185   //
186   int EnableNack(size_t max_nack_list_size);
187 
188   // Disable NACK.
189   void DisableNack();
190 
191   //
192   // Get a list of packets to be retransmitted. |round_trip_time_ms| is an
193   // estimate of the round-trip-time (in milliseconds). Missing packets which
194   // will be playout in a shorter time than the round-trip-time (with respect
195   // to the time this API is called) will not be included in the list.
196   //
197   // Negative |round_trip_time_ms| results is an error message and empty list
198   // is returned.
199   //
200   std::vector<uint16_t> GetNackList(int64_t round_trip_time_ms) const;
201 
202   //
203   // Get statistics of calls to GetAudio().
204   void GetDecodingCallStatistics(AudioDecodingCallStats* stats) const;
205 
206  private:
207   struct DecoderInfo {
208     int payload_type;
209     int sample_rate_hz;
210     int num_channels;
211     SdpAudioFormat sdp_format;
212   };
213 
214   uint32_t NowInTimestamp(int decoder_sampling_rate) const;
215 
216   mutable Mutex mutex_;
217   absl::optional<DecoderInfo> last_decoder_ RTC_GUARDED_BY(mutex_);
218   ACMResampler resampler_ RTC_GUARDED_BY(mutex_);
219   std::unique_ptr<int16_t[]> last_audio_buffer_ RTC_GUARDED_BY(mutex_);
220   CallStatistics call_stats_ RTC_GUARDED_BY(mutex_);
221   const std::unique_ptr<NetEq> neteq_;  // NetEq is thread-safe; no lock needed.
222   Clock* const clock_;
223   bool resampled_last_output_frame_ RTC_GUARDED_BY(mutex_);
224 };
225 
226 }  // namespace acm2
227 
228 }  // namespace webrtc
229 
230 #endif  // MODULES_AUDIO_CODING_ACM2_ACM_RECEIVER_H_
231