Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(188)

Side by Side Diff: content/renderer/media/remote_media_stream_impl.cc

Issue 201583003: Implement a source for remote video tracks. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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/remote_media_stream_impl.h" 5 #include "content/renderer/media/remote_media_stream_impl.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
11 #include "content/renderer/media/media_stream.h" 11 #include "content/renderer/media/media_stream.h"
12 #include "content/renderer/media/media_stream_dependency_factory.h" 12 #include "content/renderer/media/media_stream_dependency_factory.h"
13 #include "content/renderer/media/media_stream_video_track.h"
14 #include "content/renderer/media/webrtc/media_stream_remote_video_source.h"
15 #include "content/renderer/render_thread_impl.h"
13 #include "third_party/WebKit/public/platform/WebString.h" 16 #include "third_party/WebKit/public/platform/WebString.h"
14 17
15 namespace content { 18 namespace content {
16 19
17 // RemoteMediaStreamTrackObserver is responsible for listening on change
18 // notification on a remote webrtc MediaStreamTrack and notify WebKit.
19 class RemoteMediaStreamTrackObserver
20 : NON_EXPORTED_BASE(public webrtc::ObserverInterface),
21 NON_EXPORTED_BASE(public base::NonThreadSafe) {
22 public:
23 RemoteMediaStreamTrackObserver(
24 webrtc::MediaStreamTrackInterface* webrtc_track,
25 const blink::WebMediaStreamTrack& webkit_track);
26 virtual ~RemoteMediaStreamTrackObserver();
27
28 webrtc::MediaStreamTrackInterface* observered_track() {
29 return webrtc_track_.get();
30 }
31 const blink::WebMediaStreamTrack& webkit_track() { return webkit_track_; }
32
33 private:
34 // webrtc::ObserverInterface implementation.
35 virtual void OnChanged() OVERRIDE;
36
37 webrtc::MediaStreamTrackInterface::TrackState state_;
38 scoped_refptr<webrtc::MediaStreamTrackInterface> webrtc_track_;
39 blink::WebMediaStreamTrack webkit_track_;
40
41 DISALLOW_COPY_AND_ASSIGN(RemoteMediaStreamTrackObserver);
42 };
43
44 } // namespace content
45
46 namespace { 20 namespace {
47 21
48 void InitializeWebkitTrack(webrtc::MediaStreamTrackInterface* track, 22 void InitializeWebkitTrack(webrtc::MediaStreamTrackInterface* track,
49 blink::WebMediaStreamTrack* webkit_track, 23 blink::WebMediaStreamTrack* webkit_track,
50 blink::WebMediaStreamSource::Type type) { 24 blink::WebMediaStreamSource::Type type) {
51 blink::WebMediaStreamSource webkit_source; 25 blink::WebMediaStreamSource webkit_source;
52 blink::WebString webkit_track_id(base::UTF8ToUTF16(track->id())); 26 blink::WebString webkit_track_id(base::UTF8ToUTF16(track->id()));
53 27
54 webkit_source.initialize(webkit_track_id, type, webkit_track_id); 28 webkit_source.initialize(webkit_track_id, type, webkit_track_id);
55 webkit_track->initialize(webkit_track_id, webkit_source); 29 webkit_track->initialize(webkit_track_id, webkit_source);
56 content::MediaStreamDependencyFactory::AddNativeTrackToBlinkTrack( 30
57 track, *webkit_track, false); 31 MediaStreamDependencyFactory* factory = NULL;
32 // RenderThreadImpl::current() may be NULL in unit tests.
33 RenderThreadImpl* render_thread = RenderThreadImpl::current();
34 if (render_thread)
35 factory = render_thread->GetMediaStreamDependencyFactory();
36
37 if (type == blink::WebMediaStreamSource::TypeVideo) {
38 MediaStreamRemoteVideoSource* video_source =
39 new MediaStreamRemoteVideoSource(
40 static_cast<webrtc::VideoTrackInterface*>(track));
41 webkit_source.setExtraData(video_source);
42 // Initial constraints must be provided to a MediaStreamVideoTrack. But
43 // no constraints are available initially on a remote video track.
44 blink::WebMediaConstraints constraints;
45 constraints.initialize();
46 webkit_track->setExtraData(
47 new MediaStreamVideoTrack(video_source, constraints,
48 MediaStreamVideoSource::ConstraintsCallback(),
49 track->enabled(), factory));
50 } else {
51 DCHECK(type == blink::WebMediaStreamSource::TypeAudio);
52 content::MediaStreamDependencyFactory::AddNativeAudioTrackToBlinkTrack(
53 track, *webkit_track, false);
54 }
58 } 55 }
59 56
60 content::RemoteMediaStreamTrackObserver* FindTrackObserver( 57 } // namespace
61 webrtc::MediaStreamTrackInterface* track, 58
62 const ScopedVector<content::RemoteMediaStreamTrackObserver>& observers) { 59 // Base class used for mapping between webrtc and blink MediaStream tracks.
63 ScopedVector<content::RemoteMediaStreamTrackObserver>::const_iterator it = 60 // An instance of a RemoteMediaStreamTrackAdapter is stored in
61 // RemoteMediaStreamImpl per remote audio and video track.
62 class RemoteMediaStreamTrackAdapter {
63 public:
64 RemoteMediaStreamTrackAdapter(webrtc::MediaStreamTrackInterface* webrtc_track,
65 const blink::WebMediaStreamTrack& webkit_track)
66 : webrtc_track_(webrtc_track),
67 webkit_track_(webkit_track) {
68 }
69
70 virtual ~RemoteMediaStreamTrackAdapter() {
71 }
72
73 webrtc::MediaStreamTrackInterface* observed_track() {
74 return webrtc_track_.get();
75 }
76
77 const blink::WebMediaStreamTrack& webkit_track() { return webkit_track_; }
78
79 private:
80 scoped_refptr<webrtc::MediaStreamTrackInterface> webrtc_track_;
81 blink::WebMediaStreamTrack webkit_track_;
82 bool sent_ended_message_;
83
84 DISALLOW_COPY_AND_ASSIGN(RemoteMediaStreamTrackAdapter);
85 };
86
87 static content::RemoteMediaStreamTrackAdapter* FindTrackObserver(
88 webrtc::MediaStreamTrackInterface* track,
89 const ScopedVector<content::RemoteMediaStreamTrackAdapter>& observers) {
90 ScopedVector<content::RemoteMediaStreamTrackAdapter>::const_iterator it =
64 observers.begin(); 91 observers.begin();
65 for (; it != observers.end(); ++it) { 92 for (; it != observers.end(); ++it) {
66 if ((*it)->observered_track() == track) 93 if ((*it)->observed_track() == track)
67 return *it; 94 return *it;
68 } 95 }
69 return NULL; 96 return NULL;
70 } 97 }
71 98
72 } // namespace anonymous 99 // RemoteAudioMediaStreamTrackAdapter is responsible for listening on state
100 // change notifications on a remote webrtc audio MediaStreamTracks and notify
101 // WebKit.
102 class RemoteAudioMediaStreamTrackAdapter
103 : public RemoteMediaStreamTrackAdapter,
104 public webrtc::ObserverInterface,
105 public base::NonThreadSafe {
106 public:
107 RemoteAudioMediaStreamTrackAdapter(
108 webrtc::MediaStreamTrackInterface* webrtc_track,
109 const blink::WebMediaStreamTrack& webkit_track);
110 virtual ~RemoteAudioMediaStreamTrackAdapter();
73 111
74 namespace content { 112 private:
113 // webrtc::ObserverInterface implementation.
114 virtual void OnChanged() OVERRIDE;
75 115
76 RemoteMediaStreamTrackObserver::RemoteMediaStreamTrackObserver( 116 webrtc::MediaStreamTrackInterface::TrackState state_;
117
118 DISALLOW_COPY_AND_ASSIGN(RemoteAudioMediaStreamTrackAdapter);
119 };
120
121 RemoteAudioMediaStreamTrackAdapter::RemoteAudioMediaStreamTrackAdapter(
77 webrtc::MediaStreamTrackInterface* webrtc_track, 122 webrtc::MediaStreamTrackInterface* webrtc_track,
78 const blink::WebMediaStreamTrack& webkit_track) 123 const blink::WebMediaStreamTrack& webkit_track)
79 : state_(webrtc_track->state()), 124 : RemoteMediaStreamTrackAdapter(webrtc_track, webkit_track),
80 webrtc_track_(webrtc_track), 125 state_(observed_track()->state()) {
81 webkit_track_(webkit_track) { 126 observed_track()->RegisterObserver(this);
82 webrtc_track->RegisterObserver(this);
83 } 127 }
84 128
85 RemoteMediaStreamTrackObserver::~RemoteMediaStreamTrackObserver() { 129 RemoteAudioMediaStreamTrackAdapter::~RemoteAudioMediaStreamTrackAdapter() {
86 webrtc_track_->UnregisterObserver(this); 130 observed_track()->UnregisterObserver(this);
87 } 131 }
88 132
89 void RemoteMediaStreamTrackObserver::OnChanged() { 133 void RemoteAudioMediaStreamTrackAdapter::OnChanged() {
90 DCHECK(CalledOnValidThread()); 134 DCHECK(CalledOnValidThread());
91 135
92 webrtc::MediaStreamTrackInterface::TrackState state = webrtc_track_->state(); 136 webrtc::MediaStreamTrackInterface::TrackState state =
137 observed_track()->state();
93 if (state == state_) 138 if (state == state_)
94 return; 139 return;
95 140
96 state_ = state; 141 state_ = state;
97 switch (state) { 142 switch (state) {
98 case webrtc::MediaStreamTrackInterface::kInitializing: 143 case webrtc::MediaStreamTrackInterface::kInitializing:
99 // Ignore the kInitializing state since there is no match in 144 // Ignore the kInitializing state since there is no match in
100 // WebMediaStreamSource::ReadyState. 145 // WebMediaStreamSource::ReadyState.
101 break; 146 break;
102 case webrtc::MediaStreamTrackInterface::kLive: 147 case webrtc::MediaStreamTrackInterface::kLive:
103 webkit_track_.source().setReadyState( 148 webkit_track().source().setReadyState(
104 blink::WebMediaStreamSource::ReadyStateLive); 149 blink::WebMediaStreamSource::ReadyStateLive);
105 break; 150 break;
106 case webrtc::MediaStreamTrackInterface::kEnded: 151 case webrtc::MediaStreamTrackInterface::kEnded:
107 webkit_track_.source().setReadyState( 152 webkit_track().source().setReadyState(
108 blink::WebMediaStreamSource::ReadyStateEnded); 153 blink::WebMediaStreamSource::ReadyStateEnded);
109 break; 154 break;
110 default: 155 default:
111 NOTREACHED(); 156 NOTREACHED();
112 break; 157 break;
113 } 158 }
114 } 159 }
115 160
116 RemoteMediaStreamImpl::RemoteMediaStreamImpl( 161 RemoteMediaStreamImpl::RemoteMediaStreamImpl(
117 webrtc::MediaStreamInterface* webrtc_stream) 162 webrtc::MediaStreamInterface* webrtc_stream)
118 : webrtc_stream_(webrtc_stream) { 163 : webrtc_stream_(webrtc_stream) {
119 webrtc_stream_->RegisterObserver(this); 164 webrtc_stream_->RegisterObserver(this);
120 165
121 webrtc::AudioTrackVector webrtc_audio_tracks = 166 webrtc::AudioTrackVector webrtc_audio_tracks =
122 webrtc_stream_->GetAudioTracks(); 167 webrtc_stream_->GetAudioTracks();
123 blink::WebVector<blink::WebMediaStreamTrack> webkit_audio_tracks( 168 blink::WebVector<blink::WebMediaStreamTrack> webkit_audio_tracks(
124 webrtc_audio_tracks.size()); 169 webrtc_audio_tracks.size());
125 170
126 // Initialize WebKit audio tracks. 171 // Initialize WebKit audio tracks.
127 size_t i = 0; 172 size_t i = 0;
128 for (; i < webrtc_audio_tracks.size(); ++i) { 173 for (; i < webrtc_audio_tracks.size(); ++i) {
129 webrtc::AudioTrackInterface* audio_track = webrtc_audio_tracks[i]; 174 webrtc::AudioTrackInterface* audio_track = webrtc_audio_tracks[i];
130 DCHECK(audio_track); 175 DCHECK(audio_track);
131 InitializeWebkitTrack(audio_track, &webkit_audio_tracks[i], 176 InitializeWebkitTrack(audio_track, &webkit_audio_tracks[i],
132 blink::WebMediaStreamSource::TypeAudio); 177 blink::WebMediaStreamSource::TypeAudio);
133 audio_track_observers_.push_back( 178 audio_track_observers_.push_back(
134 new RemoteMediaStreamTrackObserver(audio_track, 179 new RemoteAudioMediaStreamTrackAdapter(audio_track,
135 webkit_audio_tracks[i])); 180 webkit_audio_tracks[i]));
136 } 181 }
137 182
138 // Initialize WebKit video tracks. 183 // Initialize WebKit video tracks.
139 webrtc::VideoTrackVector webrtc_video_tracks = 184 webrtc::VideoTrackVector webrtc_video_tracks =
140 webrtc_stream_->GetVideoTracks(); 185 webrtc_stream_->GetVideoTracks();
141 blink::WebVector<blink::WebMediaStreamTrack> webkit_video_tracks( 186 blink::WebVector<blink::WebMediaStreamTrack> webkit_video_tracks(
142 webrtc_video_tracks.size()); 187 webrtc_video_tracks.size());
143 for (i = 0; i < webrtc_video_tracks.size(); ++i) { 188 for (i = 0; i < webrtc_video_tracks.size(); ++i) {
144 webrtc::VideoTrackInterface* video_track = webrtc_video_tracks[i]; 189 webrtc::VideoTrackInterface* video_track = webrtc_video_tracks[i];
145 DCHECK(video_track); 190 DCHECK(video_track);
146 InitializeWebkitTrack(video_track, &webkit_video_tracks[i], 191 InitializeWebkitTrack(video_track, &webkit_video_tracks[i],
147 blink::WebMediaStreamSource::TypeVideo); 192 blink::WebMediaStreamSource::TypeVideo);
148 video_track_observers_.push_back( 193 video_track_observers_.push_back(
149 new RemoteMediaStreamTrackObserver(video_track, 194 new RemoteMediaStreamTrackAdapter(video_track,
150 webkit_video_tracks[i])); 195 webkit_video_tracks[i]));
151 } 196 }
152 197
153 webkit_stream_.initialize(base::UTF8ToUTF16(webrtc_stream->label()), 198 webkit_stream_.initialize(base::UTF8ToUTF16(webrtc_stream->label()),
154 webkit_audio_tracks, webkit_video_tracks); 199 webkit_audio_tracks, webkit_video_tracks);
155 webkit_stream_.setExtraData(new MediaStream(webrtc_stream)); 200 webkit_stream_.setExtraData(new MediaStream(webrtc_stream));
156 } 201 }
157 202
158 RemoteMediaStreamImpl::~RemoteMediaStreamImpl() { 203 RemoteMediaStreamImpl::~RemoteMediaStreamImpl() {
159 webrtc_stream_->UnregisterObserver(this); 204 webrtc_stream_->UnregisterObserver(this);
160 } 205 }
161 206
162 void RemoteMediaStreamImpl::OnChanged() { 207 void RemoteMediaStreamImpl::OnChanged() {
163 // Find removed audio tracks. 208 // Find removed audio tracks.
164 ScopedVector<RemoteMediaStreamTrackObserver>::iterator audio_it = 209 ScopedVector<RemoteMediaStreamTrackAdapter>::iterator audio_it =
165 audio_track_observers_.begin(); 210 audio_track_observers_.begin();
166 while (audio_it != audio_track_observers_.end()) { 211 while (audio_it != audio_track_observers_.end()) {
167 std::string track_id = (*audio_it)->observered_track()->id(); 212 std::string track_id = (*audio_it)->observed_track()->id();
168 if (webrtc_stream_->FindAudioTrack(track_id) == NULL) { 213 if (webrtc_stream_->FindAudioTrack(track_id) == NULL) {
169 webkit_stream_.removeTrack((*audio_it)->webkit_track()); 214 webkit_stream_.removeTrack((*audio_it)->webkit_track());
170 audio_it = audio_track_observers_.erase(audio_it); 215 audio_it = audio_track_observers_.erase(audio_it);
171 } else { 216 } else {
172 ++audio_it; 217 ++audio_it;
173 } 218 }
174 } 219 }
175 220
176 // Find removed video tracks. 221 // Find removed video tracks.
177 ScopedVector<RemoteMediaStreamTrackObserver>::iterator video_it = 222 ScopedVector<RemoteMediaStreamTrackAdapter>::iterator video_it =
178 video_track_observers_.begin(); 223 video_track_observers_.begin();
179 while (video_it != video_track_observers_.end()) { 224 while (video_it != video_track_observers_.end()) {
180 std::string track_id = (*video_it)->observered_track()->id(); 225 std::string track_id = (*video_it)->observed_track()->id();
181 if (webrtc_stream_->FindVideoTrack(track_id) == NULL) { 226 if (webrtc_stream_->FindVideoTrack(track_id) == NULL) {
182 webkit_stream_.removeTrack((*video_it)->webkit_track()); 227 webkit_stream_.removeTrack((*video_it)->webkit_track());
183 video_it = video_track_observers_.erase(video_it); 228 video_it = video_track_observers_.erase(video_it);
184 } else { 229 } else {
185 ++video_it; 230 ++video_it;
186 } 231 }
187 } 232 }
188 233
189 // Find added audio tracks. 234 // Find added audio tracks.
190 webrtc::AudioTrackVector webrtc_audio_tracks = 235 webrtc::AudioTrackVector webrtc_audio_tracks =
191 webrtc_stream_->GetAudioTracks(); 236 webrtc_stream_->GetAudioTracks();
192 for (webrtc::AudioTrackVector::iterator it = webrtc_audio_tracks.begin(); 237 for (webrtc::AudioTrackVector::iterator it = webrtc_audio_tracks.begin();
193 it != webrtc_audio_tracks.end(); ++it) { 238 it != webrtc_audio_tracks.end(); ++it) {
194 if (!FindTrackObserver(*it, audio_track_observers_)) { 239 if (!FindTrackObserver(*it, audio_track_observers_)) {
195 blink::WebMediaStreamTrack new_track; 240 blink::WebMediaStreamTrack new_track;
196 InitializeWebkitTrack(*it, &new_track, 241 InitializeWebkitTrack(*it, &new_track,
197 blink::WebMediaStreamSource::TypeAudio); 242 blink::WebMediaStreamSource::TypeAudio);
198 audio_track_observers_.push_back( 243 audio_track_observers_.push_back(
199 new RemoteMediaStreamTrackObserver(*it, new_track)); 244 new RemoteAudioMediaStreamTrackAdapter(*it, new_track));
200 webkit_stream_.addTrack(new_track); 245 webkit_stream_.addTrack(new_track);
201 } 246 }
202 } 247 }
203 248
204 // Find added video tracks. 249 // Find added video tracks.
205 webrtc::VideoTrackVector webrtc_video_tracks = 250 webrtc::VideoTrackVector webrtc_video_tracks =
206 webrtc_stream_->GetVideoTracks(); 251 webrtc_stream_->GetVideoTracks();
207 for (webrtc::VideoTrackVector::iterator it = webrtc_video_tracks.begin(); 252 for (webrtc::VideoTrackVector::iterator it = webrtc_video_tracks.begin();
208 it != webrtc_video_tracks.end(); ++it) { 253 it != webrtc_video_tracks.end(); ++it) {
209 if (!FindTrackObserver(*it, video_track_observers_)) { 254 if (!FindTrackObserver(*it, video_track_observers_)) {
210 blink::WebMediaStreamTrack new_track; 255 blink::WebMediaStreamTrack new_track;
211 InitializeWebkitTrack(*it, &new_track, 256 InitializeWebkitTrack(*it, &new_track,
212 blink::WebMediaStreamSource::TypeVideo); 257 blink::WebMediaStreamSource::TypeVideo);
213 video_track_observers_.push_back( 258 video_track_observers_.push_back(
214 new RemoteMediaStreamTrackObserver(*it, new_track)); 259 new RemoteMediaStreamTrackAdapter(*it, new_track));
215 webkit_stream_.addTrack(new_track); 260 webkit_stream_.addTrack(new_track);
216 } 261 }
217 } 262 }
218 } 263 }
219 264
220 } // namespace content 265 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/remote_media_stream_impl.h ('k') | content/renderer/media/rtc_peer_connection_handler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698