tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

neteq.h (14116B)


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