1 /* 2 * Copyright 2019 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef PC_AUDIO_RTP_RECEIVER_H_ 12 #define PC_AUDIO_RTP_RECEIVER_H_ 13 14 #include <stdint.h> 15 16 #include <string> 17 #include <vector> 18 19 #include "absl/types/optional.h" 20 #include "api/crypto/frame_decryptor_interface.h" 21 #include "api/media_stream_interface.h" 22 #include "api/media_types.h" 23 #include "api/rtp_parameters.h" 24 #include "api/scoped_refptr.h" 25 #include "media/base/media_channel.h" 26 #include "pc/jitter_buffer_delay_interface.h" 27 #include "pc/remote_audio_source.h" 28 #include "pc/rtp_receiver.h" 29 #include "rtc_base/ref_counted_object.h" 30 #include "rtc_base/thread.h" 31 32 namespace webrtc { 33 34 class AudioRtpReceiver : public ObserverInterface, 35 public AudioSourceInterface::AudioObserver, 36 public rtc::RefCountedObject<RtpReceiverInternal> { 37 public: 38 AudioRtpReceiver(rtc::Thread* worker_thread, 39 std::string receiver_id, 40 std::vector<std::string> stream_ids); 41 // TODO(https://crbug.com/webrtc/9480): Remove this when streams() is removed. 42 AudioRtpReceiver( 43 rtc::Thread* worker_thread, 44 const std::string& receiver_id, 45 const std::vector<rtc::scoped_refptr<MediaStreamInterface>>& streams); 46 virtual ~AudioRtpReceiver(); 47 48 // ObserverInterface implementation 49 void OnChanged() override; 50 51 // AudioSourceInterface::AudioObserver implementation 52 void OnSetVolume(double volume) override; 53 audio_track()54 rtc::scoped_refptr<AudioTrackInterface> audio_track() const { 55 return track_.get(); 56 } 57 58 // RtpReceiverInterface implementation track()59 rtc::scoped_refptr<MediaStreamTrackInterface> track() const override { 60 return track_.get(); 61 } dtls_transport()62 rtc::scoped_refptr<DtlsTransportInterface> dtls_transport() const override { 63 return dtls_transport_; 64 } 65 std::vector<std::string> stream_ids() const override; streams()66 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams() 67 const override { 68 return streams_; 69 } 70 media_type()71 cricket::MediaType media_type() const override { 72 return cricket::MEDIA_TYPE_AUDIO; 73 } 74 id()75 std::string id() const override { return id_; } 76 77 RtpParameters GetParameters() const override; 78 79 void SetFrameDecryptor( 80 rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor) override; 81 82 rtc::scoped_refptr<FrameDecryptorInterface> GetFrameDecryptor() 83 const override; 84 85 // RtpReceiverInternal implementation. 86 void Stop() override; 87 void SetupMediaChannel(uint32_t ssrc) override; 88 void SetupUnsignaledMediaChannel() override; ssrc()89 uint32_t ssrc() const override { return ssrc_.value_or(0); } 90 void NotifyFirstPacketReceived() override; 91 void set_stream_ids(std::vector<std::string> stream_ids) override; set_transport(rtc::scoped_refptr<DtlsTransportInterface> dtls_transport)92 void set_transport( 93 rtc::scoped_refptr<DtlsTransportInterface> dtls_transport) override { 94 dtls_transport_ = dtls_transport; 95 } 96 void SetStreams(const std::vector<rtc::scoped_refptr<MediaStreamInterface>>& 97 streams) override; 98 void SetObserver(RtpReceiverObserverInterface* observer) override; 99 100 void SetJitterBufferMinimumDelay( 101 absl::optional<double> delay_seconds) override; 102 103 void SetMediaChannel(cricket::MediaChannel* media_channel) override; 104 105 std::vector<RtpSource> GetSources() const override; AttachmentId()106 int AttachmentId() const override { return attachment_id_; } 107 void SetDepacketizerToDecoderFrameTransformer( 108 rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer) 109 override; 110 111 private: 112 void RestartMediaChannel(absl::optional<uint32_t> ssrc); 113 void Reconfigure(); 114 bool SetOutputVolume(double volume); 115 116 rtc::Thread* const worker_thread_; 117 const std::string id_; 118 const rtc::scoped_refptr<RemoteAudioSource> source_; 119 const rtc::scoped_refptr<AudioTrackInterface> track_; 120 cricket::VoiceMediaChannel* media_channel_ = nullptr; 121 absl::optional<uint32_t> ssrc_; 122 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams_; 123 bool cached_track_enabled_; 124 double cached_volume_ = 1; 125 bool stopped_ = true; 126 RtpReceiverObserverInterface* observer_ = nullptr; 127 bool received_first_packet_ = false; 128 int attachment_id_ = 0; 129 rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor_; 130 rtc::scoped_refptr<DtlsTransportInterface> dtls_transport_; 131 // Allows to thread safely change playout delay. Handles caching cases if 132 // |SetJitterBufferMinimumDelay| is called before start. 133 rtc::scoped_refptr<JitterBufferDelayInterface> delay_; 134 rtc::scoped_refptr<FrameTransformerInterface> frame_transformer_ 135 RTC_GUARDED_BY(worker_thread_); 136 }; 137 138 } // namespace webrtc 139 140 #endif // PC_AUDIO_RTP_RECEIVER_H_ 141