<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[170379] trunk/Source/WebCore</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/170379">170379</a></dd>
<dt>Author</dt> <dd>eric.carlson@apple.com</dd>
<dt>Date</dt> <dd>2014-06-24 12:35:47 -0700 (Tue, 24 Jun 2014)</dd>
</dl>
<h3>Log Message</h3>
<pre>[Mac] process raw VTT in-band captions
https://bugs.webkit.org/show_bug.cgi?id=134178
Reviewed by Jer Noble.
* CMakeLists.txt: Add ISOVTTCue.cpp|h.
* WebCore.vcxproj/WebCore.vcxproj: Ditto.
* WebCore.xcodeproj/project.pbxproj: Ditto.
* html/track/BufferedLineReader.h:
(WebCore::BufferedLineReader::reset): New, empty the input buffer.
Make it possible to process WebVTT captions.
* html/track/InbandGenericTextTrack.cpp:
(WebCore::InbandGenericTextTrack::parser): Allocate, if necessary, and return a WebVTT parser.
(WebCore::InbandGenericTextTrack::parseWebVTTCueData): Pass a cue to the parser.
(WebCore::InbandGenericTextTrack::parseWebVTTFileHeader): Pass a VTT file header to the parser.
(WebCore::InbandGenericTextTrack::newCuesParsed): Parser callback.
(WebCore::InbandGenericTextTrack::newRegionsParsed): Ditto.
(WebCore::InbandGenericTextTrack::fileFailedToParse): Ditto.
* html/track/InbandGenericTextTrack.h:
* html/track/InbandTextTrack.h:
* html/track/InbandWebVTTTextTrack.cpp:
(WebCore::InbandWebVTTTextTrack::parser): New, parser accessor.
(WebCore::InbandWebVTTTextTrack::parseWebVTTCueData): New, parse VTT data in an ISOWebVTTCue
object.
(WebCore::InbandWebVTTTextTrack::newCuesParsed): Cleanup.
(WebCore::InbandWebVTTTextTrack::newRegionsParsed): Implement.
(WebCore::InbandWebVTTTextTrack::fileFailedToParse): Change the error message.
* html/track/InbandWebVTTTextTrack.h:
* html/track/TextTrackCueGeneric.cpp:
(WebCore::TextTrackCueGenericBoxElement::TextTrackCueGenericBoxElement): Change cue parameter
from a pointer to a reference.
(WebCore::TextTrackCueGeneric::createDisplayTree): Ditto.
* html/track/VTTCue.cpp:
(WebCore::VTTCueBox::create): Change cue parameter from a pointer to a reference.
(WebCore::VTTCueBox::VTTCueBox): Ditto.
(WebCore::VTTCueBox::getCue): Return a reference.
(WebCore::VTTCueBox::applyCSSProperties): m_cue is a reference, not a pointer.
(WebCore::VTTCue::create): New, create a VTTCue from WebVTTCueData.
(WebCore::VTTCue::VTTCue): New, internal constructor that takes a WebVTTCueData.
(WebCore::VTTCue::initialize): New, shared constructor initialization.
(WebCore::VTTCue::createDisplayTree): m_cue is a reference, not a pointer.
(WebCore::VTTCue::markFutureAndPastNodes): Ditto.
(WebCore::VTTCue::setCueSettings): Ditto.
* html/track/VTTCue.h:
(WebCore::VTTCueBox::create): Deleted.
(WebCore::VTTCue::create): Deleted.
* html/track/WebVTTParser.cpp:
(WebCore::WebVTTParser::parseFileHeader): New. Reset the line reader buffer and parser state,
call the parser.
(WebCore::WebVTTParser::parseCueData): Create a cue from ISOWebVTTCue.
(WebCore::WebVTTParser::collectTimingsAndSettings): Return immediately if the string is empty.
(WebCore::WebVTTParser::collectTimeStamp): Ditto.
* html/track/WebVTTParser.h:
(WebCore::WebVTTCueData::originalStartTime): New.
(WebCore::WebVTTCueData::setOriginalStartTime): New.
(WebCore::WebVTTCueData::WebVTTCueData):
* loader/TextTrackLoader.cpp:
(WebCore::TextTrackLoader::getNewCues): Cleanup, use the new VTTCue::create.
Parse ISO WebVTT cue boxes.
* platform/graphics/ISOVTTCue.cpp: Added.
(WebCore::ISOBox::ISOBox):
(WebCore::ISOBox::peekType):
(WebCore::ISOBox::peekLength):
(WebCore::ISOBox::peekString):
(WebCore::vttCueBoxType):
(WebCore::vttIdBoxType):
(WebCore::vttSettingsBoxType):
(WebCore::vttPayloadBoxType):
(WebCore::vttCurrentTimeBoxType):
(WebCore::vttCueSourceIDBoxType):
(WebCore::ISOWebVTTCue::boxType):
(WebCore::ISOWebVTTCue::ISOWebVTTCue):
* platform/graphics/ISOVTTCue.h: Added.
(WebCore::ISOBox::boxHeaderSize):
(WebCore::ISOBox::length):
(WebCore::ISOBox::type):
(WebCore::ISOWebVTTCue::presentationTime):
(WebCore::ISOWebVTTCue::duration):
(WebCore::ISOWebVTTCue::sourceID):
(WebCore::ISOWebVTTCue::id):
(WebCore::ISOWebVTTCue::originalStartTime):
(WebCore::ISOWebVTTCue::settings):
(WebCore::ISOWebVTTCue::cueText):
* platform/graphics/InbandTextTrackPrivateClient.h:
(WebCore::InbandTextTrackPrivateClient::parseWebVTTFileHeader): New.
* platform/graphics/avfoundation/InbandTextTrackPrivateAVF.cpp:
(WebCore::InbandTextTrackPrivateAVF::InbandTextTrackPrivateAVF): Add a cue format parameter.
(WebCore::InbandTextTrackPrivateAVF::processCue): Call processNativeSamples.
(WebCore::InbandTextTrackPrivateAVF::processAttributedStrings): Add logging. Minor cleanup.
(WebCore::InbandTextTrackPrivateAVF::processNativeSamples): New, process an array of
CMSampleBuffers, create ISOWebVTTCue from the sample data.
* platform/graphics/avfoundation/InbandTextTrackPrivateAVF.h:
* platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.cpp:
(WebCore::InbandTextTrackPrivateAVCF::InbandTextTrackPrivateAVCF):
* platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.h:
(WebCore::InbandTextTrackPrivateAVCF::create):
* platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp:
(WebCore::MediaPlayerPrivateAVFoundationCF::processMediaSelectionOptions):
(WebCore::LegibleOutputData::LegibleOutputData):
(WebCore::AVFWrapper::processCue):
(WebCore::AVFWrapper::legibleOutputCallback):
* platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.h:
(WebCore::InbandTextTrackPrivateAVFObjC::create): Add a cue format parameter.
* platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.mm:
(WebCore::InbandTextTrackPrivateAVFObjC::InbandTextTrackPrivateAVFObjC): Ditto.
* platform/graphics/avfoundation/InbandTextTrackPrivateLegacyAVFObjC.cpp:
(WebCore::InbandTextTrackPrivateLegacyAVFObjC::InbandTextTrackPrivateLegacyAVFObjC): Pass cue
format to base class.
* platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
* platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
(WebCore::MediaPlayerPrivateAVFoundationObjC::createAVAssetForURL): Improve logging.
(WebCore::MediaPlayerPrivateAVFoundationObjC::createAVPlayerItem): Don't leak an NSDictionary.
(WebCore::MediaPlayerPrivateAVFoundationObjC::tracksChanged): Don't process media selection
options until we have tracks.
(WebCore::MediaPlayerPrivateAVFoundationObjC::processMediaSelectionOptions):
(WebCore::MediaPlayerPrivateAVFoundationObjC::processCue): Pass native samples as well as
attributed strings to track.
(-[WebCoreAVFMovieObserver legibleOutput:didOutputAttributedStrings:nativeSampleBuffers:forItemTime:]):
* platform/graphics/avfoundation/objc/OutOfBandTextTrackPrivateAVF.h:
(WebCore::OutOfBandTextTrackPrivateAVF::OutOfBandTextTrackPrivateAVF):
* platform/graphics/avfoundation/objc/OutOfBandTextTrackPrivateAVF.h:
(WebCore::OutOfBandTextTrackPrivateAVF::OutOfBandTextTrackPrivateAVF):</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreCMakeListstxt">trunk/Source/WebCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCorevcxprojWebCorevcxproj">trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCorehtmltrackBufferedLineReaderh">trunk/Source/WebCore/html/track/BufferedLineReader.h</a></li>
<li><a href="#trunkSourceWebCorehtmltrackInbandGenericTextTrackcpp">trunk/Source/WebCore/html/track/InbandGenericTextTrack.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmltrackInbandGenericTextTrackh">trunk/Source/WebCore/html/track/InbandGenericTextTrack.h</a></li>
<li><a href="#trunkSourceWebCorehtmltrackInbandTextTrackh">trunk/Source/WebCore/html/track/InbandTextTrack.h</a></li>
<li><a href="#trunkSourceWebCorehtmltrackInbandWebVTTTextTrackcpp">trunk/Source/WebCore/html/track/InbandWebVTTTextTrack.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmltrackInbandWebVTTTextTrackh">trunk/Source/WebCore/html/track/InbandWebVTTTextTrack.h</a></li>
<li><a href="#trunkSourceWebCorehtmltrackTextTrackCueGenericcpp">trunk/Source/WebCore/html/track/TextTrackCueGeneric.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmltrackVTTCuecpp">trunk/Source/WebCore/html/track/VTTCue.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmltrackVTTCueh">trunk/Source/WebCore/html/track/VTTCue.h</a></li>
<li><a href="#trunkSourceWebCorehtmltrackWebVTTParsercpp">trunk/Source/WebCore/html/track/WebVTTParser.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmltrackWebVTTParserh">trunk/Source/WebCore/html/track/WebVTTParser.h</a></li>
<li><a href="#trunkSourceWebCoreloaderTextTrackLoadercpp">trunk/Source/WebCore/loader/TextTrackLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsInbandTextTrackPrivateClienth">trunk/Source/WebCore/platform/graphics/InbandTextTrackPrivateClient.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationInbandTextTrackPrivateAVFcpp">trunk/Source/WebCore/platform/graphics/avfoundation/InbandTextTrackPrivateAVF.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationInbandTextTrackPrivateAVFh">trunk/Source/WebCore/platform/graphics/avfoundation/InbandTextTrackPrivateAVF.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationcfInbandTextTrackPrivateAVCFcpp">trunk/Source/WebCore/platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationcfInbandTextTrackPrivateAVCFh">trunk/Source/WebCore/platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationcfMediaPlayerPrivateAVFoundationCFcpp">trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcInbandTextTrackPrivateAVFObjCh">trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcInbandTextTrackPrivateAVFObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcInbandTextTrackPrivateLegacyAVFObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateLegacyAVFObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCh">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcOutOfBandTextTrackPrivateAVFh">trunk/Source/WebCore/platform/graphics/avfoundation/objc/OutOfBandTextTrackPrivateAVF.h</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreplatformgraphicsISOVTTCuecpp">trunk/Source/WebCore/platform/graphics/ISOVTTCue.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsISOVTTCueh">trunk/Source/WebCore/platform/graphics/ISOVTTCue.h</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/CMakeLists.txt (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/CMakeLists.txt        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/CMakeLists.txt        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -2090,6 +2090,7 @@
</span><span class="cx"> platform/graphics/IntPoint.cpp
</span><span class="cx"> platform/graphics/IntRect.cpp
</span><span class="cx"> platform/graphics/IntSize.cpp
</span><ins>+ platform/graphics/ISOVTTCue.cpp
</ins><span class="cx"> platform/graphics/LayoutBoxExtent.cpp
</span><span class="cx"> platform/graphics/LayoutRect.cpp
</span><span class="cx"> platform/graphics/MediaPlayer.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/ChangeLog        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -1,3 +1,144 @@
</span><ins>+2014-06-24 Eric Carlson <eric.carlson@apple.com>
+
+ [Mac] process raw VTT in-band captions
+ https://bugs.webkit.org/show_bug.cgi?id=134178
+
+ Reviewed by Jer Noble.
+
+ * CMakeLists.txt: Add ISOVTTCue.cpp|h.
+ * WebCore.vcxproj/WebCore.vcxproj: Ditto.
+ * WebCore.xcodeproj/project.pbxproj: Ditto.
+
+ * html/track/BufferedLineReader.h:
+ (WebCore::BufferedLineReader::reset): New, empty the input buffer.
+
+ Make it possible to process WebVTT captions.
+ * html/track/InbandGenericTextTrack.cpp:
+ (WebCore::InbandGenericTextTrack::parser): Allocate, if necessary, and return a WebVTT parser.
+ (WebCore::InbandGenericTextTrack::parseWebVTTCueData): Pass a cue to the parser.
+ (WebCore::InbandGenericTextTrack::parseWebVTTFileHeader): Pass a VTT file header to the parser.
+ (WebCore::InbandGenericTextTrack::newCuesParsed): Parser callback.
+ (WebCore::InbandGenericTextTrack::newRegionsParsed): Ditto.
+ (WebCore::InbandGenericTextTrack::fileFailedToParse): Ditto.
+ * html/track/InbandGenericTextTrack.h:
+
+ * html/track/InbandTextTrack.h:
+
+ * html/track/InbandWebVTTTextTrack.cpp:
+ (WebCore::InbandWebVTTTextTrack::parser): New, parser accessor.
+ (WebCore::InbandWebVTTTextTrack::parseWebVTTCueData): New, parse VTT data in an ISOWebVTTCue
+ object.
+ (WebCore::InbandWebVTTTextTrack::newCuesParsed): Cleanup.
+ (WebCore::InbandWebVTTTextTrack::newRegionsParsed): Implement.
+ (WebCore::InbandWebVTTTextTrack::fileFailedToParse): Change the error message.
+ * html/track/InbandWebVTTTextTrack.h:
+
+ * html/track/TextTrackCueGeneric.cpp:
+ (WebCore::TextTrackCueGenericBoxElement::TextTrackCueGenericBoxElement): Change cue parameter
+ from a pointer to a reference.
+ (WebCore::TextTrackCueGeneric::createDisplayTree): Ditto.
+
+ * html/track/VTTCue.cpp:
+ (WebCore::VTTCueBox::create): Change cue parameter from a pointer to a reference.
+ (WebCore::VTTCueBox::VTTCueBox): Ditto.
+ (WebCore::VTTCueBox::getCue): Return a reference.
+ (WebCore::VTTCueBox::applyCSSProperties): m_cue is a reference, not a pointer.
+ (WebCore::VTTCue::create): New, create a VTTCue from WebVTTCueData.
+ (WebCore::VTTCue::VTTCue): New, internal constructor that takes a WebVTTCueData.
+ (WebCore::VTTCue::initialize): New, shared constructor initialization.
+ (WebCore::VTTCue::createDisplayTree): m_cue is a reference, not a pointer.
+ (WebCore::VTTCue::markFutureAndPastNodes): Ditto.
+ (WebCore::VTTCue::setCueSettings): Ditto.
+ * html/track/VTTCue.h:
+ (WebCore::VTTCueBox::create): Deleted.
+ (WebCore::VTTCue::create): Deleted.
+
+ * html/track/WebVTTParser.cpp:
+ (WebCore::WebVTTParser::parseFileHeader): New. Reset the line reader buffer and parser state,
+ call the parser.
+ (WebCore::WebVTTParser::parseCueData): Create a cue from ISOWebVTTCue.
+ (WebCore::WebVTTParser::collectTimingsAndSettings): Return immediately if the string is empty.
+ (WebCore::WebVTTParser::collectTimeStamp): Ditto.
+ * html/track/WebVTTParser.h:
+ (WebCore::WebVTTCueData::originalStartTime): New.
+ (WebCore::WebVTTCueData::setOriginalStartTime): New.
+ (WebCore::WebVTTCueData::WebVTTCueData):
+
+ * loader/TextTrackLoader.cpp:
+ (WebCore::TextTrackLoader::getNewCues): Cleanup, use the new VTTCue::create.
+
+ Parse ISO WebVTT cue boxes.
+ * platform/graphics/ISOVTTCue.cpp: Added.
+ (WebCore::ISOBox::ISOBox):
+ (WebCore::ISOBox::peekType):
+ (WebCore::ISOBox::peekLength):
+ (WebCore::ISOBox::peekString):
+ (WebCore::vttCueBoxType):
+ (WebCore::vttIdBoxType):
+ (WebCore::vttSettingsBoxType):
+ (WebCore::vttPayloadBoxType):
+ (WebCore::vttCurrentTimeBoxType):
+ (WebCore::vttCueSourceIDBoxType):
+ (WebCore::ISOWebVTTCue::boxType):
+ (WebCore::ISOWebVTTCue::ISOWebVTTCue):
+ * platform/graphics/ISOVTTCue.h: Added.
+ (WebCore::ISOBox::boxHeaderSize):
+ (WebCore::ISOBox::length):
+ (WebCore::ISOBox::type):
+ (WebCore::ISOWebVTTCue::presentationTime):
+ (WebCore::ISOWebVTTCue::duration):
+ (WebCore::ISOWebVTTCue::sourceID):
+ (WebCore::ISOWebVTTCue::id):
+ (WebCore::ISOWebVTTCue::originalStartTime):
+ (WebCore::ISOWebVTTCue::settings):
+ (WebCore::ISOWebVTTCue::cueText):
+
+ * platform/graphics/InbandTextTrackPrivateClient.h:
+ (WebCore::InbandTextTrackPrivateClient::parseWebVTTFileHeader): New.
+
+ * platform/graphics/avfoundation/InbandTextTrackPrivateAVF.cpp:
+ (WebCore::InbandTextTrackPrivateAVF::InbandTextTrackPrivateAVF): Add a cue format parameter.
+ (WebCore::InbandTextTrackPrivateAVF::processCue): Call processNativeSamples.
+ (WebCore::InbandTextTrackPrivateAVF::processAttributedStrings): Add logging. Minor cleanup.
+ (WebCore::InbandTextTrackPrivateAVF::processNativeSamples): New, process an array of
+ CMSampleBuffers, create ISOWebVTTCue from the sample data.
+ * platform/graphics/avfoundation/InbandTextTrackPrivateAVF.h:
+
+ * platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.cpp:
+ (WebCore::InbandTextTrackPrivateAVCF::InbandTextTrackPrivateAVCF):
+ * platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.h:
+ (WebCore::InbandTextTrackPrivateAVCF::create):
+ * platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp:
+ (WebCore::MediaPlayerPrivateAVFoundationCF::processMediaSelectionOptions):
+ (WebCore::LegibleOutputData::LegibleOutputData):
+ (WebCore::AVFWrapper::processCue):
+ (WebCore::AVFWrapper::legibleOutputCallback):
+
+ * platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.h:
+ (WebCore::InbandTextTrackPrivateAVFObjC::create): Add a cue format parameter.
+ * platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.mm:
+ (WebCore::InbandTextTrackPrivateAVFObjC::InbandTextTrackPrivateAVFObjC): Ditto.
+
+ * platform/graphics/avfoundation/InbandTextTrackPrivateLegacyAVFObjC.cpp:
+ (WebCore::InbandTextTrackPrivateLegacyAVFObjC::InbandTextTrackPrivateLegacyAVFObjC): Pass cue
+ format to base class.
+
+ * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
+ * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
+ (WebCore::MediaPlayerPrivateAVFoundationObjC::createAVAssetForURL): Improve logging.
+ (WebCore::MediaPlayerPrivateAVFoundationObjC::createAVPlayerItem): Don't leak an NSDictionary.
+ (WebCore::MediaPlayerPrivateAVFoundationObjC::tracksChanged): Don't process media selection
+ options until we have tracks.
+ (WebCore::MediaPlayerPrivateAVFoundationObjC::processMediaSelectionOptions):
+ (WebCore::MediaPlayerPrivateAVFoundationObjC::processCue): Pass native samples as well as
+ attributed strings to track.
+ (-[WebCoreAVFMovieObserver legibleOutput:didOutputAttributedStrings:nativeSampleBuffers:forItemTime:]):
+ * platform/graphics/avfoundation/objc/OutOfBandTextTrackPrivateAVF.h:
+ (WebCore::OutOfBandTextTrackPrivateAVF::OutOfBandTextTrackPrivateAVF):
+
+ * platform/graphics/avfoundation/objc/OutOfBandTextTrackPrivateAVF.h:
+ (WebCore::OutOfBandTextTrackPrivateAVF::OutOfBandTextTrackPrivateAVF):
+
</ins><span class="cx"> 2014-06-24 Antti Koivisto <antti@apple.com>
</span><span class="cx">
</span><span class="cx"> Only flush layers when the exposed rect actually changes
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorevcxprojWebCorevcxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -7256,6 +7256,7 @@
</span><span class="cx"> <ClCompile Include="..\platform\FileChooser.cpp" />
</span><span class="cx"> <ClCompile Include="..\platform\FileStream.cpp" />
</span><span class="cx"> <ClCompile Include="..\platform\FileSystem.cpp" />
</span><ins>+ <ClCompile Include="..\platform\graphics\ISOVTTCue.cpp" />
</ins><span class="cx"> <ClCompile Include="..\platform\audio\AudioSession.cpp" />
</span><span class="cx"> <ClCompile Include="..\platform\audio\MediaSession.cpp" />
</span><span class="cx"> <ClCompile Include="..\platform\audio\MediaSessionManager.cpp" />
</span><span class="lines">@@ -19437,6 +19438,7 @@
</span><span class="cx"> <ClInclude Include="..\platform\graphics\IntRect.h" />
</span><span class="cx"> <ClInclude Include="..\platform\graphics\IntSize.h" />
</span><span class="cx"> <ClInclude Include="..\platform\graphics\IntSizeHash.h" />
</span><ins>+ <ClInclude Include="..\platform\graphics\ISOVTTCue.h" />
</ins><span class="cx"> <ClInclude Include="..\platform\graphics\LayoutBoxExtent.h" />
</span><span class="cx"> <ClInclude Include="..\platform\graphics\LayoutPoint.h" />
</span><span class="cx"> <ClInclude Include="..\platform\graphics\LayoutRect.h" />
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -314,6 +314,8 @@
</span><span class="cx">                 07AB996B18DA3C010018771E /* RTCIceServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 07AB996718DA3C010018771E /* RTCIceServer.h */; };
</span><span class="cx">                 07AB996F18DA3C740018771E /* RTCConfigurationPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 07AB996D18DA3C740018771E /* RTCConfigurationPrivate.h */; };
</span><span class="cx">                 07AB997018DA3C740018771E /* RTCIceServerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 07AB996E18DA3C740018771E /* RTCIceServerPrivate.h */; };
</span><ins>+                07AC47011952102100EE9723 /* ISOVTTCue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07AC46FF1952102100EE9723 /* ISOVTTCue.cpp */; };
+                07AC47021952102100EE9723 /* ISOVTTCue.h in Headers */ = {isa = PBXBuildFile; fileRef = 07AC47001952102100EE9723 /* ISOVTTCue.h */; };
</ins><span class="cx">                 07B0113F1032242200FBDC33 /* AccessibilityMediaControls.h in Headers */ = {isa = PBXBuildFile; fileRef = 07B0113E1032242200FBDC33 /* AccessibilityMediaControls.h */; };
</span><span class="cx">                 07B442D6166C70B000556CAD /* InbandTextTrackPrivateAVF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07B442D4166C70B000556CAD /* InbandTextTrackPrivateAVF.cpp */; };
</span><span class="cx">                 07B442D7166C70B000556CAD /* InbandTextTrackPrivateAVF.h in Headers */ = {isa = PBXBuildFile; fileRef = 07B442D5166C70B000556CAD /* InbandTextTrackPrivateAVF.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -7203,6 +7205,8 @@
</span><span class="cx">                 07AB996818DA3C010018771E /* RTCIceServer.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = RTCIceServer.idl; sourceTree = "<group>"; };
</span><span class="cx">                 07AB996D18DA3C740018771E /* RTCConfigurationPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCConfigurationPrivate.h; sourceTree = "<group>"; };
</span><span class="cx">                 07AB996E18DA3C740018771E /* RTCIceServerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCIceServerPrivate.h; sourceTree = "<group>"; };
</span><ins>+                07AC46FF1952102100EE9723 /* ISOVTTCue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ISOVTTCue.cpp; path = ISOVTTCue.cpp; sourceTree = "<group>"; };
+                07AC47001952102100EE9723 /* ISOVTTCue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ISOVTTCue.h; path = ISOVTTCue.h; sourceTree = "<group>"; };
</ins><span class="cx">                 07B0113E1032242200FBDC33 /* AccessibilityMediaControls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AccessibilityMediaControls.h; sourceTree = "<group>"; };
</span><span class="cx">                 07B442D4166C70B000556CAD /* InbandTextTrackPrivateAVF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InbandTextTrackPrivateAVF.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 07B442D5166C70B000556CAD /* InbandTextTrackPrivateAVF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InbandTextTrackPrivateAVF.h; sourceTree = "<group>"; };
</span><span class="lines">@@ -20403,6 +20407,8 @@
</span><span class="cx">                                 2D46F04F17B96FD2005647F0 /* IntSize.cpp */,
</span><span class="cx">                                 B27535470B053814002CE64F /* IntSize.h */,
</span><span class="cx">                                 B27535480B053814002CE64F /* IntSizeHash.h */,
</span><ins>+                                07AC46FF1952102100EE9723 /* ISOVTTCue.cpp */,
+                                07AC47001952102100EE9723 /* ISOVTTCue.h */,
</ins><span class="cx">                                 65CC6BED16014EC0000ED27D /* Latin1TextIterator.h */,
</span><span class="cx">                                 141DC049164834B900371E5A /* LayoutBoxExtent.cpp */,
</span><span class="cx">                                 141DC04A164834B900371E5A /* LayoutBoxExtent.h */,
</span><span class="lines">@@ -24907,6 +24913,7 @@
</span><span class="cx">                                 E1FF8F65180745D800132674 /* JSSubtleCrypto.h in Headers */,
</span><span class="cx">                                 B20111080AB7740500DB0E68 /* JSSVGAElement.h in Headers */,
</span><span class="cx">                                 24D9129213CA951E00D21915 /* JSSVGAltGlyphDefElement.h in Headers */,
</span><ins>+                                07AC47021952102100EE9723 /* ISOVTTCue.h in Headers */,
</ins><span class="cx">                                 6515EC920D9723FF0063D49A /* JSSVGAltGlyphElement.h in Headers */,
</span><span class="cx">                                 24D9129613CA956100D21915 /* JSSVGAltGlyphItemElement.h in Headers */,
</span><span class="cx">                                 B222F6990AB771950022EFAD /* JSSVGAngle.h in Headers */,
</span><span class="lines">@@ -29493,6 +29500,7 @@
</span><span class="cx">                                 B2227A530D00BF220071B782 /* SVGPaint.cpp in Sources */,
</span><span class="cx">                                 B2227A560D00BF220071B782 /* SVGParserUtilities.cpp in Sources */,
</span><span class="cx">                                 84C6784C1214814700A92902 /* SVGPathBlender.cpp in Sources */,
</span><ins>+                                07AC47011952102100EE9723 /* ISOVTTCue.cpp in Sources */,
</ins><span class="cx">                                 8476C9EA11DF6A2900555B02 /* SVGPathBuilder.cpp in Sources */,
</span><span class="cx">                                 8419D2A8120D92D000141F8F /* SVGPathByteStreamBuilder.cpp in Sources */,
</span><span class="cx">                                 8419D2AC120D92FC00141F8F /* SVGPathByteStreamSource.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebCorehtmltrackBufferedLineReaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/track/BufferedLineReader.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/track/BufferedLineReader.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/html/track/BufferedLineReader.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -68,6 +68,8 @@
</span><span class="cx"> // Returns true if EOS has been reached proper.
</span><span class="cx"> bool isAtEndOfStream() const { return m_endOfStream && m_buffer.isEmpty(); }
</span><span class="cx">
</span><ins>+ void reset() { m_buffer.clear(); }
+
</ins><span class="cx"> private:
</span><span class="cx"> // Consume the next character the buffer if it is the character |c|.
</span><span class="cx"> void scanCharacter(UChar c)
</span></span></pre></div>
<a id="trunkSourceWebCorehtmltrackInbandGenericTextTrackcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/track/InbandGenericTextTrack.cpp (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/track/InbandGenericTextTrack.cpp        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/html/track/InbandGenericTextTrack.cpp        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> *
</span><span class="cx"> * Redistribution and use in source and binary forms, with or without
</span><span class="cx"> * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -36,6 +36,10 @@
</span><span class="cx"> #include <math.h>
</span><span class="cx"> #include <wtf/text/CString.h>
</span><span class="cx">
</span><ins>+#if ENABLE(WEBVTT_REGIONS)
+#include "VTTRegionList.h"
+#endif
+
</ins><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="cx"> GenericTextTrackCueMap::GenericTextTrackCueMap()
</span><span class="lines">@@ -190,6 +194,59 @@
</span><span class="cx"> TextTrack::removeCue(cue, ec);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+WebVTTParser& InbandGenericTextTrack::parser()
+{
+ if (!m_webVTTParser)
+ m_webVTTParser = std::make_unique<WebVTTParser>(static_cast<WebVTTParserClient*>(this), scriptExecutionContext());
+ return *m_webVTTParser;
+}
+
+void InbandGenericTextTrack::parseWebVTTCueData(InbandTextTrackPrivate* trackPrivate, const ISOWebVTTCue& cueData)
+{
+ ASSERT_UNUSED(trackPrivate, trackPrivate == m_private);
+ parser().parseCueData(cueData);
+}
+
+void InbandGenericTextTrack::parseWebVTTFileHeader(InbandTextTrackPrivate* trackPrivate, String header)
+{
+ ASSERT_UNUSED(trackPrivate, trackPrivate == m_private);
+ parser().parseFileHeader(header);
+}
+
+void InbandGenericTextTrack::newCuesParsed()
+{
+ Vector<RefPtr<WebVTTCueData>> cues;
+ parser().getNewCues(cues);
+
+ for (auto& cueData : cues) {
+ RefPtr<VTTCue> vttCue = VTTCue::create(*scriptExecutionContext(), *cueData);
+
+ if (hasCue(vttCue.get(), TextTrackCue::IgnoreDuration)) {
+ LOG(Media, "InbandGenericTextTrack::newCuesParsed ignoring already added cue: start=%.2f, end=%.2f, content=\"%s\"\n", vttCue->startTime(), vttCue->endTime(), vttCue->text().utf8().data());
+ return;
+ }
+ addCue(vttCue.release(), ASSERT_NO_EXCEPTION);
+ }
+}
+
+#if ENABLE(WEBVTT_REGIONS)
+void InbandGenericTextTrack::newRegionsParsed()
+{
+ Vector<RefPtr<VTTRegion>> newRegions;
+ parser().getNewRegions(newRegions);
+
+ for (auto& region : newRegions) {
+ region->setTrack(this);
+ regions()->add(region);
+ }
+}
+#endif
+
+void InbandGenericTextTrack::fileFailedToParse()
+{
+ LOG(Media, "Error parsing WebVTT stream.");
+}
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx">
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCorehtmltrackInbandGenericTextTrackh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/track/InbandGenericTextTrack.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/track/InbandGenericTextTrack.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/html/track/InbandGenericTextTrack.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012, 2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> *
</span><span class="cx"> * Redistribution and use in source and binary forms, with or without
</span><span class="cx"> * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx">
</span><span class="cx"> #include "InbandTextTrack.h"
</span><span class="cx"> #include "TextTrackCueGeneric.h"
</span><ins>+#include "WebVTTParser.h"
</ins><span class="cx"> #include <wtf/RefPtr.h>
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -59,7 +60,7 @@
</span><span class="cx"> CueDataToCueMap m_dataToCueMap;
</span><span class="cx"> };
</span><span class="cx">
</span><del>-class InbandGenericTextTrack : public InbandTextTrack {
</del><ins>+class InbandGenericTextTrack : public InbandTextTrack, private WebVTTParserClient {
</ins><span class="cx"> public:
</span><span class="cx"> static PassRefPtr<InbandGenericTextTrack> create(ScriptExecutionContext*, TextTrackClient*, PassRefPtr<InbandTextTrackPrivate>);
</span><span class="cx"> virtual ~InbandGenericTextTrack();
</span><span class="lines">@@ -75,7 +76,18 @@
</span><span class="cx"> PassRefPtr<TextTrackCueGeneric> createCue(PassRefPtr<GenericCueData>);
</span><span class="cx"> void updateCueFromCueData(TextTrackCueGeneric*, GenericCueData*);
</span><span class="cx">
</span><ins>+ WebVTTParser& parser();
+ virtual void parseWebVTTCueData(InbandTextTrackPrivate*, const ISOWebVTTCue&) override;
+ virtual void parseWebVTTFileHeader(InbandTextTrackPrivate*, String) override;
+
+ virtual void newCuesParsed() override;
+#if ENABLE(WEBVTT_REGIONS)
+ virtual void newRegionsParsed() override;
+#endif
+ virtual void fileFailedToParse() override;
+
</ins><span class="cx"> GenericTextTrackCueMap m_cueMap;
</span><ins>+ std::unique_ptr<WebVTTParser> m_webVTTParser;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorehtmltrackInbandTextTrackh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/track/InbandTextTrack.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/track/InbandTextTrack.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/html/track/InbandTextTrack.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -81,7 +81,10 @@
</span><span class="cx"> virtual void updateGenericCue(InbandTextTrackPrivate*, GenericCueData*) override { ASSERT_NOT_REACHED(); }
</span><span class="cx"> virtual void removeGenericCue(InbandTextTrackPrivate*, GenericCueData*) override { ASSERT_NOT_REACHED(); }
</span><span class="cx">
</span><ins>+ virtual void parseWebVTTFileHeader(InbandTextTrackPrivate*, String) override { ASSERT_NOT_REACHED(); }
</ins><span class="cx"> virtual void parseWebVTTCueData(InbandTextTrackPrivate*, const char*, unsigned) override { ASSERT_NOT_REACHED(); }
</span><ins>+ virtual void parseWebVTTCueData(InbandTextTrackPrivate*, const ISOWebVTTCue&) override { ASSERT_NOT_REACHED(); }
+
</ins><span class="cx"> virtual double startTimeVariance() const;
</span><span class="cx">
</span><span class="cx"> #if USE(PLATFORM_TEXT_TRACK_MENU)
</span></span></pre></div>
<a id="trunkSourceWebCorehtmltrackInbandWebVTTTextTrackcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/track/InbandWebVTTTextTrack.cpp (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/track/InbandWebVTTTextTrack.cpp        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/html/track/InbandWebVTTTextTrack.cpp        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -34,6 +34,10 @@
</span><span class="cx"> #include "NotImplemented.h"
</span><span class="cx"> #include <wtf/text/CString.h>
</span><span class="cx">
</span><ins>+#if ENABLE(WEBVTT_REGIONS)
+#include "VTTRegionList.h"
+#endif
+
</ins><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="cx"> PassRefPtr<InbandTextTrack> InbandWebVTTTextTrack::create(ScriptExecutionContext* context, TextTrackClient* client, PassRefPtr<InbandTextTrackPrivate> playerPrivate)
</span><span class="lines">@@ -50,42 +54,57 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void InbandWebVTTTextTrack::parseWebVTTCueData(InbandTextTrackPrivate* trackPrivate, const char* data, unsigned length)
</del><ins>+WebVTTParser& InbandWebVTTTextTrack::parser()
</ins><span class="cx"> {
</span><del>- ASSERT_UNUSED(trackPrivate, trackPrivate == m_private);
</del><span class="cx"> if (!m_webVTTParser)
</span><span class="cx"> m_webVTTParser = std::make_unique<WebVTTParser>(static_cast<WebVTTParserClient*>(this), scriptExecutionContext());
</span><del>- m_webVTTParser->parseBytes(data, length);
</del><ins>+ return *m_webVTTParser;
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+void InbandWebVTTTextTrack::parseWebVTTCueData(InbandTextTrackPrivate* trackPrivate, const char* data, unsigned length)
+{
+ ASSERT_UNUSED(trackPrivate, trackPrivate == m_private);
+ parser().parseBytes(data, length);
+}
+
+void InbandWebVTTTextTrack::parseWebVTTCueData(InbandTextTrackPrivate* trackPrivate, const ISOWebVTTCue& cueData)
+{
+ ASSERT_UNUSED(trackPrivate, trackPrivate == m_private);
+ parser().parseCueData(cueData);
+}
+
</ins><span class="cx"> void InbandWebVTTTextTrack::newCuesParsed()
</span><span class="cx"> {
</span><span class="cx"> Vector<RefPtr<WebVTTCueData>> cues;
</span><del>- m_webVTTParser->getNewCues(cues);
- for (size_t i = 0; i < cues.size(); ++i) {
- RefPtr<WebVTTCueData> cueData = cues[i];
- RefPtr<VTTCue> cue = VTTCue::create(*scriptExecutionContext(), cueData->startTime(), cueData->endTime(), cueData->content());
- cue->setId(cueData->id());
- cue->setCueSettings(cueData->settings());
</del><ins>+ parser().getNewCues(cues);
</ins><span class="cx">
</span><del>- if (hasCue(cue.get(), TextTrackCue::IgnoreDuration)) {
- LOG(Media, "InbandWebVTTTextTrack::newCuesParsed ignoring already added cue: start=%.2f, end=%.2f, content=\"%s\"\n", cueData->startTime(), cueData->endTime(), cueData->content().utf8().data());
</del><ins>+ for (auto& cueData : cues) {
+ RefPtr<VTTCue> vttCue = VTTCue::create(*scriptExecutionContext(), *cueData);
+
+ if (hasCue(vttCue.get(), TextTrackCue::IgnoreDuration)) {
+ LOG(Media, "InbandWebVTTTextTrack::newCuesParsed ignoring already added cue: start=%.2f, end=%.2f, content=\"%s\"\n", vttCue->startTime(), vttCue->endTime(), vttCue->text().utf8().data());
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><del>- addCue(cue.release(), ASSERT_NO_EXCEPTION);
</del><ins>+ addCue(vttCue.release(), ASSERT_NO_EXCEPTION);
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #if ENABLE(WEBVTT_REGIONS)
</span><span class="cx"> void InbandWebVTTTextTrack::newRegionsParsed()
</span><span class="cx"> {
</span><del>- notImplemented();
</del><ins>+ Vector<RefPtr<VTTRegion>> newRegions;
+ parser().getNewRegions(newRegions);
+
+ for (auto& region : newRegions) {
+ region->setTrack(this);
+ regions()->add(region);
+ }
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> void InbandWebVTTTextTrack::fileFailedToParse()
</span><span class="cx"> {
</span><del>- LOG(Media, "Unable to parse WebVTT stream.");
</del><ins>+ LOG(Media, "Error parsing WebVTT stream.");
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorehtmltrackInbandWebVTTTextTrackh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/track/InbandWebVTTTextTrack.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/track/InbandWebVTTTextTrack.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/html/track/InbandWebVTTTextTrack.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -43,7 +43,9 @@
</span><span class="cx"> private:
</span><span class="cx"> InbandWebVTTTextTrack(ScriptExecutionContext*, TextTrackClient*, PassRefPtr<InbandTextTrackPrivate>);
</span><span class="cx">
</span><ins>+ WebVTTParser& parser();
</ins><span class="cx"> virtual void parseWebVTTCueData(InbandTextTrackPrivate*, const char* data, unsigned length) override;
</span><ins>+ virtual void parseWebVTTCueData(InbandTextTrackPrivate*, const ISOWebVTTCue&) override;
</ins><span class="cx">
</span><span class="cx"> virtual void newCuesParsed() override;
</span><span class="cx"> #if ENABLE(WEBVTT_REGIONS)
</span></span></pre></div>
<a id="trunkSourceWebCorehtmltrackTextTrackCueGenericcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/track/TextTrackCueGeneric.cpp (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/track/TextTrackCueGeneric.cpp        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/html/track/TextTrackCueGeneric.cpp        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -43,7 +43,7 @@
</span><span class="cx">
</span><span class="cx"> class TextTrackCueGenericBoxElement final : public VTTCueBox {
</span><span class="cx"> public:
</span><del>- static PassRefPtr<TextTrackCueGenericBoxElement> create(Document& document, TextTrackCueGeneric* cue)
</del><ins>+ static PassRefPtr<TextTrackCueGenericBoxElement> create(Document& document, TextTrackCueGeneric& cue)
</ins><span class="cx"> {
</span><span class="cx"> return adoptRef(new TextTrackCueGenericBoxElement(document, cue));
</span><span class="cx"> }
</span><span class="lines">@@ -51,10 +51,10 @@
</span><span class="cx"> virtual void applyCSSProperties(const IntSize&) override;
</span><span class="cx">
</span><span class="cx"> private:
</span><del>- TextTrackCueGenericBoxElement(Document&, VTTCue*);
</del><ins>+ TextTrackCueGenericBoxElement(Document&, VTTCue&);
</ins><span class="cx"> };
</span><span class="cx">
</span><del>-TextTrackCueGenericBoxElement::TextTrackCueGenericBoxElement(Document& document, VTTCue* cue)
</del><ins>+TextTrackCueGenericBoxElement::TextTrackCueGenericBoxElement(Document& document, VTTCue& cue)
</ins><span class="cx"> : VTTCueBox(document, cue)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -118,7 +118,7 @@
</span><span class="cx">
</span><span class="cx"> PassRefPtr<VTTCueBox> TextTrackCueGeneric::createDisplayTree()
</span><span class="cx"> {
</span><del>- return TextTrackCueGenericBoxElement::create(ownerDocument(), this);
</del><ins>+ return TextTrackCueGenericBoxElement::create(ownerDocument(), *this);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void TextTrackCueGeneric::setLine(int line, ExceptionCode& ec)
</span></span></pre></div>
<a id="trunkSourceWebCorehtmltrackVTTCuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/track/VTTCue.cpp (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/track/VTTCue.cpp        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/html/track/VTTCue.cpp        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -119,7 +119,14 @@
</span><span class="cx">
</span><span class="cx"> // ----------------------------
</span><span class="cx">
</span><del>-VTTCueBox::VTTCueBox(Document& document, VTTCue* cue)
</del><ins>+PassRefPtr<VTTCueBox> VTTCueBox::create(Document& document, VTTCue& cue)
+{
+ VTTCueBox* cueBox = new VTTCueBox(document, cue);
+ cueBox->setPseudo(VTTCueBox::vttCueBoxShadowPseudoId());
+ return adoptRef(cueBox);
+}
+
+VTTCueBox::VTTCueBox(Document& document, VTTCue& cue)
</ins><span class="cx"> : HTMLElement(divTag, document)
</span><span class="cx"> , m_cue(cue)
</span><span class="cx"> {
</span><span class="lines">@@ -128,14 +135,14 @@
</span><span class="cx">
</span><span class="cx"> VTTCue* VTTCueBox::getCue() const
</span><span class="cx"> {
</span><del>- return m_cue;
</del><ins>+ return &m_cue;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void VTTCueBox::applyCSSProperties(const IntSize&)
</span><span class="cx"> {
</span><span class="cx"> // FIXME: Apply all the initial CSS positioning properties. http://wkb.ug/79916
</span><span class="cx"> #if ENABLE(WEBVTT_REGIONS)
</span><del>- if (!m_cue->regionId().isEmpty()) {
</del><ins>+ if (!m_cue.regionId().isEmpty()) {
</ins><span class="cx"> setInlineStyleProperty(CSSPropertyPosition, CSSValueRelative);
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="lines">@@ -150,12 +157,12 @@
</span><span class="cx"> setInlineStyleProperty(CSSPropertyUnicodeBidi, CSSValueWebkitPlaintext);
</span><span class="cx">
</span><span class="cx"> // the 'direction' property must be set to direction
</span><del>- setInlineStyleProperty(CSSPropertyDirection, m_cue->getCSSWritingDirection());
</del><ins>+ setInlineStyleProperty(CSSPropertyDirection, m_cue.getCSSWritingDirection());
</ins><span class="cx">
</span><span class="cx"> // the 'writing-mode' property must be set to writing-mode
</span><del>- setInlineStyleProperty(CSSPropertyWebkitWritingMode, m_cue->getCSSWritingMode(), false);
</del><ins>+ setInlineStyleProperty(CSSPropertyWebkitWritingMode, m_cue.getCSSWritingMode(), false);
</ins><span class="cx">
</span><del>- std::pair<float, float> position = m_cue->getCSSPosition();
</del><ins>+ std::pair<float, float> position = m_cue.getCSSPosition();
</ins><span class="cx">
</span><span class="cx"> // the 'top' property must be set to top,
</span><span class="cx"> setInlineStyleProperty(CSSPropertyTop, static_cast<double>(position.second), CSSPrimitiveValue::CSS_PERCENTAGE);
</span><span class="lines">@@ -164,21 +171,21 @@
</span><span class="cx"> setInlineStyleProperty(CSSPropertyLeft, static_cast<double>(position.first), CSSPrimitiveValue::CSS_PERCENTAGE);
</span><span class="cx">
</span><span class="cx"> // the 'width' property must be set to width, and the 'height' property must be set to height
</span><del>- if (m_cue->vertical() == horizontalKeyword()) {
- setInlineStyleProperty(CSSPropertyWidth, static_cast<double>(m_cue->getCSSSize()), CSSPrimitiveValue::CSS_PERCENTAGE);
</del><ins>+ if (m_cue.vertical() == horizontalKeyword()) {
+ setInlineStyleProperty(CSSPropertyWidth, static_cast<double>(m_cue.getCSSSize()), CSSPrimitiveValue::CSS_PERCENTAGE);
</ins><span class="cx"> setInlineStyleProperty(CSSPropertyHeight, CSSValueAuto);
</span><span class="cx"> } else {
</span><span class="cx"> setInlineStyleProperty(CSSPropertyWidth, CSSValueAuto);
</span><del>- setInlineStyleProperty(CSSPropertyHeight, static_cast<double>(m_cue->getCSSSize()), CSSPrimitiveValue::CSS_PERCENTAGE);
</del><ins>+ setInlineStyleProperty(CSSPropertyHeight, static_cast<double>(m_cue.getCSSSize()), CSSPrimitiveValue::CSS_PERCENTAGE);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // The 'text-align' property on the (root) List of WebVTT Node Objects must
</span><span class="cx"> // be set to the value in the second cell of the row of the table below
</span><span class="cx"> // whose first cell is the value of the corresponding cue's text track cue
</span><span class="cx"> // alignment:
</span><del>- setInlineStyleProperty(CSSPropertyTextAlign, m_cue->getCSSAlignment());
</del><ins>+ setInlineStyleProperty(CSSPropertyTextAlign, m_cue.getCSSAlignment());
</ins><span class="cx">
</span><del>- if (!m_cue->snapToLines()) {
</del><ins>+ if (!m_cue.snapToLines()) {
</ins><span class="cx"> // 10.13.1 Set up x and y:
</span><span class="cx"> // Note: x and y are set through the CSS left and top above.
</span><span class="cx">
</span><span class="lines">@@ -209,25 +216,35 @@
</span><span class="cx">
</span><span class="cx"> // ----------------------------
</span><span class="cx">
</span><ins>+PassRefPtr<VTTCue> VTTCue::create(ScriptExecutionContext& context, double start, double end, const String& content)
+{
+ return adoptRef(new VTTCue(context, start, end, content));
+}
+
+PassRefPtr<VTTCue> VTTCue::create(ScriptExecutionContext& context, const WebVTTCueData& data)
+{
+ return adoptRef(new VTTCue(context, data));
+}
+
</ins><span class="cx"> VTTCue::VTTCue(ScriptExecutionContext& context, double start, double end, const String& content)
</span><span class="cx"> : TextTrackCue(context, start, end)
</span><span class="cx"> , m_content(content)
</span><del>- , m_linePosition(undefinedPosition)
- , m_computedLinePosition(undefinedPosition)
- , m_textPosition(50)
- , m_cueSize(100)
- , m_writingDirection(Horizontal)
- , m_cueAlignment(Middle)
- , m_webVTTNodeTree(nullptr)
- , m_cueBackgroundBox(HTMLSpanElement::create(spanTag, toDocument(context)))
- , m_displayDirection(CSSValueLtr)
- , m_displaySize(0)
- , m_snapToLines(true)
- , m_displayTreeShouldChange(true)
- , m_notifyRegion(true)
</del><span class="cx"> {
</span><ins>+ initialize(context);
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+VTTCue::VTTCue(ScriptExecutionContext& context, const WebVTTCueData& cueData)
+ : TextTrackCue(context, 0, 0)
+{
+ initialize(context);
+ setText(cueData.content());
+ setStartTime(cueData.startTime(), IGNORE_EXCEPTION);
+ setEndTime(cueData.endTime(), IGNORE_EXCEPTION);
+ setId(cueData.id());
+ setCueSettings(cueData.settings());
+ m_originalStartTime = cueData.originalStartTime();
+}
+
</ins><span class="cx"> VTTCue::~VTTCue()
</span><span class="cx"> {
</span><span class="cx"> if (!hasDisplayTree())
</span><span class="lines">@@ -236,9 +253,27 @@
</span><span class="cx"> displayTreeInternal()->remove(ASSERT_NO_EXCEPTION);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void VTTCue::initialize(ScriptExecutionContext& context)
+{
+ m_linePosition = undefinedPosition;
+ m_computedLinePosition = undefinedPosition;
+ m_textPosition = 50;
+ m_cueSize = 100;
+ m_writingDirection = Horizontal;
+ m_cueAlignment = Middle;
+ m_webVTTNodeTree = nullptr;
+ m_cueBackgroundBox = HTMLSpanElement::create(spanTag, toDocument(context));
+ m_displayDirection = CSSValueLtr;
+ m_displaySize = 0;
+ m_snapToLines = true;
+ m_displayTreeShouldChange = true;
+ m_notifyRegion = true;
+ m_originalStartTime = 0;
+}
+
</ins><span class="cx"> PassRefPtr<VTTCueBox> VTTCue::createDisplayTree()
</span><span class="cx"> {
</span><del>- return VTTCueBox::create(ownerDocument(), this);
</del><ins>+ return VTTCueBox::create(ownerDocument(), *this);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> VTTCueBox* VTTCue::displayTreeInternal()
</span><span class="lines">@@ -699,6 +734,7 @@
</span><span class="cx"> bool check = WebVTTParser::collectTimeStamp(child->nodeValue(), currentTimestamp);
</span><span class="cx"> ASSERT_UNUSED(check, check);
</span><span class="cx">
</span><ins>+ currentTimestamp += m_originalStartTime;
</ins><span class="cx"> if (currentTimestamp > movieTime)
</span><span class="cx"> isPastNode = false;
</span><span class="cx"> }
</span><span class="lines">@@ -884,6 +920,9 @@
</span><span class="cx">
</span><span class="cx"> void VTTCue::setCueSettings(const String& inputString)
</span><span class="cx"> {
</span><ins>+ if (inputString.isEmpty())
+ return;
+
</ins><span class="cx"> VTTScanner input(inputString);
</span><span class="cx">
</span><span class="cx"> while (!input.isAtEnd()) {
</span></span></pre></div>
<a id="trunkSourceWebCorehtmltrackVTTCueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/track/VTTCue.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/track/VTTCue.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/html/track/VTTCue.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -46,15 +46,13 @@
</span><span class="cx"> class ScriptExecutionContext;
</span><span class="cx"> class VTTCue;
</span><span class="cx"> class VTTScanner;
</span><ins>+class WebVTTCueData;
</ins><span class="cx">
</span><span class="cx"> // ----------------------------
</span><span class="cx">
</span><span class="cx"> class VTTCueBox : public HTMLElement {
</span><span class="cx"> public:
</span><del>- static PassRefPtr<VTTCueBox> create(Document& document, VTTCue* cue)
- {
- return adoptRef(new VTTCueBox(document, cue));
- }
</del><ins>+ static PassRefPtr<VTTCueBox> create(Document&, VTTCue&);
</ins><span class="cx">
</span><span class="cx"> VTTCue* getCue() const;
</span><span class="cx"> virtual void applyCSSProperties(const IntSize& videoSize);
</span><span class="lines">@@ -62,21 +60,19 @@
</span><span class="cx"> static const AtomicString& vttCueBoxShadowPseudoId();
</span><span class="cx">
</span><span class="cx"> protected:
</span><del>- VTTCueBox(Document&, VTTCue*);
</del><ins>+ VTTCueBox(Document&, VTTCue&);
</ins><span class="cx">
</span><span class="cx"> virtual RenderPtr<RenderElement> createElementRenderer(PassRef<RenderStyle>) override;
</span><span class="cx">
</span><del>- VTTCue* m_cue;
</del><ins>+ VTTCue& m_cue;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> // ----------------------------
</span><span class="cx">
</span><span class="cx"> class VTTCue : public TextTrackCue {
</span><span class="cx"> public:
</span><del>- static PassRefPtr<VTTCue> create(ScriptExecutionContext& context, double start, double end, const String& content)
- {
- return adoptRef(new VTTCue(context, start, end, content));
- }
</del><ins>+ static PassRefPtr<VTTCue> create(ScriptExecutionContext&, double start, double end, const String&);
+ static PassRefPtr<VTTCue> create(ScriptExecutionContext&, const WebVTTCueData&);
</ins><span class="cx">
</span><span class="cx"> virtual ~VTTCue();
</span><span class="cx">
</span><span class="lines">@@ -164,11 +160,13 @@
</span><span class="cx">
</span><span class="cx"> protected:
</span><span class="cx"> VTTCue(ScriptExecutionContext&, double start, double end, const String& content);
</span><ins>+ VTTCue(ScriptExecutionContext&, const WebVTTCueData&);
</ins><span class="cx">
</span><span class="cx"> virtual PassRefPtr<VTTCueBox> createDisplayTree();
</span><span class="cx"> VTTCueBox* displayTreeInternal();
</span><span class="cx">
</span><span class="cx"> private:
</span><ins>+ void initialize(ScriptExecutionContext&);
</ins><span class="cx"> void createWebVTTNodeTree();
</span><span class="cx"> void copyWebVTTNodeToDOMTree(ContainerNode* WebVTTNode, ContainerNode* root);
</span><span class="cx">
</span><span class="lines">@@ -211,6 +209,8 @@
</span><span class="cx"> int m_displaySize;
</span><span class="cx"> std::pair<float, float> m_displayPosition;
</span><span class="cx">
</span><ins>+ double m_originalStartTime;
+
</ins><span class="cx"> bool m_snapToLines : 1;
</span><span class="cx"> bool m_displayTreeShouldChange : 1;
</span><span class="cx"> bool m_notifyRegion : 1;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmltrackWebVTTParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/track/WebVTTParser.cpp (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/track/WebVTTParser.cpp        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/html/track/WebVTTParser.cpp        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx"> * Copyright (C) 2011, 2013 Google Inc. All rights reserved.
</span><span class="cx"> * Copyright (C) 2013 Cable Television Labs, Inc.
</span><del>- * Copyright (C) 2014 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2011-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> *
</span><span class="cx"> * Redistribution and use in source and binary forms, with or without
</span><span class="cx"> * modification, are permitted provided that the following conditions are
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx">
</span><span class="cx"> #include "WebVTTParser.h"
</span><span class="cx">
</span><ins>+#include "ISOVTTCue.h"
</ins><span class="cx"> #include "ProcessingInstruction.h"
</span><span class="cx"> #include "Text.h"
</span><span class="cx"> #include "VTTScanner.h"
</span><span class="lines">@@ -108,6 +109,14 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx">
</span><ins>+void WebVTTParser::parseFileHeader(const String& data)
+{
+ m_state = Initial;
+ m_lineReader.reset();
+ m_lineReader.append(data);
+ parse();
+}
+
</ins><span class="cx"> void WebVTTParser::parseBytes(const char* data, unsigned length)
</span><span class="cx"> {
</span><span class="cx"> String textData = m_decoder->decode(data, length);
</span><span class="lines">@@ -115,6 +124,27 @@
</span><span class="cx"> parse();
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void WebVTTParser::parseCueData(const ISOWebVTTCue& data)
+{
+ RefPtr<WebVTTCueData> cue = WebVTTCueData::create();
+
+ double startTime = data.presentationTime().toDouble();
+ cue->setStartTime(startTime);
+ cue->setEndTime(startTime + data.duration().toDouble());
+
+ cue->setContent(data.cueText());
+ cue->setId(data.id());
+ cue->setSettings(data.settings());
+
+ double originalStartTime;
+ if (WebVTTParser::collectTimeStamp(data.originalStartTime(), originalStartTime))
+ cue->setOriginalStartTime(originalStartTime);
+
+ m_cuelist.append(cue);
+ if (m_client)
+ m_client->newCuesParsed();
+}
+
</ins><span class="cx"> void WebVTTParser::flush()
</span><span class="cx"> {
</span><span class="cx"> String textData = m_decoder->flush();
</span><span class="lines">@@ -271,6 +301,9 @@
</span><span class="cx">
</span><span class="cx"> WebVTTParser::ParseState WebVTTParser::collectTimingsAndSettings(const String& line)
</span><span class="cx"> {
</span><ins>+ if (line.isEmpty())
+ return BadCue;
+
</ins><span class="cx"> VTTScanner input(line);
</span><span class="cx">
</span><span class="cx"> // Collect WebVTT cue timings and settings. (5.3 WebVTT cue timings and settings parsing.)
</span><span class="lines">@@ -434,6 +467,9 @@
</span><span class="cx">
</span><span class="cx"> bool WebVTTParser::collectTimeStamp(const String& line, double& timeStamp)
</span><span class="cx"> {
</span><ins>+ if (line.isEmpty())
+ return false;
+
</ins><span class="cx"> VTTScanner input(line);
</span><span class="cx"> return collectTimeStamp(input, timeStamp);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorehtmltrackWebVTTParserh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/track/WebVTTParser.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/track/WebVTTParser.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/html/track/WebVTTParser.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -49,6 +49,7 @@
</span><span class="cx"> using namespace HTMLNames;
</span><span class="cx">
</span><span class="cx"> class Document;
</span><ins>+class ISOWebVTTCue;
</ins><span class="cx"> class VTTScanner;
</span><span class="cx">
</span><span class="cx"> class WebVTTParserClient {
</span><span class="lines">@@ -83,15 +84,20 @@
</span><span class="cx"> String settings() const { return m_settings; }
</span><span class="cx"> void setSettings(String settings) { m_settings = settings; }
</span><span class="cx">
</span><ins>+ double originalStartTime() const { return m_originalStartTime; }
+ void setOriginalStartTime(double time) { m_originalStartTime = time; }
+
</ins><span class="cx"> private:
</span><span class="cx"> WebVTTCueData()
</span><span class="cx"> : m_startTime(0)
</span><span class="cx"> , m_endTime(0)
</span><ins>+ , m_originalStartTime(0)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> double m_startTime;
</span><span class="cx"> double m_endTime;
</span><ins>+ double m_originalStartTime;
</ins><span class="cx"> String m_id;
</span><span class="cx"> String m_content;
</span><span class="cx"> String m_settings;
</span><span class="lines">@@ -140,7 +146,9 @@
</span><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> // Input data to the parser to parse.
</span><del>- void parseBytes(const char* data, unsigned length);
</del><ins>+ void parseBytes(const char*, unsigned);
+ void parseFileHeader(const String&);
+ void parseCueData(const ISOWebVTTCue&);
</ins><span class="cx"> void flush();
</span><span class="cx"> void fileFinished();
</span><span class="cx">
</span><span class="lines">@@ -184,7 +192,7 @@
</span><span class="cx"> double m_currentEndTime;
</span><span class="cx"> StringBuilder m_currentContent;
</span><span class="cx"> String m_currentSettings;
</span><del>-
</del><ins>+
</ins><span class="cx"> WebVTTParserClient* m_client;
</span><span class="cx">
</span><span class="cx"> Vector<RefPtr<WebVTTCueData>> m_cuelist;
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderTextTrackLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/TextTrackLoader.cpp (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/TextTrackLoader.cpp        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/loader/TextTrackLoader.cpp        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -215,13 +215,9 @@
</span><span class="cx"> if (m_cueParser) {
</span><span class="cx"> Vector<RefPtr<WebVTTCueData>> newCues;
</span><span class="cx"> m_cueParser->getNewCues(newCues);
</span><del>- for (size_t i = 0; i < newCues.size(); ++i) {
- RefPtr<WebVTTCueData> data = newCues[i];
- RefPtr<VTTCue> cue = VTTCue::create(*m_scriptExecutionContext, data->startTime(), data->endTime(), data->content());
- cue->setId(data->id());
- cue->setCueSettings(data->settings());
- outputCues.append(cue);
- }
</del><ins>+
+ for (auto& cueData : newCues)
+ outputCues.append(VTTCue::create(*m_scriptExecutionContext, *cueData));
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsISOVTTCuecpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/platform/graphics/ISOVTTCue.cpp (0 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ISOVTTCue.cpp         (rev 0)
+++ trunk/Source/WebCore/platform/graphics/ISOVTTCue.cpp        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -0,0 +1,151 @@
</span><ins>+/*
+ * Copyright (C) 2014 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 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 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"
+#include "ISOVTTCue.h"
+
+#include "Logging.h"
+#include <runtime/ArrayBuffer.h>
+#include <runtime/DataView.h>
+#include <runtime/Int8Array.h>
+#include <wtf/NeverDestroyed.h>
+#include <wtf/text/CString.h>
+#include <wtf/text/StringBuilder.h>
+
+namespace JSC {
+class ArrayBuffer;
+}
+
+namespace WebCore {
+
+ISOBox::ISOBox(ArrayBuffer* data)
+{
+ m_type = peekType(data);
+ m_length = peekLength(data);
+ ASSERT(m_length >= 8);
+}
+
+String ISOBox::peekType(ArrayBuffer* data)
+{
+ ASSERT_WITH_SECURITY_IMPLICATION(data->byteLength() >= 2 * sizeof(uint32_t));
+ if (data->byteLength() < 2 * sizeof(uint32_t))
+ return emptyString();
+
+ StringBuilder builder;
+ RefPtr<Int8Array> array = JSC::Int8Array::create(data, 4, sizeof(uint32_t));
+ for (int i = 0; i < 4; ++i)
+ builder.append(array->item(i));
+ return builder.toString();
+}
+
+size_t ISOBox::peekLength(ArrayBuffer* data)
+{
+ ASSERT_WITH_SECURITY_IMPLICATION(data->byteLength() >= sizeof(uint32_t));
+ if (data->byteLength() < sizeof(uint32_t))
+ return 0;
+
+ return JSC::DataView::create(data, 0, sizeof(uint32_t))->get<uint32_t>(0, false);
+}
+
+String ISOBox::peekString(ArrayBuffer* data, unsigned offset, unsigned length)
+{
+ ASSERT_WITH_SECURITY_IMPLICATION(offset + length <= data->byteLength());
+ if (data->byteLength() < offset + length)
+ return emptyString();
+
+ return String(JSC::Uint8Array::create(data, offset, length)->data(), length);
+}
+
+static const AtomicString& vttCueBoxType()
+{
+ static NeverDestroyed<AtomicString> vttc("vttc", AtomicString::ConstructFromLiteral);
+ return vttc;
+}
+
+static const AtomicString& vttIdBoxType()
+{
+ static NeverDestroyed<AtomicString> iden("iden", AtomicString::ConstructFromLiteral);
+ return iden;
+}
+
+static const AtomicString& vttSettingsBoxType()
+{
+ static NeverDestroyed<AtomicString> sttg("sttg", AtomicString::ConstructFromLiteral);
+ return sttg;
+}
+
+static const AtomicString& vttPayloadBoxType()
+{
+ static NeverDestroyed<AtomicString> payl("payl", AtomicString::ConstructFromLiteral);
+ return payl;
+}
+
+static const AtomicString& vttCurrentTimeBoxType()
+{
+ static NeverDestroyed<AtomicString> ctim("ctim", AtomicString::ConstructFromLiteral);
+ return ctim;
+}
+
+static const AtomicString& vttCueSourceIDBoxType()
+{
+ static NeverDestroyed<AtomicString> vsid("vsid", AtomicString::ConstructFromLiteral);
+ return vsid;
+}
+
+const AtomicString& ISOWebVTTCue::boxType()
+{
+ return vttCueBoxType();
+}
+
+ISOWebVTTCue::ISOWebVTTCue(const MediaTime& presentationTime, const MediaTime& duration, JSC::ArrayBuffer* buffer)
+ : ISOBox(buffer)
+ , m_presentationTime(presentationTime)
+ , m_duration(duration)
+{
+ size_t offset = ISOBox::boxHeaderSize();
+ while (offset < length() && length() - offset > ISOBox::boxHeaderSize()) {
+ RefPtr<ArrayBuffer> subBuffer = buffer->slice(offset);
+ String boxType = ISOBox::peekType(subBuffer.get());
+ size_t boxSize = ISOBox::peekLength(subBuffer.get());
+ size_t boxDataSize = boxSize - ISOBox::boxHeaderSize();
+
+ if (boxType == vttCueSourceIDBoxType())
+ m_sourceID = peekString(subBuffer.get(), ISOBox::boxHeaderSize(), boxDataSize);
+ else if (boxType == vttIdBoxType())
+ m_identifer = peekString(subBuffer.get(), ISOBox::boxHeaderSize(), boxDataSize);
+ else if (boxType == vttCurrentTimeBoxType())
+ m_originalStartTime = peekString(subBuffer.get(), ISOBox::boxHeaderSize(), boxDataSize);
+ else if (boxType == vttSettingsBoxType())
+ m_settings = peekString(subBuffer.get(), ISOBox::boxHeaderSize(), boxDataSize);
+ else if (boxType == vttPayloadBoxType())
+ m_cueText = peekString(subBuffer.get(), ISOBox::boxHeaderSize(), boxDataSize);
+ else
+ LOG(Media, "ISOWebVTTCue::ISOWebVTTCue - skipping box id = \"%s\", size = %zu", boxType.utf8().data(), boxSize);
+
+ offset += boxSize;
+ }
+}
+
+} // namespace WebCore
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsISOVTTCueh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/platform/graphics/ISOVTTCue.h (0 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ISOVTTCue.h         (rev 0)
+++ trunk/Source/WebCore/platform/graphics/ISOVTTCue.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -0,0 +1,94 @@
</span><ins>+/*
+ * Copyright (C) 2014 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 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 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 ISOVTTCue_h
+#define ISOVTTCue_h
+
+#include <wtf/MediaTime.h>
+#include <wtf/text/WTFString.h>
+
+namespace JSC {
+class ArrayBuffer;
+}
+
+namespace WebCore {
+
+// An ISOBox represents a ISO-BMFF box. Data in the structure is big-endian. The layout of the data structure as follows:
+// 4 bytes : 4CC : identifier
+// 4 bytes : unsigned : length
+class ISOBox {
+public:
+ static String peekType(JSC::ArrayBuffer*);
+ static size_t peekLength(JSC::ArrayBuffer*);
+ static String peekString(JSC::ArrayBuffer*, unsigned offset, unsigned length);
+ static unsigned boxHeaderSize() { return 2 * sizeof(uint32_t); }
+
+ size_t length() const { return m_length; }
+ const AtomicString& type() const { return m_type; }
+
+protected:
+ ISOBox(JSC::ArrayBuffer*);
+
+private:
+ size_t m_length;
+ AtomicString m_type;
+};
+
+// 4 bytes : 4CC : identifier = 'vttc'
+// 4 bytes : unsigned : length
+// N bytes : CueSourceIDBox : box : optional
+// N bytes : CueIDBox : box : optional
+// N bytes : CueTimeBox : box : optional
+// N bytes : CueSettingsBox : box : optional
+// N bytes : CuePayloadBox : box : required
+class ISOWebVTTCue : public ISOBox {
+public:
+ ISOWebVTTCue(const MediaTime& presentationTime, const MediaTime& duration, JSC::ArrayBuffer*);
+
+ static const AtomicString& boxType();
+
+ const MediaTime& presentationTime() const { return m_presentationTime; }
+ const MediaTime& duration() const { return m_duration; }
+
+ const String& sourceID() const { return m_sourceID; }
+ const String& id() const { return m_identifer; }
+ const String& originalStartTime() const { return m_originalStartTime; }
+ const String& settings() const { return m_settings; }
+ const String& cueText() const { return m_cueText; }
+
+private:
+ MediaTime m_presentationTime;
+ MediaTime m_duration;
+
+ String m_sourceID;
+ String m_identifer;
+ String m_originalStartTime;
+ String m_settings;
+ String m_cueText;
+};
+
+}
+
+#endif // ISOVTTCue_h
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsInbandTextTrackPrivateClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/InbandTextTrackPrivateClient.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/InbandTextTrackPrivateClient.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/InbandTextTrackPrivateClient.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012, 2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> *
</span><span class="cx"> * Redistribution and use in source and binary forms, with or without
</span><span class="cx"> * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -38,6 +38,7 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="cx"> class InbandTextTrackPrivate;
</span><ins>+class ISOWebVTTCue;
</ins><span class="cx">
</span><span class="cx"> class GenericCueData : public RefCounted<GenericCueData> {
</span><span class="cx"> public:
</span><span class="lines">@@ -180,7 +181,9 @@
</span><span class="cx"> virtual void updateGenericCue(InbandTextTrackPrivate*, GenericCueData*) = 0;
</span><span class="cx"> virtual void removeGenericCue(InbandTextTrackPrivate*, GenericCueData*) = 0;
</span><span class="cx">
</span><ins>+ virtual void parseWebVTTFileHeader(InbandTextTrackPrivate*, String) { ASSERT_NOT_REACHED(); }
</ins><span class="cx"> virtual void parseWebVTTCueData(InbandTextTrackPrivate*, const char* data, unsigned length) = 0;
</span><ins>+ virtual void parseWebVTTCueData(InbandTextTrackPrivate*, const ISOWebVTTCue&) = 0;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationInbandTextTrackPrivateAVFcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/InbandTextTrackPrivateAVF.cpp (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/InbandTextTrackPrivateAVF.cpp        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/InbandTextTrackPrivateAVF.cpp        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012, 2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx"> *
</span><span class="cx"> * Redistribution and use in source and binary forms, with or without
</span><span class="cx"> * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -29,16 +29,27 @@
</span><span class="cx">
</span><span class="cx"> #include "InbandTextTrackPrivateAVF.h"
</span><span class="cx">
</span><ins>+#include "ISOVTTCue.h"
</ins><span class="cx"> #include "InbandTextTrackPrivateClient.h"
</span><span class="cx"> #include "Logging.h"
</span><span class="cx"> #include "SoftLinking.h"
</span><span class="cx"> #include <CoreMedia/CoreMedia.h>
</span><ins>+#include <runtime/ArrayBuffer.h>
+#include <runtime/DataView.h>
+#include <runtime/Int8Array.h>
+#include <wtf/MediaTime.h>
+#include <wtf/NeverDestroyed.h>
</ins><span class="cx"> #include <wtf/PassOwnPtr.h>
</span><span class="cx"> #include <wtf/text/CString.h>
</span><ins>+#include <wtf/text/StringBuilder.h>
</ins><span class="cx"> #include <wtf/text/WTFString.h>
</span><span class="cx"> #include <wtf/unicode/CharacterNames.h>
</span><span class="cx">
</span><span class="cx"> #if !PLATFORM(WIN)
</span><ins>+#include "MediaTimeMac.h"
+#endif
+
+#if !PLATFORM(WIN)
</ins><span class="cx"> #define SOFT_LINK_AVF_FRAMEWORK(Lib) SOFT_LINK_FRAMEWORK_OPTIONAL(Lib)
</span><span class="cx"> #define SOFT_LINK_AVF_POINTER(Lib, Name, Type) SOFT_LINK_POINTER_OPTIONAL(Lib, Name, Type)
</span><span class="cx"> #else
</span><span class="lines">@@ -53,6 +64,15 @@
</span><span class="cx">
</span><span class="cx"> SOFT_LINK_AVF_FRAMEWORK(CoreMedia)
</span><span class="cx">
</span><ins>+#if !PLATFORM(WIN)
+SOFT_LINK(CoreMedia, CMSampleBufferGetDataBuffer, CMBlockBufferRef, (CMSampleBufferRef sbuf), (sbuf))
+SOFT_LINK(CoreMedia, CMBlockBufferCopyDataBytes, OSStatus, (CMBlockBufferRef theSourceBuffer, size_t offsetToData, size_t dataLength, void* destination), (theSourceBuffer, offsetToData, dataLength, destination))
+SOFT_LINK(CoreMedia, CMBlockBufferGetDataLength, size_t, (CMBlockBufferRef theBuffer), (theBuffer))
+SOFT_LINK(CoreMedia, CMSampleBufferGetSampleTimingInfo, OSStatus, (CMSampleBufferRef sbuf, CMItemIndex sampleIndex, CMSampleTimingInfo* timingInfoOut), (sbuf, sampleIndex, timingInfoOut))
+SOFT_LINK(CoreMedia, CMFormatDescriptionGetExtensions, CFDictionaryRef, (CMFormatDescriptionRef desc), (desc))
+SOFT_LINK(CoreMedia, CMSampleBufferGetFormatDescription, CMFormatDescriptionRef, (CMSampleBufferRef sbuf), (sbuf))
+#endif
+
</ins><span class="cx"> SOFT_LINK_AVF_POINTER(CoreMedia, kCMTextMarkupAttribute_Alignment, CFStringRef)
</span><span class="cx"> SOFT_LINK_AVF_POINTER(CoreMedia, kCMTextMarkupAlignmentType_Start, CFStringRef)
</span><span class="cx"> SOFT_LINK_AVF_POINTER(CoreMedia, kCMTextMarkupAlignmentType_Middle, CFStringRef)
</span><span class="lines">@@ -72,6 +92,7 @@
</span><span class="cx"> SOFT_LINK_AVF_POINTER(CoreMedia, kCMTextMarkupAttribute_ForegroundColorARGB, CFStringRef)
</span><span class="cx"> SOFT_LINK_AVF_POINTER(CoreMedia, kCMTextMarkupAttribute_BackgroundColorARGB, CFStringRef)
</span><span class="cx"> SOFT_LINK_AVF_POINTER(CoreMedia, kCMTextMarkupAttribute_CharacterBackgroundColorARGB, CFStringRef)
</span><ins>+SOFT_LINK_AVF_POINTER(CoreMedia, kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms, CFStringRef)
</ins><span class="cx">
</span><span class="cx"> #define kCMTextMarkupAttribute_Alignment getkCMTextMarkupAttribute_Alignment()
</span><span class="cx"> #define kCMTextMarkupAlignmentType_Start getkCMTextMarkupAlignmentType_Start()
</span><span class="lines">@@ -92,20 +113,26 @@
</span><span class="cx"> #define kCMTextMarkupAttribute_ForegroundColorARGB getkCMTextMarkupAttribute_ForegroundColorARGB()
</span><span class="cx"> #define kCMTextMarkupAttribute_BackgroundColorARGB getkCMTextMarkupAttribute_BackgroundColorARGB()
</span><span class="cx"> #define kCMTextMarkupAttribute_CharacterBackgroundColorARGB getkCMTextMarkupAttribute_CharacterBackgroundColorARGB()
</span><ins>+#define kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms getkCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms()
</ins><span class="cx">
</span><ins>+namespace JSC {
+class ArrayBuffer;
+}
+
</ins><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="cx"> AVFInbandTrackParent::~AVFInbandTrackParent()
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><del>-InbandTextTrackPrivateAVF::InbandTextTrackPrivateAVF(AVFInbandTrackParent* owner)
- : InbandTextTrackPrivate(Generic)
</del><ins>+InbandTextTrackPrivateAVF::InbandTextTrackPrivateAVF(AVFInbandTrackParent* owner, CueFormat format)
+ : InbandTextTrackPrivate(format)
</ins><span class="cx"> , m_owner(owner)
</span><span class="cx"> , m_pendingCueStatus(None)
</span><span class="cx"> , m_index(0)
</span><span class="cx"> , m_hasBeenReported(false)
</span><span class="cx"> , m_seeking(false)
</span><ins>+ , m_haveReportedVTTHeader(false)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -353,13 +380,19 @@
</span><span class="cx"> cueData->setContent(content.toString());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void InbandTextTrackPrivateAVF::processCue(CFArrayRef attributedStrings, double time)
</del><ins>+void InbandTextTrackPrivateAVF::processCue(CFArrayRef attributedStrings, CFArrayRef nativeSamples, double time)
</ins><span class="cx"> {
</span><span class="cx"> if (!client())
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- LOG(Media, "InbandTextTrackPrivateAVF::processCue - %li cues at time %.2f\n", attributedStrings ? CFArrayGetCount(attributedStrings) : 0, time);
</del><ins>+ processAttributedStrings(attributedStrings, time);
+ processNativeSamples(nativeSamples, time);
+}
</ins><span class="cx">
</span><ins>+void InbandTextTrackPrivateAVF::processAttributedStrings(CFArrayRef attributedStrings, double time)
+{
+ LOG(Media, "InbandTextTrackPrivateAVF::processAttributedStrings - %li attributed strings at time %.2f\n", attributedStrings ? CFArrayGetCount(attributedStrings) : 0, time);
+
</ins><span class="cx"> Vector<RefPtr<GenericCueData>> arrivingCues;
</span><span class="cx"> if (attributedStrings) {
</span><span class="cx"> CFIndex count = CFArrayGetCount(attributedStrings);
</span><span class="lines">@@ -442,9 +475,9 @@
</span><span class="cx"> LOG(Media, "InbandTextTrackPrivateAVF::processCue(%p) - adding cue for time = %.2f, position = %.2f, line = %.2f", this, cueData->startTime(), cueData->position(), cueData->line());
</span><span class="cx">
</span><span class="cx"> client()->addGenericCue(this, cueData.release());
</span><ins>+ }
</ins><span class="cx">
</span><del>- m_pendingCueStatus = seeking() ? DeliveredDuringSeek : Valid;
- }
</del><ins>+ m_pendingCueStatus = seeking() ? DeliveredDuringSeek : Valid;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void InbandTextTrackPrivateAVF::beginSeeking()
</span><span class="lines">@@ -513,6 +546,109 @@
</span><span class="cx"> m_owner->trackModeChanged();
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void InbandTextTrackPrivateAVF::processNativeSamples(CFArrayRef nativeSamples, double presentationTime)
+{
+#if PLATFORM(WIN)
+ UNUSED_PARAM(nativeSamples);
+ UNUSED_PARAM(presentationTime);
+ ASSERT_NOT_REACHED();
+#else
+ if (!nativeSamples)
+ return;
+
+ CFIndex count = CFArrayGetCount(nativeSamples);
+ if (!count)
+ return;
+
+ LOG(Media, "InbandTextTrackPrivateAVF::processNativeSamples - %li sample buffers at time %.2f\n", count, presentationTime);
+
+ for (CFIndex i = 0; i < count; i++) {
+
+ CMSampleBufferRef sampleBuffer = (CMSampleBufferRef)CFArrayGetValueAtIndex(nativeSamples, i);
+ if (!sampleBuffer)
+ continue;
+
+ CMSampleTimingInfo timingInfo;
+ OSStatus status = CMSampleBufferGetSampleTimingInfo(sampleBuffer, i, &timingInfo);
+ if (status) {
+ LOG(Media, "InbandTextTrackPrivateAVF::processNativeSamples(%p) - CMSampleBufferGetSampleTimingInfo returned error %x for sample %li", this, static_cast<SInt32>(status), i);
+ continue;
+ }
+
+ CMBlockBufferRef blockBuffer = CMSampleBufferGetDataBuffer(sampleBuffer);
+ size_t bufferLength = CMBlockBufferGetDataLength(blockBuffer);
+ if (bufferLength < ISOBox::boxHeaderSize()) {
+ LOG(Media, "InbandTextTrackPrivateAVF::processNativeSamples(%p) - ERROR: CMSampleBuffer size length unexpectedly small (%zu)!!", this, bufferLength);
+ continue;
+ }
+
+ m_sampleInputBuffer.resize(m_sampleInputBuffer.size() + bufferLength);
+ CMBlockBufferCopyDataBytes(blockBuffer, 0, bufferLength, m_sampleInputBuffer.data() + m_sampleInputBuffer.size() - bufferLength);
+
+ RefPtr<ArrayBuffer> buffer = ArrayBuffer::create(m_sampleInputBuffer.data(), m_sampleInputBuffer.size());
+
+ String type = ISOBox::peekType(buffer.get());
+ size_t boxLength = ISOBox::peekLength(buffer.get());
+ if (boxLength > buffer->byteLength()) {
+ LOG(Media, "InbandTextTrackPrivateAVF::processNativeSamples(%p) - ERROR: chunk '%s' size (%zu) larger than buffer length (%u)!!", this, type.utf8().data(), boxLength, buffer->byteLength());
+ continue;
+ }
+
+ LOG(Media, "InbandTextTrackPrivateAVF::processNativeSamples(%p) - chunk type = '%s', size = %zu", this, type.utf8().data(), boxLength);
+
+ if (type == ISOWebVTTCue::boxType()) {
+#if !PLATFORM(WIN)
+ ISOWebVTTCue cueData = ISOWebVTTCue(MediaTime::createWithDouble(presentationTime), toMediaTime(timingInfo.duration), buffer.get());
+#else
+ ISOWebVTTCue cueData = ISOWebVTTCue(MediaTime::createWithDouble(presentationTime), MediaTime::createWithDouble(CMTimeGetSeconds(timingInfo.duration)), buffer.get());
+#endif
+ LOG(Media, " sample presentation time = %.2f, duration = %.2f", cueData.presentationTime().toDouble(), cueData.duration().toDouble());
+ LOG(Media, " id = \"%s\", settings = \"%s\", cue text = \"%s\"", cueData.id().utf8().data(), cueData.settings().utf8().data(), cueData.cueText().utf8().data());
+ LOG(Media, " sourceID = \"%s\", originalStartTime = \"%s\"", cueData.sourceID().utf8().data(), cueData.originalStartTime().utf8().data());
+
+ client()->parseWebVTTCueData(this, cueData);
+ }
+
+ do {
+ if (m_haveReportedVTTHeader)
+ break;
+
+ CMFormatDescriptionRef formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer);
+ if (!formatDescription)
+ break;
+
+ CFDictionaryRef extensions = CMFormatDescriptionGetExtensions(formatDescription);
+ if (!extensions)
+ break;
+
+ CFDictionaryRef sampleDescriptionExtensions = static_cast<CFDictionaryRef>(CFDictionaryGetValue(extensions, kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms));
+ if (!sampleDescriptionExtensions)
+ break;
+
+ CFDataRef webvttHeaderData = static_cast<CFDataRef>(CFDictionaryGetValue(sampleDescriptionExtensions, CFSTR("vttC")));
+ if (!webvttHeaderData)
+ break;
+
+ unsigned length = CFDataGetLength(webvttHeaderData);
+ if (!length)
+ break;
+
+ // A WebVTT header is terminated by "One or more WebVTT line terminators" so append two line feeds to make sure the parser
+ // reccognized this string as a full header.
+ StringBuilder header;
+ header.append(reinterpret_cast<const unsigned char*>(CFDataGetBytePtr(webvttHeaderData)), length);
+ header.append("\n\n");
+
+ LOG(Media, " vtt header = \n%s", header.toString().utf8().data());
+ client()->parseWebVTTFileHeader(this, header.toString());
+ m_haveReportedVTTHeader = true;
+ } while (0);
+
+ m_sampleInputBuffer.remove(0, boxLength);
+ }
+#endif
+}
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx">
</span><span class="cx"> #endif // ENABLE(VIDEO) && (USE(AVFOUNDATION) || PLATFORM(IOS))
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationInbandTextTrackPrivateAVFh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/InbandTextTrackPrivateAVF.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/InbandTextTrackPrivateAVF.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/InbandTextTrackPrivateAVF.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -55,7 +55,7 @@
</span><span class="cx"> bool hasBeenReported() const { return m_hasBeenReported; }
</span><span class="cx"> void setHasBeenReported(bool reported) { m_hasBeenReported = reported; }
</span><span class="cx">
</span><del>- virtual void processCue(CFArrayRef, double);
</del><ins>+ virtual void processCue(CFArrayRef attributedStrings, CFArrayRef nativeSamples, double);
</ins><span class="cx"> virtual void resetCueValues();
</span><span class="cx">
</span><span class="cx"> void beginSeeking();
</span><span class="lines">@@ -68,13 +68,15 @@
</span><span class="cx"> InBand
</span><span class="cx"> };
</span><span class="cx"> virtual Category textTrackCategory() const = 0;
</span><del>-
</del><ins>+
</ins><span class="cx"> virtual double startTimeVariance() const override { return 0.25; }
</span><del>-
</del><ins>+
</ins><span class="cx"> protected:
</span><del>- InbandTextTrackPrivateAVF(AVFInbandTrackParent*);
</del><ins>+ InbandTextTrackPrivateAVF(AVFInbandTrackParent*, CueFormat);
</ins><span class="cx">
</span><span class="cx"> void processCueAttributes(CFAttributedStringRef, GenericCueData*);
</span><ins>+ void processAttributedStrings(CFArrayRef, double);
+ void processNativeSamples(CFArrayRef, double);
</ins><span class="cx"> void removeCompletedCues();
</span><span class="cx">
</span><span class="cx"> double m_currentCueStartTime;
</span><span class="lines">@@ -83,6 +85,8 @@
</span><span class="cx"> Vector<RefPtr<GenericCueData>> m_cues;
</span><span class="cx"> AVFInbandTrackParent* m_owner;
</span><span class="cx">
</span><ins>+ Vector<char> m_sampleInputBuffer;
+
</ins><span class="cx"> enum PendingCueStatus {
</span><span class="cx"> None,
</span><span class="cx"> DeliveredDuringSeek,
</span><span class="lines">@@ -93,6 +97,7 @@
</span><span class="cx"> int m_index;
</span><span class="cx"> bool m_hasBeenReported;
</span><span class="cx"> bool m_seeking;
</span><ins>+ bool m_haveReportedVTTHeader;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationcfInbandTextTrackPrivateAVCFcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.cpp (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.cpp        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.cpp        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -45,8 +45,8 @@
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-InbandTextTrackPrivateAVCF::InbandTextTrackPrivateAVCF(AVFInbandTrackParent* player, AVCFMediaSelectionOptionRef selection)
- : InbandTextTrackPrivateAVF(player)
</del><ins>+InbandTextTrackPrivateAVCF::InbandTextTrackPrivateAVCF(AVFInbandTrackParent* player, AVCFMediaSelectionOptionRef selection, InbandTextTrackPrivate::CueFormat format)
+ : InbandTextTrackPrivateAVF(player, format)
</ins><span class="cx"> , m_mediaSelectionOption(selection)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationcfInbandTextTrackPrivateAVCFh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -36,9 +36,9 @@
</span><span class="cx">
</span><span class="cx"> class InbandTextTrackPrivateAVCF : public InbandTextTrackPrivateAVF {
</span><span class="cx"> public:
</span><del>- static PassRefPtr<InbandTextTrackPrivateAVCF> create(AVFInbandTrackParent* player, AVCFMediaSelectionOptionRef selection)
</del><ins>+ static PassRefPtr<InbandTextTrackPrivateAVCF> create(AVFInbandTrackParent* player, AVCFMediaSelectionOptionRef selection, InbandTextTrackPrivate::CueFormat format)
</ins><span class="cx"> {
</span><del>- return adoptRef(new InbandTextTrackPrivateAVCF(player, selection));
</del><ins>+ return adoptRef(new InbandTextTrackPrivateAVCF(player, selection, format));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> ~InbandTextTrackPrivateAVCF() { }
</span><span class="lines">@@ -60,7 +60,7 @@
</span><span class="cx"> AVCFMediaSelectionOptionRef mediaSelectionOption() const { return m_mediaSelectionOption.get(); }
</span><span class="cx">
</span><span class="cx"> protected:
</span><del>- InbandTextTrackPrivateAVCF(AVFInbandTrackParent*, AVCFMediaSelectionOptionRef);
</del><ins>+ InbandTextTrackPrivateAVCF(AVFInbandTrackParent*, AVCFMediaSelectionOptionRef, InbandTextTrackPrivate::CueFormat);
</ins><span class="cx">
</span><span class="cx"> RetainPtr<AVCFMediaSelectionOptionRef> m_mediaSelectionOption;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationcfMediaPlayerPrivateAVFoundationCFcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -1093,7 +1093,7 @@
</span><span class="cx"> if (!newTrack)
</span><span class="cx"> continue;
</span><span class="cx">
</span><del>- m_textTracks.append(InbandTextTrackPrivateAVCF::create(this, option));
</del><ins>+ m_textTracks.append(InbandTextTrackPrivateAVCF::create(this, option, InbandTextTrackPrivate::Generic));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> processNewAndRemovedTextTracks(removedTextTracks);
</span><span class="lines">@@ -1594,11 +1594,12 @@
</span><span class="cx"> #if HAVE(AVFOUNDATION_MEDIA_SELECTION_GROUP) && HAVE(AVFOUNDATION_LEGIBLE_OUTPUT_SUPPORT)
</span><span class="cx"> struct LegibleOutputData {
</span><span class="cx"> RetainPtr<CFArrayRef> m_attributedStrings;
</span><ins>+ RetainPtr<CFArrayRef> m_samples;
</ins><span class="cx"> double m_time;
</span><span class="cx"> void* m_context;
</span><span class="cx">
</span><del>- LegibleOutputData(CFArrayRef strings, double time, void* context)
- : m_attributedStrings(strings), m_time(time), m_context(context)
</del><ins>+ LegibleOutputData(CFArrayRef strings, CFArrayRef samples, double time, void* context)
+ : m_attributedStrings(strings), m_samples(samples), m_time(time), m_context(context)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> };
</span><span class="lines">@@ -1623,10 +1624,10 @@
</span><span class="cx"> if (!self->m_currentTextTrack)
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- self->m_currentTextTrack->processCue(legibleOutputData->m_attributedStrings.get(), legibleOutputData->m_time);
</del><ins>+ self->m_currentTextTrack->processCue(legibleOutputData->m_attributedStrings.get(), legibleOutputData->m_samples.get(), legibleOutputData->m_time);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void AVFWrapper::legibleOutputCallback(void* context, AVCFPlayerItemLegibleOutputRef legibleOutput, CFArrayRef attributedStrings, CFArrayRef /*nativeSampleBuffers*/, CMTime itemTime)
</del><ins>+void AVFWrapper::legibleOutputCallback(void* context, AVCFPlayerItemLegibleOutputRef legibleOutput, CFArrayRef attributedStrings, CFArrayRef nativeSampleBuffers, CMTime itemTime)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(dispatch_get_main_queue() != dispatch_get_current_queue());
</span><span class="cx"> MutexLocker locker(mapLock());
</span><span class="lines">@@ -1640,7 +1641,7 @@
</span><span class="cx">
</span><span class="cx"> ASSERT(legibleOutput == self->m_legibleOutput);
</span><span class="cx">
</span><del>- OwnPtr<LegibleOutputData> legibleOutputData = adoptPtr(new LegibleOutputData(attributedStrings, CMTimeGetSeconds(itemTime), context));
</del><ins>+ OwnPtr<LegibleOutputData> legibleOutputData = adoptPtr(new LegibleOutputData(attributedStrings, nativeSampleBuffers, CMTimeGetSeconds(itemTime), context));
</ins><span class="cx">
</span><span class="cx"> dispatch_async_f(dispatch_get_main_queue(), legibleOutputData.leakPtr(), processCue);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcInbandTextTrackPrivateAVFObjCh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -31,15 +31,16 @@
</span><span class="cx"> #include "InbandTextTrackPrivateAVF.h"
</span><span class="cx"> #include <wtf/RetainPtr.h>
</span><span class="cx">
</span><ins>+OBJC_CLASS AVAsset;
</ins><span class="cx"> OBJC_CLASS AVMediaSelectionOption;
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="cx"> class InbandTextTrackPrivateAVFObjC : public InbandTextTrackPrivateAVF {
</span><span class="cx"> public:
</span><del>- static PassRefPtr<InbandTextTrackPrivateAVFObjC> create(AVFInbandTrackParent* player, AVMediaSelectionOption *selection)
</del><ins>+ static PassRefPtr<InbandTextTrackPrivateAVFObjC> create(AVFInbandTrackParent* player, AVMediaSelectionOption *selection, InbandTextTrackPrivate::CueFormat format)
</ins><span class="cx"> {
</span><del>- return adoptRef(new InbandTextTrackPrivateAVFObjC(player, selection));
</del><ins>+ return adoptRef(new InbandTextTrackPrivateAVFObjC(player, selection, format));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> ~InbandTextTrackPrivateAVFObjC() { }
</span><span class="lines">@@ -61,7 +62,7 @@
</span><span class="cx"> AVMediaSelectionOption *mediaSelectionOption() const { return m_mediaSelectionOption.get(); }
</span><span class="cx">
</span><span class="cx"> protected:
</span><del>- InbandTextTrackPrivateAVFObjC(AVFInbandTrackParent*, AVMediaSelectionOption *);
</del><ins>+ InbandTextTrackPrivateAVFObjC(AVFInbandTrackParent*, AVMediaSelectionOption *, InbandTextTrackPrivate::CueFormat);
</ins><span class="cx">
</span><span class="cx"> RetainPtr<AVMediaSelectionOption> m_mediaSelectionOption;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcInbandTextTrackPrivateAVFObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.mm (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.mm        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.mm        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -76,8 +76,8 @@
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-InbandTextTrackPrivateAVFObjC::InbandTextTrackPrivateAVFObjC(AVFInbandTrackParent* player, AVMediaSelectionOption *selection)
- : InbandTextTrackPrivateAVF(player)
</del><ins>+InbandTextTrackPrivateAVFObjC::InbandTextTrackPrivateAVFObjC(AVFInbandTrackParent* player, AVMediaSelectionOption *selection, InbandTextTrackPrivate::CueFormat format)
+ : InbandTextTrackPrivateAVF(player, format)
</ins><span class="cx"> , m_mediaSelectionOption(selection)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcInbandTextTrackPrivateLegacyAVFObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateLegacyAVFObjC.mm (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateLegacyAVFObjC.mm        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateLegacyAVFObjC.mm        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -56,7 +56,7 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="cx"> InbandTextTrackPrivateLegacyAVFObjC::InbandTextTrackPrivateLegacyAVFObjC(MediaPlayerPrivateAVFoundationObjC* player, AVPlayerItemTrack* track)
</span><del>- : InbandTextTrackPrivateAVF(player)
</del><ins>+ : InbandTextTrackPrivateAVF(player, InbandTextTrackPrivate::Generic)
</ins><span class="cx"> , m_playerItemTrack(track)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -76,7 +76,7 @@
</span><span class="cx">
</span><span class="cx"> #if HAVE(AVFOUNDATION_MEDIA_SELECTION_GROUP)
</span><span class="cx"> RetainPtr<AVPlayerItem> playerItem() const { return m_avPlayerItem; }
</span><del>- void processCue(NSArray *, double);
</del><ins>+ void processCue(NSArray *, NSArray *, double);
</ins><span class="cx"> void flushCues();
</span><span class="cx"> #endif
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -676,7 +676,7 @@
</span><span class="cx"> if (m_avAsset)
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- LOG(Media, "MediaPlayerPrivateAVFoundationObjC::createAVAssetForURL(%p)", this);
</del><ins>+ LOG(Media, "MediaPlayerPrivateAVFoundationObjC::createAVAssetForURL(%p) - url = %s", this, url.utf8().data());
</ins><span class="cx">
</span><span class="cx"> setDelayCallbacks(true);
</span><span class="cx">
</span><span class="lines">@@ -808,7 +808,8 @@
</span><span class="cx"> #if HAVE(AVFOUNDATION_MEDIA_SELECTION_GROUP) && HAVE(AVFOUNDATION_LEGIBLE_OUTPUT_SUPPORT)
</span><span class="cx"> const NSTimeInterval legibleOutputAdvanceInterval = 2;
</span><span class="cx">
</span><del>- m_legibleOutput = adoptNS([[AVPlayerItemLegibleOutput alloc] initWithMediaSubtypesForNativeRepresentation:[NSArray array]]);
</del><ins>+ RetainPtr<NSArray> subtypes = adoptNS([[NSArray alloc] initWithObjects:[NSNumber numberWithUnsignedInt:kCMSubtitleFormatType_WebVTT], nil]);
+ m_legibleOutput = adoptNS([[AVPlayerItemLegibleOutput alloc] initWithMediaSubtypesForNativeRepresentation:subtypes.get()]);
</ins><span class="cx"> [m_legibleOutput.get() setSuppressesPlayerRendering:YES];
</span><span class="cx">
</span><span class="cx"> [m_legibleOutput.get() setDelegate:m_objcObserver.get() queue:dispatch_get_main_queue()];
</span><span class="lines">@@ -1577,7 +1578,8 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #if HAVE(AVFOUNDATION_MEDIA_SELECTION_GROUP)
</span><del>- if (AVMediaSelectionGroupType *legibleGroup = safeMediaSelectionGroupForLegibleMedia()) {
</del><ins>+ AVMediaSelectionGroupType *legibleGroup = safeMediaSelectionGroupForLegibleMedia();
+ if (legibleGroup && m_cachedTracks) {
</ins><span class="cx"> hasCaptions = [[AVMediaSelectionGroup playableMediaSelectionOptionsFromArray:[legibleGroup options]] count];
</span><span class="cx"> if (hasCaptions)
</span><span class="cx"> processMediaSelectionOptions();
</span><span class="lines">@@ -2164,7 +2166,7 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx">
</span><del>- m_textTracks.append(InbandTextTrackPrivateAVFObjC::create(this, option));
</del><ins>+ m_textTracks.append(InbandTextTrackPrivateAVFObjC::create(this, option, InbandTextTrackPrivate::Generic));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> processNewAndRemovedTextTracks(removedTextTracks);
</span><span class="lines">@@ -2180,12 +2182,12 @@
</span><span class="cx"> player()->addTextTrack(m_metadataTrack);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void MediaPlayerPrivateAVFoundationObjC::processCue(NSArray *attributedStrings, double time)
</del><ins>+void MediaPlayerPrivateAVFoundationObjC::processCue(NSArray *attributedStrings, NSArray *nativeSamples, double time)
</ins><span class="cx"> {
</span><span class="cx"> if (!m_currentTextTrack)
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- m_currentTextTrack->processCue(reinterpret_cast<CFArrayRef>(attributedStrings), time);
</del><ins>+ m_currentTextTrack->processCue(reinterpret_cast<CFArrayRef>(attributedStrings), reinterpret_cast<CFArrayRef>(nativeSamples), time);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateAVFoundationObjC::flushCues()
</span><span class="lines">@@ -2734,11 +2736,12 @@
</span><span class="cx">
</span><span class="cx"> RetainPtr<WebCoreAVFMovieObserver> strongSelf = self;
</span><span class="cx"> RetainPtr<NSArray> strongStrings = strings;
</span><del>- callOnMainThread([strongSelf, strongStrings, itemTime] {
</del><ins>+ RetainPtr<NSArray> strongSamples = nativeSamples;
+ callOnMainThread([strongSelf, strongStrings, strongSamples, itemTime] {
</ins><span class="cx"> MediaPlayerPrivateAVFoundationObjC* callback = strongSelf->m_callback;
</span><span class="cx"> if (!callback)
</span><span class="cx"> return;
</span><del>- callback->processCue(strongStrings.get(), CMTimeGetSeconds(itemTime));
</del><ins>+ callback->processCue(strongStrings.get(), strongSamples.get(), CMTimeGetSeconds(itemTime));
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcOutOfBandTextTrackPrivateAVFh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/OutOfBandTextTrackPrivateAVF.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/OutOfBandTextTrackPrivateAVF.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/OutOfBandTextTrackPrivateAVF.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -41,7 +41,7 @@
</span><span class="cx"> return adoptRef(new OutOfBandTextTrackPrivateAVF(player, selection));
</span><span class="cx"> }
</span><span class="cx">
</span><del>- virtual void processCue(CFArrayRef, double) override { }
</del><ins>+ virtual void processCue(CFArrayRef, CFArrayRef, double) override { }
</ins><span class="cx"> virtual void resetCueValues() override { }
</span><span class="cx">
</span><span class="cx"> virtual Category textTrackCategory() const override { return OutOfBand; }
</span><span class="lines">@@ -50,7 +50,7 @@
</span><span class="cx">
</span><span class="cx"> protected:
</span><span class="cx"> OutOfBandTextTrackPrivateAVF(AVFInbandTrackParent* player, AVMediaSelectionOption* selection)
</span><del>- : InbandTextTrackPrivateAVF(player)
</del><ins>+ : InbandTextTrackPrivateAVF(player, InbandTextTrackPrivate::Generic)
</ins><span class="cx"> , m_mediaSelectionOption(selection)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre>
</div>
</div>
</body>
</html>