Title: [88341] trunk/Source/WebCore
Revision
88341
Author
commit-qu...@webkit.org
Date
2011-06-08 06:08:11 -0700 (Wed, 08 Jun 2011)

Log Message

2011-06-08  Tommy Widenflycht  <tom...@google.com>

        Reviewed by Tony Gentilcore.

        Media Stream API: integrate the Track List objects into the existing code.
        https://bugs.webkit.org/show_bug.cgi?id=60205

        Tests for the Media Stream API will be provided by the bug 56587.

        * dom/ExclusiveTrackList.cpp:
        (WebCore::ExclusiveTrackList::select):
        (WebCore::ExclusiveTrackList::trackFailed):
        * dom/ExclusiveTrackList.h:
        * dom/GeneratedStream.cpp:
        (WebCore::GeneratedStream::create):
        (WebCore::GeneratedStream::GeneratedStream):
        (WebCore::GeneratedStream::streamEnded):
        (WebCore::GeneratedStream::audioTracks):
        (WebCore::GeneratedStream::videoTracks):
        (WebCore::GeneratedStream::stop):
        * dom/GeneratedStream.h:
        * dom/GeneratedStream.idl:
        * dom/MultipleTrackList.cpp:
        (WebCore::MultipleTrackList::trackFailed):
        (WebCore::MultipleTrackList::enable):
        (WebCore::MultipleTrackList::disable):
        * dom/MultipleTrackList.h:
        * dom/Stream.h:
        * dom/TrackList.cpp:
        (WebCore::TrackList::clear):
        (WebCore::TrackList::associateStream):
        (WebCore::TrackList::associatedStreamLabel):
        (WebCore::TrackList::trackFailed):
        (WebCore::TrackList::scriptExecutionContext):
        * dom/TrackList.h:
        * page/MediaStreamClient.h:
        * page/MediaStreamController.cpp:
        (WebCore::MediaStreamController::enableAudioTrack):
        (WebCore::MediaStreamController::disableAudioTrack):
        (WebCore::MediaStreamController::selectVideoTrack):
        (WebCore::MediaStreamController::streamGenerated):
        (WebCore::MediaStreamController::audioTrackFailed):
        (WebCore::MediaStreamController::videoTrackFailed):
        * page/MediaStreamController.h:
        * page/MediaStreamFrameController.cpp:
        (WebCore::MediaStreamFrameController::unregister):
        (WebCore::MediaStreamFrameController::enterDetachedState):
        (WebCore::MediaStreamFrameController::disconnectFrame):
        (WebCore::MediaStreamFrameController::enableAudioTrack):
        (WebCore::MediaStreamFrameController::disableAudioTrack):
        (WebCore::MediaStreamFrameController::selectVideoTrack):
        (WebCore::MediaStreamFrameController::streamGenerated):
        (WebCore::MediaStreamFrameController::audioTrackFailed):
        (WebCore::MediaStreamFrameController::videoTrackFailed):
        * page/MediaStreamFrameController.h:
        (WebCore::MediaStreamFrameController::ClientBase::isGenericClient):
        (WebCore::MediaStreamFrameController::GenericClient::GenericClient):
        (WebCore::MediaStreamFrameController::GenericClient::~GenericClient):
        (WebCore::MediaStreamFrameController::GenericClient::isGenericClient):
        (WebCore::MediaStreamFrameController::GenericClient::unregister):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (88340 => 88341)


--- trunk/Source/WebCore/ChangeLog	2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/ChangeLog	2011-06-08 13:08:11 UTC (rev 88341)
@@ -1,3 +1,64 @@
+2011-06-08  Tommy Widenflycht  <tom...@google.com>
+
+        Reviewed by Tony Gentilcore.
+
+        Media Stream API: integrate the Track List objects into the existing code.
+        https://bugs.webkit.org/show_bug.cgi?id=60205
+
+        Tests for the Media Stream API will be provided by the bug 56587.
+
+        * dom/ExclusiveTrackList.cpp:
+        (WebCore::ExclusiveTrackList::select):
+        (WebCore::ExclusiveTrackList::trackFailed):
+        * dom/ExclusiveTrackList.h:
+        * dom/GeneratedStream.cpp:
+        (WebCore::GeneratedStream::create):
+        (WebCore::GeneratedStream::GeneratedStream):
+        (WebCore::GeneratedStream::streamEnded):
+        (WebCore::GeneratedStream::audioTracks):
+        (WebCore::GeneratedStream::videoTracks):
+        (WebCore::GeneratedStream::stop):
+        * dom/GeneratedStream.h:
+        * dom/GeneratedStream.idl:
+        * dom/MultipleTrackList.cpp:
+        (WebCore::MultipleTrackList::trackFailed):
+        (WebCore::MultipleTrackList::enable):
+        (WebCore::MultipleTrackList::disable):
+        * dom/MultipleTrackList.h:
+        * dom/Stream.h:
+        * dom/TrackList.cpp:
+        (WebCore::TrackList::clear):
+        (WebCore::TrackList::associateStream):
+        (WebCore::TrackList::associatedStreamLabel):
+        (WebCore::TrackList::trackFailed):
+        (WebCore::TrackList::scriptExecutionContext):
+        * dom/TrackList.h:
+        * page/MediaStreamClient.h:
+        * page/MediaStreamController.cpp:
+        (WebCore::MediaStreamController::enableAudioTrack):
+        (WebCore::MediaStreamController::disableAudioTrack):
+        (WebCore::MediaStreamController::selectVideoTrack):
+        (WebCore::MediaStreamController::streamGenerated):
+        (WebCore::MediaStreamController::audioTrackFailed):
+        (WebCore::MediaStreamController::videoTrackFailed):
+        * page/MediaStreamController.h:
+        * page/MediaStreamFrameController.cpp:
+        (WebCore::MediaStreamFrameController::unregister):
+        (WebCore::MediaStreamFrameController::enterDetachedState):
+        (WebCore::MediaStreamFrameController::disconnectFrame):
+        (WebCore::MediaStreamFrameController::enableAudioTrack):
+        (WebCore::MediaStreamFrameController::disableAudioTrack):
+        (WebCore::MediaStreamFrameController::selectVideoTrack):
+        (WebCore::MediaStreamFrameController::streamGenerated):
+        (WebCore::MediaStreamFrameController::audioTrackFailed):
+        (WebCore::MediaStreamFrameController::videoTrackFailed):
+        * page/MediaStreamFrameController.h:
+        (WebCore::MediaStreamFrameController::ClientBase::isGenericClient):
+        (WebCore::MediaStreamFrameController::GenericClient::GenericClient):
+        (WebCore::MediaStreamFrameController::GenericClient::~GenericClient):
+        (WebCore::MediaStreamFrameController::GenericClient::isGenericClient):
+        (WebCore::MediaStreamFrameController::GenericClient::unregister):
+
 2011-06-08  Pavel Podivilov  <podivi...@chromium.org>
 
         Reviewed by Yury Semikhatsky.

Modified: trunk/Source/WebCore/dom/ExclusiveTrackList.cpp (88340 => 88341)


--- trunk/Source/WebCore/dom/ExclusiveTrackList.cpp	2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/dom/ExclusiveTrackList.cpp	2011-06-08 13:08:11 UTC (rev 88341)
@@ -60,9 +60,25 @@
         return;
 
     m_selectedIndex = index;
+
+#if ENABLE(MEDIA_STREAM)
+    if (mediaStreamFrameController())
+        mediaStreamFrameController()->selectVideoTrack(associatedStreamLabel(), index);
+#endif
+
     postChangeEvent();
 }
 
+#if ENABLE(MEDIA_STREAM)
+void ExclusiveTrackList::trackFailed(unsigned long index)
+{
+    if (m_selectedIndex == static_cast<long>(index))
+        m_selectedIndex = NoSelection;
+
+    TrackList::trackFailed(index);
+}
+#endif
+
 ExclusiveTrackList* ExclusiveTrackList::toExclusiveTrackList()
 {
     return this;

Modified: trunk/Source/WebCore/dom/ExclusiveTrackList.h (88340 => 88341)


--- trunk/Source/WebCore/dom/ExclusiveTrackList.h	2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/dom/ExclusiveTrackList.h	2011-06-08 13:08:11 UTC (rev 88341)
@@ -44,6 +44,10 @@
 
     virtual void clear();
 
+#if ENABLE(MEDIA_STREAM)
+    virtual void trackFailed(unsigned long index);
+#endif
+
     // EventTarget implementation.
     virtual ExclusiveTrackList* toExclusiveTrackList();
 

Modified: trunk/Source/WebCore/dom/GeneratedStream.cpp (88340 => 88341)


--- trunk/Source/WebCore/dom/GeneratedStream.cpp	2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/dom/GeneratedStream.cpp	2011-06-08 13:08:11 UTC (rev 88341)
@@ -29,7 +29,9 @@
 
 #include "Event.h"
 #include "EventNames.h"
+#include "ExclusiveTrackList.h"
 #include "MediaStreamFrameController.h"
+#include "MultipleTrackList.h"
 #include "ScriptExecutionContext.h"
 
 namespace WebCore {
@@ -57,14 +59,20 @@
     Callback m_callback;
 };
 
-PassRefPtr<GeneratedStream> GeneratedStream::create(MediaStreamFrameController* frameController, const String& label)
+PassRefPtr<GeneratedStream> GeneratedStream::create(MediaStreamFrameController* frameController, const String& label, PassRefPtr<MultipleTrackList> audioTracks, PassRefPtr<ExclusiveTrackList> videoTracks)
 {
-    return adoptRef(new GeneratedStream(frameController, label));
+    return adoptRef(new GeneratedStream(frameController, label, audioTracks, videoTracks));
 }
 
-GeneratedStream::GeneratedStream(MediaStreamFrameController* frameController, const String& label)
+GeneratedStream::GeneratedStream(MediaStreamFrameController* frameController, const String& label, PassRefPtr<MultipleTrackList> audioTracks, PassRefPtr<ExclusiveTrackList> videoTracks)
     : Stream(frameController, label, true)
+    , m_audioTracks(audioTracks)
+    , m_videoTracks(videoTracks)
 {
+    ASSERT(m_audioTracks);
+    ASSERT(m_videoTracks);
+    m_audioTracks->associateStream(label);
+    m_videoTracks->associateStream(label);
 }
 
 GeneratedStream::~GeneratedStream()
@@ -84,12 +92,32 @@
     Stream::detachEmbedder();
 }
 
+void GeneratedStream::streamEnded()
+{
+    m_audioTracks->clear();
+    m_videoTracks->clear();
+
+    Stream::streamEnded();
+}
+
+PassRefPtr<MultipleTrackList> GeneratedStream::audioTracks() const
+{
+    return m_audioTracks;
+}
+
+PassRefPtr<ExclusiveTrackList> GeneratedStream::videoTracks() const
+{
+    return m_videoTracks;
+}
+
 void GeneratedStream::stop()
 {
     if (!mediaStreamFrameController() || m_readyState == ENDED)
         return;
 
     mediaStreamFrameController()->stopGeneratedStream(label());
+    m_audioTracks->clear();
+    m_videoTracks->clear();
 
     m_readyState = ENDED;
 

Modified: trunk/Source/WebCore/dom/GeneratedStream.h (88340 => 88341)


--- trunk/Source/WebCore/dom/GeneratedStream.h	2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/dom/GeneratedStream.h	2011-06-08 13:08:11 UTC (rev 88341)
@@ -32,26 +32,35 @@
 
 namespace WebCore {
 
+class ExclusiveTrackList;
+class MultipleTrackList;
+
 class GeneratedStream : public Stream {
 public:
-    // FIXME: add audio and video tracks when available.
-    static PassRefPtr<GeneratedStream> create(MediaStreamFrameController*, const String& label);
+    static PassRefPtr<GeneratedStream> create(MediaStreamFrameController*, const String& label, PassRefPtr<MultipleTrackList> audioTracks, PassRefPtr<ExclusiveTrackList> videoTracks);
     virtual ~GeneratedStream();
 
     void stop();
 
+    PassRefPtr<MultipleTrackList> audioTracks() const;
+    PassRefPtr<ExclusiveTrackList> videoTracks() const;
+
     // MediaStreamFrameController::StreamClient implementation.
     virtual void detachEmbedder();
+    virtual void streamEnded();
 
     // EventTarget.
     virtual GeneratedStream* toGeneratedStream();
 
 private:
-    GeneratedStream(MediaStreamFrameController*, const String& label);
+    GeneratedStream(MediaStreamFrameController*, const String& label, PassRefPtr<MultipleTrackList> audioTracks, PassRefPtr<ExclusiveTrackList> videoTracks);
     class DispatchUpdateTask;
     friend class DispatchUpdateTask;
 
     void onStop();
+
+    RefPtr<MultipleTrackList> m_audioTracks;
+    RefPtr<ExclusiveTrackList> m_videoTracks;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/dom/GeneratedStream.idl (88340 => 88341)


--- trunk/Source/WebCore/dom/GeneratedStream.idl	2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/dom/GeneratedStream.idl	2011-06-08 13:08:11 UTC (rev 88341)
@@ -30,7 +30,9 @@
     ] GeneratedStream : Stream {
         void stop();
 
-        // FIXME: implement audio and video tracks when available.
+        // Track control.
+        readonly attribute MultipleTrackList audioTracks;
+        readonly attribute ExclusiveTrackList videoTracks;
     };
 
 }

Modified: trunk/Source/WebCore/dom/MultipleTrackList.cpp (88340 => 88341)


--- trunk/Source/WebCore/dom/MultipleTrackList.cpp	2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/dom/MultipleTrackList.cpp	2011-06-08 13:08:11 UTC (rev 88341)
@@ -54,6 +54,14 @@
     TrackList::clear();
 }
 
+#if ENABLE(MEDIA_STREAM)
+void MultipleTrackList::trackFailed(unsigned long index)
+{
+    TrackList::trackFailed(index);
+    m_isEnabled.remove(index);
+}
+#endif
+
 bool MultipleTrackList::isEnabled(unsigned long index, ExceptionCode& ec) const
 {
     return checkIndex(index, ec) ? m_isEnabled[index] : false;
@@ -65,6 +73,12 @@
         return;
 
     m_isEnabled[index] = true;
+
+#if ENABLE(MEDIA_STREAM)
+    if (mediaStreamFrameController())
+        mediaStreamFrameController()->enableAudioTrack(associatedStreamLabel(), index);
+#endif
+
     postChangeEvent();
 }
 
@@ -74,6 +88,12 @@
         return;
 
     m_isEnabled[index] = false;
+
+#if ENABLE(MEDIA_STREAM)
+    if (mediaStreamFrameController())
+        mediaStreamFrameController()->disableAudioTrack(associatedStreamLabel(), index);
+#endif
+
     postChangeEvent();
 }
 

Modified: trunk/Source/WebCore/dom/MultipleTrackList.h (88340 => 88341)


--- trunk/Source/WebCore/dom/MultipleTrackList.h	2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/dom/MultipleTrackList.h	2011-06-08 13:08:11 UTC (rev 88341)
@@ -45,6 +45,10 @@
 
     virtual void clear();
 
+#if ENABLE(MEDIA_STREAM)
+    virtual void trackFailed(unsigned long index);
+#endif
+
     // EventTarget implementation.
     virtual MultipleTrackList* toMultipleTrackList();
 

Modified: trunk/Source/WebCore/dom/Stream.h (88340 => 88341)


--- trunk/Source/WebCore/dom/Stream.h	2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/dom/Stream.h	2011-06-08 13:08:11 UTC (rev 88341)
@@ -52,7 +52,6 @@
 
     // FIXME: implement the record method when StreamRecorder is available.
 
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(readystatechange);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(ended);
 
     unsigned short readyState() const { return m_readyState; }

Modified: trunk/Source/WebCore/dom/TrackList.cpp (88340 => 88341)


--- trunk/Source/WebCore/dom/TrackList.cpp	2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/dom/TrackList.cpp	2011-06-08 13:08:11 UTC (rev 88341)
@@ -103,7 +103,15 @@
 
 void TrackList::clear()
 {
+#if ENABLE(MEDIA_STREAM)
+    m_associatedStreamLabel = String();
+#endif
+
+    if (m_tracks.isEmpty())
+        return;
+
     m_tracks.clear();
+
     postChangeEvent();
 }
 
@@ -123,6 +131,26 @@
     dispatchEvent(Event::create(eventNames().changeEvent, false, false));
 }
 
+#if ENABLE(MEDIA_STREAM)
+void TrackList::associateStream(const String& label)
+{
+    ASSERT(m_associatedStreamLabel.isNull());
+    m_associatedStreamLabel = label;
+}
+
+const String& TrackList::associatedStreamLabel() const
+{
+    return m_associatedStreamLabel;
+}
+
+void TrackList::trackFailed(unsigned long index)
+{
+    ASSERT(index < length());
+    m_tracks.remove(index);
+    postChangeEvent();
+}
+#endif
+
 TrackList* TrackList::toTrackList()
 {
     return this;
@@ -130,9 +158,13 @@
 
 ScriptExecutionContext* TrackList::scriptExecutionContext() const
 {
-    // FIXME: provide an script execution context for HTML Media Element and MediaStream API use cases.
-    // For the MediaStream API: https://bugs.webkit.org/show_bug.cgi?id=60205
-    // For the HTML Media Element: https://bugs.webkit.org/show_bug.cgi?id=61127
+#if ENABLE(MEDIA_STREAM)
+    if (mediaStreamFrameController())
+        return mediaStreamFrameController()->scriptExecutionContext();
+#endif
+
+    // FIXME: provide an script execution context for HTML Media Element use case.
+    // https://bugs.webkit.org/show_bug.cgi?id=61127
     return 0;
 }
 

Modified: trunk/Source/WebCore/dom/TrackList.h (88340 => 88341)


--- trunk/Source/WebCore/dom/TrackList.h	2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/dom/TrackList.h	2011-06-08 13:08:11 UTC (rev 88341)
@@ -58,6 +58,9 @@
 typedef Vector<RefPtr<Track> > TrackVector;
 
 class TrackList : public RefCounted<TrackList>,
+#if ENABLE(MEDIA_STREAM)
+                  public MediaStreamFrameController::GenericClient,
+#endif
                   public EventTarget {
 public:
     static PassRefPtr<TrackList> create(const TrackVector&);
@@ -73,6 +76,12 @@
 
     virtual void clear();
 
+#if ENABLE(MEDIA_STREAM)
+    void associateStream(const String& streamLabel);
+    const String& associatedStreamLabel() const;
+    virtual void trackFailed(unsigned long index);
+#endif
+
     // EventTarget implementation.
     virtual TrackList* toTrackList();
     virtual ScriptExecutionContext* scriptExecutionContext() const;
@@ -124,6 +133,10 @@
 
     EventTargetData m_eventTargetData;
     TrackVector m_tracks;
+
+#if ENABLE(MEDIA_STREAM)
+    String m_associatedStreamLabel;
+#endif
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/page/MediaStreamClient.h (88340 => 88341)


--- trunk/Source/WebCore/page/MediaStreamClient.h	2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/page/MediaStreamClient.h	2011-06-08 13:08:11 UTC (rev 88341)
@@ -52,6 +52,13 @@
     // Stop a generated stream.
     virtual void stopGeneratedStream(const String& streamLabel) = 0;
 
+    // Enable/disable an audio track in a generated stream.
+    virtual void enableAudioTrack(const String& streamLabel, unsigned long index) = 0;
+    virtual void disableAudioTrack(const String& streamLabel, unsigned long index) = 0;
+
+    // Select a video track in a generated stream.
+    virtual void selectVideoTrack(const String& streamLabel, long index) = 0;
+
 protected:
     virtual ~MediaStreamClient() { }
 };

Modified: trunk/Source/WebCore/page/MediaStreamController.cpp (88340 => 88341)


--- trunk/Source/WebCore/page/MediaStreamController.cpp	2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/page/MediaStreamController.cpp	2011-06-08 13:08:11 UTC (rev 88341)
@@ -27,7 +27,9 @@
 
 #if ENABLE(MEDIA_STREAM)
 
+#include "ExclusiveTrackList.h"
 #include "MediaStreamFrameController.h"
+#include "MultipleTrackList.h"
 #include "SecurityOrigin.h"
 #include <wtf/Vector.h>
 
@@ -117,15 +119,30 @@
     m_client->stopGeneratedStream(streamLabel);
 }
 
-void MediaStreamController::streamGenerated(int controllerRequestId, const String& streamLabel)
+void MediaStreamController::enableAudioTrack(const String& streamLabel, unsigned long index)
 {
+    m_client->enableAudioTrack(streamLabel, index);
+}
+
+void MediaStreamController::disableAudioTrack(const String& streamLabel, unsigned long index)
+{
+    m_client->disableAudioTrack(streamLabel, index);
+}
+
+void MediaStreamController::selectVideoTrack(const String& streamLabel, long index)
+{
+    m_client->selectVideoTrack(streamLabel, index);
+}
+
+void MediaStreamController::streamGenerated(int controllerRequestId, const String& streamLabel, PassRefPtr<MultipleTrackList> audioTracks, PassRefPtr<ExclusiveTrackList> videoTracks)
+{
     // Don't assert since the frame controller can have been destroyed while the request reply was coming back.
     if (m_requests.contains(controllerRequestId)) {
         const Request& request = m_requests.get(controllerRequestId);
         registerStream(streamLabel, request.frameController());
         m_requests.remove(controllerRequestId);
         ASSERT(request.frameController());
-        request.frameController()->streamGenerated(request.localId(), streamLabel);
+        request.frameController()->streamGenerated(request.localId(), streamLabel, audioTracks, videoTracks);
     }
 }
 
@@ -146,6 +163,20 @@
         m_streams.get(streamLabel)->streamFailed(streamLabel);
 }
 
+void MediaStreamController::audioTrackFailed(const String& streamLabel, unsigned long index)
+{
+    // Don't assert since the frame controller can have been destroyed by the time this is called.
+    if (m_streams.contains(streamLabel))
+        m_streams.get(streamLabel)->audioTrackFailed(streamLabel, index);
+}
+
+void MediaStreamController::videoTrackFailed(const String& streamLabel, unsigned long index)
+{
+    // Don't assert since the frame controller can have been destroyed by the time this is called.
+    if (m_streams.contains(streamLabel))
+        m_streams.get(streamLabel)->videoTrackFailed(streamLabel, index);
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(MEDIA_STREAM)

Modified: trunk/Source/WebCore/page/MediaStreamController.h (88340 => 88341)


--- trunk/Source/WebCore/page/MediaStreamController.h	2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/page/MediaStreamController.h	2011-06-08 13:08:11 UTC (rev 88341)
@@ -36,8 +36,10 @@
 
 namespace WebCore {
 
+class ExclusiveTrackList;
 class MediaStreamClient;
 class MediaStreamFrameController;
+class MultipleTrackList;
 class SecurityOrigin;
 
 class MediaStreamController {
@@ -51,10 +53,15 @@
 
     void generateStream(MediaStreamFrameController*, int requestId, GenerateStreamOptionFlags, PassRefPtr<SecurityOrigin>);
     void stopGeneratedStream(const String& streamLabel);
+    void enableAudioTrack(const String& streamLabel, unsigned long index);
+    void disableAudioTrack(const String& streamLabel, unsigned long index);
+    void selectVideoTrack(const String& streamLabel, long index);
 
-    void streamGenerated(int requestId, const String& streamLabel);
+    void streamGenerated(int requestId, const String& streamLabel, PassRefPtr<MultipleTrackList> audioTracks, PassRefPtr<ExclusiveTrackList> videoTracks);
     void streamGenerationFailed(int requestId, NavigatorUserMediaError::ErrorCode);
     void streamFailed(const String& streamLabel);
+    void audioTrackFailed(const String& streamLabel, unsigned long index);
+    void videoTrackFailed(const String& streamLabel, unsigned long index);
 
 private:
     int registerRequest(int localRequestId, MediaStreamFrameController*);

Modified: trunk/Source/WebCore/page/MediaStreamFrameController.cpp (88340 => 88341)


--- trunk/Source/WebCore/page/MediaStreamFrameController.cpp	2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/page/MediaStreamFrameController.cpp	2011-06-08 13:08:11 UTC (rev 88341)
@@ -29,9 +29,11 @@
 
 #include "DOMWindow.h"
 #include "Document.h"
+#include "ExclusiveTrackList.h"
 #include "Frame.h"
 #include "GeneratedStream.h"
 #include "MediaStreamController.h"
+#include "MultipleTrackList.h"
 #include "NavigatorUserMediaErrorCallback.h"
 #include "NavigatorUserMediaSuccessCallback.h"
 #include "Page.h"
@@ -172,6 +174,12 @@
     m_streams.remove(client->clientId());
 }
 
+void MediaStreamFrameController::unregister(GenericClient* client)
+{
+    ASSERT(m_clients.contains(client->clientId()));
+    m_clients.remove(client->clientId());
+}
+
 Stream* MediaStreamFrameController::getStreamFromLabel(const String& label) const
 {
     ASSERT(m_streams.contains(label));
@@ -188,6 +196,7 @@
 
     m_requests.abortAll();
     m_streams.detachEmbedder();
+    m_clients.detachEmbedder();
     m_isInDetachedState = true;
 }
 
@@ -216,6 +225,7 @@
 
     ASSERT(m_requests.isEmpty());
     m_streams.unregisterAll();
+    m_clients.unregisterAll();
 
     m_frame = 0;
 }
@@ -297,17 +307,60 @@
         pageController()->stopGeneratedStream(streamLabel);
 }
 
-void MediaStreamFrameController::streamGenerated(int requestId, const String& label)
+void MediaStreamFrameController::enableAudioTrack(const String& streamLabel, unsigned long index)
 {
+    // Don't assert since the audio tracks don't necessarily keep alive their associated generated stream object.
+    if (!m_streams.contains(streamLabel))
+        return;
+
+    if (isClientAvailable())
+        pageController()->enableAudioTrack(streamLabel, index);
+}
+
+void MediaStreamFrameController::disableAudioTrack(const String& streamLabel, unsigned long index)
+{
+    // Don't assert since the audio tracks don't necessarily keep alive their associated generated stream object.
+    if (!m_streams.contains(streamLabel))
+        return;
+
+    if (isClientAvailable())
+        pageController()->disableAudioTrack(streamLabel, index);
+}
+
+void MediaStreamFrameController::selectVideoTrack(const String& streamLabel, long index)
+{
+    // Don't assert since the audio tracks don't necessarily keep alive their associated generated stream object.
+    if (!m_streams.contains(streamLabel))
+        return;
+
+    if (isClientAvailable())
+        pageController()->selectVideoTrack(streamLabel, index);
+}
+
+void MediaStreamFrameController::streamGenerated(int requestId, const String& label, PassRefPtr<MultipleTrackList> audioTracksParam, PassRefPtr<ExclusiveTrackList> videoTracksParam)
+{
     // Don't assert since the request can have been aborted as a result of embedder detachment.
     if (!m_requests.contains(requestId))
         return;
 
     ASSERT(m_requests.get(requestId)->isGenerateStreamRequest());
     ASSERT(!label.isNull());
+    ASSERT(audioTracksParam);
+    ASSERT(videoTracksParam);
 
+    RefPtr<MultipleTrackList> audioTracks = audioTracksParam;
+    RefPtr<ExclusiveTrackList> videoTracks = videoTracksParam;
+
+    int audioTracksClientId = m_clients.getNextId();
+    audioTracks->associateFrameController(this, audioTracksClientId);
+    m_clients.add(audioTracksClientId, audioTracks.get());
+
+    int videoTracksClientId = m_clients.getNextId();
+    videoTracks->associateFrameController(this, videoTracksClientId);
+    m_clients.add(videoTracksClientId, videoTracks.get());
+
     RefPtr<GenerateStreamRequest> streamRequest = static_cast<GenerateStreamRequest*>(m_requests.get(requestId).get());
-    RefPtr<GeneratedStream> generatedStream = GeneratedStream::create(this, label);
+    RefPtr<GeneratedStream> generatedStream = GeneratedStream::create(this, label, audioTracks.release(), videoTracks.release());
     m_streams.add(label, generatedStream.get());
     m_requests.remove(requestId);
     streamRequest->successCallback()->handleEvent(generatedStream.get());
@@ -335,7 +388,20 @@
     getStreamFromLabel(label)->streamEnded();
 }
 
+void MediaStreamFrameController::audioTrackFailed(const String& label, unsigned long index)
+{
+    Stream* stream = getStreamFromLabel(label);
+    ASSERT(stream->isGeneratedStream());
+    static_cast<GeneratedStream*>(stream)->audioTracks()->trackFailed(index);
+}
 
+void MediaStreamFrameController::videoTrackFailed(const String& label, unsigned long index)
+{
+    Stream* stream = getStreamFromLabel(label);
+    ASSERT(stream->isGeneratedStream());
+    static_cast<GeneratedStream*>(stream)->videoTracks()->trackFailed(index);
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(MEDIA_STREAM)

Modified: trunk/Source/WebCore/page/MediaStreamFrameController.h (88340 => 88341)


--- trunk/Source/WebCore/page/MediaStreamFrameController.h	2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/page/MediaStreamFrameController.h	2011-06-08 13:08:11 UTC (rev 88341)
@@ -37,9 +37,11 @@
 
 namespace WebCore {
 
+class ExclusiveTrackList;
 class Frame;
 class GeneratedStream;
 class MediaStreamController;
+class MultipleTrackList;
 class NavigatorUserMediaErrorCallback;
 class NavigatorUserMediaSuccessCallback;
 class Page;
@@ -67,6 +69,7 @@
 
         virtual bool isStream() const { return false; }
         virtual bool isGeneratedStream() const { return false; }
+        virtual bool isGenericClient() const { return false; }
 
         // Called when the frame controller is being disconnected to the MediaStreamClient embedder.
         // Clients should override this to send any required shutdown messages.
@@ -122,6 +125,19 @@
         bool m_isGeneratedStream;
     };
 
+    // Generic clients are objects that require access to the frame controller but don't have a global id (like streams do)
+    // or need to receive any messages from the embedder client.
+    class GenericClient : public ClientBase<int> {
+    public:
+        GenericClient() { }
+        GenericClient(MediaStreamFrameController* frameController, int id) : ClientBase<int>(frameController, id) { }
+        virtual ~GenericClient() { unregister(); }
+        virtual bool isGenericClient() { return true; }
+
+    private:
+        virtual void unregister() { unregisterClient(this); }
+    };
+
     MediaStreamFrameController(Frame*);
     virtual ~MediaStreamFrameController();
 
@@ -142,10 +158,17 @@
     // Stop a generated stream.
     void stopGeneratedStream(const String& streamLabel);
 
+    // Enable/disable an audio track in a generated stream.
+    void enableAudioTrack(const String& streamLabel, unsigned long index);
+    void disableAudioTrack(const String& streamLabel, unsigned long index);
+
+    // Select a video track in a generated stream.
+    void selectVideoTrack(const String& streamLabel, long index);
+
     // --- Calls coming back from the controller. --- //
 
     // Report the generation of a new local stream.
-    void streamGenerated(int requestId, const String& streamLabel);
+    void streamGenerated(int requestId, const String& streamLabel, PassRefPtr<MultipleTrackList> audioTracks, PassRefPtr<ExclusiveTrackList> videoTracks);
 
     // Report a failure in the generation of a new stream.
     void streamGenerationFailed(int requestId, NavigatorUserMediaError::ErrorCode);
@@ -153,6 +176,10 @@
     // Report the end of a stream for external reasons.
     void streamFailed(const String& streamLabel);
 
+    // Report the unexpected unavailability of a live media track.
+    void audioTrackFailed(const String& streamLabel, unsigned long index);
+    void videoTrackFailed(const String& streamLabel, unsigned long index);
+
 private:
     class Request;
     class GenerateStreamRequest;
@@ -187,14 +214,19 @@
     // Streams are a special class of clients since they are identified by a global label string instead of an id.
     typedef ClientMapBase<String> StreamMap;
 
+    // All other types of clients use autogenerated integer ids.
+    class ClientMap : public IdGenerator, public ClientMapBase<int> { };
+
     // Detached from a page, and hence from a embedder client.
     void enterDetachedState();
 
     void unregister(StreamClient*);
+    void unregister(GenericClient*);
     MediaStreamController* pageController() const;
     Stream* getStreamFromLabel(const String&) const;
 
     RequestMap m_requests;
+    ClientMap m_clients;
     StreamMap m_streams;
 
     Frame* m_frame;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to