blob: 484721397ad49d667ed45c3e585cb6aa41c48e2f [file] [log] [blame]
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001/*
2 * Copyright (c) 2012 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
henrik.lundin@webrtc.org9c55f0f2014-06-09 08:10:28 +000011#ifndef WEBRTC_MODULES_AUDIO_CODING_NETEQ_INTERFACE_NETEQ_H_
12#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_INTERFACE_NETEQ_H_
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000013
pbos@webrtc.org12dc1a32013-08-05 16:22:53 +000014#include <string.h> // Provide access to size_t.
15
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000016#include <vector>
17
henrike@webrtc.org88fbb2d2014-05-21 21:18:46 +000018#include "webrtc/base/constructormagic.h"
sprang@webrtc.orgfe5d36b2013-10-28 09:21:07 +000019#include "webrtc/common_types.h"
kwiberg@webrtc.orge04a93b2014-12-09 10:12:53 +000020#include "webrtc/modules/audio_coding/neteq/audio_decoder_impl.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000021#include "webrtc/typedefs.h"
22
23namespace webrtc {
24
25// Forward declarations.
26struct WebRtcRTPHeader;
27
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000028struct NetEqNetworkStatistics {
29 uint16_t current_buffer_size_ms; // Current jitter buffer size in ms.
30 uint16_t preferred_buffer_size_ms; // Target buffer size in ms.
31 uint16_t jitter_peaks_found; // 1 if adding extra delay due to peaky
32 // jitter; 0 otherwise.
33 uint16_t packet_loss_rate; // Loss rate (network + late) in Q14.
34 uint16_t packet_discard_rate; // Late loss rate in Q14.
35 uint16_t expand_rate; // Fraction (of original stream) of synthesized
36 // speech inserted through expansion (in Q14).
37 uint16_t preemptive_rate; // Fraction of data inserted through pre-emptive
38 // expansion (in Q14).
39 uint16_t accelerate_rate; // Fraction of data removed through acceleration
40 // (in Q14).
minyue@webrtc.org2c1bcf22015-02-17 10:17:09 +000041 uint16_t secondary_decoded_rate; // Fraction of data coming from secondary
42 // decoding (in Q14).
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000043 int32_t clockdrift_ppm; // Average clock-drift in parts-per-million
44 // (positive or negative).
45 int added_zero_samples; // Number of zero samples added in "off" mode.
46};
47
48enum NetEqOutputType {
49 kOutputNormal,
50 kOutputPLC,
51 kOutputCNG,
52 kOutputPLCtoCNG,
53 kOutputVADPassive
54};
55
56enum NetEqPlayoutMode {
57 kPlayoutOn,
58 kPlayoutOff,
59 kPlayoutFax,
60 kPlayoutStreaming
61};
62
63// This is the interface class for NetEq.
64class NetEq {
65 public:
henrik.lundin@webrtc.orgea257842014-08-07 12:27:37 +000066 enum BackgroundNoiseMode {
67 kBgnOn, // Default behavior with eternal noise.
68 kBgnFade, // Noise fades to zero after some time.
69 kBgnOff // Background noise is always zero.
70 };
71
henrik.lundin@webrtc.org35ead382014-04-14 18:49:17 +000072 struct Config {
73 Config()
74 : sample_rate_hz(16000),
henrik.lundin@webrtc.org116ed1d2014-04-28 08:20:04 +000075 enable_audio_classifier(false),
76 max_packets_in_buffer(50),
77 // |max_delay_ms| has the same effect as calling SetMaximumDelay().
henrik.lundin@webrtc.orgea257842014-08-07 12:27:37 +000078 max_delay_ms(2000),
henrik.lundin@webrtc.org7cbc4f92014-10-07 06:37:39 +000079 background_noise_mode(kBgnOff),
80 playout_mode(kPlayoutOn) {}
henrik.lundin@webrtc.org35ead382014-04-14 18:49:17 +000081
82 int sample_rate_hz; // Initial vale. Will change with input data.
83 bool enable_audio_classifier;
henrik.lundin@webrtc.org116ed1d2014-04-28 08:20:04 +000084 int max_packets_in_buffer;
85 int max_delay_ms;
henrik.lundin@webrtc.orgea257842014-08-07 12:27:37 +000086 BackgroundNoiseMode background_noise_mode;
henrik.lundin@webrtc.org7cbc4f92014-10-07 06:37:39 +000087 NetEqPlayoutMode playout_mode;
henrik.lundin@webrtc.org35ead382014-04-14 18:49:17 +000088 };
89
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000090 enum ReturnCodes {
91 kOK = 0,
92 kFail = -1,
93 kNotImplemented = -2
94 };
95
96 enum ErrorCodes {
97 kNoError = 0,
98 kOtherError,
99 kInvalidRtpPayloadType,
100 kUnknownRtpPayloadType,
101 kCodecNotSupported,
102 kDecoderExists,
103 kDecoderNotFound,
104 kInvalidSampleRate,
105 kInvalidPointer,
106 kAccelerateError,
107 kPreemptiveExpandError,
108 kComfortNoiseErrorCode,
109 kDecoderErrorCode,
110 kOtherDecoderError,
111 kInvalidOperation,
112 kDtmfParameterError,
113 kDtmfParsingError,
114 kDtmfInsertError,
115 kStereoNotSupported,
116 kSampleUnderrun,
117 kDecodedTooMuch,
118 kFrameSplitError,
119 kRedundancySplitError,
minyue@webrtc.org7bb54362013-08-06 05:40:57 +0000120 kPacketBufferCorruption,
turaj@webrtc.org7b75ac62013-09-26 00:27:56 +0000121 kSyncPacketNotAccepted
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000122 };
123
henrik.lundin@webrtc.org35ead382014-04-14 18:49:17 +0000124 // Creates a new NetEq object, with parameters set in |config|. The |config|
125 // object will only have to be valid for the duration of the call to this
126 // method.
127 static NetEq* Create(const NetEq::Config& config);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000128
129 virtual ~NetEq() {}
130
131 // Inserts a new packet into NetEq. The |receive_timestamp| is an indication
132 // of the time when the packet was received, and should be measured with
133 // the same tick rate as the RTP timestamp of the current payload.
134 // Returns 0 on success, -1 on failure.
135 virtual int InsertPacket(const WebRtcRTPHeader& rtp_header,
136 const uint8_t* payload,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000137 size_t length_bytes,
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000138 uint32_t receive_timestamp) = 0;
139
turaj@webrtc.org7b75ac62013-09-26 00:27:56 +0000140 // Inserts a sync-packet into packet queue. Sync-packets are decoded to
141 // silence and are intended to keep AV-sync intact in an event of long packet
142 // losses when Video NACK is enabled but Audio NACK is not. Clients of NetEq
143 // might insert sync-packet when they observe that buffer level of NetEq is
144 // decreasing below a certain threshold, defined by the application.
145 // Sync-packets should have the same payload type as the last audio payload
146 // type, i.e. they cannot have DTMF or CNG payload type, nor a codec change
147 // can be implied by inserting a sync-packet.
148 // Returns kOk on success, kFail on failure.
149 virtual int InsertSyncPacket(const WebRtcRTPHeader& rtp_header,
150 uint32_t receive_timestamp) = 0;
151
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000152 // Instructs NetEq to deliver 10 ms of audio data. The data is written to
153 // |output_audio|, which can hold (at least) |max_length| elements.
154 // The number of channels that were written to the output is provided in
155 // the output variable |num_channels|, and each channel contains
156 // |samples_per_channel| elements. If more than one channel is written,
157 // the samples are interleaved.
158 // The speech type is written to |type|, if |type| is not NULL.
159 // Returns kOK on success, or kFail in case of an error.
160 virtual int GetAudio(size_t max_length, int16_t* output_audio,
161 int* samples_per_channel, int* num_channels,
162 NetEqOutputType* type) = 0;
163
164 // Associates |rtp_payload_type| with |codec| and stores the information in
165 // the codec database. Returns 0 on success, -1 on failure.
166 virtual int RegisterPayloadType(enum NetEqDecoder codec,
167 uint8_t rtp_payload_type) = 0;
168
169 // Provides an externally created decoder object |decoder| to insert in the
170 // decoder database. The decoder implements a decoder of type |codec| and
turaj@webrtc.orga596a382014-04-17 23:30:49 +0000171 // associates it with |rtp_payload_type|. Returns kOK on success,
172 // kFail on failure.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000173 virtual int RegisterExternalDecoder(AudioDecoder* decoder,
174 enum NetEqDecoder codec,
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000175 uint8_t rtp_payload_type) = 0;
176
177 // Removes |rtp_payload_type| from the codec database. Returns 0 on success,
178 // -1 on failure.
179 virtual int RemovePayloadType(uint8_t rtp_payload_type) = 0;
180
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000181 // Sets a minimum delay in millisecond for packet buffer. The minimum is
182 // maintained unless a higher latency is dictated by channel condition.
183 // Returns true if the minimum is successfully applied, otherwise false is
184 // returned.
185 virtual bool SetMinimumDelay(int delay_ms) = 0;
186
187 // Sets a maximum delay in milliseconds for packet buffer. The latency will
188 // not exceed the given value, even required delay (given the channel
henrik.lundin@webrtc.org116ed1d2014-04-28 08:20:04 +0000189 // conditions) is higher. Calling this method has the same effect as setting
190 // the |max_delay_ms| value in the NetEq::Config struct.
turaj@webrtc.orgf1efc572013-08-16 23:44:24 +0000191 virtual bool SetMaximumDelay(int delay_ms) = 0;
192
193 // The smallest latency required. This is computed bases on inter-arrival
194 // time and internal NetEq logic. Note that in computing this latency none of
195 // the user defined limits (applied by calling setMinimumDelay() and/or
196 // SetMaximumDelay()) are applied.
197 virtual int LeastRequiredDelayMs() const = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000198
199 // Not implemented.
200 virtual int SetTargetDelay() = 0;
201
202 // Not implemented.
203 virtual int TargetDelay() = 0;
204
205 // Not implemented.
206 virtual int CurrentDelay() = 0;
207
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000208 // Sets the playout mode to |mode|.
henrik.lundin@webrtc.org7cbc4f92014-10-07 06:37:39 +0000209 // Deprecated. Set the mode in the Config struct passed to the constructor.
210 // TODO(henrik.lundin) Delete.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000211 virtual void SetPlayoutMode(NetEqPlayoutMode mode) = 0;
212
213 // Returns the current playout mode.
henrik.lundin@webrtc.org7cbc4f92014-10-07 06:37:39 +0000214 // Deprecated.
215 // TODO(henrik.lundin) Delete.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000216 virtual NetEqPlayoutMode PlayoutMode() const = 0;
217
218 // Writes the current network statistics to |stats|. The statistics are reset
219 // after the call.
220 virtual int NetworkStatistics(NetEqNetworkStatistics* stats) = 0;
221
222 // Writes the last packet waiting times (in ms) to |waiting_times|. The number
223 // of values written is no more than 100, but may be smaller if the interface
224 // is polled again before 100 packets has arrived.
225 virtual void WaitingTimes(std::vector<int>* waiting_times) = 0;
226
227 // Writes the current RTCP statistics to |stats|. The statistics are reset
228 // and a new report period is started with the call.
229 virtual void GetRtcpStatistics(RtcpStatistics* stats) = 0;
230
231 // Same as RtcpStatistics(), but does not reset anything.
232 virtual void GetRtcpStatisticsNoReset(RtcpStatistics* stats) = 0;
233
234 // Enables post-decode VAD. When enabled, GetAudio() will return
235 // kOutputVADPassive when the signal contains no speech.
236 virtual void EnableVad() = 0;
237
238 // Disables post-decode VAD.
239 virtual void DisableVad() = 0;
240
wu@webrtc.org94454b72014-06-05 20:34:08 +0000241 // Gets the RTP timestamp for the last sample delivered by GetAudio().
242 // Returns true if the RTP timestamp is valid, otherwise false.
243 virtual bool GetPlayoutTimestamp(uint32_t* timestamp) = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000244
245 // Not implemented.
246 virtual int SetTargetNumberOfChannels() = 0;
247
248 // Not implemented.
249 virtual int SetTargetSampleRate() = 0;
250
251 // Returns the error code for the last occurred error. If no error has
252 // occurred, 0 is returned.
henrik.lundin@webrtc.orgb0f4b3d2014-11-04 08:53:10 +0000253 virtual int LastError() const = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000254
255 // Returns the error code last returned by a decoder (audio or comfort noise).
256 // When LastError() returns kDecoderErrorCode or kComfortNoiseErrorCode, check
257 // this method to get the decoder's error code.
258 virtual int LastDecoderError() = 0;
259
260 // Flushes both the packet buffer and the sync buffer.
261 virtual void FlushBuffers() = 0;
262
turaj@webrtc.org7df97062013-08-02 18:07:13 +0000263 // Current usage of packet-buffer and it's limits.
264 virtual void PacketBufferStatistics(int* current_num_packets,
henrik.lundin@webrtc.org116ed1d2014-04-28 08:20:04 +0000265 int* max_num_packets) const = 0;
turaj@webrtc.org7df97062013-08-02 18:07:13 +0000266
minyue@webrtc.orgd7301772013-08-29 00:58:14 +0000267 // Get sequence number and timestamp of the latest RTP.
268 // This method is to facilitate NACK.
turaj@webrtc.orgff43c852013-09-25 00:07:27 +0000269 virtual int DecodedRtpInfo(int* sequence_number,
270 uint32_t* timestamp) const = 0;
minyue@webrtc.orgd7301772013-08-29 00:58:14 +0000271
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000272 protected:
273 NetEq() {}
274
275 private:
276 DISALLOW_COPY_AND_ASSIGN(NetEq);
277};
278
279} // namespace webrtc
henrik.lundin@webrtc.org9c55f0f2014-06-09 08:10:28 +0000280#endif // WEBRTC_MODULES_AUDIO_CODING_NETEQ_INTERFACE_NETEQ_H_