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

Side by Side Diff: Source/WebCore/Modules/mediastream/MediaStream.cpp

Issue 13776002: MediaStream should fire ended event when all tracks are ended (Closed) Base URL: https://chromium.googlesource.com/chromium/blink@master
Patch Set: Created 7 years, 8 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 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 } 129 }
130 130
131 bool MediaStream::ended() const 131 bool MediaStream::ended() const
132 { 132 {
133 return m_stopped || m_descriptor->ended(); 133 return m_stopped || m_descriptor->ended();
(...skipping 10 matching lines...) Expand all
144 ec = TYPE_MISMATCH_ERR; 144 ec = TYPE_MISMATCH_ERR;
145 return; 145 return;
146 } 146 }
147 147
148 RefPtr<MediaStreamTrack> track = prpTrack; 148 RefPtr<MediaStreamTrack> track = prpTrack;
149 149
150 if (getTrackById(track->id())) 150 if (getTrackById(track->id()))
151 return; 151 return;
152 152
153 RefPtr<MediaStreamComponent> component = MediaStreamComponent::create(m_desc riptor.get(), track->component()->source()); 153 RefPtr<MediaStreamComponent> component = MediaStreamComponent::create(m_desc riptor.get(), track->component()->source());
154 RefPtr<MediaStreamTrack> newTrack = MediaStreamTrack::create(scriptExecution Context(), component.get()); 154 RefPtr<MediaStreamTrack> newTrack = MediaStreamTrack::create(scriptExecution Context(), component.get(), this);
155 155
156 switch (component->source()->type()) { 156 switch (component->source()->type()) {
157 case MediaStreamSource::TypeAudio: 157 case MediaStreamSource::TypeAudio:
158 m_descriptor->addAudioComponent(component.release()); 158 m_descriptor->addAudioComponent(component.release());
159 m_audioTracks.append(newTrack); 159 m_audioTracks.append(newTrack);
160 break; 160 break;
161 case MediaStreamSource::TypeVideo: 161 case MediaStreamSource::TypeVideo:
162 m_descriptor->addVideoComponent(component.release()); 162 m_descriptor->addVideoComponent(component.release());
163 m_videoTracks.append(newTrack); 163 m_videoTracks.append(newTrack);
164 break; 164 break;
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
257 } 257 }
258 258
259 void MediaStream::addRemoteTrack(MediaStreamComponent* component) 259 void MediaStream::addRemoteTrack(MediaStreamComponent* component)
260 { 260 {
261 ASSERT(component && !component->stream()); 261 ASSERT(component && !component->stream());
262 if (ended()) 262 if (ended())
263 return; 263 return;
264 264
265 component->setStream(descriptor()); 265 component->setStream(descriptor());
266 266
267 RefPtr<MediaStreamTrack> track = MediaStreamTrack::create(scriptExecutionCon text(), component); 267 RefPtr<MediaStreamTrack> track = MediaStreamTrack::create(scriptExecutionCon text(), component, this);
268 switch (component->source()->type()) { 268 switch (component->source()->type()) {
269 case MediaStreamSource::TypeAudio: 269 case MediaStreamSource::TypeAudio:
270 m_audioTracks.append(track); 270 m_audioTracks.append(track);
271 break; 271 break;
272 case MediaStreamSource::TypeVideo: 272 case MediaStreamSource::TypeVideo:
273 m_videoTracks.append(track); 273 m_videoTracks.append(track);
274 break; 274 break;
275 } 275 }
276 276
277 scheduleDispatchEvent(MediaStreamTrackEvent::create(eventNames().addtrackEve nt, false, false, track)); 277 scheduleDispatchEvent(MediaStreamTrackEvent::create(eventNames().addtrackEve nt, false, false, track));
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
323 Vector<RefPtr<Event> > events; 323 Vector<RefPtr<Event> > events;
324 events.swap(m_scheduledEvents); 324 events.swap(m_scheduledEvents);
325 325
326 Vector<RefPtr<Event> >::iterator it = events.begin(); 326 Vector<RefPtr<Event> >::iterator it = events.begin();
327 for (; it != events.end(); ++it) 327 for (; it != events.end(); ++it)
328 dispatchEvent((*it).release()); 328 dispatchEvent((*it).release());
329 329
330 events.clear(); 330 events.clear();
331 } 331 }
332 332
333 void MediaStream::trackEndedNotification()
334 {
335 for (size_t i = 0; i < m_audioTracks.size(); ++i)
336 if (!m_audioTracks[i].get()->ended())
abarth-chromium 2013/04/08 06:24:21 There's no need to call "get()" here. operator->
337 return;
338
339 for (size_t i = 0; i < m_videoTracks.size(); ++i)
340 if (!m_videoTracks[i].get()->ended())
341 return;
342
343 streamEnded();
344 }
333 } // namespace WebCore 345 } // namespace WebCore
334 346
335 #endif // ENABLE(MEDIA_STREAM) 347 #endif // ENABLE(MEDIA_STREAM)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698