Changeset 97904 in webkit
- Timestamp:
- Oct 19, 2011 5:53:21 PM (13 years ago)
- Location:
- trunk/Source
- Files:
-
- 4 deleted
- 19 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r97902 r97904 1 2011-10-19 Adam Bergkvist <adam.bergkvist@ericsson.com> 2 3 Update MediaStream to use WebCore platform interfaces 4 https://bugs.webkit.org/show_bug.cgi?id=68464 5 6 Reviewed by Adam Barth. 7 8 This is one in a series of patches that update the MediaStream feature 9 to use WebCore platform interfaces. 10 11 Tests will be provided by http://webkit.org/b/56587 12 13 * dom/LocalMediaStream.cpp: 14 (WebCore::LocalMediaStream::create): 15 (WebCore::LocalMediaStream::LocalMediaStream): 16 (WebCore::LocalMediaStream::stop): 17 (WebCore::LocalMediaStream::stopTimerFired): 18 (WebCore::LocalMediaStream::~LocalMediaStream): 19 (WebCore::LocalMediaStream::toLocalMediaStream): 20 * dom/LocalMediaStream.h: 21 * dom/LocalMediaStream.idl: 22 * dom/MediaStream.cpp: 23 (WebCore::MediaStream::create): 24 (WebCore::MediaStream::MediaStream): 25 (WebCore::MediaStream::~MediaStream): 26 (WebCore::MediaStream::readyState): 27 (WebCore::MediaStream::streamEnded): 28 (WebCore::MediaStream::scriptExecutionContext): 29 * dom/MediaStream.h: 30 (WebCore::MediaStream::label): 31 (WebCore::MediaStream::tracks): 32 (WebCore::MediaStream::descriptor): 33 * dom/MediaStreamTrack.cpp: 34 (WebCore::MediaStreamTrack::create): 35 (WebCore::MediaStreamTrack::MediaStreamTrack): 36 (WebCore::MediaStreamTrack::kind): 37 (WebCore::MediaStreamTrack::label): 38 (WebCore::MediaStreamTrack::enabled): 39 (WebCore::MediaStreamTrack::setEnabled): 40 * dom/MediaStreamTrack.h: 41 * dom/MediaStreamTrack.idl: 42 * dom/MediaStreamTrackList.cpp: 43 (WebCore::MediaStreamTrackList::create): 44 (WebCore::MediaStreamTrackList::MediaStreamTrackList): 45 (WebCore::MediaStreamTrackList::length): 46 (WebCore::MediaStreamTrackList::item): 47 * dom/MediaStreamTrackList.h: 48 * p2p/PeerConnection.cpp: 49 (WebCore::PeerConnection::addStream): 50 (WebCore::PeerConnection::removeStream): 51 (WebCore::PeerConnection::remoteStreamAdded): 52 * page/MediaStreamClient.h: 53 * page/MediaStreamController.cpp: 54 (WebCore::MediaStreamController::unregisterFrameController): 55 (WebCore::MediaStreamController::streamGenerated): 56 * page/MediaStreamController.h: 57 * page/MediaStreamFrameController.cpp: 58 (WebCore::MediaStreamFrameController::enterDetachedState): 59 (WebCore::MediaStreamFrameController::disconnectFrame): 60 (WebCore::MediaStreamFrameController::streamGenerated): 61 * page/MediaStreamFrameController.h: 62 1 63 2011-10-19 W. James MacLean <wjmaclean@chromium.org> 2 64 -
trunk/Source/WebCore/dom/LocalMediaStream.cpp
r95901 r97904 1 1 /* 2 2 * Copyright (C) 2011 Google Inc. All rights reserved. 3 * Copyright (C) 2011 Ericsson AB. All rights reserved. 3 4 * 4 5 * Redistribution and use in source and binary forms, with or without … … 28 29 #if ENABLE(MEDIA_STREAM) 29 30 30 #include "Event.h" 31 #include "EventNames.h" 32 #include "MediaStreamFrameController.h" 33 #include "ScriptExecutionContext.h" 31 #include "UUID.h" 34 32 35 33 namespace WebCore { 36 34 37 class LocalMediaStream::DispatchUpdateTask : public ScriptExecutionContext::Task { 38 public: 39 typedef void (LocalMediaStream::*Callback)(); 40 41 static PassOwnPtr<DispatchUpdateTask> create(PassRefPtr<LocalMediaStream> object, Callback callback) 42 { 43 return adoptPtr(new DispatchUpdateTask(object, callback)); 44 } 45 46 virtual void performTask(ScriptExecutionContext*) 47 { 48 (m_object.get()->*m_callback)(); 49 } 50 51 public: 52 DispatchUpdateTask(PassRefPtr<LocalMediaStream> object, Callback callback) 53 : m_object(object) 54 , m_callback(callback) { } 55 56 RefPtr<LocalMediaStream> m_object; 57 Callback m_callback; 58 }; 59 60 PassRefPtr<LocalMediaStream> LocalMediaStream::create(MediaStreamFrameController* frameController, const String& label, PassRefPtr<MediaStreamTrackList> tracks) 35 PassRefPtr<LocalMediaStream> LocalMediaStream::create(ScriptExecutionContext* context, const MediaStreamSourceVector& sources) 61 36 { 62 return adoptRef(new LocalMediaStream( frameController, label, tracks));37 return adoptRef(new LocalMediaStream(context, sources)); 63 38 } 64 39 65 LocalMediaStream::LocalMediaStream(MediaStreamFrameController* frameController, const String& label, PassRefPtr<MediaStreamTrackList> tracks) 66 : MediaStream(frameController, label, tracks, true) 40 LocalMediaStream::LocalMediaStream(ScriptExecutionContext* context, const MediaStreamSourceVector& sources) 41 : MediaStream(context, MediaStreamDescriptor::create(createCanonicalUUIDString(), sources)) 42 , m_stopTimer(this, &LocalMediaStream::stopTimerFired) 67 43 { 44 } 45 46 void LocalMediaStream::stop() 47 { 48 if (!m_stopTimer.isActive()) 49 m_stopTimer.startOneShot(0); 50 } 51 52 void LocalMediaStream::stopTimerFired(Timer<LocalMediaStream>* timer) 53 { 54 ASSERT_UNUSED(timer, timer == &m_stopTimer); 55 56 if (readyState() == ENDED) 57 return; 58 59 // FIXME: tell the platform that the stream was stopped 60 61 streamEnded(); 68 62 } 69 63 … … 77 71 } 78 72 79 void LocalMediaStream::detachEmbedder()80 {81 // Assuming we should stop any live streams when losing access to the embedder.82 stop();83 84 MediaStream::detachEmbedder();85 }86 87 void LocalMediaStream::streamEnded()88 {89 MediaStream::streamEnded();90 }91 92 void LocalMediaStream::stop()93 {94 if (!mediaStreamFrameController() || m_readyState == ENDED)95 return;96 97 mediaStreamFrameController()->stopGeneratedStream(label());98 99 m_readyState = ENDED;100 101 // Don't assert since it can be null in degenerate cases like frames detached from their pages.102 if (!scriptExecutionContext())103 return;104 105 ASSERT(scriptExecutionContext()->isContextThread());106 scriptExecutionContext()->postTask(DispatchUpdateTask::create(this, &LocalMediaStream::onStop));107 }108 109 void LocalMediaStream::onStop()110 {111 dispatchEvent(Event::create(eventNames().endedEvent, false, false));112 }113 114 73 } // namespace WebCore 115 74 -
trunk/Source/WebCore/dom/LocalMediaStream.h
r95901 r97904 1 1 /* 2 2 * Copyright (C) 2011 Google Inc. All rights reserved. 3 * Copyright (C) 2011 Ericsson AB. All rights reserved. 3 4 * 4 5 * Redistribution and use in source and binary forms, with or without … … 29 30 30 31 #include "MediaStream.h" 31 #include <wtf/Forward.h>32 #include "Timer.h" 32 33 33 34 namespace WebCore { … … 35 36 class LocalMediaStream : public MediaStream { 36 37 public: 37 static PassRefPtr<LocalMediaStream> create( MediaStreamFrameController*, const String& label, PassRefPtr<MediaStreamTrackList> tracks);38 static PassRefPtr<LocalMediaStream> create(ScriptExecutionContext*, const MediaStreamSourceVector&); 38 39 virtual ~LocalMediaStream(); 39 40 40 41 void stop(); 41 42 42 // MediaStreamFrameController::StreamClient implementation.43 virtual void detachEmbedder();44 virtual void streamEnded();45 46 43 // EventTarget. 47 44 virtual LocalMediaStream* toLocalMediaStream(); 48 45 49 pr otected:50 virtual bool isLocalMediaStream() const { return true; }46 private: 47 LocalMediaStream(ScriptExecutionContext*, const MediaStreamSourceVector&); 51 48 52 private: 53 LocalMediaStream(MediaStreamFrameController*, const String& label, PassRefPtr<MediaStreamTrackList> tracks); 54 class DispatchUpdateTask; 55 friend class DispatchUpdateTask; 49 void stopTimerFired(Timer<LocalMediaStream>*); 56 50 57 void onStop();51 Timer<LocalMediaStream> m_stopTimer; 58 52 }; 59 53 -
trunk/Source/WebCore/dom/LocalMediaStream.idl
r91364 r97904 28 28 Conditional=MEDIA_STREAM, 29 29 GenerateNativeConverter, 30 EventTarget 30 EventTarget, 31 GenerateToJS 31 32 ] LocalMediaStream : MediaStream { 32 33 void stop(); -
trunk/Source/WebCore/dom/MediaStream.cpp
r95901 r97904 1 1 /* 2 2 * Copyright (C) 2011 Google Inc. All rights reserved. 3 * Copyright (C) 2011 Ericsson AB. All rights reserved. 3 4 * 4 5 * Redistribution and use in source and binary forms, with or without … … 33 34 namespace WebCore { 34 35 35 PassRefPtr<MediaStream> MediaStream::create( MediaStreamFrameController* frameController, const String& label, PassRefPtr<MediaStreamTrackList> tracks, bool isLocalMediaStream)36 PassRefPtr<MediaStream> MediaStream::create(ScriptExecutionContext* context, PassRefPtr<MediaStreamDescriptor> streamDescriptor) 36 37 { 37 return adoptRef(new MediaStream( frameController, label, tracks, isLocalMediaStream));38 return adoptRef(new MediaStream(context, streamDescriptor)); 38 39 } 39 40 40 MediaStream::MediaStream(MediaStreamFrameController* frameController, const String& label, PassRefPtr<MediaStreamTrackList> tracks, bool isLocalMediaStream) 41 : MediaStreamClient(frameController, label, isLocalMediaStream) 42 , m_readyState(LIVE) 43 , m_tracks(tracks) 41 MediaStream::MediaStream(ScriptExecutionContext* context, PassRefPtr<MediaStreamDescriptor> streamDescriptor) 42 : m_scriptExecutionContext(context) 43 , m_descriptor(streamDescriptor) 44 44 { 45 m_descriptor->setOwner(this); 46 47 MediaStreamTrackVector trackVector; 48 size_t numberOfTracks = m_descriptor->numberOfComponents(); 49 50 trackVector.reserveCapacity(numberOfTracks); 51 for (size_t i = 0; i < numberOfTracks; i++) 52 trackVector.append(MediaStreamTrack::create(m_descriptor, i)); 53 54 m_tracks = MediaStreamTrackList::create(trackVector); 45 55 } 46 56 47 57 MediaStream::~MediaStream() 48 58 { 59 m_descriptor->setOwner(0); 60 } 61 62 MediaStream::ReadyState MediaStream::readyState() const 63 { 64 return m_descriptor->ended() ? ENDED : LIVE; 49 65 } 50 66 … … 56 72 void MediaStream::streamEnded() 57 73 { 58 ASSERT(m_readyState != ENDED); 59 m_readyState = ENDED; 74 if (readyState() == ENDED) 75 return; 76 77 m_descriptor->setEnded(); 78 60 79 dispatchEvent(Event::create(eventNames().endedEvent, false, false)); 61 80 } … … 63 82 ScriptExecutionContext* MediaStream::scriptExecutionContext() const 64 83 { 65 return m ediaStreamFrameController() ? mediaStreamFrameController()->scriptExecutionContext() : 0;84 return m_scriptExecutionContext.get(); 66 85 } 67 86 -
trunk/Source/WebCore/dom/MediaStream.h
r95901 r97904 1 1 /* 2 2 * Copyright (C) 2011 Google Inc. All rights reserved. 3 * Copyright (C) 2011 Ericsson AB. All rights reserved. 3 4 * 4 5 * Redistribution and use in source and binary forms, with or without … … 28 29 #if ENABLE(MEDIA_STREAM) 29 30 30 #include "EventNames.h"31 31 #include "EventTarget.h" 32 #include "MediaStream FrameController.h"32 #include "MediaStreamDescriptor.h" 33 33 #include "MediaStreamTrackList.h" 34 #include "ScriptExecutionContext.h"35 #include <wtf/Forward.h>36 #include <wtf/PassRefPtr.h>37 34 #include <wtf/RefCounted.h> 35 #include <wtf/RefPtr.h> 38 36 39 37 namespace WebCore { 40 38 41 class MediaStream : public RefCounted<MediaStream>,42 public EventTarget, 43 public MediaStreamFrameController::MediaStreamClient {39 class ScriptExecutionContext; 40 41 class MediaStream : public RefCounted<MediaStream>, public EventTarget { 44 42 public: 45 43 // Must match the constants in the .idl file. 46 enum {44 enum ReadyState { 47 45 LIVE = 1, 48 46 ENDED = 2 49 47 }; 50 48 51 static PassRefPtr<MediaStream> create( MediaStreamFrameController*, const String& label, PassRefPtr<MediaStreamTrackList> tracks, bool isLocalMediaStream = false);49 static PassRefPtr<MediaStream> create(ScriptExecutionContext*, PassRefPtr<MediaStreamDescriptor>); 52 50 virtual ~MediaStream(); 53 51 54 52 DEFINE_ATTRIBUTE_EVENT_LISTENER(ended); 55 53 56 unsigned short readyState() const { return m_readyState; }57 const String& label() const { return clientId(); }54 ReadyState readyState() const; 55 String label() const { return m_descriptor->label(); } 58 56 59 PassRefPtr<MediaStreamTrackList> tracks() { return m_tracks; }57 MediaStreamTrackList* tracks() { return m_tracks.get(); } 60 58 61 // MediaStreamFrameController::MediaStreamClient implementation. 62 virtual void streamEnded(); 59 void streamEnded(); 60 61 MediaStreamDescriptor* descriptor() const { return m_descriptor.get(); } 63 62 64 63 // EventTarget implementation. … … 70 69 71 70 protected: 72 MediaStream( MediaStreamFrameController*, const String& label, PassRefPtr<MediaStreamTrackList> tracks, bool isLocalMediaStream);71 MediaStream(ScriptExecutionContext*, PassRefPtr<MediaStreamDescriptor>); 73 72 74 73 // EventTarget implementation. … … 76 75 virtual EventTargetData* ensureEventTargetData(); 77 76 78 unsigned short m_readyState;79 80 77 private: 81 void onEnded();82 83 78 // EventTarget implementation. 84 79 virtual void refEventTarget() { ref(); } … … 87 82 EventTargetData m_eventTargetData; 88 83 84 RefPtr<ScriptExecutionContext> m_scriptExecutionContext; 85 89 86 RefPtr<MediaStreamTrackList> m_tracks; 87 RefPtr<MediaStreamDescriptor> m_descriptor; 90 88 }; 91 89 -
trunk/Source/WebCore/dom/MediaStreamTrack.cpp
r95901 r97904 1 1 /* 2 2 * Copyright (C) 2011 Google Inc. All rights reserved. 3 * Copyright (C) 2011 Ericsson AB. All rights reserved. 3 4 * 4 5 * Redistribution and use in source and binary forms, with or without … … 30 31 namespace WebCore { 31 32 32 PassRefPtr<MediaStreamTrack> MediaStreamTrack::create( const String& id, const String& kind, const String& label)33 PassRefPtr<MediaStreamTrack> MediaStreamTrack::create(PassRefPtr<MediaStreamDescriptor> streamDescriptor, size_t trackIndex) 33 34 { 34 return adoptRef(new MediaStreamTrack( id, kind, label));35 return adoptRef(new MediaStreamTrack(streamDescriptor, trackIndex)); 35 36 } 36 37 37 MediaStreamTrack::MediaStreamTrack(const String& id, const String& kind, const String& label) 38 : m_id(id) 39 , m_kind(kind) 40 , m_label(label) 41 , m_enabled(true) 38 MediaStreamTrack::MediaStreamTrack(PassRefPtr<MediaStreamDescriptor> streamDescriptor, size_t trackIndex) 39 : m_streamDescriptor(streamDescriptor) 40 , m_trackIndex(trackIndex) 42 41 { 43 42 } … … 47 46 } 48 47 49 const String&MediaStreamTrack::kind() const48 String MediaStreamTrack::kind() const 50 49 { 51 return m_kind; 50 DEFINE_STATIC_LOCAL(String, audioKind, ("audio")); 51 DEFINE_STATIC_LOCAL(String, videoKind, ("video")); 52 53 switch (m_streamDescriptor->component(m_trackIndex)->source()->type()) { 54 case MediaStreamSource::TypeAudio: 55 return audioKind; 56 case MediaStreamSource::TypeVideo: 57 return videoKind; 58 } 59 60 ASSERT_NOT_REACHED(); 52 61 } 53 62 54 const String&MediaStreamTrack::label() const63 String MediaStreamTrack::label() const 55 64 { 56 return m_ label;65 return m_streamDescriptor->component(m_trackIndex)->source()->name(); 57 66 } 58 67 59 68 bool MediaStreamTrack::enabled() const 60 69 { 61 return m_ enabled;70 return m_streamDescriptor->component(m_trackIndex)->enabled(); 62 71 } 63 72 64 73 void MediaStreamTrack::setEnabled(bool enabled) 65 74 { 66 m_enabled = enabled; 75 if (enabled == m_streamDescriptor->component(m_trackIndex)->enabled()) 76 return; 67 77 68 if (mediaStreamFrameController()) 69 mediaStreamFrameController()->setMediaStreamTrackEnabled(m_id, enabled); 78 m_streamDescriptor->component(m_trackIndex)->setEnabled(enabled); 79 80 // FIXME: tell the platform that the track was enabled/disabled 70 81 } 71 82 -
trunk/Source/WebCore/dom/MediaStreamTrack.h
r95901 r97904 1 1 /* 2 2 * Copyright (C) 2011 Google Inc. All rights reserved. 3 * Copyright (C) 2011 Ericsson AB. All rights reserved. 3 4 * 4 5 * Redistribution and use in source and binary forms, with or without … … 28 29 #if ENABLE(MEDIA_STREAM) 29 30 31 #include "MediaStreamDescriptor.h" 30 32 #include "PlatformString.h" 31 #include "MediaStreamFrameController.h"32 #include <wtf/PassRefPtr.h>33 33 #include <wtf/RefCounted.h> 34 #include <wtf/RefPtr.h> 34 35 #include <wtf/Vector.h> 35 36 36 37 namespace WebCore { 37 38 38 class MediaStreamTrack : public RefCounted<MediaStreamTrack>, 39 public MediaStreamFrameController::GenericClient { 39 class MediaStreamTrack : public RefCounted<MediaStreamTrack> { 40 40 public: 41 static PassRefPtr<MediaStreamTrack> create( const String& id, const String& kind, const String& label);41 static PassRefPtr<MediaStreamTrack> create(PassRefPtr<MediaStreamDescriptor>, size_t trackIndex); 42 42 virtual ~MediaStreamTrack(); 43 43 44 const String&kind() const;45 const String&label() const;44 String kind() const; 45 String label() const; 46 46 47 47 bool enabled() const; 48 void setEnabled(bool enabled);48 void setEnabled(bool); 49 49 50 50 private: 51 MediaStreamTrack( const String& id, const String& kind, const String& label);51 MediaStreamTrack(PassRefPtr<MediaStreamDescriptor>, size_t trackIndex); 52 52 53 String m_id; 54 String m_kind; 55 String m_label; 56 bool m_enabled; 53 RefPtr<MediaStreamDescriptor> m_streamDescriptor; 54 const size_t m_trackIndex; 57 55 }; 58 56 59 typedef Vector<RefPtr<MediaStreamTrack> > TrackVector;57 typedef Vector<RefPtr<MediaStreamTrack> > MediaStreamTrackVector; 60 58 61 59 } // namespace WebCore -
trunk/Source/WebCore/dom/MediaStreamTrack.idl
r91364 r97904 28 28 Conditional=MEDIA_STREAM, 29 29 ] MediaStreamTrack { 30 readonly attribute DOMString kind;31 readonly attribute DOMString label;32 attribute boolean enabled;30 readonly attribute DOMString kind; 31 readonly attribute DOMString label; 32 attribute boolean enabled; 33 33 }; 34 34 -
trunk/Source/WebCore/dom/MediaStreamTrackList.cpp
r95901 r97904 1 1 /* 2 2 * Copyright (C) 2011 Google Inc. All rights reserved. 3 * Copyright (C) 2011 Ericsson AB. All rights reserved. 3 4 * 4 5 * Redistribution and use in source and binary forms, with or without … … 30 31 namespace WebCore { 31 32 32 PassRefPtr<MediaStreamTrackList> MediaStreamTrackList::create(const TrackVector& tracks)33 PassRefPtr<MediaStreamTrackList> MediaStreamTrackList::create(const MediaStreamTrackVector& trackVector) 33 34 { 34 return adoptRef(new MediaStreamTrackList(track s));35 return adoptRef(new MediaStreamTrackList(trackVector)); 35 36 } 36 37 37 MediaStreamTrackList::MediaStreamTrackList(const TrackVector& tracks)38 : m_track s(tracks)38 MediaStreamTrackList::MediaStreamTrackList(const MediaStreamTrackVector& trackVector) 39 : m_trackVector(trackVector) 39 40 { 40 41 } … … 46 47 unsigned MediaStreamTrackList::length() const 47 48 { 48 return m_track s.size();49 return m_trackVector.size(); 49 50 } 50 51 51 PassRefPtr<MediaStreamTrack>MediaStreamTrackList::item(unsigned index) const52 MediaStreamTrack* MediaStreamTrackList::item(unsigned index) const 52 53 { 53 if (index < m_tracks.size()) 54 return m_tracks.at(index); 55 else 56 return PassRefPtr<MediaStreamTrack>(); 54 ASSERT(index < length()); 55 return m_trackVector[index].get(); 57 56 } 58 57 -
trunk/Source/WebCore/dom/MediaStreamTrackList.h
r95901 r97904 29 29 30 30 #include "MediaStreamTrack.h" 31 #include <wtf/PassRefPtr.h>32 #include <wtf/RefCounted.h>33 #include <wtf/RefPtr.h>34 31 35 32 namespace WebCore { … … 37 34 class MediaStreamTrackList : public RefCounted<MediaStreamTrackList> { 38 35 public: 39 static PassRefPtr<MediaStreamTrackList> create(const TrackVector& m_tracks);36 static PassRefPtr<MediaStreamTrackList> create(const MediaStreamTrackVector&); 40 37 virtual ~MediaStreamTrackList(); 41 38 42 39 // DOM methods & attributes for MediaStreamTrackList 43 40 unsigned length() const; 44 PassRefPtr<MediaStreamTrack> item(unsigned index) const; 45 46 void associateStream(const String& label) { m_associatedStreamLabel = label; } 41 MediaStreamTrack* item(unsigned index) const; 47 42 48 43 private: 49 MediaStreamTrackList(const TrackVector& m_tracks);44 MediaStreamTrackList(const MediaStreamTrackVector&); 50 45 51 TrackVector m_tracks; 52 String m_associatedStreamLabel; 46 MediaStreamTrackVector m_trackVector; 53 47 }; 54 48 -
trunk/Source/WebCore/p2p/PeerConnection.cpp
r97305 r97904 130 130 m_localStreams->append(stream); 131 131 132 // FIXME: get from stream->descriptor() when it's available, see http://webkit.org/b/68464 133 MediaStreamDescriptor* streamDescriptor = 0; 132 MediaStreamDescriptor* streamDescriptor = stream->descriptor(); 134 133 size_t i = m_pendingRemoveStreams.find(streamDescriptor); 135 134 if (i != notFound) { … … 157 156 m_localStreams->remove(stream); 158 157 159 // FIXME: get from stream->descriptor() when it's available, see http://webkit.org/b/68464 160 MediaStreamDescriptor* streamDescriptor = 0; 158 MediaStreamDescriptor* streamDescriptor = stream->descriptor(); 161 159 size_t i = m_pendingAddStreams.find(streamDescriptor); 162 160 if (i != notFound) { … … 216 214 return; 217 215 218 // FIXME: create a new MediaStream from the streamDescriptor once it's possible, see http://webkit.org/b/68464 219 RefPtr<MediaStream> stream = 0; 216 RefPtr<MediaStream> stream = MediaStream::create(scriptExecutionContext(), streamDescriptor); 220 217 m_remoteStreams->append(stream); 221 218 -
trunk/Source/WebCore/page/MediaStreamClient.h
r97305 r97904 47 47 virtual void mediaStreamDestroyed() = 0; 48 48 virtual void generateStream(int requestId, GenerateStreamOptionFlags, PassRefPtr<SecurityOrigin>) = 0; 49 virtual void stopGeneratedStream(const String& streamLabel) = 0;50 virtual void setMediaStreamTrackEnabled(const String& trackId, bool enabled) = 0;51 49 52 50 protected: -
trunk/Source/WebCore/page/MediaStreamController.cpp
r97305 r97904 29 29 30 30 #include "MediaStreamFrameController.h" 31 #include "MediaStreamTrackList.h"32 31 #include "SecurityOrigin.h" 33 32 #include <wtf/Vector.h> … … 82 81 for (Vector<int>::iterator it = frameRequests.begin(); it != frameRequests.end(); ++it) 83 82 m_requests.remove(*it); 84 85 Vector<String> frameStreams;86 for (StreamMap::iterator it = m_streams.begin(); it != m_streams.end(); ++it)87 if (it->second == frameController)88 frameStreams.append(it->first);89 90 for (Vector<String>::iterator it = frameStreams.begin(); it != frameStreams.end(); ++it)91 m_streams.remove(*it);92 93 // FIXME: Add unregister functionality for peer connection objects.94 83 } 95 84 … … 102 91 } 103 92 104 void MediaStreamController::registerStream(const String& streamLabel, MediaStreamFrameController* frameController)105 {106 ASSERT(frameController);107 ASSERT(!m_streams.contains(streamLabel));108 m_streams.add(streamLabel, frameController);109 }110 111 93 void MediaStreamController::generateStream(MediaStreamFrameController* frameController, int localId, GenerateStreamOptionFlags flags, PassRefPtr<SecurityOrigin> securityOrigin) 112 94 { … … 116 98 } 117 99 118 void MediaStreamController::stopGeneratedStream(const String& streamLabel) 119 { 120 m_client->stopGeneratedStream(streamLabel); 121 } 122 123 void MediaStreamController::setMediaStreamTrackEnabled(const String& trackId, bool enabled) 124 { 125 m_client->setMediaStreamTrackEnabled(trackId, enabled); 126 } 127 128 void MediaStreamController::streamGenerated(int controllerRequestId, const String& streamLabel, PassRefPtr<MediaStreamTrackList> tracks) 100 void MediaStreamController::streamGenerated(int controllerRequestId, const MediaStreamSourceVector& sources) 129 101 { 130 102 // Don't assert since the frame controller can have been destroyed while the request reply was coming back. 131 103 if (m_requests.contains(controllerRequestId)) { 132 104 const Request& request = m_requests.get(controllerRequestId); 133 registerStream(streamLabel, request.frameController());134 105 m_requests.remove(controllerRequestId); 135 106 ASSERT(request.frameController()); 136 request.frameController()->streamGenerated(request.localId(), s treamLabel, tracks);107 request.frameController()->streamGenerated(request.localId(), sources); 137 108 } 138 109 } … … 148 119 } 149 120 150 void MediaStreamController::streamFailed(const String& streamLabel)151 {152 // Don't assert since the frame controller can have been destroyed by the time this is called.153 if (m_streams.contains(streamLabel))154 m_streams.get(streamLabel)->streamFailed(streamLabel);155 }156 157 121 } // namespace WebCore 158 122 -
trunk/Source/WebCore/page/MediaStreamController.h
r97305 r97904 29 29 30 30 #include "MediaStreamClient.h" 31 #include "MediaStreamSource.h" 31 32 #include "NavigatorUserMediaError.h" 32 33 #include <wtf/Forward.h> … … 39 40 class MediaStreamClient; 40 41 class MediaStreamFrameController; 41 class MediaStreamTrackList;42 42 class SecurityOrigin; 43 43 … … 52 52 53 53 void generateStream(MediaStreamFrameController*, int requestId, GenerateStreamOptionFlags, PassRefPtr<SecurityOrigin>); 54 void stopGeneratedStream(const String& streamLabel);55 54 56 // Enable/disable an track. 57 void setMediaStreamTrackEnabled(const String& trackId, bool enabled); 58 59 void streamGenerated(int requestId, const String& streamLabel, PassRefPtr<MediaStreamTrackList> tracks); 55 void streamGenerated(int requestId, const MediaStreamSourceVector& sources); 60 56 void streamGenerationFailed(int requestId, NavigatorUserMediaError::ErrorCode); 61 void streamFailed(const String& streamLabel);62 57 63 58 private: 64 59 int registerRequest(int localRequestId, MediaStreamFrameController*); 65 void registerStream(const String& streamLabel, MediaStreamFrameController*);66 60 67 61 class Request; 68 62 typedef HashMap<int, Request> RequestMap; 69 typedef HashMap<String, MediaStreamFrameController*> StreamMap;70 63 71 64 RequestMap m_requests; 72 StreamMap m_streams;73 65 74 66 MediaStreamClient* m_client; -
trunk/Source/WebCore/page/MediaStreamFrameController.cpp
r97305 r97904 33 33 #include "LocalMediaStream.h" 34 34 #include "MediaStreamController.h" 35 #include "MediaStreamTrackList.h"36 35 #include "NavigatorUserMediaErrorCallback.h" 37 36 #include "NavigatorUserMediaSuccessCallback.h" … … 49 48 ScriptExecutionContext* scriptExecutionContext() const { return m_scriptExecutionContext; } 50 49 virtual bool isGenerateStreamRequest() const { return false; } 51 virtual bool isRecordedDataRequest() const { return false; }52 virtual bool isSignalingRequest() const { return false; }53 50 54 51 virtual void abort() = 0; … … 116 113 } 117 114 118 template <typename T>119 void MediaStreamFrameController::ClientMapBase<T>::unregisterAll()120 {121 while (!this->isEmpty()) {122 T key = this->begin()->first;123 // unregister should remove the element from the map.124 this->begin()->second->unregister();125 ASSERT_UNUSED(key, !this->contains(key));126 }127 }128 129 template <typename T>130 void MediaStreamFrameController::ClientMapBase<T>::detachEmbedder()131 {132 for (typename MapType::iterator it = this->begin(); it != this->end(); ++it)133 it->second->detachEmbedder();134 }135 136 115 MediaStreamFrameController::MediaStreamFrameController(Frame* frame) 137 116 : m_frame(frame) … … 161 140 } 162 141 163 void MediaStreamFrameController::unregister(MediaStreamClient* client)164 {165 ASSERT(m_streams.contains(client->clientId()));166 167 // Assuming we should stop any live streams when losing access to the embedder.168 if (client->isLocalMediaStream()) {169 LocalMediaStream* stream = static_cast<LocalMediaStream*>(client);170 if (stream->readyState() == MediaStream::LIVE)171 stopGeneratedStream(stream->label());172 }173 174 m_streams.remove(client->clientId());175 }176 177 void MediaStreamFrameController::unregister(GenericClient* client)178 {179 ASSERT(m_clients.contains(client->clientId()));180 m_clients.remove(client->clientId());181 }182 183 MediaStream* MediaStreamFrameController::getStreamFromLabel(const String& label) const184 {185 ASSERT(m_streams.contains(label));186 ASSERT(m_streams.get(label)->isMediaStream());187 return static_cast<MediaStream*>(m_streams.get(label));188 }189 190 142 void MediaStreamFrameController::enterDetachedState() 191 143 { … … 196 148 197 149 m_requests.abortAll(); 198 m_streams.detachEmbedder();199 m_clients.detachEmbedder();200 150 m_isInDetachedState = true; 201 151 } … … 225 175 226 176 ASSERT(m_requests.isEmpty()); 227 m_streams.unregisterAll();228 m_clients.unregisterAll();229 177 230 178 m_frame = 0; … … 299 247 } 300 248 301 void MediaStreamFrameController::stopGeneratedStream(const String& streamLabel) 302 { 303 ASSERT(m_streams.contains(streamLabel)); 304 ASSERT(m_streams.get(streamLabel)->isLocalMediaStream()); 305 306 if (isClientAvailable()) 307 pageController()->stopGeneratedStream(streamLabel); 308 } 309 310 void MediaStreamFrameController::setMediaStreamTrackEnabled(const String& trackId, bool enabled) 311 { 312 if (isClientAvailable()) 313 pageController()->setMediaStreamTrackEnabled(trackId, enabled); 314 } 315 316 void MediaStreamFrameController::streamGenerated(int requestId, const String& label, PassRefPtr<MediaStreamTrackList> tracksParam) 249 void MediaStreamFrameController::streamGenerated(int requestId, const MediaStreamSourceVector& sources) 317 250 { 318 251 // Don't assert since the request can have been aborted as a result of embedder detachment. … … 321 254 322 255 ASSERT(m_requests.get(requestId)->isGenerateStreamRequest()); 323 ASSERT(!label.isNull());324 ASSERT(tracksParam);325 326 RefPtr<MediaStreamTrackList> tracks = tracksParam;327 328 for (unsigned i = 0; i < tracks->length(); ++i) {329 int trackClientId = m_clients.getNextId();330 RefPtr<MediaStreamTrack> track = tracks->item(i);331 track->associateFrameController(this, trackClientId);332 m_clients.add(trackClientId, track.get());333 }334 256 335 257 RefPtr<GenerateStreamRequest> streamRequest = static_cast<GenerateStreamRequest*>(m_requests.get(requestId).get()); 336 RefPtr<LocalMediaStream> generatedStream = LocalMediaStream::create(this, label, tracks.release()); 337 m_streams.add(label, generatedStream.get()); 258 RefPtr<LocalMediaStream> generatedStream = LocalMediaStream::create(scriptExecutionContext(), sources); 338 259 m_requests.remove(requestId); 339 260 streamRequest->successCallback()->handleEvent(generatedStream.get()); … … 357 278 } 358 279 359 void MediaStreamFrameController::streamFailed(const String& label)360 {361 getStreamFromLabel(label)->streamEnded();362 }363 364 280 } // namespace WebCore 365 281 -
trunk/Source/WebCore/page/MediaStreamFrameController.h
r97305 r97904 30 30 #include "ExceptionCode.h" 31 31 #include "MediaStreamClient.h" 32 #include "MediaStreamSource.h" 32 33 #include "NavigatorUserMediaError.h" 33 34 #include <wtf/Forward.h> … … 39 40 40 41 class Frame; 41 class LocalMediaStream;42 class MediaStream;43 42 class MediaStreamController; 44 class MediaStreamTrackList;45 43 class NavigatorUserMediaErrorCallback; 46 44 class NavigatorUserMediaSuccessCallback; … … 48 46 class ScriptExecutionContext; 49 47 class SecurityOrigin; 50 class SignalingCallback;51 48 52 49 class MediaStreamFrameController { 53 50 WTF_MAKE_NONCOPYABLE(MediaStreamFrameController); 54 51 public: 55 template <typename IdType>56 class ClientBase {57 WTF_MAKE_NONCOPYABLE(ClientBase);58 public:59 ClientBase() : m_frameController(0), m_clientId(0) { }60 61 ClientBase(MediaStreamFrameController* frameController, const IdType& id)62 : m_frameController(frameController)63 , m_clientId(id) { }64 65 virtual ~ClientBase() { }66 67 MediaStreamFrameController* mediaStreamFrameController() const { return m_frameController; }68 const IdType& clientId() const { return m_clientId; }69 70 virtual bool isMediaStream() const { return false; }71 virtual bool isLocalMediaStream() const { return false; }72 virtual bool isGenericClient() const { return false; }73 74 // Called when the frame controller is being disconnected to the MediaStreamClient embedder.75 // Clients should override this to send any required shutdown messages.76 virtual void detachEmbedder() { }77 78 protected:79 // Used for objects that are optionally associated to the frame controller after construction, like the MediaStreamTracks.80 void associateFrameController(MediaStreamFrameController* frameController, const IdType& id)81 {82 ASSERT(!m_frameController && !m_clientId);83 m_frameController = frameController;84 m_clientId = id;85 }86 87 // Avoids repeating the same code in the unregister method of each derived class.88 // This is required since the controller's unregister methods make use of the isObject virtuals,89 // and the unregistration can be triggered either by the destructor of the client or by the disconnection of the frame.90 template <typename ClientType>91 void unregisterClient(ClientType* client)92 {93 if (!m_frameController)94 return;95 96 m_frameController->unregister(static_cast<ClientType*>(client));97 m_frameController = 0;98 }99 100 virtual void unregister() = 0;101 friend class MediaStreamFrameController;102 103 MediaStreamFrameController* m_frameController;104 IdType m_clientId;105 };106 107 class MediaStreamClient : public ClientBase<String> {108 public:109 MediaStreamClient(MediaStreamFrameController* frameController, const String& label, bool isLocalMediaStream)110 : ClientBase<String>(frameController, label)111 , m_isLocalMediaStream(isLocalMediaStream) { }112 113 virtual ~MediaStreamClient() { unregister(); }114 115 virtual bool isMediaStream() const { return true; }116 117 // Accessed by the destructor.118 virtual bool isLocalMediaStream() const { return m_isLocalMediaStream; }119 120 // Stream has ended for some external reason.121 virtual void streamEnded() = 0;122 123 private:124 virtual void unregister() { unregisterClient(this); }125 bool m_isLocalMediaStream;126 };127 128 // Generic clients are objects that require access to the frame controller but don't have a global id (like streams do)129 // or need to receive any messages from the embedder client.130 class GenericClient : public ClientBase<int> {131 public:132 GenericClient() { }133 GenericClient(MediaStreamFrameController* frameController, int id) : ClientBase<int>(frameController, id) { }134 virtual ~GenericClient() { unregister(); }135 virtual bool isGenericClient() const { return true; }136 137 private:138 virtual void unregister() { unregisterClient(this); }139 };140 141 52 MediaStreamFrameController(Frame*); 142 53 virtual ~MediaStreamFrameController(); … … 152 63 static GenerateStreamOptionFlags parseGenerateStreamOptions(const String&); 153 64 void generateStream(const String& options, PassRefPtr<NavigatorUserMediaSuccessCallback>, PassRefPtr<NavigatorUserMediaErrorCallback>, ExceptionCode&); 154 void stopGeneratedStream(const String& streamLabel);155 void setMediaStreamTrackEnabled(const String& trackId, bool enabled);156 65 157 66 // --- Calls coming back from the controller. --- // 158 67 159 void streamGenerated(int requestId, const String& streamLabel, PassRefPtr<MediaStreamTrackList> tracks);68 void streamGenerated(int requestId, const MediaStreamSourceVector& sources); 160 69 void streamGenerationFailed(int requestId, NavigatorUserMediaError::ErrorCode); 161 void streamFailed(const String& streamLabel);162 70 163 71 private: … … 181 89 }; 182 90 183 template <typename IdType>184 class ClientMapBase : public HashMap<IdType, ClientBase<IdType>* > {185 WTF_MAKE_NONCOPYABLE(ClientMapBase);186 public:187 typedef HashMap<IdType, ClientBase<IdType>* > MapType;188 189 ClientMapBase() { }190 void unregisterAll();191 void detachEmbedder();192 };193 194 // Streams are a special class of clients since they are identified by a global label string instead of an id.195 typedef ClientMapBase<String> StreamMap;196 197 // All other types of clients use autogenerated integer ids.198 class ClientMap : public IdGenerator, public ClientMapBase<int> { };199 200 91 // Detached from a page, and hence from a embedder client. 201 92 void enterDetachedState(); 202 93 203 void unregister(MediaStreamClient*);204 void unregister(GenericClient*);205 94 MediaStreamController* pageController() const; 206 MediaStream* getStreamFromLabel(const String&) const;207 95 208 96 RequestMap m_requests; 209 ClientMap m_clients;210 StreamMap m_streams;211 97 212 98 Frame* m_frame; -
trunk/Source/WebKit/chromium/ChangeLog
r97896 r97904 1 2011-10-19 Adam Bergkvist <adam.bergkvist@ericsson.com> 2 3 Update MediaStream to use WebCore platform interfaces 4 https://bugs.webkit.org/show_bug.cgi?id=68464 5 6 Reviewed by Adam Barth. 7 8 Removed WebMediaStreamTrack* since they will no longer be needed. 9 10 * WebKit.gyp: 11 * public/WebMediaStreamTrack.h: Removed. 12 * public/WebMediaStreamTrackList.h: Removed. 13 * src/WebMediaStreamTrack.cpp: Removed. 14 * src/WebMediaStreamTrackList.cpp: Removed. 15 1 16 2011-10-19 Zhenyao Mo <zmo@google.com> 2 17 -
trunk/Source/WebKit/chromium/WebKit.gyp
r97550 r97904 229 229 'public/WebMediaPlayerAction.h', 230 230 'public/WebMediaPlayerClient.h', 231 'public/WebMediaStreamTrack.h',232 'public/WebMediaStreamTrackList.h',233 231 'public/WebMenuItemInfo.h', 234 232 'public/WebMessagePortChannel.h', … … 554 552 'src/WebMediaPlayerClientImpl.cpp', 555 553 'src/WebMediaPlayerClientImpl.h', 556 'src/WebMediaStreamTrack.cpp',557 'src/WebMediaStreamTrackList.cpp',558 554 'src/WebNamedNodeMap.cpp', 559 555 'src/WebNetworkStateNotifier.cpp',
Note: See TracChangeset
for help on using the changeset viewer.