Commit af5c23c7 authored by Henrik Boström's avatar Henrik Boström Committed by Commit Bot

MediaStreamTrackMetrics simplified to observe tracks, not streams.

Prior to this CL, MediaStreamTrackMetrics hooked up to streams, tracking
not only all of the streams' tracks (CONNECTED/DISCONNECTED) but also
any tracks that might be added or removed from the stream.

This has not been necessary to do for a long time, since the RTP Media
APIs are track-based, not stream-based, and the legacy
addStream()-streams are shimmed on top of addTrack(). Adding a track to
such a stream causes addTrack(), and there is no need for the
MediaStreamTrackMetrics class to observe the streams.

With this CL, MediaStreamTrackMetrics only care about tracks (direction,
kind and id). This also covers the Unified Plan use case of tracks not
necessarily belonging to any stream.

There is room for improvements in this area, such as counting tracks
added through replaceTrack(), but that should be handled separately.
This CL removes the dependency on streams which unblocks
RTCRtpTransceiver/Unified Plan work.

Bug: 810708, 777617
Change-Id: I347e729560717be83b7b1a3571f25a8497d65e46
Reviewed-on: https://chromium-review.googlesource.com/1117691Reviewed-by: default avatarHarald Alvestrand <hta@chromium.org>
Commit-Queue: Henrik Boström <hbos@chromium.org>
Cr-Commit-Position: refs/heads/master@{#572521}
parent d769acbd
...@@ -15,10 +15,6 @@ ...@@ -15,10 +15,6 @@
#include "content/common/media/media_stream.mojom.h" #include "content/common/media/media_stream.mojom.h"
#include "third_party/webrtc/api/peerconnectioninterface.h" #include "third_party/webrtc/api/peerconnectioninterface.h"
namespace webrtc {
class MediaStreamInterface;
}
namespace content { namespace content {
class MediaStreamTrackMetricsObserver; class MediaStreamTrackMetricsObserver;
...@@ -36,19 +32,16 @@ class CONTENT_EXPORT MediaStreamTrackMetrics { ...@@ -36,19 +32,16 @@ class CONTENT_EXPORT MediaStreamTrackMetrics {
explicit MediaStreamTrackMetrics(); explicit MediaStreamTrackMetrics();
~MediaStreamTrackMetrics(); ~MediaStreamTrackMetrics();
enum StreamType { SENT_STREAM, RECEIVED_STREAM }; enum class Direction { kSend, kReceive };
enum class Kind { kAudio, kVideo };
enum TrackType { AUDIO_TRACK, VIDEO_TRACK }; enum class LifetimeEvent { kConnected, kDisconnected };
enum LifetimeEvent { CONNECTED, DISCONNECTED };
// Starts tracking lifetimes of all the tracks in |stream| and any // Starts tracking the lifetime of the track until |RemoveTrack| is called
// tracks added or removed to/from the stream until |RemoveStream| // or this object's lifetime ends.
// is called or this object's lifetime ends. void AddTrack(Direction direction, Kind kind, const std::string& track_id);
void AddStream(StreamType type, webrtc::MediaStreamInterface* stream);
// Stops tracking lifetimes of tracks in |stream|. // Stops tracking the lifetime of the track.
void RemoveStream(StreamType type, webrtc::MediaStreamInterface* stream); void RemoveTrack(Direction direction, Kind kind, const std::string& track_id);
// Called to indicate changes in the ICE connection state for the // Called to indicate changes in the ICE connection state for the
// PeerConnection this object is associated with. Used to generate // PeerConnection this object is associated with. Used to generate
...@@ -71,9 +64,9 @@ class CONTENT_EXPORT MediaStreamTrackMetrics { ...@@ -71,9 +64,9 @@ class CONTENT_EXPORT MediaStreamTrackMetrics {
// PeerConnection), false for local streams (sent over a // PeerConnection), false for local streams (sent over a
// PeerConnection). // PeerConnection).
virtual void SendLifetimeMessage(const std::string& track_id, virtual void SendLifetimeMessage(const std::string& track_id,
TrackType track_type, Kind kind,
LifetimeEvent lifetime_event, LifetimeEvent lifetime_event,
StreamType stream_type); Direction direction);
protected: protected:
// Calls SendLifetimeMessage for |observer| depending on |ice_state_|. // Calls SendLifetimeMessage for |observer| depending on |ice_state_|.
...@@ -86,12 +79,12 @@ class CONTENT_EXPORT MediaStreamTrackMetrics { ...@@ -86,12 +79,12 @@ class CONTENT_EXPORT MediaStreamTrackMetrics {
// is a one-to-one relationship). // is a one-to-one relationship).
uint64_t MakeUniqueIdImpl(uint64_t pc_id, uint64_t MakeUniqueIdImpl(uint64_t pc_id,
const std::string& track, const std::string& track,
StreamType stream_type); Direction direction);
private: private:
// Make a unique ID for the given track, that is valid while the // Make a unique ID for the given track, that is valid while the
// track object and the PeerConnection it is attached to both exist. // track object and the PeerConnection it is attached to both exist.
uint64_t MakeUniqueId(const std::string& track, StreamType stream_type); uint64_t MakeUniqueId(const std::string& track_id, Direction direction);
mojom::MediaStreamTrackMetricsHostPtr& GetMediaStreamTrackMetricsHost(); mojom::MediaStreamTrackMetricsHostPtr& GetMediaStreamTrackMetricsHost();
......
...@@ -893,6 +893,13 @@ SdpSemanticRequested GetSdpSemanticRequested( ...@@ -893,6 +893,13 @@ SdpSemanticRequested GetSdpSemanticRequested(
return kSdpSemanticRequestedDefault; return kSdpSemanticRequestedDefault;
} }
MediaStreamTrackMetrics::Kind MediaStreamTrackMetricsKind(
const blink::WebMediaStreamTrack& track) {
return track.Source().GetType() == blink::WebMediaStreamSource::kTypeAudio
? MediaStreamTrackMetrics::Kind::kAudio
: MediaStreamTrackMetrics::Kind::kVideo;
}
} // namespace } // namespace
// Implementation of LocalRTCStatsRequest. // Implementation of LocalRTCStatsRequest.
...@@ -1826,6 +1833,9 @@ std::unique_ptr<blink::WebRTCRtpSender> RTCPeerConnectionHandler::AddTrack( ...@@ -1826,6 +1833,9 @@ std::unique_ptr<blink::WebRTCRtpSender> RTCPeerConnectionHandler::AddTrack(
webrtc_streams); webrtc_streams);
if (!webrtc_sender) if (!webrtc_sender)
return nullptr; return nullptr;
track_metrics_.AddTrack(MediaStreamTrackMetrics::Direction::kSend,
MediaStreamTrackMetricsKind(track),
track.Id().Utf8());
DCHECK(FindSender(RTCRtpSender::getId(webrtc_sender)) == rtp_senders_.end()); DCHECK(FindSender(RTCRtpSender::getId(webrtc_sender)) == rtp_senders_.end());
rtp_senders_.push_back(std::make_unique<RTCRtpSender>( rtp_senders_.push_back(std::make_unique<RTCRtpSender>(
native_peer_connection_, task_runner_, signaling_thread(), native_peer_connection_, task_runner_, signaling_thread(),
...@@ -1840,8 +1850,6 @@ std::unique_ptr<blink::WebRTCRtpSender> RTCPeerConnectionHandler::AddTrack( ...@@ -1840,8 +1850,6 @@ std::unique_ptr<blink::WebRTCRtpSender> RTCPeerConnectionHandler::AddTrack(
if (GetLocalStreamUsageCount(rtp_senders_, if (GetLocalStreamUsageCount(rtp_senders_,
stream_ref->adapter().web_stream()) == 1u) { stream_ref->adapter().web_stream()) == 1u) {
PerSessionWebRTCAPIMetrics::GetInstance()->IncrementStreamCounter(); PerSessionWebRTCAPIMetrics::GetInstance()->IncrementStreamCounter();
track_metrics_.AddStream(MediaStreamTrackMetrics::SENT_STREAM,
stream_ref->adapter().webrtc_stream().get());
} }
} }
return rtp_senders_.back()->ShallowCopy(); return rtp_senders_.back()->ShallowCopy();
...@@ -1850,11 +1858,15 @@ std::unique_ptr<blink::WebRTCRtpSender> RTCPeerConnectionHandler::AddTrack( ...@@ -1850,11 +1858,15 @@ std::unique_ptr<blink::WebRTCRtpSender> RTCPeerConnectionHandler::AddTrack(
bool RTCPeerConnectionHandler::RemoveTrack(blink::WebRTCRtpSender* web_sender) { bool RTCPeerConnectionHandler::RemoveTrack(blink::WebRTCRtpSender* web_sender) {
DCHECK(task_runner_->RunsTasksInCurrentSequence()); DCHECK(task_runner_->RunsTasksInCurrentSequence());
TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::RemoveTrack"); TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::RemoveTrack");
auto web_track = web_sender->Track();
auto it = FindSender(web_sender->Id()); auto it = FindSender(web_sender->Id());
if (it == rtp_senders_.end()) if (it == rtp_senders_.end())
return false; return false;
if (!(*it)->RemoveFromPeerConnection(native_peer_connection_.get())) if (!(*it)->RemoveFromPeerConnection(native_peer_connection_.get()))
return false; return false;
track_metrics_.RemoveTrack(MediaStreamTrackMetrics::Direction::kSend,
MediaStreamTrackMetricsKind(web_track),
web_track.Id().Utf8());
auto stream_refs = (*it)->stream_refs(); auto stream_refs = (*it)->stream_refs();
if (peer_connection_tracker_) { if (peer_connection_tracker_) {
peer_connection_tracker_->TrackRemoveTransceiver( peer_connection_tracker_->TrackRemoveTransceiver(
...@@ -1869,8 +1881,6 @@ bool RTCPeerConnectionHandler::RemoveTrack(blink::WebRTCRtpSender* web_sender) { ...@@ -1869,8 +1881,6 @@ bool RTCPeerConnectionHandler::RemoveTrack(blink::WebRTCRtpSender* web_sender) {
if (GetLocalStreamUsageCount(rtp_senders_, if (GetLocalStreamUsageCount(rtp_senders_,
stream_ref->adapter().web_stream()) == 0u) { stream_ref->adapter().web_stream()) == 0u) {
PerSessionWebRTCAPIMetrics::GetInstance()->DecrementStreamCounter(); PerSessionWebRTCAPIMetrics::GetInstance()->DecrementStreamCounter();
track_metrics_.RemoveStream(MediaStreamTrackMetrics::SENT_STREAM,
stream_ref->adapter().webrtc_stream().get());
} }
} }
return true; return true;
...@@ -2062,7 +2072,10 @@ void RTCPeerConnectionHandler::OnAddRemoteTrack( ...@@ -2062,7 +2072,10 @@ void RTCPeerConnectionHandler::OnAddRemoteTrack(
remote_stream_adapter_refs) { remote_stream_adapter_refs) {
DCHECK(task_runner_->RunsTasksInCurrentSequence()); DCHECK(task_runner_->RunsTasksInCurrentSequence());
TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnAddRemoteTrack"); TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnAddRemoteTrack");
auto web_track = remote_track_adapter_ref->web_track();
track_metrics_.AddTrack(MediaStreamTrackMetrics::Direction::kReceive,
MediaStreamTrackMetricsKind(web_track),
web_track.Id().Utf8());
for (const auto& remote_stream_adapter_ref : remote_stream_adapter_refs) { for (const auto& remote_stream_adapter_ref : remote_stream_adapter_refs) {
// New remote stream? // New remote stream?
if (GetRemoteStreamUsageCount( if (GetRemoteStreamUsageCount(
...@@ -2070,9 +2083,6 @@ void RTCPeerConnectionHandler::OnAddRemoteTrack( ...@@ -2070,9 +2083,6 @@ void RTCPeerConnectionHandler::OnAddRemoteTrack(
remote_stream_adapter_ref->adapter().webrtc_stream().get()) == 0) { remote_stream_adapter_ref->adapter().webrtc_stream().get()) == 0) {
// Update metrics. // Update metrics.
PerSessionWebRTCAPIMetrics::GetInstance()->IncrementStreamCounter(); PerSessionWebRTCAPIMetrics::GetInstance()->IncrementStreamCounter();
track_metrics_.AddStream(
MediaStreamTrackMetrics::RECEIVED_STREAM,
remote_stream_adapter_ref->adapter().webrtc_stream().get());
} }
} }
...@@ -2116,8 +2126,12 @@ void RTCPeerConnectionHandler::OnRemoveRemoteTrack( ...@@ -2116,8 +2126,12 @@ void RTCPeerConnectionHandler::OnRemoveRemoteTrack(
nullptr /* sender */, it->second->ShallowCopy() /* receiver */); nullptr /* sender */, it->second->ShallowCopy() /* receiver */);
} }
remote_stream_adapter_refs = it->second->StreamAdapterRefs(); remote_stream_adapter_refs = it->second->StreamAdapterRefs();
auto receiver = it->second->ShallowCopy();
track_metrics_.RemoveTrack(MediaStreamTrackMetrics::Direction::kReceive,
MediaStreamTrackMetricsKind(receiver->Track()),
receiver->Track().Id().Utf8());
if (!is_closed_) if (!is_closed_)
client_->DidRemoveRemoteTrack(it->second->ShallowCopy()); client_->DidRemoveRemoteTrack(std::move(receiver));
rtp_receivers_.erase(it); rtp_receivers_.erase(it);
} }
...@@ -2127,9 +2141,6 @@ void RTCPeerConnectionHandler::OnRemoveRemoteTrack( ...@@ -2127,9 +2141,6 @@ void RTCPeerConnectionHandler::OnRemoveRemoteTrack(
rtp_receivers_, rtp_receivers_,
remote_stream_adapter_ref->adapter().webrtc_stream().get()) == 0) { remote_stream_adapter_ref->adapter().webrtc_stream().get()) == 0) {
// Update metrics. // Update metrics.
track_metrics_.RemoveStream(
MediaStreamTrackMetrics::RECEIVED_STREAM,
remote_stream_adapter_ref->adapter().webrtc_stream().get());
PerSessionWebRTCAPIMetrics::GetInstance()->DecrementStreamCounter(); PerSessionWebRTCAPIMetrics::GetInstance()->DecrementStreamCounter();
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment