Changeset 157958 in webkit
- Timestamp:
- Oct 24, 2013 3:22:21 PM (10 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r157957 r157958 1 2013-10-24 Thiago de Barros Lacerda <thiago.lacerda@openbossa.org> 2 3 [MediaStream API] allow a stream source to be shared 4 https://bugs.webkit.org/show_bug.cgi?id=121954 5 6 Reviewed by Eric Carlson. 7 8 Now, the MediaStreamSource don't know about the MediaStream that owns it, 9 since there can be more than one MediaStream that has it as source for some track. 10 MediaStreamTrack classes now have observers registered, in case there are more than 11 one MediaStream owning that track 12 13 No new tests, no change in functionality. 14 15 * Modules/mediastream/MediaStream.cpp: 16 (WebCore::MediaStream::MediaStream): Adding the MediaStream as an observer for each track it owns. 17 18 (WebCore::MediaStream::addTrack): Now adding the MediaStream as an observer the new added track 19 and adding the source to the MediaStreamDescriptor. 20 21 (WebCore::MediaStream::removeTrack): Instead of removing the source right away, we first check if 22 there isn't any other track using that source, if not we remove the source. 23 24 (WebCore::MediaStream::haveTrackWithSource): 25 (WebCore::MediaStream::addRemoteSource): MediaStreamSource has no information about the MediaStream 26 that uses it, so now we don't set the stream in the source anymore. 27 28 (WebCore::MediaStream::removeRemoteSource): There can be more than on track using the source. So we 29 get each track that is using the source and then remove it and fire the ended event. 30 31 * Modules/mediastream/MediaStream.h: 32 * Modules/mediastream/MediaStreamTrack.cpp: 33 (WebCore::MediaStreamTrack::addObserver): 34 (WebCore::MediaStreamTrack::removeObserver): 35 (WebCore::MediaStreamTrack::trackDidEnd): Does not get the client from the MediaStreamDescriptor, it now 36 notify each of its observers that the track ended. 37 38 * Modules/mediastream/MediaStreamTrack.h: Adding Observer class. 39 40 * platform/mediastream/MediaStreamDescriptor.cpp: Destructor now does nothing. Previously it was setting 41 each MediaStreamSource's descriptor to null. 42 43 (WebCore::MediaStreamDescriptor::removeSource): Not setting the stream in source anymore. 44 45 (WebCore::MediaStreamDescriptor::MediaStreamDescriptor): Ditto. 46 47 (WebCore::MediaStreamDescriptor::setEnded): Not setting the state of the source to Ended 48 49 * platform/mediastream/MediaStreamDescriptor.h: 50 (WebCore::MediaStreamDescriptor::~MediaStreamDescriptor): 51 * platform/mediastream/MediaStreamSource.cpp: Removing references to MediaStream object 52 (WebCore::MediaStreamSource::MediaStreamSource): 53 (WebCore::MediaStreamSource::reset): 54 * platform/mediastream/MediaStreamSource.h: 55 1 56 2013-10-24 Daniel Bates <dabates@apple.com> 2 57 -
trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp
r157653 r157958 119 119 m_descriptor->setClient(this); 120 120 121 RefPtr<MediaStreamTrack> track; 121 122 size_t numberOfAudioTracks = m_descriptor->numberOfAudioStreams(); 122 123 m_audioTracks.reserveCapacity(numberOfAudioTracks); 123 for (size_t i = 0; i < numberOfAudioTracks; i++) 124 m_audioTracks.append(AudioStreamTrack::create(context, m_descriptor->audioStreams(i))); 124 for (size_t i = 0; i < numberOfAudioTracks; i++) { 125 track = AudioStreamTrack::create(context, m_descriptor->audioStreams(i)); 126 track->addObserver(this); 127 m_audioTracks.append(track.release()); 128 } 125 129 126 130 size_t numberOfVideoTracks = m_descriptor->numberOfVideoStreams(); 127 131 m_videoTracks.reserveCapacity(numberOfVideoTracks); 128 for (size_t i = 0; i < numberOfVideoTracks; i++) 129 m_videoTracks.append(VideoStreamTrack::create(context, m_descriptor->videoStreams(i))); 132 for (size_t i = 0; i < numberOfVideoTracks; i++) { 133 track = VideoStreamTrack::create(context, m_descriptor->videoStreams(i)); 134 track->addObserver(this); 135 m_videoTracks.append(track.release()); 136 } 130 137 } 131 138 … … 186 193 break; 187 194 } 195 196 track->addObserver(this); 197 m_descriptor->addSource(track->source()); 188 198 } 189 199 … … 219 229 return; 220 230 221 m_descriptor->removeSource(track->source()); 222 231 // There can be other tracks using the same source in the same MediaStream, 232 // like when MediaStreamTrack::clone() is called, for instance. 233 // Spec says that a source can be shared, so we must assure that there is no 234 // other track using it. 235 if (!haveTrackWithSource(track->source())) 236 m_descriptor->removeSource(track->source()); 237 238 track->removeObserver(this); 223 239 if (!m_audioTracks.size() && !m_videoTracks.size()) 224 240 setEnded(); 241 } 242 243 bool MediaStream::haveTrackWithSource(PassRefPtr<MediaStreamSource> source) 244 { 245 if (source->type() == MediaStreamSource::Audio) { 246 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter != m_audioTracks.end(); ++iter) { 247 if ((*iter)->source() == source.get()) 248 return true; 249 } 250 return false; 251 } 252 253 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter != m_videoTracks.end(); ++iter) { 254 if ((*iter)->source() == source.get()) 255 return true; 256 } 257 258 return false; 225 259 } 226 260 … … 272 306 return; 273 307 274 source->setStream(descriptor());275 276 308 RefPtr<MediaStreamTrack> track; 277 309 switch (source->type()) { … … 285 317 break; 286 318 } 319 track->addObserver(this); 287 320 m_descriptor->addSource(source); 288 321 … … 305 338 } 306 339 307 size_t index = notFound;340 Vector<int> tracksToRemove; 308 341 for (size_t i = 0; i < tracks->size(); ++i) { 309 if ((*tracks)[i]->source() == source) { 310 index = i; 311 break; 312 } 313 } 314 if (index == notFound) 315 return; 342 if ((*tracks)[i]->source() == source) 343 tracksToRemove.append(i); 344 } 316 345 317 346 m_descriptor->removeSource(source); 318 347 319 RefPtr<MediaStreamTrack> track = (*tracks)[index]; 320 tracks->remove(index); 321 scheduleDispatchEvent(MediaStreamTrackEvent::create(eventNames().removetrackEvent, false, false, track)); 348 for (int i = tracksToRemove.size() - 1; i >= 0; i--) { 349 RefPtr<MediaStreamTrack> track = (*tracks)[tracksToRemove[i]]; 350 track->removeObserver(this); 351 tracks->remove(tracksToRemove[i]); 352 scheduleDispatchEvent(MediaStreamTrackEvent::create(eventNames().removetrackEvent, false, false, track.release())); 353 } 322 354 } 323 355 -
trunk/Source/WebCore/Modules/mediastream/MediaStream.h
r157653 r157958 99 99 virtual void removeRemoteSource(MediaStreamSource*) OVERRIDE FINAL; 100 100 101 bool haveTrackWithSource(PassRefPtr<MediaStreamSource>); 102 101 103 void scheduleDispatchEvent(PassRefPtr<Event>); 102 104 void scheduledEventTimerFired(Timer<MediaStream>*); -
trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp
r157733 r157958 297 297 } 298 298 299 void MediaStreamTrack::addObserver(MediaStreamTrack::Observer* observer) 300 { 301 m_observers.append(observer); 302 } 303 304 void MediaStreamTrack::removeObserver(MediaStreamTrack::Observer* observer) 305 { 306 size_t pos = m_observers.find(observer); 307 if (pos != notFound) 308 m_observers.remove(pos); 309 } 310 299 311 void MediaStreamTrack::sourceStateChanged() 300 312 { … … 348 360 void MediaStreamTrack::trackDidEnd() 349 361 { 350 // FIXME: this is wrong, the track shouldn't have to call the descriptor's client! 351 MediaStreamDescriptorClient* client = m_source ? m_source->stream()->client() : 0; 352 if (!client) 353 return; 354 355 client->trackDidEnd(); 356 setState(MediaStreamSource::Ended); 362 for (Vector<Observer*>::iterator i = m_observers.begin(); i != m_observers.end(); ++i) 363 (*i)->trackDidEnd(); 357 364 } 358 365 -
trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.h
r157733 r157958 50 50 class MediaStreamTrack : public RefCounted<MediaStreamTrack>, public ScriptWrappable, public ActiveDOMObject, public EventTargetWithInlineData, public MediaStreamSource::Observer { 51 51 public: 52 class Observer { 53 public: 54 virtual void trackDidEnd() = 0; 55 }; 56 52 57 virtual ~MediaStreamTrack(); 53 58 … … 86 91 87 92 bool ended() const; 93 94 void addObserver(Observer*); 95 void removeObserver(Observer*); 88 96 89 97 // EventTarget … … 126 134 Mutex m_mutex; 127 135 136 Vector<Observer*> m_observers; 137 128 138 bool m_stopped; 129 139 bool m_enabled; -
trunk/Source/WebCore/platform/mediastream/MediaStreamDescriptor.cpp
r157268 r157958 49 49 } 50 50 51 MediaStreamDescriptor::~MediaStreamDescriptor()52 {53 for (size_t i = 0; i < m_audioStreamSources.size(); i++)54 m_audioStreamSources[i]->setStream(0);55 56 for (size_t i = 0; i < m_videoStreamSources.size(); i++)57 m_videoStreamSources[i]->setStream(0);58 }59 60 51 void MediaStreamDescriptor::addSource(PassRefPtr<MediaStreamSource> source) 61 52 { … … 89 80 break; 90 81 } 91 92 source->setStream(0);93 82 } 94 83 … … 115 104 { 116 105 ASSERT(m_id.length()); 117 for (size_t i = 0; i < audioSources.size(); i++) { 118 audioSources[i]->setStream(this); 106 for (size_t i = 0; i < audioSources.size(); i++) 119 107 m_audioStreamSources.append(audioSources[i]); 120 }121 108 122 for (size_t i = 0; i < videoSources.size(); i++) { 123 videoSources[i]->setStream(this); 109 for (size_t i = 0; i < videoSources.size(); i++) 124 110 m_videoStreamSources.append(videoSources[i]); 125 }126 111 } 127 112 … … 130 115 if (m_client) 131 116 m_client->streamDidEnd(); 117 132 118 m_ended = true; 133 for (size_t i = 0; i < m_audioStreamSources.size(); i++)134 m_audioStreamSources[i]->setReadyState(MediaStreamSource::Ended);135 for (size_t i = 0; i < m_videoStreamSources.size(); i++)136 m_videoStreamSources[i]->setReadyState(MediaStreamSource::Ended);137 119 } 138 120 -
trunk/Source/WebCore/platform/mediastream/MediaStreamDescriptor.h
r157653 r157958 36 36 37 37 #include "MediaStreamSource.h" 38 #include "MediaStreamTrack.h" 38 39 #include <wtf/RefCounted.h> 39 40 #include <wtf/Vector.h> … … 41 42 namespace WebCore { 42 43 43 class MediaStreamDescriptorClient {44 class MediaStreamDescriptorClient : public MediaStreamTrack::Observer { 44 45 public: 45 46 virtual ~MediaStreamDescriptorClient() { } 46 47 47 virtual void trackDidEnd() = 0;48 48 virtual void streamDidEnd() = 0; 49 49 virtual void addRemoteSource(MediaStreamSource*) = 0; … … 57 57 static PassRefPtr<MediaStreamDescriptor> create(const MediaStreamSourceVector& audioSources, const MediaStreamSourceVector& videoSources, EndedAtCreationFlag); 58 58 59 virtual ~MediaStreamDescriptor() ;59 virtual ~MediaStreamDescriptor() { } 60 60 61 61 MediaStreamDescriptorClient* client() const { return m_client; } -
trunk/Source/WebCore/platform/mediastream/MediaStreamSource.cpp
r157068 r157958 49 49 , m_name(name) 50 50 , m_readyState(New) 51 , m_stream(0)52 51 , m_enabled(true) 53 52 , m_muted(false) … … 64 63 { 65 64 m_readyState = New; 66 m_stream = 0;67 65 m_enabled = true; 68 66 m_muted = false; … … 91 89 if (pos != notFound) 92 90 m_observers.remove(pos); 93 }94 95 void MediaStreamSource::setStream(MediaStreamDescriptor* stream)96 {97 // FIXME: A source should not need to know about its stream(s). This will be fixed as a part of98 // https://bugs.webkit.org/show_bug.cgi?id=12195499 m_stream = stream;100 91 } 101 92 -
trunk/Source/WebCore/platform/mediastream/MediaStreamSource.h
r157653 r157958 101 101 void stop(); 102 102 103 MediaStreamDescriptor* stream() const { return m_stream; }104 void setStream(MediaStreamDescriptor*);105 106 103 protected: 107 104 MediaStreamSource(const String& id, Type, const String& name); … … 114 111 Vector<Observer*> m_observers; 115 112 RefPtr<MediaConstraints> m_constraints; 116 MediaStreamDescriptor* m_stream;117 113 MediaStreamSourceStates m_states; 118 114
Note: See TracChangeset
for help on using the changeset viewer.