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 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 108 : ContextDestructionObserver(context) | 108 : ContextDestructionObserver(context) |
| 109 , m_stopped(false) | 109 , m_stopped(false) |
| 110 , m_descriptor(streamDescriptor) | 110 , m_descriptor(streamDescriptor) |
| 111 , m_scheduledEventTimer(this, &MediaStream::scheduledEventTimerFired) | 111 , m_scheduledEventTimer(this, &MediaStream::scheduledEventTimerFired) |
| 112 { | 112 { |
| 113 m_descriptor->setClient(this); | 113 m_descriptor->setClient(this); |
| 114 | 114 |
| 115 size_t numberOfAudioTracks = m_descriptor->numberOfAudioComponents(); | 115 size_t numberOfAudioTracks = m_descriptor->numberOfAudioComponents(); |
| 116 m_audioTracks.reserveCapacity(numberOfAudioTracks); | 116 m_audioTracks.reserveCapacity(numberOfAudioTracks); |
| 117 for (size_t i = 0; i < numberOfAudioTracks; i++) | 117 for (size_t i = 0; i < numberOfAudioTracks; i++) |
| 118 m_audioTracks.append(MediaStreamTrack::create(context, m_descriptor->aud ioComponent(i))); | 118 m_audioTracks.append(MediaStreamTrack::create(context, m_descriptor->aud ioComponent(i), this)); |
| 119 | 119 |
| 120 size_t numberOfVideoTracks = m_descriptor->numberOfVideoComponents(); | 120 size_t numberOfVideoTracks = m_descriptor->numberOfVideoComponents(); |
| 121 m_videoTracks.reserveCapacity(numberOfVideoTracks); | 121 m_videoTracks.reserveCapacity(numberOfVideoTracks); |
| 122 for (size_t i = 0; i < numberOfVideoTracks; i++) | 122 for (size_t i = 0; i < numberOfVideoTracks; i++) |
| 123 m_videoTracks.append(MediaStreamTrack::create(context, m_descriptor->vid eoComponent(i))); | 123 m_videoTracks.append(MediaStreamTrack::create(context, m_descriptor->vid eoComponent(i), this)); |
| 124 } | 124 } |
| 125 | 125 |
| 126 MediaStream::~MediaStream() | 126 MediaStream::~MediaStream() |
| 127 { | 127 { |
| 128 m_descriptor->setClient(0); | 128 m_descriptor->setClient(0); |
| 129 | |
| 130 for (size_t i = 0; i < m_audioTracks.size(); ++i) | |
| 131 m_audioTracks[i]->clearStream(); | |
| 132 | |
| 133 for (size_t i = 0; i < m_videoTracks.size(); ++i) | |
| 134 m_videoTracks[i]->clearStream(); | |
| 129 } | 135 } |
| 130 | 136 |
| 131 bool MediaStream::ended() const | 137 bool MediaStream::ended() const |
| 132 { | 138 { |
| 133 return m_stopped || m_descriptor->ended(); | 139 return m_stopped || m_descriptor->ended(); |
| 134 } | 140 } |
| 135 | 141 |
| 136 void MediaStream::addTrack(PassRefPtr<MediaStreamTrack> prpTrack, ExceptionCode& ec) | 142 void MediaStream::addTrack(PassRefPtr<MediaStreamTrack> prpTrack, ExceptionCode& ec) |
| 137 { | 143 { |
| 138 if (ended()) { | 144 if (ended()) { |
| 139 ec = INVALID_STATE_ERR; | 145 ec = INVALID_STATE_ERR; |
| 140 return; | 146 return; |
| 141 } | 147 } |
| 142 | 148 |
| 143 if (!prpTrack) { | 149 if (!prpTrack) { |
| 144 ec = TYPE_MISMATCH_ERR; | 150 ec = TYPE_MISMATCH_ERR; |
| 145 return; | 151 return; |
| 146 } | 152 } |
| 147 | 153 |
| 148 RefPtr<MediaStreamTrack> track = prpTrack; | 154 RefPtr<MediaStreamTrack> track = prpTrack; |
| 149 | 155 |
| 150 if (getTrackById(track->id())) | 156 if (getTrackById(track->id())) |
| 151 return; | 157 return; |
| 152 | 158 |
| 153 RefPtr<MediaStreamComponent> component = MediaStreamComponent::create(m_desc riptor.get(), track->component()->source()); | 159 RefPtr<MediaStreamComponent> component = MediaStreamComponent::create(m_desc riptor.get(), track->component()->source()); |
| 154 RefPtr<MediaStreamTrack> newTrack = MediaStreamTrack::create(scriptExecution Context(), component.get()); | 160 RefPtr<MediaStreamTrack> newTrack = MediaStreamTrack::create(scriptExecution Context(), component.get(), this); |
| 155 | 161 |
| 156 switch (component->source()->type()) { | 162 switch (component->source()->type()) { |
| 157 case MediaStreamSource::TypeAudio: | 163 case MediaStreamSource::TypeAudio: |
| 158 m_descriptor->addAudioComponent(component.release()); | 164 m_descriptor->addAudioComponent(component.release()); |
| 159 m_audioTracks.append(newTrack); | 165 m_audioTracks.append(newTrack); |
| 160 break; | 166 break; |
| 161 case MediaStreamSource::TypeVideo: | 167 case MediaStreamSource::TypeVideo: |
| 162 m_descriptor->addVideoComponent(component.release()); | 168 m_descriptor->addVideoComponent(component.release()); |
| 163 m_videoTracks.append(newTrack); | 169 m_videoTracks.append(newTrack); |
| 164 break; | 170 break; |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 179 return; | 185 return; |
| 180 } | 186 } |
| 181 | 187 |
| 182 RefPtr<MediaStreamTrack> track = prpTrack; | 188 RefPtr<MediaStreamTrack> track = prpTrack; |
| 183 | 189 |
| 184 switch (track->component()->source()->type()) { | 190 switch (track->component()->source()->type()) { |
| 185 case MediaStreamSource::TypeAudio: { | 191 case MediaStreamSource::TypeAudio: { |
| 186 size_t pos = m_audioTracks.find(track); | 192 size_t pos = m_audioTracks.find(track); |
| 187 if (pos != notFound) { | 193 if (pos != notFound) { |
| 188 m_audioTracks.remove(pos); | 194 m_audioTracks.remove(pos); |
| 195 track->clearStream(); | |
| 189 m_descriptor->removeAudioComponent(track->component()); | 196 m_descriptor->removeAudioComponent(track->component()); |
| 190 } | 197 } |
| 191 break; | 198 break; |
| 192 } | 199 } |
| 193 case MediaStreamSource::TypeVideo: { | 200 case MediaStreamSource::TypeVideo: { |
| 194 size_t pos = m_videoTracks.find(track); | 201 size_t pos = m_videoTracks.find(track); |
| 195 if (pos != notFound) { | 202 if (pos != notFound) { |
| 196 m_videoTracks.remove(pos); | 203 m_videoTracks.remove(pos); |
| 204 track->clearStream(); | |
| 197 m_descriptor->removeVideoComponent(track->component()); | 205 m_descriptor->removeVideoComponent(track->component()); |
| 198 } | 206 } |
| 199 break; | 207 break; |
| 200 } | 208 } |
| 201 } | 209 } |
| 202 | 210 |
| 203 if (!m_audioTracks.size() && !m_videoTracks.size()) | 211 if (!m_audioTracks.size() && !m_videoTracks.size()) |
| 204 m_descriptor->setEnded(); | 212 m_descriptor->setEnded(); |
| 205 | 213 |
| 206 MediaStreamCenter::instance().didRemoveMediaStreamTrack(m_descriptor.get(), track->component()); | 214 MediaStreamCenter::instance().didRemoveMediaStreamTrack(m_descriptor.get(), track->component()); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 257 } | 265 } |
| 258 | 266 |
| 259 void MediaStream::addRemoteTrack(MediaStreamComponent* component) | 267 void MediaStream::addRemoteTrack(MediaStreamComponent* component) |
| 260 { | 268 { |
| 261 ASSERT(component && !component->stream()); | 269 ASSERT(component && !component->stream()); |
| 262 if (ended()) | 270 if (ended()) |
| 263 return; | 271 return; |
| 264 | 272 |
| 265 component->setStream(descriptor()); | 273 component->setStream(descriptor()); |
| 266 | 274 |
| 267 RefPtr<MediaStreamTrack> track = MediaStreamTrack::create(scriptExecutionCon text(), component); | 275 RefPtr<MediaStreamTrack> track = MediaStreamTrack::create(scriptExecutionCon text(), component, this); |
| 268 switch (component->source()->type()) { | 276 switch (component->source()->type()) { |
| 269 case MediaStreamSource::TypeAudio: | 277 case MediaStreamSource::TypeAudio: |
| 270 m_audioTracks.append(track); | 278 m_audioTracks.append(track); |
| 271 break; | 279 break; |
| 272 case MediaStreamSource::TypeVideo: | 280 case MediaStreamSource::TypeVideo: |
| 273 m_videoTracks.append(track); | 281 m_videoTracks.append(track); |
| 274 break; | 282 break; |
| 275 } | 283 } |
| 276 | 284 |
| 277 scheduleDispatchEvent(MediaStreamTrackEvent::create(eventNames().addtrackEve nt, false, false, track)); | 285 scheduleDispatchEvent(MediaStreamTrackEvent::create(eventNames().addtrackEve nt, false, false, track)); |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 297 if ((*tracks)[i]->component() == component) { | 305 if ((*tracks)[i]->component() == component) { |
| 298 index = i; | 306 index = i; |
| 299 break; | 307 break; |
| 300 } | 308 } |
| 301 } | 309 } |
| 302 if (index == notFound) | 310 if (index == notFound) |
| 303 return; | 311 return; |
| 304 | 312 |
| 305 RefPtr<MediaStreamTrack> track = (*tracks)[index]; | 313 RefPtr<MediaStreamTrack> track = (*tracks)[index]; |
| 306 tracks->remove(index); | 314 tracks->remove(index); |
| 315 track->clearStream(); | |
| 307 scheduleDispatchEvent(MediaStreamTrackEvent::create(eventNames().removetrack Event, false, false, track)); | 316 scheduleDispatchEvent(MediaStreamTrackEvent::create(eventNames().removetrack Event, false, false, track)); |
| 308 } | 317 } |
| 309 | 318 |
| 310 void MediaStream::scheduleDispatchEvent(PassRefPtr<Event> event) | 319 void MediaStream::scheduleDispatchEvent(PassRefPtr<Event> event) |
| 311 { | 320 { |
| 312 m_scheduledEvents.append(event); | 321 m_scheduledEvents.append(event); |
| 313 | 322 |
| 314 if (!m_scheduledEventTimer.isActive()) | 323 if (!m_scheduledEventTimer.isActive()) |
| 315 m_scheduledEventTimer.startOneShot(0); | 324 m_scheduledEventTimer.startOneShot(0); |
| 316 } | 325 } |
| 317 | 326 |
| 318 void MediaStream::scheduledEventTimerFired(Timer<MediaStream>*) | 327 void MediaStream::scheduledEventTimerFired(Timer<MediaStream>*) |
| 319 { | 328 { |
| 320 if (m_stopped) | 329 if (m_stopped) |
| 321 return; | 330 return; |
| 322 | 331 |
| 323 Vector<RefPtr<Event> > events; | 332 Vector<RefPtr<Event> > events; |
| 324 events.swap(m_scheduledEvents); | 333 events.swap(m_scheduledEvents); |
| 325 | 334 |
| 326 Vector<RefPtr<Event> >::iterator it = events.begin(); | 335 Vector<RefPtr<Event> >::iterator it = events.begin(); |
| 327 for (; it != events.end(); ++it) | 336 for (; it != events.end(); ++it) |
| 328 dispatchEvent((*it).release()); | 337 dispatchEvent((*it).release()); |
| 329 | 338 |
| 330 events.clear(); | 339 events.clear(); |
| 331 } | 340 } |
| 332 | 341 |
| 342 void MediaStream::didEndTrack() | |
|
eseidel
2013/04/09 06:42:25
If this dispatches synchronous javascript events,
Li Yin
2013/04/09 07:38:33
didEndTrack is only checking whether the event sho
| |
| 343 { | |
| 344 for (size_t i = 0; i < m_audioTracks.size(); ++i) | |
| 345 if (!m_audioTracks[i]->ended()) | |
| 346 return; | |
| 347 | |
| 348 for (size_t i = 0; i < m_videoTracks.size(); ++i) | |
| 349 if (!m_videoTracks[i]->ended()) | |
| 350 return; | |
| 351 | |
| 352 streamEnded(); | |
| 353 } | |
| 333 } // namespace WebCore | 354 } // namespace WebCore |
| 334 | 355 |
| 335 #endif // ENABLE(MEDIA_STREAM) | 356 #endif // ENABLE(MEDIA_STREAM) |
| OLD | NEW |