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) const; 142 143 // 144 // Flushes the NetEq packet and speech buffers. 145 // 146 void FlushBuffers(); 147 148 // 149 // Remove all registered codecs. 150 // 151 void RemoveAllCodecs(); 152 153 // Returns the RTP timestamp for the last sample delivered by GetAudio(). 154 // The return value will be empty if no valid timestamp is available. 155 absl::optional<uint32_t> GetPlayoutTimestamp(); 156 157 // Returns the current total delay from NetEq (packet buffer and sync buffer) 158 // in ms, with smoothing applied to even out short-time fluctuations due to 159 // jitter. The packet buffer part of the delay is not updated during DTX/CNG 160 // periods. 161 // 162 int FilteredCurrentDelayMs() const; 163 164 // Returns the current target delay for NetEq in ms. 165 // 166 int TargetDelayMs() const; 167 168 // 169 // Get payload type and format of the last non-CNG/non-DTMF received payload. 170 // If no non-CNG/non-DTMF packet is received absl::nullopt is returned. 171 // 172 absl::optional<std::pair<int, SdpAudioFormat>> LastDecoder() const; 173 174 // 175 // Enable NACK and set the maximum size of the NACK list. If NACK is already 176 // enabled then the maximum NACK list size is modified accordingly. 177 // 178 // If the sequence number of last received packet is N, the sequence numbers 179 // of NACK list are in the range of [N - |max_nack_list_size|, N). 180 // 181 // |max_nack_list_size| should be positive (none zero) and less than or 182 // equal to |Nack::kNackListSizeLimit|. Otherwise, No change is applied and -1 183 // is returned. 0 is returned at success. 184 // 185 int EnableNack(size_t max_nack_list_size); 186 187 // Disable NACK. 188 void DisableNack(); 189 190 // 191 // Get a list of packets to be retransmitted. |round_trip_time_ms| is an 192 // estimate of the round-trip-time (in milliseconds). Missing packets which 193 // will be playout in a shorter time than the round-trip-time (with respect 194 // to the time this API is called) will not be included in the list. 195 // 196 // Negative |round_trip_time_ms| results is an error message and empty list 197 // is returned. 198 // 199 std::vector<uint16_t> GetNackList(int64_t round_trip_time_ms) const; 200 201 // 202 // Get statistics of calls to GetAudio(). 203 void GetDecodingCallStatistics(AudioDecodingCallStats* stats) const; 204 205 private: 206 struct DecoderInfo { 207 int payload_type; 208 int sample_rate_hz; 209 int num_channels; 210 SdpAudioFormat sdp_format; 211 }; 212 213 uint32_t NowInTimestamp(int decoder_sampling_rate) const; 214 215 mutable Mutex mutex_; 216 absl::optional<DecoderInfo> last_decoder_ RTC_GUARDED_BY(mutex_); 217 ACMResampler resampler_ RTC_GUARDED_BY(mutex_); 218 std::unique_ptr<int16_t[]> last_audio_buffer_ RTC_GUARDED_BY(mutex_); 219 CallStatistics call_stats_ RTC_GUARDED_BY(mutex_); 220 const std::unique_ptr<NetEq> neteq_; // NetEq is thread-safe; no lock needed. 221 Clock* const clock_; 222 bool resampled_last_output_frame_ RTC_GUARDED_BY(mutex_); 223 }; 224 225 } // namespace acm2 226 227 } // namespace webrtc 228 229 #endif // MODULES_AUDIO_CODING_ACM2_ACM_RECEIVER_H_ 230