xref: /aosp_15_r20/external/webrtc/api/neteq/neteq.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #ifndef API_NETEQ_NETEQ_H_
12*d9f75844SAndroid Build Coastguard Worker #define API_NETEQ_NETEQ_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <stddef.h>  // Provide access to size_t.
15*d9f75844SAndroid Build Coastguard Worker 
16*d9f75844SAndroid Build Coastguard Worker #include <map>
17*d9f75844SAndroid Build Coastguard Worker #include <string>
18*d9f75844SAndroid Build Coastguard Worker #include <vector>
19*d9f75844SAndroid Build Coastguard Worker 
20*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h"
21*d9f75844SAndroid Build Coastguard Worker #include "api/audio_codecs/audio_codec_pair_id.h"
22*d9f75844SAndroid Build Coastguard Worker #include "api/audio_codecs/audio_decoder.h"
23*d9f75844SAndroid Build Coastguard Worker #include "api/audio_codecs/audio_format.h"
24*d9f75844SAndroid Build Coastguard Worker #include "api/rtp_headers.h"
25*d9f75844SAndroid Build Coastguard Worker #include "api/scoped_refptr.h"
26*d9f75844SAndroid Build Coastguard Worker 
27*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
28*d9f75844SAndroid Build Coastguard Worker 
29*d9f75844SAndroid Build Coastguard Worker // Forward declarations.
30*d9f75844SAndroid Build Coastguard Worker class AudioFrame;
31*d9f75844SAndroid Build Coastguard Worker class AudioDecoderFactory;
32*d9f75844SAndroid Build Coastguard Worker class Clock;
33*d9f75844SAndroid Build Coastguard Worker 
34*d9f75844SAndroid Build Coastguard Worker struct NetEqNetworkStatistics {
35*d9f75844SAndroid Build Coastguard Worker   uint16_t current_buffer_size_ms;    // Current jitter buffer size in ms.
36*d9f75844SAndroid Build Coastguard Worker   uint16_t preferred_buffer_size_ms;  // Target buffer size in ms.
37*d9f75844SAndroid Build Coastguard Worker   uint16_t jitter_peaks_found;        // 1 if adding extra delay due to peaky
38*d9f75844SAndroid Build Coastguard Worker                                       // jitter; 0 otherwise.
39*d9f75844SAndroid Build Coastguard Worker   uint16_t expand_rate;         // Fraction (of original stream) of synthesized
40*d9f75844SAndroid Build Coastguard Worker                                 // audio inserted through expansion (in Q14).
41*d9f75844SAndroid Build Coastguard Worker   uint16_t speech_expand_rate;  // Fraction (of original stream) of synthesized
42*d9f75844SAndroid Build Coastguard Worker                                 // speech inserted through expansion (in Q14).
43*d9f75844SAndroid Build Coastguard Worker   uint16_t preemptive_rate;     // Fraction of data inserted through pre-emptive
44*d9f75844SAndroid Build Coastguard Worker                                 // expansion (in Q14).
45*d9f75844SAndroid Build Coastguard Worker   uint16_t accelerate_rate;     // Fraction of data removed through acceleration
46*d9f75844SAndroid Build Coastguard Worker                                 // (in Q14).
47*d9f75844SAndroid Build Coastguard Worker   uint16_t secondary_decoded_rate;    // Fraction of data coming from FEC/RED
48*d9f75844SAndroid Build Coastguard Worker                                       // decoding (in Q14).
49*d9f75844SAndroid Build Coastguard Worker   uint16_t secondary_discarded_rate;  // Fraction of discarded FEC/RED data (in
50*d9f75844SAndroid Build Coastguard Worker                                       // Q14).
51*d9f75844SAndroid Build Coastguard Worker   // Statistics for packet waiting times, i.e., the time between a packet
52*d9f75844SAndroid Build Coastguard Worker   // arrives until it is decoded.
53*d9f75844SAndroid Build Coastguard Worker   int mean_waiting_time_ms;
54*d9f75844SAndroid Build Coastguard Worker   int median_waiting_time_ms;
55*d9f75844SAndroid Build Coastguard Worker   int min_waiting_time_ms;
56*d9f75844SAndroid Build Coastguard Worker   int max_waiting_time_ms;
57*d9f75844SAndroid Build Coastguard Worker };
58*d9f75844SAndroid Build Coastguard Worker 
59*d9f75844SAndroid Build Coastguard Worker // NetEq statistics that persist over the lifetime of the class.
60*d9f75844SAndroid Build Coastguard Worker // These metrics are never reset.
61*d9f75844SAndroid Build Coastguard Worker struct NetEqLifetimeStatistics {
62*d9f75844SAndroid Build Coastguard Worker   // Stats below correspond to similarly-named fields in the WebRTC stats spec.
63*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats
64*d9f75844SAndroid Build Coastguard Worker   uint64_t total_samples_received = 0;
65*d9f75844SAndroid Build Coastguard Worker   uint64_t concealed_samples = 0;
66*d9f75844SAndroid Build Coastguard Worker   uint64_t concealment_events = 0;
67*d9f75844SAndroid Build Coastguard Worker   uint64_t jitter_buffer_delay_ms = 0;
68*d9f75844SAndroid Build Coastguard Worker   uint64_t jitter_buffer_emitted_count = 0;
69*d9f75844SAndroid Build Coastguard Worker   uint64_t jitter_buffer_target_delay_ms = 0;
70*d9f75844SAndroid Build Coastguard Worker   uint64_t jitter_buffer_minimum_delay_ms = 0;
71*d9f75844SAndroid Build Coastguard Worker   uint64_t inserted_samples_for_deceleration = 0;
72*d9f75844SAndroid Build Coastguard Worker   uint64_t removed_samples_for_acceleration = 0;
73*d9f75844SAndroid Build Coastguard Worker   uint64_t silent_concealed_samples = 0;
74*d9f75844SAndroid Build Coastguard Worker   uint64_t fec_packets_received = 0;
75*d9f75844SAndroid Build Coastguard Worker   uint64_t fec_packets_discarded = 0;
76*d9f75844SAndroid Build Coastguard Worker   uint64_t packets_discarded = 0;
77*d9f75844SAndroid Build Coastguard Worker   // Below stats are not part of the spec.
78*d9f75844SAndroid Build Coastguard Worker   uint64_t delayed_packet_outage_samples = 0;
79*d9f75844SAndroid Build Coastguard Worker   // This is sum of relative packet arrival delays of received packets so far.
80*d9f75844SAndroid Build Coastguard Worker   // Since end-to-end delay of a packet is difficult to measure and is not
81*d9f75844SAndroid Build Coastguard Worker   // necessarily useful for measuring jitter buffer performance, we report a
82*d9f75844SAndroid Build Coastguard Worker   // relative packet arrival delay. The relative packet arrival delay of a
83*d9f75844SAndroid Build Coastguard Worker   // packet is defined as the arrival delay compared to the first packet
84*d9f75844SAndroid Build Coastguard Worker   // received, given that it had zero delay. To avoid clock drift, the "first"
85*d9f75844SAndroid Build Coastguard Worker   // packet can be made dynamic.
86*d9f75844SAndroid Build Coastguard Worker   uint64_t relative_packet_arrival_delay_ms = 0;
87*d9f75844SAndroid Build Coastguard Worker   uint64_t jitter_buffer_packets_received = 0;
88*d9f75844SAndroid Build Coastguard Worker   // An interruption is a loss-concealment event lasting at least 150 ms. The
89*d9f75844SAndroid Build Coastguard Worker   // two stats below count the number os such events and the total duration of
90*d9f75844SAndroid Build Coastguard Worker   // these events.
91*d9f75844SAndroid Build Coastguard Worker   int32_t interruption_count = 0;
92*d9f75844SAndroid Build Coastguard Worker   int32_t total_interruption_duration_ms = 0;
93*d9f75844SAndroid Build Coastguard Worker   // Total number of comfort noise samples generated during DTX.
94*d9f75844SAndroid Build Coastguard Worker   uint64_t generated_noise_samples = 0;
95*d9f75844SAndroid Build Coastguard Worker };
96*d9f75844SAndroid Build Coastguard Worker 
97*d9f75844SAndroid Build Coastguard Worker // Metrics that describe the operations performed in NetEq, and the internal
98*d9f75844SAndroid Build Coastguard Worker // state.
99*d9f75844SAndroid Build Coastguard Worker struct NetEqOperationsAndState {
100*d9f75844SAndroid Build Coastguard Worker   // These sample counters are cumulative, and don't reset. As a reference, the
101*d9f75844SAndroid Build Coastguard Worker   // total number of output samples can be found in
102*d9f75844SAndroid Build Coastguard Worker   // NetEqLifetimeStatistics::total_samples_received.
103*d9f75844SAndroid Build Coastguard Worker   uint64_t preemptive_samples = 0;
104*d9f75844SAndroid Build Coastguard Worker   uint64_t accelerate_samples = 0;
105*d9f75844SAndroid Build Coastguard Worker   // Count of the number of buffer flushes.
106*d9f75844SAndroid Build Coastguard Worker   uint64_t packet_buffer_flushes = 0;
107*d9f75844SAndroid Build Coastguard Worker   // The statistics below are not cumulative.
108*d9f75844SAndroid Build Coastguard Worker   // The waiting time of the last decoded packet.
109*d9f75844SAndroid Build Coastguard Worker   uint64_t last_waiting_time_ms = 0;
110*d9f75844SAndroid Build Coastguard Worker   // The sum of the packet and jitter buffer size in ms.
111*d9f75844SAndroid Build Coastguard Worker   uint64_t current_buffer_size_ms = 0;
112*d9f75844SAndroid Build Coastguard Worker   // The current frame size in ms.
113*d9f75844SAndroid Build Coastguard Worker   uint64_t current_frame_size_ms = 0;
114*d9f75844SAndroid Build Coastguard Worker   // Flag to indicate that the next packet is available.
115*d9f75844SAndroid Build Coastguard Worker   bool next_packet_available = false;
116*d9f75844SAndroid Build Coastguard Worker };
117*d9f75844SAndroid Build Coastguard Worker 
118*d9f75844SAndroid Build Coastguard Worker // This is the interface class for NetEq.
119*d9f75844SAndroid Build Coastguard Worker class NetEq {
120*d9f75844SAndroid Build Coastguard Worker  public:
121*d9f75844SAndroid Build Coastguard Worker   struct Config {
122*d9f75844SAndroid Build Coastguard Worker     Config();
123*d9f75844SAndroid Build Coastguard Worker     Config(const Config&);
124*d9f75844SAndroid Build Coastguard Worker     Config(Config&&);
125*d9f75844SAndroid Build Coastguard Worker     ~Config();
126*d9f75844SAndroid Build Coastguard Worker     Config& operator=(const Config&);
127*d9f75844SAndroid Build Coastguard Worker     Config& operator=(Config&&);
128*d9f75844SAndroid Build Coastguard Worker 
129*d9f75844SAndroid Build Coastguard Worker     std::string ToString() const;
130*d9f75844SAndroid Build Coastguard Worker 
131*d9f75844SAndroid Build Coastguard Worker     int sample_rate_hz = 48000;  // Initial value. Will change with input data.
132*d9f75844SAndroid Build Coastguard Worker     bool enable_post_decode_vad = false;
133*d9f75844SAndroid Build Coastguard Worker     size_t max_packets_in_buffer = 200;
134*d9f75844SAndroid Build Coastguard Worker     int max_delay_ms = 0;
135*d9f75844SAndroid Build Coastguard Worker     int min_delay_ms = 0;
136*d9f75844SAndroid Build Coastguard Worker     bool enable_fast_accelerate = false;
137*d9f75844SAndroid Build Coastguard Worker     bool enable_muted_state = false;
138*d9f75844SAndroid Build Coastguard Worker     bool enable_rtx_handling = false;
139*d9f75844SAndroid Build Coastguard Worker     absl::optional<AudioCodecPairId> codec_pair_id;
140*d9f75844SAndroid Build Coastguard Worker     bool for_test_no_time_stretching = false;  // Use only for testing.
141*d9f75844SAndroid Build Coastguard Worker   };
142*d9f75844SAndroid Build Coastguard Worker 
143*d9f75844SAndroid Build Coastguard Worker   enum ReturnCodes { kOK = 0, kFail = -1 };
144*d9f75844SAndroid Build Coastguard Worker 
145*d9f75844SAndroid Build Coastguard Worker   enum class Operation {
146*d9f75844SAndroid Build Coastguard Worker     kNormal,
147*d9f75844SAndroid Build Coastguard Worker     kMerge,
148*d9f75844SAndroid Build Coastguard Worker     kExpand,
149*d9f75844SAndroid Build Coastguard Worker     kAccelerate,
150*d9f75844SAndroid Build Coastguard Worker     kFastAccelerate,
151*d9f75844SAndroid Build Coastguard Worker     kPreemptiveExpand,
152*d9f75844SAndroid Build Coastguard Worker     kRfc3389Cng,
153*d9f75844SAndroid Build Coastguard Worker     kRfc3389CngNoPacket,
154*d9f75844SAndroid Build Coastguard Worker     kCodecInternalCng,
155*d9f75844SAndroid Build Coastguard Worker     kDtmf,
156*d9f75844SAndroid Build Coastguard Worker     kUndefined,
157*d9f75844SAndroid Build Coastguard Worker   };
158*d9f75844SAndroid Build Coastguard Worker 
159*d9f75844SAndroid Build Coastguard Worker   enum class Mode {
160*d9f75844SAndroid Build Coastguard Worker     kNormal,
161*d9f75844SAndroid Build Coastguard Worker     kExpand,
162*d9f75844SAndroid Build Coastguard Worker     kMerge,
163*d9f75844SAndroid Build Coastguard Worker     kAccelerateSuccess,
164*d9f75844SAndroid Build Coastguard Worker     kAccelerateLowEnergy,
165*d9f75844SAndroid Build Coastguard Worker     kAccelerateFail,
166*d9f75844SAndroid Build Coastguard Worker     kPreemptiveExpandSuccess,
167*d9f75844SAndroid Build Coastguard Worker     kPreemptiveExpandLowEnergy,
168*d9f75844SAndroid Build Coastguard Worker     kPreemptiveExpandFail,
169*d9f75844SAndroid Build Coastguard Worker     kRfc3389Cng,
170*d9f75844SAndroid Build Coastguard Worker     kCodecInternalCng,
171*d9f75844SAndroid Build Coastguard Worker     kCodecPlc,
172*d9f75844SAndroid Build Coastguard Worker     kDtmf,
173*d9f75844SAndroid Build Coastguard Worker     kError,
174*d9f75844SAndroid Build Coastguard Worker     kUndefined,
175*d9f75844SAndroid Build Coastguard Worker   };
176*d9f75844SAndroid Build Coastguard Worker 
177*d9f75844SAndroid Build Coastguard Worker   // Return type for GetDecoderFormat.
178*d9f75844SAndroid Build Coastguard Worker   struct DecoderFormat {
179*d9f75844SAndroid Build Coastguard Worker     int sample_rate_hz;
180*d9f75844SAndroid Build Coastguard Worker     int num_channels;
181*d9f75844SAndroid Build Coastguard Worker     SdpAudioFormat sdp_format;
182*d9f75844SAndroid Build Coastguard Worker   };
183*d9f75844SAndroid Build Coastguard Worker 
~NetEq()184*d9f75844SAndroid Build Coastguard Worker   virtual ~NetEq() {}
185*d9f75844SAndroid Build Coastguard Worker 
186*d9f75844SAndroid Build Coastguard Worker   // Inserts a new packet into NetEq.
187*d9f75844SAndroid Build Coastguard Worker   // Returns 0 on success, -1 on failure.
188*d9f75844SAndroid Build Coastguard Worker   virtual int InsertPacket(const RTPHeader& rtp_header,
189*d9f75844SAndroid Build Coastguard Worker                            rtc::ArrayView<const uint8_t> payload) = 0;
190*d9f75844SAndroid Build Coastguard Worker 
191*d9f75844SAndroid Build Coastguard Worker   // Lets NetEq know that a packet arrived with an empty payload. This typically
192*d9f75844SAndroid Build Coastguard Worker   // happens when empty packets are used for probing the network channel, and
193*d9f75844SAndroid Build Coastguard Worker   // these packets use RTP sequence numbers from the same series as the actual
194*d9f75844SAndroid Build Coastguard Worker   // audio packets.
195*d9f75844SAndroid Build Coastguard Worker   virtual void InsertEmptyPacket(const RTPHeader& rtp_header) = 0;
196*d9f75844SAndroid Build Coastguard Worker 
197*d9f75844SAndroid Build Coastguard Worker   // Instructs NetEq to deliver 10 ms of audio data. The data is written to
198*d9f75844SAndroid Build Coastguard Worker   // `audio_frame`. All data in `audio_frame` is wiped; `data_`, `speech_type_`,
199*d9f75844SAndroid Build Coastguard Worker   // `num_channels_`, `sample_rate_hz_`, `samples_per_channel_`, and
200*d9f75844SAndroid Build Coastguard Worker   // `vad_activity_` are updated upon success. If an error is returned, some
201*d9f75844SAndroid Build Coastguard Worker   // fields may not have been updated, or may contain inconsistent values.
202*d9f75844SAndroid Build Coastguard Worker   // If muted state is enabled (through Config::enable_muted_state), `muted`
203*d9f75844SAndroid Build Coastguard Worker   // may be set to true after a prolonged expand period. When this happens, the
204*d9f75844SAndroid Build Coastguard Worker   // `data_` in `audio_frame` is not written, but should be interpreted as being
205*d9f75844SAndroid Build Coastguard Worker   // all zeros. For testing purposes, an override can be supplied in the
206*d9f75844SAndroid Build Coastguard Worker   // `action_override` argument, which will cause NetEq to take this action
207*d9f75844SAndroid Build Coastguard Worker   // next, instead of the action it would normally choose. An optional output
208*d9f75844SAndroid Build Coastguard Worker   // argument for fetching the current sample rate can be provided, which
209*d9f75844SAndroid Build Coastguard Worker   // will return the same value as last_output_sample_rate_hz() but will avoid
210*d9f75844SAndroid Build Coastguard Worker   // additional synchronization.
211*d9f75844SAndroid Build Coastguard Worker   // Returns kOK on success, or kFail in case of an error.
212*d9f75844SAndroid Build Coastguard Worker   virtual int GetAudio(
213*d9f75844SAndroid Build Coastguard Worker       AudioFrame* audio_frame,
214*d9f75844SAndroid Build Coastguard Worker       bool* muted,
215*d9f75844SAndroid Build Coastguard Worker       int* current_sample_rate_hz = nullptr,
216*d9f75844SAndroid Build Coastguard Worker       absl::optional<Operation> action_override = absl::nullopt) = 0;
217*d9f75844SAndroid Build Coastguard Worker 
218*d9f75844SAndroid Build Coastguard Worker   // Replaces the current set of decoders with the given one.
219*d9f75844SAndroid Build Coastguard Worker   virtual void SetCodecs(const std::map<int, SdpAudioFormat>& codecs) = 0;
220*d9f75844SAndroid Build Coastguard Worker 
221*d9f75844SAndroid Build Coastguard Worker   // Associates `rtp_payload_type` with the given codec, which NetEq will
222*d9f75844SAndroid Build Coastguard Worker   // instantiate when it needs it. Returns true iff successful.
223*d9f75844SAndroid Build Coastguard Worker   virtual bool RegisterPayloadType(int rtp_payload_type,
224*d9f75844SAndroid Build Coastguard Worker                                    const SdpAudioFormat& audio_format) = 0;
225*d9f75844SAndroid Build Coastguard Worker 
226*d9f75844SAndroid Build Coastguard Worker   // Removes `rtp_payload_type` from the codec database. Returns 0 on success,
227*d9f75844SAndroid Build Coastguard Worker   // -1 on failure. Removing a payload type that is not registered is ok and
228*d9f75844SAndroid Build Coastguard Worker   // will not result in an error.
229*d9f75844SAndroid Build Coastguard Worker   virtual int RemovePayloadType(uint8_t rtp_payload_type) = 0;
230*d9f75844SAndroid Build Coastguard Worker 
231*d9f75844SAndroid Build Coastguard Worker   // Removes all payload types from the codec database.
232*d9f75844SAndroid Build Coastguard Worker   virtual void RemoveAllPayloadTypes() = 0;
233*d9f75844SAndroid Build Coastguard Worker 
234*d9f75844SAndroid Build Coastguard Worker   // Sets a minimum delay in millisecond for packet buffer. The minimum is
235*d9f75844SAndroid Build Coastguard Worker   // maintained unless a higher latency is dictated by channel condition.
236*d9f75844SAndroid Build Coastguard Worker   // Returns true if the minimum is successfully applied, otherwise false is
237*d9f75844SAndroid Build Coastguard Worker   // returned.
238*d9f75844SAndroid Build Coastguard Worker   virtual bool SetMinimumDelay(int delay_ms) = 0;
239*d9f75844SAndroid Build Coastguard Worker 
240*d9f75844SAndroid Build Coastguard Worker   // Sets a maximum delay in milliseconds for packet buffer. The latency will
241*d9f75844SAndroid Build Coastguard Worker   // not exceed the given value, even required delay (given the channel
242*d9f75844SAndroid Build Coastguard Worker   // conditions) is higher. Calling this method has the same effect as setting
243*d9f75844SAndroid Build Coastguard Worker   // the `max_delay_ms` value in the NetEq::Config struct.
244*d9f75844SAndroid Build Coastguard Worker   virtual bool SetMaximumDelay(int delay_ms) = 0;
245*d9f75844SAndroid Build Coastguard Worker 
246*d9f75844SAndroid Build Coastguard Worker   // Sets a base minimum delay in milliseconds for packet buffer. The minimum
247*d9f75844SAndroid Build Coastguard Worker   // delay which is set via `SetMinimumDelay` can't be lower than base minimum
248*d9f75844SAndroid Build Coastguard Worker   // delay. Calling this method is similar to setting the `min_delay_ms` value
249*d9f75844SAndroid Build Coastguard Worker   // in the NetEq::Config struct. Returns true if the base minimum is
250*d9f75844SAndroid Build Coastguard Worker   // successfully applied, otherwise false is returned.
251*d9f75844SAndroid Build Coastguard Worker   virtual bool SetBaseMinimumDelayMs(int delay_ms) = 0;
252*d9f75844SAndroid Build Coastguard Worker 
253*d9f75844SAndroid Build Coastguard Worker   // Returns current value of base minimum delay in milliseconds.
254*d9f75844SAndroid Build Coastguard Worker   virtual int GetBaseMinimumDelayMs() const = 0;
255*d9f75844SAndroid Build Coastguard Worker 
256*d9f75844SAndroid Build Coastguard Worker   // Returns the current target delay in ms. This includes any extra delay
257*d9f75844SAndroid Build Coastguard Worker   // requested through SetMinimumDelay.
258*d9f75844SAndroid Build Coastguard Worker   virtual int TargetDelayMs() const = 0;
259*d9f75844SAndroid Build Coastguard Worker 
260*d9f75844SAndroid Build Coastguard Worker   // Returns the current total delay (packet buffer and sync buffer) in ms,
261*d9f75844SAndroid Build Coastguard Worker   // with smoothing applied to even out short-time fluctuations due to jitter.
262*d9f75844SAndroid Build Coastguard Worker   // The packet buffer part of the delay is not updated during DTX/CNG periods.
263*d9f75844SAndroid Build Coastguard Worker   virtual int FilteredCurrentDelayMs() const = 0;
264*d9f75844SAndroid Build Coastguard Worker 
265*d9f75844SAndroid Build Coastguard Worker   // Writes the current network statistics to `stats`. The statistics are reset
266*d9f75844SAndroid Build Coastguard Worker   // after the call.
267*d9f75844SAndroid Build Coastguard Worker   virtual int NetworkStatistics(NetEqNetworkStatistics* stats) = 0;
268*d9f75844SAndroid Build Coastguard Worker 
269*d9f75844SAndroid Build Coastguard Worker   // Current values only, not resetting any state.
270*d9f75844SAndroid Build Coastguard Worker   virtual NetEqNetworkStatistics CurrentNetworkStatistics() const = 0;
271*d9f75844SAndroid Build Coastguard Worker 
272*d9f75844SAndroid Build Coastguard Worker   // Returns a copy of this class's lifetime statistics. These statistics are
273*d9f75844SAndroid Build Coastguard Worker   // never reset.
274*d9f75844SAndroid Build Coastguard Worker   virtual NetEqLifetimeStatistics GetLifetimeStatistics() const = 0;
275*d9f75844SAndroid Build Coastguard Worker 
276*d9f75844SAndroid Build Coastguard Worker   // Returns statistics about the performed operations and internal state. These
277*d9f75844SAndroid Build Coastguard Worker   // statistics are never reset.
278*d9f75844SAndroid Build Coastguard Worker   virtual NetEqOperationsAndState GetOperationsAndState() const = 0;
279*d9f75844SAndroid Build Coastguard Worker 
280*d9f75844SAndroid Build Coastguard Worker   // Enables post-decode VAD. When enabled, GetAudio() will return
281*d9f75844SAndroid Build Coastguard Worker   // kOutputVADPassive when the signal contains no speech.
282*d9f75844SAndroid Build Coastguard Worker   virtual void EnableVad() = 0;
283*d9f75844SAndroid Build Coastguard Worker 
284*d9f75844SAndroid Build Coastguard Worker   // Disables post-decode VAD.
285*d9f75844SAndroid Build Coastguard Worker   virtual void DisableVad() = 0;
286*d9f75844SAndroid Build Coastguard Worker 
287*d9f75844SAndroid Build Coastguard Worker   // Returns the RTP timestamp for the last sample delivered by GetAudio().
288*d9f75844SAndroid Build Coastguard Worker   // The return value will be empty if no valid timestamp is available.
289*d9f75844SAndroid Build Coastguard Worker   virtual absl::optional<uint32_t> GetPlayoutTimestamp() const = 0;
290*d9f75844SAndroid Build Coastguard Worker 
291*d9f75844SAndroid Build Coastguard Worker   // Returns the sample rate in Hz of the audio produced in the last GetAudio
292*d9f75844SAndroid Build Coastguard Worker   // call. If GetAudio has not been called yet, the configured sample rate
293*d9f75844SAndroid Build Coastguard Worker   // (Config::sample_rate_hz) is returned.
294*d9f75844SAndroid Build Coastguard Worker   virtual int last_output_sample_rate_hz() const = 0;
295*d9f75844SAndroid Build Coastguard Worker 
296*d9f75844SAndroid Build Coastguard Worker   // Returns the decoder info for the given payload type. Returns empty if no
297*d9f75844SAndroid Build Coastguard Worker   // such payload type was registered.
298*d9f75844SAndroid Build Coastguard Worker   virtual absl::optional<DecoderFormat> GetDecoderFormat(
299*d9f75844SAndroid Build Coastguard Worker       int payload_type) const = 0;
300*d9f75844SAndroid Build Coastguard Worker 
301*d9f75844SAndroid Build Coastguard Worker   // Flushes both the packet buffer and the sync buffer.
302*d9f75844SAndroid Build Coastguard Worker   virtual void FlushBuffers() = 0;
303*d9f75844SAndroid Build Coastguard Worker 
304*d9f75844SAndroid Build Coastguard Worker   // Enables NACK and sets the maximum size of the NACK list, which should be
305*d9f75844SAndroid Build Coastguard Worker   // positive and no larger than Nack::kNackListSizeLimit. If NACK is already
306*d9f75844SAndroid Build Coastguard Worker   // enabled then the maximum NACK list size is modified accordingly.
307*d9f75844SAndroid Build Coastguard Worker   virtual void EnableNack(size_t max_nack_list_size) = 0;
308*d9f75844SAndroid Build Coastguard Worker 
309*d9f75844SAndroid Build Coastguard Worker   virtual void DisableNack() = 0;
310*d9f75844SAndroid Build Coastguard Worker 
311*d9f75844SAndroid Build Coastguard Worker   // Returns a list of RTP sequence numbers corresponding to packets to be
312*d9f75844SAndroid Build Coastguard Worker   // retransmitted, given an estimate of the round-trip time in milliseconds.
313*d9f75844SAndroid Build Coastguard Worker   virtual std::vector<uint16_t> GetNackList(
314*d9f75844SAndroid Build Coastguard Worker       int64_t round_trip_time_ms) const = 0;
315*d9f75844SAndroid Build Coastguard Worker 
316*d9f75844SAndroid Build Coastguard Worker   // Returns the length of the audio yet to play in the sync buffer.
317*d9f75844SAndroid Build Coastguard Worker   // Mainly intended for testing.
318*d9f75844SAndroid Build Coastguard Worker   virtual int SyncBufferSizeMs() const = 0;
319*d9f75844SAndroid Build Coastguard Worker };
320*d9f75844SAndroid Build Coastguard Worker 
321*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
322*d9f75844SAndroid Build Coastguard Worker #endif  // API_NETEQ_NETEQ_H_
323