xref: /aosp_15_r20/external/webrtc/call/audio_receive_stream.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2015 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 CALL_AUDIO_RECEIVE_STREAM_H_
12*d9f75844SAndroid Build Coastguard Worker #define CALL_AUDIO_RECEIVE_STREAM_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <map>
15*d9f75844SAndroid Build Coastguard Worker #include <memory>
16*d9f75844SAndroid Build Coastguard Worker #include <string>
17*d9f75844SAndroid Build Coastguard Worker #include <vector>
18*d9f75844SAndroid Build Coastguard Worker 
19*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h"
20*d9f75844SAndroid Build Coastguard Worker #include "api/audio_codecs/audio_decoder_factory.h"
21*d9f75844SAndroid Build Coastguard Worker #include "api/call/transport.h"
22*d9f75844SAndroid Build Coastguard Worker #include "api/crypto/crypto_options.h"
23*d9f75844SAndroid Build Coastguard Worker #include "api/rtp_parameters.h"
24*d9f75844SAndroid Build Coastguard Worker #include "call/receive_stream.h"
25*d9f75844SAndroid Build Coastguard Worker #include "call/rtp_config.h"
26*d9f75844SAndroid Build Coastguard Worker 
27*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
28*d9f75844SAndroid Build Coastguard Worker class AudioSinkInterface;
29*d9f75844SAndroid Build Coastguard Worker 
30*d9f75844SAndroid Build Coastguard Worker class AudioReceiveStreamInterface : public MediaReceiveStreamInterface {
31*d9f75844SAndroid Build Coastguard Worker  public:
32*d9f75844SAndroid Build Coastguard Worker   struct Stats {
33*d9f75844SAndroid Build Coastguard Worker     Stats();
34*d9f75844SAndroid Build Coastguard Worker     ~Stats();
35*d9f75844SAndroid Build Coastguard Worker     uint32_t remote_ssrc = 0;
36*d9f75844SAndroid Build Coastguard Worker     int64_t payload_bytes_rcvd = 0;
37*d9f75844SAndroid Build Coastguard Worker     int64_t header_and_padding_bytes_rcvd = 0;
38*d9f75844SAndroid Build Coastguard Worker     uint32_t packets_rcvd = 0;
39*d9f75844SAndroid Build Coastguard Worker     uint64_t fec_packets_received = 0;
40*d9f75844SAndroid Build Coastguard Worker     uint64_t fec_packets_discarded = 0;
41*d9f75844SAndroid Build Coastguard Worker     int32_t packets_lost = 0;
42*d9f75844SAndroid Build Coastguard Worker     uint64_t packets_discarded = 0;
43*d9f75844SAndroid Build Coastguard Worker     uint32_t nacks_sent = 0;
44*d9f75844SAndroid Build Coastguard Worker     std::string codec_name;
45*d9f75844SAndroid Build Coastguard Worker     absl::optional<int> codec_payload_type;
46*d9f75844SAndroid Build Coastguard Worker     uint32_t jitter_ms = 0;
47*d9f75844SAndroid Build Coastguard Worker     uint32_t jitter_buffer_ms = 0;
48*d9f75844SAndroid Build Coastguard Worker     uint32_t jitter_buffer_preferred_ms = 0;
49*d9f75844SAndroid Build Coastguard Worker     uint32_t delay_estimate_ms = 0;
50*d9f75844SAndroid Build Coastguard Worker     int32_t audio_level = -1;
51*d9f75844SAndroid Build Coastguard Worker     // Stats below correspond to similarly-named fields in the WebRTC stats
52*d9f75844SAndroid Build Coastguard Worker     // spec. https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats
53*d9f75844SAndroid Build Coastguard Worker     double total_output_energy = 0.0;
54*d9f75844SAndroid Build Coastguard Worker     uint64_t total_samples_received = 0;
55*d9f75844SAndroid Build Coastguard Worker     double total_output_duration = 0.0;
56*d9f75844SAndroid Build Coastguard Worker     uint64_t concealed_samples = 0;
57*d9f75844SAndroid Build Coastguard Worker     uint64_t silent_concealed_samples = 0;
58*d9f75844SAndroid Build Coastguard Worker     uint64_t concealment_events = 0;
59*d9f75844SAndroid Build Coastguard Worker     double jitter_buffer_delay_seconds = 0.0;
60*d9f75844SAndroid Build Coastguard Worker     uint64_t jitter_buffer_emitted_count = 0;
61*d9f75844SAndroid Build Coastguard Worker     double jitter_buffer_target_delay_seconds = 0.0;
62*d9f75844SAndroid Build Coastguard Worker     double jitter_buffer_minimum_delay_seconds = 0.0;
63*d9f75844SAndroid Build Coastguard Worker     uint64_t inserted_samples_for_deceleration = 0;
64*d9f75844SAndroid Build Coastguard Worker     uint64_t removed_samples_for_acceleration = 0;
65*d9f75844SAndroid Build Coastguard Worker     // Stats below DO NOT correspond directly to anything in the WebRTC stats
66*d9f75844SAndroid Build Coastguard Worker     float expand_rate = 0.0f;
67*d9f75844SAndroid Build Coastguard Worker     float speech_expand_rate = 0.0f;
68*d9f75844SAndroid Build Coastguard Worker     float secondary_decoded_rate = 0.0f;
69*d9f75844SAndroid Build Coastguard Worker     float secondary_discarded_rate = 0.0f;
70*d9f75844SAndroid Build Coastguard Worker     float accelerate_rate = 0.0f;
71*d9f75844SAndroid Build Coastguard Worker     float preemptive_expand_rate = 0.0f;
72*d9f75844SAndroid Build Coastguard Worker     uint64_t delayed_packet_outage_samples = 0;
73*d9f75844SAndroid Build Coastguard Worker     int32_t decoding_calls_to_silence_generator = 0;
74*d9f75844SAndroid Build Coastguard Worker     int32_t decoding_calls_to_neteq = 0;
75*d9f75844SAndroid Build Coastguard Worker     int32_t decoding_normal = 0;
76*d9f75844SAndroid Build Coastguard Worker     // TODO(alexnarest): Consider decoding_neteq_plc for consistency
77*d9f75844SAndroid Build Coastguard Worker     int32_t decoding_plc = 0;
78*d9f75844SAndroid Build Coastguard Worker     int32_t decoding_codec_plc = 0;
79*d9f75844SAndroid Build Coastguard Worker     int32_t decoding_cng = 0;
80*d9f75844SAndroid Build Coastguard Worker     int32_t decoding_plc_cng = 0;
81*d9f75844SAndroid Build Coastguard Worker     int32_t decoding_muted_output = 0;
82*d9f75844SAndroid Build Coastguard Worker     int64_t capture_start_ntp_time_ms = 0;
83*d9f75844SAndroid Build Coastguard Worker     // The timestamp at which the last packet was received, i.e. the time of the
84*d9f75844SAndroid Build Coastguard Worker     // local clock when it was received - not the RTP timestamp of that packet.
85*d9f75844SAndroid Build Coastguard Worker     // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-lastpacketreceivedtimestamp
86*d9f75844SAndroid Build Coastguard Worker     absl::optional<int64_t> last_packet_received_timestamp_ms;
87*d9f75844SAndroid Build Coastguard Worker     uint64_t jitter_buffer_flushes = 0;
88*d9f75844SAndroid Build Coastguard Worker     double relative_packet_arrival_delay_seconds = 0.0;
89*d9f75844SAndroid Build Coastguard Worker     int32_t interruption_count = 0;
90*d9f75844SAndroid Build Coastguard Worker     int32_t total_interruption_duration_ms = 0;
91*d9f75844SAndroid Build Coastguard Worker     // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-estimatedplayouttimestamp
92*d9f75844SAndroid Build Coastguard Worker     absl::optional<int64_t> estimated_playout_ntp_timestamp_ms;
93*d9f75844SAndroid Build Coastguard Worker     // Remote outbound stats derived by the received RTCP sender reports.
94*d9f75844SAndroid Build Coastguard Worker     // https://w3c.github.io/webrtc-stats/#remoteoutboundrtpstats-dict*
95*d9f75844SAndroid Build Coastguard Worker     absl::optional<int64_t> last_sender_report_timestamp_ms;
96*d9f75844SAndroid Build Coastguard Worker     absl::optional<int64_t> last_sender_report_remote_timestamp_ms;
97*d9f75844SAndroid Build Coastguard Worker     uint32_t sender_reports_packets_sent = 0;
98*d9f75844SAndroid Build Coastguard Worker     uint64_t sender_reports_bytes_sent = 0;
99*d9f75844SAndroid Build Coastguard Worker     uint64_t sender_reports_reports_count = 0;
100*d9f75844SAndroid Build Coastguard Worker     absl::optional<TimeDelta> round_trip_time;
101*d9f75844SAndroid Build Coastguard Worker     TimeDelta total_round_trip_time = TimeDelta::Zero();
102*d9f75844SAndroid Build Coastguard Worker     int round_trip_time_measurements;
103*d9f75844SAndroid Build Coastguard Worker   };
104*d9f75844SAndroid Build Coastguard Worker 
105*d9f75844SAndroid Build Coastguard Worker   struct Config {
106*d9f75844SAndroid Build Coastguard Worker     Config();
107*d9f75844SAndroid Build Coastguard Worker     ~Config();
108*d9f75844SAndroid Build Coastguard Worker 
109*d9f75844SAndroid Build Coastguard Worker     std::string ToString() const;
110*d9f75844SAndroid Build Coastguard Worker 
111*d9f75844SAndroid Build Coastguard Worker     // Receive-stream specific RTP settings.
112*d9f75844SAndroid Build Coastguard Worker     struct Rtp : public ReceiveStreamRtpConfig {
113*d9f75844SAndroid Build Coastguard Worker       Rtp();
114*d9f75844SAndroid Build Coastguard Worker       ~Rtp();
115*d9f75844SAndroid Build Coastguard Worker 
116*d9f75844SAndroid Build Coastguard Worker       std::string ToString() const;
117*d9f75844SAndroid Build Coastguard Worker 
118*d9f75844SAndroid Build Coastguard Worker       // See NackConfig for description.
119*d9f75844SAndroid Build Coastguard Worker       NackConfig nack;
120*d9f75844SAndroid Build Coastguard Worker     } rtp;
121*d9f75844SAndroid Build Coastguard Worker 
122*d9f75844SAndroid Build Coastguard Worker     // Receive-side RTT.
123*d9f75844SAndroid Build Coastguard Worker     bool enable_non_sender_rtt = false;
124*d9f75844SAndroid Build Coastguard Worker 
125*d9f75844SAndroid Build Coastguard Worker     Transport* rtcp_send_transport = nullptr;
126*d9f75844SAndroid Build Coastguard Worker 
127*d9f75844SAndroid Build Coastguard Worker     // NetEq settings.
128*d9f75844SAndroid Build Coastguard Worker     size_t jitter_buffer_max_packets = 200;
129*d9f75844SAndroid Build Coastguard Worker     bool jitter_buffer_fast_accelerate = false;
130*d9f75844SAndroid Build Coastguard Worker     int jitter_buffer_min_delay_ms = 0;
131*d9f75844SAndroid Build Coastguard Worker 
132*d9f75844SAndroid Build Coastguard Worker     // Identifier for an A/V synchronization group. Empty string to disable.
133*d9f75844SAndroid Build Coastguard Worker     // TODO(pbos): Synchronize streams in a sync group, not just one video
134*d9f75844SAndroid Build Coastguard Worker     // stream to one audio stream. Tracked by issue webrtc:4762.
135*d9f75844SAndroid Build Coastguard Worker     std::string sync_group;
136*d9f75844SAndroid Build Coastguard Worker 
137*d9f75844SAndroid Build Coastguard Worker     // Decoder specifications for every payload type that we can receive.
138*d9f75844SAndroid Build Coastguard Worker     std::map<int, SdpAudioFormat> decoder_map;
139*d9f75844SAndroid Build Coastguard Worker 
140*d9f75844SAndroid Build Coastguard Worker     rtc::scoped_refptr<AudioDecoderFactory> decoder_factory;
141*d9f75844SAndroid Build Coastguard Worker 
142*d9f75844SAndroid Build Coastguard Worker     absl::optional<AudioCodecPairId> codec_pair_id;
143*d9f75844SAndroid Build Coastguard Worker 
144*d9f75844SAndroid Build Coastguard Worker     // Per PeerConnection crypto options.
145*d9f75844SAndroid Build Coastguard Worker     webrtc::CryptoOptions crypto_options;
146*d9f75844SAndroid Build Coastguard Worker 
147*d9f75844SAndroid Build Coastguard Worker     // An optional custom frame decryptor that allows the entire frame to be
148*d9f75844SAndroid Build Coastguard Worker     // decrypted in whatever way the caller choses. This is not required by
149*d9f75844SAndroid Build Coastguard Worker     // default.
150*d9f75844SAndroid Build Coastguard Worker     // TODO(tommi): Remove this member variable from the struct. It's not
151*d9f75844SAndroid Build Coastguard Worker     // a part of the AudioReceiveStreamInterface state but rather a pass through
152*d9f75844SAndroid Build Coastguard Worker     // variable.
153*d9f75844SAndroid Build Coastguard Worker     rtc::scoped_refptr<webrtc::FrameDecryptorInterface> frame_decryptor;
154*d9f75844SAndroid Build Coastguard Worker 
155*d9f75844SAndroid Build Coastguard Worker     // An optional frame transformer used by insertable streams to transform
156*d9f75844SAndroid Build Coastguard Worker     // encoded frames.
157*d9f75844SAndroid Build Coastguard Worker     // TODO(tommi): Remove this member variable from the struct. It's not
158*d9f75844SAndroid Build Coastguard Worker     // a part of the AudioReceiveStreamInterface state but rather a pass through
159*d9f75844SAndroid Build Coastguard Worker     // variable.
160*d9f75844SAndroid Build Coastguard Worker     rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer;
161*d9f75844SAndroid Build Coastguard Worker   };
162*d9f75844SAndroid Build Coastguard Worker 
163*d9f75844SAndroid Build Coastguard Worker   // Methods that support reconfiguring the stream post initialization.
164*d9f75844SAndroid Build Coastguard Worker   virtual void SetDecoderMap(std::map<int, SdpAudioFormat> decoder_map) = 0;
165*d9f75844SAndroid Build Coastguard Worker   virtual void SetNackHistory(int history_ms) = 0;
166*d9f75844SAndroid Build Coastguard Worker   virtual void SetNonSenderRttMeasurement(bool enabled) = 0;
167*d9f75844SAndroid Build Coastguard Worker 
168*d9f75844SAndroid Build Coastguard Worker   // Returns true if the stream has been started.
169*d9f75844SAndroid Build Coastguard Worker   virtual bool IsRunning() const = 0;
170*d9f75844SAndroid Build Coastguard Worker 
171*d9f75844SAndroid Build Coastguard Worker   virtual Stats GetStats(bool get_and_clear_legacy_stats) const = 0;
GetStats()172*d9f75844SAndroid Build Coastguard Worker   Stats GetStats() { return GetStats(/*get_and_clear_legacy_stats=*/true); }
173*d9f75844SAndroid Build Coastguard Worker 
174*d9f75844SAndroid Build Coastguard Worker   // Sets an audio sink that receives unmixed audio from the receive stream.
175*d9f75844SAndroid Build Coastguard Worker   // Ownership of the sink is managed by the caller.
176*d9f75844SAndroid Build Coastguard Worker   // Only one sink can be set and passing a null sink clears an existing one.
177*d9f75844SAndroid Build Coastguard Worker   // NOTE: Audio must still somehow be pulled through AudioTransport for audio
178*d9f75844SAndroid Build Coastguard Worker   // to stream through this sink. In practice, this happens if mixed audio
179*d9f75844SAndroid Build Coastguard Worker   // is being pulled+rendered and/or if audio is being pulled for the purposes
180*d9f75844SAndroid Build Coastguard Worker   // of feeding to the AEC.
181*d9f75844SAndroid Build Coastguard Worker   virtual void SetSink(AudioSinkInterface* sink) = 0;
182*d9f75844SAndroid Build Coastguard Worker 
183*d9f75844SAndroid Build Coastguard Worker   // Sets playback gain of the stream, applied when mixing, and thus after it
184*d9f75844SAndroid Build Coastguard Worker   // is potentially forwarded to any attached AudioSinkInterface implementation.
185*d9f75844SAndroid Build Coastguard Worker   virtual void SetGain(float gain) = 0;
186*d9f75844SAndroid Build Coastguard Worker 
187*d9f75844SAndroid Build Coastguard Worker   // Sets a base minimum for the playout delay. Base minimum delay sets lower
188*d9f75844SAndroid Build Coastguard Worker   // bound on minimum delay value determining lower bound on playout delay.
189*d9f75844SAndroid Build Coastguard Worker   //
190*d9f75844SAndroid Build Coastguard Worker   // Returns true if value was successfully set, false overwise.
191*d9f75844SAndroid Build Coastguard Worker   virtual bool SetBaseMinimumPlayoutDelayMs(int delay_ms) = 0;
192*d9f75844SAndroid Build Coastguard Worker 
193*d9f75844SAndroid Build Coastguard Worker   // Returns current value of base minimum delay in milliseconds.
194*d9f75844SAndroid Build Coastguard Worker   virtual int GetBaseMinimumPlayoutDelayMs() const = 0;
195*d9f75844SAndroid Build Coastguard Worker 
196*d9f75844SAndroid Build Coastguard Worker   // Synchronization source (stream identifier) to be received.
197*d9f75844SAndroid Build Coastguard Worker   // This member will not change mid-stream and can be assumed to be const
198*d9f75844SAndroid Build Coastguard Worker   // post initialization.
199*d9f75844SAndroid Build Coastguard Worker   virtual uint32_t remote_ssrc() const = 0;
200*d9f75844SAndroid Build Coastguard Worker 
201*d9f75844SAndroid Build Coastguard Worker   // Access the currently set rtp extensions. Must be called on the packet
202*d9f75844SAndroid Build Coastguard Worker   // delivery thread.
203*d9f75844SAndroid Build Coastguard Worker   // TODO(tommi): This is currently only called from
204*d9f75844SAndroid Build Coastguard Worker   // `WebRtcAudioReceiveStream::GetRtpParameters()`. See if we can remove it.
205*d9f75844SAndroid Build Coastguard Worker   virtual const std::vector<RtpExtension>& GetRtpExtensions() const = 0;
206*d9f75844SAndroid Build Coastguard Worker 
207*d9f75844SAndroid Build Coastguard Worker  protected:
~AudioReceiveStreamInterface()208*d9f75844SAndroid Build Coastguard Worker   virtual ~AudioReceiveStreamInterface() {}
209*d9f75844SAndroid Build Coastguard Worker };
210*d9f75844SAndroid Build Coastguard Worker 
211*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
212*d9f75844SAndroid Build Coastguard Worker 
213*d9f75844SAndroid Build Coastguard Worker #endif  // CALL_AUDIO_RECEIVE_STREAM_H_
214