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

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: Fix error in patch set 4 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->setActive(false);
123 }
120 } 124 }
121 125
122 MediaStream::MediaStream(ExecutionContext* context, const MediaStreamTrackVector & audioTracks, const MediaStreamTrackVector& videoTracks) 126 MediaStream::MediaStream(ExecutionContext* context, const MediaStreamTrackVector & audioTracks, const MediaStreamTrackVector& videoTracks)
123 : ContextLifecycleObserver(context) 127 : ContextLifecycleObserver(context)
124 , m_stopped(false) 128 , m_stopped(false)
125 , m_scheduledEventTimer(this, &MediaStream::scheduledEventTimerFired) 129 , m_scheduledEventTimer(this, &MediaStream::scheduledEventTimerFired)
126 { 130 {
127 MediaStreamComponentVector audioComponents; 131 MediaStreamComponentVector audioComponents;
128 MediaStreamComponentVector videoComponents; 132 MediaStreamComponentVector videoComponents;
129 133
130 MediaStreamTrackVector::const_iterator iter; 134 MediaStreamTrackVector::const_iterator iter;
131 for (iter = audioTracks.begin(); iter != audioTracks.end(); ++iter) { 135 for (iter = audioTracks.begin(); iter != audioTracks.end(); ++iter) {
132 (*iter)->registerMediaStream(this); 136 (*iter)->registerMediaStream(this);
133 audioComponents.append((*iter)->component()); 137 audioComponents.append((*iter)->component());
134 } 138 }
135 for (iter = videoTracks.begin(); iter != videoTracks.end(); ++iter) { 139 for (iter = videoTracks.begin(); iter != videoTracks.end(); ++iter) {
136 (*iter)->registerMediaStream(this); 140 (*iter)->registerMediaStream(this);
137 videoComponents.append((*iter)->component()); 141 videoComponents.append((*iter)->component());
138 } 142 }
139 143
140 m_descriptor = MediaStreamDescriptor::create(audioComponents, videoComponent s); 144 m_descriptor = MediaStreamDescriptor::create(audioComponents, videoComponent s);
141 m_descriptor->setClient(this); 145 m_descriptor->setClient(this);
142 MediaStreamCenter::instance().didCreateMediaStream(m_descriptor.get()); 146 MediaStreamCenter::instance().didCreateMediaStream(m_descriptor.get());
143 147
144 m_audioTracks = audioTracks; 148 m_audioTracks = audioTracks;
145 m_videoTracks = videoTracks; 149 m_videoTracks = videoTracks;
150 if (emptyOrOnlyEndedTracks()) {
151 m_descriptor->setActive(false);
152 }
146 } 153 }
147 154
148 MediaStream::~MediaStream() 155 MediaStream::~MediaStream()
149 { 156 {
150 m_descriptor->setClient(0); 157 m_descriptor->setClient(0);
151 } 158 }
152 159
160 bool MediaStream::emptyOrOnlyEndedTracks()
161 {
162 if (!m_audioTracks.size() && !m_videoTracks.size()) {
163 return true;
164 }
165 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter != m_audioTracks.end(); ++iter) {
166 if (!iter->get()->ended())
167 return false;
168 }
169 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter != m_videoTracks.end(); ++iter) {
170 if (!iter->get()->ended())
171 return false;
172 }
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()) {
171 exceptionState.throwDOMException(InvalidStateError, "The MediaStream is finished.");
172 return;
173 }
174
175 if (!track) { 193 if (!track) {
176 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac k provided is invalid."); 194 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac k provided is invalid.");
177 return; 195 return;
178 } 196 }
179 197
180 if (getTrackById(track->id())) 198 if (getTrackById(track->id()))
181 return; 199 return;
182 200
183 switch (track->component()->source()->type()) { 201 switch (track->component()->source()->type()) {
184 case MediaStreamSource::TypeAudio: 202 case MediaStreamSource::TypeAudio:
185 m_audioTracks.append(track); 203 m_audioTracks.append(track);
186 break; 204 break;
187 case MediaStreamSource::TypeVideo: 205 case MediaStreamSource::TypeVideo:
188 m_videoTracks.append(track); 206 m_videoTracks.append(track);
189 break; 207 break;
190 } 208 }
191 track->registerMediaStream(this); 209 track->registerMediaStream(this);
192 m_descriptor->addComponent(track->component()); 210 m_descriptor->addComponent(track->component());
211
212 if (!active() && !track->ended()) {
213 m_descriptor->setActive(true);
214 scheduleDispatchEvent(Event::create(EventTypeNames::active));
215 }
216
193 MediaStreamCenter::instance().didAddMediaStreamTrack(m_descriptor.get(), tra ck->component()); 217 MediaStreamCenter::instance().didAddMediaStreamTrack(m_descriptor.get(), tra ck->component());
194 } 218 }
195 219
196 void MediaStream::removeTrack(MediaStreamTrack* track, ExceptionState& exception State) 220 void MediaStream::removeTrack(MediaStreamTrack* track, ExceptionState& exception State)
197 { 221 {
198 if (ended()) {
199 exceptionState.throwDOMException(InvalidStateError, "The MediaStream is finished.");
200 return;
201 }
202
203 if (!track) { 222 if (!track) {
204 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac k provided is invalid."); 223 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac k provided is invalid.");
205 return; 224 return;
206 } 225 }
207 226
208 size_t pos = kNotFound; 227 size_t pos = kNotFound;
209 switch (track->component()->source()->type()) { 228 switch (track->component()->source()->type()) {
210 case MediaStreamSource::TypeAudio: 229 case MediaStreamSource::TypeAudio:
211 pos = m_audioTracks.find(track); 230 pos = m_audioTracks.find(track);
212 if (pos != kNotFound) 231 if (pos != kNotFound)
213 m_audioTracks.remove(pos); 232 m_audioTracks.remove(pos);
214 break; 233 break;
215 case MediaStreamSource::TypeVideo: 234 case MediaStreamSource::TypeVideo:
216 pos = m_videoTracks.find(track); 235 pos = m_videoTracks.find(track);
217 if (pos != kNotFound) 236 if (pos != kNotFound)
218 m_videoTracks.remove(pos); 237 m_videoTracks.remove(pos);
219 break; 238 break;
220 } 239 }
221 240
222 if (pos == kNotFound) 241 if (pos == kNotFound)
223 return; 242 return;
224 track->unregisterMediaStream(this); 243 track->unregisterMediaStream(this);
225 m_descriptor->removeComponent(track->component()); 244 m_descriptor->removeComponent(track->component());
226 245
227 if (!m_audioTracks.size() && !m_videoTracks.size()) 246 if (active() && emptyOrOnlyEndedTracks()) {
228 m_descriptor->setEnded(); 247 m_descriptor->setActive(false);
248 scheduleDispatchEvent(Event::create(EventTypeNames::inactive));
249 }
229 250
230 MediaStreamCenter::instance().didRemoveMediaStreamTrack(m_descriptor.get(), track->component()); 251 MediaStreamCenter::instance().didRemoveMediaStreamTrack(m_descriptor.get(), track->component());
231 } 252 }
232 253
233 MediaStreamTrack* MediaStream::getTrackById(String id) 254 MediaStreamTrack* MediaStream::getTrackById(String id)
234 { 255 {
235 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter != m_audioTracks.end(); ++iter) { 256 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter != m_audioTracks.end(); ++iter) {
236 if ((*iter)->id() == id) 257 if ((*iter)->id() == id)
237 return iter->get(); 258 return iter->get();
238 } 259 }
(...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) { 296 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter != m_videoTracks.end(); ++iter) {
276 if (!(*iter)->ended()) 297 if (!(*iter)->ended())
277 return; 298 return;
278 } 299 }
279 300
280 streamEnded(); 301 streamEnded();
281 } 302 }
282 303
283 void MediaStream::streamEnded() 304 void MediaStream::streamEnded()
284 { 305 {
285 if (ended()) 306 if (!active())
hta - Chromium 2015/01/14 14:12:02 Wrong test. Ended streams (as previously defined)
286 return; 307 return;
287 308
309 m_descriptor->setActive(false);
288 m_descriptor->setEnded(); 310 m_descriptor->setEnded();
311 scheduleDispatchEvent(Event::create(EventTypeNames::inactive));
289 scheduleDispatchEvent(Event::create(EventTypeNames::ended)); 312 scheduleDispatchEvent(Event::create(EventTypeNames::ended));
290 } 313 }
291 314
292 void MediaStream::contextDestroyed() 315 void MediaStream::contextDestroyed()
293 { 316 {
294 ContextLifecycleObserver::contextDestroyed(); 317 ContextLifecycleObserver::contextDestroyed();
295 m_stopped = true; 318 m_stopped = true;
296 } 319 }
297 320
298 const AtomicString& MediaStream::interfaceName() const 321 const AtomicString& MediaStream::interfaceName() const
299 { 322 {
300 return EventTargetNames::MediaStream; 323 return EventTargetNames::MediaStream;
301 } 324 }
302 325
303 ExecutionContext* MediaStream::executionContext() const 326 ExecutionContext* MediaStream::executionContext() const
304 { 327 {
305 return ContextLifecycleObserver::executionContext(); 328 return ContextLifecycleObserver::executionContext();
306 } 329 }
307 330
308 void MediaStream::addRemoteTrack(MediaStreamComponent* component) 331 void MediaStream::addRemoteTrack(MediaStreamComponent* component)
309 { 332 {
310 ASSERT(component); 333 ASSERT(component);
311 if (ended())
312 return;
hta - Chromium 2015/01/14 14:12:02 Until we delete the ended code altogether, keep th
313 334
314 MediaStreamTrack* track = MediaStreamTrack::create(executionContext(), compo nent); 335 MediaStreamTrack* track = MediaStreamTrack::create(executionContext(), compo nent);
315 switch (component->source()->type()) { 336 switch (component->source()->type()) {
316 case MediaStreamSource::TypeAudio: 337 case MediaStreamSource::TypeAudio:
317 m_audioTracks.append(track); 338 m_audioTracks.append(track);
318 break; 339 break;
319 case MediaStreamSource::TypeVideo: 340 case MediaStreamSource::TypeVideo:
320 m_videoTracks.append(track); 341 m_videoTracks.append(track);
321 break; 342 break;
322 } 343 }
323 track->registerMediaStream(this); 344 track->registerMediaStream(this);
324 m_descriptor->addComponent(component); 345 m_descriptor->addComponent(component);
325 346
326 scheduleDispatchEvent(MediaStreamTrackEvent::create(EventTypeNames::addtrack , false, false, track)); 347 scheduleDispatchEvent(MediaStreamTrackEvent::create(EventTypeNames::addtrack , false, false, track));
348
349 if (!active() && !track->ended()) {
350 m_descriptor->setActive(true);
351 scheduleDispatchEvent(Event::create(EventTypeNames::active));
352 }
327 } 353 }
328 354
329 void MediaStream::removeRemoteTrack(MediaStreamComponent* component) 355 void MediaStream::removeRemoteTrack(MediaStreamComponent* component)
330 { 356 {
331 if (m_stopped) 357 ASSERT(component);
332 return;
hta - Chromium 2015/01/14 14:12:02 m_stopped is not relevant to either active or ende
333 358
334 MediaStreamTrackVector* tracks = 0; 359 MediaStreamTrackVector* tracks = 0;
335 switch (component->source()->type()) { 360 switch (component->source()->type()) {
336 case MediaStreamSource::TypeAudio: 361 case MediaStreamSource::TypeAudio:
337 tracks = &m_audioTracks; 362 tracks = &m_audioTracks;
338 break; 363 break;
339 case MediaStreamSource::TypeVideo: 364 case MediaStreamSource::TypeVideo:
340 tracks = &m_videoTracks; 365 tracks = &m_videoTracks;
341 break; 366 break;
342 } 367 }
343 368
344 size_t index = kNotFound; 369 size_t index = kNotFound;
345 for (size_t i = 0; i < tracks->size(); ++i) { 370 for (size_t i = 0; i < tracks->size(); ++i) {
346 if ((*tracks)[i]->component() == component) { 371 if ((*tracks)[i]->component() == component) {
347 index = i; 372 index = i;
348 break; 373 break;
349 } 374 }
350 } 375 }
351 if (index == kNotFound) 376 if (index == kNotFound)
352 return; 377 return;
353 378
354 m_descriptor->removeComponent(component); 379 m_descriptor->removeComponent(component);
355 380
356 MediaStreamTrack* track = (*tracks)[index]; 381 MediaStreamTrack* track = (*tracks)[index];
357 track->unregisterMediaStream(this); 382 track->unregisterMediaStream(this);
358 tracks->remove(index); 383 tracks->remove(index);
359 scheduleDispatchEvent(MediaStreamTrackEvent::create(EventTypeNames::removetr ack, false, false, track)); 384 scheduleDispatchEvent(MediaStreamTrackEvent::create(EventTypeNames::removetr ack, false, false, track));
385
386 if (active() && emptyOrOnlyEndedTracks()) {
387 m_descriptor->setActive(false);
388 scheduleDispatchEvent(Event::create(EventTypeNames::inactive));
389 }
360 } 390 }
361 391
362 void MediaStream::scheduleDispatchEvent(PassRefPtrWillBeRawPtr<Event> event) 392 void MediaStream::scheduleDispatchEvent(PassRefPtrWillBeRawPtr<Event> event)
363 { 393 {
364 m_scheduledEvents.append(event); 394 m_scheduledEvents.append(event);
365 395
366 if (!m_scheduledEventTimer.isActive()) 396 if (!m_scheduledEventTimer.isActive())
367 m_scheduledEventTimer.startOneShot(0, FROM_HERE); 397 m_scheduledEventTimer.startOneShot(0, FROM_HERE);
368 } 398 }
369 399
(...skipping 19 matching lines...) Expand all
389 419
390 void MediaStream::trace(Visitor* visitor) 420 void MediaStream::trace(Visitor* visitor)
391 { 421 {
392 visitor->trace(m_audioTracks); 422 visitor->trace(m_audioTracks);
393 visitor->trace(m_videoTracks); 423 visitor->trace(m_videoTracks);
394 visitor->trace(m_scheduledEvents); 424 visitor->trace(m_scheduledEvents);
395 RefCountedGarbageCollectedEventTargetWithInlineData<MediaStream>::trace(visi tor); 425 RefCountedGarbageCollectedEventTargetWithInlineData<MediaStream>::trace(visi tor);
396 } 426 }
397 427
398 } // namespace blink 428 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698