Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |