| OLD | NEW | 
|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "content/renderer/media/webrtc/media_stream_track_metrics.h" | 5 #include "content/renderer/media/webrtc/media_stream_track_metrics.h" | 
| 6 | 6 | 
| 7 #include <inttypes.h> | 7 #include <inttypes.h> | 
| 8 #include <set> | 8 #include <set> | 
| 9 #include <string> | 9 #include <string> | 
| 10 | 10 | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
| 28 IdSet GetTrackIds(const std::vector<rtc::scoped_refptr<T>>& tracks) { | 28 IdSet GetTrackIds(const std::vector<rtc::scoped_refptr<T>>& tracks) { | 
| 29   IdSet track_ids; | 29   IdSet track_ids; | 
| 30   for (const auto& track : tracks) | 30   for (const auto& track : tracks) | 
| 31     track_ids.insert(track->id()); | 31     track_ids.insert(track->id()); | 
| 32   return track_ids; | 32   return track_ids; | 
| 33 } | 33 } | 
| 34 | 34 | 
| 35 // TODO(tommi): Consolidate this and TrackObserver since these implementations | 35 // TODO(tommi): Consolidate this and TrackObserver since these implementations | 
| 36 // are fundamentally achieving the same thing (aside from specific logic inside | 36 // are fundamentally achieving the same thing (aside from specific logic inside | 
| 37 // the OnChanged callbacks). | 37 // the OnChanged callbacks). | 
| 38 class MediaStreamObserver | 38 class MediaStreamTrackObserver | 
| 39     : public base::RefCountedThreadSafe<MediaStreamObserver>, | 39     : public base::RefCountedThreadSafe<MediaStreamTrackObserver>, | 
| 40       public webrtc::ObserverInterface { | 40       public webrtc::ObserverInterface { | 
| 41  public: | 41  public: | 
| 42   typedef base::Callback< | 42   typedef base::Callback< | 
| 43       void(const IdSet& audio_track_ids, const IdSet& video_track_ids)> | 43       void(const IdSet& audio_track_ids, const IdSet& video_track_ids)> | 
| 44           OnChangedCallback; | 44           OnChangedCallback; | 
| 45 | 45 | 
| 46   MediaStreamObserver( | 46   MediaStreamTrackObserver( | 
| 47       const OnChangedCallback& callback, | 47       const OnChangedCallback& callback, | 
| 48       const scoped_refptr<base::SingleThreadTaskRunner>& main_thread, | 48       const scoped_refptr<base::SingleThreadTaskRunner>& main_thread, | 
| 49       webrtc::MediaStreamInterface* stream) | 49       webrtc::MediaStreamInterface* stream) | 
| 50       : main_thread_(main_thread), stream_(stream), callback_(callback) { | 50       : main_thread_(main_thread), stream_(stream), callback_(callback) { | 
| 51     signaling_thread_.DetachFromThread(); | 51     signaling_thread_.DetachFromThread(); | 
| 52     stream_->RegisterObserver(this); | 52     stream_->RegisterObserver(this); | 
| 53   } | 53   } | 
| 54 | 54 | 
| 55   const scoped_refptr<webrtc::MediaStreamInterface>& stream() const { | 55   const scoped_refptr<webrtc::MediaStreamInterface>& stream() const { | 
| 56     DCHECK(main_thread_->BelongsToCurrentThread()); | 56     DCHECK(main_thread_->BelongsToCurrentThread()); | 
| 57     return stream_; | 57     return stream_; | 
| 58   } | 58   } | 
| 59 | 59 | 
| 60   void Unregister() { | 60   void Unregister() { | 
| 61     DCHECK(main_thread_->BelongsToCurrentThread()); | 61     DCHECK(main_thread_->BelongsToCurrentThread()); | 
| 62     callback_.Reset(); | 62     callback_.Reset(); | 
| 63     stream_->UnregisterObserver(this); | 63     stream_->UnregisterObserver(this); | 
| 64     stream_ = nullptr; | 64     stream_ = nullptr; | 
| 65   } | 65   } | 
| 66 | 66 | 
| 67  private: | 67  private: | 
| 68   friend class base::RefCountedThreadSafe<MediaStreamObserver>; | 68   friend class base::RefCountedThreadSafe<MediaStreamTrackObserver>; | 
| 69   ~MediaStreamObserver() override { | 69   ~MediaStreamTrackObserver() override { | 
| 70     DCHECK(!stream_.get()) << "must have been unregistered before deleting"; | 70     DCHECK(!stream_.get()) << "must have been unregistered before deleting"; | 
| 71   } | 71   } | 
| 72 | 72 | 
| 73   // webrtc::ObserverInterface implementation. | 73   // webrtc::ObserverInterface implementation. | 
| 74   void OnChanged() override { | 74   void OnChanged() override { | 
| 75     DCHECK(signaling_thread_.CalledOnValidThread()); | 75     DCHECK(signaling_thread_.CalledOnValidThread()); | 
| 76     main_thread_->PostTask( | 76     main_thread_->PostTask( | 
| 77         FROM_HERE, base::BindOnce(&MediaStreamObserver::OnChangedOnMainThread, | 77         FROM_HERE, base::BindOnce(&MediaStreamTrackObserver::OnChangedOnMainThre
     ad, | 
| 78                                   this, GetTrackIds(stream_->GetAudioTracks()), | 78                                   this, GetTrackIds(stream_->GetAudioTracks()), | 
| 79                                   GetTrackIds(stream_->GetVideoTracks()))); | 79                                   GetTrackIds(stream_->GetVideoTracks()))); | 
| 80   } | 80   } | 
| 81 | 81 | 
| 82   void OnChangedOnMainThread(const IdSet& audio_track_ids, | 82   void OnChangedOnMainThread(const IdSet& audio_track_ids, | 
| 83                              const IdSet& video_track_ids) { | 83                              const IdSet& video_track_ids) { | 
| 84     DCHECK(main_thread_->BelongsToCurrentThread()); | 84     DCHECK(main_thread_->BelongsToCurrentThread()); | 
| 85     if (!callback_.is_null()) | 85     if (!callback_.is_null()) | 
| 86       callback_.Run(audio_track_ids, video_track_ids); | 86       callback_.Run(audio_track_ids, video_track_ids); | 
| 87   } | 87   } | 
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 131 | 131 | 
| 132   // False until start/end of lifetime messages have been sent. | 132   // False until start/end of lifetime messages have been sent. | 
| 133   bool has_reported_start_; | 133   bool has_reported_start_; | 
| 134   bool has_reported_end_; | 134   bool has_reported_end_; | 
| 135 | 135 | 
| 136   // IDs of audio and video tracks in the stream being observed. | 136   // IDs of audio and video tracks in the stream being observed. | 
| 137   IdSet audio_track_ids_; | 137   IdSet audio_track_ids_; | 
| 138   IdSet video_track_ids_; | 138   IdSet video_track_ids_; | 
| 139 | 139 | 
| 140   MediaStreamTrackMetrics::StreamType stream_type_; | 140   MediaStreamTrackMetrics::StreamType stream_type_; | 
| 141   scoped_refptr<MediaStreamObserver> observer_; | 141   scoped_refptr<MediaStreamTrackObserver> observer_; | 
| 142 | 142 | 
| 143   // Non-owning. | 143   // Non-owning. | 
| 144   MediaStreamTrackMetrics* owner_; | 144   MediaStreamTrackMetrics* owner_; | 
| 145   base::ThreadChecker thread_checker_; | 145   base::ThreadChecker thread_checker_; | 
| 146 }; | 146 }; | 
| 147 | 147 | 
| 148 namespace { | 148 namespace { | 
| 149 | 149 | 
| 150 // Used with std::find_if. | 150 // Used with std::find_if. | 
| 151 struct ObserverFinder { | 151 struct ObserverFinder { | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 165 | 165 | 
| 166 MediaStreamTrackMetricsObserver::MediaStreamTrackMetricsObserver( | 166 MediaStreamTrackMetricsObserver::MediaStreamTrackMetricsObserver( | 
| 167     MediaStreamTrackMetrics::StreamType stream_type, | 167     MediaStreamTrackMetrics::StreamType stream_type, | 
| 168     MediaStreamInterface* stream, | 168     MediaStreamInterface* stream, | 
| 169     MediaStreamTrackMetrics* owner) | 169     MediaStreamTrackMetrics* owner) | 
| 170     : has_reported_start_(false), | 170     : has_reported_start_(false), | 
| 171       has_reported_end_(false), | 171       has_reported_end_(false), | 
| 172       audio_track_ids_(GetTrackIds(stream->GetAudioTracks())), | 172       audio_track_ids_(GetTrackIds(stream->GetAudioTracks())), | 
| 173       video_track_ids_(GetTrackIds(stream->GetVideoTracks())), | 173       video_track_ids_(GetTrackIds(stream->GetVideoTracks())), | 
| 174       stream_type_(stream_type), | 174       stream_type_(stream_type), | 
| 175       observer_(new MediaStreamObserver( | 175       observer_(new MediaStreamTrackObserver( | 
| 176             base::Bind(&MediaStreamTrackMetricsObserver::OnChanged, | 176             base::Bind(&MediaStreamTrackMetricsObserver::OnChanged, | 
| 177                        base::Unretained(this)), | 177                        base::Unretained(this)), | 
| 178             base::ThreadTaskRunnerHandle::Get(), | 178             base::ThreadTaskRunnerHandle::Get(), | 
| 179             stream)), | 179             stream)), | 
| 180       owner_(owner) { | 180       owner_(owner) { | 
| 181 } | 181 } | 
| 182 | 182 | 
| 183 MediaStreamTrackMetricsObserver::~MediaStreamTrackMetricsObserver() { | 183 MediaStreamTrackMetricsObserver::~MediaStreamTrackMetricsObserver() { | 
| 184   DCHECK(thread_checker_.CalledOnValidThread()); | 184   DCHECK(thread_checker_.CalledOnValidThread()); | 
| 185   observer_->Unregister(); | 185   observer_->Unregister(); | 
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 393 } | 393 } | 
| 394 | 394 | 
| 395 uint64_t MediaStreamTrackMetrics::MakeUniqueId(const std::string& track_id, | 395 uint64_t MediaStreamTrackMetrics::MakeUniqueId(const std::string& track_id, | 
| 396                                                StreamType stream_type) { | 396                                                StreamType stream_type) { | 
| 397   return MakeUniqueIdImpl( | 397   return MakeUniqueIdImpl( | 
| 398       reinterpret_cast<uint64_t>(reinterpret_cast<void*>(this)), track_id, | 398       reinterpret_cast<uint64_t>(reinterpret_cast<void*>(this)), track_id, | 
| 399       stream_type); | 399       stream_type); | 
| 400 } | 400 } | 
| 401 | 401 | 
| 402 }  // namespace content | 402 }  // namespace content | 
| OLD | NEW | 
|---|