xref: /aosp_15_r20/external/webrtc/audio/channel_send.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_SEND_H_
12*d9f75844SAndroid Build Coastguard Worker #define AUDIO_CHANNEL_SEND_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <memory>
15*d9f75844SAndroid Build Coastguard Worker #include <string>
16*d9f75844SAndroid Build Coastguard Worker #include <vector>
17*d9f75844SAndroid Build Coastguard Worker 
18*d9f75844SAndroid Build Coastguard Worker #include "api/audio/audio_frame.h"
19*d9f75844SAndroid Build Coastguard Worker #include "api/audio_codecs/audio_encoder.h"
20*d9f75844SAndroid Build Coastguard Worker #include "api/crypto/crypto_options.h"
21*d9f75844SAndroid Build Coastguard Worker #include "api/field_trials_view.h"
22*d9f75844SAndroid Build Coastguard Worker #include "api/frame_transformer_interface.h"
23*d9f75844SAndroid Build Coastguard Worker #include "api/function_view.h"
24*d9f75844SAndroid Build Coastguard Worker #include "api/task_queue/task_queue_factory.h"
25*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/include/report_block_data.h"
26*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_rtcp_interface.h"
27*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_sender_audio.h"
28*d9f75844SAndroid Build Coastguard Worker 
29*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
30*d9f75844SAndroid Build Coastguard Worker 
31*d9f75844SAndroid Build Coastguard Worker class FrameEncryptorInterface;
32*d9f75844SAndroid Build Coastguard Worker class RtcEventLog;
33*d9f75844SAndroid Build Coastguard Worker class RtpTransportControllerSendInterface;
34*d9f75844SAndroid Build Coastguard Worker 
35*d9f75844SAndroid Build Coastguard Worker struct CallSendStatistics {
36*d9f75844SAndroid Build Coastguard Worker   int64_t rttMs;
37*d9f75844SAndroid Build Coastguard Worker   int64_t payload_bytes_sent;
38*d9f75844SAndroid Build Coastguard Worker   int64_t header_and_padding_bytes_sent;
39*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-retransmittedbytessent
40*d9f75844SAndroid Build Coastguard Worker   uint64_t retransmitted_bytes_sent;
41*d9f75844SAndroid Build Coastguard Worker   int packetsSent;
42*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-totalpacketsenddelay
43*d9f75844SAndroid Build Coastguard Worker   TimeDelta total_packet_send_delay = TimeDelta::Zero();
44*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-retransmittedpacketssent
45*d9f75844SAndroid Build Coastguard Worker   uint64_t retransmitted_packets_sent;
46*d9f75844SAndroid Build Coastguard Worker   // A snapshot of Report Blocks with additional data of interest to statistics.
47*d9f75844SAndroid Build Coastguard Worker   // Within this list, the sender-source SSRC pair is unique and per-pair the
48*d9f75844SAndroid Build Coastguard Worker   // ReportBlockData represents the latest Report Block that was received for
49*d9f75844SAndroid Build Coastguard Worker   // that pair.
50*d9f75844SAndroid Build Coastguard Worker   std::vector<ReportBlockData> report_block_datas;
51*d9f75844SAndroid Build Coastguard Worker   uint32_t nacks_rcvd;
52*d9f75844SAndroid Build Coastguard Worker };
53*d9f75844SAndroid Build Coastguard Worker 
54*d9f75844SAndroid Build Coastguard Worker // See section 6.4.2 in http://www.ietf.org/rfc/rfc3550.txt for details.
55*d9f75844SAndroid Build Coastguard Worker struct ReportBlock {
56*d9f75844SAndroid Build Coastguard Worker   uint32_t sender_SSRC;  // SSRC of sender
57*d9f75844SAndroid Build Coastguard Worker   uint32_t source_SSRC;
58*d9f75844SAndroid Build Coastguard Worker   uint8_t fraction_lost;
59*d9f75844SAndroid Build Coastguard Worker   int32_t cumulative_num_packets_lost;
60*d9f75844SAndroid Build Coastguard Worker   uint32_t extended_highest_sequence_number;
61*d9f75844SAndroid Build Coastguard Worker   uint32_t interarrival_jitter;
62*d9f75844SAndroid Build Coastguard Worker   uint32_t last_SR_timestamp;
63*d9f75844SAndroid Build Coastguard Worker   uint32_t delay_since_last_SR;
64*d9f75844SAndroid Build Coastguard Worker };
65*d9f75844SAndroid Build Coastguard Worker 
66*d9f75844SAndroid Build Coastguard Worker namespace voe {
67*d9f75844SAndroid Build Coastguard Worker 
68*d9f75844SAndroid Build Coastguard Worker class ChannelSendInterface {
69*d9f75844SAndroid Build Coastguard Worker  public:
70*d9f75844SAndroid Build Coastguard Worker   virtual ~ChannelSendInterface() = default;
71*d9f75844SAndroid Build Coastguard Worker 
72*d9f75844SAndroid Build Coastguard Worker   virtual void ReceivedRTCPPacket(const uint8_t* packet, size_t length) = 0;
73*d9f75844SAndroid Build Coastguard Worker 
74*d9f75844SAndroid Build Coastguard Worker   virtual CallSendStatistics GetRTCPStatistics() const = 0;
75*d9f75844SAndroid Build Coastguard Worker 
76*d9f75844SAndroid Build Coastguard Worker   virtual void SetEncoder(int payload_type,
77*d9f75844SAndroid Build Coastguard Worker                           std::unique_ptr<AudioEncoder> encoder) = 0;
78*d9f75844SAndroid Build Coastguard Worker   virtual void ModifyEncoder(
79*d9f75844SAndroid Build Coastguard Worker       rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier) = 0;
80*d9f75844SAndroid Build Coastguard Worker   virtual void CallEncoder(rtc::FunctionView<void(AudioEncoder*)> modifier) = 0;
81*d9f75844SAndroid Build Coastguard Worker 
82*d9f75844SAndroid Build Coastguard Worker   // Use 0 to indicate that the extension should not be registered.
83*d9f75844SAndroid Build Coastguard Worker   virtual void SetRTCP_CNAME(absl::string_view c_name) = 0;
84*d9f75844SAndroid Build Coastguard Worker   virtual void SetSendAudioLevelIndicationStatus(bool enable, int id) = 0;
85*d9f75844SAndroid Build Coastguard Worker   virtual void RegisterSenderCongestionControlObjects(
86*d9f75844SAndroid Build Coastguard Worker       RtpTransportControllerSendInterface* transport,
87*d9f75844SAndroid Build Coastguard Worker       RtcpBandwidthObserver* bandwidth_observer) = 0;
88*d9f75844SAndroid Build Coastguard Worker   virtual void ResetSenderCongestionControlObjects() = 0;
89*d9f75844SAndroid Build Coastguard Worker   virtual std::vector<ReportBlock> GetRemoteRTCPReportBlocks() const = 0;
90*d9f75844SAndroid Build Coastguard Worker   virtual ANAStats GetANAStatistics() const = 0;
91*d9f75844SAndroid Build Coastguard Worker   virtual void RegisterCngPayloadType(int payload_type,
92*d9f75844SAndroid Build Coastguard Worker                                       int payload_frequency) = 0;
93*d9f75844SAndroid Build Coastguard Worker   virtual void SetSendTelephoneEventPayloadType(int payload_type,
94*d9f75844SAndroid Build Coastguard Worker                                                 int payload_frequency) = 0;
95*d9f75844SAndroid Build Coastguard Worker   virtual bool SendTelephoneEventOutband(int event, int duration_ms) = 0;
96*d9f75844SAndroid Build Coastguard Worker   virtual void OnBitrateAllocation(BitrateAllocationUpdate update) = 0;
97*d9f75844SAndroid Build Coastguard Worker   virtual int GetTargetBitrate() const = 0;
98*d9f75844SAndroid Build Coastguard Worker   virtual void SetInputMute(bool muted) = 0;
99*d9f75844SAndroid Build Coastguard Worker 
100*d9f75844SAndroid Build Coastguard Worker   virtual void ProcessAndEncodeAudio(
101*d9f75844SAndroid Build Coastguard Worker       std::unique_ptr<AudioFrame> audio_frame) = 0;
102*d9f75844SAndroid Build Coastguard Worker   virtual RtpRtcpInterface* GetRtpRtcp() const = 0;
103*d9f75844SAndroid Build Coastguard Worker 
104*d9f75844SAndroid Build Coastguard Worker   // In RTP we currently rely on RTCP packets (`ReceivedRTCPPacket`) to inform
105*d9f75844SAndroid Build Coastguard Worker   // about RTT.
106*d9f75844SAndroid Build Coastguard Worker   // In media transport we rely on the TargetTransferRateObserver instead.
107*d9f75844SAndroid Build Coastguard Worker   // In other words, if you are using RTP, you should expect
108*d9f75844SAndroid Build Coastguard Worker   // `ReceivedRTCPPacket` to be called, if you are using media transport,
109*d9f75844SAndroid Build Coastguard Worker   // `OnTargetTransferRate` will be called.
110*d9f75844SAndroid Build Coastguard Worker   //
111*d9f75844SAndroid Build Coastguard Worker   // In future, RTP media will move to the media transport implementation and
112*d9f75844SAndroid Build Coastguard Worker   // these conditions will be removed.
113*d9f75844SAndroid Build Coastguard Worker   // Returns the RTT in milliseconds.
114*d9f75844SAndroid Build Coastguard Worker   virtual int64_t GetRTT() const = 0;
115*d9f75844SAndroid Build Coastguard Worker   virtual void StartSend() = 0;
116*d9f75844SAndroid Build Coastguard Worker   virtual void StopSend() = 0;
117*d9f75844SAndroid Build Coastguard Worker 
118*d9f75844SAndroid Build Coastguard Worker   // E2EE Custom Audio Frame Encryption (Optional)
119*d9f75844SAndroid Build Coastguard Worker   virtual void SetFrameEncryptor(
120*d9f75844SAndroid Build Coastguard Worker       rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) = 0;
121*d9f75844SAndroid Build Coastguard Worker 
122*d9f75844SAndroid Build Coastguard Worker   // Sets a frame transformer between encoder and packetizer, to transform
123*d9f75844SAndroid Build Coastguard Worker   // encoded frames before sending them out the network.
124*d9f75844SAndroid Build Coastguard Worker   virtual void SetEncoderToPacketizerFrameTransformer(
125*d9f75844SAndroid Build Coastguard Worker       rtc::scoped_refptr<webrtc::FrameTransformerInterface>
126*d9f75844SAndroid Build Coastguard Worker           frame_transformer) = 0;
127*d9f75844SAndroid Build Coastguard Worker };
128*d9f75844SAndroid Build Coastguard Worker 
129*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<ChannelSendInterface> CreateChannelSend(
130*d9f75844SAndroid Build Coastguard Worker     Clock* clock,
131*d9f75844SAndroid Build Coastguard Worker     TaskQueueFactory* task_queue_factory,
132*d9f75844SAndroid Build Coastguard Worker     Transport* rtp_transport,
133*d9f75844SAndroid Build Coastguard Worker     RtcpRttStats* rtcp_rtt_stats,
134*d9f75844SAndroid Build Coastguard Worker     RtcEventLog* rtc_event_log,
135*d9f75844SAndroid Build Coastguard Worker     FrameEncryptorInterface* frame_encryptor,
136*d9f75844SAndroid Build Coastguard Worker     const webrtc::CryptoOptions& crypto_options,
137*d9f75844SAndroid Build Coastguard Worker     bool extmap_allow_mixed,
138*d9f75844SAndroid Build Coastguard Worker     int rtcp_report_interval_ms,
139*d9f75844SAndroid Build Coastguard Worker     uint32_t ssrc,
140*d9f75844SAndroid Build Coastguard Worker     rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
141*d9f75844SAndroid Build Coastguard Worker     TransportFeedbackObserver* feedback_observer,
142*d9f75844SAndroid Build Coastguard Worker     const FieldTrialsView& field_trials);
143*d9f75844SAndroid Build Coastguard Worker 
144*d9f75844SAndroid Build Coastguard Worker }  // namespace voe
145*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
146*d9f75844SAndroid Build Coastguard Worker 
147*d9f75844SAndroid Build Coastguard Worker #endif  // AUDIO_CHANNEL_SEND_H_
148