Changeset 225637 in webkit
- Timestamp:
- Dec 7, 2017 11:46:53 AM (6 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r225630 r225637 1 2017-12-07 Jer Noble <jer.noble@apple.com> 2 3 [EME] Support generateRequest() in CDMFairPlayStreaming 4 https://bugs.webkit.org/show_bug.cgi?id=179752 5 6 Reviewed by Eric Carlson. 7 8 * platform/mac/TestExpectations: 9 * platform/mac/media/encrypted-media/fps-createSession-expected.txt: Added. 10 * platform/mac/media/encrypted-media/fps-createSession.html: Added. 11 * platform/mac/media/encrypted-media/fps-generateRequest-expected.txt: Added. 12 * platform/mac/media/encrypted-media/fps-generateRequest.html: Added. 13 1 14 2017-12-07 Ryan Haddad <ryanhaddad@apple.com> 2 15 -
trunk/LayoutTests/platform/mac/TestExpectations
r225612 r225637 1749 1749 [ ElCapitan Sierra ] platform/mac/media/encrypted-media/fps-createMediaKeys.html [ Skip ] 1750 1750 [ ElCapitan Sierra ] platform/mac/media/encrypted-media/fps-requestMediaKeySystemAccess.html [ Skip ] 1751 [ ElCapitan Sierra ] platform/mac/media/encrypted-media/fps-createSession.html [ Skip ] 1752 [ ElCapitan Sierra ] platform/mac/media/encrypted-media/fps-generateRequest.html [ Skip ] 1751 1753 1752 1754 # rdar://problem/35395437 -
trunk/Source/WebCore/ChangeLog
r225635 r225637 1 2017-12-07 Jer Noble <jer.noble@apple.com> 2 3 [EME] Support generateRequest() in CDMFairPlayStreaming 4 https://bugs.webkit.org/show_bug.cgi?id=179752 5 6 Reviewed by Eric Carlson. 7 8 Tests: platform/mac/media/encrypted-media/fps-createSession.html 9 platform/mac/media/encrypted-media/fps-generateRequest.html 10 11 Add support for generating license requests from initialization data in 12 CDMFairPlayStreaming. To do so, add explicit checks for FairPlay Steraming requirements: 13 reqests will fail if no server certificate exists, and will fail if no content key id exists 14 in the initialization data. 15 16 * platform/graphics/avfoundation/CDMFairPlayStreaming.cpp: 17 (WebCore::CDMPrivateFairPlayStreaming::extractKeyIDsSinf): 18 (WebCore::CDMPrivateFairPlayStreaming::sanitizeSinf): 19 (WebCore::CDMFactory::platformRegisterFactories): 20 * platform/graphics/avfoundation/CDMFairPlayStreaming.h: 21 * platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.mm: 22 (WebCore::CDMInstanceFairPlayStreamingAVFObjC::requestLicense): 23 (WebCore::CDMInstanceFairPlayStreamingAVFObjC::didProvideRequest): 24 1 25 2017-12-07 Jer Noble <jer.noble@apple.com> 2 26 -
trunk/Source/WebCore/platform/graphics/avfoundation/CDMFairPlayStreaming.cpp
r225231 r225637 51 51 namespace WebCore { 52 52 53 static const Vector<FourCC>& validFairPlayStreamingSchemes() 54 { 55 static NeverDestroyed<Vector<FourCC>> validSchemes = Vector<FourCC>({ 56 "cbcs", 57 "cbc2", 58 "cbc1", 59 }); 60 61 return validSchemes; 62 } 63 64 static const String& sinfName() 65 { 66 static NeverDestroyed<String> sinf { MAKE_STATIC_STRING_IMPL("sinf") }; 67 return sinf; 68 } 69 53 70 static Vector<Ref<SharedBuffer>> extractSinfData(const SharedBuffer& buffer) 54 71 { … … 67 84 68 85 RefPtr<JSON::Array> sinfArray; 69 if (!object->getArray( "sinf", sinfArray))86 if (!object->getArray(sinfName(), sinfArray)) 70 87 return { }; 71 88 … … 135 152 } 136 153 137 static Vector<Ref<SharedBuffer>> extractKeyIDsSinf(const SharedBuffer& buffer) 138 { 139 auto sinfs = extractSinfData(buffer); 140 if (sinfs.isEmpty()) 141 return { }; 154 Vector<Ref<SharedBuffer>> CDMPrivateFairPlayStreaming::extractKeyIDsSinf(const SharedBuffer& buffer) 155 { 142 156 143 157 Vector<Ref<SharedBuffer>> keyIDs; 144 for (auto& sinf : sinfs) { 145 auto results = extractSchemeAndKeyIdFromSinf(sinf); 146 if (!results.size()) 147 continue; 148 149 for (auto& result : results) { 150 if (result.first == 'cbcs') 151 keyIDs.append(SharedBuffer::create(result.second.data(), result.second.size())); 152 } 158 auto results = extractSchemeAndKeyIdFromSinf(buffer); 159 160 for (auto& result : results) { 161 if (validFairPlayStreamingSchemes().contains(result.first)) 162 keyIDs.append(SharedBuffer::create(result.second.data(), result.second.size())); 153 163 } 154 164 … … 156 166 } 157 167 158 static RefPtr<SharedBuffer>sanitizeSinf(const SharedBuffer& buffer)168 RefPtr<SharedBuffer> CDMPrivateFairPlayStreaming::sanitizeSinf(const SharedBuffer& buffer) 159 169 { 160 170 // Common SINF Box Format … … 169 179 factories.append(&CDMFactoryFairPlayStreaming::singleton()); 170 180 171 InitDataRegistry::shared().registerInitDataType( "sinf", { sanitizeSinf,extractKeyIDsSinf });181 InitDataRegistry::shared().registerInitDataType(sinfName(), { CDMPrivateFairPlayStreaming::sanitizeSinf, CDMPrivateFairPlayStreaming::extractKeyIDsSinf }); 172 182 } 173 183 … … 201 211 bool CDMPrivateFairPlayStreaming::supportsInitDataType(const AtomicString& initDataType) const 202 212 { 203 return initDataType == "sinf";213 return initDataType == sinfName(); 204 214 } 205 215 206 216 bool CDMPrivateFairPlayStreaming::supportsConfiguration(const CDMKeySystemConfiguration& configuration) const 207 217 { 208 if (!configuration.initDataTypes.contains( "sinf"))218 if (!configuration.initDataTypes.contains(sinfName())) 209 219 return false; 210 220 … … 322 332 323 333 return WTF::anyOf(extractSchemeAndKeyIdFromSinf(initData), [](auto& result) { 324 return result.first == 'cbcs' || result.first == 'cbc2' || result.first == 'cbc1';334 return validFairPlayStreamingSchemes().contains(result.first); 325 335 }); 326 336 } -
trunk/Source/WebCore/platform/graphics/avfoundation/CDMFairPlayStreaming.h
r224707 r225637 65 65 RefPtr<SharedBuffer> sanitizeResponse(const SharedBuffer&) const override; 66 66 std::optional<String> sanitizeSessionId(const String&) const override; 67 68 static Vector<Ref<SharedBuffer>> extractKeyIDsSinf(const SharedBuffer&); 69 static RefPtr<SharedBuffer> sanitizeSinf(const SharedBuffer&); 67 70 }; 68 71 -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.mm
r224707 r225637 29 29 #if HAVE(AVCONTENTKEYSESSION) 30 30 31 #import "CDMFairPlayStreaming.h" 31 32 #import "CDMKeySystemConfiguration.h" 32 33 #import "NotImplemented.h" … … 227 228 return; 228 229 } 230 231 if (!m_serverCertificate) { 232 callback(SharedBuffer::create(), emptyString(), false, Failed); 233 return; 234 } 235 229 236 m_requestLicenseCallback = WTFMove(callback); 230 237 … … 269 276 return; 270 277 271 #pragma clang diagnostic push272 #pragma clang diagnostic ignored "-Wnonnull"273 278 RetainPtr<NSData> appIdentifier = m_serverCertificate ? m_serverCertificate->createNSData() : nullptr; 274 [m_request makeStreamingContentKeyRequestDataForApp:appIdentifier.get() contentIdentifier:nil options:nil completionHandler:[this, weakThis = createWeakPtr()] (NSData *contentKeyRequestData, NSError *error) mutable { 279 Vector<Ref<SharedBuffer>> keyIDs = CDMPrivateFairPlayStreaming::extractKeyIDsSinf(SharedBuffer::create(request.initializationData)); 280 if (keyIDs.isEmpty()) { 281 m_requestLicenseCallback(SharedBuffer::create(), m_sessionId, false, Failed); 282 return; 283 } 284 285 RetainPtr<NSData> contentIdentifier = keyIDs.first()->createNSData(); 286 [m_request makeStreamingContentKeyRequestDataForApp:appIdentifier.get() contentIdentifier:contentIdentifier.get() options:nil completionHandler:[this, weakThis = createWeakPtr()] (NSData *contentKeyRequestData, NSError *error) mutable { 275 287 callOnMainThread([this, weakThis = WTFMove(weakThis), error = retainPtr(error), contentKeyRequestData = retainPtr(contentKeyRequestData)] { 276 288 if (!weakThis || !m_requestLicenseCallback) … … 283 295 }); 284 296 }]; 285 #pragma clang diagnostic pop286 297 } 287 298
Note: See TracChangeset
for help on using the changeset viewer.