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