1cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania/* 2cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania * Copyright (C) 2017 The Android Open Source Project 3cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania * 4cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania * Licensed under the Apache License, Version 2.0 (the "License"); 5cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania * you may not use this file except in compliance with the License. 6cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania * You may obtain a copy of the License at 7cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania * 8cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania * http://www.apache.org/licenses/LICENSE-2.0 9cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania * 10cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania * Unless required by applicable law or agreed to in writing, software 11cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania * distributed under the License is distributed on an "AS IS" BASIS, 12cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania * See the License for the specific language governing permissions and 14cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania * limitations under the License. 15cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania */ 16cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 17cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania#ifndef NUPLAYER_DRM_H_ 18cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania#define NUPLAYER_DRM_H_ 19cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 20cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania#include <binder/Parcel.h> 21cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania#include <media/ICrypto.h> 22cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania#include <media/IDrm.h> 23cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania#include <media/stagefright/MetaData.h> // for CryptInfo 24cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 25cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 26cefac14261a32fb856b0d1ab31541787112e306eHassan Shojanianamespace android { 27cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 28cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania struct DrmUUID { 29cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania static const int UUID_SIZE = 16; 30cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 31cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania DrmUUID() { 32cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania memset(this->uuid, 0, sizeof(uuid)); 33cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania } 34cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 35cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania // to allow defining Vector/KeyedVector of UUID type 36cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania DrmUUID(const DrmUUID &a) { 37cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania memcpy(this->uuid, a.uuid, sizeof(uuid)); 38cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania } 39cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 40cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania // to allow defining Vector/KeyedVector of UUID type 41cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania DrmUUID(const uint8_t uuid_in[UUID_SIZE]) { 42cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania memcpy(this->uuid, uuid_in, sizeof(uuid)); 43cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania } 44cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 45cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania const uint8_t *ptr() const { 46cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania return uuid; 47cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania } 48cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 49cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania String8 toHexString() const { 50cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania return arrayToHex(uuid, UUID_SIZE); 51cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania } 52cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 53cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania static String8 toHexString(const uint8_t uuid_in[UUID_SIZE]) { 54cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania return arrayToHex(uuid_in, UUID_SIZE); 55cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania } 56cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 57cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania static String8 arrayToHex(const uint8_t *array, int bytes) { 58cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania String8 result; 59cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania for (int i = 0; i < bytes; i++) { 60cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania result.appendFormat("%02x", array[i]); 61cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania } 62cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 63cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania return result; 64cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania } 65cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 66cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania protected: 67cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania uint8_t uuid[UUID_SIZE]; 68cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania }; 69cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 70cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 71cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania struct NuPlayerDrm { 72cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 73cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania // static helpers - internal 74cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 75cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania protected: 76cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania static sp<IDrm> CreateDrm(status_t *pstatus); 77cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania static sp<ICrypto> createCrypto(status_t *pstatus); 78cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania static Vector<DrmUUID> parsePSSH(const void *pssh, size_t psshsize); 79cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania static Vector<DrmUUID> getSupportedDrmSchemes(const void *pssh, size_t psshsize); 80cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 81cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania // static helpers - public 82cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 83cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania public: 84cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania static sp<ICrypto> createCryptoAndPlugin(const uint8_t uuid[16], 85cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania const Vector<uint8_t> &drmSessionId, status_t &status); 86cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania // Parcel has only private copy constructor so passing it in rather than returning 87dd4ce1877814d6fb005e89021272feb3ccfb81d0Hassan Shojania static void retrieveDrmInfo(const void *pssh, size_t psshsize, Parcel *parcel); 88cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 89cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania //////////////////////////////////////////////////////////////////////////////////////////// 90cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania /// Helpers for NuPlayerDecoder 91cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania //////////////////////////////////////////////////////////////////////////////////////////// 92cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 93cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania static const uint8_t kBlockSize = 16; // AES_BLOCK_SIZE 94cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 95cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania struct CryptoInfo { 96cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania int numSubSamples; 97cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania uint8_t key[kBlockSize]; 98cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania uint8_t iv[kBlockSize]; 99cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania CryptoPlugin::Mode mode; 100cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania CryptoPlugin::Pattern pattern; 101cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania CryptoPlugin::SubSample *subSamples; 102cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania }; 103cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 104cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania static CryptoInfo *makeCryptoInfo( 105cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania int numSubSamples, 106cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania uint8_t key[kBlockSize], 107cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania uint8_t iv[kBlockSize], 108cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania CryptoPlugin::Mode mode, 109cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania size_t *clearbytes, 110cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania size_t *encryptedbytes); 111cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 112cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania static CryptoInfo *getSampleCryptoInfo(sp<MetaData> meta); 113cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 114cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania }; // NuPlayerDrm 115cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 116cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania} // android 117cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania 118cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania#endif //NUPLAYER_DRM_H_ 119