Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: Source/modules/mediastream/MediaStream.cpp

Issue 827673002: Add MediaStream.active attribute (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Allow addTrack/removeTrack when mediastream.ended is true Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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());
193 MediaStreamCenter::instance().didAddMediaStreamTrack(m_descriptor.get(), tra ck->component()); 211 MediaStreamCenter::instance().didAddMediaStreamTrack(m_descriptor.get(), tra ck->component());
perkj_chrome 2015/01/13 08:24:31 please let MediaStreamCenter::instance().didAddMed
jiajia.qin 2015/01/13 10:42:30 Done.
212
213 if (!active() && !track->ended()) {
214 m_descriptor->setActive(true);
215 scheduleDispatchEvent(Event::create(EventTypeNames::active));
216 }
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()) {
199 exceptionState.throwDOMException(InvalidStateError, "The MediaStream is finished.");
200 return;
201 }
202
203 if (!track) { 221 if (!track) {
204 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac k provided is invalid."); 222 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac k provided is invalid.");
205 return; 223 return;
206 } 224 }
207 225
208 size_t pos = kNotFound; 226 size_t pos = kNotFound;
209 switch (track->component()->source()->type()) { 227 switch (track->component()->source()->type()) {
210 case MediaStreamSource::TypeAudio: 228 case MediaStreamSource::TypeAudio:
211 pos = m_audioTracks.find(track); 229 pos = m_audioTracks.find(track);
212 if (pos != kNotFound) 230 if (pos != kNotFound)
213 m_audioTracks.remove(pos); 231 m_audioTracks.remove(pos);
214 break; 232 break;
215 case MediaStreamSource::TypeVideo: 233 case MediaStreamSource::TypeVideo:
216 pos = m_videoTracks.find(track); 234 pos = m_videoTracks.find(track);
217 if (pos != kNotFound) 235 if (pos != kNotFound)
218 m_videoTracks.remove(pos); 236 m_videoTracks.remove(pos);
219 break; 237 break;
220 } 238 }
221 239
222 if (pos == kNotFound) 240 if (pos == kNotFound)
223 return; 241 return;
224 track->unregisterMediaStream(this); 242 track->unregisterMediaStream(this);
225 m_descriptor->removeComponent(track->component()); 243 m_descriptor->removeComponent(track->component());
244 MediaStreamCenter::instance().didRemoveMediaStreamTrack(m_descriptor.get(), track->component());
226 245
227 if (!m_audioTracks.size() && !m_videoTracks.size()) 246 if (active() && emptyOrOnlyEndedTracks()) {
perkj_chrome 2015/01/13 08:24:31 dito. Please call MediaStreamCenter::instance().d
jiajia.qin 2015/01/13 10:42:30 Done.
228 m_descriptor->setEnded(); 247 m_descriptor->setActive(false);
229 248 scheduleDispatchEvent(Event::create(EventTypeNames::inactive));
230 MediaStreamCenter::instance().didRemoveMediaStreamTrack(m_descriptor.get(), track->component()); 249 }
231 } 250 }
232 251
233 MediaStreamTrack* MediaStream::getTrackById(String id) 252 MediaStreamTrack* MediaStream::getTrackById(String id)
234 { 253 {
235 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter != m_audioTracks.end(); ++iter) { 254 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter != m_audioTracks.end(); ++iter) {
236 if ((*iter)->id() == id) 255 if ((*iter)->id() == id)
237 return iter->get(); 256 return iter->get();
238 } 257 }
239 258
240 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter != m_videoTracks.end(); ++iter) { 259 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter != m_videoTracks.end(); ++iter) {
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter != m_videoTracks.end(); ++iter) { 294 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter != m_videoTracks.end(); ++iter) {
276 if (!(*iter)->ended()) 295 if (!(*iter)->ended())
277 return; 296 return;
278 } 297 }
279 298
280 streamEnded(); 299 streamEnded();
281 } 300 }
282 301
283 void MediaStream::streamEnded() 302 void MediaStream::streamEnded()
284 { 303 {
285 if (ended()) 304 if (!active())
286 return; 305 return;
287 306
307 m_descriptor->setActive(false);
288 m_descriptor->setEnded(); 308 m_descriptor->setEnded();
309 scheduleDispatchEvent(Event::create(EventTypeNames::inactive));
289 scheduleDispatchEvent(Event::create(EventTypeNames::ended)); 310 scheduleDispatchEvent(Event::create(EventTypeNames::ended));
290 } 311 }
291 312
292 void MediaStream::contextDestroyed() 313 void MediaStream::contextDestroyed()
293 { 314 {
294 ContextLifecycleObserver::contextDestroyed(); 315 ContextLifecycleObserver::contextDestroyed();
295 m_stopped = true; 316 m_stopped = true;
317 m_descriptor->setActive(false);
perkj_chrome 2015/01/13 08:24:31 is this necessary?
jiajia.qin 2015/01/13 10:42:30 Done.
296 } 318 }
297 319
298 const AtomicString& MediaStream::interfaceName() const 320 const AtomicString& MediaStream::interfaceName() const
299 { 321 {
300 return EventTargetNames::MediaStream; 322 return EventTargetNames::MediaStream;
301 } 323 }
302 324
303 ExecutionContext* MediaStream::executionContext() const 325 ExecutionContext* MediaStream::executionContext() const
304 { 326 {
305 return ContextLifecycleObserver::executionContext(); 327 return ContextLifecycleObserver::executionContext();
306 } 328 }
307 329
308 void MediaStream::addRemoteTrack(MediaStreamComponent* component) 330 void MediaStream::addRemoteTrack(MediaStreamComponent* component)
309 { 331 {
310 ASSERT(component); 332 ASSERT(component);
311 if (ended())
312 return;
313 333
314 MediaStreamTrack* track = MediaStreamTrack::create(executionContext(), compo nent); 334 MediaStreamTrack* track = MediaStreamTrack::create(executionContext(), compo nent);
315 switch (component->source()->type()) { 335 switch (component->source()->type()) {
316 case MediaStreamSource::TypeAudio: 336 case MediaStreamSource::TypeAudio:
317 m_audioTracks.append(track); 337 m_audioTracks.append(track);
318 break; 338 break;
319 case MediaStreamSource::TypeVideo: 339 case MediaStreamSource::TypeVideo:
320 m_videoTracks.append(track); 340 m_videoTracks.append(track);
321 break; 341 break;
322 } 342 }
323 track->registerMediaStream(this); 343 track->registerMediaStream(this);
324 m_descriptor->addComponent(component); 344 m_descriptor->addComponent(component);
325 345
326 scheduleDispatchEvent(MediaStreamTrackEvent::create(EventTypeNames::addtrack , false, false, track)); 346 scheduleDispatchEvent(MediaStreamTrackEvent::create(EventTypeNames::addtrack , false, false, track));
perkj_chrome 2015/01/13 08:24:31 You should check and active state here as well. di
jiajia.qin 2015/01/13 10:42:30 Done.
327 } 347 }
328 348
329 void MediaStream::removeRemoteTrack(MediaStreamComponent* component) 349 void MediaStream::removeRemoteTrack(MediaStreamComponent* component)
330 { 350 {
331 if (m_stopped) 351 ASSERT(component);
332 return;
333 352
334 MediaStreamTrackVector* tracks = 0; 353 MediaStreamTrackVector* tracks = 0;
335 switch (component->source()->type()) { 354 switch (component->source()->type()) {
336 case MediaStreamSource::TypeAudio: 355 case MediaStreamSource::TypeAudio:
337 tracks = &m_audioTracks; 356 tracks = &m_audioTracks;
338 break; 357 break;
339 case MediaStreamSource::TypeVideo: 358 case MediaStreamSource::TypeVideo:
340 tracks = &m_videoTracks; 359 tracks = &m_videoTracks;
341 break; 360 break;
342 } 361 }
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 408
390 void MediaStream::trace(Visitor* visitor) 409 void MediaStream::trace(Visitor* visitor)
391 { 410 {
392 visitor->trace(m_audioTracks); 411 visitor->trace(m_audioTracks);
393 visitor->trace(m_videoTracks); 412 visitor->trace(m_videoTracks);
394 visitor->trace(m_scheduledEvents); 413 visitor->trace(m_scheduledEvents);
395 RefCountedGarbageCollectedEventTargetWithInlineData<MediaStream>::trace(visi tor); 414 RefCountedGarbageCollectedEventTargetWithInlineData<MediaStream>::trace(visi tor);
396 } 415 }
397 416
398 } // namespace blink 417 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698