diff --git a/webrtc/pc/peerconnection_integrationtest.cc b/webrtc/pc/peerconnection_integrationtest.cc index ad1a12caf6..e6c3cf1f57 100644 --- a/webrtc/pc/peerconnection_integrationtest.cc +++ b/webrtc/pc/peerconnection_integrationtest.cc @@ -116,6 +116,18 @@ void RemoveSsrcsAndMsids(cricket::SessionDescription* desc) { desc->set_msid_supported(false); } +int FindFirstMediaStatsIndexByKind( + const std::string& kind, + const std::vector& + media_stats_vec) { + for (size_t i = 0; i < media_stats_vec.size(); i++) { + if (media_stats_vec[i]->kind.ValueToString() == kind) { + return i; + } + } + return -1; +} + class SignalingMessageReceiver { public: virtual void ReceiveSdpMessage(const std::string& type, @@ -1926,9 +1938,31 @@ TEST_F(PeerConnectionIntegrationTest, ASSERT_EQ(1U, inbound_stream_stats.size()); ASSERT_TRUE(inbound_stream_stats[0]->bytes_received.is_defined()); ASSERT_GT(*inbound_stream_stats[0]->bytes_received, 0U); - // TODO(deadbeef): Test that track_id is defined. This is not currently - // working since SSRCs are used to match RtpReceivers (and their tracks) with - // received stream stats in TrackMediaInfoMap. + ASSERT_TRUE(inbound_stream_stats[0]->track_id.is_defined()); +} + +// Test that we can successfully get the media related stats (audio level +// etc.) for the unsignaled stream. +TEST_F(PeerConnectionIntegrationTest, + GetMediaStatsForUnsignaledStreamWithNewStatsApi) { + ASSERT_TRUE(CreatePeerConnectionWrappers()); + ConnectFakeSignaling(); + caller()->AddAudioVideoMediaStream(); + // Remove SSRCs and MSIDs from the received offer SDP. + callee()->SetReceivedSdpMunger(RemoveSsrcsAndMsids); + caller()->CreateAndSetAndSignalOffer(); + ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout); + // Wait for one audio frame to be received by the callee. + ExpectNewFramesReceivedWithWait(0, 0, 1, 1, kMaxWaitForFramesMs); + + rtc::scoped_refptr report = + callee()->NewGetStats(); + ASSERT_NE(nullptr, report); + + auto media_stats = report->GetStatsOfType(); + auto audio_index = FindFirstMediaStatsIndexByKind("audio", media_stats); + ASSERT_GE(audio_index, 0); + EXPECT_TRUE(media_stats[audio_index]->audio_level.is_defined()); } // Test that DTLS 1.0 is used if both sides only support DTLS 1.0. diff --git a/webrtc/pc/trackmediainfomap.cc b/webrtc/pc/trackmediainfomap.cc index 33880b9380..b5c5ac6a02 100644 --- a/webrtc/pc/trackmediainfomap.cc +++ b/webrtc/pc/trackmediainfomap.cc @@ -34,7 +34,9 @@ void GetAudioAndVideoTrackBySsrc( std::map* local_audio_track_by_ssrc, std::map* local_video_track_by_ssrc, std::map* remote_audio_track_by_ssrc, - std::map* remote_video_track_by_ssrc) { + std::map* remote_video_track_by_ssrc, + AudioTrackInterface** unsignaled_audio_track, + VideoTrackInterface** unsignaled_video_track) { RTC_DCHECK(local_audio_track_by_ssrc->empty()); RTC_DCHECK(local_video_track_by_ssrc->empty()); RTC_DCHECK(remote_audio_track_by_ssrc->empty()); @@ -80,6 +82,12 @@ void GetAudioAndVideoTrackBySsrc( RtpParameters params = rtp_receiver->GetParameters(); for (const RtpEncodingParameters& encoding : params.encodings) { if (!encoding.ssrc) { + if (media_type == cricket::MEDIA_TYPE_AUDIO) { + *unsignaled_audio_track = static_cast(track); + } else { + RTC_DCHECK(media_type == cricket::MEDIA_TYPE_VIDEO); + *unsignaled_video_track = static_cast(track); + } continue; } if (media_type == cricket::MEDIA_TYPE_AUDIO) { @@ -110,12 +118,13 @@ TrackMediaInfoMap::TrackMediaInfoMap( std::map local_video_track_by_ssrc; std::map remote_audio_track_by_ssrc; std::map remote_video_track_by_ssrc; - GetAudioAndVideoTrackBySsrc(rtp_senders, - rtp_receivers, - &local_audio_track_by_ssrc, - &local_video_track_by_ssrc, - &remote_audio_track_by_ssrc, - &remote_video_track_by_ssrc); + AudioTrackInterface* unsignaled_audio_track = nullptr; + VideoTrackInterface* unsignaled_video_track = nullptr; + GetAudioAndVideoTrackBySsrc( + rtp_senders, rtp_receivers, &local_audio_track_by_ssrc, + &local_video_track_by_ssrc, &remote_audio_track_by_ssrc, + &remote_video_track_by_ssrc, &unsignaled_audio_track, + &unsignaled_video_track); if (voice_media_info_) { for (auto& sender_info : voice_media_info_->senders) { AudioTrackInterface* associated_track = @@ -137,6 +146,9 @@ TrackMediaInfoMap::TrackMediaInfoMap( RTC_DCHECK(voice_info_by_remote_track_.find(associated_track) == voice_info_by_remote_track_.end()); voice_info_by_remote_track_[associated_track] = &receiver_info; + } else if (unsignaled_audio_track) { + audio_track_by_receiver_info_[&receiver_info] = unsignaled_audio_track; + voice_info_by_remote_track_[unsignaled_audio_track] = &receiver_info; } } } @@ -161,6 +173,9 @@ TrackMediaInfoMap::TrackMediaInfoMap( RTC_DCHECK(video_info_by_remote_track_.find(associated_track) == video_info_by_remote_track_.end()); video_info_by_remote_track_[associated_track] = &receiver_info; + } else if (unsignaled_video_track) { + video_track_by_receiver_info_[&receiver_info] = unsignaled_video_track; + video_info_by_remote_track_[unsignaled_video_track] = &receiver_info; } } }