blob: 77eb563972377197c5d61c635248e04db209c4a1 [file] [log] [blame]
turaj@webrtc.org7959e162013-09-12 18:30:26 +00001/*
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
kjellander3e6db232015-11-26 04:44:54 -080011#ifndef WEBRTC_MODULES_AUDIO_CODING_ACM2_ACM_RECEIVER_H_
12#define WEBRTC_MODULES_AUDIO_CODING_ACM2_ACM_RECEIVER_H_
turaj@webrtc.org7959e162013-09-12 18:30:26 +000013
jmarusic@webrtc.orga4bef3e2015-03-23 11:19:35 +000014#include <map>
kwiberg16c5a962016-02-15 02:27:22 -080015#include <memory>
henrik.lundin4cf61dd2015-12-09 06:20:58 -080016#include <string>
turaj@webrtc.org7959e162013-09-12 18:30:26 +000017#include <vector>
18
kwibergee2bac22015-11-11 10:34:00 -080019#include "webrtc/base/array_view.h"
Tommi9090e0b2016-01-20 13:39:36 +010020#include "webrtc/base/criticalsection.h"
henrik.lundin057fb892015-11-23 08:19:52 -080021#include "webrtc/base/optional.h"
pbos@webrtc.org38344ed2014-09-24 06:05:00 +000022#include "webrtc/base/thread_annotations.h"
turaj@webrtc.org7959e162013-09-12 18:30:26 +000023#include "webrtc/common_audio/vad/include/webrtc_vad.h"
24#include "webrtc/engine_configurations.h"
kjellander3e6db232015-11-26 04:44:54 -080025#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"
Tommi9090e0b2016-01-20 13:39:36 +010028#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
Henrik Kjellander74640892015-10-29 11:31:02 +010029#include "webrtc/modules/audio_coding/neteq/include/neteq.h"
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010030#include "webrtc/modules/include/module_common_types.h"
turaj@webrtc.org7959e162013-09-12 18:30:26 +000031#include "webrtc/typedefs.h"
32
33namespace webrtc {
34
turaj@webrtc.org6d5d2482013-10-06 04:47:28 +000035struct CodecInst;
turaj@webrtc.org7959e162013-09-12 18:30:26 +000036class NetEq;
turaj@webrtc.org6d5d2482013-10-06 04:47:28 +000037
38namespace acm2 {
39
turaj@webrtc.org7959e162013-09-12 18:30:26 +000040class AcmReceiver {
41 public:
42 struct Decoder {
jmarusic@webrtc.orga4bef3e2015-03-23 11:19:35 +000043 int acm_codec_id;
turaj@webrtc.org7959e162013-09-12 18:30:26 +000044 uint8_t payload_type;
45 // This field is meaningful for codecs where both mono and
46 // stereo versions are registered under the same ID.
Peter Kasting69558702016-01-12 16:26:35 -080047 size_t channels;
Karl Wibergd8399e62015-05-25 14:39:56 +020048 int sample_rate_hz;
turaj@webrtc.org7959e162013-09-12 18:30:26 +000049 };
50
51 // Constructor of the class
henrik.lundin@webrtc.org0bc9b5a2014-04-29 08:09:31 +000052 explicit AcmReceiver(const AudioCodingModule::Config& config);
turaj@webrtc.org7959e162013-09-12 18:30:26 +000053
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,
kwibergee2bac22015-11-11 10:34:00 -080071 rtc::ArrayView<const uint8_t> incoming_payload);
turaj@webrtc.org7959e162013-09-12 18:30:26 +000072
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:
kwiberg4e14f092015-08-24 05:27:22 -070095 // - acm_codec_id : ACM codec ID; -1 means external decoder.
turaj@webrtc.org7959e162013-09-12 18:30:26 +000096 // - payload_type : payload type.
Karl Wibergd8399e62015-05-25 14:39:56 +020097 // - sample_rate_hz : sample rate.
kwiberg4e14f092015-08-24 05:27:22 -070098 // - 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).
turaj@webrtc.org7959e162013-09-12 18:30:26 +0000113 //
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,
Peter Kasting69558702016-01-12 16:26:35 -0800119 size_t channels,
Karl Wibergd8399e62015-05-25 14:39:56 +0200120 int sample_rate_hz,
henrik.lundin4cf61dd2015-12-09 06:20:58 -0800121 AudioDecoder* audio_decoder,
122 const std::string& name);
turaj@webrtc.org7959e162013-09-12 18:30:26 +0000123
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 //
turaj@webrtc.org7959e162013-09-12 18:30:26 +0000156 // Resets the initial delay to zero.
157 //
158 void ResetInitialDelay();
159
henrik.lundin057fb892015-11-23 08:19:52 -0800160 // 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
henrik.lundind89814b2015-11-23 06:49:25 -0800166 // Returns last_output_sample_rate_hz from the NetEq instance.
167 int last_output_sample_rate_hz() const;
turaj@webrtc.org7959e162013-09-12 18:30:26 +0000168
169 //
turaj@webrtc.org7959e162013-09-12 18:30:26 +0000170 // Get the current network statistics from NetEq.
171 //
172 // Output:
173 // - statistics : The current network statistics.
174 //
minyue@webrtc.orgc0bd7be2015-02-18 15:24:13 +0000175 void GetNetworkStatistics(NetworkStatistics* statistics);
turaj@webrtc.org7959e162013-09-12 18:30:26 +0000176
177 //
turaj@webrtc.org7959e162013-09-12 18:30:26 +0000178 // Flushes the NetEq packet and speech buffers.
179 //
180 void FlushBuffers();
181
182 //
183 // Removes a payload-type from the NetEq codec database.
184 //
185 // Input:
186 // - payload_type : the payload-type to be removed.
187 //
188 // Return value : 0 if OK.
189 // -1 if an error occurred.
190 //
191 int RemoveCodec(uint8_t payload_type);
192
193 //
194 // Remove all registered codecs.
195 //
196 int RemoveAllCodecs();
197
198 //
wu@webrtc.org94454b72014-06-05 20:34:08 +0000199 // Gets the RTP timestamp of the last sample delivered by GetAudio().
200 // Returns true if the RTP timestamp is valid, otherwise false.
turaj@webrtc.org7959e162013-09-12 18:30:26 +0000201 //
wu@webrtc.org94454b72014-06-05 20:34:08 +0000202 bool GetPlayoutTimestamp(uint32_t* timestamp);
turaj@webrtc.org7959e162013-09-12 18:30:26 +0000203
204 //
turaj@webrtc.org7959e162013-09-12 18:30:26 +0000205 // Get the audio codec associated with the last non-CNG/non-DTMF received
206 // payload. If no non-CNG/non-DTMF packet is received -1 is returned,
207 // otherwise return 0.
208 //
209 int LastAudioCodec(CodecInst* codec) const;
210
211 //
turaj@webrtc.org7959e162013-09-12 18:30:26 +0000212 // Get a decoder given its registered payload-type.
213 //
214 // Input:
215 // -payload_type : the payload-type of the codec to be retrieved.
216 //
217 // Output:
218 // -codec : codec associated with the given payload-type.
219 //
220 // Return value : 0 if succeeded.
221 // -1 if failed, e.g. given payload-type is not
222 // registered.
223 //
224 int DecoderByPayloadType(uint8_t payload_type,
225 CodecInst* codec) const;
226
227 //
228 // Enable NACK and set the maximum size of the NACK list. If NACK is already
229 // enabled then the maximum NACK list size is modified accordingly.
230 //
231 // Input:
232 // -max_nack_list_size : maximum NACK list size
233 // should be positive (none zero) and less than or
234 // equal to |Nack::kNackListSizeLimit|
235 // Return value
236 // : 0 if succeeded.
237 // -1 if failed
238 //
239 int EnableNack(size_t max_nack_list_size);
240
241 // Disable NACK.
242 void DisableNack();
243
244 //
245 // Get a list of packets to be retransmitted.
246 //
247 // Input:
248 // -round_trip_time_ms : estimate of the round-trip-time (in milliseconds).
249 // Return value : list of packets to be retransmitted.
250 //
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000251 std::vector<uint16_t> GetNackList(int64_t round_trip_time_ms) const;
turaj@webrtc.org7959e162013-09-12 18:30:26 +0000252
253 //
wu@webrtc.org24301a62013-12-13 19:17:43 +0000254 // Get statistics of calls to GetAudio().
255 void GetDecodingCallStatistics(AudioDecodingCallStats* stats) const;
256
turaj@webrtc.org7959e162013-09-12 18:30:26 +0000257 private:
Jelena Marusica9907842015-03-26 14:01:30 +0100258 const Decoder* RtpHeaderToDecoder(const RTPHeader& rtp_header,
kwibergee2bac22015-11-11 10:34:00 -0800259 uint8_t payload_type) const
Jelena Marusica9907842015-03-26 14:01:30 +0100260 EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
turaj@webrtc.org7959e162013-09-12 18:30:26 +0000261
262 uint32_t NowInTimestamp(int decoder_sampling_rate) const;
263
pbos5ad935c2016-01-25 03:52:44 -0800264 rtc::CriticalSection crit_sect_;
Jelena Marusica9907842015-03-26 14:01:30 +0100265 const Decoder* last_audio_decoder_ GUARDED_BY(crit_sect_);
henrik.lundin@webrtc.orga90abde2014-06-09 18:35:11 +0000266 ACMResampler resampler_ GUARDED_BY(crit_sect_);
kwiberg16c5a962016-02-15 02:27:22 -0800267 std::unique_ptr<int16_t[]> last_audio_buffer_ GUARDED_BY(crit_sect_);
henrik.lundin@webrtc.orga90abde2014-06-09 18:35:11 +0000268 CallStatistics call_stats_ GUARDED_BY(crit_sect_);
turaj@webrtc.org7959e162013-09-12 18:30:26 +0000269 NetEq* neteq_;
Jelena Marusica9907842015-03-26 14:01:30 +0100270 // Decoders map is keyed by payload type
271 std::map<uint8_t, Decoder> decoders_ GUARDED_BY(crit_sect_);
henrik.lundin@webrtc.orga90abde2014-06-09 18:35:11 +0000272 Clock* clock_; // TODO(henrik.lundin) Make const if possible.
henrik.lundin@webrtc.org913f7b82014-10-21 06:54:23 +0000273 bool resampled_last_output_frame_ GUARDED_BY(crit_sect_);
henrik.lundin057fb892015-11-23 08:19:52 -0800274 rtc::Optional<int> last_packet_sample_rate_hz_ GUARDED_BY(crit_sect_);
turaj@webrtc.org7959e162013-09-12 18:30:26 +0000275};
276
turaj@webrtc.org6d5d2482013-10-06 04:47:28 +0000277} // namespace acm2
278
turaj@webrtc.org7959e162013-09-12 18:30:26 +0000279} // namespace webrtc
280
kjellander3e6db232015-11-26 04:44:54 -0800281#endif // WEBRTC_MODULES_AUDIO_CODING_ACM2_ACM_RECEIVER_H_