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 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
82 { | 82 { |
83 MediaStreamTrackVector audioTracks; | 83 MediaStreamTrackVector audioTracks; |
84 MediaStreamTrackVector videoTracks; | 84 MediaStreamTrackVector videoTracks; |
85 | 85 |
86 for (size_t i = 0; i < tracks.size(); ++i) | 86 for (size_t i = 0; i < tracks.size(); ++i) |
87 processTrack(tracks[i].get(), tracks[i]->kind() == "audio" ? audioTracks : videoTracks); | 87 processTrack(tracks[i].get(), tracks[i]->kind() == "audio" ? audioTracks : videoTracks); |
88 | 88 |
89 return new MediaStream(context, audioTracks, videoTracks); | 89 return new MediaStream(context, audioTracks, videoTracks); |
90 } | 90 } |
91 | 91 |
92 MediaStream* MediaStream::create(ExecutionContext* context, PassRefPtr<MediaStre amDescriptor> streamDescriptor) | 92 MediaStream* MediaStream::create(ExecutionContext* context, MediaStreamDescripto r* streamDescriptor) |
93 { | 93 { |
94 return new MediaStream(context, streamDescriptor); | 94 return new MediaStream(context, streamDescriptor); |
95 } | 95 } |
96 | 96 |
97 MediaStream::MediaStream(ExecutionContext* context, PassRefPtr<MediaStreamDescri ptor> streamDescriptor) | 97 MediaStream::MediaStream(ExecutionContext* context, MediaStreamDescriptor* strea mDescriptor) |
98 : ContextLifecycleObserver(context) | 98 : ContextLifecycleObserver(context) |
99 , m_stopped(false) | 99 , m_stopped(false) |
100 , m_descriptor(streamDescriptor) | 100 , m_descriptor(streamDescriptor) |
101 , m_scheduledEventTimer(this, &MediaStream::scheduledEventTimerFired) | 101 , m_scheduledEventTimer(this, &MediaStream::scheduledEventTimerFired) |
102 { | 102 { |
103 m_descriptor->setClient(this); | 103 m_descriptor->setClient(this); |
104 | 104 |
105 size_t numberOfAudioTracks = m_descriptor->numberOfAudioComponents(); | 105 size_t numberOfAudioTracks = m_descriptor->numberOfAudioComponents(); |
106 m_audioTracks.reserveCapacity(numberOfAudioTracks); | 106 m_audioTracks.reserveCapacity(numberOfAudioTracks); |
107 for (size_t i = 0; i < numberOfAudioTracks; i++) { | 107 for (size_t i = 0; i < numberOfAudioTracks; i++) { |
(...skipping 28 matching lines...) Expand all Loading... | |
136 (*iter)->registerMediaStream(this); | 136 (*iter)->registerMediaStream(this); |
137 audioComponents.append((*iter)->component()); | 137 audioComponents.append((*iter)->component()); |
138 } | 138 } |
139 for (iter = videoTracks.begin(); iter != videoTracks.end(); ++iter) { | 139 for (iter = videoTracks.begin(); iter != videoTracks.end(); ++iter) { |
140 (*iter)->registerMediaStream(this); | 140 (*iter)->registerMediaStream(this); |
141 videoComponents.append((*iter)->component()); | 141 videoComponents.append((*iter)->component()); |
142 } | 142 } |
143 | 143 |
144 m_descriptor = MediaStreamDescriptor::create(audioComponents, videoComponent s); | 144 m_descriptor = MediaStreamDescriptor::create(audioComponents, videoComponent s); |
145 m_descriptor->setClient(this); | 145 m_descriptor->setClient(this); |
146 MediaStreamCenter::instance().didCreateMediaStream(m_descriptor.get()); | 146 MediaStreamCenter::instance().didCreateMediaStream(m_descriptor); |
147 | 147 |
148 m_audioTracks = audioTracks; | 148 m_audioTracks = audioTracks; |
149 m_videoTracks = videoTracks; | 149 m_videoTracks = videoTracks; |
150 if (emptyOrOnlyEndedTracks()) { | 150 if (emptyOrOnlyEndedTracks()) { |
151 m_descriptor->setActive(false); | 151 m_descriptor->setActive(false); |
152 } | 152 } |
153 } | 153 } |
154 | 154 |
155 MediaStream::~MediaStream() | 155 MediaStream::~MediaStream() |
156 { | 156 { |
157 m_descriptor->setClient(0); | 157 m_descriptor->setClient(0); |
haraken
2015/10/02 04:35:09
You must not touch m_descriptor in the destructor.
peria
2015/10/02 05:48:54
Done.
sof
2015/10/02 05:55:19
MediaStream is eagerly finalized, so I'm not sure
peria
2015/10/02 06:25:35
We can do it with using a pre-finalizer with eager
| |
158 } | 158 } |
159 | 159 |
160 bool MediaStream::emptyOrOnlyEndedTracks() | 160 bool MediaStream::emptyOrOnlyEndedTracks() |
161 { | 161 { |
162 if (!m_audioTracks.size() && !m_videoTracks.size()) { | 162 if (!m_audioTracks.size() && !m_videoTracks.size()) { |
163 return true; | 163 return true; |
164 } | 164 } |
165 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter != m_audioTracks.end(); ++iter) { | 165 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter != m_audioTracks.end(); ++iter) { |
166 if (!iter->get()->ended()) | 166 if (!iter->get()->ended()) |
167 return false; | 167 return false; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
202 break; | 202 break; |
203 } | 203 } |
204 track->registerMediaStream(this); | 204 track->registerMediaStream(this); |
205 m_descriptor->addComponent(track->component()); | 205 m_descriptor->addComponent(track->component()); |
206 | 206 |
207 if (!active() && !track->ended()) { | 207 if (!active() && !track->ended()) { |
208 m_descriptor->setActive(true); | 208 m_descriptor->setActive(true); |
209 scheduleDispatchEvent(Event::create(EventTypeNames::active)); | 209 scheduleDispatchEvent(Event::create(EventTypeNames::active)); |
210 } | 210 } |
211 | 211 |
212 MediaStreamCenter::instance().didAddMediaStreamTrack(m_descriptor.get(), tra ck->component()); | 212 MediaStreamCenter::instance().didAddMediaStreamTrack(m_descriptor, track->co mponent()); |
213 } | 213 } |
214 | 214 |
215 void MediaStream::removeTrack(MediaStreamTrack* track, ExceptionState& exception State) | 215 void MediaStream::removeTrack(MediaStreamTrack* track, ExceptionState& exception State) |
216 { | 216 { |
217 if (!track) { | 217 if (!track) { |
218 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac k provided is invalid."); | 218 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac k provided is invalid."); |
219 return; | 219 return; |
220 } | 220 } |
221 | 221 |
222 size_t pos = kNotFound; | 222 size_t pos = kNotFound; |
(...skipping 13 matching lines...) Expand all Loading... | |
236 if (pos == kNotFound) | 236 if (pos == kNotFound) |
237 return; | 237 return; |
238 track->unregisterMediaStream(this); | 238 track->unregisterMediaStream(this); |
239 m_descriptor->removeComponent(track->component()); | 239 m_descriptor->removeComponent(track->component()); |
240 | 240 |
241 if (active() && emptyOrOnlyEndedTracks()) { | 241 if (active() && emptyOrOnlyEndedTracks()) { |
242 m_descriptor->setActive(false); | 242 m_descriptor->setActive(false); |
243 scheduleDispatchEvent(Event::create(EventTypeNames::inactive)); | 243 scheduleDispatchEvent(Event::create(EventTypeNames::inactive)); |
244 } | 244 } |
245 | 245 |
246 MediaStreamCenter::instance().didRemoveMediaStreamTrack(m_descriptor.get(), track->component()); | 246 MediaStreamCenter::instance().didRemoveMediaStreamTrack(m_descriptor, track- >component()); |
247 } | 247 } |
248 | 248 |
249 MediaStreamTrack* MediaStream::getTrackById(String id) | 249 MediaStreamTrack* MediaStream::getTrackById(String id) |
250 { | 250 { |
251 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter != m_audioTracks.end(); ++iter) { | 251 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter != m_audioTracks.end(); ++iter) { |
252 if ((*iter)->id() == id) | 252 if ((*iter)->id() == id) |
253 return iter->get(); | 253 return iter->get(); |
254 } | 254 } |
255 | 255 |
256 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter != m_videoTracks.end(); ++iter) { | 256 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter != m_videoTracks.end(); ++iter) { |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
405 | 405 |
406 URLRegistry& MediaStream::registry() const | 406 URLRegistry& MediaStream::registry() const |
407 { | 407 { |
408 return MediaStreamRegistry::registry(); | 408 return MediaStreamRegistry::registry(); |
409 } | 409 } |
410 | 410 |
411 DEFINE_TRACE(MediaStream) | 411 DEFINE_TRACE(MediaStream) |
412 { | 412 { |
413 visitor->trace(m_audioTracks); | 413 visitor->trace(m_audioTracks); |
414 visitor->trace(m_videoTracks); | 414 visitor->trace(m_videoTracks); |
415 visitor->trace(m_descriptor); | |
415 visitor->trace(m_scheduledEvents); | 416 visitor->trace(m_scheduledEvents); |
416 RefCountedGarbageCollectedEventTargetWithInlineData<MediaStream>::trace(visi tor); | 417 RefCountedGarbageCollectedEventTargetWithInlineData<MediaStream>::trace(visi tor); |
417 ContextLifecycleObserver::trace(visitor); | 418 ContextLifecycleObserver::trace(visitor); |
418 } | 419 } |
419 | 420 |
420 } // namespace blink | 421 } // namespace blink |
OLD | NEW |