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