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]->setStream(0); | |
| 132 | |
| 133 for (size_t i = 0; i < m_videoTracks.size(); ++i) | |
| 134 m_videoTracks[i]->setStream(0); | |
| 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 13 matching lines...) Expand all Loading... | |
| 178 ec = TYPE_MISMATCH_ERR; | 184 ec = TYPE_MISMATCH_ERR; |
| 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); |
|
abarth-chromium
2013/04/08 16:58:41
Will |track| have a dangling reference to this Med
Li Yin
2013/04/09 03:11:54
Thanks for your reminder.
If we implement a wrap o
| |
| 189 m_descriptor->removeAudioComponent(track->component()); | 195 m_descriptor->removeAudioComponent(track->component()); |
| 190 } | 196 } |
| 191 break; | 197 break; |
| 192 } | 198 } |
| 193 case MediaStreamSource::TypeVideo: { | 199 case MediaStreamSource::TypeVideo: { |
| 194 size_t pos = m_videoTracks.find(track); | 200 size_t pos = m_videoTracks.find(track); |
| 195 if (pos != notFound) { | 201 if (pos != notFound) { |
| 196 m_videoTracks.remove(pos); | 202 m_videoTracks.remove(pos); |
| 197 m_descriptor->removeVideoComponent(track->component()); | 203 m_descriptor->removeVideoComponent(track->component()); |
| 198 } | 204 } |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 257 } | 263 } |
| 258 | 264 |
| 259 void MediaStream::addRemoteTrack(MediaStreamComponent* component) | 265 void MediaStream::addRemoteTrack(MediaStreamComponent* component) |
| 260 { | 266 { |
| 261 ASSERT(component && !component->stream()); | 267 ASSERT(component && !component->stream()); |
| 262 if (ended()) | 268 if (ended()) |
| 263 return; | 269 return; |
| 264 | 270 |
| 265 component->setStream(descriptor()); | 271 component->setStream(descriptor()); |
| 266 | 272 |
| 267 RefPtr<MediaStreamTrack> track = MediaStreamTrack::create(scriptExecutionCon text(), component); | 273 RefPtr<MediaStreamTrack> track = MediaStreamTrack::create(scriptExecutionCon text(), component, this); |
| 268 switch (component->source()->type()) { | 274 switch (component->source()->type()) { |
| 269 case MediaStreamSource::TypeAudio: | 275 case MediaStreamSource::TypeAudio: |
| 270 m_audioTracks.append(track); | 276 m_audioTracks.append(track); |
| 271 break; | 277 break; |
| 272 case MediaStreamSource::TypeVideo: | 278 case MediaStreamSource::TypeVideo: |
| 273 m_videoTracks.append(track); | 279 m_videoTracks.append(track); |
| 274 break; | 280 break; |
| 275 } | 281 } |
| 276 | 282 |
| 277 scheduleDispatchEvent(MediaStreamTrackEvent::create(eventNames().addtrackEve nt, false, false, track)); | 283 scheduleDispatchEvent(MediaStreamTrackEvent::create(eventNames().addtrackEve nt, false, false, track)); |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 296 for (size_t i = 0; i < tracks->size(); ++i) { | 302 for (size_t i = 0; i < tracks->size(); ++i) { |
| 297 if ((*tracks)[i]->component() == component) { | 303 if ((*tracks)[i]->component() == component) { |
| 298 index = i; | 304 index = i; |
| 299 break; | 305 break; |
| 300 } | 306 } |
| 301 } | 307 } |
| 302 if (index == notFound) | 308 if (index == notFound) |
| 303 return; | 309 return; |
| 304 | 310 |
| 305 RefPtr<MediaStreamTrack> track = (*tracks)[index]; | 311 RefPtr<MediaStreamTrack> track = (*tracks)[index]; |
| 306 tracks->remove(index); | 312 tracks->remove(index); |
|
abarth-chromium
2013/04/08 16:58:41
Here's another remove that might leave a dangling
| |
| 307 scheduleDispatchEvent(MediaStreamTrackEvent::create(eventNames().removetrack Event, false, false, track)); | 313 scheduleDispatchEvent(MediaStreamTrackEvent::create(eventNames().removetrack Event, false, false, track)); |
| 308 } | 314 } |
| 309 | 315 |
| 310 void MediaStream::scheduleDispatchEvent(PassRefPtr<Event> event) | 316 void MediaStream::scheduleDispatchEvent(PassRefPtr<Event> event) |
| 311 { | 317 { |
| 312 m_scheduledEvents.append(event); | 318 m_scheduledEvents.append(event); |
| 313 | 319 |
| 314 if (!m_scheduledEventTimer.isActive()) | 320 if (!m_scheduledEventTimer.isActive()) |
| 315 m_scheduledEventTimer.startOneShot(0); | 321 m_scheduledEventTimer.startOneShot(0); |
| 316 } | 322 } |
| 317 | 323 |
| 318 void MediaStream::scheduledEventTimerFired(Timer<MediaStream>*) | 324 void MediaStream::scheduledEventTimerFired(Timer<MediaStream>*) |
| 319 { | 325 { |
| 320 if (m_stopped) | 326 if (m_stopped) |
| 321 return; | 327 return; |
| 322 | 328 |
| 323 Vector<RefPtr<Event> > events; | 329 Vector<RefPtr<Event> > events; |
| 324 events.swap(m_scheduledEvents); | 330 events.swap(m_scheduledEvents); |
| 325 | 331 |
| 326 Vector<RefPtr<Event> >::iterator it = events.begin(); | 332 Vector<RefPtr<Event> >::iterator it = events.begin(); |
| 327 for (; it != events.end(); ++it) | 333 for (; it != events.end(); ++it) |
| 328 dispatchEvent((*it).release()); | 334 dispatchEvent((*it).release()); |
| 329 | 335 |
| 330 events.clear(); | 336 events.clear(); |
| 331 } | 337 } |
| 332 | 338 |
| 339 void MediaStream::trackEndedNotification() | |
| 340 { | |
| 341 for (size_t i = 0; i < m_audioTracks.size(); ++i) | |
| 342 if (!m_audioTracks[i]->ended()) | |
| 343 return; | |
| 344 | |
| 345 for (size_t i = 0; i < m_videoTracks.size(); ++i) | |
| 346 if (!m_videoTracks[i]->ended()) | |
| 347 return; | |
| 348 | |
| 349 streamEnded(); | |
| 350 } | |
| 333 } // namespace WebCore | 351 } // namespace WebCore |
| 334 | 352 |
| 335 #endif // ENABLE(MEDIA_STREAM) | 353 #endif // ENABLE(MEDIA_STREAM) |
| OLD | NEW |