Title: [135410] trunk/Source/WebCore
Revision
135410
Author
eric.carl...@apple.com
Date
2012-11-21 09:18:00 -0800 (Wed, 21 Nov 2012)

Log Message

In-band text tracks infrastructure
https://bugs.webkit.org/show_bug.cgi?id=102830

Reviewed by Philippe Normand.

Add the infrastructure necessary to allow a port-specific media engine to expose in-band text
tracks.

No new tests, this patch only adds plumbing. Existing tests verify that these changes don't
break existing functionality.

* CMakeLists.txt: Add new project files.
* GNUmakefile.list.am: Ditto.
* Target.pri: Ditto.
* WebCore.gypi: Ditto.
* WebCore.xcodeproj/project.pbxproj: Ditto.

* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::setReadyState): Call processInbandTextTracks when readyState reaches
    HAVE_METADATA
(WebCore::HTMLMediaElement::processInbandTextTracks): Fetch the in-band text tracks from the 
    media player and processes them.
* html/HTMLMediaElement.h:

* html/track/InbandTextTrack.cpp: Added.
* html/track/InbandTextTrack.h: Added.
* html/track/InbandTextTrackPrivate.h: Added.

* html/track/TextTrack.h:
(TextTrack):
(WebCore::TextTrack::clearClient): Remove virtual, it is unnecessary
(WebCore::TextTrack::mode): Make virtual so derived classes can override.
(WebCore::TextTrack::setMode): Ditto.

* html/track/TextTrackList.cpp:
(TextTrackList::length): Update to deal with in-band tracks.
(TextTrackList::getTrackIndex): Ditto.
(TextTrackList::getTrackIndexRelativeToRenderedTracks): Ditto.
(TextTrackList::item): Ditto.
(TextTrackList::invalidateTrackIndexesAfterTrack): New, invalidate the cached track indexes of
    all tracks after another.
(TextTrackList::append): Update to deal with in-band tracks.
(TextTrackList::remove): Update to deal with in-band tracks.
(TextTrackList::scheduleAddTrackEvent): Remove typo.
* html/track/TextTrackList.h:

* platform/graphics/MediaPlayer.cpp:
(WebCore::MediaPlayer::getTextTracks): New, pass through to the media engine.
(WebCore::MediaPlayer::setTextTrackClient):
* platform/graphics/MediaPlayer.h:

* platform/graphics/MediaPlayerPrivate.h:
(WebCore::MediaPlayerPrivateInterface::setPreload): Cleanup.
(WebCore::MediaPlayerPrivateInterface::sourceEndOfStream): Ditto.
(WebCore::MediaPlayerPrivateInterface::getTextTracks): New client method.
(WebCore::MediaPlayerPrivateInterface::setTextTrackClient): Ditto.

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/CMakeLists.txt (135409 => 135410)


--- trunk/Source/WebCore/CMakeLists.txt	2012-11-21 17:17:07 UTC (rev 135409)
+++ trunk/Source/WebCore/CMakeLists.txt	2012-11-21 17:18:00 UTC (rev 135410)
@@ -1549,6 +1549,7 @@
     html/shadow/SpinButtonElement.cpp
     html/shadow/TextControlInnerElements.cpp
 
+    html/track/InbandTextTrack.cpp
     html/track/LoadableTextTrack.cpp
     html/track/TextTrack.cpp
     html/track/TextTrackCue.cpp

Modified: trunk/Source/WebCore/ChangeLog (135409 => 135410)


--- trunk/Source/WebCore/ChangeLog	2012-11-21 17:17:07 UTC (rev 135409)
+++ trunk/Source/WebCore/ChangeLog	2012-11-21 17:18:00 UTC (rev 135410)
@@ -1,3 +1,62 @@
+2012-11-21  Eric Carlson  <eric.carl...@apple.com>
+
+        In-band text tracks infrastructure
+        https://bugs.webkit.org/show_bug.cgi?id=102830
+
+        Reviewed by Philippe Normand.
+
+        Add the infrastructure necessary to allow a port-specific media engine to expose in-band text
+        tracks.
+
+        No new tests, this patch only adds plumbing. Existing tests verify that these changes don't
+        break existing functionality.
+
+        * CMakeLists.txt: Add new project files.
+        * GNUmakefile.list.am: Ditto.
+        * Target.pri: Ditto.
+        * WebCore.gypi: Ditto.
+        * WebCore.xcodeproj/project.pbxproj: Ditto.
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::setReadyState): Call processInbandTextTracks when readyState reaches
+            HAVE_METADATA
+        (WebCore::HTMLMediaElement::processInbandTextTracks): Fetch the in-band text tracks from the 
+            media player and processes them.
+        * html/HTMLMediaElement.h:
+
+        * html/track/InbandTextTrack.cpp: Added.
+        * html/track/InbandTextTrack.h: Added.
+        * html/track/InbandTextTrackPrivate.h: Added.
+
+        * html/track/TextTrack.h:
+        (TextTrack):
+        (WebCore::TextTrack::clearClient): Remove virtual, it is unnecessary
+        (WebCore::TextTrack::mode): Make virtual so derived classes can override.
+        (WebCore::TextTrack::setMode): Ditto.
+
+        * html/track/TextTrackList.cpp:
+        (TextTrackList::length): Update to deal with in-band tracks.
+        (TextTrackList::getTrackIndex): Ditto.
+        (TextTrackList::getTrackIndexRelativeToRenderedTracks): Ditto.
+        (TextTrackList::item): Ditto.
+        (TextTrackList::invalidateTrackIndexesAfterTrack): New, invalidate the cached track indexes of
+            all tracks after another.
+        (TextTrackList::append): Update to deal with in-band tracks.
+        (TextTrackList::remove): Update to deal with in-band tracks.
+        (TextTrackList::scheduleAddTrackEvent): Remove typo.
+        * html/track/TextTrackList.h:
+
+        * platform/graphics/MediaPlayer.cpp:
+        (WebCore::MediaPlayer::getTextTracks): New, pass through to the media engine.
+        (WebCore::MediaPlayer::setTextTrackClient):
+        * platform/graphics/MediaPlayer.h:
+
+        * platform/graphics/MediaPlayerPrivate.h:
+        (WebCore::MediaPlayerPrivateInterface::setPreload): Cleanup.
+        (WebCore::MediaPlayerPrivateInterface::sourceEndOfStream): Ditto.
+        (WebCore::MediaPlayerPrivateInterface::getTextTracks): New client method.
+        (WebCore::MediaPlayerPrivateInterface::setTextTrackClient): Ditto.
+
 2012-11-21  Kai Koehne  <kai.koe...@digia.com>
 
         [Qt] MinGW: Explicitly add OpenGL library dependencies

Modified: trunk/Source/WebCore/GNUmakefile.list.am (135409 => 135410)


--- trunk/Source/WebCore/GNUmakefile.list.am	2012-11-21 17:17:07 UTC (rev 135409)
+++ trunk/Source/WebCore/GNUmakefile.list.am	2012-11-21 17:18:00 UTC (rev 135410)
@@ -3601,6 +3601,9 @@
 	Source/WebCore/html/TimeInputType.h \
 	Source/WebCore/html/TimeRanges.cpp \
 	Source/WebCore/html/TimeRanges.h \
+	Source/WebCore/html/track/InbandTextTrack.cpp \
+	Source/WebCore/html/track/InbandTextTrack.h \
+	Source/WebCore/html/track/InbandTextTrackPrivate.h \
 	Source/WebCore/html/track/LoadableTextTrack.cpp \
 	Source/WebCore/html/track/LoadableTextTrack.h \
 	Source/WebCore/html/track/TextTrack.cpp \

Modified: trunk/Source/WebCore/Target.pri (135409 => 135410)


--- trunk/Source/WebCore/Target.pri	2012-11-21 17:17:07 UTC (rev 135409)
+++ trunk/Source/WebCore/Target.pri	2012-11-21 17:18:00 UTC (rev 135410)
@@ -1868,6 +1868,8 @@
     html/shadow/HTMLShadowElement.h \
     html/shadow/MediaControlElements.h \
     html/shadow/DetailsMarkerControl.h \
+    html/track/InbandTextTrack.h \
+    html/track/InbandTextTrackPrivate.h \
     html/track/LoadableTextTrack.h \
     html/track/TextTrack.h \
     html/track/TextTrackCue.h \

Modified: trunk/Source/WebCore/WebCore.gypi (135409 => 135410)


--- trunk/Source/WebCore/WebCore.gypi	2012-11-21 17:17:07 UTC (rev 135409)
+++ trunk/Source/WebCore/WebCore.gypi	2012-11-21 17:18:00 UTC (rev 135410)
@@ -4461,6 +4461,9 @@
             'html/shadow/TextControlInnerElements.h',
             'html/shadow/TextFieldDecorationElement.cpp',
             'html/shadow/TextFieldDecorationElement.h',
+            'html/track/InbandTextTrack.cpp',
+            'html/track/InbandTextTrack.h',
+            'html/track/InbandTextTrackPrivate.h',
             'html/track/LoadableTextTrack.cpp',
             'html/track/LoadableTextTrack.h',
             'html/track/TextTrack.cpp',

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (135409 => 135410)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2012-11-21 17:17:07 UTC (rev 135409)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2012-11-21 17:18:00 UTC (rev 135410)
@@ -108,6 +108,9 @@
 		070756DF14239B4E00414161 /* JSTextTrackCueList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 070756D914239B4C00414161 /* JSTextTrackCueList.cpp */; };
 		070756E014239B4E00414161 /* JSTextTrackCueList.h in Headers */ = {isa = PBXBuildFile; fileRef = 070756DA14239B4E00414161 /* JSTextTrackCueList.h */; };
 		0709FC4E1025DEE30059CDBA /* AccessibilitySlider.h in Headers */ = {isa = PBXBuildFile; fileRef = 0709FC4D1025DEE30059CDBA /* AccessibilitySlider.h */; };
+		0711BF8E1642D9D100419E36 /* InbandTextTrack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0711BF8D1642D9D100419E36 /* InbandTextTrack.cpp */; };
+		0711BF8F1642D9F400419E36 /* InbandTextTrack.h in Headers */ = {isa = PBXBuildFile; fileRef = 0711BF8C1642D81100419E36 /* InbandTextTrack.h */; };
+		0711BF9116430C9100419E36 /* InbandTextTrackPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 0711BF9016430C9000419E36 /* InbandTextTrackPrivate.h */; };
 		0720B0A014D3323500642955 /* GenericEventQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0720B09E14D3323500642955 /* GenericEventQueue.cpp */; };
 		0720B0A014D3323500642956 /* GestureEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0720B09F14D3323500642956 /* GestureEvent.cpp */; };
 		0720B0A114D3323500642955 /* GenericEventQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 0720B09F14D3323500642955 /* GenericEventQueue.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -7182,6 +7185,9 @@
 		070756DA14239B4E00414161 /* JSTextTrackCueList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSTextTrackCueList.h; sourceTree = "<group>"; };
 		0709FC4D1025DEE30059CDBA /* AccessibilitySlider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AccessibilitySlider.h; sourceTree = "<group>"; };
 		070DD8F50F01868000727DEB /* mediaControls.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = mediaControls.css; sourceTree = "<group>"; };
+		0711BF8C1642D81100419E36 /* InbandTextTrack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InbandTextTrack.h; sourceTree = "<group>"; };
+		0711BF8D1642D9D100419E36 /* InbandTextTrack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InbandTextTrack.cpp; sourceTree = "<group>"; };
+		0711BF9016430C9000419E36 /* InbandTextTrackPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InbandTextTrackPrivate.h; sourceTree = "<group>"; };
 		0720B09E14D3323500642955 /* GenericEventQueue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GenericEventQueue.cpp; sourceTree = "<group>"; };
 		0720B09F14D3323500642955 /* GenericEventQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GenericEventQueue.h; sourceTree = "<group>"; };
 		0720B09F14D3323500642956 /* GestureEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GestureEvent.cpp; sourceTree = "<group>"; };
@@ -19367,6 +19373,9 @@
 		B1AD4E7713A12A7200846B27 /* track */ = {
 			isa = PBXGroup;
 			children = (
+				0711BF9016430C9000419E36 /* InbandTextTrackPrivate.h */,
+				0711BF8D1642D9D100419E36 /* InbandTextTrack.cpp */,
+				0711BF8C1642D81100419E36 /* InbandTextTrack.h */,
 				9759E93414EF1CF80026A2DD /* LoadableTextTrack.cpp */,
 				9759E94814EF1D490026A2DD /* LoadableTextTrack.h */,
 				9759E93514EF1CF80026A2DD /* TextTrack.cpp */,
@@ -23943,6 +23952,8 @@
 				B27535710B053814002CE64F /* ImageSource.h in Headers */,
 				4B3480940EEF50D400AC1B41 /* ImageSourceCG.h in Headers */,
 				316FE1180E6E1DA700BF6088 /* ImplicitAnimation.h in Headers */,
+				0711BF8F1642D9F400419E36 /* InbandTextTrack.h in Headers */,
+				0711BF9116430C9100419E36 /* InbandTextTrackPrivate.h in Headers */,
 				DB23C2CC0A508D29002489EB /* IndentOutdentCommand.h in Headers */,
 				F3644B001119805900E0D537 /* InjectedScript.h in Headers */,
 				AAB6054F15874C58007B5031 /* InjectedScriptBase.h in Headers */,
@@ -27149,6 +27160,7 @@
 				B275355F0B053814002CE64F /* ImageSourceCG.cpp in Sources */,
 				4B3480930EEF50D400AC1B41 /* ImageSourceCGMac.mm in Sources */,
 				316FE1170E6E1DA700BF6088 /* ImplicitAnimation.cpp in Sources */,
+				0711BF8E1642D9D100419E36 /* InbandTextTrack.cpp in Sources */,
 				DB23C2CB0A508D29002489EB /* IndentOutdentCommand.cpp in Sources */,
 				F3644AFF1119805900E0D537 /* InjectedScript.cpp in Sources */,
 				AAB6054E15874C58007B5031 /* InjectedScriptBase.cpp in Sources */,

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (135409 => 135410)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2012-11-21 17:17:07 UTC (rev 135409)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2012-11-21 17:18:00 UTC (rev 135410)
@@ -100,6 +100,8 @@
 
 #if ENABLE(VIDEO_TRACK)
 #include "HTMLTrackElement.h"
+#include "InbandTextTrack.h"
+#include "InbandTextTrackPrivate.h"
 #include "RuntimeEnabledFeatures.h"
 #include "TextTrackCueList.h"
 #include "TextTrackList.h"
@@ -1740,6 +1742,10 @@
         prepareMediaFragmentURI();
         scheduleEvent(eventNames().durationchangeEvent);
         scheduleEvent(eventNames().loadedmetadataEvent);
+#if ENABLE(VIDEO_TRACK)
+        if (m_player && m_player->hasClosedCaptions())
+            processInbandTextTracks();
+#endif
         if (hasMediaControls())
             mediaControls()->loadedMetadata();
         if (renderer())
@@ -2718,6 +2724,50 @@
 }
 
 #if ENABLE(VIDEO_TRACK)
+void HTMLMediaElement::processInbandTextTracks()
+{
+    if (!RuntimeEnabledFeatures::webkitVideoTrackEnabled())
+        return;
+
+    Vector<RefPtr<InbandTextTrackPrivate> > privateTextTracks;
+    m_player->getTextTracks(privateTextTracks);
+
+    if (!privateTextTracks.size())
+        return;
+
+    for (size_t i = 0; i < privateTextTracks.size(); ++i) {
+        // 4.8.10.12.2 Sourcing in-band text tracks
+        // 1. Associate the relevant data with a new text track and its corresponding new TextTrack object.
+        
+        // 2. Set the new text track's kind, label, and language based on the semantics of the relevant data,
+        // as defined by the relevant specification. If there is no label in that data, then the label must
+        // be set to the empty string.
+        //   - This is done by the media engine when it creates the InbandTextTrackPrivate.
+        RefPtr<TextTrack> textTrack = InbandTextTrack::create(ActiveDOMObject::scriptExecutionContext(), this, privateTextTracks[i]);
+        
+        // 5. Populate the new text track's list of cues with the cues parsed so far, folllowing the guidelines for exposing
+        // cues, and begin updating it dynamically as necessary.
+        //   - This will happen automatically as the media engine loads the cues
+        
+        // 6. Set the new text track's readiness state to loaded.
+        textTrack->setReadinessState(TextTrack::Loaded);
+        
+        // 7. Set the new text track's mode to the mode consistent with the user's preferences and the requirements of
+        // the relevant specification for the data.
+        //  - This will happen in configureTextTracks()
+        
+        // 8. Add the new text track to the media element's list of text tracks.
+        textTracks()->append(textTrack);
+        
+        // 9. Fire an event with the name addtrack, that does not bubble and is not cancelable, and that uses the TrackEvent
+        // interface, with the track attribute initialized to the text track's TextTrack object, at the media element's
+        // textTracks attribute's TextTrackList object.
+        //  - This was done in TextTrackList::append
+    }
+
+    configureTextTracks();
+}
+
 PassRefPtr<TextTrack> HTMLMediaElement::addTextTrack(const String& kind, const String& label, const String& language, ExceptionCode& ec)
 {
     if (!RuntimeEnabledFeatures::webkitVideoTrackEnabled())
@@ -2812,7 +2862,6 @@
     if (!m_textTracks)
         return;
     
-
     // 4.8.10.12.3 Sourcing out-of-band text tracks
     // When a track element's parent element changes and the old parent was a media element, 
     // then the user agent must remove the track element's corresponding text track from the 

Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (135409 => 135410)


--- trunk/Source/WebCore/html/HTMLMediaElement.h	2012-11-21 17:17:07 UTC (rev 135409)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h	2012-11-21 17:18:00 UTC (rev 135410)
@@ -69,6 +69,8 @@
 #endif
 
 #if ENABLE(VIDEO_TRACK)
+class InbandTextTrackPrivate;
+
 typedef PODIntervalTree<double, TextTrackCue*> CueIntervalTree;
 typedef Vector<CueIntervalTree::IntervalType> CueList;
 #endif
@@ -213,6 +215,8 @@
     PassRefPtr<TextTrack> addTextTrack(const String& kind, const String& label, ExceptionCode& ec) { return addTextTrack(kind, label, emptyString(), ec); }
     PassRefPtr<TextTrack> addTextTrack(const String& kind, ExceptionCode& ec) { return addTextTrack(kind, emptyString(), emptyString(), ec); }
 
+    void processInbandTextTracks();
+
     TextTrackList* textTracks();
     CueList currentlyActiveCues() const { return m_currentlyActiveCues; }
 

Added: trunk/Source/WebCore/html/track/InbandTextTrack.cpp (0 => 135410)


--- trunk/Source/WebCore/html/track/InbandTextTrack.cpp	                        (rev 0)
+++ trunk/Source/WebCore/html/track/InbandTextTrack.cpp	2012-11-21 17:18:00 UTC (rev 135410)
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2012 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#if ENABLE(VIDEO_TRACK)
+
+#include "InbandTextTrack.h"
+
+#include "Document.h"
+#include "Event.h"
+#include "InbandTextTrackPrivate.h"
+#include "MediaPlayer.h"
+#include "TextTrackCueList.h"
+
+namespace WebCore {
+
+InbandTextTrack::InbandTextTrack(ScriptExecutionContext* context, TextTrackClient* client, PassRefPtr<InbandTextTrackPrivate> tracksPrivate)
+    : TextTrack(context, client, emptyString(), tracksPrivate->label(), tracksPrivate->language(), InBand)
+    , m_private(tracksPrivate)
+{
+    m_private->setClient(this);
+    
+    switch (tracksPrivate->kind()) {
+    case InbandTextTrackPrivate::subtitles:
+        setKind(TextTrack::subtitlesKeyword());
+        break;
+    case InbandTextTrackPrivate::captions:
+        setKind(TextTrack::captionsKeyword());
+        break;
+    case InbandTextTrackPrivate::descriptions:
+        setKind(TextTrack::descriptionsKeyword());
+        break;
+    case InbandTextTrackPrivate::chapters:
+        setKind(TextTrack::chaptersKeyword());
+        break;
+    case InbandTextTrackPrivate::metadata:
+        setKind(TextTrack::metadataKeyword());
+        break;
+    case InbandTextTrackPrivate::none:
+    default:
+        ASSERT_NOT_REACHED();
+        break;
+    }
+}
+
+InbandTextTrack::~InbandTextTrack()
+{
+    m_private->setClient(0);
+}
+
+void InbandTextTrack::setMode(const AtomicString& mode)
+{
+    TextTrack::setMode(mode);
+
+    if (mode == TextTrack::disabledKeyword())
+        m_private->setMode(InbandTextTrackPrivate::disabled);
+    else if (mode == TextTrack::hiddenKeyword())
+        m_private->setMode(InbandTextTrackPrivate::hidden);
+    else if (mode == TextTrack::showingKeyword())
+        m_private->setMode(InbandTextTrackPrivate::showing);
+    else
+        ASSERT_NOT_REACHED();
+}
+
+size_t InbandTextTrack::inbandTrackIndex()
+{
+    ASSERT(m_private);
+    return m_private->textTrackIndex();
+}
+
+void InbandTextTrack::addCue(InbandTextTrackPrivate* trackPrivate, double start, double end, const String& id, const String& content, const String& settings)
+{
+    ASSERT(trackPrivate == m_private);
+
+    RefPtr<TextTrackCue> cue = TextTrackCue::create(scriptExecutionContext(), start, end, content);
+    cue->setId(id);
+    cue->setCueSettings(settings);
+    cue->setTrack(this);
+
+    if (!m_cues)
+        m_cues = TextTrackCueList::create();
+    m_cues->add(cue);
+    
+    if (client())
+        client()->textTrackAddCues(this, m_cues.get());
+}
+    
+} // namespace WebCore
+
+#endif

Added: trunk/Source/WebCore/html/track/InbandTextTrack.h (0 => 135410)


--- trunk/Source/WebCore/html/track/InbandTextTrack.h	                        (rev 0)
+++ trunk/Source/WebCore/html/track/InbandTextTrack.h	2012-11-21 17:18:00 UTC (rev 135410)
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2012 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef InbandTextTrack_h
+#define InbandTextTrack_h
+
+#if ENABLE(VIDEO_TRACK)
+
+#include "TextTrack.h"
+#include <wtf/RefPtr.h>
+
+namespace WebCore {
+
+class Document;
+class InbandTextTrackPrivate;
+class MediaPlayer;
+class TextTrackCue;
+
+class InbandTextTrackClient {
+public:
+    virtual ~InbandTextTrackClient() { }
+
+    virtual void addCue(InbandTextTrackPrivate*, double /*start*/, double /*end*/, const String& /*id*/, const String& /*content*/, const String& /*settings*/) { }
+};
+
+class InbandTextTrack : public TextTrack, public InbandTextTrackClient {
+public:
+    static PassRefPtr<InbandTextTrack> create(ScriptExecutionContext* context, TextTrackClient* client, PassRefPtr<InbandTextTrackPrivate> playerPrivate)
+    {
+        return adoptRef(new InbandTextTrack(context, client, playerPrivate));
+    }
+    virtual ~InbandTextTrack();
+
+    virtual void setMode(const AtomicString&) OVERRIDE;
+    size_t inbandTrackIndex();
+
+private:
+    InbandTextTrack(ScriptExecutionContext*, TextTrackClient*, PassRefPtr<InbandTextTrackPrivate>);
+
+    virtual void addCue(InbandTextTrackPrivate*, double, double, const String&, const String&, const String&);
+
+    RefPtr<InbandTextTrackPrivate> m_private;
+};
+
+} // namespace WebCore
+
+#endif
+#endif

Added: trunk/Source/WebCore/html/track/InbandTextTrackPrivate.h (0 => 135410)


--- trunk/Source/WebCore/html/track/InbandTextTrackPrivate.h	                        (rev 0)
+++ trunk/Source/WebCore/html/track/InbandTextTrackPrivate.h	2012-11-21 17:18:00 UTC (rev 135410)
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2012 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef InbandTextTrackPrivate_h
+#define InbandTextTrackPrivate_h
+
+#include <wtf/Forward.h>
+#include <wtf/Noncopyable.h>
+#include <wtf/RefCounted.h>
+#include <wtf/text/AtomicString.h>
+
+#if ENABLE(VIDEO_TRACK)
+
+namespace WebCore {
+
+class InbandTextTrackClient;
+
+class InbandTextTrackPrivate : public RefCounted<InbandTextTrackPrivate> {
+    WTF_MAKE_NONCOPYABLE(InbandTextTrackPrivate); WTF_MAKE_FAST_ALLOCATED;
+public:
+    static PassRefPtr<InbandTextTrackPrivate> create()
+    {
+        return adoptRef(new InbandTextTrackPrivate());
+    }
+    virtual ~InbandTextTrackPrivate() { }
+    
+    void setClient(InbandTextTrackClient* client) { m_client = client; }
+    InbandTextTrackClient* client() { return m_client; }
+
+    enum Mode { disabled, hidden, showing };
+    virtual void setMode(Mode mode) { m_mode = mode; };
+    virtual InbandTextTrackPrivate::Mode mode() const { return m_mode; }
+
+    enum Kind { subtitles, captions, descriptions, chapters, metadata, none };
+    virtual Kind kind() const { return subtitles; }
+
+    virtual AtomicString label() const { return emptyString(); }
+    virtual AtomicString language() const { return emptyString(); }
+    virtual bool isDefault() const { return false; }
+
+    virtual int textTrackIndex() const { return 0; }
+
+protected:
+    InbandTextTrackPrivate()
+        : m_client(0)
+        , m_mode(disabled)
+    {
+    }
+
+private:
+    InbandTextTrackClient* m_client;
+    Mode m_mode;
+};
+
+} // namespace WebCore
+
+#endif
+#endif

Modified: trunk/Source/WebCore/html/track/TextTrack.h (135409 => 135410)


--- trunk/Source/WebCore/html/track/TextTrack.h	2012-11-21 17:17:07 UTC (rev 135409)
+++ trunk/Source/WebCore/html/track/TextTrack.h	2012-11-21 17:18:00 UTC (rev 135410)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2011 Google Inc. All rights reserved.
+ * Copyright (C) 2011, 2012 Apple Inc.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -83,8 +84,8 @@
     static const AtomicString& hiddenKeyword();
     static const AtomicString& showingKeyword();
 
-    AtomicString mode() const;
-    void setMode(const AtomicString&);
+    virtual AtomicString mode() const;
+    virtual void setMode(const AtomicString&);
 
     bool showingByDefault() const { return m_showingByDefault; }
     void setShowingByDefault(bool showing) { m_showingByDefault = showing; }
@@ -96,7 +97,7 @@
     TextTrackCueList* cues();
     TextTrackCueList* activeCues() const;
 
-    virtual void clearClient() { m_client = 0; }
+    void clearClient() { m_client = 0; }
     TextTrackClient* client() { return m_client; }
 
     void addCue(PassRefPtr<TextTrackCue>, ExceptionCode&);

Modified: trunk/Source/WebCore/html/track/TextTrackList.cpp (135409 => 135410)


--- trunk/Source/WebCore/html/track/TextTrackList.cpp	2012-11-21 17:17:07 UTC (rev 135409)
+++ trunk/Source/WebCore/html/track/TextTrackList.cpp	2012-11-21 17:18:00 UTC (rev 135410)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Apple Inc.  All rights reserved.
+ * Copyright (C) 2011, 2012 Apple Inc.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -31,6 +31,8 @@
 
 #include "EventNames.h"
 #include "HTMLMediaElement.h"
+#include "InbandTextTrack.h"
+#include "InbandTextTrackPrivate.h"
 #include "LoadableTextTrack.h"
 #include "ScriptExecutionContext.h"
 #include "TextTrack.h"
@@ -53,7 +55,7 @@
 
 unsigned TextTrackList::length() const
 {
-    return m_addTrackTracks.size() + m_elementTracks.size();
+    return m_addTrackTracks.size() + m_elementTracks.size() + m_inbandTracks.size();
 }
 
 int TextTrackList::getTrackIndex(TextTrack *textTrack)
@@ -64,6 +66,9 @@
     if (textTrack->trackType() == TextTrack::AddTrack)
         return m_elementTracks.size() + m_addTrackTracks.find(textTrack);
 
+    if (textTrack->trackType() == TextTrack::InBand)
+        return m_elementTracks.size() + m_addTrackTracks.size() + m_inbandTracks.find(textTrack);
+
     ASSERT_NOT_REACHED();
 
     return -1;
@@ -82,7 +87,7 @@
             return trackIndex;
         ++trackIndex;
     }
-    
+
     for (size_t i = 0; i < m_addTrackTracks.size(); ++i) {
         if (!m_addTrackTracks[i]->isRendered())
             continue;
@@ -91,9 +96,18 @@
             return trackIndex;
         ++trackIndex;
     }
-    
+
+    for (size_t i = 0; i < m_inbandTracks.size(); ++i) {
+        if (!m_inbandTracks[i]->isRendered())
+            continue;
+        
+        if (m_inbandTracks[i] == textTrack)
+            return trackIndex;
+        ++trackIndex;
+    }
+
     ASSERT_NOT_REACHED();
-    
+
     return -1;
 }
 
@@ -113,9 +127,40 @@
     if (index < m_addTrackTracks.size())
         return m_addTrackTracks[index].get();
 
+    index -= m_addTrackTracks.size();
+    if (index < m_inbandTracks.size())
+        return m_inbandTracks[index].get();
+
     return 0;
 }
 
+void TextTrackList::invalidateTrackIndexesAfterTrack(TextTrack* track)
+{
+    Vector<RefPtr<TextTrack> >* tracks = 0;
+
+    if (track->trackType() == TextTrack::TrackElement) {
+        tracks = &m_elementTracks;
+        for (size_t i = 0; i < m_addTrackTracks.size(); ++i)
+            m_addTrackTracks[i]->invalidateTrackIndex();
+        for (size_t i = 0; i < m_inbandTracks.size(); ++i)
+            m_inbandTracks[i]->invalidateTrackIndex();
+    } else if (track->trackType() == TextTrack::AddTrack) {
+        tracks = &m_addTrackTracks;
+        for (size_t i = 0; i < m_inbandTracks.size(); ++i)
+            m_inbandTracks[i]->invalidateTrackIndex();
+    } else if (track->trackType() == TextTrack::InBand)
+        tracks = &m_inbandTracks;
+    else
+        ASSERT_NOT_REACHED();
+
+    size_t index = tracks->find(track);
+    if (index == notFound)
+        return;
+
+    for (size_t i = index; i < tracks->size(); ++i)
+        tracks->at(index)->invalidateTrackIndex();
+}
+
 void TextTrackList::append(PassRefPtr<TextTrack> prpTrack)
 {
     RefPtr<TextTrack> track = prpTrack;
@@ -126,17 +171,15 @@
         // Insert tracks added for <track> element in tree order.
         size_t index = static_cast<LoadableTextTrack*>(track.get())->trackElementIndex();
         m_elementTracks.insert(index, track);
-
-        // Invalidate the cached index for all the following tracks.
-        for (size_t i = index; i < m_elementTracks.size(); ++i)
-            m_elementTracks[i]->invalidateTrackIndex();
-
-        for (size_t i = 0; i < m_addTrackTracks.size(); ++i)
-            m_addTrackTracks[i]->invalidateTrackIndex();
-
+    } else if (track->trackType() == TextTrack::InBand) {
+        // Insert tracks added for in-band in the media file order.
+        size_t index = static_cast<InbandTextTrack*>(track.get())->inbandTrackIndex();
+        m_inbandTracks.insert(index, track);
     } else
         ASSERT_NOT_REACHED();
 
+    invalidateTrackIndexesAfterTrack(track.get());
+
     ASSERT(!track->mediaElement() || track->mediaElement() == m_owner);
     track->setMediaElement(m_owner);
 
@@ -151,6 +194,8 @@
         tracks = &m_elementTracks;
     else if (track->trackType() == TextTrack::AddTrack)
         tracks = &m_addTrackTracks;
+    else if (track->trackType() == TextTrack::InBand)
+        tracks = &m_inbandTracks;
     else
         ASSERT_NOT_REACHED();
 
@@ -158,6 +203,8 @@
     if (index == notFound)
         return;
 
+    invalidateTrackIndexesAfterTrack(track);
+
     ASSERT(track->mediaElement() == m_owner);
     track->setMediaElement(0);
 
@@ -172,7 +219,6 @@
 void TextTrackList::scheduleAddTrackEvent(PassRefPtr<TextTrack> track)
 {
     // 4.8.10.12.3 Sourcing out-of-band text tracks
-    // 4.8.10.12.3 Sourcing out-of-band text tracks
     // 4.8.10.12.4 Text track API
     // ... then queue a task to fire an event with the name addtrack, that does not 
     // bubble and is not cancelable, and that uses the TrackEvent interface, with 
@@ -194,7 +240,7 @@
 {
     Vector<RefPtr<Event> > pendingEvents;
     ExceptionCode ec = 0;
-    
+
     ++m_dispatchingEvents;
     m_pendingEvents.swap(pendingEvents);
     size_t count = pendingEvents.size();

Modified: trunk/Source/WebCore/html/track/TextTrackList.h (135409 => 135410)


--- trunk/Source/WebCore/html/track/TextTrackList.h	2012-11-21 17:17:07 UTC (rev 135409)
+++ trunk/Source/WebCore/html/track/TextTrackList.h	2012-11-21 17:18:00 UTC (rev 135410)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Apple Inc.  All rights reserved.
+ * Copyright (C) 2011, 2012 Apple Inc.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -68,7 +68,7 @@
 
     void clearOwner() { m_owner = 0; }
     Node* owner() const;
-    
+
     bool isFiringEventListeners() { return m_dispatchingEvents; }
 
 private:
@@ -83,6 +83,8 @@
     void scheduleAddTrackEvent(PassRefPtr<TextTrack>);
     void asyncEventTimerFired(Timer<TextTrackList>*);
 
+    void invalidateTrackIndexesAfterTrack(TextTrack*);
+
     ScriptExecutionContext* m_context;
     HTMLMediaElement* m_owner;
 
@@ -92,7 +94,8 @@
     EventTargetData m_eventTargetData;
     Vector<RefPtr<TextTrack> > m_addTrackTracks;
     Vector<RefPtr<TextTrack> > m_elementTracks;
-    
+    Vector<RefPtr<TextTrack> > m_inbandTracks;
+
     int m_dispatchingEvents;
 };
 

Modified: trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp (135409 => 135410)


--- trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp	2012-11-21 17:17:07 UTC (rev 135409)
+++ trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp	2012-11-21 17:18:00 UTC (rev 135410)
@@ -40,6 +40,10 @@
 #include "TimeRanges.h"
 #include <wtf/text/CString.h>
 
+#if ENABLE(VIDEO_TRACK)
+#include "InbandTextTrackPrivate.h"
+#endif
+
 #if PLATFORM(QT)
 #include <QtGlobal>
 #endif
@@ -1109,6 +1113,18 @@
     return m_mediaPlayerClient->mediaPlayerCachedResourceLoader();
 }
 
+#if ENABLE(VIDEO_TRACK)
+void MediaPlayer::getTextTracks(Vector<RefPtr<InbandTextTrackPrivate> >& tracks)
+{
+    m_private->getTextTracks(tracks);
 }
 
+void MediaPlayer::setTextTrackClient(TextTrackClient* client)
+{
+    m_private->setTextTrackClient(client);
+}
 #endif
+
+}
+
+#endif

Modified: trunk/Source/WebCore/platform/graphics/MediaPlayer.h (135409 => 135410)


--- trunk/Source/WebCore/platform/graphics/MediaPlayer.h	2012-11-21 17:17:07 UTC (rev 135409)
+++ trunk/Source/WebCore/platform/graphics/MediaPlayer.h	2012-11-21 17:18:00 UTC (rev 135410)
@@ -59,8 +59,10 @@
 class AudioSourceProvider;
 class Document;
 class GStreamerGWorld;
+class InbandTextTrackPrivate;
 class MediaPlayerPrivateInterface;
 class MediaSource;
+class TextTrackClient;
 
 // Structure that will hold every native
 // types supported by the current media player.
@@ -427,6 +429,11 @@
 
     CachedResourceLoader* cachedResourceLoader();
 
+#if ENABLE(VIDEO_TRACK)
+    void getTextTracks(Vector<RefPtr<InbandTextTrackPrivate> >&);
+    void setTextTrackClient(TextTrackClient*);
+#endif
+
 private:
     MediaPlayer(MediaPlayerClient*);
     void loadWithNextMediaEngine(MediaPlayerFactory*);

Modified: trunk/Source/WebCore/platform/graphics/MediaPlayerPrivate.h (135409 => 135410)


--- trunk/Source/WebCore/platform/graphics/MediaPlayerPrivate.h	2012-11-21 17:17:07 UTC (rev 135409)
+++ trunk/Source/WebCore/platform/graphics/MediaPlayerPrivate.h	2012-11-21 17:18:00 UTC (rev 135410)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009, 2010, 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -104,7 +104,7 @@
 
     virtual void paintCurrentFrameInContext(GraphicsContext* c, const IntRect& r) { paint(c, r); }
 
-    virtual void setPreload(MediaPlayer::Preload) { };
+    virtual void setPreload(MediaPlayer::Preload) { }
 
     virtual bool hasAvailableVideoFrame() const { return readyState() >= MediaPlayer::HaveCurrentData; }
 
@@ -174,7 +174,7 @@
     virtual bool sourceAppend(const String& id, const unsigned char* data, unsigned length) { return false; }
     virtual bool sourceAbort(const String& id) { return false; }
     virtual void sourceSetDuration(double) { }
-    virtual void sourceEndOfStream(MediaPlayer::EndOfStreamStatus) { };
+    virtual void sourceEndOfStream(MediaPlayer::EndOfStreamStatus) { }
     virtual bool sourceSetTimestampOffset(const String& id, double offset) { return false; }
 #endif
 
@@ -183,6 +183,11 @@
     virtual MediaPlayer::MediaKeyException generateKeyRequest(const String&, const unsigned char*, unsigned) { return MediaPlayer::KeySystemNotSupported; }
     virtual MediaPlayer::MediaKeyException cancelKeyRequest(const String&, const String&) { return MediaPlayer::KeySystemNotSupported; }
 #endif
+
+#if ENABLE(VIDEO_TRACK)
+    virtual void getTextTracks(Vector<RefPtr<InbandTextTrackPrivate> >&) { }
+    virtual void setTextTrackClient(TextTrackClient*) { }
+#endif
 };
 
 }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to