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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |