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