xref: /aosp_15_r20/external/webrtc/media/base/media_channel.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2004 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 MEDIA_BASE_MEDIA_CHANNEL_H_
12*d9f75844SAndroid Build Coastguard Worker #define MEDIA_BASE_MEDIA_CHANNEL_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 <utility>
18*d9f75844SAndroid Build Coastguard Worker #include <vector>
19*d9f75844SAndroid Build Coastguard Worker 
20*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h"
21*d9f75844SAndroid Build Coastguard Worker #include "api/audio_codecs/audio_encoder.h"
22*d9f75844SAndroid Build Coastguard Worker #include "api/audio_options.h"
23*d9f75844SAndroid Build Coastguard Worker #include "api/crypto/frame_decryptor_interface.h"
24*d9f75844SAndroid Build Coastguard Worker #include "api/crypto/frame_encryptor_interface.h"
25*d9f75844SAndroid Build Coastguard Worker #include "api/frame_transformer_interface.h"
26*d9f75844SAndroid Build Coastguard Worker #include "api/media_stream_interface.h"
27*d9f75844SAndroid Build Coastguard Worker #include "api/rtc_error.h"
28*d9f75844SAndroid Build Coastguard Worker #include "api/rtp_parameters.h"
29*d9f75844SAndroid Build Coastguard Worker #include "api/rtp_sender_interface.h"
30*d9f75844SAndroid Build Coastguard Worker #include "api/task_queue/pending_task_safety_flag.h"
31*d9f75844SAndroid Build Coastguard Worker #include "api/transport/data_channel_transport_interface.h"
32*d9f75844SAndroid Build Coastguard Worker #include "api/transport/rtp/rtp_source.h"
33*d9f75844SAndroid Build Coastguard Worker #include "api/units/time_delta.h"
34*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_content_type.h"
35*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_sink_interface.h"
36*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_source_interface.h"
37*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_timing.h"
38*d9f75844SAndroid Build Coastguard Worker #include "api/video_codecs/video_encoder_factory.h"
39*d9f75844SAndroid Build Coastguard Worker #include "call/video_receive_stream.h"
40*d9f75844SAndroid Build Coastguard Worker #include "common_video/include/quality_limitation_reason.h"
41*d9f75844SAndroid Build Coastguard Worker #include "media/base/codec.h"
42*d9f75844SAndroid Build Coastguard Worker #include "media/base/delayable.h"
43*d9f75844SAndroid Build Coastguard Worker #include "media/base/media_constants.h"
44*d9f75844SAndroid Build Coastguard Worker #include "media/base/stream_params.h"
45*d9f75844SAndroid Build Coastguard Worker #include "modules/audio_processing/include/audio_processing_statistics.h"
46*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/include/report_block_data.h"
47*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/async_packet_socket.h"
48*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/buffer.h"
49*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/copy_on_write_buffer.h"
50*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/dscp.h"
51*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/logging.h"
52*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/network_route.h"
53*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/socket.h"
54*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/string_encode.h"
55*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/strings/string_builder.h"
56*d9f75844SAndroid Build Coastguard Worker #include "video/config/video_encoder_config.h"
57*d9f75844SAndroid Build Coastguard Worker 
58*d9f75844SAndroid Build Coastguard Worker namespace rtc {
59*d9f75844SAndroid Build Coastguard Worker class Timing;
60*d9f75844SAndroid Build Coastguard Worker }
61*d9f75844SAndroid Build Coastguard Worker 
62*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
63*d9f75844SAndroid Build Coastguard Worker class AudioSinkInterface;
64*d9f75844SAndroid Build Coastguard Worker class VideoFrame;
65*d9f75844SAndroid Build Coastguard Worker 
66*d9f75844SAndroid Build Coastguard Worker webrtc::RTCError InvokeSetParametersCallback(SetParametersCallback& callback,
67*d9f75844SAndroid Build Coastguard Worker                                              RTCError error);
68*d9f75844SAndroid Build Coastguard Worker 
69*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
70*d9f75844SAndroid Build Coastguard Worker 
71*d9f75844SAndroid Build Coastguard Worker namespace cricket {
72*d9f75844SAndroid Build Coastguard Worker 
73*d9f75844SAndroid Build Coastguard Worker class AudioSource;
74*d9f75844SAndroid Build Coastguard Worker class VideoCapturer;
75*d9f75844SAndroid Build Coastguard Worker struct RtpHeader;
76*d9f75844SAndroid Build Coastguard Worker struct VideoFormat;
77*d9f75844SAndroid Build Coastguard Worker 
78*d9f75844SAndroid Build Coastguard Worker const int kScreencastDefaultFps = 5;
79*d9f75844SAndroid Build Coastguard Worker 
80*d9f75844SAndroid Build Coastguard Worker template <class T>
ToStringIfSet(const char * key,const absl::optional<T> & val)81*d9f75844SAndroid Build Coastguard Worker static std::string ToStringIfSet(const char* key,
82*d9f75844SAndroid Build Coastguard Worker                                  const absl::optional<T>& val) {
83*d9f75844SAndroid Build Coastguard Worker   std::string str;
84*d9f75844SAndroid Build Coastguard Worker   if (val) {
85*d9f75844SAndroid Build Coastguard Worker     str = key;
86*d9f75844SAndroid Build Coastguard Worker     str += ": ";
87*d9f75844SAndroid Build Coastguard Worker     str += val ? rtc::ToString(*val) : "";
88*d9f75844SAndroid Build Coastguard Worker     str += ", ";
89*d9f75844SAndroid Build Coastguard Worker   }
90*d9f75844SAndroid Build Coastguard Worker   return str;
91*d9f75844SAndroid Build Coastguard Worker }
92*d9f75844SAndroid Build Coastguard Worker 
93*d9f75844SAndroid Build Coastguard Worker template <class T>
VectorToString(const std::vector<T> & vals)94*d9f75844SAndroid Build Coastguard Worker static std::string VectorToString(const std::vector<T>& vals) {
95*d9f75844SAndroid Build Coastguard Worker   rtc::StringBuilder ost;  // no-presubmit-check TODO(webrtc:8982)
96*d9f75844SAndroid Build Coastguard Worker   ost << "[";
97*d9f75844SAndroid Build Coastguard Worker   for (size_t i = 0; i < vals.size(); ++i) {
98*d9f75844SAndroid Build Coastguard Worker     if (i > 0) {
99*d9f75844SAndroid Build Coastguard Worker       ost << ", ";
100*d9f75844SAndroid Build Coastguard Worker     }
101*d9f75844SAndroid Build Coastguard Worker     ost << vals[i].ToString();
102*d9f75844SAndroid Build Coastguard Worker   }
103*d9f75844SAndroid Build Coastguard Worker   ost << "]";
104*d9f75844SAndroid Build Coastguard Worker   return ost.Release();
105*d9f75844SAndroid Build Coastguard Worker }
106*d9f75844SAndroid Build Coastguard Worker 
107*d9f75844SAndroid Build Coastguard Worker // Options that can be applied to a VideoMediaChannel or a VideoMediaEngine.
108*d9f75844SAndroid Build Coastguard Worker // Used to be flags, but that makes it hard to selectively apply options.
109*d9f75844SAndroid Build Coastguard Worker // We are moving all of the setting of options to structs like this,
110*d9f75844SAndroid Build Coastguard Worker // but some things currently still use flags.
111*d9f75844SAndroid Build Coastguard Worker struct VideoOptions {
112*d9f75844SAndroid Build Coastguard Worker   VideoOptions();
113*d9f75844SAndroid Build Coastguard Worker   ~VideoOptions();
114*d9f75844SAndroid Build Coastguard Worker 
SetAllVideoOptions115*d9f75844SAndroid Build Coastguard Worker   void SetAll(const VideoOptions& change) {
116*d9f75844SAndroid Build Coastguard Worker     SetFrom(&video_noise_reduction, change.video_noise_reduction);
117*d9f75844SAndroid Build Coastguard Worker     SetFrom(&screencast_min_bitrate_kbps, change.screencast_min_bitrate_kbps);
118*d9f75844SAndroid Build Coastguard Worker     SetFrom(&is_screencast, change.is_screencast);
119*d9f75844SAndroid Build Coastguard Worker   }
120*d9f75844SAndroid Build Coastguard Worker 
121*d9f75844SAndroid Build Coastguard Worker   bool operator==(const VideoOptions& o) const {
122*d9f75844SAndroid Build Coastguard Worker     return video_noise_reduction == o.video_noise_reduction &&
123*d9f75844SAndroid Build Coastguard Worker            screencast_min_bitrate_kbps == o.screencast_min_bitrate_kbps &&
124*d9f75844SAndroid Build Coastguard Worker            is_screencast == o.is_screencast;
125*d9f75844SAndroid Build Coastguard Worker   }
126*d9f75844SAndroid Build Coastguard Worker   bool operator!=(const VideoOptions& o) const { return !(*this == o); }
127*d9f75844SAndroid Build Coastguard Worker 
ToStringVideoOptions128*d9f75844SAndroid Build Coastguard Worker   std::string ToString() const {
129*d9f75844SAndroid Build Coastguard Worker     rtc::StringBuilder ost;
130*d9f75844SAndroid Build Coastguard Worker     ost << "VideoOptions {";
131*d9f75844SAndroid Build Coastguard Worker     ost << ToStringIfSet("noise reduction", video_noise_reduction);
132*d9f75844SAndroid Build Coastguard Worker     ost << ToStringIfSet("screencast min bitrate kbps",
133*d9f75844SAndroid Build Coastguard Worker                          screencast_min_bitrate_kbps);
134*d9f75844SAndroid Build Coastguard Worker     ost << ToStringIfSet("is_screencast ", is_screencast);
135*d9f75844SAndroid Build Coastguard Worker     ost << "}";
136*d9f75844SAndroid Build Coastguard Worker     return ost.Release();
137*d9f75844SAndroid Build Coastguard Worker   }
138*d9f75844SAndroid Build Coastguard Worker 
139*d9f75844SAndroid Build Coastguard Worker   // Enable denoising? This flag comes from the getUserMedia
140*d9f75844SAndroid Build Coastguard Worker   // constraint 'googNoiseReduction', and WebRtcVideoEngine passes it
141*d9f75844SAndroid Build Coastguard Worker   // on to the codec options. Disabled by default.
142*d9f75844SAndroid Build Coastguard Worker   absl::optional<bool> video_noise_reduction;
143*d9f75844SAndroid Build Coastguard Worker   // Force screencast to use a minimum bitrate. This flag comes from
144*d9f75844SAndroid Build Coastguard Worker   // the PeerConnection constraint 'googScreencastMinBitrate'. It is
145*d9f75844SAndroid Build Coastguard Worker   // copied to the encoder config by WebRtcVideoChannel.
146*d9f75844SAndroid Build Coastguard Worker   // TODO(https://crbug.com/1315155): Remove the ability to set it in Chromium
147*d9f75844SAndroid Build Coastguard Worker   // and delete this flag (it should default to 100 kbps).
148*d9f75844SAndroid Build Coastguard Worker   absl::optional<int> screencast_min_bitrate_kbps;
149*d9f75844SAndroid Build Coastguard Worker   // Set by screencast sources. Implies selection of encoding settings
150*d9f75844SAndroid Build Coastguard Worker   // suitable for screencast. Most likely not the right way to do
151*d9f75844SAndroid Build Coastguard Worker   // things, e.g., screencast of a text document and screencast of a
152*d9f75844SAndroid Build Coastguard Worker   // youtube video have different needs.
153*d9f75844SAndroid Build Coastguard Worker   absl::optional<bool> is_screencast;
154*d9f75844SAndroid Build Coastguard Worker   webrtc::VideoTrackInterface::ContentHint content_hint;
155*d9f75844SAndroid Build Coastguard Worker 
156*d9f75844SAndroid Build Coastguard Worker  private:
157*d9f75844SAndroid Build Coastguard Worker   template <typename T>
SetFromVideoOptions158*d9f75844SAndroid Build Coastguard Worker   static void SetFrom(absl::optional<T>* s, const absl::optional<T>& o) {
159*d9f75844SAndroid Build Coastguard Worker     if (o) {
160*d9f75844SAndroid Build Coastguard Worker       *s = o;
161*d9f75844SAndroid Build Coastguard Worker     }
162*d9f75844SAndroid Build Coastguard Worker   }
163*d9f75844SAndroid Build Coastguard Worker };
164*d9f75844SAndroid Build Coastguard Worker 
165*d9f75844SAndroid Build Coastguard Worker class MediaChannel {
166*d9f75844SAndroid Build Coastguard Worker  public:
167*d9f75844SAndroid Build Coastguard Worker   class NetworkInterface {
168*d9f75844SAndroid Build Coastguard Worker    public:
169*d9f75844SAndroid Build Coastguard Worker     enum SocketType { ST_RTP, ST_RTCP };
170*d9f75844SAndroid Build Coastguard Worker     virtual bool SendPacket(rtc::CopyOnWriteBuffer* packet,
171*d9f75844SAndroid Build Coastguard Worker                             const rtc::PacketOptions& options) = 0;
172*d9f75844SAndroid Build Coastguard Worker     virtual bool SendRtcp(rtc::CopyOnWriteBuffer* packet,
173*d9f75844SAndroid Build Coastguard Worker                           const rtc::PacketOptions& options) = 0;
174*d9f75844SAndroid Build Coastguard Worker     virtual int SetOption(SocketType type,
175*d9f75844SAndroid Build Coastguard Worker                           rtc::Socket::Option opt,
176*d9f75844SAndroid Build Coastguard Worker                           int option) = 0;
~NetworkInterface()177*d9f75844SAndroid Build Coastguard Worker     virtual ~NetworkInterface() {}
178*d9f75844SAndroid Build Coastguard Worker   };
179*d9f75844SAndroid Build Coastguard Worker 
180*d9f75844SAndroid Build Coastguard Worker   explicit MediaChannel(webrtc::TaskQueueBase* network_thread,
181*d9f75844SAndroid Build Coastguard Worker                         bool enable_dscp = false);
182*d9f75844SAndroid Build Coastguard Worker   virtual ~MediaChannel();
183*d9f75844SAndroid Build Coastguard Worker 
184*d9f75844SAndroid Build Coastguard Worker   virtual cricket::MediaType media_type() const = 0;
185*d9f75844SAndroid Build Coastguard Worker 
186*d9f75844SAndroid Build Coastguard Worker   // Sets the abstract interface class for sending RTP/RTCP data.
187*d9f75844SAndroid Build Coastguard Worker   virtual void SetInterface(NetworkInterface* iface);
188*d9f75844SAndroid Build Coastguard Worker   // Called on the network when an RTP packet is received.
189*d9f75844SAndroid Build Coastguard Worker   virtual void OnPacketReceived(rtc::CopyOnWriteBuffer packet,
190*d9f75844SAndroid Build Coastguard Worker                                 int64_t packet_time_us) = 0;
191*d9f75844SAndroid Build Coastguard Worker   // Called on the network thread after a transport has finished sending a
192*d9f75844SAndroid Build Coastguard Worker   // packet.
193*d9f75844SAndroid Build Coastguard Worker   virtual void OnPacketSent(const rtc::SentPacket& sent_packet) = 0;
194*d9f75844SAndroid Build Coastguard Worker   // Called when the socket's ability to send has changed.
195*d9f75844SAndroid Build Coastguard Worker   virtual void OnReadyToSend(bool ready) = 0;
196*d9f75844SAndroid Build Coastguard Worker   // Called when the network route used for sending packets changed.
197*d9f75844SAndroid Build Coastguard Worker   virtual void OnNetworkRouteChanged(
198*d9f75844SAndroid Build Coastguard Worker       absl::string_view transport_name,
199*d9f75844SAndroid Build Coastguard Worker       const rtc::NetworkRoute& network_route) = 0;
200*d9f75844SAndroid Build Coastguard Worker   // Creates a new outgoing media stream with SSRCs and CNAME as described
201*d9f75844SAndroid Build Coastguard Worker   // by sp.
202*d9f75844SAndroid Build Coastguard Worker   virtual bool AddSendStream(const StreamParams& sp) = 0;
203*d9f75844SAndroid Build Coastguard Worker   // Removes an outgoing media stream.
204*d9f75844SAndroid Build Coastguard Worker   // SSRC must be the first SSRC of the media stream if the stream uses
205*d9f75844SAndroid Build Coastguard Worker   // multiple SSRCs. In the case of an ssrc of 0, the possibly cached
206*d9f75844SAndroid Build Coastguard Worker   // StreamParams is removed.
207*d9f75844SAndroid Build Coastguard Worker   virtual bool RemoveSendStream(uint32_t ssrc) = 0;
208*d9f75844SAndroid Build Coastguard Worker   // Creates a new incoming media stream with SSRCs, CNAME as described
209*d9f75844SAndroid Build Coastguard Worker   // by sp. In the case of a sp without SSRCs, the unsignaled sp is cached
210*d9f75844SAndroid Build Coastguard Worker   // to be used later for unsignaled streams received.
211*d9f75844SAndroid Build Coastguard Worker   virtual bool AddRecvStream(const StreamParams& sp) = 0;
212*d9f75844SAndroid Build Coastguard Worker   // Removes an incoming media stream.
213*d9f75844SAndroid Build Coastguard Worker   // ssrc must be the first SSRC of the media stream if the stream uses
214*d9f75844SAndroid Build Coastguard Worker   // multiple SSRCs.
215*d9f75844SAndroid Build Coastguard Worker   virtual bool RemoveRecvStream(uint32_t ssrc) = 0;
216*d9f75844SAndroid Build Coastguard Worker   // Resets any cached StreamParams for an unsignaled RecvStream, and removes
217*d9f75844SAndroid Build Coastguard Worker   // any existing unsignaled streams.
218*d9f75844SAndroid Build Coastguard Worker   virtual void ResetUnsignaledRecvStream() = 0;
219*d9f75844SAndroid Build Coastguard Worker   // This is currently a workaround because of the demuxer state being managed
220*d9f75844SAndroid Build Coastguard Worker   // across two separate threads. Once the state is consistently managed on
221*d9f75844SAndroid Build Coastguard Worker   // the same thread (network), this workaround can be removed.
222*d9f75844SAndroid Build Coastguard Worker   // These two notifications inform the media channel when the transport's
223*d9f75844SAndroid Build Coastguard Worker   // demuxer criteria is being updated.
224*d9f75844SAndroid Build Coastguard Worker   // * OnDemuxerCriteriaUpdatePending() happens on the same thread that the
225*d9f75844SAndroid Build Coastguard Worker   //   channel's streams are added and removed (worker thread).
226*d9f75844SAndroid Build Coastguard Worker   // * OnDemuxerCriteriaUpdateComplete() happens on the same thread.
227*d9f75844SAndroid Build Coastguard Worker   // Because the demuxer is updated asynchronously, there is a window of time
228*d9f75844SAndroid Build Coastguard Worker   // where packets are arriving to the channel for streams that have already
229*d9f75844SAndroid Build Coastguard Worker   // been removed on the worker thread. It is important NOT to treat these as
230*d9f75844SAndroid Build Coastguard Worker   // new unsignalled ssrcs.
231*d9f75844SAndroid Build Coastguard Worker   virtual void OnDemuxerCriteriaUpdatePending() = 0;
232*d9f75844SAndroid Build Coastguard Worker   virtual void OnDemuxerCriteriaUpdateComplete() = 0;
233*d9f75844SAndroid Build Coastguard Worker   // Returns the absoulte sendtime extension id value from media channel.
234*d9f75844SAndroid Build Coastguard Worker   virtual int GetRtpSendTimeExtnId() const;
235*d9f75844SAndroid Build Coastguard Worker   // Set the frame encryptor to use on all outgoing frames. This is optional.
236*d9f75844SAndroid Build Coastguard Worker   // This pointers lifetime is managed by the set of RtpSender it is attached
237*d9f75844SAndroid Build Coastguard Worker   // to.
238*d9f75844SAndroid Build Coastguard Worker   // TODO(benwright) make pure virtual once internal supports it.
239*d9f75844SAndroid Build Coastguard Worker   virtual void SetFrameEncryptor(
240*d9f75844SAndroid Build Coastguard Worker       uint32_t ssrc,
241*d9f75844SAndroid Build Coastguard Worker       rtc::scoped_refptr<webrtc::FrameEncryptorInterface> frame_encryptor);
242*d9f75844SAndroid Build Coastguard Worker   // Set the frame decryptor to use on all incoming frames. This is optional.
243*d9f75844SAndroid Build Coastguard Worker   // This pointers lifetimes is managed by the set of RtpReceivers it is
244*d9f75844SAndroid Build Coastguard Worker   // attached to.
245*d9f75844SAndroid Build Coastguard Worker   // TODO(benwright) make pure virtual once internal supports it.
246*d9f75844SAndroid Build Coastguard Worker   virtual void SetFrameDecryptor(
247*d9f75844SAndroid Build Coastguard Worker       uint32_t ssrc,
248*d9f75844SAndroid Build Coastguard Worker       rtc::scoped_refptr<webrtc::FrameDecryptorInterface> frame_decryptor);
249*d9f75844SAndroid Build Coastguard Worker 
250*d9f75844SAndroid Build Coastguard Worker   // Enable network condition based codec switching.
251*d9f75844SAndroid Build Coastguard Worker   virtual void SetVideoCodecSwitchingEnabled(bool enabled);
252*d9f75844SAndroid Build Coastguard Worker 
253*d9f75844SAndroid Build Coastguard Worker   // note: The encoder_selector object must remain valid for the lifetime of the
254*d9f75844SAndroid Build Coastguard Worker   // MediaChannel, unless replaced.
SetEncoderSelector(uint32_t ssrc,webrtc::VideoEncoderFactory::EncoderSelectorInterface * encoder_selector)255*d9f75844SAndroid Build Coastguard Worker   virtual void SetEncoderSelector(
256*d9f75844SAndroid Build Coastguard Worker       uint32_t ssrc,
257*d9f75844SAndroid Build Coastguard Worker       webrtc::VideoEncoderFactory::EncoderSelectorInterface* encoder_selector) {
258*d9f75844SAndroid Build Coastguard Worker   }
259*d9f75844SAndroid Build Coastguard Worker 
260*d9f75844SAndroid Build Coastguard Worker   // Base method to send packet using NetworkInterface.
261*d9f75844SAndroid Build Coastguard Worker   bool SendPacket(rtc::CopyOnWriteBuffer* packet,
262*d9f75844SAndroid Build Coastguard Worker                   const rtc::PacketOptions& options);
263*d9f75844SAndroid Build Coastguard Worker 
264*d9f75844SAndroid Build Coastguard Worker   bool SendRtcp(rtc::CopyOnWriteBuffer* packet,
265*d9f75844SAndroid Build Coastguard Worker                 const rtc::PacketOptions& options);
266*d9f75844SAndroid Build Coastguard Worker 
267*d9f75844SAndroid Build Coastguard Worker   int SetOption(NetworkInterface::SocketType type,
268*d9f75844SAndroid Build Coastguard Worker                 rtc::Socket::Option opt,
269*d9f75844SAndroid Build Coastguard Worker                 int option);
270*d9f75844SAndroid Build Coastguard Worker 
271*d9f75844SAndroid Build Coastguard Worker   // Corresponds to the SDP attribute extmap-allow-mixed, see RFC8285.
272*d9f75844SAndroid Build Coastguard Worker   // Set to true if it's allowed to mix one- and two-byte RTP header extensions
273*d9f75844SAndroid Build Coastguard Worker   // in the same stream. The setter and getter must only be called from
274*d9f75844SAndroid Build Coastguard Worker   // worker_thread.
275*d9f75844SAndroid Build Coastguard Worker   void SetExtmapAllowMixed(bool extmap_allow_mixed);
276*d9f75844SAndroid Build Coastguard Worker   bool ExtmapAllowMixed() const;
277*d9f75844SAndroid Build Coastguard Worker 
278*d9f75844SAndroid Build Coastguard Worker   // Returns `true` if a non-null NetworkInterface pointer is held.
279*d9f75844SAndroid Build Coastguard Worker   // Must be called on the network thread.
280*d9f75844SAndroid Build Coastguard Worker   bool HasNetworkInterface() const;
281*d9f75844SAndroid Build Coastguard Worker 
282*d9f75844SAndroid Build Coastguard Worker   virtual webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const = 0;
283*d9f75844SAndroid Build Coastguard Worker   virtual webrtc::RTCError SetRtpSendParameters(
284*d9f75844SAndroid Build Coastguard Worker       uint32_t ssrc,
285*d9f75844SAndroid Build Coastguard Worker       const webrtc::RtpParameters& parameters,
286*d9f75844SAndroid Build Coastguard Worker       webrtc::SetParametersCallback callback = nullptr) = 0;
287*d9f75844SAndroid Build Coastguard Worker 
288*d9f75844SAndroid Build Coastguard Worker   virtual void SetEncoderToPacketizerFrameTransformer(
289*d9f75844SAndroid Build Coastguard Worker       uint32_t ssrc,
290*d9f75844SAndroid Build Coastguard Worker       rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer);
291*d9f75844SAndroid Build Coastguard Worker   virtual void SetDepacketizerToDecoderFrameTransformer(
292*d9f75844SAndroid Build Coastguard Worker       uint32_t ssrc,
293*d9f75844SAndroid Build Coastguard Worker       rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer);
294*d9f75844SAndroid Build Coastguard Worker 
295*d9f75844SAndroid Build Coastguard Worker  protected:
296*d9f75844SAndroid Build Coastguard Worker   int SetOptionLocked(NetworkInterface::SocketType type,
297*d9f75844SAndroid Build Coastguard Worker                       rtc::Socket::Option opt,
298*d9f75844SAndroid Build Coastguard Worker                       int option) RTC_RUN_ON(network_thread_);
299*d9f75844SAndroid Build Coastguard Worker 
300*d9f75844SAndroid Build Coastguard Worker   bool DscpEnabled() const;
301*d9f75844SAndroid Build Coastguard Worker 
302*d9f75844SAndroid Build Coastguard Worker   // This is the DSCP value used for both RTP and RTCP channels if DSCP is
303*d9f75844SAndroid Build Coastguard Worker   // enabled. It can be changed at any time via `SetPreferredDscp`.
304*d9f75844SAndroid Build Coastguard Worker   rtc::DiffServCodePoint PreferredDscp() const;
305*d9f75844SAndroid Build Coastguard Worker   void SetPreferredDscp(rtc::DiffServCodePoint new_dscp);
306*d9f75844SAndroid Build Coastguard Worker 
307*d9f75844SAndroid Build Coastguard Worker   rtc::scoped_refptr<webrtc::PendingTaskSafetyFlag> network_safety();
308*d9f75844SAndroid Build Coastguard Worker 
309*d9f75844SAndroid Build Coastguard Worker   // Utility implementation for derived classes (video/voice) that applies
310*d9f75844SAndroid Build Coastguard Worker   // the packet options and passes the data onwards to `SendPacket`.
311*d9f75844SAndroid Build Coastguard Worker   void SendRtp(const uint8_t* data,
312*d9f75844SAndroid Build Coastguard Worker                size_t len,
313*d9f75844SAndroid Build Coastguard Worker                const webrtc::PacketOptions& options);
314*d9f75844SAndroid Build Coastguard Worker 
315*d9f75844SAndroid Build Coastguard Worker   void SendRtcp(const uint8_t* data, size_t len);
316*d9f75844SAndroid Build Coastguard Worker 
317*d9f75844SAndroid Build Coastguard Worker  private:
318*d9f75844SAndroid Build Coastguard Worker   // Apply the preferred DSCP setting to the underlying network interface RTP
319*d9f75844SAndroid Build Coastguard Worker   // and RTCP channels. If DSCP is disabled, then apply the default DSCP value.
320*d9f75844SAndroid Build Coastguard Worker   void UpdateDscp() RTC_RUN_ON(network_thread_);
321*d9f75844SAndroid Build Coastguard Worker 
322*d9f75844SAndroid Build Coastguard Worker   bool DoSendPacket(rtc::CopyOnWriteBuffer* packet,
323*d9f75844SAndroid Build Coastguard Worker                     bool rtcp,
324*d9f75844SAndroid Build Coastguard Worker                     const rtc::PacketOptions& options);
325*d9f75844SAndroid Build Coastguard Worker 
326*d9f75844SAndroid Build Coastguard Worker   const bool enable_dscp_;
327*d9f75844SAndroid Build Coastguard Worker   const rtc::scoped_refptr<webrtc::PendingTaskSafetyFlag> network_safety_
328*d9f75844SAndroid Build Coastguard Worker       RTC_PT_GUARDED_BY(network_thread_);
329*d9f75844SAndroid Build Coastguard Worker   webrtc::TaskQueueBase* const network_thread_;
330*d9f75844SAndroid Build Coastguard Worker   NetworkInterface* network_interface_ RTC_GUARDED_BY(network_thread_) =
331*d9f75844SAndroid Build Coastguard Worker       nullptr;
332*d9f75844SAndroid Build Coastguard Worker   rtc::DiffServCodePoint preferred_dscp_ RTC_GUARDED_BY(network_thread_) =
333*d9f75844SAndroid Build Coastguard Worker       rtc::DSCP_DEFAULT;
334*d9f75844SAndroid Build Coastguard Worker   bool extmap_allow_mixed_ = false;
335*d9f75844SAndroid Build Coastguard Worker };
336*d9f75844SAndroid Build Coastguard Worker 
337*d9f75844SAndroid Build Coastguard Worker // The stats information is structured as follows:
338*d9f75844SAndroid Build Coastguard Worker // Media are represented by either MediaSenderInfo or MediaReceiverInfo.
339*d9f75844SAndroid Build Coastguard Worker // Media contains a vector of SSRC infos that are exclusively used by this
340*d9f75844SAndroid Build Coastguard Worker // media. (SSRCs shared between media streams can't be represented.)
341*d9f75844SAndroid Build Coastguard Worker 
342*d9f75844SAndroid Build Coastguard Worker // Information about an SSRC.
343*d9f75844SAndroid Build Coastguard Worker // This data may be locally recorded, or received in an RTCP SR or RR.
344*d9f75844SAndroid Build Coastguard Worker struct SsrcSenderInfo {
345*d9f75844SAndroid Build Coastguard Worker   uint32_t ssrc = 0;
346*d9f75844SAndroid Build Coastguard Worker   double timestamp = 0.0;  // NTP timestamp, represented as seconds since epoch.
347*d9f75844SAndroid Build Coastguard Worker };
348*d9f75844SAndroid Build Coastguard Worker 
349*d9f75844SAndroid Build Coastguard Worker struct SsrcReceiverInfo {
350*d9f75844SAndroid Build Coastguard Worker   uint32_t ssrc = 0;
351*d9f75844SAndroid Build Coastguard Worker   double timestamp = 0.0;
352*d9f75844SAndroid Build Coastguard Worker };
353*d9f75844SAndroid Build Coastguard Worker 
354*d9f75844SAndroid Build Coastguard Worker struct MediaSenderInfo {
355*d9f75844SAndroid Build Coastguard Worker   MediaSenderInfo();
356*d9f75844SAndroid Build Coastguard Worker   ~MediaSenderInfo();
add_ssrcMediaSenderInfo357*d9f75844SAndroid Build Coastguard Worker   void add_ssrc(const SsrcSenderInfo& stat) { local_stats.push_back(stat); }
358*d9f75844SAndroid Build Coastguard Worker   // Temporary utility function for call sites that only provide SSRC.
359*d9f75844SAndroid Build Coastguard Worker   // As more info is added into SsrcSenderInfo, this function should go away.
add_ssrcMediaSenderInfo360*d9f75844SAndroid Build Coastguard Worker   void add_ssrc(uint32_t ssrc) {
361*d9f75844SAndroid Build Coastguard Worker     SsrcSenderInfo stat;
362*d9f75844SAndroid Build Coastguard Worker     stat.ssrc = ssrc;
363*d9f75844SAndroid Build Coastguard Worker     add_ssrc(stat);
364*d9f75844SAndroid Build Coastguard Worker   }
365*d9f75844SAndroid Build Coastguard Worker   // Utility accessor for clients that are only interested in ssrc numbers.
ssrcsMediaSenderInfo366*d9f75844SAndroid Build Coastguard Worker   std::vector<uint32_t> ssrcs() const {
367*d9f75844SAndroid Build Coastguard Worker     std::vector<uint32_t> retval;
368*d9f75844SAndroid Build Coastguard Worker     for (std::vector<SsrcSenderInfo>::const_iterator it = local_stats.begin();
369*d9f75844SAndroid Build Coastguard Worker          it != local_stats.end(); ++it) {
370*d9f75844SAndroid Build Coastguard Worker       retval.push_back(it->ssrc);
371*d9f75844SAndroid Build Coastguard Worker     }
372*d9f75844SAndroid Build Coastguard Worker     return retval;
373*d9f75844SAndroid Build Coastguard Worker   }
374*d9f75844SAndroid Build Coastguard Worker   // Returns true if the media has been connected.
connectedMediaSenderInfo375*d9f75844SAndroid Build Coastguard Worker   bool connected() const { return local_stats.size() > 0; }
376*d9f75844SAndroid Build Coastguard Worker   // Utility accessor for clients that make the assumption only one ssrc
377*d9f75844SAndroid Build Coastguard Worker   // exists per media.
378*d9f75844SAndroid Build Coastguard Worker   // This will eventually go away.
379*d9f75844SAndroid Build Coastguard Worker   // Call sites that compare this to zero should use connected() instead.
380*d9f75844SAndroid Build Coastguard Worker   // https://bugs.webrtc.org/8694
ssrcMediaSenderInfo381*d9f75844SAndroid Build Coastguard Worker   uint32_t ssrc() const {
382*d9f75844SAndroid Build Coastguard Worker     if (connected()) {
383*d9f75844SAndroid Build Coastguard Worker       return local_stats[0].ssrc;
384*d9f75844SAndroid Build Coastguard Worker     } else {
385*d9f75844SAndroid Build Coastguard Worker       return 0;
386*d9f75844SAndroid Build Coastguard Worker     }
387*d9f75844SAndroid Build Coastguard Worker   }
388*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcsentrtpstreamstats-bytessent
389*d9f75844SAndroid Build Coastguard Worker   int64_t payload_bytes_sent = 0;
390*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-headerbytessent
391*d9f75844SAndroid Build Coastguard Worker   int64_t header_and_padding_bytes_sent = 0;
392*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-retransmittedbytessent
393*d9f75844SAndroid Build Coastguard Worker   uint64_t retransmitted_bytes_sent = 0;
394*d9f75844SAndroid Build Coastguard Worker   int packets_sent = 0;
395*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-retransmittedpacketssent
396*d9f75844SAndroid Build Coastguard Worker   uint64_t retransmitted_packets_sent = 0;
397*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-nackcount
398*d9f75844SAndroid Build Coastguard Worker   uint32_t nacks_rcvd = 0;
399*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-targetbitrate
400*d9f75844SAndroid Build Coastguard Worker   absl::optional<double> target_bitrate;
401*d9f75844SAndroid Build Coastguard Worker   int packets_lost = 0;
402*d9f75844SAndroid Build Coastguard Worker   float fraction_lost = 0.0f;
403*d9f75844SAndroid Build Coastguard Worker   int64_t rtt_ms = 0;
404*d9f75844SAndroid Build Coastguard Worker   std::string codec_name;
405*d9f75844SAndroid Build Coastguard Worker   absl::optional<int> codec_payload_type;
406*d9f75844SAndroid Build Coastguard Worker   std::vector<SsrcSenderInfo> local_stats;
407*d9f75844SAndroid Build Coastguard Worker   std::vector<SsrcReceiverInfo> remote_stats;
408*d9f75844SAndroid Build Coastguard Worker   // A snapshot of the most recent Report Block with additional data of interest
409*d9f75844SAndroid Build Coastguard Worker   // to statistics. Used to implement RTCRemoteInboundRtpStreamStats. Within
410*d9f75844SAndroid Build Coastguard Worker   // this list, the ReportBlockData::RTCPReportBlock::source_ssrc(), which is
411*d9f75844SAndroid Build Coastguard Worker   // the SSRC of the corresponding outbound RTP stream, is unique.
412*d9f75844SAndroid Build Coastguard Worker   std::vector<webrtc::ReportBlockData> report_block_datas;
413*d9f75844SAndroid Build Coastguard Worker   absl::optional<bool> active;
414*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-totalpacketsenddelay
415*d9f75844SAndroid Build Coastguard Worker   webrtc::TimeDelta total_packet_send_delay = webrtc::TimeDelta::Zero();
416*d9f75844SAndroid Build Coastguard Worker };
417*d9f75844SAndroid Build Coastguard Worker 
418*d9f75844SAndroid Build Coastguard Worker struct MediaReceiverInfo {
419*d9f75844SAndroid Build Coastguard Worker   MediaReceiverInfo();
420*d9f75844SAndroid Build Coastguard Worker   ~MediaReceiverInfo();
add_ssrcMediaReceiverInfo421*d9f75844SAndroid Build Coastguard Worker   void add_ssrc(const SsrcReceiverInfo& stat) { local_stats.push_back(stat); }
422*d9f75844SAndroid Build Coastguard Worker   // Temporary utility function for call sites that only provide SSRC.
423*d9f75844SAndroid Build Coastguard Worker   // As more info is added into SsrcSenderInfo, this function should go away.
add_ssrcMediaReceiverInfo424*d9f75844SAndroid Build Coastguard Worker   void add_ssrc(uint32_t ssrc) {
425*d9f75844SAndroid Build Coastguard Worker     SsrcReceiverInfo stat;
426*d9f75844SAndroid Build Coastguard Worker     stat.ssrc = ssrc;
427*d9f75844SAndroid Build Coastguard Worker     add_ssrc(stat);
428*d9f75844SAndroid Build Coastguard Worker   }
ssrcsMediaReceiverInfo429*d9f75844SAndroid Build Coastguard Worker   std::vector<uint32_t> ssrcs() const {
430*d9f75844SAndroid Build Coastguard Worker     std::vector<uint32_t> retval;
431*d9f75844SAndroid Build Coastguard Worker     for (std::vector<SsrcReceiverInfo>::const_iterator it = local_stats.begin();
432*d9f75844SAndroid Build Coastguard Worker          it != local_stats.end(); ++it) {
433*d9f75844SAndroid Build Coastguard Worker       retval.push_back(it->ssrc);
434*d9f75844SAndroid Build Coastguard Worker     }
435*d9f75844SAndroid Build Coastguard Worker     return retval;
436*d9f75844SAndroid Build Coastguard Worker   }
437*d9f75844SAndroid Build Coastguard Worker   // Returns true if the media has been connected.
connectedMediaReceiverInfo438*d9f75844SAndroid Build Coastguard Worker   bool connected() const { return local_stats.size() > 0; }
439*d9f75844SAndroid Build Coastguard Worker   // Utility accessor for clients that make the assumption only one ssrc
440*d9f75844SAndroid Build Coastguard Worker   // exists per media.
441*d9f75844SAndroid Build Coastguard Worker   // This will eventually go away.
442*d9f75844SAndroid Build Coastguard Worker   // Call sites that compare this to zero should use connected();
443*d9f75844SAndroid Build Coastguard Worker   // https://bugs.webrtc.org/8694
ssrcMediaReceiverInfo444*d9f75844SAndroid Build Coastguard Worker   uint32_t ssrc() const {
445*d9f75844SAndroid Build Coastguard Worker     if (connected()) {
446*d9f75844SAndroid Build Coastguard Worker       return local_stats[0].ssrc;
447*d9f75844SAndroid Build Coastguard Worker     } else {
448*d9f75844SAndroid Build Coastguard Worker       return 0;
449*d9f75844SAndroid Build Coastguard Worker     }
450*d9f75844SAndroid Build Coastguard Worker   }
451*d9f75844SAndroid Build Coastguard Worker 
452*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-bytesreceived
453*d9f75844SAndroid Build Coastguard Worker   int64_t payload_bytes_rcvd = 0;
454*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-headerbytesreceived
455*d9f75844SAndroid Build Coastguard Worker   int64_t header_and_padding_bytes_rcvd = 0;
456*d9f75844SAndroid Build Coastguard Worker   int packets_rcvd = 0;
457*d9f75844SAndroid Build Coastguard Worker   int packets_lost = 0;
458*d9f75844SAndroid Build Coastguard Worker   absl::optional<uint32_t> nacks_sent;
459*d9f75844SAndroid Build Coastguard Worker   // Jitter (network-related) latency (cumulative).
460*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-jitterbufferdelay
461*d9f75844SAndroid Build Coastguard Worker   double jitter_buffer_delay_seconds = 0.0;
462*d9f75844SAndroid Build Coastguard Worker   // Target delay for the jitter buffer (cumulative).
463*d9f75844SAndroid Build Coastguard Worker   // TODO(crbug.com/webrtc/14244): This metric is only implemented for
464*d9f75844SAndroid Build Coastguard Worker   // audio, it should be implemented for video as well.
465*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-jitterbuffertargetdelay
466*d9f75844SAndroid Build Coastguard Worker   absl::optional<double> jitter_buffer_target_delay_seconds;
467*d9f75844SAndroid Build Coastguard Worker   // Minimum obtainable delay for the jitter buffer (cumulative).
468*d9f75844SAndroid Build Coastguard Worker   // TODO(crbug.com/webrtc/14244): This metric is only implemented for
469*d9f75844SAndroid Build Coastguard Worker   // audio, it should be implemented for video as well.
470*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-jitterbufferminimumdelay
471*d9f75844SAndroid Build Coastguard Worker   absl::optional<double> jitter_buffer_minimum_delay_seconds;
472*d9f75844SAndroid Build Coastguard Worker   // Number of observations for cumulative jitter latency.
473*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-jitterbufferemittedcount
474*d9f75844SAndroid Build Coastguard Worker   uint64_t jitter_buffer_emitted_count = 0;
475*d9f75844SAndroid Build Coastguard Worker   // The timestamp at which the last packet was received, i.e. the time of the
476*d9f75844SAndroid Build Coastguard Worker   // local clock when it was received - not the RTP timestamp of that packet.
477*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-lastpacketreceivedtimestamp
478*d9f75844SAndroid Build Coastguard Worker   absl::optional<int64_t> last_packet_received_timestamp_ms;
479*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-estimatedplayouttimestamp
480*d9f75844SAndroid Build Coastguard Worker   absl::optional<int64_t> estimated_playout_ntp_timestamp_ms;
481*d9f75844SAndroid Build Coastguard Worker   std::string codec_name;
482*d9f75844SAndroid Build Coastguard Worker   absl::optional<int> codec_payload_type;
483*d9f75844SAndroid Build Coastguard Worker   std::vector<SsrcReceiverInfo> local_stats;
484*d9f75844SAndroid Build Coastguard Worker   std::vector<SsrcSenderInfo> remote_stats;
485*d9f75844SAndroid Build Coastguard Worker };
486*d9f75844SAndroid Build Coastguard Worker 
487*d9f75844SAndroid Build Coastguard Worker struct VoiceSenderInfo : public MediaSenderInfo {
488*d9f75844SAndroid Build Coastguard Worker   VoiceSenderInfo();
489*d9f75844SAndroid Build Coastguard Worker   ~VoiceSenderInfo();
490*d9f75844SAndroid Build Coastguard Worker   int jitter_ms = 0;
491*d9f75844SAndroid Build Coastguard Worker   // Current audio level, expressed linearly [0,32767].
492*d9f75844SAndroid Build Coastguard Worker   int audio_level = 0;
493*d9f75844SAndroid Build Coastguard Worker   // See description of "totalAudioEnergy" in the WebRTC stats spec:
494*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-totalaudioenergy
495*d9f75844SAndroid Build Coastguard Worker   double total_input_energy = 0.0;
496*d9f75844SAndroid Build Coastguard Worker   double total_input_duration = 0.0;
497*d9f75844SAndroid Build Coastguard Worker   webrtc::ANAStats ana_statistics;
498*d9f75844SAndroid Build Coastguard Worker   webrtc::AudioProcessingStats apm_statistics;
499*d9f75844SAndroid Build Coastguard Worker };
500*d9f75844SAndroid Build Coastguard Worker 
501*d9f75844SAndroid Build Coastguard Worker struct VoiceReceiverInfo : public MediaReceiverInfo {
502*d9f75844SAndroid Build Coastguard Worker   VoiceReceiverInfo();
503*d9f75844SAndroid Build Coastguard Worker   ~VoiceReceiverInfo();
504*d9f75844SAndroid Build Coastguard Worker   int jitter_ms = 0;
505*d9f75844SAndroid Build Coastguard Worker   int jitter_buffer_ms = 0;
506*d9f75844SAndroid Build Coastguard Worker   int jitter_buffer_preferred_ms = 0;
507*d9f75844SAndroid Build Coastguard Worker   int delay_estimate_ms = 0;
508*d9f75844SAndroid Build Coastguard Worker   int audio_level = 0;
509*d9f75844SAndroid Build Coastguard Worker   // Stats below correspond to similarly-named fields in the WebRTC stats spec.
510*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats
511*d9f75844SAndroid Build Coastguard Worker   double total_output_energy = 0.0;
512*d9f75844SAndroid Build Coastguard Worker   uint64_t total_samples_received = 0;
513*d9f75844SAndroid Build Coastguard Worker   double total_output_duration = 0.0;
514*d9f75844SAndroid Build Coastguard Worker   uint64_t concealed_samples = 0;
515*d9f75844SAndroid Build Coastguard Worker   uint64_t silent_concealed_samples = 0;
516*d9f75844SAndroid Build Coastguard Worker   uint64_t concealment_events = 0;
517*d9f75844SAndroid Build Coastguard Worker   uint64_t inserted_samples_for_deceleration = 0;
518*d9f75844SAndroid Build Coastguard Worker   uint64_t removed_samples_for_acceleration = 0;
519*d9f75844SAndroid Build Coastguard Worker   uint64_t fec_packets_received = 0;
520*d9f75844SAndroid Build Coastguard Worker   uint64_t fec_packets_discarded = 0;
521*d9f75844SAndroid Build Coastguard Worker   // Stats below correspond to similarly-named fields in the WebRTC stats spec.
522*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcreceivedrtpstreamstats
523*d9f75844SAndroid Build Coastguard Worker   uint64_t packets_discarded = 0;
524*d9f75844SAndroid Build Coastguard Worker   // Stats below DO NOT correspond directly to anything in the WebRTC stats
525*d9f75844SAndroid Build Coastguard Worker   // fraction of synthesized audio inserted through expansion.
526*d9f75844SAndroid Build Coastguard Worker   float expand_rate = 0.0f;
527*d9f75844SAndroid Build Coastguard Worker   // fraction of synthesized speech inserted through expansion.
528*d9f75844SAndroid Build Coastguard Worker   float speech_expand_rate = 0.0f;
529*d9f75844SAndroid Build Coastguard Worker   // fraction of data out of secondary decoding, including FEC and RED.
530*d9f75844SAndroid Build Coastguard Worker   float secondary_decoded_rate = 0.0f;
531*d9f75844SAndroid Build Coastguard Worker   // Fraction of secondary data, including FEC and RED, that is discarded.
532*d9f75844SAndroid Build Coastguard Worker   // Discarding of secondary data can be caused by the reception of the primary
533*d9f75844SAndroid Build Coastguard Worker   // data, obsoleting the secondary data. It can also be caused by early
534*d9f75844SAndroid Build Coastguard Worker   // or late arrival of secondary data. This metric is the percentage of
535*d9f75844SAndroid Build Coastguard Worker   // discarded secondary data since last query of receiver info.
536*d9f75844SAndroid Build Coastguard Worker   float secondary_discarded_rate = 0.0f;
537*d9f75844SAndroid Build Coastguard Worker   // Fraction of data removed through time compression.
538*d9f75844SAndroid Build Coastguard Worker   float accelerate_rate = 0.0f;
539*d9f75844SAndroid Build Coastguard Worker   // Fraction of data inserted through time stretching.
540*d9f75844SAndroid Build Coastguard Worker   float preemptive_expand_rate = 0.0f;
541*d9f75844SAndroid Build Coastguard Worker   int decoding_calls_to_silence_generator = 0;
542*d9f75844SAndroid Build Coastguard Worker   int decoding_calls_to_neteq = 0;
543*d9f75844SAndroid Build Coastguard Worker   int decoding_normal = 0;
544*d9f75844SAndroid Build Coastguard Worker   // TODO(alexnarest): Consider decoding_neteq_plc for consistency
545*d9f75844SAndroid Build Coastguard Worker   int decoding_plc = 0;
546*d9f75844SAndroid Build Coastguard Worker   int decoding_codec_plc = 0;
547*d9f75844SAndroid Build Coastguard Worker   int decoding_cng = 0;
548*d9f75844SAndroid Build Coastguard Worker   int decoding_plc_cng = 0;
549*d9f75844SAndroid Build Coastguard Worker   int decoding_muted_output = 0;
550*d9f75844SAndroid Build Coastguard Worker   // Estimated capture start time in NTP time in ms.
551*d9f75844SAndroid Build Coastguard Worker   int64_t capture_start_ntp_time_ms = -1;
552*d9f75844SAndroid Build Coastguard Worker   // Count of the number of buffer flushes.
553*d9f75844SAndroid Build Coastguard Worker   uint64_t jitter_buffer_flushes = 0;
554*d9f75844SAndroid Build Coastguard Worker   // Number of samples expanded due to delayed packets.
555*d9f75844SAndroid Build Coastguard Worker   uint64_t delayed_packet_outage_samples = 0;
556*d9f75844SAndroid Build Coastguard Worker   // Arrival delay of received audio packets.
557*d9f75844SAndroid Build Coastguard Worker   double relative_packet_arrival_delay_seconds = 0.0;
558*d9f75844SAndroid Build Coastguard Worker   // Count and total duration of audio interruptions (loss-concealement periods
559*d9f75844SAndroid Build Coastguard Worker   // longer than 150 ms).
560*d9f75844SAndroid Build Coastguard Worker   int32_t interruption_count = 0;
561*d9f75844SAndroid Build Coastguard Worker   int32_t total_interruption_duration_ms = 0;
562*d9f75844SAndroid Build Coastguard Worker   // Remote outbound stats derived by the received RTCP sender reports.
563*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#remoteoutboundrtpstats-dict*
564*d9f75844SAndroid Build Coastguard Worker   absl::optional<int64_t> last_sender_report_timestamp_ms;
565*d9f75844SAndroid Build Coastguard Worker   absl::optional<int64_t> last_sender_report_remote_timestamp_ms;
566*d9f75844SAndroid Build Coastguard Worker   uint32_t sender_reports_packets_sent = 0;
567*d9f75844SAndroid Build Coastguard Worker   uint64_t sender_reports_bytes_sent = 0;
568*d9f75844SAndroid Build Coastguard Worker   uint64_t sender_reports_reports_count = 0;
569*d9f75844SAndroid Build Coastguard Worker   absl::optional<webrtc::TimeDelta> round_trip_time;
570*d9f75844SAndroid Build Coastguard Worker   webrtc::TimeDelta total_round_trip_time = webrtc::TimeDelta::Zero();
571*d9f75844SAndroid Build Coastguard Worker   int round_trip_time_measurements = 0;
572*d9f75844SAndroid Build Coastguard Worker };
573*d9f75844SAndroid Build Coastguard Worker 
574*d9f75844SAndroid Build Coastguard Worker struct VideoSenderInfo : public MediaSenderInfo {
575*d9f75844SAndroid Build Coastguard Worker   VideoSenderInfo();
576*d9f75844SAndroid Build Coastguard Worker   ~VideoSenderInfo();
577*d9f75844SAndroid Build Coastguard Worker   std::vector<SsrcGroup> ssrc_groups;
578*d9f75844SAndroid Build Coastguard Worker   std::string encoder_implementation_name;
579*d9f75844SAndroid Build Coastguard Worker   int firs_rcvd = 0;
580*d9f75844SAndroid Build Coastguard Worker   int plis_rcvd = 0;
581*d9f75844SAndroid Build Coastguard Worker   int send_frame_width = 0;
582*d9f75844SAndroid Build Coastguard Worker   int send_frame_height = 0;
583*d9f75844SAndroid Build Coastguard Worker   int frames = 0;
584*d9f75844SAndroid Build Coastguard Worker   double framerate_input = 0;
585*d9f75844SAndroid Build Coastguard Worker   int framerate_sent = 0;
586*d9f75844SAndroid Build Coastguard Worker   int aggregated_framerate_sent = 0;
587*d9f75844SAndroid Build Coastguard Worker   int nominal_bitrate = 0;
588*d9f75844SAndroid Build Coastguard Worker   int adapt_reason = 0;
589*d9f75844SAndroid Build Coastguard Worker   int adapt_changes = 0;
590*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-qualitylimitationreason
591*d9f75844SAndroid Build Coastguard Worker   webrtc::QualityLimitationReason quality_limitation_reason =
592*d9f75844SAndroid Build Coastguard Worker       webrtc::QualityLimitationReason::kNone;
593*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-qualitylimitationdurations
594*d9f75844SAndroid Build Coastguard Worker   std::map<webrtc::QualityLimitationReason, int64_t>
595*d9f75844SAndroid Build Coastguard Worker       quality_limitation_durations_ms;
596*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-qualitylimitationresolutionchanges
597*d9f75844SAndroid Build Coastguard Worker   uint32_t quality_limitation_resolution_changes = 0;
598*d9f75844SAndroid Build Coastguard Worker   int avg_encode_ms = 0;
599*d9f75844SAndroid Build Coastguard Worker   int encode_usage_percent = 0;
600*d9f75844SAndroid Build Coastguard Worker   uint32_t frames_encoded = 0;
601*d9f75844SAndroid Build Coastguard Worker   uint32_t key_frames_encoded = 0;
602*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-totalencodetime
603*d9f75844SAndroid Build Coastguard Worker   uint64_t total_encode_time_ms = 0;
604*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-totalencodedbytestarget
605*d9f75844SAndroid Build Coastguard Worker   uint64_t total_encoded_bytes_target = 0;
606*d9f75844SAndroid Build Coastguard Worker   bool has_entered_low_resolution = false;
607*d9f75844SAndroid Build Coastguard Worker   absl::optional<uint64_t> qp_sum;
608*d9f75844SAndroid Build Coastguard Worker   webrtc::VideoContentType content_type = webrtc::VideoContentType::UNSPECIFIED;
609*d9f75844SAndroid Build Coastguard Worker   uint32_t frames_sent = 0;
610*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcvideosenderstats-hugeframessent
611*d9f75844SAndroid Build Coastguard Worker   uint32_t huge_frames_sent = 0;
612*d9f75844SAndroid Build Coastguard Worker   uint32_t aggregated_huge_frames_sent = 0;
613*d9f75844SAndroid Build Coastguard Worker   absl::optional<std::string> rid;
614*d9f75844SAndroid Build Coastguard Worker   absl::optional<bool> power_efficient_encoder;
615*d9f75844SAndroid Build Coastguard Worker };
616*d9f75844SAndroid Build Coastguard Worker 
617*d9f75844SAndroid Build Coastguard Worker struct VideoReceiverInfo : public MediaReceiverInfo {
618*d9f75844SAndroid Build Coastguard Worker   VideoReceiverInfo();
619*d9f75844SAndroid Build Coastguard Worker   ~VideoReceiverInfo();
620*d9f75844SAndroid Build Coastguard Worker   std::vector<SsrcGroup> ssrc_groups;
621*d9f75844SAndroid Build Coastguard Worker   std::string decoder_implementation_name;
622*d9f75844SAndroid Build Coastguard Worker   absl::optional<bool> power_efficient_decoder;
623*d9f75844SAndroid Build Coastguard Worker   int packets_concealed = 0;
624*d9f75844SAndroid Build Coastguard Worker   int firs_sent = 0;
625*d9f75844SAndroid Build Coastguard Worker   int plis_sent = 0;
626*d9f75844SAndroid Build Coastguard Worker   int frame_width = 0;
627*d9f75844SAndroid Build Coastguard Worker   int frame_height = 0;
628*d9f75844SAndroid Build Coastguard Worker   int framerate_rcvd = 0;
629*d9f75844SAndroid Build Coastguard Worker   int framerate_decoded = 0;
630*d9f75844SAndroid Build Coastguard Worker   int framerate_output = 0;
631*d9f75844SAndroid Build Coastguard Worker   // Framerate as sent to the renderer.
632*d9f75844SAndroid Build Coastguard Worker   int framerate_render_input = 0;
633*d9f75844SAndroid Build Coastguard Worker   // Framerate that the renderer reports.
634*d9f75844SAndroid Build Coastguard Worker   int framerate_render_output = 0;
635*d9f75844SAndroid Build Coastguard Worker   uint32_t frames_received = 0;
636*d9f75844SAndroid Build Coastguard Worker   uint32_t frames_dropped = 0;
637*d9f75844SAndroid Build Coastguard Worker   uint32_t frames_decoded = 0;
638*d9f75844SAndroid Build Coastguard Worker   uint32_t key_frames_decoded = 0;
639*d9f75844SAndroid Build Coastguard Worker   uint32_t frames_rendered = 0;
640*d9f75844SAndroid Build Coastguard Worker   absl::optional<uint64_t> qp_sum;
641*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-totaldecodetime
642*d9f75844SAndroid Build Coastguard Worker   webrtc::TimeDelta total_decode_time = webrtc::TimeDelta::Zero();
643*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-totalprocessingdelay
644*d9f75844SAndroid Build Coastguard Worker   webrtc::TimeDelta total_processing_delay = webrtc::TimeDelta::Zero();
645*d9f75844SAndroid Build Coastguard Worker   webrtc::TimeDelta total_assembly_time = webrtc::TimeDelta::Zero();
646*d9f75844SAndroid Build Coastguard Worker   uint32_t frames_assembled_from_multiple_packets = 0;
647*d9f75844SAndroid Build Coastguard Worker   double total_inter_frame_delay = 0;
648*d9f75844SAndroid Build Coastguard Worker   double total_squared_inter_frame_delay = 0;
649*d9f75844SAndroid Build Coastguard Worker   int64_t interframe_delay_max_ms = -1;
650*d9f75844SAndroid Build Coastguard Worker   uint32_t freeze_count = 0;
651*d9f75844SAndroid Build Coastguard Worker   uint32_t pause_count = 0;
652*d9f75844SAndroid Build Coastguard Worker   uint32_t total_freezes_duration_ms = 0;
653*d9f75844SAndroid Build Coastguard Worker   uint32_t total_pauses_duration_ms = 0;
654*d9f75844SAndroid Build Coastguard Worker   uint32_t total_frames_duration_ms = 0;
655*d9f75844SAndroid Build Coastguard Worker   double sum_squared_frame_durations = 0.0;
656*d9f75844SAndroid Build Coastguard Worker   uint32_t jitter_ms = 0;
657*d9f75844SAndroid Build Coastguard Worker 
658*d9f75844SAndroid Build Coastguard Worker   webrtc::VideoContentType content_type = webrtc::VideoContentType::UNSPECIFIED;
659*d9f75844SAndroid Build Coastguard Worker 
660*d9f75844SAndroid Build Coastguard Worker   // All stats below are gathered per-VideoReceiver, but some will be correlated
661*d9f75844SAndroid Build Coastguard Worker   // across MediaStreamTracks.  NOTE(hta): when sinking stats into per-SSRC
662*d9f75844SAndroid Build Coastguard Worker   // structures, reflect this in the new layout.
663*d9f75844SAndroid Build Coastguard Worker 
664*d9f75844SAndroid Build Coastguard Worker   // Current frame decode latency.
665*d9f75844SAndroid Build Coastguard Worker   int decode_ms = 0;
666*d9f75844SAndroid Build Coastguard Worker   // Maximum observed frame decode latency.
667*d9f75844SAndroid Build Coastguard Worker   int max_decode_ms = 0;
668*d9f75844SAndroid Build Coastguard Worker   // Jitter (network-related) latency.
669*d9f75844SAndroid Build Coastguard Worker   int jitter_buffer_ms = 0;
670*d9f75844SAndroid Build Coastguard Worker   // Requested minimum playout latency.
671*d9f75844SAndroid Build Coastguard Worker   int min_playout_delay_ms = 0;
672*d9f75844SAndroid Build Coastguard Worker   // Requested latency to account for rendering delay.
673*d9f75844SAndroid Build Coastguard Worker   int render_delay_ms = 0;
674*d9f75844SAndroid Build Coastguard Worker   // Target overall delay: network+decode+render, accounting for
675*d9f75844SAndroid Build Coastguard Worker   // min_playout_delay_ms.
676*d9f75844SAndroid Build Coastguard Worker   int target_delay_ms = 0;
677*d9f75844SAndroid Build Coastguard Worker   // Current overall delay, possibly ramping towards target_delay_ms.
678*d9f75844SAndroid Build Coastguard Worker   int current_delay_ms = 0;
679*d9f75844SAndroid Build Coastguard Worker 
680*d9f75844SAndroid Build Coastguard Worker   // Estimated capture start time in NTP time in ms.
681*d9f75844SAndroid Build Coastguard Worker   int64_t capture_start_ntp_time_ms = -1;
682*d9f75844SAndroid Build Coastguard Worker 
683*d9f75844SAndroid Build Coastguard Worker   // First frame received to first frame decoded latency.
684*d9f75844SAndroid Build Coastguard Worker   int64_t first_frame_received_to_decoded_ms = -1;
685*d9f75844SAndroid Build Coastguard Worker 
686*d9f75844SAndroid Build Coastguard Worker   // Timing frame info: all important timestamps for a full lifetime of a
687*d9f75844SAndroid Build Coastguard Worker   // single 'timing frame'.
688*d9f75844SAndroid Build Coastguard Worker   absl::optional<webrtc::TimingFrameInfo> timing_frame_info;
689*d9f75844SAndroid Build Coastguard Worker };
690*d9f75844SAndroid Build Coastguard Worker 
691*d9f75844SAndroid Build Coastguard Worker struct BandwidthEstimationInfo {
692*d9f75844SAndroid Build Coastguard Worker   int available_send_bandwidth = 0;
693*d9f75844SAndroid Build Coastguard Worker   int available_recv_bandwidth = 0;
694*d9f75844SAndroid Build Coastguard Worker   int target_enc_bitrate = 0;
695*d9f75844SAndroid Build Coastguard Worker   int actual_enc_bitrate = 0;
696*d9f75844SAndroid Build Coastguard Worker   int retransmit_bitrate = 0;
697*d9f75844SAndroid Build Coastguard Worker   int transmit_bitrate = 0;
698*d9f75844SAndroid Build Coastguard Worker   int64_t bucket_delay = 0;
699*d9f75844SAndroid Build Coastguard Worker };
700*d9f75844SAndroid Build Coastguard Worker 
701*d9f75844SAndroid Build Coastguard Worker // Maps from payload type to `RtpCodecParameters`.
702*d9f75844SAndroid Build Coastguard Worker typedef std::map<int, webrtc::RtpCodecParameters> RtpCodecParametersMap;
703*d9f75844SAndroid Build Coastguard Worker 
704*d9f75844SAndroid Build Coastguard Worker struct VoiceMediaInfo {
705*d9f75844SAndroid Build Coastguard Worker   VoiceMediaInfo();
706*d9f75844SAndroid Build Coastguard Worker   ~VoiceMediaInfo();
ClearVoiceMediaInfo707*d9f75844SAndroid Build Coastguard Worker   void Clear() {
708*d9f75844SAndroid Build Coastguard Worker     senders.clear();
709*d9f75844SAndroid Build Coastguard Worker     receivers.clear();
710*d9f75844SAndroid Build Coastguard Worker     send_codecs.clear();
711*d9f75844SAndroid Build Coastguard Worker     receive_codecs.clear();
712*d9f75844SAndroid Build Coastguard Worker   }
713*d9f75844SAndroid Build Coastguard Worker   std::vector<VoiceSenderInfo> senders;
714*d9f75844SAndroid Build Coastguard Worker   std::vector<VoiceReceiverInfo> receivers;
715*d9f75844SAndroid Build Coastguard Worker   RtpCodecParametersMap send_codecs;
716*d9f75844SAndroid Build Coastguard Worker   RtpCodecParametersMap receive_codecs;
717*d9f75844SAndroid Build Coastguard Worker   int32_t device_underrun_count = 0;
718*d9f75844SAndroid Build Coastguard Worker };
719*d9f75844SAndroid Build Coastguard Worker 
720*d9f75844SAndroid Build Coastguard Worker struct VideoMediaInfo {
721*d9f75844SAndroid Build Coastguard Worker   VideoMediaInfo();
722*d9f75844SAndroid Build Coastguard Worker   ~VideoMediaInfo();
ClearVideoMediaInfo723*d9f75844SAndroid Build Coastguard Worker   void Clear() {
724*d9f75844SAndroid Build Coastguard Worker     senders.clear();
725*d9f75844SAndroid Build Coastguard Worker     aggregated_senders.clear();
726*d9f75844SAndroid Build Coastguard Worker     receivers.clear();
727*d9f75844SAndroid Build Coastguard Worker     send_codecs.clear();
728*d9f75844SAndroid Build Coastguard Worker     receive_codecs.clear();
729*d9f75844SAndroid Build Coastguard Worker   }
730*d9f75844SAndroid Build Coastguard Worker   // Each sender info represents one "outbound-rtp" stream.In non - simulcast,
731*d9f75844SAndroid Build Coastguard Worker   // this means one info per RtpSender but if simulcast is used this means
732*d9f75844SAndroid Build Coastguard Worker   // one info per simulcast layer.
733*d9f75844SAndroid Build Coastguard Worker   std::vector<VideoSenderInfo> senders;
734*d9f75844SAndroid Build Coastguard Worker   // Used for legacy getStats() API's "ssrc" stats and modern getStats() API's
735*d9f75844SAndroid Build Coastguard Worker   // "track" stats. If simulcast is used, instead of having one sender info per
736*d9f75844SAndroid Build Coastguard Worker   // simulcast layer, the metrics of all layers of an RtpSender are aggregated
737*d9f75844SAndroid Build Coastguard Worker   // into a single sender info per RtpSender.
738*d9f75844SAndroid Build Coastguard Worker   std::vector<VideoSenderInfo> aggregated_senders;
739*d9f75844SAndroid Build Coastguard Worker   std::vector<VideoReceiverInfo> receivers;
740*d9f75844SAndroid Build Coastguard Worker   RtpCodecParametersMap send_codecs;
741*d9f75844SAndroid Build Coastguard Worker   RtpCodecParametersMap receive_codecs;
742*d9f75844SAndroid Build Coastguard Worker };
743*d9f75844SAndroid Build Coastguard Worker 
744*d9f75844SAndroid Build Coastguard Worker struct RtcpParameters {
745*d9f75844SAndroid Build Coastguard Worker   bool reduced_size = false;
746*d9f75844SAndroid Build Coastguard Worker   bool remote_estimate = false;
747*d9f75844SAndroid Build Coastguard Worker };
748*d9f75844SAndroid Build Coastguard Worker 
749*d9f75844SAndroid Build Coastguard Worker template <class Codec>
750*d9f75844SAndroid Build Coastguard Worker struct RtpParameters {
751*d9f75844SAndroid Build Coastguard Worker   virtual ~RtpParameters() = default;
752*d9f75844SAndroid Build Coastguard Worker 
753*d9f75844SAndroid Build Coastguard Worker   std::vector<Codec> codecs;
754*d9f75844SAndroid Build Coastguard Worker   std::vector<webrtc::RtpExtension> extensions;
755*d9f75844SAndroid Build Coastguard Worker   // For a send stream this is true if we've neogtiated a send direction,
756*d9f75844SAndroid Build Coastguard Worker   // for a receive stream this is true if we've negotiated a receive direction.
757*d9f75844SAndroid Build Coastguard Worker   bool is_stream_active = true;
758*d9f75844SAndroid Build Coastguard Worker 
759*d9f75844SAndroid Build Coastguard Worker   // TODO(pthatcher): Add streams.
760*d9f75844SAndroid Build Coastguard Worker   RtcpParameters rtcp;
761*d9f75844SAndroid Build Coastguard Worker 
ToStringRtpParameters762*d9f75844SAndroid Build Coastguard Worker   std::string ToString() const {
763*d9f75844SAndroid Build Coastguard Worker     rtc::StringBuilder ost;
764*d9f75844SAndroid Build Coastguard Worker     ost << "{";
765*d9f75844SAndroid Build Coastguard Worker     const char* separator = "";
766*d9f75844SAndroid Build Coastguard Worker     for (const auto& entry : ToStringMap()) {
767*d9f75844SAndroid Build Coastguard Worker       ost << separator << entry.first << ": " << entry.second;
768*d9f75844SAndroid Build Coastguard Worker       separator = ", ";
769*d9f75844SAndroid Build Coastguard Worker     }
770*d9f75844SAndroid Build Coastguard Worker     ost << "}";
771*d9f75844SAndroid Build Coastguard Worker     return ost.Release();
772*d9f75844SAndroid Build Coastguard Worker   }
773*d9f75844SAndroid Build Coastguard Worker 
774*d9f75844SAndroid Build Coastguard Worker  protected:
ToStringMapRtpParameters775*d9f75844SAndroid Build Coastguard Worker   virtual std::map<std::string, std::string> ToStringMap() const {
776*d9f75844SAndroid Build Coastguard Worker     return {{"codecs", VectorToString(codecs)},
777*d9f75844SAndroid Build Coastguard Worker             {"extensions", VectorToString(extensions)}};
778*d9f75844SAndroid Build Coastguard Worker   }
779*d9f75844SAndroid Build Coastguard Worker };
780*d9f75844SAndroid Build Coastguard Worker 
781*d9f75844SAndroid Build Coastguard Worker // TODO(deadbeef): Rename to RtpSenderParameters, since they're intended to
782*d9f75844SAndroid Build Coastguard Worker // encapsulate all the parameters needed for an RtpSender.
783*d9f75844SAndroid Build Coastguard Worker template <class Codec>
784*d9f75844SAndroid Build Coastguard Worker struct RtpSendParameters : RtpParameters<Codec> {
785*d9f75844SAndroid Build Coastguard Worker   int max_bandwidth_bps = -1;
786*d9f75844SAndroid Build Coastguard Worker   // This is the value to be sent in the MID RTP header extension (if the header
787*d9f75844SAndroid Build Coastguard Worker   // extension in included in the list of extensions).
788*d9f75844SAndroid Build Coastguard Worker   std::string mid;
789*d9f75844SAndroid Build Coastguard Worker   bool extmap_allow_mixed = false;
790*d9f75844SAndroid Build Coastguard Worker 
791*d9f75844SAndroid Build Coastguard Worker  protected:
ToStringMapRtpSendParameters792*d9f75844SAndroid Build Coastguard Worker   std::map<std::string, std::string> ToStringMap() const override {
793*d9f75844SAndroid Build Coastguard Worker     auto params = RtpParameters<Codec>::ToStringMap();
794*d9f75844SAndroid Build Coastguard Worker     params["max_bandwidth_bps"] = rtc::ToString(max_bandwidth_bps);
795*d9f75844SAndroid Build Coastguard Worker     params["mid"] = (mid.empty() ? "<not set>" : mid);
796*d9f75844SAndroid Build Coastguard Worker     params["extmap-allow-mixed"] = extmap_allow_mixed ? "true" : "false";
797*d9f75844SAndroid Build Coastguard Worker     return params;
798*d9f75844SAndroid Build Coastguard Worker   }
799*d9f75844SAndroid Build Coastguard Worker };
800*d9f75844SAndroid Build Coastguard Worker 
801*d9f75844SAndroid Build Coastguard Worker struct AudioSendParameters : RtpSendParameters<AudioCodec> {
802*d9f75844SAndroid Build Coastguard Worker   AudioSendParameters();
803*d9f75844SAndroid Build Coastguard Worker   ~AudioSendParameters() override;
804*d9f75844SAndroid Build Coastguard Worker   AudioOptions options;
805*d9f75844SAndroid Build Coastguard Worker 
806*d9f75844SAndroid Build Coastguard Worker  protected:
807*d9f75844SAndroid Build Coastguard Worker   std::map<std::string, std::string> ToStringMap() const override;
808*d9f75844SAndroid Build Coastguard Worker };
809*d9f75844SAndroid Build Coastguard Worker 
810*d9f75844SAndroid Build Coastguard Worker struct AudioRecvParameters : RtpParameters<AudioCodec> {};
811*d9f75844SAndroid Build Coastguard Worker 
812*d9f75844SAndroid Build Coastguard Worker class VoiceMediaChannel : public MediaChannel, public Delayable {
813*d9f75844SAndroid Build Coastguard Worker  public:
814*d9f75844SAndroid Build Coastguard Worker   VoiceMediaChannel(webrtc::TaskQueueBase* network_thread,
815*d9f75844SAndroid Build Coastguard Worker                     bool enable_dscp = false)
MediaChannel(network_thread,enable_dscp)816*d9f75844SAndroid Build Coastguard Worker       : MediaChannel(network_thread, enable_dscp) {}
~VoiceMediaChannel()817*d9f75844SAndroid Build Coastguard Worker   ~VoiceMediaChannel() override {}
818*d9f75844SAndroid Build Coastguard Worker 
819*d9f75844SAndroid Build Coastguard Worker   cricket::MediaType media_type() const override;
820*d9f75844SAndroid Build Coastguard Worker   virtual bool SetSendParameters(const AudioSendParameters& params) = 0;
821*d9f75844SAndroid Build Coastguard Worker   virtual bool SetRecvParameters(const AudioRecvParameters& params) = 0;
822*d9f75844SAndroid Build Coastguard Worker   // Get the receive parameters for the incoming stream identified by `ssrc`.
823*d9f75844SAndroid Build Coastguard Worker   virtual webrtc::RtpParameters GetRtpReceiveParameters(
824*d9f75844SAndroid Build Coastguard Worker       uint32_t ssrc) const = 0;
825*d9f75844SAndroid Build Coastguard Worker   // Retrieve the receive parameters for the default receive
826*d9f75844SAndroid Build Coastguard Worker   // stream, which is used when SSRCs are not signaled.
827*d9f75844SAndroid Build Coastguard Worker   virtual webrtc::RtpParameters GetDefaultRtpReceiveParameters() const = 0;
828*d9f75844SAndroid Build Coastguard Worker   // Starts or stops playout of received audio.
829*d9f75844SAndroid Build Coastguard Worker   virtual void SetPlayout(bool playout) = 0;
830*d9f75844SAndroid Build Coastguard Worker   // Starts or stops sending (and potentially capture) of local audio.
831*d9f75844SAndroid Build Coastguard Worker   virtual void SetSend(bool send) = 0;
832*d9f75844SAndroid Build Coastguard Worker   // Configure stream for sending.
833*d9f75844SAndroid Build Coastguard Worker   virtual bool SetAudioSend(uint32_t ssrc,
834*d9f75844SAndroid Build Coastguard Worker                             bool enable,
835*d9f75844SAndroid Build Coastguard Worker                             const AudioOptions* options,
836*d9f75844SAndroid Build Coastguard Worker                             AudioSource* source) = 0;
837*d9f75844SAndroid Build Coastguard Worker   // Set speaker output volume of the specified ssrc.
838*d9f75844SAndroid Build Coastguard Worker   virtual bool SetOutputVolume(uint32_t ssrc, double volume) = 0;
839*d9f75844SAndroid Build Coastguard Worker   // Set speaker output volume for future unsignaled streams.
840*d9f75844SAndroid Build Coastguard Worker   virtual bool SetDefaultOutputVolume(double volume) = 0;
841*d9f75844SAndroid Build Coastguard Worker   // Returns if the telephone-event has been negotiated.
842*d9f75844SAndroid Build Coastguard Worker   virtual bool CanInsertDtmf() = 0;
843*d9f75844SAndroid Build Coastguard Worker   // Send a DTMF `event`. The DTMF out-of-band signal will be used.
844*d9f75844SAndroid Build Coastguard Worker   // The `ssrc` should be either 0 or a valid send stream ssrc.
845*d9f75844SAndroid Build Coastguard Worker   // The valid value for the `event` are 0 to 15 which corresponding to
846*d9f75844SAndroid Build Coastguard Worker   // DTMF event 0-9, *, #, A-D.
847*d9f75844SAndroid Build Coastguard Worker   virtual bool InsertDtmf(uint32_t ssrc, int event, int duration) = 0;
848*d9f75844SAndroid Build Coastguard Worker   // Gets quality stats for the channel.
849*d9f75844SAndroid Build Coastguard Worker   virtual bool GetStats(VoiceMediaInfo* info,
850*d9f75844SAndroid Build Coastguard Worker                         bool get_and_clear_legacy_stats) = 0;
851*d9f75844SAndroid Build Coastguard Worker 
852*d9f75844SAndroid Build Coastguard Worker   virtual void SetRawAudioSink(
853*d9f75844SAndroid Build Coastguard Worker       uint32_t ssrc,
854*d9f75844SAndroid Build Coastguard Worker       std::unique_ptr<webrtc::AudioSinkInterface> sink) = 0;
855*d9f75844SAndroid Build Coastguard Worker   virtual void SetDefaultRawAudioSink(
856*d9f75844SAndroid Build Coastguard Worker       std::unique_ptr<webrtc::AudioSinkInterface> sink) = 0;
857*d9f75844SAndroid Build Coastguard Worker 
858*d9f75844SAndroid Build Coastguard Worker   virtual std::vector<webrtc::RtpSource> GetSources(uint32_t ssrc) const = 0;
859*d9f75844SAndroid Build Coastguard Worker };
860*d9f75844SAndroid Build Coastguard Worker 
861*d9f75844SAndroid Build Coastguard Worker // TODO(deadbeef): Rename to VideoSenderParameters, since they're intended to
862*d9f75844SAndroid Build Coastguard Worker // encapsulate all the parameters needed for a video RtpSender.
863*d9f75844SAndroid Build Coastguard Worker struct VideoSendParameters : RtpSendParameters<VideoCodec> {
864*d9f75844SAndroid Build Coastguard Worker   VideoSendParameters();
865*d9f75844SAndroid Build Coastguard Worker   ~VideoSendParameters() override;
866*d9f75844SAndroid Build Coastguard Worker   // Use conference mode? This flag comes from the remote
867*d9f75844SAndroid Build Coastguard Worker   // description's SDP line 'a=x-google-flag:conference', copied over
868*d9f75844SAndroid Build Coastguard Worker   // by VideoChannel::SetRemoteContent_w, and ultimately used by
869*d9f75844SAndroid Build Coastguard Worker   // conference mode screencast logic in
870*d9f75844SAndroid Build Coastguard Worker   // WebRtcVideoChannel::WebRtcVideoSendStream::CreateVideoEncoderConfig.
871*d9f75844SAndroid Build Coastguard Worker   // The special screencast behaviour is disabled by default.
872*d9f75844SAndroid Build Coastguard Worker   bool conference_mode = false;
873*d9f75844SAndroid Build Coastguard Worker 
874*d9f75844SAndroid Build Coastguard Worker  protected:
875*d9f75844SAndroid Build Coastguard Worker   std::map<std::string, std::string> ToStringMap() const override;
876*d9f75844SAndroid Build Coastguard Worker };
877*d9f75844SAndroid Build Coastguard Worker 
878*d9f75844SAndroid Build Coastguard Worker // TODO(deadbeef): Rename to VideoReceiverParameters, since they're intended to
879*d9f75844SAndroid Build Coastguard Worker // encapsulate all the parameters needed for a video RtpReceiver.
880*d9f75844SAndroid Build Coastguard Worker struct VideoRecvParameters : RtpParameters<VideoCodec> {};
881*d9f75844SAndroid Build Coastguard Worker 
882*d9f75844SAndroid Build Coastguard Worker class VideoMediaChannel : public MediaChannel, public Delayable {
883*d9f75844SAndroid Build Coastguard Worker  public:
884*d9f75844SAndroid Build Coastguard Worker   explicit VideoMediaChannel(webrtc::TaskQueueBase* network_thread,
885*d9f75844SAndroid Build Coastguard Worker                              bool enable_dscp = false)
MediaChannel(network_thread,enable_dscp)886*d9f75844SAndroid Build Coastguard Worker       : MediaChannel(network_thread, enable_dscp) {}
~VideoMediaChannel()887*d9f75844SAndroid Build Coastguard Worker   ~VideoMediaChannel() override {}
888*d9f75844SAndroid Build Coastguard Worker 
889*d9f75844SAndroid Build Coastguard Worker   cricket::MediaType media_type() const override;
890*d9f75844SAndroid Build Coastguard Worker   virtual bool SetSendParameters(const VideoSendParameters& params) = 0;
891*d9f75844SAndroid Build Coastguard Worker   virtual bool SetRecvParameters(const VideoRecvParameters& params) = 0;
892*d9f75844SAndroid Build Coastguard Worker   // Get the receive parameters for the incoming stream identified by `ssrc`.
893*d9f75844SAndroid Build Coastguard Worker   virtual webrtc::RtpParameters GetRtpReceiveParameters(
894*d9f75844SAndroid Build Coastguard Worker       uint32_t ssrc) const = 0;
895*d9f75844SAndroid Build Coastguard Worker   // Retrieve the receive parameters for the default receive
896*d9f75844SAndroid Build Coastguard Worker   // stream, which is used when SSRCs are not signaled.
897*d9f75844SAndroid Build Coastguard Worker   virtual webrtc::RtpParameters GetDefaultRtpReceiveParameters() const = 0;
898*d9f75844SAndroid Build Coastguard Worker   // Gets the currently set codecs/payload types to be used for outgoing media.
899*d9f75844SAndroid Build Coastguard Worker   virtual bool GetSendCodec(VideoCodec* send_codec) = 0;
900*d9f75844SAndroid Build Coastguard Worker   // Starts or stops transmission (and potentially capture) of local video.
901*d9f75844SAndroid Build Coastguard Worker   virtual bool SetSend(bool send) = 0;
902*d9f75844SAndroid Build Coastguard Worker   // Configure stream for sending and register a source.
903*d9f75844SAndroid Build Coastguard Worker   // The `ssrc` must correspond to a registered send stream.
904*d9f75844SAndroid Build Coastguard Worker   virtual bool SetVideoSend(
905*d9f75844SAndroid Build Coastguard Worker       uint32_t ssrc,
906*d9f75844SAndroid Build Coastguard Worker       const VideoOptions* options,
907*d9f75844SAndroid Build Coastguard Worker       rtc::VideoSourceInterface<webrtc::VideoFrame>* source) = 0;
908*d9f75844SAndroid Build Coastguard Worker   // Sets the sink object to be used for the specified stream.
909*d9f75844SAndroid Build Coastguard Worker   virtual bool SetSink(uint32_t ssrc,
910*d9f75844SAndroid Build Coastguard Worker                        rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) = 0;
911*d9f75844SAndroid Build Coastguard Worker   // The sink is used for the 'default' stream.
912*d9f75844SAndroid Build Coastguard Worker   virtual void SetDefaultSink(
913*d9f75844SAndroid Build Coastguard Worker       rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) = 0;
914*d9f75844SAndroid Build Coastguard Worker   // This fills the "bitrate parts" (rtx, video bitrate) of the
915*d9f75844SAndroid Build Coastguard Worker   // BandwidthEstimationInfo, since that part that isn't possible to get
916*d9f75844SAndroid Build Coastguard Worker   // through webrtc::Call::GetStats, as they are statistics of the send
917*d9f75844SAndroid Build Coastguard Worker   // streams.
918*d9f75844SAndroid Build Coastguard Worker   // TODO(holmer): We should change this so that either BWE graphs doesn't
919*d9f75844SAndroid Build Coastguard Worker   // need access to bitrates of the streams, or change the (RTC)StatsCollector
920*d9f75844SAndroid Build Coastguard Worker   // so that it's getting the send stream stats separately by calling
921*d9f75844SAndroid Build Coastguard Worker   // GetStats(), and merges with BandwidthEstimationInfo by itself.
922*d9f75844SAndroid Build Coastguard Worker   virtual void FillBitrateInfo(BandwidthEstimationInfo* bwe_info) = 0;
923*d9f75844SAndroid Build Coastguard Worker   // Gets quality stats for the channel.
924*d9f75844SAndroid Build Coastguard Worker   virtual bool GetStats(VideoMediaInfo* info) = 0;
925*d9f75844SAndroid Build Coastguard Worker   // Set recordable encoded frame callback for `ssrc`
926*d9f75844SAndroid Build Coastguard Worker   virtual void SetRecordableEncodedFrameCallback(
927*d9f75844SAndroid Build Coastguard Worker       uint32_t ssrc,
928*d9f75844SAndroid Build Coastguard Worker       std::function<void(const webrtc::RecordableEncodedFrame&)> callback) = 0;
929*d9f75844SAndroid Build Coastguard Worker   // Clear recordable encoded frame callback for `ssrc`
930*d9f75844SAndroid Build Coastguard Worker   virtual void ClearRecordableEncodedFrameCallback(uint32_t ssrc) = 0;
931*d9f75844SAndroid Build Coastguard Worker   // Request generation of a keyframe for `ssrc` on a receiving channel via
932*d9f75844SAndroid Build Coastguard Worker   // RTCP feedback.
933*d9f75844SAndroid Build Coastguard Worker   virtual void RequestRecvKeyFrame(uint32_t ssrc) = 0;
934*d9f75844SAndroid Build Coastguard Worker   // Cause generation of a keyframe for `ssrc` on a sending channel.
935*d9f75844SAndroid Build Coastguard Worker   virtual void GenerateSendKeyFrame(uint32_t ssrc,
936*d9f75844SAndroid Build Coastguard Worker                                     const std::vector<std::string>& rids) = 0;
937*d9f75844SAndroid Build Coastguard Worker 
938*d9f75844SAndroid Build Coastguard Worker   virtual std::vector<webrtc::RtpSource> GetSources(uint32_t ssrc) const = 0;
939*d9f75844SAndroid Build Coastguard Worker };
940*d9f75844SAndroid Build Coastguard Worker 
941*d9f75844SAndroid Build Coastguard Worker // Info about data received in DataMediaChannel.  For use in
942*d9f75844SAndroid Build Coastguard Worker // DataMediaChannel::SignalDataReceived and in all of the signals that
943*d9f75844SAndroid Build Coastguard Worker // signal fires, on up the chain.
944*d9f75844SAndroid Build Coastguard Worker struct ReceiveDataParams {
945*d9f75844SAndroid Build Coastguard Worker   // The in-packet stream indentifier.
946*d9f75844SAndroid Build Coastguard Worker   // SCTP data channels use SIDs.
947*d9f75844SAndroid Build Coastguard Worker   int sid = 0;
948*d9f75844SAndroid Build Coastguard Worker   // The type of message (binary, text, or control).
949*d9f75844SAndroid Build Coastguard Worker   webrtc::DataMessageType type = webrtc::DataMessageType::kText;
950*d9f75844SAndroid Build Coastguard Worker   // A per-stream value incremented per packet in the stream.
951*d9f75844SAndroid Build Coastguard Worker   int seq_num = 0;
952*d9f75844SAndroid Build Coastguard Worker };
953*d9f75844SAndroid Build Coastguard Worker 
954*d9f75844SAndroid Build Coastguard Worker enum SendDataResult { SDR_SUCCESS, SDR_ERROR, SDR_BLOCK };
955*d9f75844SAndroid Build Coastguard Worker 
956*d9f75844SAndroid Build Coastguard Worker }  // namespace cricket
957*d9f75844SAndroid Build Coastguard Worker 
958*d9f75844SAndroid Build Coastguard Worker #endif  // MEDIA_BASE_MEDIA_CHANNEL_H_
959