Changeset 163907 in webkit


Ignore:
Timestamp:
Feb 11, 2014 1:50:21 PM (10 years ago)
Author:
jer.noble@apple.com
Message:

[EME][Mac] Move the implementation of CDMPrivateAVFoundation back into MediaPlayerPrivateAVFoundationObjC.
https://bugs.webkit.org/show_bug.cgi?id=128559

Reviewed by Dean Jackson.

To prepare for multiple simultaneous CDMs with muliple MediaPlayer types, move the implementation for
CDMPrivateAVFoundation back into its media engine.

  • Modules/encryptedmedia/CDMPrivateAVFoundation.mm:

(WebCore::MediaKeyExceptionToErrorCode): Added.
(WebCore::CDMSessionAVFoundation::generateKeyRequest): Moved to MediaPlayerPrivateAVFoundationObjC.
(WebCore::CDMSessionAVFoundation::releaseKeys): Ditto.
(WebCore::CDMSessionAVFoundation::update): Ditto.

  • platform/graphics/MediaPlayer.cpp:

(WebCore::MediaPlayer::generateKeyRequest): Added, pass through to MediaPlayerPrivate.
(WebCore::MediaPlayer::releaseKeys): Ditto.
(WebCore::MediaPlayer::update): Ditto.

  • platform/graphics/MediaPlayer.h:
  • platform/graphics/MediaPlayerPrivate.h:

(WebCore::MediaPlayerPrivateInterface::generateKeyRequest): Added.
(WebCore::MediaPlayerPrivateInterface::releaseKeys): Ditto.
(WebCore::MediaPlayerPrivateInterface::update): Ditto.

  • platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
  • platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:

(WebCore::MediaPlayerPrivateAVFoundationObjC::generateKeyRequest): Moved from CDMSessionAVFoundation.
(WebCore::MediaPlayerPrivateAVFoundationObjC::releaseKeys): Ditto.
(WebCore::MediaPlayerPrivateAVFoundationObjC::update): Ditto.

Location:
trunk/Source/WebCore
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r163906 r163907  
     12014-02-10  Jer Noble  <jer.noble@apple.com>
     2
     3        [EME][Mac] Move the implementation of CDMPrivateAVFoundation back into MediaPlayerPrivateAVFoundationObjC.
     4        https://bugs.webkit.org/show_bug.cgi?id=128559
     5
     6        Reviewed by Dean Jackson.
     7
     8        To prepare for multiple simultaneous CDMs with muliple MediaPlayer types, move the implementation for
     9        CDMPrivateAVFoundation back into its media engine.
     10
     11        * Modules/encryptedmedia/CDMPrivateAVFoundation.mm:
     12        (WebCore::MediaKeyExceptionToErrorCode): Added.
     13        (WebCore::CDMSessionAVFoundation::generateKeyRequest): Moved to MediaPlayerPrivateAVFoundationObjC.
     14        (WebCore::CDMSessionAVFoundation::releaseKeys): Ditto.
     15        (WebCore::CDMSessionAVFoundation::update): Ditto.
     16        * platform/graphics/MediaPlayer.cpp:
     17        (WebCore::MediaPlayer::generateKeyRequest): Added, pass through to MediaPlayerPrivate.
     18        (WebCore::MediaPlayer::releaseKeys): Ditto.
     19        (WebCore::MediaPlayer::update): Ditto.
     20        * platform/graphics/MediaPlayer.h:
     21        * platform/graphics/MediaPlayerPrivate.h:
     22        (WebCore::MediaPlayerPrivateInterface::generateKeyRequest): Added.
     23        (WebCore::MediaPlayerPrivateInterface::releaseKeys): Ditto.
     24        (WebCore::MediaPlayerPrivateInterface::update): Ditto.
     25        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
     26        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
     27        (WebCore::MediaPlayerPrivateAVFoundationObjC::generateKeyRequest): Moved from CDMSessionAVFoundation.
     28        (WebCore::MediaPlayerPrivateAVFoundationObjC::releaseKeys): Ditto.
     29        (WebCore::MediaPlayerPrivateAVFoundationObjC::update): Ditto.
     30
    1312014-01-24  Jer Noble  <jer.noble@apple.com>
    232
  • trunk/Source/WebCore/Modules/encryptedmedia/CDMPrivateAVFoundation.mm

    r162139 r163907  
    9191}
    9292
     93static unsigned short MediaKeyExceptionToErrorCode(MediaPlayer::MediaKeyException error)
     94{
     95    switch (error) {
     96    case MediaPlayer::NoError:
     97        return 0;
     98    case MediaPlayer::InvalidPlayerState:
     99        return INVALID_STATE_ERR;
     100    case MediaPlayer::KeySystemNotSupported:
     101        return NOT_SUPPORTED_ERR;
     102    default:
     103        ASSERT_NOT_REACHED();
     104        return 0;
     105    }
     106}
     107
    93108PassRefPtr<Uint8Array> CDMSessionAVFoundation::generateKeyRequest(const String& mimeType, Uint8Array* initData, String& destinationURL, unsigned short& errorCode, unsigned long& systemCode)
    94109{
     
    98113    if (!mediaPlayer) {
    99114        errorCode = NOT_SUPPORTED_ERR;
    100         return 0;
    101     }
    102 
    103     String keyURI;
    104     String keyID;
    105     RefPtr<Uint8Array> certificate;
    106     if (!MediaPlayerPrivateAVFoundationObjC::extractKeyURIKeyIDAndCertificateFromInitData(initData, keyURI, keyID, certificate)) {
    107         errorCode = INVALID_STATE_ERR;
    108         return 0;
    109     }
    110 
    111     m_request = MediaPlayerPrivateAVFoundationObjC::takeRequestForPlayerAndKeyURI(mediaPlayer, keyURI);
    112     if (!m_request) {
    113         errorCode = INVALID_STATE_ERR;
    114         return 0;
     115        return nullptr;
    115116    }
    116117
    117118    m_sessionId = createCanonicalUUIDString();
    118119
    119     RetainPtr<NSData> certificateData = adoptNS([[NSData alloc] initWithBytes:certificate->baseAddress() length:certificate->byteLength()]);
    120     NSString* assetStr = keyID;
    121     RetainPtr<NSData> assetID = [NSData dataWithBytes: [assetStr cStringUsingEncoding:NSUTF8StringEncoding] length:[assetStr lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];
    122     NSError* error = 0;
    123     RetainPtr<NSData> keyRequest = [m_request.get() streamingContentKeyRequestDataForApp:certificateData.get() contentIdentifier:assetID.get() options:nil error:&error];
    124 
    125     if (!keyRequest) {
    126         NSError* underlyingError = [[error userInfo] objectForKey:NSUnderlyingErrorKey];
    127         errorCode = CDM::DomainError;
    128         systemCode = [underlyingError code];
    129         return 0;
    130     }
    131 
    132     errorCode = 0;
    133     systemCode = 0;
    134     destinationURL = String();
    135 
    136     RefPtr<ArrayBuffer> keyRequestBuffer = ArrayBuffer::create([keyRequest.get() bytes], [keyRequest.get() length]);
    137     return Uint8Array::create(keyRequestBuffer, 0, keyRequestBuffer->byteLength());
     120    MediaPlayer::MediaKeyException error;
     121    RefPtr<Uint8Array> request = mediaPlayer->generateKeyRequest(m_sessionId, mimeType, initData, destinationURL, error, systemCode);
     122    errorCode = MediaKeyExceptionToErrorCode(error);
     123    return request;
    138124}
    139125
    140126void CDMSessionAVFoundation::releaseKeys()
    141127{
     128    MediaPlayer* mediaPlayer = m_parent->cdm()->mediaPlayer();
     129    if (!mediaPlayer)
     130        return;
     131
     132    mediaPlayer->releaseKeys(m_sessionId);
    142133}
    143134
     
    147138        return false;
    148139
    149     RetainPtr<NSData> keyData = adoptNS([[NSData alloc] initWithBytes:key->baseAddress() length:key->byteLength()]);
    150     [[m_request.get() dataRequest] respondWithData:keyData.get()];
    151     [m_request.get() finishLoading];
    152     errorCode = 0;
    153     systemCode = 0;
    154     nextMessage = nullptr;
    155     m_request = nullptr;
     140    MediaPlayer* mediaPlayer = m_parent->cdm()->mediaPlayer();
     141    if (!mediaPlayer) {
     142        errorCode = NOT_SUPPORTED_ERR;
     143        return nullptr;
     144    }
    156145
    157     return true;
     146    MediaPlayer::MediaKeyException error;
     147    bool succeeded = mediaPlayer->update(m_sessionId, key, nextMessage, error, systemCode);
     148    errorCode = MediaKeyExceptionToErrorCode(error);
     149    return succeeded;
    158150}
    159151
  • trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp

    r163816 r163907  
    524524#endif
    525525
     526#if ENABLE(ENCRYPTED_MEDIA_V2)
     527PassRefPtr<Uint8Array> MediaPlayer::generateKeyRequest(const String& sessionID, const String& mimeType, Uint8Array* initData, String& destinationURL, MediaKeyException& error, unsigned long& systemCode)
     528{
     529    return m_private->generateKeyRequest(sessionID, mimeType, initData, destinationURL, error, systemCode);
     530}
     531
     532void MediaPlayer::releaseKeys(const String& sessionID)
     533{
     534    m_private->releaseKeys(sessionID);
     535}
     536
     537bool MediaPlayer::update(const String& sessionID, Uint8Array* key, RefPtr<Uint8Array>& nextMessage, MediaKeyException& error, unsigned long& systemCode)
     538{
     539    return m_private->update(sessionID, key, nextMessage, error, systemCode);
     540}
     541#endif
     542   
    526543double MediaPlayer::duration() const
    527544{
  • trunk/Source/WebCore/platform/graphics/MediaPlayer.h

    r163816 r163907  
    316316    void pause();
    317317
    318 #if ENABLE(ENCRYPTED_MEDIA)
     318#if ENABLE(ENCRYPTED_MEDIA) || ENABLE(ENCRYPTED_MEDIA_V2)
    319319    // Represents synchronous exceptions that can be thrown from the Encrypted Media methods.
    320320    // This is different from the asynchronous MediaKeyError.
    321321    enum MediaKeyException { NoError, InvalidPlayerState, KeySystemNotSupported };
    322 
     322#endif
     323
     324#if ENABLE(ENCRYPTED_MEDIA)
    323325    MediaKeyException generateKeyRequest(const String& keySystem, const unsigned char* initData, unsigned initDataLength);
    324326    MediaKeyException addKey(const String& keySystem, const unsigned char* key, unsigned keyLength, const unsigned char* initData, unsigned initDataLength, const String& sessionId);
    325327    MediaKeyException cancelKeyRequest(const String& keySystem, const String& sessionId);
     328#endif
     329
     330#if ENABLE(ENCRYPTED_MEDIA_V2)
     331    PassRefPtr<Uint8Array> generateKeyRequest(const String& sessionID, const String& mimeType, Uint8Array* initData, String& destinationURL, MediaKeyException& error, unsigned long& systemCode);
     332    void releaseKeys(const String& sessionID);
     333    bool update(const String& sessionID, Uint8Array* key, RefPtr<Uint8Array>& nextMessage, MediaKeyException& error, unsigned long& systemCode);
    326334#endif
    327335
  • trunk/Source/WebCore/platform/graphics/MediaPlayerPrivate.h

    r163816 r163907  
    208208#endif
    209209
     210#if ENABLE(ENCRYPTED_MEDIA_V2)
     211    virtual PassRefPtr<Uint8Array> generateKeyRequest(const String&, const String&, Uint8Array*, String&, MediaPlayer::MediaKeyException&, unsigned long&) { return nullptr; }
     212    virtual void releaseKeys(const String&) { }
     213    virtual bool update(const String&, Uint8Array*, RefPtr<Uint8Array>&, MediaPlayer::MediaKeyException&, unsigned long&) { return false; }
     214#endif
     215
    210216#if ENABLE(VIDEO_TRACK)
    211217    virtual bool requiresTextTrackRepresentation() const { return false; }
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h

    r162879 r163907  
    199199#endif
    200200
     201#if ENABLE(ENCRYPTED_MEDIA_V2)
     202    PassRefPtr<Uint8Array> generateKeyRequest(const String& sessionId, const String& mimeType, Uint8Array* initData, String& destinationURL, MediaPlayer::MediaKeyException& error, unsigned long& systemCode);
     203    void releaseKeys(const String& sessionId);
     204    bool update(const String& sessionId, Uint8Array* key, RefPtr<Uint8Array>& nextMessage, MediaPlayer::MediaKeyException& error, unsigned long& systemCode);
     205#endif
     206
    201207    virtual String languageOfPrimaryAudioTrack() const override;
    202208
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm

    r163844 r163907  
    15981598
    15991599#if ENABLE(ENCRYPTED_MEDIA_V2)
    1600 RetainPtr<AVAssetResourceLoadingRequest> MediaPlayerPrivateAVFoundationObjC::takeRequestForPlayerAndKeyURI(MediaPlayer* player, const String& keyURI)
    1601 {
    1602     MediaPlayerPrivateAVFoundationObjC* _this = playerToPrivateMap().get(player);
    1603     if (!_this)
    1604         return nullptr;
    1605 
    1606     return _this->m_keyURIToRequestMap.take(keyURI);
    1607 
     1600PassRefPtr<Uint8Array> MediaPlayerPrivateAVFoundationObjC::generateKeyRequest(const String& sessionId, const String& mimeType, Uint8Array* initData, String& destinationURL, MediaPlayer::MediaKeyException& error, unsigned long& systemCode)
     1601{
     1602    UNUSED_PARAM(mimeType);
     1603
     1604    String keyURI;
     1605    String keyID;
     1606    RefPtr<Uint8Array> certificate;
     1607    if (!MediaPlayerPrivateAVFoundationObjC::extractKeyURIKeyIDAndCertificateFromInitData(initData, keyURI, keyID, certificate)) {
     1608        error = MediaPlayer::InvalidPlayerState;
     1609        return 0;
     1610    }
     1611
     1612    RetainPtr<AVAssetResourceLoadingRequest> request = m_keyURIToRequestMap.take(keyURI);
     1613    if (!request) {
     1614        error = MediaPlayer::InvalidPlayerState;
     1615        return 0;
     1616    }
     1617
     1618    m_sessionIDToRequestMap.add(sessionId, request);
     1619
     1620    RetainPtr<NSData> certificateData = adoptNS([[NSData alloc] initWithBytes:certificate->baseAddress() length:certificate->byteLength()]);
     1621    NSString* assetStr = keyID;
     1622    RetainPtr<NSData> assetID = [NSData dataWithBytes: [assetStr cStringUsingEncoding:NSUTF8StringEncoding] length:[assetStr lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];
     1623    NSError* nsError = 0;
     1624    RetainPtr<NSData> keyRequest = [request streamingContentKeyRequestDataForApp:certificateData.get() contentIdentifier:assetID.get() options:nil error:&nsError];
     1625
     1626    if (!keyRequest) {
     1627        NSError* underlyingError = [[nsError userInfo] objectForKey:NSUnderlyingErrorKey];
     1628        systemCode = [underlyingError code];
     1629        return 0;
     1630    }
     1631
     1632    error = MediaPlayer::NoError;
     1633    systemCode = 0;
     1634    destinationURL = String();
     1635
     1636    RefPtr<ArrayBuffer> keyRequestBuffer = ArrayBuffer::create([keyRequest.get() bytes], [keyRequest.get() length]);
     1637    return Uint8Array::create(keyRequestBuffer, 0, keyRequestBuffer->byteLength());
     1638}
     1639
     1640void MediaPlayerPrivateAVFoundationObjC::releaseKeys(const String& sessionId)
     1641{
     1642    UNUSED_PARAM(sessionId);
     1643}
     1644
     1645bool MediaPlayerPrivateAVFoundationObjC::update(const String& sessionId, Uint8Array* key, RefPtr<Uint8Array>& nextMessage, MediaPlayer::MediaKeyException& error, unsigned long& systemCode)
     1646{
     1647    ASSERT(key);
     1648
     1649    RetainPtr<AVAssetResourceLoadingRequest> request = m_sessionIDToRequestMap.get(sessionId);
     1650    if (!request) {
     1651        error = MediaPlayer::InvalidPlayerState;
     1652        return false;
     1653    }
     1654
     1655    RetainPtr<NSData> keyData = adoptNS([[NSData alloc] initWithBytes:key->baseAddress() length:key->byteLength()]);
     1656    [[request dataRequest] respondWithData:keyData.get()];
     1657    [request finishLoading];
     1658    error = MediaPlayer::NoError;
     1659    systemCode = 0;
     1660    nextMessage = nullptr;
     1661
     1662    return true;
    16081663}
    16091664#endif
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.h

    r163816 r163907  
    7272    void effectiveRateChanged();
    7373    void sizeChanged();
     74
     75#if ENABLE(ENCRYPTED_MEDIA_V2)
     76    void keyNeeded(Uint8Array*);
     77#endif
    7478
    7579private:
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm

    r163816 r163907  
    535535}
    536536
     537#if ENABLE(ENCRYPTED_MEDIA_V2)
     538void MediaPlayerPrivateMediaSourceAVFObjC::keyNeeded(Uint8Array* initData)
     539{
     540    m_player->keyNeeded(initData);
     541}
     542#endif
     543
    537544void MediaPlayerPrivateMediaSourceAVFObjC::setReadyState(MediaPlayer::ReadyState readyState)
    538545{
Note: See TracChangeset for help on using the changeset viewer.