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->setEnded(); | |
perkj_chrome
2015/01/12 11:22:19
should setEnded be removed?
If I understand the
| |
123 m_descriptor->setActive(false); | |
124 } | |
120 } | 125 } |
121 | 126 |
122 MediaStream::MediaStream(ExecutionContext* context, const MediaStreamTrackVector & audioTracks, const MediaStreamTrackVector& videoTracks) | 127 MediaStream::MediaStream(ExecutionContext* context, const MediaStreamTrackVector & audioTracks, const MediaStreamTrackVector& videoTracks) |
123 : ContextLifecycleObserver(context) | 128 : ContextLifecycleObserver(context) |
124 , m_stopped(false) | 129 , m_stopped(false) |
125 , m_scheduledEventTimer(this, &MediaStream::scheduledEventTimerFired) | 130 , m_scheduledEventTimer(this, &MediaStream::scheduledEventTimerFired) |
126 { | 131 { |
127 MediaStreamComponentVector audioComponents; | 132 MediaStreamComponentVector audioComponents; |
128 MediaStreamComponentVector videoComponents; | 133 MediaStreamComponentVector videoComponents; |
129 | 134 |
130 MediaStreamTrackVector::const_iterator iter; | 135 MediaStreamTrackVector::const_iterator iter; |
131 for (iter = audioTracks.begin(); iter != audioTracks.end(); ++iter) { | 136 for (iter = audioTracks.begin(); iter != audioTracks.end(); ++iter) { |
132 (*iter)->registerMediaStream(this); | 137 (*iter)->registerMediaStream(this); |
133 audioComponents.append((*iter)->component()); | 138 audioComponents.append((*iter)->component()); |
134 } | 139 } |
135 for (iter = videoTracks.begin(); iter != videoTracks.end(); ++iter) { | 140 for (iter = videoTracks.begin(); iter != videoTracks.end(); ++iter) { |
136 (*iter)->registerMediaStream(this); | 141 (*iter)->registerMediaStream(this); |
137 videoComponents.append((*iter)->component()); | 142 videoComponents.append((*iter)->component()); |
138 } | 143 } |
139 | 144 |
140 m_descriptor = MediaStreamDescriptor::create(audioComponents, videoComponent s); | 145 m_descriptor = MediaStreamDescriptor::create(audioComponents, videoComponent s); |
141 m_descriptor->setClient(this); | 146 m_descriptor->setClient(this); |
142 MediaStreamCenter::instance().didCreateMediaStream(m_descriptor.get()); | 147 MediaStreamCenter::instance().didCreateMediaStream(m_descriptor.get()); |
143 | 148 |
144 m_audioTracks = audioTracks; | 149 m_audioTracks = audioTracks; |
145 m_videoTracks = videoTracks; | 150 m_videoTracks = videoTracks; |
151 if (emptyOrOnlyEndedTracks()) { | |
152 m_descriptor->setEnded(); | |
153 m_descriptor->setActive(false); | |
154 } | |
146 } | 155 } |
147 | 156 |
148 MediaStream::~MediaStream() | 157 MediaStream::~MediaStream() |
149 { | 158 { |
150 m_descriptor->setClient(0); | 159 m_descriptor->setClient(0); |
151 } | 160 } |
152 | 161 |
162 bool MediaStream::emptyOrOnlyEndedTracks() | |
163 { | |
164 if (!m_audioTracks.size() && !m_videoTracks.size()) { | |
165 return true; | |
166 } | |
167 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter != | |
perkj_chrome
2015/01/12 11:22:19
it looks like this this line is not complete? At l
| |
168 if (!iter->get()->ended()) | |
169 return false; | |
170 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter != | |
171 if (!iter->get()->ended()) | |
172 return false; | |
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()) { | 193 if (!active()) { |
perkj_chrome
2015/01/12 11:22:19
Adding a track if the state is inactive should too
| |
171 exceptionState.throwDOMException(InvalidStateError, "The MediaStream is finished."); | 194 exceptionState.throwDOMException(InvalidStateError, "The MediaStream is inactive."); |
172 return; | 195 return; |
173 } | 196 } |
174 | 197 |
175 if (!track) { | 198 if (!track) { |
176 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac k provided is invalid."); | 199 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac k provided is invalid."); |
177 return; | 200 return; |
178 } | 201 } |
179 | 202 |
180 if (getTrackById(track->id())) | 203 if (getTrackById(track->id())) |
181 return; | 204 return; |
182 | 205 |
183 switch (track->component()->source()->type()) { | 206 switch (track->component()->source()->type()) { |
184 case MediaStreamSource::TypeAudio: | 207 case MediaStreamSource::TypeAudio: |
185 m_audioTracks.append(track); | 208 m_audioTracks.append(track); |
186 break; | 209 break; |
187 case MediaStreamSource::TypeVideo: | 210 case MediaStreamSource::TypeVideo: |
188 m_videoTracks.append(track); | 211 m_videoTracks.append(track); |
189 break; | 212 break; |
190 } | 213 } |
191 track->registerMediaStream(this); | 214 track->registerMediaStream(this); |
192 m_descriptor->addComponent(track->component()); | 215 m_descriptor->addComponent(track->component()); |
193 MediaStreamCenter::instance().didAddMediaStreamTrack(m_descriptor.get(), tra ck->component()); | 216 MediaStreamCenter::instance().didAddMediaStreamTrack(m_descriptor.get(), tra ck->component()); |
194 } | 217 } |
195 | 218 |
196 void MediaStream::removeTrack(MediaStreamTrack* track, ExceptionState& exception State) | 219 void MediaStream::removeTrack(MediaStreamTrack* track, ExceptionState& exception State) |
197 { | 220 { |
198 if (ended()) { | 221 if (!active()) { |
199 exceptionState.throwDOMException(InvalidStateError, "The MediaStream is finished."); | 222 exceptionState.throwDOMException(InvalidStateError, "The MediaStream is inactive."); |
200 return; | 223 return; |
201 } | 224 } |
202 | 225 |
203 if (!track) { | 226 if (!track) { |
204 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac k provided is invalid."); | 227 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac k provided is invalid."); |
205 return; | 228 return; |
206 } | 229 } |
207 | 230 |
208 size_t pos = kNotFound; | 231 size_t pos = kNotFound; |
209 switch (track->component()->source()->type()) { | 232 switch (track->component()->source()->type()) { |
210 case MediaStreamSource::TypeAudio: | 233 case MediaStreamSource::TypeAudio: |
211 pos = m_audioTracks.find(track); | 234 pos = m_audioTracks.find(track); |
212 if (pos != kNotFound) | 235 if (pos != kNotFound) |
213 m_audioTracks.remove(pos); | 236 m_audioTracks.remove(pos); |
214 break; | 237 break; |
215 case MediaStreamSource::TypeVideo: | 238 case MediaStreamSource::TypeVideo: |
216 pos = m_videoTracks.find(track); | 239 pos = m_videoTracks.find(track); |
217 if (pos != kNotFound) | 240 if (pos != kNotFound) |
218 m_videoTracks.remove(pos); | 241 m_videoTracks.remove(pos); |
219 break; | 242 break; |
220 } | 243 } |
221 | 244 |
222 if (pos == kNotFound) | 245 if (pos == kNotFound) |
223 return; | 246 return; |
224 track->unregisterMediaStream(this); | 247 track->unregisterMediaStream(this); |
225 m_descriptor->removeComponent(track->component()); | 248 m_descriptor->removeComponent(track->component()); |
226 | 249 |
227 if (!m_audioTracks.size() && !m_videoTracks.size()) | 250 if (emptyOrOnlyEndedTracks()) { |
228 m_descriptor->setEnded(); | 251 m_descriptor->setEnded(); |
252 m_descriptor->setActive(false); | |
253 } | |
229 | 254 |
230 MediaStreamCenter::instance().didRemoveMediaStreamTrack(m_descriptor.get(), track->component()); | 255 MediaStreamCenter::instance().didRemoveMediaStreamTrack(m_descriptor.get(), track->component()); |
231 } | 256 } |
232 | 257 |
233 MediaStreamTrack* MediaStream::getTrackById(String id) | 258 MediaStreamTrack* MediaStream::getTrackById(String id) |
234 { | 259 { |
235 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter != m_audioTracks.end(); ++iter) { | 260 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter != m_audioTracks.end(); ++iter) { |
236 if ((*iter)->id() == id) | 261 if ((*iter)->id() == id) |
237 return iter->get(); | 262 return iter->get(); |
238 } | 263 } |
(...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) { | 300 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter != m_videoTracks.end(); ++iter) { |
276 if (!(*iter)->ended()) | 301 if (!(*iter)->ended()) |
277 return; | 302 return; |
278 } | 303 } |
279 | 304 |
280 streamEnded(); | 305 streamEnded(); |
281 } | 306 } |
282 | 307 |
283 void MediaStream::streamEnded() | 308 void MediaStream::streamEnded() |
284 { | 309 { |
285 if (ended()) | 310 if (!active()) |
286 return; | 311 return; |
287 | 312 |
313 m_descriptor->setActive(false); | |
288 m_descriptor->setEnded(); | 314 m_descriptor->setEnded(); |
315 scheduleDispatchEvent(Event::create(EventTypeNames::inactive)); | |
289 scheduleDispatchEvent(Event::create(EventTypeNames::ended)); | 316 scheduleDispatchEvent(Event::create(EventTypeNames::ended)); |
290 } | 317 } |
291 | 318 |
292 void MediaStream::contextDestroyed() | 319 void MediaStream::contextDestroyed() |
293 { | 320 { |
294 ContextLifecycleObserver::contextDestroyed(); | 321 ContextLifecycleObserver::contextDestroyed(); |
295 m_stopped = true; | 322 m_stopped = true; |
323 m_descriptor->setActive(false); | |
296 } | 324 } |
297 | 325 |
298 const AtomicString& MediaStream::interfaceName() const | 326 const AtomicString& MediaStream::interfaceName() const |
299 { | 327 { |
300 return EventTargetNames::MediaStream; | 328 return EventTargetNames::MediaStream; |
301 } | 329 } |
302 | 330 |
303 ExecutionContext* MediaStream::executionContext() const | 331 ExecutionContext* MediaStream::executionContext() const |
304 { | 332 { |
305 return ContextLifecycleObserver::executionContext(); | 333 return ContextLifecycleObserver::executionContext(); |
306 } | 334 } |
307 | 335 |
308 void MediaStream::addRemoteTrack(MediaStreamComponent* component) | 336 void MediaStream::addRemoteTrack(MediaStreamComponent* component) |
309 { | 337 { |
310 ASSERT(component); | 338 ASSERT(component); |
311 if (ended()) | 339 if (!active()) |
312 return; | 340 return; |
313 | 341 |
314 MediaStreamTrack* track = MediaStreamTrack::create(executionContext(), compo nent); | 342 MediaStreamTrack* track = MediaStreamTrack::create(executionContext(), compo nent); |
315 switch (component->source()->type()) { | 343 switch (component->source()->type()) { |
316 case MediaStreamSource::TypeAudio: | 344 case MediaStreamSource::TypeAudio: |
317 m_audioTracks.append(track); | 345 m_audioTracks.append(track); |
318 break; | 346 break; |
319 case MediaStreamSource::TypeVideo: | 347 case MediaStreamSource::TypeVideo: |
320 m_videoTracks.append(track); | 348 m_videoTracks.append(track); |
321 break; | 349 break; |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
389 | 417 |
390 void MediaStream::trace(Visitor* visitor) | 418 void MediaStream::trace(Visitor* visitor) |
391 { | 419 { |
392 visitor->trace(m_audioTracks); | 420 visitor->trace(m_audioTracks); |
393 visitor->trace(m_videoTracks); | 421 visitor->trace(m_videoTracks); |
394 visitor->trace(m_scheduledEvents); | 422 visitor->trace(m_scheduledEvents); |
395 RefCountedGarbageCollectedEventTargetWithInlineData<MediaStream>::trace(visi tor); | 423 RefCountedGarbageCollectedEventTargetWithInlineData<MediaStream>::trace(visi tor); |
396 } | 424 } |
397 | 425 |
398 } // namespace blink | 426 } // namespace blink |
OLD | NEW |