1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright 2012 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker // This file contains interfaces for MediaStream, MediaTrack and MediaSource. 12*d9f75844SAndroid Build Coastguard Worker // These interfaces are used for implementing MediaStream and MediaTrack as 13*d9f75844SAndroid Build Coastguard Worker // defined in http://dev.w3.org/2011/webrtc/editor/webrtc.html#stream-api. These 14*d9f75844SAndroid Build Coastguard Worker // interfaces must be used only with PeerConnection. 15*d9f75844SAndroid Build Coastguard Worker 16*d9f75844SAndroid Build Coastguard Worker #ifndef API_MEDIA_STREAM_INTERFACE_H_ 17*d9f75844SAndroid Build Coastguard Worker #define API_MEDIA_STREAM_INTERFACE_H_ 18*d9f75844SAndroid Build Coastguard Worker 19*d9f75844SAndroid Build Coastguard Worker #include <stddef.h> 20*d9f75844SAndroid Build Coastguard Worker 21*d9f75844SAndroid Build Coastguard Worker #include <string> 22*d9f75844SAndroid Build Coastguard Worker #include <vector> 23*d9f75844SAndroid Build Coastguard Worker 24*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h" 25*d9f75844SAndroid Build Coastguard Worker #include "api/audio_options.h" 26*d9f75844SAndroid Build Coastguard Worker #include "api/scoped_refptr.h" 27*d9f75844SAndroid Build Coastguard Worker #include "api/video/recordable_encoded_frame.h" 28*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_frame.h" 29*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_sink_interface.h" 30*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_source_interface.h" 31*d9f75844SAndroid Build Coastguard Worker #include "api/video_track_source_constraints.h" 32*d9f75844SAndroid Build Coastguard Worker #include "modules/audio_processing/include/audio_processing_statistics.h" 33*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/ref_count.h" 34*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/system/rtc_export.h" 35*d9f75844SAndroid Build Coastguard Worker 36*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 37*d9f75844SAndroid Build Coastguard Worker 38*d9f75844SAndroid Build Coastguard Worker // Generic observer interface. 39*d9f75844SAndroid Build Coastguard Worker class ObserverInterface { 40*d9f75844SAndroid Build Coastguard Worker public: 41*d9f75844SAndroid Build Coastguard Worker virtual void OnChanged() = 0; 42*d9f75844SAndroid Build Coastguard Worker 43*d9f75844SAndroid Build Coastguard Worker protected: ~ObserverInterface()44*d9f75844SAndroid Build Coastguard Worker virtual ~ObserverInterface() {} 45*d9f75844SAndroid Build Coastguard Worker }; 46*d9f75844SAndroid Build Coastguard Worker 47*d9f75844SAndroid Build Coastguard Worker class NotifierInterface { 48*d9f75844SAndroid Build Coastguard Worker public: 49*d9f75844SAndroid Build Coastguard Worker virtual void RegisterObserver(ObserverInterface* observer) = 0; 50*d9f75844SAndroid Build Coastguard Worker virtual void UnregisterObserver(ObserverInterface* observer) = 0; 51*d9f75844SAndroid Build Coastguard Worker ~NotifierInterface()52*d9f75844SAndroid Build Coastguard Worker virtual ~NotifierInterface() {} 53*d9f75844SAndroid Build Coastguard Worker }; 54*d9f75844SAndroid Build Coastguard Worker 55*d9f75844SAndroid Build Coastguard Worker // Base class for sources. A MediaStreamTrack has an underlying source that 56*d9f75844SAndroid Build Coastguard Worker // provides media. A source can be shared by multiple tracks. 57*d9f75844SAndroid Build Coastguard Worker class RTC_EXPORT MediaSourceInterface : public rtc::RefCountInterface, 58*d9f75844SAndroid Build Coastguard Worker public NotifierInterface { 59*d9f75844SAndroid Build Coastguard Worker public: 60*d9f75844SAndroid Build Coastguard Worker enum SourceState { kInitializing, kLive, kEnded, kMuted }; 61*d9f75844SAndroid Build Coastguard Worker 62*d9f75844SAndroid Build Coastguard Worker virtual SourceState state() const = 0; 63*d9f75844SAndroid Build Coastguard Worker 64*d9f75844SAndroid Build Coastguard Worker virtual bool remote() const = 0; 65*d9f75844SAndroid Build Coastguard Worker 66*d9f75844SAndroid Build Coastguard Worker protected: 67*d9f75844SAndroid Build Coastguard Worker ~MediaSourceInterface() override = default; 68*d9f75844SAndroid Build Coastguard Worker }; 69*d9f75844SAndroid Build Coastguard Worker 70*d9f75844SAndroid Build Coastguard Worker // C++ version of MediaStreamTrack. 71*d9f75844SAndroid Build Coastguard Worker // See: https://www.w3.org/TR/mediacapture-streams/#mediastreamtrack 72*d9f75844SAndroid Build Coastguard Worker class RTC_EXPORT MediaStreamTrackInterface : public rtc::RefCountInterface, 73*d9f75844SAndroid Build Coastguard Worker public NotifierInterface { 74*d9f75844SAndroid Build Coastguard Worker public: 75*d9f75844SAndroid Build Coastguard Worker enum TrackState { 76*d9f75844SAndroid Build Coastguard Worker kLive, 77*d9f75844SAndroid Build Coastguard Worker kEnded, 78*d9f75844SAndroid Build Coastguard Worker }; 79*d9f75844SAndroid Build Coastguard Worker 80*d9f75844SAndroid Build Coastguard Worker static const char* const kAudioKind; 81*d9f75844SAndroid Build Coastguard Worker static const char* const kVideoKind; 82*d9f75844SAndroid Build Coastguard Worker 83*d9f75844SAndroid Build Coastguard Worker // The kind() method must return kAudioKind only if the object is a 84*d9f75844SAndroid Build Coastguard Worker // subclass of AudioTrackInterface, and kVideoKind only if the 85*d9f75844SAndroid Build Coastguard Worker // object is a subclass of VideoTrackInterface. It is typically used 86*d9f75844SAndroid Build Coastguard Worker // to protect a static_cast<> to the corresponding subclass. 87*d9f75844SAndroid Build Coastguard Worker virtual std::string kind() const = 0; 88*d9f75844SAndroid Build Coastguard Worker 89*d9f75844SAndroid Build Coastguard Worker // Track identifier. 90*d9f75844SAndroid Build Coastguard Worker virtual std::string id() const = 0; 91*d9f75844SAndroid Build Coastguard Worker 92*d9f75844SAndroid Build Coastguard Worker // A disabled track will produce silence (if audio) or black frames (if 93*d9f75844SAndroid Build Coastguard Worker // video). Can be disabled and re-enabled. 94*d9f75844SAndroid Build Coastguard Worker virtual bool enabled() const = 0; 95*d9f75844SAndroid Build Coastguard Worker virtual bool set_enabled(bool enable) = 0; 96*d9f75844SAndroid Build Coastguard Worker 97*d9f75844SAndroid Build Coastguard Worker // Live or ended. A track will never be live again after becoming ended. 98*d9f75844SAndroid Build Coastguard Worker virtual TrackState state() const = 0; 99*d9f75844SAndroid Build Coastguard Worker 100*d9f75844SAndroid Build Coastguard Worker protected: 101*d9f75844SAndroid Build Coastguard Worker ~MediaStreamTrackInterface() override = default; 102*d9f75844SAndroid Build Coastguard Worker }; 103*d9f75844SAndroid Build Coastguard Worker 104*d9f75844SAndroid Build Coastguard Worker // VideoTrackSourceInterface is a reference counted source used for 105*d9f75844SAndroid Build Coastguard Worker // VideoTracks. The same source can be used by multiple VideoTracks. 106*d9f75844SAndroid Build Coastguard Worker // VideoTrackSourceInterface is designed to be invoked on the signaling thread 107*d9f75844SAndroid Build Coastguard Worker // except for rtc::VideoSourceInterface<VideoFrame> methods that will be invoked 108*d9f75844SAndroid Build Coastguard Worker // on the worker thread via a VideoTrack. A custom implementation of a source 109*d9f75844SAndroid Build Coastguard Worker // can inherit AdaptedVideoTrackSource instead of directly implementing this 110*d9f75844SAndroid Build Coastguard Worker // interface. 111*d9f75844SAndroid Build Coastguard Worker class VideoTrackSourceInterface : public MediaSourceInterface, 112*d9f75844SAndroid Build Coastguard Worker public rtc::VideoSourceInterface<VideoFrame> { 113*d9f75844SAndroid Build Coastguard Worker public: 114*d9f75844SAndroid Build Coastguard Worker struct Stats { 115*d9f75844SAndroid Build Coastguard Worker // Original size of captured frame, before video adaptation. 116*d9f75844SAndroid Build Coastguard Worker int input_width; 117*d9f75844SAndroid Build Coastguard Worker int input_height; 118*d9f75844SAndroid Build Coastguard Worker }; 119*d9f75844SAndroid Build Coastguard Worker 120*d9f75844SAndroid Build Coastguard Worker // Indicates that parameters suitable for screencasts should be automatically 121*d9f75844SAndroid Build Coastguard Worker // applied to RtpSenders. 122*d9f75844SAndroid Build Coastguard Worker // TODO(perkj): Remove these once all known applications have moved to 123*d9f75844SAndroid Build Coastguard Worker // explicitly setting suitable parameters for screencasts and don't need this 124*d9f75844SAndroid Build Coastguard Worker // implicit behavior. 125*d9f75844SAndroid Build Coastguard Worker virtual bool is_screencast() const = 0; 126*d9f75844SAndroid Build Coastguard Worker 127*d9f75844SAndroid Build Coastguard Worker // Indicates that the encoder should denoise video before encoding it. 128*d9f75844SAndroid Build Coastguard Worker // If it is not set, the default configuration is used which is different 129*d9f75844SAndroid Build Coastguard Worker // depending on video codec. 130*d9f75844SAndroid Build Coastguard Worker // TODO(perkj): Remove this once denoising is done by the source, and not by 131*d9f75844SAndroid Build Coastguard Worker // the encoder. 132*d9f75844SAndroid Build Coastguard Worker virtual absl::optional<bool> needs_denoising() const = 0; 133*d9f75844SAndroid Build Coastguard Worker 134*d9f75844SAndroid Build Coastguard Worker // Returns false if no stats are available, e.g, for a remote source, or a 135*d9f75844SAndroid Build Coastguard Worker // source which has not seen its first frame yet. 136*d9f75844SAndroid Build Coastguard Worker // 137*d9f75844SAndroid Build Coastguard Worker // Implementation should avoid blocking. 138*d9f75844SAndroid Build Coastguard Worker virtual bool GetStats(Stats* stats) = 0; 139*d9f75844SAndroid Build Coastguard Worker 140*d9f75844SAndroid Build Coastguard Worker // Returns true if encoded output can be enabled in the source. 141*d9f75844SAndroid Build Coastguard Worker virtual bool SupportsEncodedOutput() const = 0; 142*d9f75844SAndroid Build Coastguard Worker 143*d9f75844SAndroid Build Coastguard Worker // Reliably cause a key frame to be generated in encoded output. 144*d9f75844SAndroid Build Coastguard Worker // TODO(bugs.webrtc.org/11115): find optimal naming. 145*d9f75844SAndroid Build Coastguard Worker virtual void GenerateKeyFrame() = 0; 146*d9f75844SAndroid Build Coastguard Worker 147*d9f75844SAndroid Build Coastguard Worker // Add an encoded video sink to the source and additionally cause 148*d9f75844SAndroid Build Coastguard Worker // a key frame to be generated from the source. The sink will be 149*d9f75844SAndroid Build Coastguard Worker // invoked from a decoder queue. 150*d9f75844SAndroid Build Coastguard Worker virtual void AddEncodedSink( 151*d9f75844SAndroid Build Coastguard Worker rtc::VideoSinkInterface<RecordableEncodedFrame>* sink) = 0; 152*d9f75844SAndroid Build Coastguard Worker 153*d9f75844SAndroid Build Coastguard Worker // Removes an encoded video sink from the source. 154*d9f75844SAndroid Build Coastguard Worker virtual void RemoveEncodedSink( 155*d9f75844SAndroid Build Coastguard Worker rtc::VideoSinkInterface<RecordableEncodedFrame>* sink) = 0; 156*d9f75844SAndroid Build Coastguard Worker 157*d9f75844SAndroid Build Coastguard Worker // Notify about constraints set on the source. The information eventually gets 158*d9f75844SAndroid Build Coastguard Worker // routed to attached sinks via VideoSinkInterface<>::OnConstraintsChanged. 159*d9f75844SAndroid Build Coastguard Worker // The call is expected to happen on the network thread. 160*d9f75844SAndroid Build Coastguard Worker // TODO(crbug/1255737): make pure virtual once downstream project adapts. ProcessConstraints(const webrtc::VideoTrackSourceConstraints & constraints)161*d9f75844SAndroid Build Coastguard Worker virtual void ProcessConstraints( 162*d9f75844SAndroid Build Coastguard Worker const webrtc::VideoTrackSourceConstraints& constraints) {} 163*d9f75844SAndroid Build Coastguard Worker 164*d9f75844SAndroid Build Coastguard Worker protected: 165*d9f75844SAndroid Build Coastguard Worker ~VideoTrackSourceInterface() override = default; 166*d9f75844SAndroid Build Coastguard Worker }; 167*d9f75844SAndroid Build Coastguard Worker 168*d9f75844SAndroid Build Coastguard Worker // VideoTrackInterface is designed to be invoked on the signaling thread except 169*d9f75844SAndroid Build Coastguard Worker // for rtc::VideoSourceInterface<VideoFrame> methods that must be invoked 170*d9f75844SAndroid Build Coastguard Worker // on the worker thread. 171*d9f75844SAndroid Build Coastguard Worker // PeerConnectionFactory::CreateVideoTrack can be used for creating a VideoTrack 172*d9f75844SAndroid Build Coastguard Worker // that ensures thread safety and that all methods are called on the right 173*d9f75844SAndroid Build Coastguard Worker // thread. 174*d9f75844SAndroid Build Coastguard Worker class RTC_EXPORT VideoTrackInterface 175*d9f75844SAndroid Build Coastguard Worker : public MediaStreamTrackInterface, 176*d9f75844SAndroid Build Coastguard Worker public rtc::VideoSourceInterface<VideoFrame> { 177*d9f75844SAndroid Build Coastguard Worker public: 178*d9f75844SAndroid Build Coastguard Worker // Video track content hint, used to override the source is_screencast 179*d9f75844SAndroid Build Coastguard Worker // property. 180*d9f75844SAndroid Build Coastguard Worker // See https://crbug.com/653531 and https://w3c.github.io/mst-content-hint. 181*d9f75844SAndroid Build Coastguard Worker enum class ContentHint { kNone, kFluid, kDetailed, kText }; 182*d9f75844SAndroid Build Coastguard Worker 183*d9f75844SAndroid Build Coastguard Worker // Register a video sink for this track. Used to connect the track to the 184*d9f75844SAndroid Build Coastguard Worker // underlying video engine. AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame> * sink,const rtc::VideoSinkWants & wants)185*d9f75844SAndroid Build Coastguard Worker void AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink, 186*d9f75844SAndroid Build Coastguard Worker const rtc::VideoSinkWants& wants) override {} RemoveSink(rtc::VideoSinkInterface<VideoFrame> * sink)187*d9f75844SAndroid Build Coastguard Worker void RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink) override {} 188*d9f75844SAndroid Build Coastguard Worker 189*d9f75844SAndroid Build Coastguard Worker virtual VideoTrackSourceInterface* GetSource() const = 0; 190*d9f75844SAndroid Build Coastguard Worker 191*d9f75844SAndroid Build Coastguard Worker virtual ContentHint content_hint() const; set_content_hint(ContentHint hint)192*d9f75844SAndroid Build Coastguard Worker virtual void set_content_hint(ContentHint hint) {} 193*d9f75844SAndroid Build Coastguard Worker 194*d9f75844SAndroid Build Coastguard Worker protected: 195*d9f75844SAndroid Build Coastguard Worker ~VideoTrackInterface() override = default; 196*d9f75844SAndroid Build Coastguard Worker }; 197*d9f75844SAndroid Build Coastguard Worker 198*d9f75844SAndroid Build Coastguard Worker // Interface for receiving audio data from a AudioTrack. 199*d9f75844SAndroid Build Coastguard Worker class AudioTrackSinkInterface { 200*d9f75844SAndroid Build Coastguard Worker public: OnData(const void * audio_data,int bits_per_sample,int sample_rate,size_t number_of_channels,size_t number_of_frames)201*d9f75844SAndroid Build Coastguard Worker virtual void OnData(const void* audio_data, 202*d9f75844SAndroid Build Coastguard Worker int bits_per_sample, 203*d9f75844SAndroid Build Coastguard Worker int sample_rate, 204*d9f75844SAndroid Build Coastguard Worker size_t number_of_channels, 205*d9f75844SAndroid Build Coastguard Worker size_t number_of_frames) { 206*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_NOTREACHED() << "This method must be overridden, or not used."; 207*d9f75844SAndroid Build Coastguard Worker } 208*d9f75844SAndroid Build Coastguard Worker 209*d9f75844SAndroid Build Coastguard Worker // In this method, `absolute_capture_timestamp_ms`, when available, is 210*d9f75844SAndroid Build Coastguard Worker // supposed to deliver the timestamp when this audio frame was originally 211*d9f75844SAndroid Build Coastguard Worker // captured. This timestamp MUST be based on the same clock as 212*d9f75844SAndroid Build Coastguard Worker // rtc::TimeMillis(). OnData(const void * audio_data,int bits_per_sample,int sample_rate,size_t number_of_channels,size_t number_of_frames,absl::optional<int64_t> absolute_capture_timestamp_ms)213*d9f75844SAndroid Build Coastguard Worker virtual void OnData(const void* audio_data, 214*d9f75844SAndroid Build Coastguard Worker int bits_per_sample, 215*d9f75844SAndroid Build Coastguard Worker int sample_rate, 216*d9f75844SAndroid Build Coastguard Worker size_t number_of_channels, 217*d9f75844SAndroid Build Coastguard Worker size_t number_of_frames, 218*d9f75844SAndroid Build Coastguard Worker absl::optional<int64_t> absolute_capture_timestamp_ms) { 219*d9f75844SAndroid Build Coastguard Worker // TODO(bugs.webrtc.org/10739): Deprecate the old OnData and make this one 220*d9f75844SAndroid Build Coastguard Worker // pure virtual. 221*d9f75844SAndroid Build Coastguard Worker return OnData(audio_data, bits_per_sample, sample_rate, number_of_channels, 222*d9f75844SAndroid Build Coastguard Worker number_of_frames); 223*d9f75844SAndroid Build Coastguard Worker } 224*d9f75844SAndroid Build Coastguard Worker 225*d9f75844SAndroid Build Coastguard Worker // Returns the number of channels encoded by the sink. This can be less than 226*d9f75844SAndroid Build Coastguard Worker // the number_of_channels if down-mixing occur. A value of -1 means an unknown 227*d9f75844SAndroid Build Coastguard Worker // number. NumPreferredChannels()228*d9f75844SAndroid Build Coastguard Worker virtual int NumPreferredChannels() const { return -1; } 229*d9f75844SAndroid Build Coastguard Worker 230*d9f75844SAndroid Build Coastguard Worker protected: ~AudioTrackSinkInterface()231*d9f75844SAndroid Build Coastguard Worker virtual ~AudioTrackSinkInterface() {} 232*d9f75844SAndroid Build Coastguard Worker }; 233*d9f75844SAndroid Build Coastguard Worker 234*d9f75844SAndroid Build Coastguard Worker // AudioSourceInterface is a reference counted source used for AudioTracks. 235*d9f75844SAndroid Build Coastguard Worker // The same source can be used by multiple AudioTracks. 236*d9f75844SAndroid Build Coastguard Worker class RTC_EXPORT AudioSourceInterface : public MediaSourceInterface { 237*d9f75844SAndroid Build Coastguard Worker public: 238*d9f75844SAndroid Build Coastguard Worker class AudioObserver { 239*d9f75844SAndroid Build Coastguard Worker public: 240*d9f75844SAndroid Build Coastguard Worker virtual void OnSetVolume(double volume) = 0; 241*d9f75844SAndroid Build Coastguard Worker 242*d9f75844SAndroid Build Coastguard Worker protected: ~AudioObserver()243*d9f75844SAndroid Build Coastguard Worker virtual ~AudioObserver() {} 244*d9f75844SAndroid Build Coastguard Worker }; 245*d9f75844SAndroid Build Coastguard Worker 246*d9f75844SAndroid Build Coastguard Worker // TODO(deadbeef): Makes all the interfaces pure virtual after they're 247*d9f75844SAndroid Build Coastguard Worker // implemented in chromium. 248*d9f75844SAndroid Build Coastguard Worker 249*d9f75844SAndroid Build Coastguard Worker // Sets the volume of the source. `volume` is in the range of [0, 10]. 250*d9f75844SAndroid Build Coastguard Worker // TODO(tommi): This method should be on the track and ideally volume should 251*d9f75844SAndroid Build Coastguard Worker // be applied in the track in a way that does not affect clones of the track. SetVolume(double volume)252*d9f75844SAndroid Build Coastguard Worker virtual void SetVolume(double volume) {} 253*d9f75844SAndroid Build Coastguard Worker 254*d9f75844SAndroid Build Coastguard Worker // Registers/unregisters observers to the audio source. RegisterAudioObserver(AudioObserver * observer)255*d9f75844SAndroid Build Coastguard Worker virtual void RegisterAudioObserver(AudioObserver* observer) {} UnregisterAudioObserver(AudioObserver * observer)256*d9f75844SAndroid Build Coastguard Worker virtual void UnregisterAudioObserver(AudioObserver* observer) {} 257*d9f75844SAndroid Build Coastguard Worker 258*d9f75844SAndroid Build Coastguard Worker // TODO(tommi): Make pure virtual. AddSink(AudioTrackSinkInterface * sink)259*d9f75844SAndroid Build Coastguard Worker virtual void AddSink(AudioTrackSinkInterface* sink) {} RemoveSink(AudioTrackSinkInterface * sink)260*d9f75844SAndroid Build Coastguard Worker virtual void RemoveSink(AudioTrackSinkInterface* sink) {} 261*d9f75844SAndroid Build Coastguard Worker 262*d9f75844SAndroid Build Coastguard Worker // Returns options for the AudioSource. 263*d9f75844SAndroid Build Coastguard Worker // (for some of the settings this approach is broken, e.g. setting 264*d9f75844SAndroid Build Coastguard Worker // audio network adaptation on the source is the wrong layer of abstraction). 265*d9f75844SAndroid Build Coastguard Worker virtual const cricket::AudioOptions options() const; 266*d9f75844SAndroid Build Coastguard Worker }; 267*d9f75844SAndroid Build Coastguard Worker 268*d9f75844SAndroid Build Coastguard Worker // Interface of the audio processor used by the audio track to collect 269*d9f75844SAndroid Build Coastguard Worker // statistics. 270*d9f75844SAndroid Build Coastguard Worker class AudioProcessorInterface : public rtc::RefCountInterface { 271*d9f75844SAndroid Build Coastguard Worker public: 272*d9f75844SAndroid Build Coastguard Worker struct AudioProcessorStatistics { 273*d9f75844SAndroid Build Coastguard Worker bool typing_noise_detected = false; 274*d9f75844SAndroid Build Coastguard Worker AudioProcessingStats apm_statistics; 275*d9f75844SAndroid Build Coastguard Worker }; 276*d9f75844SAndroid Build Coastguard Worker 277*d9f75844SAndroid Build Coastguard Worker // Get audio processor statistics. The `has_remote_tracks` argument should be 278*d9f75844SAndroid Build Coastguard Worker // set if there are active remote tracks (this would usually be true during 279*d9f75844SAndroid Build Coastguard Worker // a call). If there are no remote tracks some of the stats will not be set by 280*d9f75844SAndroid Build Coastguard Worker // the AudioProcessor, because they only make sense if there is at least one 281*d9f75844SAndroid Build Coastguard Worker // remote track. 282*d9f75844SAndroid Build Coastguard Worker virtual AudioProcessorStatistics GetStats(bool has_remote_tracks) = 0; 283*d9f75844SAndroid Build Coastguard Worker 284*d9f75844SAndroid Build Coastguard Worker protected: 285*d9f75844SAndroid Build Coastguard Worker ~AudioProcessorInterface() override = default; 286*d9f75844SAndroid Build Coastguard Worker }; 287*d9f75844SAndroid Build Coastguard Worker 288*d9f75844SAndroid Build Coastguard Worker class RTC_EXPORT AudioTrackInterface : public MediaStreamTrackInterface { 289*d9f75844SAndroid Build Coastguard Worker public: 290*d9f75844SAndroid Build Coastguard Worker // TODO(deadbeef): Figure out if the following interface should be const or 291*d9f75844SAndroid Build Coastguard Worker // not. 292*d9f75844SAndroid Build Coastguard Worker virtual AudioSourceInterface* GetSource() const = 0; 293*d9f75844SAndroid Build Coastguard Worker 294*d9f75844SAndroid Build Coastguard Worker // Add/Remove a sink that will receive the audio data from the track. 295*d9f75844SAndroid Build Coastguard Worker virtual void AddSink(AudioTrackSinkInterface* sink) = 0; 296*d9f75844SAndroid Build Coastguard Worker virtual void RemoveSink(AudioTrackSinkInterface* sink) = 0; 297*d9f75844SAndroid Build Coastguard Worker 298*d9f75844SAndroid Build Coastguard Worker // Get the signal level from the audio track. 299*d9f75844SAndroid Build Coastguard Worker // Return true on success, otherwise false. 300*d9f75844SAndroid Build Coastguard Worker // TODO(deadbeef): Change the interface to int GetSignalLevel() and pure 301*d9f75844SAndroid Build Coastguard Worker // virtual after it's implemented in chromium. 302*d9f75844SAndroid Build Coastguard Worker virtual bool GetSignalLevel(int* level); 303*d9f75844SAndroid Build Coastguard Worker 304*d9f75844SAndroid Build Coastguard Worker // Get the audio processor used by the audio track. Return null if the track 305*d9f75844SAndroid Build Coastguard Worker // does not have any processor. 306*d9f75844SAndroid Build Coastguard Worker // TODO(deadbeef): Make the interface pure virtual. 307*d9f75844SAndroid Build Coastguard Worker virtual rtc::scoped_refptr<AudioProcessorInterface> GetAudioProcessor(); 308*d9f75844SAndroid Build Coastguard Worker 309*d9f75844SAndroid Build Coastguard Worker protected: 310*d9f75844SAndroid Build Coastguard Worker ~AudioTrackInterface() override = default; 311*d9f75844SAndroid Build Coastguard Worker }; 312*d9f75844SAndroid Build Coastguard Worker 313*d9f75844SAndroid Build Coastguard Worker typedef std::vector<rtc::scoped_refptr<AudioTrackInterface> > AudioTrackVector; 314*d9f75844SAndroid Build Coastguard Worker typedef std::vector<rtc::scoped_refptr<VideoTrackInterface> > VideoTrackVector; 315*d9f75844SAndroid Build Coastguard Worker 316*d9f75844SAndroid Build Coastguard Worker // C++ version of https://www.w3.org/TR/mediacapture-streams/#mediastream. 317*d9f75844SAndroid Build Coastguard Worker // 318*d9f75844SAndroid Build Coastguard Worker // A major difference is that remote audio/video tracks (received by a 319*d9f75844SAndroid Build Coastguard Worker // PeerConnection/RtpReceiver) are not synchronized simply by adding them to 320*d9f75844SAndroid Build Coastguard Worker // the same stream; a session description with the correct "a=msid" attributes 321*d9f75844SAndroid Build Coastguard Worker // must be pushed down. 322*d9f75844SAndroid Build Coastguard Worker // 323*d9f75844SAndroid Build Coastguard Worker // Thus, this interface acts as simply a container for tracks. 324*d9f75844SAndroid Build Coastguard Worker class MediaStreamInterface : public rtc::RefCountInterface, 325*d9f75844SAndroid Build Coastguard Worker public NotifierInterface { 326*d9f75844SAndroid Build Coastguard Worker public: 327*d9f75844SAndroid Build Coastguard Worker virtual std::string id() const = 0; 328*d9f75844SAndroid Build Coastguard Worker 329*d9f75844SAndroid Build Coastguard Worker virtual AudioTrackVector GetAudioTracks() = 0; 330*d9f75844SAndroid Build Coastguard Worker virtual VideoTrackVector GetVideoTracks() = 0; 331*d9f75844SAndroid Build Coastguard Worker virtual rtc::scoped_refptr<AudioTrackInterface> FindAudioTrack( 332*d9f75844SAndroid Build Coastguard Worker const std::string& track_id) = 0; 333*d9f75844SAndroid Build Coastguard Worker virtual rtc::scoped_refptr<VideoTrackInterface> FindVideoTrack( 334*d9f75844SAndroid Build Coastguard Worker const std::string& track_id) = 0; 335*d9f75844SAndroid Build Coastguard Worker 336*d9f75844SAndroid Build Coastguard Worker // Takes ownership of added tracks. 337*d9f75844SAndroid Build Coastguard Worker // Note: Default implementations are for avoiding link time errors in 338*d9f75844SAndroid Build Coastguard Worker // implementations that mock this API. 339*d9f75844SAndroid Build Coastguard Worker // TODO(bugs.webrtc.org/13980): Remove default implementations. AddTrack(rtc::scoped_refptr<AudioTrackInterface> track)340*d9f75844SAndroid Build Coastguard Worker virtual bool AddTrack(rtc::scoped_refptr<AudioTrackInterface> track) { 341*d9f75844SAndroid Build Coastguard Worker RTC_CHECK_NOTREACHED(); 342*d9f75844SAndroid Build Coastguard Worker } AddTrack(rtc::scoped_refptr<VideoTrackInterface> track)343*d9f75844SAndroid Build Coastguard Worker virtual bool AddTrack(rtc::scoped_refptr<VideoTrackInterface> track) { 344*d9f75844SAndroid Build Coastguard Worker RTC_CHECK_NOTREACHED(); 345*d9f75844SAndroid Build Coastguard Worker } RemoveTrack(rtc::scoped_refptr<AudioTrackInterface> track)346*d9f75844SAndroid Build Coastguard Worker virtual bool RemoveTrack(rtc::scoped_refptr<AudioTrackInterface> track) { 347*d9f75844SAndroid Build Coastguard Worker RTC_CHECK_NOTREACHED(); 348*d9f75844SAndroid Build Coastguard Worker } RemoveTrack(rtc::scoped_refptr<VideoTrackInterface> track)349*d9f75844SAndroid Build Coastguard Worker virtual bool RemoveTrack(rtc::scoped_refptr<VideoTrackInterface> track) { 350*d9f75844SAndroid Build Coastguard Worker RTC_CHECK_NOTREACHED(); 351*d9f75844SAndroid Build Coastguard Worker } 352*d9f75844SAndroid Build Coastguard Worker // Deprecated: Should use scoped_refptr versions rather than pointers. AddTrack(AudioTrackInterface * track)353*d9f75844SAndroid Build Coastguard Worker [[deprecated("Pass a scoped_refptr")]] virtual bool AddTrack( 354*d9f75844SAndroid Build Coastguard Worker AudioTrackInterface* track) { 355*d9f75844SAndroid Build Coastguard Worker return AddTrack(rtc::scoped_refptr<AudioTrackInterface>(track)); 356*d9f75844SAndroid Build Coastguard Worker } AddTrack(VideoTrackInterface * track)357*d9f75844SAndroid Build Coastguard Worker [[deprecated("Pass a scoped_refptr")]] virtual bool AddTrack( 358*d9f75844SAndroid Build Coastguard Worker VideoTrackInterface* track) { 359*d9f75844SAndroid Build Coastguard Worker return AddTrack(rtc::scoped_refptr<VideoTrackInterface>(track)); 360*d9f75844SAndroid Build Coastguard Worker } RemoveTrack(AudioTrackInterface * track)361*d9f75844SAndroid Build Coastguard Worker [[deprecated("Pass a scoped_refptr")]] virtual bool RemoveTrack( 362*d9f75844SAndroid Build Coastguard Worker AudioTrackInterface* track) { 363*d9f75844SAndroid Build Coastguard Worker return RemoveTrack(rtc::scoped_refptr<AudioTrackInterface>(track)); 364*d9f75844SAndroid Build Coastguard Worker } RemoveTrack(VideoTrackInterface * track)365*d9f75844SAndroid Build Coastguard Worker [[deprecated("Pass a scoped_refptr")]] virtual bool RemoveTrack( 366*d9f75844SAndroid Build Coastguard Worker VideoTrackInterface* track) { 367*d9f75844SAndroid Build Coastguard Worker return RemoveTrack(rtc::scoped_refptr<VideoTrackInterface>(track)); 368*d9f75844SAndroid Build Coastguard Worker } 369*d9f75844SAndroid Build Coastguard Worker 370*d9f75844SAndroid Build Coastguard Worker protected: 371*d9f75844SAndroid Build Coastguard Worker ~MediaStreamInterface() override = default; 372*d9f75844SAndroid Build Coastguard Worker }; 373*d9f75844SAndroid Build Coastguard Worker 374*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 375*d9f75844SAndroid Build Coastguard Worker 376*d9f75844SAndroid Build Coastguard Worker #endif // API_MEDIA_STREAM_INTERFACE_H_ 377