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

Side by Side Diff: Source/modules/mediastream/MediaStream.cpp

Issue 827673002: Add MediaStream.active attribute (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: add MediaStream.active attribute Created 5 years, 11 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * Copyright (C) 2011, 2012 Ericsson AB. All rights reserved. 3 * Copyright (C) 2011, 2012 Ericsson AB. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 m_audioTracks.append(newTrack); 110 m_audioTracks.append(newTrack);
111 } 111 }
112 112
113 size_t numberOfVideoTracks = m_descriptor->numberOfVideoComponents(); 113 size_t numberOfVideoTracks = m_descriptor->numberOfVideoComponents();
114 m_videoTracks.reserveCapacity(numberOfVideoTracks); 114 m_videoTracks.reserveCapacity(numberOfVideoTracks);
115 for (size_t i = 0; i < numberOfVideoTracks; i++) { 115 for (size_t i = 0; i < numberOfVideoTracks; i++) {
116 MediaStreamTrack* newTrack = MediaStreamTrack::create(context, m_descrip tor->videoComponent(i)); 116 MediaStreamTrack* newTrack = MediaStreamTrack::create(context, m_descrip tor->videoComponent(i));
117 newTrack->registerMediaStream(this); 117 newTrack->registerMediaStream(this);
118 m_videoTracks.append(newTrack); 118 m_videoTracks.append(newTrack);
119 } 119 }
120
121 if (emptyOrOnlyEndedTracks()) {
122 m_descriptor->setEnded();
perkj_chrome 2015/01/12 11:22:19 should setEnded be removed? If I understand the
123 m_descriptor->setActive(false);
124 }
120 } 125 }
121 126
122 MediaStream::MediaStream(ExecutionContext* context, const MediaStreamTrackVector & audioTracks, const MediaStreamTrackVector& videoTracks) 127 MediaStream::MediaStream(ExecutionContext* context, const MediaStreamTrackVector & audioTracks, const MediaStreamTrackVector& videoTracks)
123 : ContextLifecycleObserver(context) 128 : ContextLifecycleObserver(context)
124 , m_stopped(false) 129 , m_stopped(false)
125 , m_scheduledEventTimer(this, &MediaStream::scheduledEventTimerFired) 130 , m_scheduledEventTimer(this, &MediaStream::scheduledEventTimerFired)
126 { 131 {
127 MediaStreamComponentVector audioComponents; 132 MediaStreamComponentVector audioComponents;
128 MediaStreamComponentVector videoComponents; 133 MediaStreamComponentVector videoComponents;
129 134
130 MediaStreamTrackVector::const_iterator iter; 135 MediaStreamTrackVector::const_iterator iter;
131 for (iter = audioTracks.begin(); iter != audioTracks.end(); ++iter) { 136 for (iter = audioTracks.begin(); iter != audioTracks.end(); ++iter) {
132 (*iter)->registerMediaStream(this); 137 (*iter)->registerMediaStream(this);
133 audioComponents.append((*iter)->component()); 138 audioComponents.append((*iter)->component());
134 } 139 }
135 for (iter = videoTracks.begin(); iter != videoTracks.end(); ++iter) { 140 for (iter = videoTracks.begin(); iter != videoTracks.end(); ++iter) {
136 (*iter)->registerMediaStream(this); 141 (*iter)->registerMediaStream(this);
137 videoComponents.append((*iter)->component()); 142 videoComponents.append((*iter)->component());
138 } 143 }
139 144
140 m_descriptor = MediaStreamDescriptor::create(audioComponents, videoComponent s); 145 m_descriptor = MediaStreamDescriptor::create(audioComponents, videoComponent s);
141 m_descriptor->setClient(this); 146 m_descriptor->setClient(this);
142 MediaStreamCenter::instance().didCreateMediaStream(m_descriptor.get()); 147 MediaStreamCenter::instance().didCreateMediaStream(m_descriptor.get());
143 148
144 m_audioTracks = audioTracks; 149 m_audioTracks = audioTracks;
145 m_videoTracks = videoTracks; 150 m_videoTracks = videoTracks;
151 if (emptyOrOnlyEndedTracks()) {
152 m_descriptor->setEnded();
153 m_descriptor->setActive(false);
154 }
146 } 155 }
147 156
148 MediaStream::~MediaStream() 157 MediaStream::~MediaStream()
149 { 158 {
150 m_descriptor->setClient(0); 159 m_descriptor->setClient(0);
151 } 160 }
152 161
162 bool MediaStream::emptyOrOnlyEndedTracks()
163 {
164 if (!m_audioTracks.size() && !m_videoTracks.size()) {
165 return true;
166 }
167 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter !=
perkj_chrome 2015/01/12 11:22:19 it looks like this this line is not complete? At l
168 if (!iter->get()->ended())
169 return false;
170 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter !=
171 if (!iter->get()->ended())
172 return false;
173 return true;
174 }
175
153 bool MediaStream::ended() const 176 bool MediaStream::ended() const
154 { 177 {
155 return m_stopped || m_descriptor->ended(); 178 return m_stopped || m_descriptor->ended();
156 } 179 }
157 180
158 MediaStreamTrackVector MediaStream::getTracks() 181 MediaStreamTrackVector MediaStream::getTracks()
159 { 182 {
160 MediaStreamTrackVector tracks; 183 MediaStreamTrackVector tracks;
161 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter != m_audioTracks.end(); ++iter) 184 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter != m_audioTracks.end(); ++iter)
162 tracks.append(iter->get()); 185 tracks.append(iter->get());
163 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter != m_videoTracks.end(); ++iter) 186 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter != m_videoTracks.end(); ++iter)
164 tracks.append(iter->get()); 187 tracks.append(iter->get());
165 return tracks; 188 return tracks;
166 } 189 }
167 190
168 void MediaStream::addTrack(MediaStreamTrack* track, ExceptionState& exceptionSta te) 191 void MediaStream::addTrack(MediaStreamTrack* track, ExceptionState& exceptionSta te)
169 { 192 {
170 if (ended()) { 193 if (!active()) {
perkj_chrome 2015/01/12 11:22:19 Adding a track if the state is inactive should too
171 exceptionState.throwDOMException(InvalidStateError, "The MediaStream is finished."); 194 exceptionState.throwDOMException(InvalidStateError, "The MediaStream is inactive.");
172 return; 195 return;
173 } 196 }
174 197
175 if (!track) { 198 if (!track) {
176 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac k provided is invalid."); 199 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac k provided is invalid.");
177 return; 200 return;
178 } 201 }
179 202
180 if (getTrackById(track->id())) 203 if (getTrackById(track->id()))
181 return; 204 return;
182 205
183 switch (track->component()->source()->type()) { 206 switch (track->component()->source()->type()) {
184 case MediaStreamSource::TypeAudio: 207 case MediaStreamSource::TypeAudio:
185 m_audioTracks.append(track); 208 m_audioTracks.append(track);
186 break; 209 break;
187 case MediaStreamSource::TypeVideo: 210 case MediaStreamSource::TypeVideo:
188 m_videoTracks.append(track); 211 m_videoTracks.append(track);
189 break; 212 break;
190 } 213 }
191 track->registerMediaStream(this); 214 track->registerMediaStream(this);
192 m_descriptor->addComponent(track->component()); 215 m_descriptor->addComponent(track->component());
193 MediaStreamCenter::instance().didAddMediaStreamTrack(m_descriptor.get(), tra ck->component()); 216 MediaStreamCenter::instance().didAddMediaStreamTrack(m_descriptor.get(), tra ck->component());
194 } 217 }
195 218
196 void MediaStream::removeTrack(MediaStreamTrack* track, ExceptionState& exception State) 219 void MediaStream::removeTrack(MediaStreamTrack* track, ExceptionState& exception State)
197 { 220 {
198 if (ended()) { 221 if (!active()) {
199 exceptionState.throwDOMException(InvalidStateError, "The MediaStream is finished."); 222 exceptionState.throwDOMException(InvalidStateError, "The MediaStream is inactive.");
200 return; 223 return;
201 } 224 }
202 225
203 if (!track) { 226 if (!track) {
204 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac k provided is invalid."); 227 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac k provided is invalid.");
205 return; 228 return;
206 } 229 }
207 230
208 size_t pos = kNotFound; 231 size_t pos = kNotFound;
209 switch (track->component()->source()->type()) { 232 switch (track->component()->source()->type()) {
210 case MediaStreamSource::TypeAudio: 233 case MediaStreamSource::TypeAudio:
211 pos = m_audioTracks.find(track); 234 pos = m_audioTracks.find(track);
212 if (pos != kNotFound) 235 if (pos != kNotFound)
213 m_audioTracks.remove(pos); 236 m_audioTracks.remove(pos);
214 break; 237 break;
215 case MediaStreamSource::TypeVideo: 238 case MediaStreamSource::TypeVideo:
216 pos = m_videoTracks.find(track); 239 pos = m_videoTracks.find(track);
217 if (pos != kNotFound) 240 if (pos != kNotFound)
218 m_videoTracks.remove(pos); 241 m_videoTracks.remove(pos);
219 break; 242 break;
220 } 243 }
221 244
222 if (pos == kNotFound) 245 if (pos == kNotFound)
223 return; 246 return;
224 track->unregisterMediaStream(this); 247 track->unregisterMediaStream(this);
225 m_descriptor->removeComponent(track->component()); 248 m_descriptor->removeComponent(track->component());
226 249
227 if (!m_audioTracks.size() && !m_videoTracks.size()) 250 if (emptyOrOnlyEndedTracks()) {
228 m_descriptor->setEnded(); 251 m_descriptor->setEnded();
252 m_descriptor->setActive(false);
253 }
229 254
230 MediaStreamCenter::instance().didRemoveMediaStreamTrack(m_descriptor.get(), track->component()); 255 MediaStreamCenter::instance().didRemoveMediaStreamTrack(m_descriptor.get(), track->component());
231 } 256 }
232 257
233 MediaStreamTrack* MediaStream::getTrackById(String id) 258 MediaStreamTrack* MediaStream::getTrackById(String id)
234 { 259 {
235 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter != m_audioTracks.end(); ++iter) { 260 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter != m_audioTracks.end(); ++iter) {
236 if ((*iter)->id() == id) 261 if ((*iter)->id() == id)
237 return iter->get(); 262 return iter->get();
238 } 263 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter != m_videoTracks.end(); ++iter) { 300 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter != m_videoTracks.end(); ++iter) {
276 if (!(*iter)->ended()) 301 if (!(*iter)->ended())
277 return; 302 return;
278 } 303 }
279 304
280 streamEnded(); 305 streamEnded();
281 } 306 }
282 307
283 void MediaStream::streamEnded() 308 void MediaStream::streamEnded()
284 { 309 {
285 if (ended()) 310 if (!active())
286 return; 311 return;
287 312
313 m_descriptor->setActive(false);
288 m_descriptor->setEnded(); 314 m_descriptor->setEnded();
315 scheduleDispatchEvent(Event::create(EventTypeNames::inactive));
289 scheduleDispatchEvent(Event::create(EventTypeNames::ended)); 316 scheduleDispatchEvent(Event::create(EventTypeNames::ended));
290 } 317 }
291 318
292 void MediaStream::contextDestroyed() 319 void MediaStream::contextDestroyed()
293 { 320 {
294 ContextLifecycleObserver::contextDestroyed(); 321 ContextLifecycleObserver::contextDestroyed();
295 m_stopped = true; 322 m_stopped = true;
323 m_descriptor->setActive(false);
296 } 324 }
297 325
298 const AtomicString& MediaStream::interfaceName() const 326 const AtomicString& MediaStream::interfaceName() const
299 { 327 {
300 return EventTargetNames::MediaStream; 328 return EventTargetNames::MediaStream;
301 } 329 }
302 330
303 ExecutionContext* MediaStream::executionContext() const 331 ExecutionContext* MediaStream::executionContext() const
304 { 332 {
305 return ContextLifecycleObserver::executionContext(); 333 return ContextLifecycleObserver::executionContext();
306 } 334 }
307 335
308 void MediaStream::addRemoteTrack(MediaStreamComponent* component) 336 void MediaStream::addRemoteTrack(MediaStreamComponent* component)
309 { 337 {
310 ASSERT(component); 338 ASSERT(component);
311 if (ended()) 339 if (!active())
312 return; 340 return;
313 341
314 MediaStreamTrack* track = MediaStreamTrack::create(executionContext(), compo nent); 342 MediaStreamTrack* track = MediaStreamTrack::create(executionContext(), compo nent);
315 switch (component->source()->type()) { 343 switch (component->source()->type()) {
316 case MediaStreamSource::TypeAudio: 344 case MediaStreamSource::TypeAudio:
317 m_audioTracks.append(track); 345 m_audioTracks.append(track);
318 break; 346 break;
319 case MediaStreamSource::TypeVideo: 347 case MediaStreamSource::TypeVideo:
320 m_videoTracks.append(track); 348 m_videoTracks.append(track);
321 break; 349 break;
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 417
390 void MediaStream::trace(Visitor* visitor) 418 void MediaStream::trace(Visitor* visitor)
391 { 419 {
392 visitor->trace(m_audioTracks); 420 visitor->trace(m_audioTracks);
393 visitor->trace(m_videoTracks); 421 visitor->trace(m_videoTracks);
394 visitor->trace(m_scheduledEvents); 422 visitor->trace(m_scheduledEvents);
395 RefCountedGarbageCollectedEventTargetWithInlineData<MediaStream>::trace(visi tor); 423 RefCountedGarbageCollectedEventTargetWithInlineData<MediaStream>::trace(visi tor);
396 } 424 }
397 425
398 } // namespace blink 426 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698