|  | /* | 
|  | *  Copyright (c) 2019 The WebRTC project authors. All Rights Reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | #ifndef API_NETEQ_NETEQ_CONTROLLER_H_ | 
|  | #define API_NETEQ_NETEQ_CONTROLLER_H_ | 
|  |  | 
|  | #include <cstddef> | 
|  | #include <cstdint> | 
|  | #include <functional> | 
|  | #include <memory> | 
|  | #include <optional> | 
|  |  | 
|  | #include "api/neteq/neteq.h" | 
|  | #include "api/neteq/tick_timer.h" | 
|  |  | 
|  | namespace webrtc { | 
|  |  | 
|  | // Decides the actions that NetEq should take. This affects the behavior of the | 
|  | // jitter buffer, and how it reacts to network conditions. | 
|  | // This class will undergo substantial refactoring in the near future, and the | 
|  | // API is expected to undergo significant changes. A target API is given below: | 
|  | // | 
|  | // class NetEqController { | 
|  | //  public: | 
|  | //   // Resets object to a clean state. | 
|  | //   void Reset(); | 
|  | //   // Given NetEq status, make a decision. | 
|  | //   Operation GetDecision(NetEqStatus neteq_status); | 
|  | //   // Register every packet received. | 
|  | //   void RegisterPacket(PacketInfo packet_info); | 
|  | //   // Register empty packet. | 
|  | //   void RegisterEmptyPacket(); | 
|  | //   // Register a codec switching. | 
|  | //   void CodecSwithed(); | 
|  | //   // Sets the sample rate. | 
|  | //   void SetSampleRate(int fs_hz); | 
|  | //   // Sets the packet length in samples. | 
|  | //   void SetPacketLengthSamples(); | 
|  | //   // Sets maximum delay. | 
|  | //   void SetMaximumDelay(int delay_ms); | 
|  | //   // Sets mininum delay. | 
|  | //   void SetMinimumDelay(int delay_ms); | 
|  | //   // Sets base mininum delay. | 
|  | //   void SetBaseMinimumDelay(int delay_ms); | 
|  | //   // Gets target buffer level. | 
|  | //   int GetTargetBufferLevelMs() const; | 
|  | //   // Gets filtered buffer level. | 
|  | //   int GetFilteredBufferLevel() const; | 
|  | //   // Gets base minimum delay. | 
|  | //   int GetBaseMinimumDelay() const; | 
|  | // } | 
|  |  | 
|  | class NetEqController { | 
|  | public: | 
|  | // This struct is used to create a NetEqController. | 
|  | struct Config { | 
|  | bool allow_time_stretching; | 
|  | bool enable_rtx_handling; | 
|  | int max_packets_in_buffer; | 
|  | int base_min_delay_ms; | 
|  | TickTimer* tick_timer; | 
|  | }; | 
|  |  | 
|  | struct PacketInfo { | 
|  | uint32_t timestamp; | 
|  | bool is_dtx; | 
|  | bool is_cng; | 
|  | }; | 
|  |  | 
|  | struct PacketBufferInfo { | 
|  | bool dtx_or_cng; | 
|  | size_t num_samples; | 
|  | size_t span_samples; | 
|  | size_t span_samples_wait_time; | 
|  | size_t num_packets; | 
|  | }; | 
|  |  | 
|  | struct NetEqStatus { | 
|  | uint32_t target_timestamp; | 
|  | int16_t expand_mutefactor; | 
|  | size_t last_packet_samples; | 
|  | std::optional<PacketInfo> next_packet; | 
|  | NetEq::Mode last_mode; | 
|  | bool play_dtmf; | 
|  | size_t generated_noise_samples; | 
|  | PacketBufferInfo packet_buffer_info; | 
|  | size_t sync_buffer_samples; | 
|  | }; | 
|  |  | 
|  | struct PacketArrivedInfo { | 
|  | size_t packet_length_samples; | 
|  | uint32_t main_timestamp; | 
|  | uint16_t main_sequence_number; | 
|  | bool is_cng_or_dtmf; | 
|  | bool is_dtx; | 
|  | bool buffer_flush; | 
|  | }; | 
|  |  | 
|  | virtual ~NetEqController() = default; | 
|  |  | 
|  | // Resets object to a clean state. | 
|  | virtual void Reset() = 0; | 
|  |  | 
|  | // Resets parts of the state. Typically done when switching codecs. | 
|  | virtual void SoftReset() = 0; | 
|  |  | 
|  | // Given info about the latest received packet, and current jitter buffer | 
|  | // status, returns the operation. `target_timestamp` and `expand_mutefactor` | 
|  | // are provided for reference. `last_packet_samples` is the number of samples | 
|  | // obtained from the last decoded frame. If there is a packet available, it | 
|  | // should be supplied in `packet`. The mode resulting from the last call to | 
|  | // NetEqImpl::GetAudio is supplied in `last_mode`. If there is a DTMF event to | 
|  | // play, `play_dtmf` should be set to true. The output variable | 
|  | // `reset_decoder` will be set to true if a reset is required; otherwise it is | 
|  | // left unchanged (i.e., it can remain true if it was true before the call). | 
|  | virtual NetEq::Operation GetDecision(const NetEqStatus& status, | 
|  | bool* reset_decoder) = 0; | 
|  |  | 
|  | // Inform NetEqController that an empty packet has arrived. | 
|  | virtual void RegisterEmptyPacket() = 0; | 
|  |  | 
|  | // Sets the sample rate and the output block size. | 
|  | virtual void SetSampleRate(int fs_hz, size_t output_size_samples) = 0; | 
|  |  | 
|  | // Sets a minimum or maximum delay in millisecond. | 
|  | // Returns true if the delay bound is successfully applied, otherwise false. | 
|  | virtual bool SetMaximumDelay(int delay_ms) = 0; | 
|  | virtual bool SetMinimumDelay(int delay_ms) = 0; | 
|  |  | 
|  | // Sets a base minimum delay in milliseconds for packet buffer. The effective | 
|  | // minimum delay can't be lower than base minimum delay, even if a lower value | 
|  | // is set using SetMinimumDelay. | 
|  | // Returns true if the base minimum is successfully applied, otherwise false. | 
|  | virtual bool SetBaseMinimumDelay(int delay_ms) = 0; | 
|  | virtual int GetBaseMinimumDelay() const = 0; | 
|  |  | 
|  | // Reports back to DecisionLogic whether the decision to do expand remains or | 
|  | // not. Note that this is necessary, since an expand decision can be changed | 
|  | // to kNormal in NetEqImpl::GetDecision if there is still enough data in the | 
|  | // sync buffer. | 
|  | virtual void ExpandDecision(NetEq::Operation operation) = 0; | 
|  |  | 
|  | // Adds `value` to `sample_memory_`. | 
|  | virtual void AddSampleMemory(int32_t value) = 0; | 
|  |  | 
|  | // Returns the target buffer level in ms. | 
|  | virtual int TargetLevelMs() const = 0; | 
|  |  | 
|  | // Returns the target buffer level in ms as it would be if no minimum or | 
|  | // maximum delay was set. | 
|  | // TODO(bugs.webrtc.org/14270): Make pure virtual once all implementations are | 
|  | // updated. | 
|  | virtual int UnlimitedTargetLevelMs() const { return 0; } | 
|  |  | 
|  | // Notify the NetEqController that a packet has arrived. Returns the relative | 
|  | // arrival delay, if it can be computed. | 
|  | virtual std::optional<int> PacketArrived(int fs_hz, | 
|  | bool should_update_stats, | 
|  | const PacketArrivedInfo& info) = 0; | 
|  |  | 
|  | // Notify the NetEqController that we are currently in muted state. | 
|  | // TODO(bugs.webrtc.org/14270): Make pure virtual when downstream is updated. | 
|  | virtual void NotifyMutedState() {} | 
|  |  | 
|  | // Returns true if a peak was found. | 
|  | virtual bool PeakFound() const = 0; | 
|  |  | 
|  | // Get the filtered buffer level in samples. | 
|  | virtual int GetFilteredBufferLevel() const = 0; | 
|  |  | 
|  | // Accessors and mutators. | 
|  | virtual void set_sample_memory(int32_t value) = 0; | 
|  | virtual size_t noise_fast_forward() const = 0; | 
|  | virtual size_t packet_length_samples() const = 0; | 
|  | virtual void set_packet_length_samples(size_t value) = 0; | 
|  | virtual void set_prev_time_scale(bool value) = 0; | 
|  | }; | 
|  |  | 
|  | }  // namespace webrtc | 
|  | #endif  // API_NETEQ_NETEQ_CONTROLLER_H_ |