xref: /aosp_15_r20/frameworks/native/include/media/cas/CasAPI.h (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #ifndef CAS_API_H_
18*38e8c45fSAndroid Build Coastguard Worker #define CAS_API_H_
19*38e8c45fSAndroid Build Coastguard Worker 
20*38e8c45fSAndroid Build Coastguard Worker #include <vector>
21*38e8c45fSAndroid Build Coastguard Worker #include <utils/String8.h>
22*38e8c45fSAndroid Build Coastguard Worker 
23*38e8c45fSAndroid Build Coastguard Worker //  Loadable CasPlugin shared libraries should define the entry points
24*38e8c45fSAndroid Build Coastguard Worker //  as shown below:
25*38e8c45fSAndroid Build Coastguard Worker //
26*38e8c45fSAndroid Build Coastguard Worker //  extern "C" {
27*38e8c45fSAndroid Build Coastguard Worker //      extern android::CasFactory *createCasFactory();
28*38e8c45fSAndroid Build Coastguard Worker //      extern android::DescramblerFactory *createDescramblerFactory();
29*38e8c45fSAndroid Build Coastguard Worker //  }
30*38e8c45fSAndroid Build Coastguard Worker 
31*38e8c45fSAndroid Build Coastguard Worker namespace android {
32*38e8c45fSAndroid Build Coastguard Worker 
33*38e8c45fSAndroid Build Coastguard Worker struct CasPlugin;
34*38e8c45fSAndroid Build Coastguard Worker 
35*38e8c45fSAndroid Build Coastguard Worker struct CasPluginDescriptor {
36*38e8c45fSAndroid Build Coastguard Worker     int32_t CA_system_id;
37*38e8c45fSAndroid Build Coastguard Worker     String8 name;
38*38e8c45fSAndroid Build Coastguard Worker };
39*38e8c45fSAndroid Build Coastguard Worker 
40*38e8c45fSAndroid Build Coastguard Worker typedef std::vector<uint8_t> CasData;
41*38e8c45fSAndroid Build Coastguard Worker typedef std::vector<uint8_t> CasSessionId;
42*38e8c45fSAndroid Build Coastguard Worker typedef std::vector<uint8_t> CasEmm;
43*38e8c45fSAndroid Build Coastguard Worker typedef std::vector<uint8_t> CasEcm;
44*38e8c45fSAndroid Build Coastguard Worker typedef void (*CasPluginCallback)(
45*38e8c45fSAndroid Build Coastguard Worker         void *appData,
46*38e8c45fSAndroid Build Coastguard Worker         int32_t event,
47*38e8c45fSAndroid Build Coastguard Worker         int32_t arg,
48*38e8c45fSAndroid Build Coastguard Worker         uint8_t *data,
49*38e8c45fSAndroid Build Coastguard Worker         size_t size);
50*38e8c45fSAndroid Build Coastguard Worker 
51*38e8c45fSAndroid Build Coastguard Worker typedef void (*CasPluginCallbackExt)(
52*38e8c45fSAndroid Build Coastguard Worker         void *appData,
53*38e8c45fSAndroid Build Coastguard Worker         int32_t event,
54*38e8c45fSAndroid Build Coastguard Worker         int32_t arg,
55*38e8c45fSAndroid Build Coastguard Worker         uint8_t *data,
56*38e8c45fSAndroid Build Coastguard Worker         size_t size,
57*38e8c45fSAndroid Build Coastguard Worker         const CasSessionId *sessionId);
58*38e8c45fSAndroid Build Coastguard Worker 
59*38e8c45fSAndroid Build Coastguard Worker typedef void (*CasPluginStatusCallback)(
60*38e8c45fSAndroid Build Coastguard Worker         void *appData,
61*38e8c45fSAndroid Build Coastguard Worker         int32_t event,
62*38e8c45fSAndroid Build Coastguard Worker         int32_t arg);
63*38e8c45fSAndroid Build Coastguard Worker 
64*38e8c45fSAndroid Build Coastguard Worker struct CasFactory {
CasFactoryCasFactory65*38e8c45fSAndroid Build Coastguard Worker     CasFactory() {}
~CasFactoryCasFactory66*38e8c45fSAndroid Build Coastguard Worker     virtual ~CasFactory() {}
67*38e8c45fSAndroid Build Coastguard Worker 
68*38e8c45fSAndroid Build Coastguard Worker     // Determine if the plugin can handle the CA scheme identified by CA_system_id.
69*38e8c45fSAndroid Build Coastguard Worker     virtual bool isSystemIdSupported(
70*38e8c45fSAndroid Build Coastguard Worker             int32_t CA_system_id) const = 0;
71*38e8c45fSAndroid Build Coastguard Worker 
72*38e8c45fSAndroid Build Coastguard Worker     // Get a list of the CA schemes supported by the plugin.
73*38e8c45fSAndroid Build Coastguard Worker     virtual status_t queryPlugins(
74*38e8c45fSAndroid Build Coastguard Worker             std::vector<CasPluginDescriptor> *descriptors) const = 0;
75*38e8c45fSAndroid Build Coastguard Worker 
76*38e8c45fSAndroid Build Coastguard Worker     // Construct a new instance of a CasPlugin given a CA_system_id
77*38e8c45fSAndroid Build Coastguard Worker     virtual status_t createPlugin(
78*38e8c45fSAndroid Build Coastguard Worker             int32_t CA_system_id,
79*38e8c45fSAndroid Build Coastguard Worker             void *appData,
80*38e8c45fSAndroid Build Coastguard Worker             CasPluginCallback callback,
81*38e8c45fSAndroid Build Coastguard Worker             CasPlugin **plugin) = 0;
82*38e8c45fSAndroid Build Coastguard Worker 
83*38e8c45fSAndroid Build Coastguard Worker     // Construct a new extend instance of a CasPlugin given a CA_system_id
84*38e8c45fSAndroid Build Coastguard Worker     virtual status_t createPlugin(
85*38e8c45fSAndroid Build Coastguard Worker             int32_t CA_system_id,
86*38e8c45fSAndroid Build Coastguard Worker             void *appData,
87*38e8c45fSAndroid Build Coastguard Worker             CasPluginCallbackExt callback,
88*38e8c45fSAndroid Build Coastguard Worker             CasPlugin **plugin) = 0;
89*38e8c45fSAndroid Build Coastguard Worker 
90*38e8c45fSAndroid Build Coastguard Worker private:
91*38e8c45fSAndroid Build Coastguard Worker     CasFactory(const CasFactory &);
92*38e8c45fSAndroid Build Coastguard Worker     CasFactory &operator=(const CasFactory &); /* NOLINT */
93*38e8c45fSAndroid Build Coastguard Worker };
94*38e8c45fSAndroid Build Coastguard Worker 
95*38e8c45fSAndroid Build Coastguard Worker struct CasPlugin {
CasPluginCasPlugin96*38e8c45fSAndroid Build Coastguard Worker     CasPlugin() {}
~CasPluginCasPlugin97*38e8c45fSAndroid Build Coastguard Worker     virtual ~CasPlugin() {}
98*38e8c45fSAndroid Build Coastguard Worker 
99*38e8c45fSAndroid Build Coastguard Worker     // Provide a callback to report plugin status
100*38e8c45fSAndroid Build Coastguard Worker     virtual status_t setStatusCallback(
101*38e8c45fSAndroid Build Coastguard Worker             CasPluginStatusCallback callback) = 0;
102*38e8c45fSAndroid Build Coastguard Worker 
103*38e8c45fSAndroid Build Coastguard Worker     // Provide the CA private data from a CA_descriptor in the conditional
104*38e8c45fSAndroid Build Coastguard Worker     // access table to a CasPlugin.
105*38e8c45fSAndroid Build Coastguard Worker     virtual status_t setPrivateData(
106*38e8c45fSAndroid Build Coastguard Worker             const CasData &privateData) = 0;
107*38e8c45fSAndroid Build Coastguard Worker 
108*38e8c45fSAndroid Build Coastguard Worker     // Open a session for descrambling a program, or one or more elementary
109*38e8c45fSAndroid Build Coastguard Worker     // streams.
110*38e8c45fSAndroid Build Coastguard Worker     virtual status_t openSession(CasSessionId *sessionId) = 0;
111*38e8c45fSAndroid Build Coastguard Worker 
112*38e8c45fSAndroid Build Coastguard Worker     // Open a session with intend and mode for descrambling a program, or one
113*38e8c45fSAndroid Build Coastguard Worker     // or more elementary streams.
114*38e8c45fSAndroid Build Coastguard Worker     virtual status_t openSession(uint32_t intent, uint32_t mode,
115*38e8c45fSAndroid Build Coastguard Worker                                      CasSessionId *sessionId) = 0;
116*38e8c45fSAndroid Build Coastguard Worker 
117*38e8c45fSAndroid Build Coastguard Worker     // Close a previously opened session.
118*38e8c45fSAndroid Build Coastguard Worker     virtual status_t closeSession(const CasSessionId &sessionId) = 0;
119*38e8c45fSAndroid Build Coastguard Worker 
120*38e8c45fSAndroid Build Coastguard Worker     // Provide the CA private data from a CA_descriptor in the program map
121*38e8c45fSAndroid Build Coastguard Worker     // table to a CasPlugin.
122*38e8c45fSAndroid Build Coastguard Worker     virtual status_t setSessionPrivateData(
123*38e8c45fSAndroid Build Coastguard Worker             const CasSessionId &sessionId,
124*38e8c45fSAndroid Build Coastguard Worker             const CasData &privateData) = 0;
125*38e8c45fSAndroid Build Coastguard Worker 
126*38e8c45fSAndroid Build Coastguard Worker     // Process an ECM from the ECM stream for this session’s elementary stream.
127*38e8c45fSAndroid Build Coastguard Worker     virtual status_t processEcm(
128*38e8c45fSAndroid Build Coastguard Worker             const CasSessionId &sessionId,
129*38e8c45fSAndroid Build Coastguard Worker             const CasEcm &ecm) = 0;
130*38e8c45fSAndroid Build Coastguard Worker 
131*38e8c45fSAndroid Build Coastguard Worker     // Process an in-band EMM from the EMM stream.
132*38e8c45fSAndroid Build Coastguard Worker     virtual status_t processEmm(
133*38e8c45fSAndroid Build Coastguard Worker             const CasEmm &emm) = 0;
134*38e8c45fSAndroid Build Coastguard Worker 
135*38e8c45fSAndroid Build Coastguard Worker     // Deliver an event to the CasPlugin. The format of the event is specific
136*38e8c45fSAndroid Build Coastguard Worker     // to the CA scheme and is opaque to the framework.
137*38e8c45fSAndroid Build Coastguard Worker     virtual status_t sendEvent(
138*38e8c45fSAndroid Build Coastguard Worker             int32_t event,
139*38e8c45fSAndroid Build Coastguard Worker             int32_t arg,
140*38e8c45fSAndroid Build Coastguard Worker             const CasData &eventData) = 0;
141*38e8c45fSAndroid Build Coastguard Worker 
142*38e8c45fSAndroid Build Coastguard Worker     // Deliver an session event to the CasPlugin. The format of the event is
143*38e8c45fSAndroid Build Coastguard Worker     // specific to the CA scheme and is opaque to the framework.
144*38e8c45fSAndroid Build Coastguard Worker     virtual status_t sendSessionEvent(
145*38e8c45fSAndroid Build Coastguard Worker             const CasSessionId &sessionId,
146*38e8c45fSAndroid Build Coastguard Worker             int32_t event,
147*38e8c45fSAndroid Build Coastguard Worker             int32_t arg,
148*38e8c45fSAndroid Build Coastguard Worker             const CasData &eventData) = 0;
149*38e8c45fSAndroid Build Coastguard Worker 
150*38e8c45fSAndroid Build Coastguard Worker    // Native implementation of the MediaCas Java API provision method.
151*38e8c45fSAndroid Build Coastguard Worker     virtual status_t provision(
152*38e8c45fSAndroid Build Coastguard Worker             const String8 &provisionString) = 0;
153*38e8c45fSAndroid Build Coastguard Worker 
154*38e8c45fSAndroid Build Coastguard Worker     // Native implementation of the MediaCas Java API refreshEntitlements method
155*38e8c45fSAndroid Build Coastguard Worker     virtual status_t refreshEntitlements(
156*38e8c45fSAndroid Build Coastguard Worker             int32_t refreshType,
157*38e8c45fSAndroid Build Coastguard Worker             const CasData &refreshData) = 0;
158*38e8c45fSAndroid Build Coastguard Worker 
159*38e8c45fSAndroid Build Coastguard Worker private:
160*38e8c45fSAndroid Build Coastguard Worker     CasPlugin(const CasPlugin &);
161*38e8c45fSAndroid Build Coastguard Worker     CasPlugin &operator=(const CasPlugin &); /* NOLINT */
162*38e8c45fSAndroid Build Coastguard Worker };
163*38e8c45fSAndroid Build Coastguard Worker 
164*38e8c45fSAndroid Build Coastguard Worker extern "C" {
165*38e8c45fSAndroid Build Coastguard Worker     extern android::CasFactory *createCasFactory();
166*38e8c45fSAndroid Build Coastguard Worker }
167*38e8c45fSAndroid Build Coastguard Worker 
168*38e8c45fSAndroid Build Coastguard Worker } // namespace android
169*38e8c45fSAndroid Build Coastguard Worker 
170*38e8c45fSAndroid Build Coastguard Worker #endif // CAS_API_H_
171