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