Niels Möller | 530ead4 | 2018-10-04 12:28:39 | [diff] [blame] | 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 AUDIO_CHANNEL_SEND_H_ |
| 12 | #define AUDIO_CHANNEL_SEND_H_ |
| 13 | |
Niels Möller | 530ead4 | 2018-10-04 12:28:39 | [diff] [blame] | 14 | #include <memory> |
| 15 | #include <string> |
| 16 | #include <vector> |
| 17 | |
| 18 | #include "api/audio/audio_frame.h" |
| 19 | #include "api/audio_codecs/audio_encoder.h" |
Steve Anton | 10542f2 | 2019-01-11 17:11:00 | [diff] [blame] | 20 | #include "api/crypto/crypto_options.h" |
Jonas Oreland | e62c2f2 | 2022-03-29 09:04:48 | [diff] [blame] | 21 | #include "api/field_trials_view.h" |
Marina Ciocea | d2aa8f9 | 2020-03-31 09:29:56 | [diff] [blame] | 22 | #include "api/frame_transformer_interface.h" |
Artem Titov | 741daaf | 2019-03-21 13:37:36 | [diff] [blame] | 23 | #include "api/function_view.h" |
Sebastian Jansson | 44dd9f2 | 2019-03-08 13:50:30 | [diff] [blame] | 24 | #include "api/task_queue/task_queue_factory.h" |
Henrik Boström | 6e436d1 | 2019-05-27 10:19:33 | [diff] [blame] | 25 | #include "modules/rtp_rtcp/include/report_block_data.h" |
Tomas Gunnarsson | f25761d | 2020-06-03 20:55:33 | [diff] [blame] | 26 | #include "modules/rtp_rtcp/source/rtp_rtcp_interface.h" |
Niels Möller | ee5ccbc | 2019-03-06 15:47:29 | [diff] [blame] | 27 | #include "modules/rtp_rtcp/source/rtp_sender_audio.h" |
Niels Möller | 530ead4 | 2018-10-04 12:28:39 | [diff] [blame] | 28 | |
| 29 | namespace webrtc { |
| 30 | |
Benjamin Wright | 84583f6 | 2018-10-04 21:22:34 | [diff] [blame] | 31 | class FrameEncryptorInterface; |
Niels Möller | 530ead4 | 2018-10-04 12:28:39 | [diff] [blame] | 32 | class RtcEventLog; |
Niels Möller | 530ead4 | 2018-10-04 12:28:39 | [diff] [blame] | 33 | class RtpTransportControllerSendInterface; |
| 34 | |
Niels Möller | 530ead4 | 2018-10-04 12:28:39 | [diff] [blame] | 35 | struct CallSendStatistics { |
| 36 | int64_t rttMs; |
Niels Möller | ac0a4cb | 2019-10-09 13:01:33 | [diff] [blame] | 37 | int64_t payload_bytes_sent; |
| 38 | int64_t header_and_padding_bytes_sent; |
Henrik Boström | cf96e0f | 2019-04-17 11:51:53 | [diff] [blame] | 39 | // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-retransmittedbytessent |
| 40 | uint64_t retransmitted_bytes_sent; |
Niels Möller | 530ead4 | 2018-10-04 12:28:39 | [diff] [blame] | 41 | int packetsSent; |
Henrik Boström | aebba7b | 2022-10-26 14:53:03 | [diff] [blame] | 42 | // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-totalpacketsenddelay |
| 43 | TimeDelta total_packet_send_delay = TimeDelta::Zero(); |
Henrik Boström | cf96e0f | 2019-04-17 11:51:53 | [diff] [blame] | 44 | // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-retransmittedpacketssent |
| 45 | uint64_t retransmitted_packets_sent; |
Henrik Boström | 6e436d1 | 2019-05-27 10:19:33 | [diff] [blame] | 46 | // A snapshot of Report Blocks with additional data of interest to statistics. |
| 47 | // Within this list, the sender-source SSRC pair is unique and per-pair the |
| 48 | // ReportBlockData represents the latest Report Block that was received for |
| 49 | // that pair. |
| 50 | std::vector<ReportBlockData> report_block_datas; |
Philipp Hancke | 6a7bf10 | 2023-04-21 17:32:42 | [diff] [blame] | 51 | uint32_t nacks_received; |
Niels Möller | 530ead4 | 2018-10-04 12:28:39 | [diff] [blame] | 52 | }; |
| 53 | |
Niels Möller | 530ead4 | 2018-10-04 12:28:39 | [diff] [blame] | 54 | namespace voe { |
| 55 | |
Niels Möller | dced9f6 | 2018-11-19 09:27:07 | [diff] [blame] | 56 | class ChannelSendInterface { |
Niels Möller | 530ead4 | 2018-10-04 12:28:39 | [diff] [blame] | 57 | public: |
Niels Möller | dced9f6 | 2018-11-19 09:27:07 | [diff] [blame] | 58 | virtual ~ChannelSendInterface() = default; |
Niels Möller | 530ead4 | 2018-10-04 12:28:39 | [diff] [blame] | 59 | |
Niels Möller | 8fb1a6a | 2019-03-05 13:29:42 | [diff] [blame] | 60 | virtual void ReceivedRTCPPacket(const uint8_t* packet, size_t length) = 0; |
Niels Möller | 530ead4 | 2018-10-04 12:28:39 | [diff] [blame] | 61 | |
Niels Möller | dced9f6 | 2018-11-19 09:27:07 | [diff] [blame] | 62 | virtual CallSendStatistics GetRTCPStatistics() const = 0; |
Niels Möller | 530ead4 | 2018-10-04 12:28:39 | [diff] [blame] | 63 | |
Niels Möller | 8fb1a6a | 2019-03-05 13:29:42 | [diff] [blame] | 64 | virtual void SetEncoder(int payload_type, |
Philipp Hancke | d209893 | 2023-11-01 18:18:32 | [diff] [blame] | 65 | const SdpAudioFormat& encoder_format, |
Niels Möller | dced9f6 | 2018-11-19 09:27:07 | [diff] [blame] | 66 | std::unique_ptr<AudioEncoder> encoder) = 0; |
| 67 | virtual void ModifyEncoder( |
| 68 | rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier) = 0; |
Sebastian Jansson | 14a7cf9 | 2019-02-13 14:11:42 | [diff] [blame] | 69 | virtual void CallEncoder(rtc::FunctionView<void(AudioEncoder*)> modifier) = 0; |
Niels Möller | 530ead4 | 2018-10-04 12:28:39 | [diff] [blame] | 70 | |
Amit Hilbuch | 77938e6 | 2018-12-21 17:23:38 | [diff] [blame] | 71 | // Use 0 to indicate that the extension should not be registered. |
Niels Möller | dced9f6 | 2018-11-19 09:27:07 | [diff] [blame] | 72 | virtual void SetRTCP_CNAME(absl::string_view c_name) = 0; |
Niels Möller | dced9f6 | 2018-11-19 09:27:07 | [diff] [blame] | 73 | virtual void SetSendAudioLevelIndicationStatus(bool enable, int id) = 0; |
Niels Möller | dced9f6 | 2018-11-19 09:27:07 | [diff] [blame] | 74 | virtual void RegisterSenderCongestionControlObjects( |
Danil Chapovalov | a2cf8ee | 2023-05-16 11:26:33 | [diff] [blame] | 75 | RtpTransportControllerSendInterface* transport) = 0; |
Niels Möller | dced9f6 | 2018-11-19 09:27:07 | [diff] [blame] | 76 | virtual void ResetSenderCongestionControlObjects() = 0; |
Danil Chapovalov | a9b9d4e | 2023-05-03 11:20:11 | [diff] [blame] | 77 | virtual std::vector<ReportBlockData> GetRemoteRTCPReportBlocks() const = 0; |
Niels Möller | dced9f6 | 2018-11-19 09:27:07 | [diff] [blame] | 78 | virtual ANAStats GetANAStatistics() const = 0; |
Niels Möller | ee5ccbc | 2019-03-06 15:47:29 | [diff] [blame] | 79 | virtual void RegisterCngPayloadType(int payload_type, |
| 80 | int payload_frequency) = 0; |
Niels Möller | 8fb1a6a | 2019-03-05 13:29:42 | [diff] [blame] | 81 | virtual void SetSendTelephoneEventPayloadType(int payload_type, |
Niels Möller | dced9f6 | 2018-11-19 09:27:07 | [diff] [blame] | 82 | int payload_frequency) = 0; |
| 83 | virtual bool SendTelephoneEventOutband(int event, int duration_ms) = 0; |
Sebastian Jansson | 254d869 | 2018-11-21 18:19:00 | [diff] [blame] | 84 | virtual void OnBitrateAllocation(BitrateAllocationUpdate update) = 0; |
Jakob Ivarsson | bf08745 | 2021-11-11 12:43:49 | [diff] [blame] | 85 | virtual int GetTargetBitrate() const = 0; |
Niels Möller | dced9f6 | 2018-11-19 09:27:07 | [diff] [blame] | 86 | virtual void SetInputMute(bool muted) = 0; |
Niels Möller | 530ead4 | 2018-10-04 12:28:39 | [diff] [blame] | 87 | |
Niels Möller | dced9f6 | 2018-11-19 09:27:07 | [diff] [blame] | 88 | virtual void ProcessAndEncodeAudio( |
| 89 | std::unique_ptr<AudioFrame> audio_frame) = 0; |
Tomas Gunnarsson | f25761d | 2020-06-03 20:55:33 | [diff] [blame] | 90 | virtual RtpRtcpInterface* GetRtpRtcp() const = 0; |
Niels Möller | 530ead4 | 2018-10-04 12:28:39 | [diff] [blame] | 91 | |
Artem Titov | b0ea637 | 2021-07-26 09:47:07 | [diff] [blame] | 92 | // In RTP we currently rely on RTCP packets (`ReceivedRTCPPacket`) to inform |
Piotr (Peter) Slatala | 179a392 | 2018-11-16 17:57:58 | [diff] [blame] | 93 | // about RTT. |
| 94 | // In media transport we rely on the TargetTransferRateObserver instead. |
| 95 | // In other words, if you are using RTP, you should expect |
Artem Titov | b0ea637 | 2021-07-26 09:47:07 | [diff] [blame] | 96 | // `ReceivedRTCPPacket` to be called, if you are using media transport, |
| 97 | // `OnTargetTransferRate` will be called. |
Piotr (Peter) Slatala | 179a392 | 2018-11-16 17:57:58 | [diff] [blame] | 98 | // |
| 99 | // In future, RTP media will move to the media transport implementation and |
| 100 | // these conditions will be removed. |
Niels Möller | dced9f6 | 2018-11-19 09:27:07 | [diff] [blame] | 101 | // Returns the RTT in milliseconds. |
| 102 | virtual int64_t GetRTT() const = 0; |
| 103 | virtual void StartSend() = 0; |
| 104 | virtual void StopSend() = 0; |
Piotr (Peter) Slatala | 179a392 | 2018-11-16 17:57:58 | [diff] [blame] | 105 | |
Niels Möller | dced9f6 | 2018-11-19 09:27:07 | [diff] [blame] | 106 | // E2EE Custom Audio Frame Encryption (Optional) |
| 107 | virtual void SetFrameEncryptor( |
| 108 | rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) = 0; |
Marina Ciocea | d2aa8f9 | 2020-03-31 09:29:56 | [diff] [blame] | 109 | |
| 110 | // Sets a frame transformer between encoder and packetizer, to transform |
| 111 | // encoded frames before sending them out the network. |
| 112 | virtual void SetEncoderToPacketizerFrameTransformer( |
| 113 | rtc::scoped_refptr<webrtc::FrameTransformerInterface> |
| 114 | frame_transformer) = 0; |
Niels Möller | 530ead4 | 2018-10-04 12:28:39 | [diff] [blame] | 115 | }; |
| 116 | |
Niels Möller | dced9f6 | 2018-11-19 09:27:07 | [diff] [blame] | 117 | std::unique_ptr<ChannelSendInterface> CreateChannelSend( |
Sebastian Jansson | 977b335 | 2019-03-04 16:43:34 | [diff] [blame] | 118 | Clock* clock, |
Sebastian Jansson | 44dd9f2 | 2019-03-08 13:50:30 | [diff] [blame] | 119 | TaskQueueFactory* task_queue_factory, |
Niels Möller | e977199 | 2018-11-26 09:55:07 | [diff] [blame] | 120 | Transport* rtp_transport, |
Niels Möller | dced9f6 | 2018-11-19 09:27:07 | [diff] [blame] | 121 | RtcpRttStats* rtcp_rtt_stats, |
| 122 | RtcEventLog* rtc_event_log, |
| 123 | FrameEncryptorInterface* frame_encryptor, |
| 124 | const webrtc::CryptoOptions& crypto_options, |
| 125 | bool extmap_allow_mixed, |
Erik Språng | 4c2c412 | 2019-07-11 13:20:15 | [diff] [blame] | 126 | int rtcp_report_interval_ms, |
Marina Ciocea | d2aa8f9 | 2020-03-31 09:29:56 | [diff] [blame] | 127 | uint32_t ssrc, |
Erik Språng | 2b4d2f3 | 2020-06-29 14:37:44 | [diff] [blame] | 128 | rtc::scoped_refptr<FrameTransformerInterface> frame_transformer, |
Danil Chapovalov | a2cf8ee | 2023-05-16 11:26:33 | [diff] [blame] | 129 | RtpTransportControllerSendInterface* transport_controller, |
Jonas Oreland | e62c2f2 | 2022-03-29 09:04:48 | [diff] [blame] | 130 | const FieldTrialsView& field_trials); |
Niels Möller | dced9f6 | 2018-11-19 09:27:07 | [diff] [blame] | 131 | |
Niels Möller | 530ead4 | 2018-10-04 12:28:39 | [diff] [blame] | 132 | } // namespace voe |
| 133 | } // namespace webrtc |
| 134 | |
| 135 | #endif // AUDIO_CHANNEL_SEND_H_ |