diff --git a/api/rtptransceiverinterface.h b/api/rtptransceiverinterface.h index 5d74ae1023..410679340d 100644 --- a/api/rtptransceiverinterface.h +++ b/api/rtptransceiverinterface.h @@ -63,6 +63,10 @@ struct RtpTransceiverInit final { // https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver class RtpTransceiverInterface : public rtc::RefCountInterface { public: + // Media type of the transceiver. Any sender(s)/receiver(s) will have this + // type as well. + virtual cricket::MediaType media_type() const = 0; + // The mid attribute is the mid negotiated and present in the local and // remote descriptions. Before negotiation is complete, the mid value may be // null. After rollbacks, the value may change from a non-null value to null. diff --git a/pc/peerconnection.cc b/pc/peerconnection.cc index 4ec26fa3a6..e565e572a7 100644 --- a/pc/peerconnection.cc +++ b/pc/peerconnection.cc @@ -774,12 +774,12 @@ void PeerConnection::DestroyAllChannels() { // Destroy video channels first since they may have a pointer to a voice // channel. for (auto transceiver : transceivers_) { - if (transceiver->internal()->media_type() == cricket::MEDIA_TYPE_VIDEO) { + if (transceiver->media_type() == cricket::MEDIA_TYPE_VIDEO) { DestroyTransceiverChannel(transceiver); } } for (auto transceiver : transceivers_) { - if (transceiver->internal()->media_type() == cricket::MEDIA_TYPE_AUDIO) { + if (transceiver->media_type() == cricket::MEDIA_TYPE_AUDIO) { DestroyTransceiverChannel(transceiver); } } @@ -1148,7 +1148,7 @@ PeerConnection::FindFirstTransceiverForAddedTrack( RTC_DCHECK(track); for (auto transceiver : transceivers_) { if (!transceiver->sender()->track() && - cricket::MediaTypeToString(transceiver->internal()->media_type()) == + cricket::MediaTypeToString(transceiver->media_type()) == track->kind() && !transceiver->internal()->has_ever_been_used_to_send()) { return transceiver; @@ -1640,8 +1640,7 @@ PeerConnection::GetReceivingTransceiversOfType(cricket::MediaType media_type) { rtc::scoped_refptr>> receiving_transceivers; for (auto transceiver : transceivers_) { - if (!transceiver->stopped() && - transceiver->internal()->media_type() == media_type && + if (!transceiver->stopped() && transceiver->media_type() == media_type && RtpTransceiverDirectionHasRecv(transceiver->direction())) { receiving_transceivers.push_back(transceiver); } @@ -2318,13 +2317,12 @@ RTCError PeerConnection::UpdateTransceiverChannel( } } else { if (!channel) { - if (transceiver->internal()->media_type() == cricket::MEDIA_TYPE_AUDIO) { + if (transceiver->media_type() == cricket::MEDIA_TYPE_AUDIO) { channel = CreateVoiceChannel( content.name, GetTransportNameForMediaSection(content.name, bundle_group)); } else { - RTC_DCHECK_EQ(cricket::MEDIA_TYPE_VIDEO, - transceiver->internal()->media_type()); + RTC_DCHECK_EQ(cricket::MEDIA_TYPE_VIDEO, transceiver->media_type()); channel = CreateVideoChannel( content.name, GetTransportNameForMediaSection(content.name, bundle_group)); @@ -2425,7 +2423,7 @@ PeerConnection::AssociateTransceiver(cricket::ContentSource source, } } RTC_DCHECK(transceiver); - if (transceiver->internal()->media_type() != media_desc->type()) { + if (transceiver->media_type() != media_desc->type()) { LOG_AND_RETURN_ERROR( RTCErrorType::INVALID_PARAMETER, "Transceiver type does not match media description type."); @@ -2471,7 +2469,7 @@ PeerConnection::FindAvailableTransceiverToReceive( // associated with any m= section and are not stopped, find the first such // RtpTransceiver. for (auto transceiver : transceivers_) { - if (transceiver->internal()->media_type() == media_type && + if (transceiver->media_type() == media_type && transceiver->internal()->created_by_addtrack() && !transceiver->mid() && !transceiver->stopped()) { return transceiver; @@ -2497,7 +2495,7 @@ const cricket::ContentInfo* PeerConnection::FindMediaSectionForTransceiver( // Plan B only allows at most one audio and one video section, so use the // first media section of that type. return cricket::GetFirstMediaContent(sdesc->description()->contents(), - transceiver->internal()->media_type()); + transceiver->media_type()); } } @@ -3318,7 +3316,7 @@ GetMediaDescriptionOptionsForTransceiver( transceiver, const std::string& mid) { cricket::MediaDescriptionOptions media_description_options( - transceiver->internal()->media_type(), mid, transceiver->direction(), + transceiver->media_type(), mid, transceiver->direction(), transceiver->stopped()); // This behavior is specified in JSEP. The gist is that: // 1. The MSID is included if the RtpTransceiver's direction is sendonly or @@ -3383,10 +3381,9 @@ void PeerConnection::GetOptionsForUnifiedPlanOffer( // rejected in either the local or remote description. if (had_been_rejected) { session_options->media_description_options.push_back( - cricket::MediaDescriptionOptions( - transceiver->internal()->media_type(), mid, - RtpTransceiverDirection::kInactive, - /*stopped=*/true)); + cricket::MediaDescriptionOptions(transceiver->media_type(), mid, + RtpTransceiverDirection::kInactive, + /*stopped=*/true)); recycleable_mline_indices.push(i); } else { session_options->media_description_options.push_back( @@ -4083,7 +4080,7 @@ PeerConnection::GetAudioTransceiver() const { // audio/video transceiver. RTC_DCHECK(!IsUnifiedPlan()); for (auto transceiver : transceivers_) { - if (transceiver->internal()->media_type() == cricket::MEDIA_TYPE_AUDIO) { + if (transceiver->media_type() == cricket::MEDIA_TYPE_AUDIO) { return transceiver; } } @@ -4097,7 +4094,7 @@ PeerConnection::GetVideoTransceiver() const { // audio/video transceiver. RTC_DCHECK(!IsUnifiedPlan()); for (auto transceiver : transceivers_) { - if (transceiver->internal()->media_type() == cricket::MEDIA_TYPE_VIDEO) { + if (transceiver->media_type() == cricket::MEDIA_TYPE_VIDEO) { return transceiver; } } @@ -5603,7 +5600,7 @@ void PeerConnection::ReportTransportStats() { const std::string& transport_name = transceiver->internal()->channel()->transport_name(); media_types_by_transport_name[transport_name].insert( - transceiver->internal()->media_type()); + transceiver->media_type()); } } if (rtp_data_channel()) { diff --git a/pc/peerconnection_bundle_unittest.cc b/pc/peerconnection_bundle_unittest.cc index a6dccd7b64..116a598079 100644 --- a/pc/peerconnection_bundle_unittest.cc +++ b/pc/peerconnection_bundle_unittest.cc @@ -79,7 +79,7 @@ class PeerConnectionWrapperForBundleTest : public PeerConnectionWrapper { auto transceivers = GetInternalPeerConnection()->GetTransceiversForTesting(); for (auto transceiver : transceivers) { - if (transceiver->internal()->media_type() == cricket::MEDIA_TYPE_AUDIO) { + if (transceiver->media_type() == cricket::MEDIA_TYPE_AUDIO) { return static_cast( transceiver->internal()->channel()); } @@ -99,7 +99,7 @@ class PeerConnectionWrapperForBundleTest : public PeerConnectionWrapper { auto transceivers = GetInternalPeerConnection()->GetTransceiversForTesting(); for (auto transceiver : transceivers) { - if (transceiver->internal()->media_type() == cricket::MEDIA_TYPE_VIDEO) { + if (transceiver->media_type() == cricket::MEDIA_TYPE_VIDEO) { return static_cast( transceiver->internal()->channel()); } diff --git a/pc/peerconnection_ice_unittest.cc b/pc/peerconnection_ice_unittest.cc index 6f6bd73871..c1d7551321 100644 --- a/pc/peerconnection_ice_unittest.cc +++ b/pc/peerconnection_ice_unittest.cc @@ -197,7 +197,7 @@ class PeerConnectionIceBaseTest : public ::testing::Test { pc_wrapper_ptr->pc()); PeerConnection* pc = static_cast(pc_proxy->internal()); for (auto transceiver : pc->GetTransceiversForTesting()) { - if (transceiver->internal()->media_type() == cricket::MEDIA_TYPE_AUDIO) { + if (transceiver->media_type() == cricket::MEDIA_TYPE_AUDIO) { cricket::BaseChannel* channel = transceiver->internal()->channel(); if (channel) { return channel->rtp_dtls_transport()->ice_transport()->GetIceRole(); diff --git a/pc/peerconnection_jsep_unittest.cc b/pc/peerconnection_jsep_unittest.cc index 737b0c96f7..ae51c9e565 100644 --- a/pc/peerconnection_jsep_unittest.cc +++ b/pc/peerconnection_jsep_unittest.cc @@ -257,12 +257,10 @@ TEST_F(PeerConnectionJsepTest, SetRemoteOfferCreatesTransceivers) { auto transceivers = callee->pc()->GetTransceivers(); ASSERT_EQ(2u, transceivers.size()); - EXPECT_EQ(cricket::MEDIA_TYPE_AUDIO, - transceivers[0]->receiver()->media_type()); + EXPECT_EQ(cricket::MEDIA_TYPE_AUDIO, transceivers[0]->media_type()); EXPECT_EQ(caller_audio->mid(), transceivers[0]->mid()); EXPECT_EQ(RtpTransceiverDirection::kRecvOnly, transceivers[0]->direction()); - EXPECT_EQ(cricket::MEDIA_TYPE_VIDEO, - transceivers[1]->receiver()->media_type()); + EXPECT_EQ(cricket::MEDIA_TYPE_VIDEO, transceivers[1]->media_type()); EXPECT_EQ(caller_video->mid(), transceivers[1]->mid()); EXPECT_EQ(RtpTransceiverDirection::kRecvOnly, transceivers[1]->direction()); } @@ -645,9 +643,9 @@ TEST_P(RecycleMediaSectionTest, VerifyOfferAnswerAndTransceivers) { auto callee_transceivers = callee->pc()->GetTransceivers(); ASSERT_EQ(2u, callee_transceivers.size()); EXPECT_EQ(rtc::nullopt, callee_transceivers[0]->mid()); - EXPECT_EQ(first_type_, callee_transceivers[0]->receiver()->media_type()); + EXPECT_EQ(first_type_, callee_transceivers[0]->media_type()); EXPECT_EQ(second_mid, callee_transceivers[1]->mid()); - EXPECT_EQ(second_type_, callee_transceivers[1]->receiver()->media_type()); + EXPECT_EQ(second_type_, callee_transceivers[1]->media_type()); // The answer should have only one media section for the new transceiver. auto answer = callee->CreateAnswer(); diff --git a/pc/peerconnection_rtp_unittest.cc b/pc/peerconnection_rtp_unittest.cc index f19388fe4b..023ce9222e 100644 --- a/pc/peerconnection_rtp_unittest.cc +++ b/pc/peerconnection_rtp_unittest.cc @@ -462,6 +462,7 @@ TEST_F(PeerConnectionRtpTest, auto caller = CreatePeerConnectionWithUnifiedPlan(); auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO); + EXPECT_EQ(cricket::MEDIA_TYPE_AUDIO, transceiver->media_type()); ASSERT_TRUE(transceiver->sender()); EXPECT_EQ(cricket::MEDIA_TYPE_AUDIO, transceiver->sender()->media_type()); @@ -482,6 +483,7 @@ TEST_F(PeerConnectionRtpTest, auto caller = CreatePeerConnectionWithUnifiedPlan(); auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_VIDEO); + EXPECT_EQ(cricket::MEDIA_TYPE_VIDEO, transceiver->media_type()); ASSERT_TRUE(transceiver->sender()); EXPECT_EQ(cricket::MEDIA_TYPE_VIDEO, transceiver->sender()->media_type()); diff --git a/pc/rtptransceiver.cc b/pc/rtptransceiver.cc index ecb8ec879f..310c4c49ad 100644 --- a/pc/rtptransceiver.cc +++ b/pc/rtptransceiver.cc @@ -94,7 +94,7 @@ void RtpTransceiver::AddSender( rtc::scoped_refptr> sender) { RTC_DCHECK(!unified_plan_); RTC_DCHECK(sender); - RTC_DCHECK_EQ(media_type(), sender->internal()->media_type()); + RTC_DCHECK_EQ(media_type(), sender->media_type()); RTC_DCHECK(std::find(senders_.begin(), senders_.end(), sender) == senders_.end()); senders_.push_back(sender); @@ -119,7 +119,7 @@ void RtpTransceiver::AddReceiver( receiver) { RTC_DCHECK(!unified_plan_); RTC_DCHECK(receiver); - RTC_DCHECK_EQ(media_type(), receiver->internal()->media_type()); + RTC_DCHECK_EQ(media_type(), receiver->media_type()); RTC_DCHECK(std::find(receivers_.begin(), receivers_.end(), receiver) == receivers_.end()); receivers_.push_back(receiver); @@ -152,6 +152,10 @@ rtc::scoped_refptr RtpTransceiver::receiver_internal() return receivers_[0]->internal(); } +cricket::MediaType RtpTransceiver::media_type() const { + return media_type_; +} + rtc::Optional RtpTransceiver::mid() const { return mid_; } diff --git a/pc/rtptransceiver.h b/pc/rtptransceiver.h index 40ab2f021e..e44b4aeaef 100644 --- a/pc/rtptransceiver.h +++ b/pc/rtptransceiver.h @@ -68,8 +68,6 @@ class RtpTransceiver final receiver); ~RtpTransceiver() override; - cricket::MediaType media_type() const { return media_type_; } - // Returns the Voice/VideoChannel set for this transceiver. May be null if // the transceiver is not in the currently set local/remote description. cricket::BaseChannel* channel() const { return channel_; } @@ -157,6 +155,7 @@ class RtpTransceiver final } // RtpTransceiverInterface implementation. + cricket::MediaType media_type() const override; rtc::Optional mid() const override; rtc::scoped_refptr sender() const override; rtc::scoped_refptr receiver() const override; @@ -191,6 +190,7 @@ class RtpTransceiver final BEGIN_SIGNALING_PROXY_MAP(RtpTransceiver) PROXY_SIGNALING_THREAD_DESTRUCTOR() +PROXY_CONSTMETHOD0(cricket::MediaType, media_type); PROXY_CONSTMETHOD0(rtc::Optional, mid); PROXY_CONSTMETHOD0(rtc::scoped_refptr, sender); PROXY_CONSTMETHOD0(rtc::scoped_refptr, receiver);