1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2010 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #ifndef __DRM_MANAGER_H__ 18*ec779b8eSAndroid Build Coastguard Worker #define __DRM_MANAGER_H__ 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include <drm/drm_framework_common.h> 21*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/AHandler.h> 22*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/ALooper.h> 23*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/AMessage.h> 24*ec779b8eSAndroid Build Coastguard Worker #include <sys/types.h> 25*ec779b8eSAndroid Build Coastguard Worker #include <utils/Errors.h> 26*ec779b8eSAndroid Build Coastguard Worker #include <utils/threads.h> 27*ec779b8eSAndroid Build Coastguard Worker 28*ec779b8eSAndroid Build Coastguard Worker #include "IDrmEngine.h" 29*ec779b8eSAndroid Build Coastguard Worker #include "PlugInManager.h" 30*ec779b8eSAndroid Build Coastguard Worker #include "IDrmServiceListener.h" 31*ec779b8eSAndroid Build Coastguard Worker 32*ec779b8eSAndroid Build Coastguard Worker #include <array> 33*ec779b8eSAndroid Build Coastguard Worker #include <cstddef> 34*ec779b8eSAndroid Build Coastguard Worker #include <map> 35*ec779b8eSAndroid Build Coastguard Worker #include <set> 36*ec779b8eSAndroid Build Coastguard Worker #include <string> 37*ec779b8eSAndroid Build Coastguard Worker #include <utility> 38*ec779b8eSAndroid Build Coastguard Worker #include <vector> 39*ec779b8eSAndroid Build Coastguard Worker 40*ec779b8eSAndroid Build Coastguard Worker namespace android { 41*ec779b8eSAndroid Build Coastguard Worker 42*ec779b8eSAndroid Build Coastguard Worker class IDrmManager; 43*ec779b8eSAndroid Build Coastguard Worker class DrmRegistrationInfo; 44*ec779b8eSAndroid Build Coastguard Worker class DrmUnregistrationInfo; 45*ec779b8eSAndroid Build Coastguard Worker class DrmRightsAcquisitionInfo; 46*ec779b8eSAndroid Build Coastguard Worker class DrmConstraints; 47*ec779b8eSAndroid Build Coastguard Worker class DrmMetadata; 48*ec779b8eSAndroid Build Coastguard Worker class DrmRights; 49*ec779b8eSAndroid Build Coastguard Worker class DrmInfo; 50*ec779b8eSAndroid Build Coastguard Worker class DrmInfoStatus; 51*ec779b8eSAndroid Build Coastguard Worker class DrmConvertedStatus; 52*ec779b8eSAndroid Build Coastguard Worker class DrmInfoRequest; 53*ec779b8eSAndroid Build Coastguard Worker class DrmSupportInfo; 54*ec779b8eSAndroid Build Coastguard Worker class ActionDescription; 55*ec779b8eSAndroid Build Coastguard Worker 56*ec779b8eSAndroid Build Coastguard Worker enum DrmManagerMethodId { 57*ec779b8eSAndroid Build Coastguard Worker GET_CONSTRAINTS, 58*ec779b8eSAndroid Build Coastguard Worker GET_METADATA, 59*ec779b8eSAndroid Build Coastguard Worker CAN_HANDLE, 60*ec779b8eSAndroid Build Coastguard Worker PROCESS_DRM_INFO, 61*ec779b8eSAndroid Build Coastguard Worker ACQUIRE_DRM_INFO, 62*ec779b8eSAndroid Build Coastguard Worker SAVE_RIGHTS, 63*ec779b8eSAndroid Build Coastguard Worker GET_ORIGINAL_MIME_TYPE, 64*ec779b8eSAndroid Build Coastguard Worker GET_DRM_OBJECT_TYPE, 65*ec779b8eSAndroid Build Coastguard Worker CHECK_RIGHTS_STATUS, 66*ec779b8eSAndroid Build Coastguard Worker REMOVE_RIGHTS, 67*ec779b8eSAndroid Build Coastguard Worker REMOVE_ALL_RIGHTS, 68*ec779b8eSAndroid Build Coastguard Worker OPEN_CONVERT_SESSION, 69*ec779b8eSAndroid Build Coastguard Worker OPEN_DECRYPT_SESSION, 70*ec779b8eSAndroid Build Coastguard Worker NUM_METHODS, 71*ec779b8eSAndroid Build Coastguard Worker }; 72*ec779b8eSAndroid Build Coastguard Worker 73*ec779b8eSAndroid Build Coastguard Worker struct DrmManagerMetrics { 74*ec779b8eSAndroid Build Coastguard Worker std::string mPluginId; 75*ec779b8eSAndroid Build Coastguard Worker std::string mDescription; 76*ec779b8eSAndroid Build Coastguard Worker std::set<std::string> mMimeTypes; 77*ec779b8eSAndroid Build Coastguard Worker std::array<int64_t, DrmManagerMethodId::NUM_METHODS> mMethodCounts{}; 78*ec779b8eSAndroid Build Coastguard Worker uid_t mCallingUid; 79*ec779b8eSAndroid Build Coastguard Worker }; 80*ec779b8eSAndroid Build Coastguard Worker 81*ec779b8eSAndroid Build Coastguard Worker /** 82*ec779b8eSAndroid Build Coastguard Worker * This is implementation class for DRM Manager. This class delegates the 83*ec779b8eSAndroid Build Coastguard Worker * functionality to corresponding DRM Engine. 84*ec779b8eSAndroid Build Coastguard Worker * 85*ec779b8eSAndroid Build Coastguard Worker * The DrmManagerService class creates an instance of this class. 86*ec779b8eSAndroid Build Coastguard Worker * 87*ec779b8eSAndroid Build Coastguard Worker */ 88*ec779b8eSAndroid Build Coastguard Worker class DrmManager : public AHandler, public IDrmEngine::OnInfoListener { 89*ec779b8eSAndroid Build Coastguard Worker public: 90*ec779b8eSAndroid Build Coastguard Worker DrmManager(); 91*ec779b8eSAndroid Build Coastguard Worker virtual ~DrmManager(); 92*ec779b8eSAndroid Build Coastguard Worker 93*ec779b8eSAndroid Build Coastguard Worker public: 94*ec779b8eSAndroid Build Coastguard Worker int addUniqueId(bool isNative); 95*ec779b8eSAndroid Build Coastguard Worker 96*ec779b8eSAndroid Build Coastguard Worker void removeUniqueId(int uniqueId); 97*ec779b8eSAndroid Build Coastguard Worker 98*ec779b8eSAndroid Build Coastguard Worker void addClient(int uniqueId); 99*ec779b8eSAndroid Build Coastguard Worker 100*ec779b8eSAndroid Build Coastguard Worker void removeClient(int uniqueId); 101*ec779b8eSAndroid Build Coastguard Worker 102*ec779b8eSAndroid Build Coastguard Worker status_t loadPlugIns(); 103*ec779b8eSAndroid Build Coastguard Worker 104*ec779b8eSAndroid Build Coastguard Worker status_t loadPlugIns(const String8& plugInDirPath); 105*ec779b8eSAndroid Build Coastguard Worker 106*ec779b8eSAndroid Build Coastguard Worker status_t unloadPlugIns(); 107*ec779b8eSAndroid Build Coastguard Worker 108*ec779b8eSAndroid Build Coastguard Worker status_t setDrmServiceListener( 109*ec779b8eSAndroid Build Coastguard Worker int uniqueId, const sp<IDrmServiceListener>& drmServiceListener); 110*ec779b8eSAndroid Build Coastguard Worker 111*ec779b8eSAndroid Build Coastguard Worker DrmConstraints* getConstraints(int uniqueId, const String8* path, const int action); 112*ec779b8eSAndroid Build Coastguard Worker 113*ec779b8eSAndroid Build Coastguard Worker DrmMetadata* getMetadata(int uniqueId, const String8* path); 114*ec779b8eSAndroid Build Coastguard Worker 115*ec779b8eSAndroid Build Coastguard Worker bool canHandle(int uniqueId, const String8& path, const String8& mimeType); 116*ec779b8eSAndroid Build Coastguard Worker 117*ec779b8eSAndroid Build Coastguard Worker DrmInfoStatus* processDrmInfo(int uniqueId, const DrmInfo* drmInfo); 118*ec779b8eSAndroid Build Coastguard Worker 119*ec779b8eSAndroid Build Coastguard Worker DrmInfo* acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest); 120*ec779b8eSAndroid Build Coastguard Worker 121*ec779b8eSAndroid Build Coastguard Worker status_t saveRights(int uniqueId, const DrmRights& drmRights, 122*ec779b8eSAndroid Build Coastguard Worker const String8& rightsPath, const String8& contentPath); 123*ec779b8eSAndroid Build Coastguard Worker 124*ec779b8eSAndroid Build Coastguard Worker String8 getOriginalMimeType(int uniqueId, const String8& path, int fd); 125*ec779b8eSAndroid Build Coastguard Worker 126*ec779b8eSAndroid Build Coastguard Worker int getDrmObjectType(int uniqueId, const String8& path, const String8& mimeType); 127*ec779b8eSAndroid Build Coastguard Worker 128*ec779b8eSAndroid Build Coastguard Worker int checkRightsStatus(int uniqueId, const String8& path, int action); 129*ec779b8eSAndroid Build Coastguard Worker 130*ec779b8eSAndroid Build Coastguard Worker status_t consumeRights(int uniqueId, sp<DecryptHandle>& decryptHandle, int action, 131*ec779b8eSAndroid Build Coastguard Worker bool reserve); 132*ec779b8eSAndroid Build Coastguard Worker 133*ec779b8eSAndroid Build Coastguard Worker status_t setPlaybackStatus( 134*ec779b8eSAndroid Build Coastguard Worker int uniqueId, sp<DecryptHandle>& decryptHandle, int playbackStatus, int64_t position); 135*ec779b8eSAndroid Build Coastguard Worker 136*ec779b8eSAndroid Build Coastguard Worker bool validateAction( 137*ec779b8eSAndroid Build Coastguard Worker int uniqueId, const String8& path, int action, const ActionDescription& description); 138*ec779b8eSAndroid Build Coastguard Worker 139*ec779b8eSAndroid Build Coastguard Worker status_t removeRights(int uniqueId, const String8& path); 140*ec779b8eSAndroid Build Coastguard Worker 141*ec779b8eSAndroid Build Coastguard Worker status_t removeAllRights(int uniqueId); 142*ec779b8eSAndroid Build Coastguard Worker 143*ec779b8eSAndroid Build Coastguard Worker int openConvertSession(int uniqueId, const String8& mimeType); 144*ec779b8eSAndroid Build Coastguard Worker 145*ec779b8eSAndroid Build Coastguard Worker DrmConvertedStatus* convertData(int uniqueId, int convertId, const DrmBuffer* inputData); 146*ec779b8eSAndroid Build Coastguard Worker 147*ec779b8eSAndroid Build Coastguard Worker DrmConvertedStatus* closeConvertSession(int uniqueId, int convertId); 148*ec779b8eSAndroid Build Coastguard Worker 149*ec779b8eSAndroid Build Coastguard Worker status_t getAllSupportInfo(int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray); 150*ec779b8eSAndroid Build Coastguard Worker 151*ec779b8eSAndroid Build Coastguard Worker sp<DecryptHandle> openDecryptSession( 152*ec779b8eSAndroid Build Coastguard Worker int uniqueId, int fd, off64_t offset, off64_t length, const char* mime); 153*ec779b8eSAndroid Build Coastguard Worker 154*ec779b8eSAndroid Build Coastguard Worker sp<DecryptHandle> openDecryptSession(int uniqueId, const char* uri, const char* mime); 155*ec779b8eSAndroid Build Coastguard Worker 156*ec779b8eSAndroid Build Coastguard Worker sp<DecryptHandle> openDecryptSession(int uniqueId, const DrmBuffer& buf, 157*ec779b8eSAndroid Build Coastguard Worker const String8& mimeType); 158*ec779b8eSAndroid Build Coastguard Worker 159*ec779b8eSAndroid Build Coastguard Worker status_t closeDecryptSession(int uniqueId, sp<DecryptHandle>& decryptHandle); 160*ec779b8eSAndroid Build Coastguard Worker 161*ec779b8eSAndroid Build Coastguard Worker status_t initializeDecryptUnit(int uniqueId, sp<DecryptHandle>& decryptHandle, 162*ec779b8eSAndroid Build Coastguard Worker int decryptUnitId, const DrmBuffer* headerInfo); 163*ec779b8eSAndroid Build Coastguard Worker 164*ec779b8eSAndroid Build Coastguard Worker status_t decrypt(int uniqueId, sp<DecryptHandle>& decryptHandle, int decryptUnitId, 165*ec779b8eSAndroid Build Coastguard Worker const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV); 166*ec779b8eSAndroid Build Coastguard Worker 167*ec779b8eSAndroid Build Coastguard Worker status_t finalizeDecryptUnit(int uniqueId, sp<DecryptHandle>& decryptHandle, 168*ec779b8eSAndroid Build Coastguard Worker int decryptUnitId); 169*ec779b8eSAndroid Build Coastguard Worker 170*ec779b8eSAndroid Build Coastguard Worker ssize_t pread(int uniqueId, sp<DecryptHandle>& decryptHandle, 171*ec779b8eSAndroid Build Coastguard Worker void* buffer, ssize_t numBytes, off64_t offset); 172*ec779b8eSAndroid Build Coastguard Worker 173*ec779b8eSAndroid Build Coastguard Worker void onInfo(const DrmInfoEvent& event); 174*ec779b8eSAndroid Build Coastguard Worker 175*ec779b8eSAndroid Build Coastguard Worker void initMetricsLooper(); 176*ec779b8eSAndroid Build Coastguard Worker 177*ec779b8eSAndroid Build Coastguard Worker private: 178*ec779b8eSAndroid Build Coastguard Worker String8 getSupportedPlugInId(int uniqueId, const String8& path, const String8& mimeType); 179*ec779b8eSAndroid Build Coastguard Worker 180*ec779b8eSAndroid Build Coastguard Worker String8 getSupportedPlugInId(const String8& mimeType); 181*ec779b8eSAndroid Build Coastguard Worker 182*ec779b8eSAndroid Build Coastguard Worker String8 getSupportedPlugInIdFromPath(int uniqueId, const String8& path); 183*ec779b8eSAndroid Build Coastguard Worker 184*ec779b8eSAndroid Build Coastguard Worker bool canHandle(int uniqueId, const String8& path); 185*ec779b8eSAndroid Build Coastguard Worker 186*ec779b8eSAndroid Build Coastguard Worker void onMessageReceived(const sp<AMessage> &msg); 187*ec779b8eSAndroid Build Coastguard Worker 188*ec779b8eSAndroid Build Coastguard Worker int64_t getMetricsFlushPeriodUs(); 189*ec779b8eSAndroid Build Coastguard Worker 190*ec779b8eSAndroid Build Coastguard Worker void recordEngineMetrics(const char func[], 191*ec779b8eSAndroid Build Coastguard Worker const String8& plugInId, const String8& mimeType = String8("")); 192*ec779b8eSAndroid Build Coastguard Worker 193*ec779b8eSAndroid Build Coastguard Worker void flushEngineMetrics(); 194*ec779b8eSAndroid Build Coastguard Worker 195*ec779b8eSAndroid Build Coastguard Worker private: 196*ec779b8eSAndroid Build Coastguard Worker enum { 197*ec779b8eSAndroid Build Coastguard Worker kMaxNumUniqueIds = 0x1000, 198*ec779b8eSAndroid Build Coastguard Worker kWhatFlushMetrics = 'metr', 199*ec779b8eSAndroid Build Coastguard Worker }; 200*ec779b8eSAndroid Build Coastguard Worker 201*ec779b8eSAndroid Build Coastguard Worker bool mUniqueIdArray[kMaxNumUniqueIds]; 202*ec779b8eSAndroid Build Coastguard Worker static const String8 EMPTY_STRING; 203*ec779b8eSAndroid Build Coastguard Worker static const std::map<const char*, size_t> kMethodIdMap; 204*ec779b8eSAndroid Build Coastguard Worker 205*ec779b8eSAndroid Build Coastguard Worker int mDecryptSessionId; 206*ec779b8eSAndroid Build Coastguard Worker int mConvertId; 207*ec779b8eSAndroid Build Coastguard Worker Mutex mLock; 208*ec779b8eSAndroid Build Coastguard Worker Mutex mListenerLock; 209*ec779b8eSAndroid Build Coastguard Worker Mutex mDecryptLock; 210*ec779b8eSAndroid Build Coastguard Worker Mutex mConvertLock; 211*ec779b8eSAndroid Build Coastguard Worker Mutex mMetricsLock; 212*ec779b8eSAndroid Build Coastguard Worker TPlugInManager<IDrmEngine> mPlugInManager; 213*ec779b8eSAndroid Build Coastguard Worker KeyedVector< DrmSupportInfo, String8 > mSupportInfoToPlugInIdMap; 214*ec779b8eSAndroid Build Coastguard Worker KeyedVector< int, IDrmEngine*> mConvertSessionMap; 215*ec779b8eSAndroid Build Coastguard Worker KeyedVector< int, sp<IDrmServiceListener> > mServiceListeners; 216*ec779b8eSAndroid Build Coastguard Worker KeyedVector< int, IDrmEngine*> mDecryptSessionMap; 217*ec779b8eSAndroid Build Coastguard Worker 218*ec779b8eSAndroid Build Coastguard Worker std::map<std::pair<uid_t, std::string>, DrmManagerMetrics> mPluginMetrics; 219*ec779b8eSAndroid Build Coastguard Worker sp<ALooper> mMetricsLooper; 220*ec779b8eSAndroid Build Coastguard Worker }; 221*ec779b8eSAndroid Build Coastguard Worker 222*ec779b8eSAndroid Build Coastguard Worker }; 223*ec779b8eSAndroid Build Coastguard Worker 224*ec779b8eSAndroid Build Coastguard Worker #endif /* __DRM_MANAGER_H__ */ 225*ec779b8eSAndroid Build Coastguard Worker 226