MediaCas: combine openSession methods

Combine the two openSession methods into one that doesn't take any
arguments. This gives the client more flexibility on creating
sessions efficiently. They can better decide whether to share one
session for multiple streams, or create one session per stream.

bug: 22804304

Change-Id: I9634f4dd4fc437229068103b54555cc28a818937
diff --git a/drm/libmediadrm/CasImpl.cpp b/drm/libmediadrm/CasImpl.cpp
index fcedd6b..1a33bb0 100644
--- a/drm/libmediadrm/CasImpl.cpp
+++ b/drm/libmediadrm/CasImpl.cpp
@@ -113,36 +113,15 @@
     return getBinderStatus(holder->get()->setPrivateData(pvtData));
 }
 
-Status CasImpl::openSession(int32_t program_number, CasSessionId* sessionId) {
-    ALOGV("openSession: program_number=%d", program_number);
+Status CasImpl::openSession(CasSessionId* sessionId) {
+    ALOGV("openSession");
     sp<PluginHolder> holder = mPluginHolder;
     if (holder == NULL) {
         return getBinderStatus(INVALID_OPERATION);
     }
-    status_t err = holder->get()->openSession(program_number, sessionId);
+    status_t err = holder->get()->openSession(sessionId);
 
-    ALOGV("openSession: session opened for program_number=%d, sessionId=%s",
-            program_number, sessionIdToString(*sessionId).string());
-
-    return getBinderStatus(err);
-}
-
-Status CasImpl::openSessionForStream(
-        int32_t program_number,
-        int32_t elementary_PID,
-        CasSessionId* sessionId) {
-    ALOGV("openSession: program_number=%d, elementary_PID=%d",
-            program_number, elementary_PID);
-    sp<PluginHolder> holder = mPluginHolder;
-    if (holder == NULL) {
-        return getBinderStatus(INVALID_OPERATION);
-    }
-    status_t err = holder->get()->openSession(
-            program_number, elementary_PID, sessionId);
-
-    ALOGV("openSession: session opened for "
-            "program_number=%d, elementary_PID=%d, sessionId=%s",
-            program_number, elementary_PID,
+    ALOGV("openSession: session opened, sessionId=%s",
             sessionIdToString(*sessionId).string());
 
     return getBinderStatus(err);
diff --git a/drm/libmediadrm/aidl/android/media/ICas.aidl b/drm/libmediadrm/aidl/android/media/ICas.aidl
index 6b2ce4a..9746593 100644
--- a/drm/libmediadrm/aidl/android/media/ICas.aidl
+++ b/drm/libmediadrm/aidl/android/media/ICas.aidl
@@ -21,8 +21,7 @@
 /** @hide */
 interface ICas {
     void setPrivateData(in byte[] pvtData);
-    byte[] openSession(int program_number);
-    byte[] openSessionForStream(int program_number, int elementary_PID);
+    byte[] openSession();
     void closeSession(in byte[] sessionId);
     void setSessionPrivateData(in byte[] sessionId, in byte[] pvtData);
     void processEcm(in byte[] sessionId, in MediaCas.ParcelableCasData ecm);
diff --git a/drm/mediacas/plugins/clearkey/ClearKeyCasPlugin.cpp b/drm/mediacas/plugins/clearkey/ClearKeyCasPlugin.cpp
index f4c3577..4ed5fce 100644
--- a/drm/mediacas/plugins/clearkey/ClearKeyCasPlugin.cpp
+++ b/drm/mediacas/plugins/clearkey/ClearKeyCasPlugin.cpp
@@ -110,23 +110,10 @@
     return result;
 }
 
-status_t ClearKeyCasPlugin::openSession(
-        uint16_t program_number, CasSessionId* sessionId) {
-    ALOGV("openSession: program_number=%u", program_number);
+status_t ClearKeyCasPlugin::openSession(CasSessionId* sessionId) {
+    ALOGV("openSession");
 
-    return ClearKeySessionLibrary::get()->addSession(
-            this, program_number, 0, sessionId);
-}
-
-status_t ClearKeyCasPlugin::openSession(
-        uint16_t program_number,
-        uint16_t elementary_PID,
-        CasSessionId *sessionId) {
-    ALOGV("openSession: program_number=%u, elementary_PID=%u",
-            program_number, elementary_PID);
-
-    return ClearKeySessionLibrary::get()->addSession(
-            this, program_number, elementary_PID, sessionId);
+    return ClearKeySessionLibrary::get()->addSession(this, sessionId);
 }
 
 status_t ClearKeyCasPlugin::closeSession(const CasSessionId &sessionId) {
diff --git a/drm/mediacas/plugins/clearkey/ClearKeyCasPlugin.h b/drm/mediacas/plugins/clearkey/ClearKeyCasPlugin.h
index 8cf9b90..b7134e4 100644
--- a/drm/mediacas/plugins/clearkey/ClearKeyCasPlugin.h
+++ b/drm/mediacas/plugins/clearkey/ClearKeyCasPlugin.h
@@ -68,13 +68,7 @@
     virtual status_t setPrivateData(
             const CasData &data) override;
 
-    virtual status_t openSession(
-            uint16_t program_number, CasSessionId *sessionId) override;
-
-    virtual status_t openSession(
-            uint16_t program_number,
-            uint16_t elementary_PID,
-            CasSessionId *sessionId) override;
+    virtual status_t openSession(CasSessionId *sessionId) override;
 
     virtual status_t closeSession(
             const CasSessionId &sessionId) override;
diff --git a/drm/mediacas/plugins/clearkey/ClearKeySessionLibrary.cpp b/drm/mediacas/plugins/clearkey/ClearKeySessionLibrary.cpp
index 4e5f479..faea008 100644
--- a/drm/mediacas/plugins/clearkey/ClearKeySessionLibrary.cpp
+++ b/drm/mediacas/plugins/clearkey/ClearKeySessionLibrary.cpp
@@ -29,29 +29,14 @@
 Mutex ClearKeySessionLibrary::sSingletonLock;
 ClearKeySessionLibrary* ClearKeySessionLibrary::sSingleton = NULL;
 
-inline bool operator < (
-        const SessionInfo& lhs, const SessionInfo& rhs) {
-    if (lhs.plugin < rhs.plugin) return true;
-    else if (lhs.plugin > rhs.plugin) return false;
-
-    if (lhs.program_number < rhs.program_number) return true;
-    else if (lhs.program_number > rhs.program_number) return false;
-
-    return lhs.elementary_PID < rhs.elementary_PID;
-}
-
-ClearKeyCasSession::ClearKeyCasSession(const SessionInfo &info)
-    : mSessionInfo(info) {
+ClearKeyCasSession::ClearKeyCasSession(CasPlugin *plugin)
+    : mPlugin(plugin) {
     mKeyInfo[0].valid = mKeyInfo[1].valid = false;
 }
 
 ClearKeyCasSession::~ClearKeyCasSession() {
 }
 
-const SessionInfo& ClearKeyCasSession::getSessionInfo() const {
-    return mSessionInfo;
-}
-
 ClearKeySessionLibrary* ClearKeySessionLibrary::get() {
     Mutex::Autolock lock(sSingletonLock);
 
@@ -66,24 +51,12 @@
 ClearKeySessionLibrary::ClearKeySessionLibrary() : mNextSessionId(1) {}
 
 status_t ClearKeySessionLibrary::addSession(
-        CasPlugin *plugin,
-        uint16_t program_number,
-        uint16_t elementary_PID,
-        CasSessionId *sessionId) {
+        CasPlugin *plugin, CasSessionId *sessionId) {
     CHECK(sessionId);
 
     Mutex::Autolock lock(mSessionsLock);
 
-    SessionInfo info = {plugin, program_number, elementary_PID};
-    ssize_t index = mSessionInfoToIDMap.indexOfKey(info);
-    if (index >= 0) {
-        ALOGW("Session already exists: program_number=%u, elementary_PID=%u",
-                program_number, elementary_PID);
-        *sessionId = mSessionInfoToIDMap[index];
-        return OK;
-    }
-
-    sp<ClearKeyCasSession> session = new ClearKeyCasSession(info);
+    sp<ClearKeyCasSession> session = new ClearKeyCasSession(plugin);
 
     uint8_t *byteArray = (uint8_t *) &mNextSessionId;
     sessionId->push_back(byteArray[3]);
@@ -92,7 +65,6 @@
     sessionId->push_back(byteArray[0]);
     mNextSessionId++;
 
-    mSessionInfoToIDMap.add(info, *sessionId);
     mIDToSessionMap.add(*sessionId, session);
     return OK;
 }
@@ -117,19 +89,16 @@
     }
 
     sp<ClearKeyCasSession> session = mIDToSessionMap.valueAt(index);
-    mSessionInfoToIDMap.removeItem(session->getSessionInfo());
     mIDToSessionMap.removeItemsAt(index);
 }
 
 void ClearKeySessionLibrary::destroyPlugin(CasPlugin *plugin) {
     Mutex::Autolock lock(mSessionsLock);
 
-    for (ssize_t index = mSessionInfoToIDMap.size() - 1; index >= 0; index--) {
-        const SessionInfo &info = mSessionInfoToIDMap.keyAt(index);
-        if (info.plugin == plugin) {
-            const CasSessionId &id = mSessionInfoToIDMap.valueAt(index);
-            mIDToSessionMap.removeItem(id);
-            mSessionInfoToIDMap.removeItemsAt(index);
+    for (ssize_t index = mIDToSessionMap.size() - 1; index >= 0; index--) {
+        sp<ClearKeyCasSession> session = mIDToSessionMap.valueAt(index);
+        if (session->getPlugin() == plugin) {
+            mIDToSessionMap.removeItemsAt(index);
         }
     }
 }
diff --git a/drm/mediacas/plugins/clearkey/ClearKeySessionLibrary.h b/drm/mediacas/plugins/clearkey/ClearKeySessionLibrary.h
index ebefa72..01f5f47 100644
--- a/drm/mediacas/plugins/clearkey/ClearKeySessionLibrary.h
+++ b/drm/mediacas/plugins/clearkey/ClearKeySessionLibrary.h
@@ -30,12 +30,6 @@
 namespace clearkeycas {
 class KeyFetcher;
 
-struct SessionInfo {
-    CasPlugin *plugin;
-    uint16_t program_number;
-    uint16_t elementary_PID;
-};
-
 class ClearKeyCasSession : public RefBase {
 public:
     ssize_t decrypt(
@@ -59,14 +53,14 @@
     };
     sp<ABuffer> mEcmBuffer;
     Mutex mKeyLock;
-    SessionInfo mSessionInfo;
+    CasPlugin* mPlugin;
     KeyInfo mKeyInfo[kNumKeys];
 
     friend class ClearKeySessionLibrary;
 
-    explicit ClearKeyCasSession(const SessionInfo &info);
+    explicit ClearKeyCasSession(CasPlugin *plugin);
     virtual ~ClearKeyCasSession();
-    const SessionInfo& getSessionInfo() const;
+    CasPlugin* getPlugin() const { return mPlugin; }
     status_t decryptPayload(
             const AES_KEY& key, size_t length, size_t offset, char* buffer) const;
 
@@ -77,11 +71,7 @@
 public:
     static ClearKeySessionLibrary* get();
 
-    status_t addSession(
-            CasPlugin *plugin,
-            uint16_t program_number,
-            uint16_t elementary_PID,
-            CasSessionId *sessionId);
+    status_t addSession(CasPlugin *plugin, CasSessionId *sessionId);
 
     sp<ClearKeyCasSession> findSession(const CasSessionId& sessionId);
 
@@ -96,7 +86,6 @@
     Mutex mSessionsLock;
     uint32_t mNextSessionId;
     KeyedVector<CasSessionId, sp<ClearKeyCasSession>> mIDToSessionMap;
-    KeyedVector<SessionInfo, CasSessionId> mSessionInfoToIDMap;
 
     ClearKeySessionLibrary();
     DISALLOW_EVIL_CONSTRUCTORS(ClearKeySessionLibrary);
diff --git a/drm/mediacas/plugins/mock/MockCasPlugin.cpp b/drm/mediacas/plugins/mock/MockCasPlugin.cpp
index 12cac60..18cd9a4 100644
--- a/drm/mediacas/plugins/mock/MockCasPlugin.cpp
+++ b/drm/mediacas/plugins/mock/MockCasPlugin.cpp
@@ -103,22 +103,9 @@
     return OK;
 }
 
-status_t MockCasPlugin::openSession(
-        uint16_t program_number, CasSessionId* sessionId) {
-    ALOGV("openSession: program_number=%u", program_number);
-    return MockSessionLibrary::get()->addSession(
-            this, program_number, 0, sessionId);
-}
-
-status_t MockCasPlugin::openSession(
-        uint16_t program_number,
-        uint16_t elementary_PID,
-        CasSessionId *sessionId) {
-    ALOGV("openSession: program_number=%u, elementary_PID=%u",
-            program_number, elementary_PID);
-
-    return MockSessionLibrary::get()->addSession(
-            this, program_number, elementary_PID, sessionId);
+status_t MockCasPlugin::openSession(CasSessionId* sessionId) {
+    ALOGV("openSession");
+    return MockSessionLibrary::get()->addSession(this, sessionId);
 }
 
 status_t MockCasPlugin::closeSession(const CasSessionId &sessionId) {
diff --git a/drm/mediacas/plugins/mock/MockCasPlugin.h b/drm/mediacas/plugins/mock/MockCasPlugin.h
index 91c8855..9632492 100644
--- a/drm/mediacas/plugins/mock/MockCasPlugin.h
+++ b/drm/mediacas/plugins/mock/MockCasPlugin.h
@@ -63,13 +63,7 @@
     virtual status_t setPrivateData(
             const CasData &data) override;
 
-    virtual status_t openSession(
-            uint16_t program_number, CasSessionId *sessionId) override;
-
-    virtual status_t openSession(
-            uint16_t program_number,
-            uint16_t elementary_PID,
-            CasSessionId *sessionId) override;
+    virtual status_t openSession(CasSessionId *sessionId) override;
 
     virtual status_t closeSession(
             const CasSessionId &sessionId) override;
diff --git a/drm/mediacas/plugins/mock/MockSessionLibrary.cpp b/drm/mediacas/plugins/mock/MockSessionLibrary.cpp
index 8679a04..a7ee9a0 100644
--- a/drm/mediacas/plugins/mock/MockSessionLibrary.cpp
+++ b/drm/mediacas/plugins/mock/MockSessionLibrary.cpp
@@ -26,26 +26,6 @@
 Mutex MockSessionLibrary::sSingletonLock;
 MockSessionLibrary* MockSessionLibrary::sSingleton = NULL;
 
-inline bool operator < (
-        const SessionInfo& lhs,
-        const SessionInfo& rhs) {
-    if (lhs.plugin < rhs.plugin) return true;
-    else if (lhs.plugin > rhs.plugin) return false;
-
-    if (lhs.program_number < rhs.program_number) return true;
-    else if (lhs.program_number > rhs.program_number) return false;
-
-    return lhs.elementary_PID < rhs.elementary_PID;
-}
-
-void MockCasSession::setSessionInfo(const SessionInfo &info) {
-    mSessionInfo = info;
-}
-
-const SessionInfo& MockCasSession::getSessionInfo() const {
-    return mSessionInfo;
-}
-
 MockSessionLibrary* MockSessionLibrary::get() {
     Mutex::Autolock lock(sSingletonLock);
 
@@ -60,23 +40,10 @@
 MockSessionLibrary::MockSessionLibrary() : mNextSessionId(1) {}
 
 status_t MockSessionLibrary::addSession(
-        CasPlugin *plugin,
-        uint16_t program_number,
-        uint16_t elementary_PID,
-        CasSessionId *sessionId) {
+        CasPlugin *plugin, CasSessionId *sessionId) {
     Mutex::Autolock lock(mSessionsLock);
 
-    SessionInfo info = {plugin, program_number, elementary_PID};
-    ssize_t index = mSessionInfoToIDMap.indexOfKey(info);
-    if (index >= 0) {
-        ALOGW("Session already exists: program_number=%u, elementary_PID=%u",
-                program_number, elementary_PID);
-        *sessionId = mSessionInfoToIDMap[index];
-        return OK;
-    }
-
-    sp<MockCasSession> session = new MockCasSession();
-    session->setSessionInfo(info);
+    sp<MockCasSession> session = new MockCasSession(plugin);
 
     uint8_t *byteArray = (uint8_t *) &mNextSessionId;
     sessionId->push_back(byteArray[3]);
@@ -85,7 +52,6 @@
     sessionId->push_back(byteArray[0]);
     mNextSessionId++;
 
-    mSessionInfoToIDMap.add(info, *sessionId);
     mIDToSessionMap.add(*sessionId, session);
     return OK;
 }
@@ -110,19 +76,16 @@
     }
 
     sp<MockCasSession> session = mIDToSessionMap.valueAt(index);
-    mSessionInfoToIDMap.removeItem(session->getSessionInfo());
     mIDToSessionMap.removeItemsAt(index);
 }
 
 void MockSessionLibrary::destroyPlugin(CasPlugin *plugin) {
     Mutex::Autolock lock(mSessionsLock);
 
-    for (ssize_t index = mSessionInfoToIDMap.size() - 1; index >= 0; index--) {
-        const SessionInfo &info = mSessionInfoToIDMap.keyAt(index);
-        if (info.plugin == plugin) {
-            const CasSessionId &id = mSessionInfoToIDMap.valueAt(index);
-            mIDToSessionMap.removeItem(id);
-            mSessionInfoToIDMap.removeItemsAt(index);
+    for (ssize_t index = mIDToSessionMap.size() - 1; index >= 0; index--) {
+        sp<MockCasSession> session = mIDToSessionMap.valueAt(index);
+        if (session->getPlugin() == plugin) {
+            mIDToSessionMap.removeItemsAt(index);
         }
     }
 }
diff --git a/drm/mediacas/plugins/mock/MockSessionLibrary.h b/drm/mediacas/plugins/mock/MockSessionLibrary.h
index d28cbdc..0b30f4c 100644
--- a/drm/mediacas/plugins/mock/MockSessionLibrary.h
+++ b/drm/mediacas/plugins/mock/MockSessionLibrary.h
@@ -25,23 +25,17 @@
 
 namespace android {
 
-struct SessionInfo {
-    CasPlugin *plugin;
-    uint16_t program_number;
-    uint16_t elementary_PID;
-};
-
 class MockCasSession : public RefBase {
 public:
-    explicit MockCasSession() {}
+    explicit MockCasSession(CasPlugin *plugin) : mPlugin(plugin) {}
     virtual ~MockCasSession() {}
 
 private:
     friend class MockSessionLibrary;
-    SessionInfo mSessionInfo;
 
-    void setSessionInfo(const SessionInfo &info);
-    const SessionInfo& getSessionInfo() const;
+    CasPlugin* mPlugin;
+
+    CasPlugin* getPlugin() const { return mPlugin; }
 
     DISALLOW_EVIL_CONSTRUCTORS(MockCasSession);
 };
@@ -50,11 +44,7 @@
 public:
     static MockSessionLibrary* get();
 
-    status_t addSession(
-            CasPlugin *plugin,
-            uint16_t program_number,
-            uint16_t elementary_PID,
-            CasSessionId *sessionId);
+    status_t addSession(CasPlugin *plugin, CasSessionId *sessionId);
 
     sp<MockCasSession> findSession(const CasSessionId& sessionId);
 
@@ -69,7 +59,6 @@
     Mutex mSessionsLock;
     uint32_t mNextSessionId;
     KeyedVector<CasSessionId, sp<MockCasSession> > mIDToSessionMap;
-    KeyedVector<SessionInfo, CasSessionId> mSessionInfoToIDMap;
 
     MockSessionLibrary();
     DISALLOW_EVIL_CONSTRUCTORS(MockSessionLibrary);
diff --git a/include/media/CasImpl.h b/include/media/CasImpl.h
index 3c07092..0dd506c 100644
--- a/include/media/CasImpl.h
+++ b/include/media/CasImpl.h
@@ -54,13 +54,7 @@
     virtual Status setPrivateData(
             const CasData& pvtData) override;
 
-    virtual Status openSession(
-            int32_t program_number, CasSessionId* _aidl_return) override;
-
-    virtual Status openSessionForStream(
-            int32_t program_number,
-            int32_t elementary_PID,
-            CasSessionId* _aidl_return) override;
+    virtual Status openSession(CasSessionId* _aidl_return) override;
 
     virtual Status closeSession(const CasSessionId& sessionId) override;
 
diff --git a/media/libstagefright/mpeg2ts/CasManager.cpp b/media/libstagefright/mpeg2ts/CasManager.cpp
index d801034..047b1b3 100644
--- a/media/libstagefright/mpeg2ts/CasManager.cpp
+++ b/media/libstagefright/mpeg2ts/CasManager.cpp
@@ -52,8 +52,9 @@
         sp<IDescrambler> mDescrambler;
     };
     status_t initSession(
-             const sp<ICas>& cas, PidToSessionMap &sessionMap,
-             CasSession *session, unsigned programNumber, unsigned elementaryPID);
+            const sp<ICas>& cas,
+            PidToSessionMap &sessionMap,
+            CasSession *session);
     void closeSession(const sp<ICas>& cas, const CasSession &casSession);
 
     unsigned mProgramNumber;
@@ -88,14 +89,14 @@
 status_t ATSParser::CasManager::ProgramCasManager::setMediaCas(
         const sp<ICas> &cas, PidToSessionMap &sessionMap) {
     if (mHasProgramCas) {
-        return initSession(cas, sessionMap, &mProgramCas, mProgramNumber, 0);
+        return initSession(cas, sessionMap, &mProgramCas);
     }
+    // TODO: share session among streams that has identical CA_descriptors.
+    // For now, we open one session for each stream that has CA_descriptor.
     for (size_t index = 0; index < mStreamPidToCasMap.size(); index++) {
-        unsigned elementaryPID = mStreamPidToCasMap.keyAt(index);
-        status_t err;
-        if ((err = initSession(cas, sessionMap,
-                &mStreamPidToCasMap.editValueAt(index),
-                mProgramNumber, elementaryPID)) != OK) {
+        status_t err = initSession(
+                cas, sessionMap, &mStreamPidToCasMap.editValueAt(index));
+        if (err != OK) {
             return err;
         }
     }
@@ -121,8 +122,9 @@
 }
 
 status_t ATSParser::CasManager::ProgramCasManager::initSession(
-         const sp<ICas>& cas, PidToSessionMap &sessionMap,
-         CasSession *session, unsigned programNumber, unsigned elementaryPID) {
+         const sp<ICas>& cas,
+         PidToSessionMap &sessionMap,
+         CasSession *session) {
     sp<IServiceManager> sm = defaultServiceManager();
     sp<IBinder> casServiceBinder = sm->getService(String16("media.cas"));
     sp<IMediaCasService> casService =
@@ -137,13 +139,7 @@
     std::vector<uint8_t> sessionId;
     const CADescriptor &descriptor = session->mCADescriptor;
 
-    Status status;
-    if (elementaryPID == 0) {
-        status = cas->openSession(programNumber, &sessionId);
-    } else {
-        status = cas->openSessionForStream(
-                programNumber, elementaryPID, &sessionId);
-    }
+    Status status = cas->openSession(&sessionId);
     if (!status.isOk()) {
         ALOGE("Failed to open session: exception=%d, error=%d",
                 status.exceptionCode(), status.serviceSpecificErrorCode());