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 |