<!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>[174346] 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/174346">174346</a></dd>
<dt>Author</dt> <dd>bfulgham@apple.com</dd>
<dt>Date</dt> <dd>2014-10-06 10:49:24 -0700 (Mon, 06 Oct 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Win] Extend AVFoundationCF Media Implementation
https://bugs.webkit.org/show_bug.cgi?id=137409

Reviewed by Eric Carlson.

This code is not yet being built and tested by our system. Appropriate
tests will be activated when we enable the build.

Most of this patch involves correcting some misuse of the AVFoundationCF API.
1. It is never appropriate in AVCF to pass a null CFErrorRef; instead you must
   pass a CFErrorRef with error type kCFURLErrorUnknown.
2. Because of the asynchronous way we handle the request/response, it is possible
   for AVCF to make two AVCF requests while negotiating the key exchange.

* platform/graphics/avfoundation/cf/AVFoundationCFSoftLinking.h: Add
missing declaration.
* platform/graphics/avfoundation/cf/CDMSessionAVFoundationCF.cpp:
(WebCore::CDMSessionAVFoundationCF::generateKeyRequest): Tighten up scope
of 'underlyingError'.
(WebCore::CDMSessionAVFoundationCF::update): Add call to complete the
loading process.
* platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.cpp:
(WebCore::InbandTextTrackPrivateAVCF::label): Handle null titles CFArray
found during testing.
(WebCore::InbandTextTrackPrivateAVCF::language): Ditto for a null locale.
* platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp:
(WebCore::MediaPlayerPrivateAVFoundationCF::registerMediaEngine): Add support
for the new 'supportsKeySystem' method.
(WebCore::MediaPlayerPrivateAVFoundationCF::createContextVideoRenderer): Add
assertion for mainThread.
(WebCore::MediaPlayerPrivateAVFoundationCF::destroyContextVideoRenderer): Ditto.
(WebCore::MediaPlayerPrivateAVFoundationCF::createVideoLayer): Ditto.
(WebCore::MediaPlayerPrivateAVFoundationCF::destroyVideoLayer): Ditto.
(WebCore::MediaPlayerPrivateAVFoundationCF::createAVPlayer): Ditto.
(WebCore::MediaPlayerPrivateAVFoundationCF::createAVPlayerItem): Ditto.
(WebCore::MediaPlayerPrivateAVFoundationCF::platformLayer): Ditto.
(WebCore::MediaPlayerPrivateAVFoundationCF::platformSetVisible): Ditto.
(WebCore::MediaPlayerPrivateAVFoundationCF::paintCurrentFrameInContext): Ditto.
(WebCore::MediaPlayerPrivateAVFoundationCF::paint): Ditto.
(WebCore::MediaPlayerPrivateAVFoundationCF::supportsKeySystem): Added.
(WebCore::MediaPlayerPrivateAVFoundationCF::sizeChanged): Add assertion that this
is being called on the main thread.
(WebCore::MediaPlayerPrivateAVFoundationCF::processMediaSelectionOptions): Handle
the allows empty media selection properly based on test behavior.
(WebCore::AVFWrapper::AVFWrapper): Initialize resource loader callback structure
when building with AVFOUNDATION_LOADER_DELEGATE.
(WebCore::AVFWrapper::createAssetForURL): Use AVFWrapper's loader callback struct,
rather than passing the address of a temporary value.
(WebCore::AVFWrapper::processNotification): Stop using the deprecated 
'dispatch_get_current_queue' function.
(WebCore::AVFWrapper::processCue): Ditto.
(WebCore::AVFWrapper::legibleOutputCallback): Ditto.
(WebCore::AVFWrapper::processShouldWaitForLoadingOfResource): Pass a valid CFError
object; nullptr is not allowed as an argument to the &quot;...FinishedLoadingWithError&quot;
method.
(WebCore::AVFWrapper::shouldWaitForLoadingOfResource): Add support for multiple
in-flight requests.
(WebCore::AVFWrapper::platformLayer): Assert we are on the main thread.
(WebCore::AVFWrapper::setRequestForKey): Add support for multiple in-flight requests.
(WebCore::AVFWrapper::takeRequestForKeyURI): Ditto.
(WebCore::LayerClient::platformCALayerLayoutSublayersOfLayer): Ditto.
* platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.h:
* platform/graphics/avfoundation/cf/WebCoreAVCFResourceLoader.cpp: Make sure we pass
valid CFError objects, rather than nullptr.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationcfAVFoundationCFSoftLinkingh">trunk/Source/WebCore/platform/graphics/avfoundation/cf/AVFoundationCFSoftLinking.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationcfCDMSessionAVFoundationCFcpp">trunk/Source/WebCore/platform/graphics/avfoundation/cf/CDMSessionAVFoundationCF.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationcfInbandTextTrackPrivateAVCFcpp">trunk/Source/WebCore/platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationcfMediaPlayerPrivateAVFoundationCFcpp">trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationcfMediaPlayerPrivateAVFoundationCFh">trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationcfWebCoreAVCFResourceLoadercpp">trunk/Source/WebCore/platform/graphics/avfoundation/cf/WebCoreAVCFResourceLoader.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (174345 => 174346)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-10-06 16:39:54 UTC (rev 174345)
+++ trunk/Source/WebCore/ChangeLog        2014-10-06 17:49:24 UTC (rev 174346)
</span><span class="lines">@@ -1,3 +1,70 @@
</span><ins>+2014-10-06  Brent Fulgham  &lt;bfulgham@apple.com&gt;
+
+        [Win] Extend AVFoundationCF Media Implementation
+        https://bugs.webkit.org/show_bug.cgi?id=137409
+
+        Reviewed by Eric Carlson.
+
+        This code is not yet being built and tested by our system. Appropriate
+        tests will be activated when we enable the build.
+
+        Most of this patch involves correcting some misuse of the AVFoundationCF API.
+        1. It is never appropriate in AVCF to pass a null CFErrorRef; instead you must
+           pass a CFErrorRef with error type kCFURLErrorUnknown.
+        2. Because of the asynchronous way we handle the request/response, it is possible
+           for AVCF to make two AVCF requests while negotiating the key exchange.
+
+        * platform/graphics/avfoundation/cf/AVFoundationCFSoftLinking.h: Add
+        missing declaration.
+        * platform/graphics/avfoundation/cf/CDMSessionAVFoundationCF.cpp:
+        (WebCore::CDMSessionAVFoundationCF::generateKeyRequest): Tighten up scope
+        of 'underlyingError'.
+        (WebCore::CDMSessionAVFoundationCF::update): Add call to complete the
+        loading process.
+        * platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.cpp:
+        (WebCore::InbandTextTrackPrivateAVCF::label): Handle null titles CFArray
+        found during testing.
+        (WebCore::InbandTextTrackPrivateAVCF::language): Ditto for a null locale.
+        * platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp:
+        (WebCore::MediaPlayerPrivateAVFoundationCF::registerMediaEngine): Add support
+        for the new 'supportsKeySystem' method.
+        (WebCore::MediaPlayerPrivateAVFoundationCF::createContextVideoRenderer): Add
+        assertion for mainThread.
+        (WebCore::MediaPlayerPrivateAVFoundationCF::destroyContextVideoRenderer): Ditto.
+        (WebCore::MediaPlayerPrivateAVFoundationCF::createVideoLayer): Ditto.
+        (WebCore::MediaPlayerPrivateAVFoundationCF::destroyVideoLayer): Ditto.
+        (WebCore::MediaPlayerPrivateAVFoundationCF::createAVPlayer): Ditto.
+        (WebCore::MediaPlayerPrivateAVFoundationCF::createAVPlayerItem): Ditto.
+        (WebCore::MediaPlayerPrivateAVFoundationCF::platformLayer): Ditto.
+        (WebCore::MediaPlayerPrivateAVFoundationCF::platformSetVisible): Ditto.
+        (WebCore::MediaPlayerPrivateAVFoundationCF::paintCurrentFrameInContext): Ditto.
+        (WebCore::MediaPlayerPrivateAVFoundationCF::paint): Ditto.
+        (WebCore::MediaPlayerPrivateAVFoundationCF::supportsKeySystem): Added.
+        (WebCore::MediaPlayerPrivateAVFoundationCF::sizeChanged): Add assertion that this
+        is being called on the main thread.
+        (WebCore::MediaPlayerPrivateAVFoundationCF::processMediaSelectionOptions): Handle
+        the allows empty media selection properly based on test behavior.
+        (WebCore::AVFWrapper::AVFWrapper): Initialize resource loader callback structure
+        when building with AVFOUNDATION_LOADER_DELEGATE.
+        (WebCore::AVFWrapper::createAssetForURL): Use AVFWrapper's loader callback struct,
+        rather than passing the address of a temporary value.
+        (WebCore::AVFWrapper::processNotification): Stop using the deprecated 
+        'dispatch_get_current_queue' function.
+        (WebCore::AVFWrapper::processCue): Ditto.
+        (WebCore::AVFWrapper::legibleOutputCallback): Ditto.
+        (WebCore::AVFWrapper::processShouldWaitForLoadingOfResource): Pass a valid CFError
+        object; nullptr is not allowed as an argument to the &quot;...FinishedLoadingWithError&quot;
+        method.
+        (WebCore::AVFWrapper::shouldWaitForLoadingOfResource): Add support for multiple
+        in-flight requests.
+        (WebCore::AVFWrapper::platformLayer): Assert we are on the main thread.
+        (WebCore::AVFWrapper::setRequestForKey): Add support for multiple in-flight requests.
+        (WebCore::AVFWrapper::takeRequestForKeyURI): Ditto.
+        (WebCore::LayerClient::platformCALayerLayoutSublayersOfLayer): Ditto.
+        * platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.h:
+        * platform/graphics/avfoundation/cf/WebCoreAVCFResourceLoader.cpp: Make sure we pass
+        valid CFError objects, rather than nullptr.
+
</ins><span class="cx"> 2014-10-06  Chris Fleizach  &lt;cfleizach@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         AX: Performance: Certain Web site causes Safari to hang completely while entering form data
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationcfAVFoundationCFSoftLinkingh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/cf/AVFoundationCFSoftLinking.h (174345 => 174346)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/cf/AVFoundationCFSoftLinking.h        2014-10-06 16:39:54 UTC (rev 174345)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/cf/AVFoundationCFSoftLinking.h        2014-10-06 17:49:24 UTC (rev 174346)
</span><span class="lines">@@ -302,6 +302,9 @@
</span><span class="cx"> SOFT_LINK_DLL_IMPORT(AVFoundationCF, AVCFAssetResourceLoadingRequestGetURLRequest, CFURLRequestRef, __cdecl, (AVCFAssetResourceLoadingRequestRef loadingRequest), (loadingRequest))
</span><span class="cx"> #define AVCFAssetResourceLoadingRequestGetURLRequest  softLink_AVCFAssetResourceLoadingRequestGetURLRequest 
</span><span class="cx"> 
</span><ins>+SOFT_LINK_DLL_IMPORT(AVFoundationCF, AVCFAssetResourceLoadingRequestFinishLoadingWithResponse, void, __cdecl, (AVCFAssetResourceLoadingRequestRef loadingRequest, CFURLResponseRef response, CFDataRef data, CFURLRequestRef redirect), (loadingRequest, response, data, redirect))
+#define AVCFAssetResourceLoadingRequestFinishLoadingWithResponse  softLink_AVCFAssetResourceLoadingRequestFinishLoadingWithResponse 
+
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> // Variables
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationcfCDMSessionAVFoundationCFcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/cf/CDMSessionAVFoundationCF.cpp (174345 => 174346)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/cf/CDMSessionAVFoundationCF.cpp        2014-10-06 16:39:54 UTC (rev 174345)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/cf/CDMSessionAVFoundationCF.cpp        2014-10-06 17:49:24 UTC (rev 174346)
</span><span class="lines">@@ -85,8 +85,7 @@
</span><span class="cx">             userInfo = adoptCF(CFErrorCopyUserInfo(cfError));
</span><span class="cx"> 
</span><span class="cx">             if (userInfo) {
</span><del>-                CFErrorRef underlyingError = (CFErrorRef)CFDictionaryGetValue(userInfo.get(), kCFErrorUnderlyingErrorKey);
-                if (underlyingError)
</del><ins>+                if (CFErrorRef underlyingError = (CFErrorRef)CFDictionaryGetValue(userInfo.get(), kCFErrorUnderlyingErrorKey))
</ins><span class="cx">                     systemCode = CFErrorGetCode(underlyingError);
</span><span class="cx">             }
</span><span class="cx"> 
</span><span class="lines">@@ -113,9 +112,7 @@
</span><span class="cx">     RetainPtr&lt;CFMutableDataRef&gt; keyData = adoptCF(CFDataCreateMutable(kCFAllocatorDefault, key-&gt;byteLength()));
</span><span class="cx">     CFDataAppendBytes(keyData.get(), reinterpret_cast&lt;const UInt8*&gt;(key-&gt;baseAddress()), key-&gt;byteLength());
</span><span class="cx"> 
</span><del>-    // TODO: AVCFAssetResourceLoadingDataRequestRespondWithData(m_request.get(), keyData.get());
-    // TODO: AVCFAssetResourceLoadingRequestFinishedLoading(m_request.get());
-    notImplemented();
</del><ins>+    AVCFAssetResourceLoadingRequestFinishLoadingWithResponse(m_request.get(), nullptr, keyData.get(), nullptr);
</ins><span class="cx"> 
</span><span class="cx">     errorCode = MediaPlayer::NoError;
</span><span class="cx">     systemCode = 0;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationcfInbandTextTrackPrivateAVCFcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.cpp (174345 => 174346)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.cpp        2014-10-06 16:39:54 UTC (rev 174345)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.cpp        2014-10-06 17:49:24 UTC (rev 174346)
</span><span class="lines">@@ -143,6 +143,9 @@
</span><span class="cx"> 
</span><span class="cx">     RetainPtr&lt;CFArrayRef&gt; commonMetaData = adoptCF(AVCFMediaSelectionOptionCopyCommonMetadata(mediaSelectionOption()));
</span><span class="cx">     RetainPtr&lt;CFArrayRef&gt; titles = adoptCF(AVCFMetadataItemCopyItemsWithKeyAndKeySpace(commonMetaData.get(), AVCFMetadataCommonKeyTitle, AVCFMetadataKeySpaceCommon));
</span><ins>+    if (!titles)
+        return emptyAtom;
+
</ins><span class="cx">     CFIndex titlesCount = CFArrayGetCount(titles.get());
</span><span class="cx">     if (!titlesCount)
</span><span class="cx">         return emptyAtom;
</span><span class="lines">@@ -170,6 +173,9 @@
</span><span class="cx">         return emptyAtom;
</span><span class="cx"> 
</span><span class="cx">     RetainPtr&lt;CFLocaleRef&gt; locale = adoptCF(AVCFMediaSelectionOptionCopyLocale(mediaSelectionOption()));
</span><ins>+    if (!locale)
+        return emptyAtom;
+
</ins><span class="cx">     return CFLocaleGetIdentifier(locale.get());
</span><span class="cx"> }
</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 (174345 => 174346)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp        2014-10-06 16:39:54 UTC (rev 174345)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp        2014-10-06 17:49:24 UTC (rev 174346)
</span><span class="lines">@@ -153,6 +153,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(ENCRYPTED_MEDIA_V2)
</span><span class="cx">     RetainPtr&lt;AVCFAssetResourceLoadingRequestRef&gt; takeRequestForKeyURI(const String&amp;);
</span><ins>+    void setRequestForKey(const String&amp; keyURI, AVCFAssetResourceLoadingRequestRef avRequest);
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="lines">@@ -197,7 +198,8 @@
</span><span class="cx">     InbandTextTrackPrivateAVF* m_currentTextTrack;
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(ENCRYPTED_MEDIA_V2)
</span><del>-    HashMap&lt;String, RetainPtr&lt;AVCFAssetResourceLoadingRequestRef&gt;&gt; m_keyURIToRequestMap;
</del><ins>+    HashMap&lt;String, Vector&lt;RetainPtr&lt;AVCFAssetResourceLoadingRequestRef&gt;&gt;&gt; m_keyURIToRequestMap;
+    AVCFAssetResourceLoaderCallbacks m_resourceLoaderCallbacks;
</ins><span class="cx"> #endif
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="lines">@@ -342,7 +344,7 @@
</span><span class="cx"> void MediaPlayerPrivateAVFoundationCF::registerMediaEngine(MediaEngineRegistrar registrar)
</span><span class="cx"> {
</span><span class="cx">     if (isAvailable())
</span><del>-        registrar(create, getSupportedTypes, supportsType, 0, 0, 0, 0);
</del><ins>+        registrar(create, getSupportedTypes, supportsType, 0, 0, 0, supportsKeySystem);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> MediaPlayerPrivateAVFoundationCF::MediaPlayerPrivateAVFoundationCF(MediaPlayer* player)
</span><span class="lines">@@ -407,6 +409,7 @@
</span><span class="cx"> void MediaPlayerPrivateAVFoundationCF::createContextVideoRenderer()
</span><span class="cx"> {
</span><span class="cx">     LOG(Media, &quot;MediaPlayerPrivateAVFoundationCF::createContextVideoRenderer(%p)&quot;, this);
</span><ins>+    ASSERT(isMainThread());
</ins><span class="cx"> 
</span><span class="cx">     if (imageGenerator(m_avfWrapper))
</span><span class="cx">         return;
</span><span class="lines">@@ -417,12 +420,14 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateAVFoundationCF::destroyContextVideoRenderer()
</span><span class="cx"> {
</span><ins>+    ASSERT(isMainThread());
</ins><span class="cx">     if (m_avfWrapper)
</span><span class="cx">         m_avfWrapper-&gt;destroyImageGenerator();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateAVFoundationCF::createVideoLayer()
</span><span class="cx"> {
</span><ins>+    ASSERT(isMainThread());
</ins><span class="cx">     ASSERT(supportsAcceleratedRendering());
</span><span class="cx"> 
</span><span class="cx">     if (m_avfWrapper)
</span><span class="lines">@@ -431,6 +436,7 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateAVFoundationCF::destroyVideoLayer()
</span><span class="cx"> {
</span><ins>+    ASSERT(isMainThread());
</ins><span class="cx">     LOG(Media, &quot;MediaPlayerPrivateAVFoundationCF::destroyVideoLayer(%p) - destroying %p&quot;, this, videoLayer(m_avfWrapper));
</span><span class="cx">     if (m_avfWrapper)
</span><span class="cx">         m_avfWrapper-&gt;destroyVideoLayer();
</span><span class="lines">@@ -470,6 +476,7 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateAVFoundationCF::createAVPlayer()
</span><span class="cx"> {
</span><ins>+    ASSERT(isMainThread());
</ins><span class="cx">     ASSERT(m_avfWrapper);
</span><span class="cx">     
</span><span class="cx">     setDelayCallbacks(true);
</span><span class="lines">@@ -479,6 +486,7 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateAVFoundationCF::createAVPlayerItem()
</span><span class="cx"> {
</span><ins>+    ASSERT(isMainThread());
</ins><span class="cx">     ASSERT(m_avfWrapper);
</span><span class="cx">     
</span><span class="cx">     setDelayCallbacks(true);
</span><span class="lines">@@ -529,6 +537,7 @@
</span><span class="cx"> 
</span><span class="cx"> PlatformLayer* MediaPlayerPrivateAVFoundationCF::platformLayer() const
</span><span class="cx"> {
</span><ins>+    ASSERT(isMainThread());
</ins><span class="cx">     if (!m_avfWrapper)
</span><span class="cx">         return 0;
</span><span class="cx"> 
</span><span class="lines">@@ -537,6 +546,7 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateAVFoundationCF::platformSetVisible(bool isVisible)
</span><span class="cx"> {
</span><ins>+    ASSERT(isMainThread());
</ins><span class="cx">     if (!m_avfWrapper)
</span><span class="cx">         return;
</span><span class="cx">     
</span><span class="lines">@@ -829,6 +839,7 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateAVFoundationCF::paintCurrentFrameInContext(GraphicsContext* context, const IntRect&amp; rect)
</span><span class="cx"> {
</span><ins>+    ASSERT(isMainThread());
</ins><span class="cx">     if (!metaDataAvailable() || context-&gt;paintingDisabled())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="lines">@@ -843,6 +854,7 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateAVFoundationCF::paint(GraphicsContext* context, const IntRect&amp; rect)
</span><span class="cx"> {
</span><ins>+    ASSERT(isMainThread());
</ins><span class="cx">     if (!metaDataAvailable() || context-&gt;paintingDisabled() || !imageGenerator(m_avfWrapper))
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="lines">@@ -911,7 +923,26 @@
</span><span class="cx">     return MediaPlayer::IsNotSupported;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool MediaPlayerPrivateAVFoundationCF::supportsKeySystem(const String&amp; keySystem, const String&amp; mimeType)
+{
+#if ENABLE(ENCRYPTED_MEDIA) || ENABLE(ENCRYPTED_MEDIA_V2)
+    if (keySystem.isEmpty())
+        return false;
</ins><span class="cx"> 
</span><ins>+    if (!keySystemIsSupported(keySystem))
+        return false;
+
+    if (!mimeType.isEmpty() &amp;&amp; !mimeTypeCache().contains(mimeType))
+        return false;
+
+    return true;
+#else
+    UNUSED_PARAM(keySystem);
+    UNUSED_PARAM(mimeType);
+    return false;
+#endif
+}
+
</ins><span class="cx"> bool MediaPlayerPrivateAVFoundationCF::isAvailable()
</span><span class="cx"> {
</span><span class="cx">     return AVFoundationCFLibrary() &amp;&amp; CoreMediaLibrary();
</span><span class="lines">@@ -1037,6 +1068,7 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateAVFoundationCF::sizeChanged()
</span><span class="cx"> {
</span><ins>+    ASSERT(isMainThread());
</ins><span class="cx">     if (!avAsset(m_avfWrapper))
</span><span class="cx">         return;
</span><span class="cx">     
</span><span class="lines">@@ -1157,11 +1189,8 @@
</span><span class="cx"> 
</span><span class="cx">     // We enabled automatic media selection because we want alternate audio tracks to be enabled/disabled automatically,
</span><span class="cx">     // but set the selected legible track to nil so text tracks will not be automatically configured.
</span><del>-    if (!m_textTracks.size()) {
-        ASSERT(AVCFMediaSelectionGroupAllowsEmptySelection(legibleGroup));
-        AVCFPlayerItemRef playerItem = avPlayerItem(m_avfWrapper);
-
-        if (playerItem)
</del><ins>+    if (!m_textTracks.size() &amp;&amp; AVCFMediaSelectionGroupAllowsEmptySelection(legibleGroup)) {
+        if (AVCFPlayerItemRef playerItem = avPlayerItem(m_avfWrapper))
</ins><span class="cx">             AVCFPlayerItemSelectMediaOptionInMediaSelectionGroup(playerItem, 0, legibleGroup);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1285,6 +1314,13 @@
</span><span class="cx">     LOG(Media, &quot;AVFWrapper::AVFWrapper(%p)&quot;, this);
</span><span class="cx"> 
</span><span class="cx">     m_notificationQueue = dispatch_queue_create(&quot;MediaPlayerPrivateAVFoundationCF.notificationQueue&quot;, 0);
</span><ins>+
+#if HAVE(AVFOUNDATION_LOADER_DELEGATE)
+    m_resourceLoaderCallbacks.version = kAVCFAssetResourceLoader_CallbacksVersion_1;
+    m_resourceLoaderCallbacks.context = nullptr;
+    m_resourceLoaderCallbacks.resourceLoaderShouldWaitForLoadingOfRequestedResource = AVFWrapper::resourceLoaderShouldWaitForLoadingOfRequestedResource;
+#endif
+
</ins><span class="cx">     addToMap();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1431,14 +1467,11 @@
</span><span class="cx">     m_avAsset = adoptCF(AVCFURLAssetCreateWithURLAndOptions(kCFAllocatorDefault, urlRef.get(), optionsRef.get(), m_notificationQueue));
</span><span class="cx"> 
</span><span class="cx"> #if HAVE(AVFOUNDATION_LOADER_DELEGATE)
</span><del>-    AVCFAssetResourceLoaderCallbacks loaderCallbacks;
-    loaderCallbacks.version = kAVCFAssetResourceLoader_CallbacksVersion_1;
</del><span class="cx">     ASSERT(callbackContext());
</span><del>-    loaderCallbacks.context = callbackContext();
-    loaderCallbacks.resourceLoaderShouldWaitForLoadingOfRequestedResource = AVFWrapper::resourceLoaderShouldWaitForLoadingOfRequestedResource;
</del><ins>+    m_resourceLoaderCallbacks.context = callbackContext();
</ins><span class="cx"> 
</span><span class="cx">     AVCFAssetResourceLoaderRef resourceLoader = AVCFURLAssetGetResourceLoader(m_avAsset.get());
</span><del>-    AVCFAssetResourceLoaderSetCallbacks(resourceLoader, &amp;loaderCallbacks, globalLoaderDelegateQueue());
</del><ins>+    AVCFAssetResourceLoaderSetCallbacks(resourceLoader, &amp;m_resourceLoaderCallbacks, globalLoaderDelegateQueue());
</ins><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1572,7 +1605,7 @@
</span><span class="cx"> 
</span><span class="cx"> void AVFWrapper::processNotification(void* context)
</span><span class="cx"> {
</span><del>-    ASSERT(dispatch_get_main_queue() == dispatch_get_current_queue());
</del><ins>+    ASSERT(isMainThread());
</ins><span class="cx">     ASSERT(context);
</span><span class="cx"> 
</span><span class="cx">     if (!context)
</span><span class="lines">@@ -1718,7 +1751,7 @@
</span><span class="cx"> 
</span><span class="cx"> void AVFWrapper::processCue(void* context)
</span><span class="cx"> {
</span><del>-    ASSERT(dispatch_get_main_queue() == dispatch_get_current_queue());
</del><ins>+    ASSERT(isMainThread());
</ins><span class="cx">     ASSERT(context);
</span><span class="cx"> 
</span><span class="cx">     if (!context)
</span><span class="lines">@@ -1741,7 +1774,7 @@
</span><span class="cx"> 
</span><span class="cx"> void AVFWrapper::legibleOutputCallback(void* context, AVCFPlayerItemLegibleOutputRef legibleOutput, CFArrayRef attributedStrings, CFArrayRef nativeSampleBuffers, CMTime itemTime)
</span><span class="cx"> {
</span><del>-    ASSERT(dispatch_get_main_queue() != dispatch_get_current_queue());
</del><ins>+    ASSERT(!isMainThread());
</ins><span class="cx">     MutexLocker locker(mapLock());
</span><span class="cx">     AVFWrapper* self = avfWrapperForCallbackContext(context);
</span><span class="cx">     if (!self) {
</span><span class="lines">@@ -1784,12 +1817,15 @@
</span><span class="cx">     AVFWrapper* self = avfWrapperForCallbackContext(loadRequestData-&gt;m_context);
</span><span class="cx">     if (!self) {
</span><span class="cx">         LOG(Media, &quot;AVFWrapper::processShouldWaitForLoadingOfResource invoked for deleted AVFWrapper %d&quot;, reinterpret_cast&lt;uintptr_t&gt;(context));
</span><del>-        AVCFAssetResourceLoadingRequestFinishLoadingWithError(loadRequestData-&gt;m_request.get(), nullptr);
</del><ins>+        RetainPtr&lt;CFErrorRef&gt; error = adoptCF(CFErrorCreate(kCFAllocatorDefault, kCFErrorDomainCFNetwork, kCFURLErrorUnknown, nullptr));
+        AVCFAssetResourceLoadingRequestFinishLoadingWithError(loadRequestData-&gt;m_request.get(), error.get());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!self-&gt;shouldWaitForLoadingOfResource(loadRequestData-&gt;m_request.get()))
-        AVCFAssetResourceLoadingRequestFinishLoadingWithError(loadRequestData-&gt;m_request.get(), nullptr);
</del><ins>+    if (!self-&gt;shouldWaitForLoadingOfResource(loadRequestData-&gt;m_request.get())) {
+        RetainPtr&lt;CFErrorRef&gt; error = adoptCF(CFErrorCreate(kCFAllocatorDefault, kCFErrorDomainCFNetwork, kCFURLErrorUnknown, nullptr));
+        AVCFAssetResourceLoadingRequestFinishLoadingWithError(loadRequestData-&gt;m_request.get(), error.get());
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool AVFWrapper::shouldWaitForLoadingOfResource(AVCFAssetResourceLoadingRequestRef avRequest)
</span><span class="lines">@@ -1819,7 +1855,7 @@
</span><span class="cx">         if (!m_owner-&gt;player()-&gt;keyNeeded(initData.get()))
</span><span class="cx">             return false;
</span><span class="cx"> 
</span><del>-        m_keyURIToRequestMap.set(keyURI, avRequest);
</del><ins>+        setRequestForKey(keyURI, avRequest);
</ins><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="lines">@@ -1861,6 +1897,7 @@
</span><span class="cx"> 
</span><span class="cx"> PlatformLayer* AVFWrapper::platformLayer()
</span><span class="cx"> {
</span><ins>+    ASSERT(isMainThread());
</ins><span class="cx">     if (m_videoLayerWrapper)
</span><span class="cx">         return m_videoLayerWrapper-&gt;platformLayer();
</span><span class="cx"> 
</span><span class="lines">@@ -1991,14 +2028,36 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(ENCRYPTED_MEDIA_V2)
</span><ins>+void AVFWrapper::setRequestForKey(const String&amp; keyURI, AVCFAssetResourceLoadingRequestRef avRequest)
+{
+    auto requestsIterator = m_keyURIToRequestMap.find(keyURI);
+    if (requestsIterator != m_keyURIToRequestMap.end()) {
+        requestsIterator-&gt;value.append(avRequest);
+        return;
+    }
+
+    Vector&lt;RetainPtr&lt;AVCFAssetResourceLoadingRequestRef&gt;&gt; requests;
+    requests.append(avRequest);
+    m_keyURIToRequestMap.set(keyURI, requests);
+}
+
</ins><span class="cx"> RetainPtr&lt;AVCFAssetResourceLoadingRequestRef&gt; AVFWrapper::takeRequestForKeyURI(const String&amp; keyURI)
</span><span class="cx"> {
</span><del>-    return m_keyURIToRequestMap.take(keyURI);
</del><ins>+    auto requestsIterator = m_keyURIToRequestMap.find(keyURI);
+    if (requestsIterator == m_keyURIToRequestMap.end())
+        return RetainPtr&lt;AVCFAssetResourceLoadingRequestRef&gt;();
+
+    auto request = requestsIterator-&gt;value.takeLast();
+    if (requestsIterator-&gt;value.isEmpty())
+        m_keyURIToRequestMap.take(keyURI);
+
+    return request;
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> void LayerClient::platformCALayerLayoutSublayersOfLayer(PlatformCALayer* wrapperLayer)
</span><span class="cx"> {
</span><ins>+    ASSERT(isMainThread());
</ins><span class="cx">     ASSERT(m_parent);
</span><span class="cx">     ASSERT(m_parent-&gt;videoLayerWrapper() == wrapperLayer-&gt;platformLayer());
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationcfMediaPlayerPrivateAVFoundationCFh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.h (174345 => 174346)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.h        2014-10-06 16:39:54 UTC (rev 174345)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.h        2014-10-06 17:49:24 UTC (rev 174346)
</span><span class="lines">@@ -64,6 +64,7 @@
</span><span class="cx">     static PassOwnPtr&lt;MediaPlayerPrivateInterface&gt; create(MediaPlayer*);
</span><span class="cx">     static void getSupportedTypes(HashSet&lt;String&gt;&amp; types);
</span><span class="cx">     static MediaPlayer::SupportsType supportsType(const MediaEngineSupportParameters&amp;);
</span><ins>+    static bool supportsKeySystem(const String&amp; keySystem, const String&amp; mimeType);
</ins><span class="cx">     static bool isAvailable();
</span><span class="cx"> 
</span><span class="cx">     virtual void cancelLoad();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationcfWebCoreAVCFResourceLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/cf/WebCoreAVCFResourceLoader.cpp (174345 => 174346)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/cf/WebCoreAVCFResourceLoader.cpp        2014-10-06 16:39:54 UTC (rev 174345)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/cf/WebCoreAVCFResourceLoader.cpp        2014-10-06 17:49:24 UTC (rev 174346)
</span><span class="lines">@@ -81,7 +81,8 @@
</span><span class="cx">         m_resource-&gt;addClient(this);
</span><span class="cx">     else {
</span><span class="cx">         LOG_ERROR(&quot;Failed to start load for media at url %s&quot;, requestURL.string().ascii().data());
</span><del>-        AVCFAssetResourceLoadingRequestFinishLoadingWithError(m_avRequest.get(), nullptr);
</del><ins>+        RetainPtr&lt;CFErrorRef&gt; error = adoptCF(CFErrorCreate(kCFAllocatorDefault, kCFErrorDomainCFNetwork, kCFURLErrorUnknown, nullptr));
+        AVCFAssetResourceLoadingRequestFinishLoadingWithError(m_avRequest.get(), error.get());
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -110,7 +111,8 @@
</span><span class="cx"> 
</span><span class="cx">     int status = response.httpStatusCode();
</span><span class="cx">     if (status &amp;&amp; (status &lt; 200 || status &gt; 299)) {
</span><del>-        AVCFAssetResourceLoadingRequestFinishLoadingWithError(m_avRequest.get(), nullptr);
</del><ins>+        RetainPtr&lt;CFErrorRef&gt; error = adoptCF(CFErrorCreate(kCFAllocatorDefault, kCFErrorDomainCFNetwork, status, nullptr));
+        AVCFAssetResourceLoadingRequestFinishLoadingWithError(m_avRequest.get(), error.get());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -131,7 +133,8 @@
</span><span class="cx">         // FIXME:    [[m_avRequest.get() contentInformationRequest] setContentType:@&quot;&quot;];
</span><span class="cx">         notImplemented();
</span><span class="cx"> 
</span><del>-        AVCFAssetResourceLoadingRequestFinishLoadingWithError(m_avRequest.get(), nullptr);
</del><ins>+        RetainPtr&lt;CFErrorRef&gt; error = adoptCF(CFErrorCreate(kCFAllocatorDefault, kCFErrorDomainCFNetwork, kCFURLErrorUnknown, nullptr));
+        AVCFAssetResourceLoadingRequestFinishLoadingWithError(m_avRequest.get(), error.get());
</ins><span class="cx">     } else {
</span><span class="cx">         fulfillRequestWithResource(resource);
</span><span class="cx">         // FIXME: [m_avRequest.get() finishLoading];
</span></span></pre>
</div>
</div>

</body>
</html>