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

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: call clearStreamwhen when tracks are removed 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
130 for (size_t i = 0; i < m_audioTracks.size(); ++i)
131 m_audioTracks[i]->clearStream();
132
133 for (size_t i = 0; i < m_videoTracks.size(); ++i)
134 m_videoTracks[i]->clearStream();
129 } 135 }
130 136
131 bool MediaStream::ended() const 137 bool MediaStream::ended() const
132 { 138 {
133 return m_stopped || m_descriptor->ended(); 139 return m_stopped || m_descriptor->ended();
134 } 140 }
135 141
136 void MediaStream::addTrack(PassRefPtr<MediaStreamTrack> prpTrack, ExceptionCode& ec) 142 void MediaStream::addTrack(PassRefPtr<MediaStreamTrack> prpTrack, ExceptionCode& ec)
137 { 143 {
138 if (ended()) { 144 if (ended()) {
139 ec = INVALID_STATE_ERR; 145 ec = INVALID_STATE_ERR;
140 return; 146 return;
141 } 147 }
142 148
143 if (!prpTrack) { 149 if (!prpTrack) {
144 ec = TYPE_MISMATCH_ERR; 150 ec = TYPE_MISMATCH_ERR;
145 return; 151 return;
146 } 152 }
147 153
148 RefPtr<MediaStreamTrack> track = prpTrack; 154 RefPtr<MediaStreamTrack> track = prpTrack;
149 155
150 if (getTrackById(track->id())) 156 if (getTrackById(track->id()))
151 return; 157 return;
152 158
153 RefPtr<MediaStreamComponent> component = MediaStreamComponent::create(m_desc riptor.get(), track->component()->source()); 159 RefPtr<MediaStreamComponent> component = MediaStreamComponent::create(m_desc riptor.get(), track->component()->source());
154 RefPtr<MediaStreamTrack> newTrack = MediaStreamTrack::create(scriptExecution Context(), component.get()); 160 RefPtr<MediaStreamTrack> newTrack = MediaStreamTrack::create(scriptExecution Context(), component.get(), this);
155 161
156 switch (component->source()->type()) { 162 switch (component->source()->type()) {
157 case MediaStreamSource::TypeAudio: 163 case MediaStreamSource::TypeAudio:
158 m_descriptor->addAudioComponent(component.release()); 164 m_descriptor->addAudioComponent(component.release());
159 m_audioTracks.append(newTrack); 165 m_audioTracks.append(newTrack);
160 break; 166 break;
161 case MediaStreamSource::TypeVideo: 167 case MediaStreamSource::TypeVideo:
162 m_descriptor->addVideoComponent(component.release()); 168 m_descriptor->addVideoComponent(component.release());
163 m_videoTracks.append(newTrack); 169 m_videoTracks.append(newTrack);
164 break; 170 break;
(...skipping 14 matching lines...) Expand all
179 return; 185 return;
180 } 186 }
181 187
182 RefPtr<MediaStreamTrack> track = prpTrack; 188 RefPtr<MediaStreamTrack> track = prpTrack;
183 189
184 switch (track->component()->source()->type()) { 190 switch (track->component()->source()->type()) {
185 case MediaStreamSource::TypeAudio: { 191 case MediaStreamSource::TypeAudio: {
186 size_t pos = m_audioTracks.find(track); 192 size_t pos = m_audioTracks.find(track);
187 if (pos != notFound) { 193 if (pos != notFound) {
188 m_audioTracks.remove(pos); 194 m_audioTracks.remove(pos);
195 track->clearStream();
189 m_descriptor->removeAudioComponent(track->component()); 196 m_descriptor->removeAudioComponent(track->component());
190 } 197 }
191 break; 198 break;
192 } 199 }
193 case MediaStreamSource::TypeVideo: { 200 case MediaStreamSource::TypeVideo: {
194 size_t pos = m_videoTracks.find(track); 201 size_t pos = m_videoTracks.find(track);
195 if (pos != notFound) { 202 if (pos != notFound) {
196 m_videoTracks.remove(pos); 203 m_videoTracks.remove(pos);
204 track->clearStream();
197 m_descriptor->removeVideoComponent(track->component()); 205 m_descriptor->removeVideoComponent(track->component());
198 } 206 }
199 break; 207 break;
200 } 208 }
201 } 209 }
202 210
203 if (!m_audioTracks.size() && !m_videoTracks.size()) 211 if (!m_audioTracks.size() && !m_videoTracks.size())
204 m_descriptor->setEnded(); 212 m_descriptor->setEnded();
205 213
206 MediaStreamCenter::instance().didRemoveMediaStreamTrack(m_descriptor.get(), track->component()); 214 MediaStreamCenter::instance().didRemoveMediaStreamTrack(m_descriptor.get(), track->component());
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
257 } 265 }
258 266
259 void MediaStream::addRemoteTrack(MediaStreamComponent* component) 267 void MediaStream::addRemoteTrack(MediaStreamComponent* component)
260 { 268 {
261 ASSERT(component && !component->stream()); 269 ASSERT(component && !component->stream());
262 if (ended()) 270 if (ended())
263 return; 271 return;
264 272
265 component->setStream(descriptor()); 273 component->setStream(descriptor());
266 274
267 RefPtr<MediaStreamTrack> track = MediaStreamTrack::create(scriptExecutionCon text(), component); 275 RefPtr<MediaStreamTrack> track = MediaStreamTrack::create(scriptExecutionCon text(), component, this);
268 switch (component->source()->type()) { 276 switch (component->source()->type()) {
269 case MediaStreamSource::TypeAudio: 277 case MediaStreamSource::TypeAudio:
270 m_audioTracks.append(track); 278 m_audioTracks.append(track);
271 break; 279 break;
272 case MediaStreamSource::TypeVideo: 280 case MediaStreamSource::TypeVideo:
273 m_videoTracks.append(track); 281 m_videoTracks.append(track);
274 break; 282 break;
275 } 283 }
276 284
277 scheduleDispatchEvent(MediaStreamTrackEvent::create(eventNames().addtrackEve nt, false, false, track)); 285 scheduleDispatchEvent(MediaStreamTrackEvent::create(eventNames().addtrackEve nt, false, false, track));
(...skipping 19 matching lines...) Expand all
297 if ((*tracks)[i]->component() == component) { 305 if ((*tracks)[i]->component() == component) {
298 index = i; 306 index = i;
299 break; 307 break;
300 } 308 }
301 } 309 }
302 if (index == notFound) 310 if (index == notFound)
303 return; 311 return;
304 312
305 RefPtr<MediaStreamTrack> track = (*tracks)[index]; 313 RefPtr<MediaStreamTrack> track = (*tracks)[index];
306 tracks->remove(index); 314 tracks->remove(index);
315 track->clearStream();
307 scheduleDispatchEvent(MediaStreamTrackEvent::create(eventNames().removetrack Event, false, false, track)); 316 scheduleDispatchEvent(MediaStreamTrackEvent::create(eventNames().removetrack Event, false, false, track));
308 } 317 }
309 318
310 void MediaStream::scheduleDispatchEvent(PassRefPtr<Event> event) 319 void MediaStream::scheduleDispatchEvent(PassRefPtr<Event> event)
311 { 320 {
312 m_scheduledEvents.append(event); 321 m_scheduledEvents.append(event);
313 322
314 if (!m_scheduledEventTimer.isActive()) 323 if (!m_scheduledEventTimer.isActive())
315 m_scheduledEventTimer.startOneShot(0); 324 m_scheduledEventTimer.startOneShot(0);
316 } 325 }
317 326
318 void MediaStream::scheduledEventTimerFired(Timer<MediaStream>*) 327 void MediaStream::scheduledEventTimerFired(Timer<MediaStream>*)
319 { 328 {
320 if (m_stopped) 329 if (m_stopped)
321 return; 330 return;
322 331
323 Vector<RefPtr<Event> > events; 332 Vector<RefPtr<Event> > events;
324 events.swap(m_scheduledEvents); 333 events.swap(m_scheduledEvents);
325 334
326 Vector<RefPtr<Event> >::iterator it = events.begin(); 335 Vector<RefPtr<Event> >::iterator it = events.begin();
327 for (; it != events.end(); ++it) 336 for (; it != events.end(); ++it)
328 dispatchEvent((*it).release()); 337 dispatchEvent((*it).release());
329 338
330 events.clear(); 339 events.clear();
331 } 340 }
332 341
342 void MediaStream::didEndTrack()
eseidel 2013/04/09 06:42:25 If this dispatches synchronous javascript events,
Li Yin 2013/04/09 07:38:33 didEndTrack is only checking whether the event sho
343 {
344 for (size_t i = 0; i < m_audioTracks.size(); ++i)
345 if (!m_audioTracks[i]->ended())
346 return;
347
348 for (size_t i = 0; i < m_videoTracks.size(); ++i)
349 if (!m_videoTracks[i]->ended())
350 return;
351
352 streamEnded();
353 }
333 } // namespace WebCore 354 } // namespace WebCore
334 355
335 #endif // ENABLE(MEDIA_STREAM) 356 #endif // ENABLE(MEDIA_STREAM)
OLDNEW
« no previous file with comments | « Source/WebCore/Modules/mediastream/MediaStream.h ('k') | Source/WebCore/Modules/mediastream/MediaStreamTrack.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698