1e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/* 2e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Copyright (C) 2012 The Android Open Source Project 3e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 4e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Licensed under the Apache License, Version 2.0 (the "License"); 5e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * you may not use this file except in compliance with the License. 6e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * You may obtain a copy of the License at 7e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 8e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * http://www.apache.org/licenses/LICENSE-2.0 9e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 10e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Unless required by applicable law or agreed to in writing, software 11e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * distributed under the License is distributed on an "AS IS" BASIS, 12e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * See the License for the specific language governing permissions and 14e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * limitations under the License. 15e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */ 16e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 17e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <binder/IInterface.h> 18e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/hardware/HDCPAPI.h> 19e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/stagefright/foundation/ABase.h> 20e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <ui/GraphicBuffer.h> 21e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 22e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramannamespace android { 23e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 24e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct IHDCPObserver : public IInterface { 25e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman DECLARE_META_INTERFACE(HDCPObserver); 26e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 27e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual void notify( 28e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int msg, int ext1, int ext2, const Parcel *obj) = 0; 29e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 30e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanprivate: 31e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman DISALLOW_EVIL_CONSTRUCTORS(IHDCPObserver); 32e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}; 33e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 34e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct IHDCP : public IInterface { 35e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman DECLARE_META_INTERFACE(HDCP); 36e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 37e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // Called to specify the observer that receives asynchronous notifications 38e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // from the HDCP implementation to signal completion/failure of asynchronous 39e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // operations (such as initialization) or out of band events. 40e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t setObserver(const sp<IHDCPObserver> &observer) = 0; 41e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 42e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // Request to setup an HDCP session with the specified host listening 43e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // on the specified port. 44e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t initAsync(const char *host, unsigned port) = 0; 45e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 46e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // Request to shutdown the active HDCP session. 47e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t shutdownAsync() = 0; 48e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 49e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // Returns the capability bitmask of this HDCP session. 50e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // Possible return values (please refer to HDCAPAPI.h): 51e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // HDCP_CAPS_ENCRYPT: mandatory, meaning the HDCP module can encrypt 52e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // from an input byte-array buffer to an output byte-array buffer 53e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // HDCP_CAPS_ENCRYPT_NATIVE: the HDCP module supports encryption from 54e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // a native buffer to an output byte-array buffer. The format of the 55e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // input native buffer is specific to vendor's encoder implementation. 56e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // It is the same format as that used by the encoder when 57e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // "storeMetaDataInBuffers" extension is enabled on its output port. 58e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual uint32_t getCaps() = 0; 59e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 60e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // ENCRYPTION only: 61e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // Encrypt data according to the HDCP spec. "size" bytes of data are 62e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // available at "inData" (virtual address), "size" may not be a multiple 63e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // of 128 bits (16 bytes). An equal number of encrypted bytes should be 64e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // written to the buffer at "outData" (virtual address). 65e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // This operation is to be synchronous, i.e. this call does not return 66e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // until outData contains size bytes of encrypted data. 67e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // streamCTR will be assigned by the caller (to 0 for the first PES stream, 68e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // 1 for the second and so on) 69e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // inputCTR _will_be_maintained_by_the_callee_ for each PES stream. 70e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t encrypt( 71e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman const void *inData, size_t size, uint32_t streamCTR, 72e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman uint64_t *outInputCTR, void *outData) = 0; 73e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 74e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // Encrypt data according to the HDCP spec. "size" bytes of data starting 75e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // at location "offset" are available in "buffer" (buffer handle). "size" 76e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // may not be a multiple of 128 bits (16 bytes). An equal number of 77e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // encrypted bytes should be written to the buffer at "outData" (virtual 78e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // address). This operation is to be synchronous, i.e. this call does not 79e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // return until outData contains size bytes of encrypted data. 80e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // streamCTR will be assigned by the caller (to 0 for the first PES stream, 81e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // 1 for the second and so on) 82e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // inputCTR _will_be_maintained_by_the_callee_ for each PES stream. 83e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t encryptNative( 84e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman const sp<GraphicBuffer> &graphicBuffer, 85e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman size_t offset, size_t size, uint32_t streamCTR, 86e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman uint64_t *outInputCTR, void *outData) = 0; 87e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 88e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // DECRYPTION only: 89e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // Decrypt data according to the HDCP spec. 90e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // "size" bytes of encrypted data are available at "inData" 91e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // (virtual address), "size" may not be a multiple of 128 bits (16 bytes). 92e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // An equal number of decrypted bytes should be written to the buffer 93e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // at "outData" (virtual address). 94e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // This operation is to be synchronous, i.e. this call does not return 95e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // until outData contains size bytes of decrypted data. 96e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman // Both streamCTR and inputCTR will be provided by the caller. 97e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t decrypt( 98e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman const void *inData, size_t size, 99e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman uint32_t streamCTR, uint64_t inputCTR, 100e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman void *outData) = 0; 101e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 102e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanprivate: 103e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman DISALLOW_EVIL_CONSTRUCTORS(IHDCP); 104e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}; 105e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 106e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct BnHDCPObserver : public BnInterface<IHDCPObserver> { 107e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t onTransact( 108e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman uint32_t code, const Parcel &data, Parcel *reply, 109e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman uint32_t flags = 0); 110e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}; 111e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 112e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct BnHDCP : public BnInterface<IHDCP> { 113e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t onTransact( 114e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman uint32_t code, const Parcel &data, Parcel *reply, 115e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman uint32_t flags = 0); 116e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}; 117e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 118e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman} // namespace android 119e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 120e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 121