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 WEBRTC_MODULES_AUDIO_CODING_ACM2_ACM_RECEIVER_H_ 12 #define WEBRTC_MODULES_AUDIO_CODING_ACM2_ACM_RECEIVER_H_ 13 14 #include <map> 15 #include <string> 16 #include <vector> 17 18 #include "webrtc/base/array_view.h" 19 #include "webrtc/base/optional.h" 20 #include "webrtc/base/scoped_ptr.h" 21 #include "webrtc/base/thread_annotations.h" 22 #include "webrtc/common_audio/vad/include/webrtc_vad.h" 23 #include "webrtc/engine_configurations.h" 24 #include "webrtc/modules/audio_coding/include/audio_coding_module.h" 25 #include "webrtc/modules/audio_coding/acm2/acm_resampler.h" 26 #include "webrtc/modules/audio_coding/acm2/call_statistics.h" 27 #include "webrtc/modules/audio_coding/acm2/initial_delay_manager.h" 28 #include "webrtc/modules/audio_coding/neteq/include/neteq.h" 29 #include "webrtc/modules/include/module_common_types.h" 30 #include "webrtc/typedefs.h" 31 32 namespace webrtc { 33 34 struct CodecInst; 35 class CriticalSectionWrapper; 36 class NetEq; 37 38 namespace acm2 { 39 40 class AcmReceiver { 41 public: 42 struct Decoder { 43 int acm_codec_id; 44 uint8_t payload_type; 45 // This field is meaningful for codecs where both mono and 46 // stereo versions are registered under the same ID. 47 size_t channels; 48 int sample_rate_hz; 49 }; 50 51 // Constructor of the class 52 explicit AcmReceiver(const AudioCodingModule::Config& config); 53 54 // Destructor of the class. 55 ~AcmReceiver(); 56 57 // 58 // Inserts a payload with its associated RTP-header into NetEq. 59 // 60 // Input: 61 // - rtp_header : RTP header for the incoming payload containing 62 // information about payload type, sequence number, 63 // timestamp, SSRC and marker bit. 64 // - incoming_payload : Incoming audio payload. 65 // - length_payload : Length of incoming audio payload in bytes. 66 // 67 // Return value : 0 if OK. 68 // <0 if NetEq returned an error. 69 // 70 int InsertPacket(const WebRtcRTPHeader& rtp_header, 71 rtc::ArrayView<const uint8_t> incoming_payload); 72 73 // 74 // Asks NetEq for 10 milliseconds of decoded audio. 75 // 76 // Input: 77 // -desired_freq_hz : specifies the sampling rate [Hz] of the output 78 // audio. If set -1 indicates to resampling is 79 // is required and the audio returned at the 80 // sampling rate of the decoder. 81 // 82 // Output: 83 // -audio_frame : an audio frame were output data and 84 // associated parameters are written to. 85 // 86 // Return value : 0 if OK. 87 // -1 if NetEq returned an error. 88 // 89 int GetAudio(int desired_freq_hz, AudioFrame* audio_frame); 90 91 // 92 // Adds a new codec to the NetEq codec database. 93 // 94 // Input: 95 // - acm_codec_id : ACM codec ID; -1 means external decoder. 96 // - payload_type : payload type. 97 // - sample_rate_hz : sample rate. 98 // - audio_decoder : pointer to a decoder object. If it's null, then 99 // NetEq will internally create a decoder object 100 // based on the value of |acm_codec_id| (which 101 // mustn't be -1). Otherwise, NetEq will use the 102 // given decoder for the given payload type. NetEq 103 // won't take ownership of the decoder; it's up to 104 // the caller to delete it when it's no longer 105 // needed. 106 // 107 // Providing an existing decoder object here is 108 // necessary for external decoders, but may also be 109 // used for built-in decoders if NetEq doesn't have 110 // all the info it needs to construct them properly 111 // (e.g. iSAC, where the decoder needs to be paired 112 // with an encoder). 113 // 114 // Return value : 0 if OK. 115 // <0 if NetEq returned an error. 116 // 117 int AddCodec(int acm_codec_id, 118 uint8_t payload_type, 119 size_t channels, 120 int sample_rate_hz, 121 AudioDecoder* audio_decoder, 122 const std::string& name); 123 124 // 125 // Sets a minimum delay for packet buffer. The given delay is maintained, 126 // unless channel condition dictates a higher delay. 127 // 128 // Input: 129 // - delay_ms : minimum delay in milliseconds. 130 // 131 // Return value : 0 if OK. 132 // <0 if NetEq returned an error. 133 // 134 int SetMinimumDelay(int delay_ms); 135 136 // 137 // Sets a maximum delay [ms] for the packet buffer. The target delay does not 138 // exceed the given value, even if channel condition requires so. 139 // 140 // Input: 141 // - delay_ms : maximum delay in milliseconds. 142 // 143 // Return value : 0 if OK. 144 // <0 if NetEq returned an error. 145 // 146 int SetMaximumDelay(int delay_ms); 147 148 // 149 // Get least required delay computed based on channel conditions. Note that 150 // this is before applying any user-defined limits (specified by calling 151 // (SetMinimumDelay() and/or SetMaximumDelay()). 152 // 153 int LeastRequiredDelayMs() const; 154 155 // 156 // Resets the initial delay to zero. 157 // 158 void ResetInitialDelay(); 159 160 // Returns the sample rate of the decoder associated with the last incoming 161 // packet. If no packet of a registered non-CNG codec has been received, the 162 // return value is empty. Also, if the decoder was unregistered since the last 163 // packet was inserted, the return value is empty. 164 rtc::Optional<int> last_packet_sample_rate_hz() const; 165 166 // Returns last_output_sample_rate_hz from the NetEq instance. 167 int last_output_sample_rate_hz() const; 168 169 // 170 // Get the current network statistics from NetEq. 171 // 172 // Output: 173 // - statistics : The current network statistics. 174 // 175 void GetNetworkStatistics(NetworkStatistics* statistics); 176 177 // 178 // Enable post-decoding VAD. 179 // 180 void EnableVad(); 181 182 // 183 // Disable post-decoding VAD. 184 // 185 void DisableVad(); 186 187 // 188 // Returns whether post-decoding VAD is enabled (true) or disabled (false). 189 // vad_enabled()190 bool vad_enabled() const { return vad_enabled_; } 191 192 // 193 // Flushes the NetEq packet and speech buffers. 194 // 195 void FlushBuffers(); 196 197 // 198 // Removes a payload-type from the NetEq codec database. 199 // 200 // Input: 201 // - payload_type : the payload-type to be removed. 202 // 203 // Return value : 0 if OK. 204 // -1 if an error occurred. 205 // 206 int RemoveCodec(uint8_t payload_type); 207 208 // 209 // Remove all registered codecs. 210 // 211 int RemoveAllCodecs(); 212 213 // 214 // Set ID. 215 // 216 void set_id(int id); // TODO(turajs): can be inline. 217 218 // 219 // Gets the RTP timestamp of the last sample delivered by GetAudio(). 220 // Returns true if the RTP timestamp is valid, otherwise false. 221 // 222 bool GetPlayoutTimestamp(uint32_t* timestamp); 223 224 // 225 // Get the audio codec associated with the last non-CNG/non-DTMF received 226 // payload. If no non-CNG/non-DTMF packet is received -1 is returned, 227 // otherwise return 0. 228 // 229 int LastAudioCodec(CodecInst* codec) const; 230 231 // 232 // Get a decoder given its registered payload-type. 233 // 234 // Input: 235 // -payload_type : the payload-type of the codec to be retrieved. 236 // 237 // Output: 238 // -codec : codec associated with the given payload-type. 239 // 240 // Return value : 0 if succeeded. 241 // -1 if failed, e.g. given payload-type is not 242 // registered. 243 // 244 int DecoderByPayloadType(uint8_t payload_type, 245 CodecInst* codec) const; 246 247 // 248 // Enable NACK and set the maximum size of the NACK list. If NACK is already 249 // enabled then the maximum NACK list size is modified accordingly. 250 // 251 // Input: 252 // -max_nack_list_size : maximum NACK list size 253 // should be positive (none zero) and less than or 254 // equal to |Nack::kNackListSizeLimit| 255 // Return value 256 // : 0 if succeeded. 257 // -1 if failed 258 // 259 int EnableNack(size_t max_nack_list_size); 260 261 // Disable NACK. 262 void DisableNack(); 263 264 // 265 // Get a list of packets to be retransmitted. 266 // 267 // Input: 268 // -round_trip_time_ms : estimate of the round-trip-time (in milliseconds). 269 // Return value : list of packets to be retransmitted. 270 // 271 std::vector<uint16_t> GetNackList(int64_t round_trip_time_ms) const; 272 273 // 274 // Get statistics of calls to GetAudio(). 275 void GetDecodingCallStatistics(AudioDecodingCallStats* stats) const; 276 277 private: 278 const Decoder* RtpHeaderToDecoder(const RTPHeader& rtp_header, 279 uint8_t payload_type) const 280 EXCLUSIVE_LOCKS_REQUIRED(crit_sect_); 281 282 uint32_t NowInTimestamp(int decoder_sampling_rate) const; 283 284 rtc::scoped_ptr<CriticalSectionWrapper> crit_sect_; 285 int id_; // TODO(henrik.lundin) Make const. 286 const Decoder* last_audio_decoder_ GUARDED_BY(crit_sect_); 287 AudioFrame::VADActivity previous_audio_activity_ GUARDED_BY(crit_sect_); 288 ACMResampler resampler_ GUARDED_BY(crit_sect_); 289 // Used in GetAudio, declared as member to avoid allocating every 10ms. 290 // TODO(henrik.lundin) Stack-allocate in GetAudio instead? 291 rtc::scoped_ptr<int16_t[]> audio_buffer_ GUARDED_BY(crit_sect_); 292 rtc::scoped_ptr<int16_t[]> last_audio_buffer_ GUARDED_BY(crit_sect_); 293 CallStatistics call_stats_ GUARDED_BY(crit_sect_); 294 NetEq* neteq_; 295 // Decoders map is keyed by payload type 296 std::map<uint8_t, Decoder> decoders_ GUARDED_BY(crit_sect_); 297 bool vad_enabled_; 298 Clock* clock_; // TODO(henrik.lundin) Make const if possible. 299 bool resampled_last_output_frame_ GUARDED_BY(crit_sect_); 300 rtc::Optional<int> last_packet_sample_rate_hz_ GUARDED_BY(crit_sect_); 301 }; 302 303 } // namespace acm2 304 305 } // namespace webrtc 306 307 #endif // WEBRTC_MODULES_AUDIO_CODING_ACM2_ACM_RECEIVER_H_ 308