diff --git a/ortc/ortcrtpsenderadapter.cc b/ortc/ortcrtpsenderadapter.cc index 283ec3556e..f2541cb8f8 100644 --- a/ortc/ortcrtpsenderadapter.cc +++ b/ortc/ortcrtpsenderadapter.cc @@ -157,7 +157,7 @@ void OrtcRtpSenderAdapter::CreateInternalSender() { switch (kind_) { case cricket::MEDIA_TYPE_AUDIO: { auto* audio_sender = new AudioRtpSender( - rtp_transport_controller_->worker_thread(), nullptr); + rtp_transport_controller_->worker_thread(), /*id=*/"", nullptr); auto* voice_channel = rtp_transport_controller_->voice_channel(); RTC_DCHECK(voice_channel); audio_sender->SetVoiceMediaChannel(voice_channel->media_channel()); @@ -165,8 +165,8 @@ void OrtcRtpSenderAdapter::CreateInternalSender() { break; } case cricket::MEDIA_TYPE_VIDEO: { - auto* video_sender = - new VideoRtpSender(rtp_transport_controller_->worker_thread()); + auto* video_sender = new VideoRtpSender( + rtp_transport_controller_->worker_thread(), /*id=*/""); auto* video_channel = rtp_transport_controller_->video_channel(); RTC_DCHECK(video_channel); video_sender->SetVideoMediaChannel(video_channel->media_channel()); diff --git a/pc/peerconnection.cc b/pc/peerconnection.cc index f4dcb51fd4..2854020271 100644 --- a/pc/peerconnection.cc +++ b/pc/peerconnection.cc @@ -1204,7 +1204,8 @@ PeerConnection::AddTrackPlanB( (track->kind() == MediaStreamTrackInterface::kAudioKind ? cricket::MEDIA_TYPE_AUDIO : cricket::MEDIA_TYPE_VIDEO); - auto new_sender = CreateSender(media_type, track, adjusted_stream_ids); + auto new_sender = + CreateSender(media_type, track->id(), track, adjusted_stream_ids); if (track->kind() == MediaStreamTrackInterface::kAudioKind) { new_sender->internal()->SetVoiceMediaChannel(voice_media_channel()); GetAudioTransceiver()->internal()->AddSender(new_sender); @@ -1253,7 +1254,7 @@ PeerConnection::AddTrackUnifiedPlan( : cricket::MEDIA_TYPE_VIDEO); RTC_LOG(LS_INFO) << "Adding " << cricket::MediaTypeToString(media_type) << " transceiver in response to a call to AddTrack."; - auto sender = CreateSender(media_type, track, stream_ids); + auto sender = CreateSender(media_type, track->id(), track, stream_ids); auto receiver = CreateReceiver(media_type, rtc::CreateRandomUuid()); transceiver = CreateAndAddTransceiver(sender, receiver); transceiver->internal()->set_created_by_addtrack(true); @@ -1398,7 +1399,9 @@ PeerConnection::AddTransceiver( RTC_LOG(LS_INFO) << "Adding " << cricket::MediaTypeToString(media_type) << " transceiver in response to a call to AddTransceiver."; - auto sender = CreateSender(media_type, track, init.stream_ids); + auto sender = + CreateSender(media_type, (track ? track->id() : rtc::CreateRandomUuid()), + track, init.stream_ids); auto receiver = CreateReceiver(media_type, rtc::CreateRandomUuid()); auto transceiver = CreateAndAddTransceiver(sender, receiver); transceiver->internal()->set_direction(init.direction); @@ -1413,6 +1416,7 @@ PeerConnection::AddTransceiver( rtc::scoped_refptr> PeerConnection::CreateSender( cricket::MediaType media_type, + const std::string& id, rtc::scoped_refptr track, const std::vector& stream_ids) { rtc::scoped_refptr> sender; @@ -1421,21 +1425,19 @@ PeerConnection::CreateSender( (track->kind() == MediaStreamTrackInterface::kAudioKind)); sender = RtpSenderProxyWithInternal::Create( signaling_thread(), - new AudioRtpSender(worker_thread(), - static_cast(track.get()), - stream_ids, stats_.get())); + new AudioRtpSender(worker_thread(), id, stats_.get())); NoteUsageEvent(UsageEvent::AUDIO_ADDED); } else { RTC_DCHECK_EQ(media_type, cricket::MEDIA_TYPE_VIDEO); RTC_DCHECK(!track || (track->kind() == MediaStreamTrackInterface::kVideoKind)); sender = RtpSenderProxyWithInternal::Create( - signaling_thread(), - new VideoRtpSender(worker_thread(), - static_cast(track.get()), - stream_ids)); + signaling_thread(), new VideoRtpSender(worker_thread(), id)); NoteUsageEvent(UsageEvent::VIDEO_ADDED); } + bool set_track_succeeded = sender->SetTrack(track); + RTC_DCHECK(set_track_succeeded); + sender->internal()->set_stream_ids(stream_ids); return sender; } @@ -1504,15 +1506,15 @@ rtc::scoped_refptr PeerConnection::CreateSender( // TODO(steveanton): Move construction of the RtpSenders to RtpTransceiver. rtc::scoped_refptr> new_sender; if (kind == MediaStreamTrackInterface::kAudioKind) { - auto* audio_sender = - new AudioRtpSender(worker_thread(), nullptr, stream_ids, stats_.get()); + auto* audio_sender = new AudioRtpSender( + worker_thread(), rtc::CreateRandomUuid(), stats_.get()); audio_sender->SetVoiceMediaChannel(voice_media_channel()); new_sender = RtpSenderProxyWithInternal::Create( signaling_thread(), audio_sender); GetAudioTransceiver()->internal()->AddSender(new_sender); } else if (kind == MediaStreamTrackInterface::kVideoKind) { auto* video_sender = - new VideoRtpSender(worker_thread(), nullptr, stream_ids); + new VideoRtpSender(worker_thread(), rtc::CreateRandomUuid()); video_sender->SetVideoMediaChannel(video_media_channel()); new_sender = RtpSenderProxyWithInternal::Create( signaling_thread(), video_sender); @@ -1521,6 +1523,7 @@ rtc::scoped_refptr PeerConnection::CreateSender( RTC_LOG(LS_ERROR) << "CreateSender called with invalid kind: " << kind; return nullptr; } + new_sender->internal()->set_stream_ids(stream_ids); return new_sender; } @@ -2735,8 +2738,10 @@ PeerConnection::AssociateTransceiver(cricket::ContentSource source, << " transceiver for MID=" << content.name << " at i=" << mline_index << " in response to the remote description."; + std::string sender_id = rtc::CreateRandomUuid(); + std::vector stream_ids = {rtc::CreateRandomUuid()}; auto sender = - CreateSender(media_desc->type(), nullptr, {rtc::CreateRandomUuid()}); + CreateSender(media_desc->type(), sender_id, nullptr, stream_ids); std::string receiver_id; if (!media_desc->streams().empty()) { receiver_id = media_desc->streams()[0].id; @@ -3392,6 +3397,8 @@ rtc::scoped_refptr PeerConnection::RemoveAndStopReceiver( void PeerConnection::AddAudioTrack(AudioTrackInterface* track, MediaStreamInterface* stream) { RTC_DCHECK(!IsClosed()); + RTC_DCHECK(track); + RTC_DCHECK(stream); auto sender = FindSenderForTrack(track); if (sender) { // We already have a sender for this track, so just change the stream_id @@ -3401,8 +3408,8 @@ void PeerConnection::AddAudioTrack(AudioTrackInterface* track, } // Normal case; we've never seen this track before. - auto new_sender = - CreateSender(cricket::MEDIA_TYPE_AUDIO, track, {stream->id()}); + auto new_sender = CreateSender(cricket::MEDIA_TYPE_AUDIO, track->id(), track, + {stream->id()}); new_sender->internal()->SetVoiceMediaChannel(voice_media_channel()); GetAudioTransceiver()->internal()->AddSender(new_sender); // If the sender has already been configured in SDP, we call SetSsrc, @@ -3435,6 +3442,8 @@ void PeerConnection::RemoveAudioTrack(AudioTrackInterface* track, void PeerConnection::AddVideoTrack(VideoTrackInterface* track, MediaStreamInterface* stream) { RTC_DCHECK(!IsClosed()); + RTC_DCHECK(track); + RTC_DCHECK(stream); auto sender = FindSenderForTrack(track); if (sender) { // We already have a sender for this track, so just change the stream_id @@ -3444,8 +3453,8 @@ void PeerConnection::AddVideoTrack(VideoTrackInterface* track, } // Normal case; we've never seen this track before. - auto new_sender = - CreateSender(cricket::MEDIA_TYPE_VIDEO, track, {stream->id()}); + auto new_sender = CreateSender(cricket::MEDIA_TYPE_VIDEO, track->id(), track, + {stream->id()}); new_sender->internal()->SetVideoMediaChannel(video_media_channel()); GetVideoTransceiver()->internal()->AddSender(new_sender); const RtpSenderInfo* sender_info = diff --git a/pc/peerconnection.h b/pc/peerconnection.h index 8901848d9b..4ea3540bf1 100644 --- a/pc/peerconnection.h +++ b/pc/peerconnection.h @@ -364,6 +364,7 @@ class PeerConnection : public PeerConnectionInternal, rtc::scoped_refptr> CreateSender(cricket::MediaType media_type, + const std::string& id, rtc::scoped_refptr track, const std::vector& stream_ids); diff --git a/pc/rtpsender.cc b/pc/rtpsender.cc index 13e0e1d7c8..927379d588 100644 --- a/pc/rtpsender.cc +++ b/pc/rtpsender.cc @@ -114,30 +114,16 @@ void LocalAudioSinkAdapter::SetSink(cricket::AudioSource::Sink* sink) { } AudioRtpSender::AudioRtpSender(rtc::Thread* worker_thread, - StatsCollector* stats) - : AudioRtpSender(worker_thread, nullptr, {rtc::CreateRandomUuid()}, stats) { -} - -AudioRtpSender::AudioRtpSender(rtc::Thread* worker_thread, - rtc::scoped_refptr track, - const std::vector& stream_ids, + const std::string& id, StatsCollector* stats) : worker_thread_(worker_thread), - id_(track ? track->id() : rtc::CreateRandomUuid()), - stream_ids_(stream_ids), + id_(id), stats_(stats), - track_(track), dtmf_sender_proxy_(DtmfSenderProxy::Create( rtc::Thread::Current(), DtmfSender::Create(rtc::Thread::Current(), this))), - cached_track_enabled_(track ? track->enabled() : false), - sink_adapter_(new LocalAudioSinkAdapter()), - attachment_id_(track ? GenerateUniqueId() : 0) { + sink_adapter_(new LocalAudioSinkAdapter()) { RTC_DCHECK(worker_thread); - if (track_) { - track_->RegisterObserver(this); - track_->AddSink(sink_adapter_.get()); - } } AudioRtpSender::~AudioRtpSender() { @@ -238,7 +224,7 @@ bool AudioRtpSender::SetTrack(MediaStreamTrackInterface* track) { } else if (prev_can_send_track) { ClearAudioSend(); } - attachment_id_ = GenerateUniqueId(); + attachment_id_ = (track_ ? GenerateUniqueId() : 0); return true; } @@ -377,24 +363,10 @@ void AudioRtpSender::ClearAudioSend() { } } -VideoRtpSender::VideoRtpSender(rtc::Thread* worker_thread) - : VideoRtpSender(worker_thread, nullptr, {rtc::CreateRandomUuid()}) {} - VideoRtpSender::VideoRtpSender(rtc::Thread* worker_thread, - rtc::scoped_refptr track, - const std::vector& stream_ids) - : worker_thread_(worker_thread), - id_(track ? track->id() : rtc::CreateRandomUuid()), - stream_ids_(stream_ids), - track_(track), - cached_track_content_hint_(track - ? track->content_hint() - : VideoTrackInterface::ContentHint::kNone), - attachment_id_(track ? GenerateUniqueId() : 0) { + const std::string& id) + : worker_thread_(worker_thread), id_(id) { RTC_DCHECK(worker_thread); - if (track_) { - track_->RegisterObserver(this); - } } VideoRtpSender::~VideoRtpSender() { @@ -447,7 +419,7 @@ bool VideoRtpSender::SetTrack(MediaStreamTrackInterface* track) { } else if (prev_can_send_track) { ClearVideoSend(); } - attachment_id_ = GenerateUniqueId(); + attachment_id_ = (track_ ? GenerateUniqueId() : 0); return true; } diff --git a/pc/rtpsender.h b/pc/rtpsender.h index d1d278b4e8..983bb20ae0 100644 --- a/pc/rtpsender.h +++ b/pc/rtpsender.h @@ -90,15 +90,10 @@ class AudioRtpSender : public DtmfProviderInterface, // StatsCollector provided so that Add/RemoveLocalAudioTrack can be called // at the appropriate times. - // Construct an AudioRtpSender with a null track, a single, randomly generated - // stream id, and a randomly generated ID. - AudioRtpSender(rtc::Thread* worker_thread, StatsCollector* stats); - - // Construct an AudioRtpSender with the given track and stream ids. The - // sender ID will be set to the track's ID. + // Construct an RtpSender for audio with the given sender ID. + // The sender is initialized with no track to send and no associated streams. AudioRtpSender(rtc::Thread* worker_thread, - rtc::scoped_refptr track, - const std::vector& stream_ids, + const std::string& id, StatsCollector* stats); virtual ~AudioRtpSender(); @@ -168,7 +163,7 @@ class AudioRtpSender : public DtmfProviderInterface, const std::string id_; std::vector stream_ids_; cricket::VoiceMediaChannel* media_channel_ = nullptr; - StatsCollector* stats_; + StatsCollector* stats_ = nullptr; rtc::scoped_refptr track_; rtc::scoped_refptr dtmf_sender_proxy_; absl::optional last_transaction_id_; @@ -185,15 +180,9 @@ class AudioRtpSender : public DtmfProviderInterface, class VideoRtpSender : public ObserverInterface, public rtc::RefCountedObject { public: - // Construct a VideoRtpSender with a null track, a single, randomly generated - // stream id, and a randomly generated ID. - explicit VideoRtpSender(rtc::Thread* worker_thread); - - // Construct a VideoRtpSender with the given track and stream ids. The - // sender ID will be set to the track's ID. - VideoRtpSender(rtc::Thread* worker_thread, - rtc::scoped_refptr track, - const std::vector& stream_ids); + // Construct an RtpSender for video with the given sender ID. + // The sender is initialized with no track to send and no associated streams. + VideoRtpSender(rtc::Thread* worker_thread, const std::string& id); virtual ~VideoRtpSender(); diff --git a/pc/rtpsenderreceiver_unittest.cc b/pc/rtpsenderreceiver_unittest.cc index 985fa06c7e..5795ba76b0 100644 --- a/pc/rtpsenderreceiver_unittest.cc +++ b/pc/rtpsenderreceiver_unittest.cc @@ -147,8 +147,9 @@ class RtpSenderReceiverTest : public testing::Test, audio_track_ = AudioTrack::Create(kAudioTrackId, source); EXPECT_TRUE(local_stream_->AddTrack(audio_track_)); audio_rtp_sender_ = - new AudioRtpSender(worker_thread_, local_stream_->GetAudioTracks()[0], - {local_stream_->id()}, nullptr); + new AudioRtpSender(worker_thread_, audio_track_->id(), nullptr); + ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_)); + audio_rtp_sender_->set_stream_ids({local_stream_->id()}); audio_rtp_sender_->SetVoiceMediaChannel(voice_media_channel_); audio_rtp_sender_->SetSsrc(kAudioSsrc); audio_rtp_sender_->GetOnDestroyedSignal()->connect( @@ -157,7 +158,7 @@ class RtpSenderReceiverTest : public testing::Test, } void CreateAudioRtpSenderWithNoTrack() { - audio_rtp_sender_ = new AudioRtpSender(worker_thread_, nullptr); + audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr); audio_rtp_sender_->SetVoiceMediaChannel(voice_media_channel_); } @@ -171,16 +172,16 @@ class RtpSenderReceiverTest : public testing::Test, void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) { AddVideoTrack(is_screencast); - video_rtp_sender_ = - new VideoRtpSender(worker_thread_, local_stream_->GetVideoTracks()[0], - {local_stream_->id()}); + video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id()); + ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_)); + video_rtp_sender_->set_stream_ids({local_stream_->id()}); video_rtp_sender_->SetVideoMediaChannel(video_media_channel_); video_rtp_sender_->SetSsrc(ssrc); VerifyVideoChannelInput(ssrc); } void CreateVideoRtpSenderWithNoTrack() { - video_rtp_sender_ = new VideoRtpSender(worker_thread_); + video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/""); video_rtp_sender_->SetVideoMediaChannel(video_media_channel_); } @@ -1128,9 +1129,9 @@ TEST_F(RtpSenderReceiverTest, // Setting detailed overrides the default non-screencast mode. This should be // applied even if the track is set on construction. video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed); - video_rtp_sender_ = - new VideoRtpSender(worker_thread_, local_stream_->GetVideoTracks()[0], - {local_stream_->id()}); + video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id()); + ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_)); + video_rtp_sender_->set_stream_ids({local_stream_->id()}); video_rtp_sender_->SetVideoMediaChannel(video_media_channel_); video_track_->set_enabled(true);