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

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: rebase 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
« no previous file with comments | « Source/modules/mediastream/MediaStream.h ('k') | Source/modules/mediastream/MediaStream.idl » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 (ended())
286 return; 307 return;
287 308
309 if (active()) {
310 m_descriptor->setActive(false);
311 scheduleDispatchEvent(Event::create(EventTypeNames::inactive));
312 }
288 m_descriptor->setEnded(); 313 m_descriptor->setEnded();
289 scheduleDispatchEvent(Event::create(EventTypeNames::ended)); 314 scheduleDispatchEvent(Event::create(EventTypeNames::ended));
290 } 315 }
291 316
292 void MediaStream::contextDestroyed() 317 void MediaStream::contextDestroyed()
293 { 318 {
294 ContextLifecycleObserver::contextDestroyed(); 319 ContextLifecycleObserver::contextDestroyed();
295 m_stopped = true; 320 m_stopped = true;
296 } 321 }
297 322
(...skipping 19 matching lines...) Expand all
317 m_audioTracks.append(track); 342 m_audioTracks.append(track);
318 break; 343 break;
319 case MediaStreamSource::TypeVideo: 344 case MediaStreamSource::TypeVideo:
320 m_videoTracks.append(track); 345 m_videoTracks.append(track);
321 break; 346 break;
322 } 347 }
323 track->registerMediaStream(this); 348 track->registerMediaStream(this);
324 m_descriptor->addComponent(component); 349 m_descriptor->addComponent(component);
325 350
326 scheduleDispatchEvent(MediaStreamTrackEvent::create(EventTypeNames::addtrack , false, false, track)); 351 scheduleDispatchEvent(MediaStreamTrackEvent::create(EventTypeNames::addtrack , false, false, track));
352
353 if (!active() && !track->ended()) {
354 m_descriptor->setActive(true);
355 scheduleDispatchEvent(Event::create(EventTypeNames::active));
356 }
327 } 357 }
328 358
329 void MediaStream::removeRemoteTrack(MediaStreamComponent* component) 359 void MediaStream::removeRemoteTrack(MediaStreamComponent* component)
330 { 360 {
361 ASSERT(component);
331 if (m_stopped) 362 if (m_stopped)
332 return; 363 return;
333 364
334 MediaStreamTrackVector* tracks = 0; 365 MediaStreamTrackVector* tracks = 0;
335 switch (component->source()->type()) { 366 switch (component->source()->type()) {
336 case MediaStreamSource::TypeAudio: 367 case MediaStreamSource::TypeAudio:
337 tracks = &m_audioTracks; 368 tracks = &m_audioTracks;
338 break; 369 break;
339 case MediaStreamSource::TypeVideo: 370 case MediaStreamSource::TypeVideo:
340 tracks = &m_videoTracks; 371 tracks = &m_videoTracks;
341 break; 372 break;
342 } 373 }
343 374
344 size_t index = kNotFound; 375 size_t index = kNotFound;
345 for (size_t i = 0; i < tracks->size(); ++i) { 376 for (size_t i = 0; i < tracks->size(); ++i) {
346 if ((*tracks)[i]->component() == component) { 377 if ((*tracks)[i]->component() == component) {
347 index = i; 378 index = i;
348 break; 379 break;
349 } 380 }
350 } 381 }
351 if (index == kNotFound) 382 if (index == kNotFound)
352 return; 383 return;
353 384
354 m_descriptor->removeComponent(component); 385 m_descriptor->removeComponent(component);
355 386
356 MediaStreamTrack* track = (*tracks)[index]; 387 MediaStreamTrack* track = (*tracks)[index];
357 track->unregisterMediaStream(this); 388 track->unregisterMediaStream(this);
358 tracks->remove(index); 389 tracks->remove(index);
359 scheduleDispatchEvent(MediaStreamTrackEvent::create(EventTypeNames::removetr ack, false, false, track)); 390 scheduleDispatchEvent(MediaStreamTrackEvent::create(EventTypeNames::removetr ack, false, false, track));
391
392 if (active() && emptyOrOnlyEndedTracks()) {
393 m_descriptor->setActive(false);
394 scheduleDispatchEvent(Event::create(EventTypeNames::inactive));
395 }
360 } 396 }
361 397
362 void MediaStream::scheduleDispatchEvent(PassRefPtrWillBeRawPtr<Event> event) 398 void MediaStream::scheduleDispatchEvent(PassRefPtrWillBeRawPtr<Event> event)
363 { 399 {
364 m_scheduledEvents.append(event); 400 m_scheduledEvents.append(event);
365 401
366 if (!m_scheduledEventTimer.isActive()) 402 if (!m_scheduledEventTimer.isActive())
367 m_scheduledEventTimer.startOneShot(0, FROM_HERE); 403 m_scheduledEventTimer.startOneShot(0, FROM_HERE);
368 } 404 }
369 405
(...skipping 20 matching lines...) Expand all
390 void MediaStream::trace(Visitor* visitor) 426 void MediaStream::trace(Visitor* visitor)
391 { 427 {
392 visitor->trace(m_audioTracks); 428 visitor->trace(m_audioTracks);
393 visitor->trace(m_videoTracks); 429 visitor->trace(m_videoTracks);
394 visitor->trace(m_scheduledEvents); 430 visitor->trace(m_scheduledEvents);
395 RefCountedGarbageCollectedEventTargetWithInlineData<MediaStream>::trace(visi tor); 431 RefCountedGarbageCollectedEventTargetWithInlineData<MediaStream>::trace(visi tor);
396 ContextLifecycleObserver::trace(visitor); 432 ContextLifecycleObserver::trace(visitor);
397 } 433 }
398 434
399 } // namespace blink 435 } // namespace blink
OLDNEW
« no previous file with comments | « Source/modules/mediastream/MediaStream.h ('k') | Source/modules/mediastream/MediaStream.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698