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

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

Issue 231963002: Revert 262050 "Implement a source for remote video tracks." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: 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"
16 #include "third_party/WebKit/public/platform/WebString.h" 13 #include "third_party/WebKit/public/platform/WebString.h"
17 14
18 namespace content { 15 namespace content {
19 16
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
20 namespace { 46 namespace {
21 47
22 void InitializeWebkitTrack(webrtc::MediaStreamTrackInterface* track, 48 void InitializeWebkitTrack(webrtc::MediaStreamTrackInterface* track,
23 blink::WebMediaStreamTrack* webkit_track, 49 blink::WebMediaStreamTrack* webkit_track,
24 blink::WebMediaStreamSource::Type type) { 50 blink::WebMediaStreamSource::Type type) {
25 blink::WebMediaStreamSource webkit_source; 51 blink::WebMediaStreamSource webkit_source;
26 blink::WebString webkit_track_id(base::UTF8ToUTF16(track->id())); 52 blink::WebString webkit_track_id(base::UTF8ToUTF16(track->id()));
27 53
28 webkit_source.initialize(webkit_track_id, type, webkit_track_id); 54 webkit_source.initialize(webkit_track_id, type, webkit_track_id);
29 webkit_track->initialize(webkit_track_id, webkit_source); 55 webkit_track->initialize(webkit_track_id, webkit_source);
30 56 content::MediaStreamDependencyFactory::AddNativeTrackToBlinkTrack(
31 MediaStreamDependencyFactory* factory = NULL; 57 track, *webkit_track, false);
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 }
55 } 58 }
56 59
57 } // namespace 60 content::RemoteMediaStreamTrackObserver* FindTrackObserver(
58 61 webrtc::MediaStreamTrackInterface* track,
59 // Base class used for mapping between webrtc and blink MediaStream tracks. 62 const ScopedVector<content::RemoteMediaStreamTrackObserver>& observers) {
60 // An instance of a RemoteMediaStreamTrackAdapter is stored in 63 ScopedVector<content::RemoteMediaStreamTrackObserver>::const_iterator it =
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 =
91 observers.begin(); 64 observers.begin();
92 for (; it != observers.end(); ++it) { 65 for (; it != observers.end(); ++it) {
93 if ((*it)->observed_track() == track) 66 if ((*it)->observered_track() == track)
94 return *it; 67 return *it;
95 } 68 }
96 return NULL; 69 return NULL;
97 } 70 }
98 71
99 // RemoteAudioMediaStreamTrackAdapter is responsible for listening on state 72 } // namespace anonymous
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();
111 73
112 private: 74 namespace content {
113 // webrtc::ObserverInterface implementation.
114 virtual void OnChanged() OVERRIDE;
115 75
116 webrtc::MediaStreamTrackInterface::TrackState state_; 76 RemoteMediaStreamTrackObserver::RemoteMediaStreamTrackObserver(
117
118 DISALLOW_COPY_AND_ASSIGN(RemoteAudioMediaStreamTrackAdapter);
119 };
120
121 RemoteAudioMediaStreamTrackAdapter::RemoteAudioMediaStreamTrackAdapter(
122 webrtc::MediaStreamTrackInterface* webrtc_track, 77 webrtc::MediaStreamTrackInterface* webrtc_track,
123 const blink::WebMediaStreamTrack& webkit_track) 78 const blink::WebMediaStreamTrack& webkit_track)
124 : RemoteMediaStreamTrackAdapter(webrtc_track, webkit_track), 79 : state_(webrtc_track->state()),
125 state_(observed_track()->state()) { 80 webrtc_track_(webrtc_track),
126 observed_track()->RegisterObserver(this); 81 webkit_track_(webkit_track) {
82 webrtc_track->RegisterObserver(this);
127 } 83 }
128 84
129 RemoteAudioMediaStreamTrackAdapter::~RemoteAudioMediaStreamTrackAdapter() { 85 RemoteMediaStreamTrackObserver::~RemoteMediaStreamTrackObserver() {
130 observed_track()->UnregisterObserver(this); 86 webrtc_track_->UnregisterObserver(this);
131 } 87 }
132 88
133 void RemoteAudioMediaStreamTrackAdapter::OnChanged() { 89 void RemoteMediaStreamTrackObserver::OnChanged() {
134 DCHECK(CalledOnValidThread()); 90 DCHECK(CalledOnValidThread());
135 91
136 webrtc::MediaStreamTrackInterface::TrackState state = 92 webrtc::MediaStreamTrackInterface::TrackState state = webrtc_track_->state();
137 observed_track()->state();
138 if (state == state_) 93 if (state == state_)
139 return; 94 return;
140 95
141 state_ = state; 96 state_ = state;
142 switch (state) { 97 switch (state) {
143 case webrtc::MediaStreamTrackInterface::kInitializing: 98 case webrtc::MediaStreamTrackInterface::kInitializing:
144 // Ignore the kInitializing state since there is no match in 99 // Ignore the kInitializing state since there is no match in
145 // WebMediaStreamSource::ReadyState. 100 // WebMediaStreamSource::ReadyState.
146 break; 101 break;
147 case webrtc::MediaStreamTrackInterface::kLive: 102 case webrtc::MediaStreamTrackInterface::kLive:
148 webkit_track().source().setReadyState( 103 webkit_track_.source().setReadyState(
149 blink::WebMediaStreamSource::ReadyStateLive); 104 blink::WebMediaStreamSource::ReadyStateLive);
150 break; 105 break;
151 case webrtc::MediaStreamTrackInterface::kEnded: 106 case webrtc::MediaStreamTrackInterface::kEnded:
152 webkit_track().source().setReadyState( 107 webkit_track_.source().setReadyState(
153 blink::WebMediaStreamSource::ReadyStateEnded); 108 blink::WebMediaStreamSource::ReadyStateEnded);
154 break; 109 break;
155 default: 110 default:
156 NOTREACHED(); 111 NOTREACHED();
157 break; 112 break;
158 } 113 }
159 } 114 }
160 115
161 RemoteMediaStreamImpl::RemoteMediaStreamImpl( 116 RemoteMediaStreamImpl::RemoteMediaStreamImpl(
162 webrtc::MediaStreamInterface* webrtc_stream) 117 webrtc::MediaStreamInterface* webrtc_stream)
163 : webrtc_stream_(webrtc_stream) { 118 : webrtc_stream_(webrtc_stream) {
164 webrtc_stream_->RegisterObserver(this); 119 webrtc_stream_->RegisterObserver(this);
165 120
166 webrtc::AudioTrackVector webrtc_audio_tracks = 121 webrtc::AudioTrackVector webrtc_audio_tracks =
167 webrtc_stream_->GetAudioTracks(); 122 webrtc_stream_->GetAudioTracks();
168 blink::WebVector<blink::WebMediaStreamTrack> webkit_audio_tracks( 123 blink::WebVector<blink::WebMediaStreamTrack> webkit_audio_tracks(
169 webrtc_audio_tracks.size()); 124 webrtc_audio_tracks.size());
170 125
171 // Initialize WebKit audio tracks. 126 // Initialize WebKit audio tracks.
172 size_t i = 0; 127 size_t i = 0;
173 for (; i < webrtc_audio_tracks.size(); ++i) { 128 for (; i < webrtc_audio_tracks.size(); ++i) {
174 webrtc::AudioTrackInterface* audio_track = webrtc_audio_tracks[i]; 129 webrtc::AudioTrackInterface* audio_track = webrtc_audio_tracks[i];
175 DCHECK(audio_track); 130 DCHECK(audio_track);
176 InitializeWebkitTrack(audio_track, &webkit_audio_tracks[i], 131 InitializeWebkitTrack(audio_track, &webkit_audio_tracks[i],
177 blink::WebMediaStreamSource::TypeAudio); 132 blink::WebMediaStreamSource::TypeAudio);
178 audio_track_observers_.push_back( 133 audio_track_observers_.push_back(
179 new RemoteAudioMediaStreamTrackAdapter(audio_track, 134 new RemoteMediaStreamTrackObserver(audio_track,
180 webkit_audio_tracks[i])); 135 webkit_audio_tracks[i]));
181 } 136 }
182 137
183 // Initialize WebKit video tracks. 138 // Initialize WebKit video tracks.
184 webrtc::VideoTrackVector webrtc_video_tracks = 139 webrtc::VideoTrackVector webrtc_video_tracks =
185 webrtc_stream_->GetVideoTracks(); 140 webrtc_stream_->GetVideoTracks();
186 blink::WebVector<blink::WebMediaStreamTrack> webkit_video_tracks( 141 blink::WebVector<blink::WebMediaStreamTrack> webkit_video_tracks(
187 webrtc_video_tracks.size()); 142 webrtc_video_tracks.size());
188 for (i = 0; i < webrtc_video_tracks.size(); ++i) { 143 for (i = 0; i < webrtc_video_tracks.size(); ++i) {
189 webrtc::VideoTrackInterface* video_track = webrtc_video_tracks[i]; 144 webrtc::VideoTrackInterface* video_track = webrtc_video_tracks[i];
190 DCHECK(video_track); 145 DCHECK(video_track);
191 InitializeWebkitTrack(video_track, &webkit_video_tracks[i], 146 InitializeWebkitTrack(video_track, &webkit_video_tracks[i],
192 blink::WebMediaStreamSource::TypeVideo); 147 blink::WebMediaStreamSource::TypeVideo);
193 video_track_observers_.push_back( 148 video_track_observers_.push_back(
194 new RemoteMediaStreamTrackAdapter(video_track, 149 new RemoteMediaStreamTrackObserver(video_track,
195 webkit_video_tracks[i])); 150 webkit_video_tracks[i]));
196 } 151 }
197 152
198 webkit_stream_.initialize(base::UTF8ToUTF16(webrtc_stream->label()), 153 webkit_stream_.initialize(base::UTF8ToUTF16(webrtc_stream->label()),
199 webkit_audio_tracks, webkit_video_tracks); 154 webkit_audio_tracks, webkit_video_tracks);
200 webkit_stream_.setExtraData(new MediaStream(webrtc_stream)); 155 webkit_stream_.setExtraData(new MediaStream(webrtc_stream));
201 } 156 }
202 157
203 RemoteMediaStreamImpl::~RemoteMediaStreamImpl() { 158 RemoteMediaStreamImpl::~RemoteMediaStreamImpl() {
204 webrtc_stream_->UnregisterObserver(this); 159 webrtc_stream_->UnregisterObserver(this);
205 } 160 }
206 161
207 void RemoteMediaStreamImpl::OnChanged() { 162 void RemoteMediaStreamImpl::OnChanged() {
208 // Find removed audio tracks. 163 // Find removed audio tracks.
209 ScopedVector<RemoteMediaStreamTrackAdapter>::iterator audio_it = 164 ScopedVector<RemoteMediaStreamTrackObserver>::iterator audio_it =
210 audio_track_observers_.begin(); 165 audio_track_observers_.begin();
211 while (audio_it != audio_track_observers_.end()) { 166 while (audio_it != audio_track_observers_.end()) {
212 std::string track_id = (*audio_it)->observed_track()->id(); 167 std::string track_id = (*audio_it)->observered_track()->id();
213 if (webrtc_stream_->FindAudioTrack(track_id) == NULL) { 168 if (webrtc_stream_->FindAudioTrack(track_id) == NULL) {
214 webkit_stream_.removeTrack((*audio_it)->webkit_track()); 169 webkit_stream_.removeTrack((*audio_it)->webkit_track());
215 audio_it = audio_track_observers_.erase(audio_it); 170 audio_it = audio_track_observers_.erase(audio_it);
216 } else { 171 } else {
217 ++audio_it; 172 ++audio_it;
218 } 173 }
219 } 174 }
220 175
221 // Find removed video tracks. 176 // Find removed video tracks.
222 ScopedVector<RemoteMediaStreamTrackAdapter>::iterator video_it = 177 ScopedVector<RemoteMediaStreamTrackObserver>::iterator video_it =
223 video_track_observers_.begin(); 178 video_track_observers_.begin();
224 while (video_it != video_track_observers_.end()) { 179 while (video_it != video_track_observers_.end()) {
225 std::string track_id = (*video_it)->observed_track()->id(); 180 std::string track_id = (*video_it)->observered_track()->id();
226 if (webrtc_stream_->FindVideoTrack(track_id) == NULL) { 181 if (webrtc_stream_->FindVideoTrack(track_id) == NULL) {
227 webkit_stream_.removeTrack((*video_it)->webkit_track()); 182 webkit_stream_.removeTrack((*video_it)->webkit_track());
228 video_it = video_track_observers_.erase(video_it); 183 video_it = video_track_observers_.erase(video_it);
229 } else { 184 } else {
230 ++video_it; 185 ++video_it;
231 } 186 }
232 } 187 }
233 188
234 // Find added audio tracks. 189 // Find added audio tracks.
235 webrtc::AudioTrackVector webrtc_audio_tracks = 190 webrtc::AudioTrackVector webrtc_audio_tracks =
236 webrtc_stream_->GetAudioTracks(); 191 webrtc_stream_->GetAudioTracks();
237 for (webrtc::AudioTrackVector::iterator it = webrtc_audio_tracks.begin(); 192 for (webrtc::AudioTrackVector::iterator it = webrtc_audio_tracks.begin();
238 it != webrtc_audio_tracks.end(); ++it) { 193 it != webrtc_audio_tracks.end(); ++it) {
239 if (!FindTrackObserver(*it, audio_track_observers_)) { 194 if (!FindTrackObserver(*it, audio_track_observers_)) {
240 blink::WebMediaStreamTrack new_track; 195 blink::WebMediaStreamTrack new_track;
241 InitializeWebkitTrack(*it, &new_track, 196 InitializeWebkitTrack(*it, &new_track,
242 blink::WebMediaStreamSource::TypeAudio); 197 blink::WebMediaStreamSource::TypeAudio);
243 audio_track_observers_.push_back( 198 audio_track_observers_.push_back(
244 new RemoteAudioMediaStreamTrackAdapter(*it, new_track)); 199 new RemoteMediaStreamTrackObserver(*it, new_track));
245 webkit_stream_.addTrack(new_track); 200 webkit_stream_.addTrack(new_track);
246 } 201 }
247 } 202 }
248 203
249 // Find added video tracks. 204 // Find added video tracks.
250 webrtc::VideoTrackVector webrtc_video_tracks = 205 webrtc::VideoTrackVector webrtc_video_tracks =
251 webrtc_stream_->GetVideoTracks(); 206 webrtc_stream_->GetVideoTracks();
252 for (webrtc::VideoTrackVector::iterator it = webrtc_video_tracks.begin(); 207 for (webrtc::VideoTrackVector::iterator it = webrtc_video_tracks.begin();
253 it != webrtc_video_tracks.end(); ++it) { 208 it != webrtc_video_tracks.end(); ++it) {
254 if (!FindTrackObserver(*it, video_track_observers_)) { 209 if (!FindTrackObserver(*it, video_track_observers_)) {
255 blink::WebMediaStreamTrack new_track; 210 blink::WebMediaStreamTrack new_track;
256 InitializeWebkitTrack(*it, &new_track, 211 InitializeWebkitTrack(*it, &new_track,
257 blink::WebMediaStreamSource::TypeVideo); 212 blink::WebMediaStreamSource::TypeVideo);
258 video_track_observers_.push_back( 213 video_track_observers_.push_back(
259 new RemoteMediaStreamTrackAdapter(*it, new_track)); 214 new RemoteMediaStreamTrackObserver(*it, new_track));
260 webkit_stream_.addTrack(new_track); 215 webkit_stream_.addTrack(new_track);
261 } 216 }
262 } 217 }
263 } 218 }
264 219
265 } // namespace content 220 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698