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