xref: /aosp_15_r20/external/webrtc/audio/channel_receive.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 AUDIO_CHANNEL_RECEIVE_H_
12*d9f75844SAndroid Build Coastguard Worker #define AUDIO_CHANNEL_RECEIVE_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 <utility>
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/audio_mixer.h"
21*d9f75844SAndroid Build Coastguard Worker #include "api/audio_codecs/audio_decoder_factory.h"
22*d9f75844SAndroid Build Coastguard Worker #include "api/call/audio_sink.h"
23*d9f75844SAndroid Build Coastguard Worker #include "api/call/transport.h"
24*d9f75844SAndroid Build Coastguard Worker #include "api/crypto/crypto_options.h"
25*d9f75844SAndroid Build Coastguard Worker #include "api/frame_transformer_interface.h"
26*d9f75844SAndroid Build Coastguard Worker #include "api/neteq/neteq_factory.h"
27*d9f75844SAndroid Build Coastguard Worker #include "api/transport/rtp/rtp_source.h"
28*d9f75844SAndroid Build Coastguard Worker #include "call/rtp_packet_sink_interface.h"
29*d9f75844SAndroid Build Coastguard Worker #include "call/syncable.h"
30*d9f75844SAndroid Build Coastguard Worker #include "modules/audio_coding/include/audio_coding_module_typedefs.h"
31*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/source_tracker.h"
32*d9f75844SAndroid Build Coastguard Worker #include "system_wrappers/include/clock.h"
33*d9f75844SAndroid Build Coastguard Worker 
34*d9f75844SAndroid Build Coastguard Worker // TODO(solenberg, nisse): This file contains a few NOLINT marks, to silence
35*d9f75844SAndroid Build Coastguard Worker // warnings about use of unsigned short.
36*d9f75844SAndroid Build Coastguard Worker // These need cleanup, in a separate cl.
37*d9f75844SAndroid Build Coastguard Worker 
38*d9f75844SAndroid Build Coastguard Worker namespace rtc {
39*d9f75844SAndroid Build Coastguard Worker class TimestampWrapAroundHandler;
40*d9f75844SAndroid Build Coastguard Worker }
41*d9f75844SAndroid Build Coastguard Worker 
42*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
43*d9f75844SAndroid Build Coastguard Worker 
44*d9f75844SAndroid Build Coastguard Worker class AudioDeviceModule;
45*d9f75844SAndroid Build Coastguard Worker class FrameDecryptorInterface;
46*d9f75844SAndroid Build Coastguard Worker class PacketRouter;
47*d9f75844SAndroid Build Coastguard Worker class RateLimiter;
48*d9f75844SAndroid Build Coastguard Worker class ReceiveStatistics;
49*d9f75844SAndroid Build Coastguard Worker class RtcEventLog;
50*d9f75844SAndroid Build Coastguard Worker class RtpPacketReceived;
51*d9f75844SAndroid Build Coastguard Worker class RtpRtcp;
52*d9f75844SAndroid Build Coastguard Worker 
53*d9f75844SAndroid Build Coastguard Worker struct CallReceiveStatistics {
54*d9f75844SAndroid Build Coastguard Worker   int cumulativeLost;
55*d9f75844SAndroid Build Coastguard Worker   unsigned int jitterSamples;
56*d9f75844SAndroid Build Coastguard Worker   int64_t payload_bytes_rcvd = 0;
57*d9f75844SAndroid Build Coastguard Worker   int64_t header_and_padding_bytes_rcvd = 0;
58*d9f75844SAndroid Build Coastguard Worker   int packetsReceived;
59*d9f75844SAndroid Build Coastguard Worker   uint32_t nacks_sent = 0;
60*d9f75844SAndroid Build Coastguard Worker   // The capture NTP time (in local timebase) of the first played out audio
61*d9f75844SAndroid Build Coastguard Worker   // frame.
62*d9f75844SAndroid Build Coastguard Worker   int64_t capture_start_ntp_time_ms_;
63*d9f75844SAndroid Build Coastguard Worker   // The timestamp at which the last packet was received, i.e. the time of the
64*d9f75844SAndroid Build Coastguard Worker   // local clock when it was received - not the RTP timestamp of that packet.
65*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-lastpacketreceivedtimestamp
66*d9f75844SAndroid Build Coastguard Worker   absl::optional<int64_t> last_packet_received_timestamp_ms;
67*d9f75844SAndroid Build Coastguard Worker   // Remote outbound stats derived by the received RTCP sender reports.
68*d9f75844SAndroid Build Coastguard Worker   // Note that the timestamps below correspond to the time elapsed since the
69*d9f75844SAndroid Build Coastguard Worker   // Unix epoch.
70*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#remoteoutboundrtpstats-dict*
71*d9f75844SAndroid Build Coastguard Worker   absl::optional<int64_t> last_sender_report_timestamp_ms;
72*d9f75844SAndroid Build Coastguard Worker   absl::optional<int64_t> last_sender_report_remote_timestamp_ms;
73*d9f75844SAndroid Build Coastguard Worker   uint32_t sender_reports_packets_sent = 0;
74*d9f75844SAndroid Build Coastguard Worker   uint64_t sender_reports_bytes_sent = 0;
75*d9f75844SAndroid Build Coastguard Worker   uint64_t sender_reports_reports_count = 0;
76*d9f75844SAndroid Build Coastguard Worker   absl::optional<TimeDelta> round_trip_time;
77*d9f75844SAndroid Build Coastguard Worker   TimeDelta total_round_trip_time = TimeDelta::Zero();
78*d9f75844SAndroid Build Coastguard Worker   int round_trip_time_measurements;
79*d9f75844SAndroid Build Coastguard Worker };
80*d9f75844SAndroid Build Coastguard Worker 
81*d9f75844SAndroid Build Coastguard Worker namespace voe {
82*d9f75844SAndroid Build Coastguard Worker 
83*d9f75844SAndroid Build Coastguard Worker class ChannelSendInterface;
84*d9f75844SAndroid Build Coastguard Worker 
85*d9f75844SAndroid Build Coastguard Worker // Interface class needed for AudioReceiveStreamInterface tests that use a
86*d9f75844SAndroid Build Coastguard Worker // MockChannelReceive.
87*d9f75844SAndroid Build Coastguard Worker 
88*d9f75844SAndroid Build Coastguard Worker class ChannelReceiveInterface : public RtpPacketSinkInterface {
89*d9f75844SAndroid Build Coastguard Worker  public:
90*d9f75844SAndroid Build Coastguard Worker   virtual ~ChannelReceiveInterface() = default;
91*d9f75844SAndroid Build Coastguard Worker 
92*d9f75844SAndroid Build Coastguard Worker   virtual void SetSink(AudioSinkInterface* sink) = 0;
93*d9f75844SAndroid Build Coastguard Worker 
94*d9f75844SAndroid Build Coastguard Worker   virtual void SetReceiveCodecs(
95*d9f75844SAndroid Build Coastguard Worker       const std::map<int, SdpAudioFormat>& codecs) = 0;
96*d9f75844SAndroid Build Coastguard Worker 
97*d9f75844SAndroid Build Coastguard Worker   virtual void StartPlayout() = 0;
98*d9f75844SAndroid Build Coastguard Worker   virtual void StopPlayout() = 0;
99*d9f75844SAndroid Build Coastguard Worker 
100*d9f75844SAndroid Build Coastguard Worker   // Payload type and format of last received RTP packet, if any.
101*d9f75844SAndroid Build Coastguard Worker   virtual absl::optional<std::pair<int, SdpAudioFormat>> GetReceiveCodec()
102*d9f75844SAndroid Build Coastguard Worker       const = 0;
103*d9f75844SAndroid Build Coastguard Worker 
104*d9f75844SAndroid Build Coastguard Worker   virtual void ReceivedRTCPPacket(const uint8_t* data, size_t length) = 0;
105*d9f75844SAndroid Build Coastguard Worker 
106*d9f75844SAndroid Build Coastguard Worker   virtual void SetChannelOutputVolumeScaling(float scaling) = 0;
107*d9f75844SAndroid Build Coastguard Worker   virtual int GetSpeechOutputLevelFullRange() const = 0;
108*d9f75844SAndroid Build Coastguard Worker   // See description of "totalAudioEnergy" in the WebRTC stats spec:
109*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-totalaudioenergy
110*d9f75844SAndroid Build Coastguard Worker   virtual double GetTotalOutputEnergy() const = 0;
111*d9f75844SAndroid Build Coastguard Worker   virtual double GetTotalOutputDuration() const = 0;
112*d9f75844SAndroid Build Coastguard Worker 
113*d9f75844SAndroid Build Coastguard Worker   // Stats.
114*d9f75844SAndroid Build Coastguard Worker   virtual NetworkStatistics GetNetworkStatistics(
115*d9f75844SAndroid Build Coastguard Worker       bool get_and_clear_legacy_stats) const = 0;
116*d9f75844SAndroid Build Coastguard Worker   virtual AudioDecodingCallStats GetDecodingCallStatistics() const = 0;
117*d9f75844SAndroid Build Coastguard Worker 
118*d9f75844SAndroid Build Coastguard Worker   // Audio+Video Sync.
119*d9f75844SAndroid Build Coastguard Worker   virtual uint32_t GetDelayEstimate() const = 0;
120*d9f75844SAndroid Build Coastguard Worker   virtual bool SetMinimumPlayoutDelay(int delay_ms) = 0;
121*d9f75844SAndroid Build Coastguard Worker   virtual bool GetPlayoutRtpTimestamp(uint32_t* rtp_timestamp,
122*d9f75844SAndroid Build Coastguard Worker                                       int64_t* time_ms) const = 0;
123*d9f75844SAndroid Build Coastguard Worker   virtual void SetEstimatedPlayoutNtpTimestampMs(int64_t ntp_timestamp_ms,
124*d9f75844SAndroid Build Coastguard Worker                                                  int64_t time_ms) = 0;
125*d9f75844SAndroid Build Coastguard Worker   virtual absl::optional<int64_t> GetCurrentEstimatedPlayoutNtpTimestampMs(
126*d9f75844SAndroid Build Coastguard Worker       int64_t now_ms) const = 0;
127*d9f75844SAndroid Build Coastguard Worker 
128*d9f75844SAndroid Build Coastguard Worker   // Audio quality.
129*d9f75844SAndroid Build Coastguard Worker   // Base minimum delay sets lower bound on minimum delay value which
130*d9f75844SAndroid Build Coastguard Worker   // determines minimum delay until audio playout.
131*d9f75844SAndroid Build Coastguard Worker   virtual bool SetBaseMinimumPlayoutDelayMs(int delay_ms) = 0;
132*d9f75844SAndroid Build Coastguard Worker   virtual int GetBaseMinimumPlayoutDelayMs() const = 0;
133*d9f75844SAndroid Build Coastguard Worker 
134*d9f75844SAndroid Build Coastguard Worker   // Produces the transport-related timestamps; current_delay_ms is left unset.
135*d9f75844SAndroid Build Coastguard Worker   virtual absl::optional<Syncable::Info> GetSyncInfo() const = 0;
136*d9f75844SAndroid Build Coastguard Worker 
137*d9f75844SAndroid Build Coastguard Worker   virtual void RegisterReceiverCongestionControlObjects(
138*d9f75844SAndroid Build Coastguard Worker       PacketRouter* packet_router) = 0;
139*d9f75844SAndroid Build Coastguard Worker   virtual void ResetReceiverCongestionControlObjects() = 0;
140*d9f75844SAndroid Build Coastguard Worker 
141*d9f75844SAndroid Build Coastguard Worker   virtual CallReceiveStatistics GetRTCPStatistics() const = 0;
142*d9f75844SAndroid Build Coastguard Worker   virtual void SetNACKStatus(bool enable, int max_packets) = 0;
143*d9f75844SAndroid Build Coastguard Worker   virtual void SetNonSenderRttMeasurement(bool enabled) = 0;
144*d9f75844SAndroid Build Coastguard Worker 
145*d9f75844SAndroid Build Coastguard Worker   virtual AudioMixer::Source::AudioFrameInfo GetAudioFrameWithInfo(
146*d9f75844SAndroid Build Coastguard Worker       int sample_rate_hz,
147*d9f75844SAndroid Build Coastguard Worker       AudioFrame* audio_frame) = 0;
148*d9f75844SAndroid Build Coastguard Worker 
149*d9f75844SAndroid Build Coastguard Worker   virtual int PreferredSampleRate() const = 0;
150*d9f75844SAndroid Build Coastguard Worker 
151*d9f75844SAndroid Build Coastguard Worker   // Sets the source tracker to notify about "delivered" packets when output is
152*d9f75844SAndroid Build Coastguard Worker   // muted.
153*d9f75844SAndroid Build Coastguard Worker   virtual void SetSourceTracker(SourceTracker* source_tracker) = 0;
154*d9f75844SAndroid Build Coastguard Worker 
155*d9f75844SAndroid Build Coastguard Worker   // Associate to a send channel.
156*d9f75844SAndroid Build Coastguard Worker   // Used for obtaining RTT for a receive-only channel.
157*d9f75844SAndroid Build Coastguard Worker   virtual void SetAssociatedSendChannel(
158*d9f75844SAndroid Build Coastguard Worker       const ChannelSendInterface* channel) = 0;
159*d9f75844SAndroid Build Coastguard Worker 
160*d9f75844SAndroid Build Coastguard Worker   // Sets a frame transformer between the depacketizer and the decoder, to
161*d9f75844SAndroid Build Coastguard Worker   // transform the received frames before decoding them.
162*d9f75844SAndroid Build Coastguard Worker   virtual void SetDepacketizerToDecoderFrameTransformer(
163*d9f75844SAndroid Build Coastguard Worker       rtc::scoped_refptr<webrtc::FrameTransformerInterface>
164*d9f75844SAndroid Build Coastguard Worker           frame_transformer) = 0;
165*d9f75844SAndroid Build Coastguard Worker 
166*d9f75844SAndroid Build Coastguard Worker   virtual void SetFrameDecryptor(
167*d9f75844SAndroid Build Coastguard Worker       rtc::scoped_refptr<webrtc::FrameDecryptorInterface> frame_decryptor) = 0;
168*d9f75844SAndroid Build Coastguard Worker 
169*d9f75844SAndroid Build Coastguard Worker   virtual void OnLocalSsrcChange(uint32_t local_ssrc) = 0;
170*d9f75844SAndroid Build Coastguard Worker   virtual uint32_t GetLocalSsrc() const = 0;
171*d9f75844SAndroid Build Coastguard Worker };
172*d9f75844SAndroid Build Coastguard Worker 
173*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<ChannelReceiveInterface> CreateChannelReceive(
174*d9f75844SAndroid Build Coastguard Worker     Clock* clock,
175*d9f75844SAndroid Build Coastguard Worker     NetEqFactory* neteq_factory,
176*d9f75844SAndroid Build Coastguard Worker     AudioDeviceModule* audio_device_module,
177*d9f75844SAndroid Build Coastguard Worker     Transport* rtcp_send_transport,
178*d9f75844SAndroid Build Coastguard Worker     RtcEventLog* rtc_event_log,
179*d9f75844SAndroid Build Coastguard Worker     uint32_t local_ssrc,
180*d9f75844SAndroid Build Coastguard Worker     uint32_t remote_ssrc,
181*d9f75844SAndroid Build Coastguard Worker     size_t jitter_buffer_max_packets,
182*d9f75844SAndroid Build Coastguard Worker     bool jitter_buffer_fast_playout,
183*d9f75844SAndroid Build Coastguard Worker     int jitter_buffer_min_delay_ms,
184*d9f75844SAndroid Build Coastguard Worker     bool enable_non_sender_rtt,
185*d9f75844SAndroid Build Coastguard Worker     rtc::scoped_refptr<AudioDecoderFactory> decoder_factory,
186*d9f75844SAndroid Build Coastguard Worker     absl::optional<AudioCodecPairId> codec_pair_id,
187*d9f75844SAndroid Build Coastguard Worker     rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor,
188*d9f75844SAndroid Build Coastguard Worker     const webrtc::CryptoOptions& crypto_options,
189*d9f75844SAndroid Build Coastguard Worker     rtc::scoped_refptr<FrameTransformerInterface> frame_transformer);
190*d9f75844SAndroid Build Coastguard Worker 
191*d9f75844SAndroid Build Coastguard Worker }  // namespace voe
192*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
193*d9f75844SAndroid Build Coastguard Worker 
194*d9f75844SAndroid Build Coastguard Worker #endif  // AUDIO_CHANNEL_RECEIVE_H_
195