1783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang/*
2783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang * Copyright (C) 2017 The Android Open Source Project
3783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang *
4783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang * Licensed under the Apache License, Version 2.0 (the "License");
5783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang * you may not use this file except in compliance with the License.
6783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang * You may obtain a copy of the License at
7783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang *
8783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang *      http://www.apache.org/licenses/LICENSE-2.0
9783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang *
10783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang * Unless required by applicable law or agreed to in writing, software
11783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang * distributed under the License is distributed on an "AS IS" BASIS,
12783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang * See the License for the specific language governing permissions and
14783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang * limitations under the License.
15783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang */
16783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
17783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang#ifndef CAS_API_H_
18783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang#define CAS_API_H_
19783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
20783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang#include <vector>
21783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang#include <utils/String8.h>
22783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
23783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang//  Loadable CasPlugin shared libraries should define the entry points
24783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang//  as shown below:
25783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang//
26783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang//  extern "C" {
27783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang//      extern android::CasFactory *createCasFactory();
28783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang//      extern android::DescramblerFactory *createDescramblerFactory();
29783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang//  }
30783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
31783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhangnamespace android {
32783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
33783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhangstruct CasPlugin;
34783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
35783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhangstruct CasPluginDescriptor {
36783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    int32_t CA_system_id;
37783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    String8 name;
38783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang};
39783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
40783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhangtypedef std::vector<uint8_t> CasData;
41783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhangtypedef std::vector<uint8_t> CasSessionId;
42783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhangtypedef std::vector<uint8_t> CasEmm;
43783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhangtypedef std::vector<uint8_t> CasEcm;
44783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhangtypedef void (*CasPluginCallback)(
45783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang        void *appData,
46783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang        int32_t event,
47783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang        int32_t arg,
48783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang        uint8_t *data,
49783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang        size_t size);
50783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
51783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhangstruct CasFactory {
52783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    CasFactory() {}
53783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    virtual ~CasFactory() {}
54783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
55783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    // Determine if the plugin can handle the CA scheme identified by CA_system_id.
56783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    virtual bool isSystemIdSupported(
57783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang            int32_t CA_system_id) const = 0;
58783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
59783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    // Get a list of the CA schemes supported by the plugin.
60783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    virtual status_t queryPlugins(
61783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang            std::vector<CasPluginDescriptor> *descriptors) const = 0;
62783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
63783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    // Construct a new instance of a CasPlugin given a CA_system_id
64783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    virtual status_t createPlugin(
65783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang            int32_t CA_system_id,
66bf45d7e90e487346a3088e78ebb261c3220fa983Chong Zhang            void *appData,
67783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang            CasPluginCallback callback,
68783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang            CasPlugin **plugin) = 0;
69783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
70783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhangprivate:
71783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    CasFactory(const CasFactory &);
72783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    CasFactory &operator=(const CasFactory &); /* NOLINT */
73783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang};
74783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
75783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhangstruct CasPlugin {
76783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    CasPlugin() {}
77783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    virtual ~CasPlugin() {}
78783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
79783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    // Provide the CA private data from a CA_descriptor in the conditional
80783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    // access table to a CasPlugin.
81783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    virtual status_t setPrivateData(
82783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang            const CasData &privateData) = 0;
83783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
8445387bbe7a7b92292c60f295d3a1a4cd6ad30174Chong Zhang    // Open a session for descrambling a program, or one or more elementary
8545387bbe7a7b92292c60f295d3a1a4cd6ad30174Chong Zhang    // streams.
8645387bbe7a7b92292c60f295d3a1a4cd6ad30174Chong Zhang    virtual status_t openSession(CasSessionId *sessionId) = 0;
87783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
88783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    // Close a previously opened session.
8945387bbe7a7b92292c60f295d3a1a4cd6ad30174Chong Zhang    virtual status_t closeSession(const CasSessionId &sessionId) = 0;
90783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
91783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    // Provide the CA private data from a CA_descriptor in the program map
92783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    // table to a CasPlugin.
93783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    virtual status_t setSessionPrivateData(
94783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang            const CasSessionId &sessionId,
95783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang            const CasData &privateData) = 0;
96783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
97783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    // Process an ECM from the ECM stream for this session’s elementary stream.
98783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    virtual status_t processEcm(
99783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang            const CasSessionId &sessionId,
100783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang            const CasEcm &ecm) = 0;
101783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
102783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    // Process an in-band EMM from the EMM stream.
103783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    virtual status_t processEmm(
104783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang            const CasEmm &emm) = 0;
105783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
106783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    // Deliver an event to the CasPlugin. The format of the event is specific
107783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    // to the CA scheme and is opaque to the framework.
108783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    virtual status_t sendEvent(
109783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang            int32_t event,
110783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang            int32_t arg,
111783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang            const CasData &eventData) = 0;
112783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
113783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    // Native implementation of the MediaCas Java API provision method.
114783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    virtual status_t provision(
115783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang            const String8 &provisionString) = 0;
116783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
117783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    // Native implementation of the MediaCas Java API refreshEntitlements method
118783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    virtual status_t refreshEntitlements(
119783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang            int32_t refreshType,
120783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang            const CasData &refreshData) = 0;
121783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
122783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhangprivate:
123783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    CasPlugin(const CasPlugin &);
124783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    CasPlugin &operator=(const CasPlugin &); /* NOLINT */
125783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang};
126783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
127783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhangextern "C" {
128783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang    extern android::CasFactory *createCasFactory();
129783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang}
130783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
131783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang} // namespace android
132783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang
133783c33e19c81d1b4c23664060e8d3a0b59fa7961Chong Zhang#endif // CAS_API_H_
134