diff options
| author | Jeff Tinker <jtinker@google.com> | 2015-05-29 16:35:28 -0700 | 
|---|---|---|
| committer | Jeff Tinker <jtinker@google.com> | 2015-06-03 11:35:50 -0700 | 
| commit | 9472e5f3ab44f04c92e44ad0f3e94c0ee508ec11 (patch) | |
| tree | 310e52bec409cfbdfcc355f67c03e792c51df347 | |
| parent | 2d6b6601743c3c6960c6511a2cb774ef902759f4 (diff) | |
| download | frameworks_av-9472e5f3ab44f04c92e44ad0f3e94c0ee508ec11.zip frameworks_av-9472e5f3ab44f04c92e44ad0f3e94c0ee508ec11.tar.gz frameworks_av-9472e5f3ab44f04c92e44ad0f3e94c0ee508ec11.tar.bz2  | |
Implement MediaCrypto.setMediaDrmSession in clearkey plugin
To support adding cts tests for new APIs in M, the
clearkey DRM plugin needs to be updated.
Change-Id: If672ecec8f570d1dd5130e8e4419d37bd931a9e2
related-to-bug: 21527003
| -rw-r--r-- | drm/mediadrm/plugins/clearkey/CryptoFactory.cpp | 16 | ||||
| -rw-r--r-- | drm/mediadrm/plugins/clearkey/CryptoPlugin.cpp | 16 | ||||
| -rw-r--r-- | drm/mediadrm/plugins/clearkey/CryptoPlugin.h | 11 | ||||
| -rw-r--r-- | drm/mediadrm/plugins/clearkey/DrmPlugin.cpp | 12 | ||||
| -rw-r--r-- | drm/mediadrm/plugins/clearkey/SessionLibrary.cpp | 7 | ||||
| -rw-r--r-- | drm/mediadrm/plugins/clearkey/SessionLibrary.h | 4 | 
6 files changed, 48 insertions, 18 deletions
diff --git a/drm/mediadrm/plugins/clearkey/CryptoFactory.cpp b/drm/mediadrm/plugins/clearkey/CryptoFactory.cpp index ee3189b..eeb64c3 100644 --- a/drm/mediadrm/plugins/clearkey/CryptoFactory.cpp +++ b/drm/mediadrm/plugins/clearkey/CryptoFactory.cpp @@ -43,10 +43,18 @@ android::status_t CryptoFactory::createPlugin(          return android::BAD_VALUE;      } -    android::sp<Session> session = SessionLibrary::get()->findSession( -            data, size); -    *plugin = new CryptoPlugin(session); -    return android::OK; +    android::Vector<uint8_t> sessionId; +    sessionId.appendArray(reinterpret_cast<const uint8_t*>(data), size); + +    CryptoPlugin *clearKeyPlugin = new CryptoPlugin(sessionId); +    android::status_t result = clearKeyPlugin->getInitStatus(); +    if (result == android::OK) { +        *plugin = clearKeyPlugin; +    } else { +        delete clearKeyPlugin; +        *plugin = NULL; +    } +    return result;  }  } // namespace clearkeydrm diff --git a/drm/mediadrm/plugins/clearkey/CryptoPlugin.cpp b/drm/mediadrm/plugins/clearkey/CryptoPlugin.cpp index adad136..53cbf80 100644 --- a/drm/mediadrm/plugins/clearkey/CryptoPlugin.cpp +++ b/drm/mediadrm/plugins/clearkey/CryptoPlugin.cpp @@ -19,9 +19,9 @@  #include <utils/Log.h>  #include <media/stagefright/MediaErrors.h> -#include <utils/Errors.h>  #include "CryptoPlugin.h" +#include "SessionLibrary.h"  namespace clearkeydrm { @@ -80,4 +80,18 @@ ssize_t CryptoPlugin::decrypt(bool secure, const KeyId keyId, const Iv iv,      }  } +android::status_t CryptoPlugin::setMediaDrmSession( +        const android::Vector<uint8_t>& sessionId) { +    if (!sessionId.size()) { +        mSession.clear(); +    } else { +        mSession = SessionLibrary::get()->findSession(sessionId); +        if (!mSession.get()) { +            return android::ERROR_DRM_SESSION_NOT_OPENED; +        } +    } +    return android::OK; +} + +  }  // namespace clearkeydrm diff --git a/drm/mediadrm/plugins/clearkey/CryptoPlugin.h b/drm/mediadrm/plugins/clearkey/CryptoPlugin.h index 002d9e0..fd38f28 100644 --- a/drm/mediadrm/plugins/clearkey/CryptoPlugin.h +++ b/drm/mediadrm/plugins/clearkey/CryptoPlugin.h @@ -31,7 +31,10 @@ namespace clearkeydrm {  class CryptoPlugin : public android::CryptoPlugin {  public: -    CryptoPlugin(const android::sp<Session>& session) : mSession(session) {} +    CryptoPlugin(const android::Vector<uint8_t>& sessionId) { +        mInitStatus = setMediaDrmSession(sessionId); +    } +      virtual ~CryptoPlugin() {}      virtual bool requiresSecureDecoderComponent(const char* mime) const { @@ -45,10 +48,16 @@ public:              const SubSample* subSamples, size_t numSubSamples,              void* dstPtr, android::AString* errorDetailMsg); +    virtual android::status_t setMediaDrmSession( +            const android::Vector<uint8_t>& sessionId); + +    android::status_t getInitStatus() const {return mInitStatus;} +  private:      DISALLOW_EVIL_CONSTRUCTORS(CryptoPlugin);      android::sp<Session> mSession; +    android::status_t mInitStatus;  };  } // namespace clearkeydrm diff --git a/drm/mediadrm/plugins/clearkey/DrmPlugin.cpp b/drm/mediadrm/plugins/clearkey/DrmPlugin.cpp index 6b8c772..e5ee403 100644 --- a/drm/mediadrm/plugins/clearkey/DrmPlugin.cpp +++ b/drm/mediadrm/plugins/clearkey/DrmPlugin.cpp @@ -37,7 +37,9 @@ status_t DrmPlugin::openSession(Vector<uint8_t>& sessionId) {  status_t DrmPlugin::closeSession(const Vector<uint8_t>& sessionId) {      sp<Session> session = mSessionLibrary->findSession(sessionId); -    mSessionLibrary->destroySession(session); +    if (session.get()) { +        mSessionLibrary->destroySession(session); +    }      return android::OK;  } @@ -55,8 +57,11 @@ status_t DrmPlugin::getKeyRequest(          return android::ERROR_DRM_CANNOT_HANDLE;      }      *keyRequestType = DrmPlugin::kKeyRequestType_Initial; -    sp<Session> session = mSessionLibrary->findSession(scope);      defaultUrl.clear(); +    sp<Session> session = mSessionLibrary->findSession(scope); +    if (!session.get()) { +        return android::ERROR_DRM_SESSION_NOT_OPENED; +    }      return session->getKeyRequest(initData, initDataType, &request);  } @@ -65,6 +70,9 @@ status_t DrmPlugin::provideKeyResponse(          const Vector<uint8_t>& response,          Vector<uint8_t>& keySetId) {      sp<Session> session = mSessionLibrary->findSession(scope); +    if (!session.get()) { +        return android::ERROR_DRM_SESSION_NOT_OPENED; +    }      status_t res = session->provideKeyResponse(response);      if (res == android::OK) {          keySetId.clear(); diff --git a/drm/mediadrm/plugins/clearkey/SessionLibrary.cpp b/drm/mediadrm/plugins/clearkey/SessionLibrary.cpp index d047c53..46d7f77 100644 --- a/drm/mediadrm/plugins/clearkey/SessionLibrary.cpp +++ b/drm/mediadrm/plugins/clearkey/SessionLibrary.cpp @@ -63,13 +63,6 @@ const sp<Session>& SessionLibrary::findSession(      return mSessions.valueFor(sessionId);  } -const sp<Session>& SessionLibrary::findSession( -        const void* data, size_t size) { -    Vector<uint8_t> sessionId; -    sessionId.appendArray(reinterpret_cast<const uint8_t*>(data), size); -    return findSession(sessionId); -} -  void SessionLibrary::destroySession(const sp<Session>& session) {      Mutex::Autolock lock(mSessionsLock);\      mSessions.removeItem(session->sessionId()); diff --git a/drm/mediadrm/plugins/clearkey/SessionLibrary.h b/drm/mediadrm/plugins/clearkey/SessionLibrary.h index 56c8828..199ad64 100644 --- a/drm/mediadrm/plugins/clearkey/SessionLibrary.h +++ b/drm/mediadrm/plugins/clearkey/SessionLibrary.h @@ -36,8 +36,6 @@ public:      const android::sp<Session>& findSession(              const android::Vector<uint8_t>& sessionId); -    const android::sp<Session>& findSession(const void* data, size_t size); -      void destroySession(const android::sp<Session>& session);  private: @@ -50,7 +48,7 @@ private:      android::Mutex mSessionsLock;      uint32_t mNextSessionId; -    android::KeyedVector<android::Vector<uint8_t>, android::sp<Session> > +    android::DefaultKeyedVector<android::Vector<uint8_t>, android::sp<Session> >              mSessions;  };  | 
