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