blob: 0be4f87b143b560e25eb2ec08ebf9f9d3c8e118c
1 | //#define LOG_NDEBUG 0 |
2 | #define LOG_TAG "ITv" |
3 | #include <utils/Log.h> |
4 | #include <stdint.h> |
5 | #include <sys/types.h> |
6 | #include <binder/Parcel.h> |
7 | #include <include/ITv.h> |
8 | |
9 | enum { |
10 | DISCONNECT = IBinder::FIRST_CALL_TRANSACTION, |
11 | START_PREVIEW, |
12 | SEND_COMMAND, |
13 | CONNECT, |
14 | LOCK, |
15 | UNLOCK, |
16 | TV_CMD, |
17 | TV_CREATE_SUBTITLE, |
18 | TV_CREATE_VIDEO_FRAME, |
19 | }; |
20 | |
21 | class BpTv: public BpInterface<ITv> { |
22 | public: |
23 | BpTv(const sp<IBinder> &impl) |
24 | : BpInterface<ITv>(impl) |
25 | { |
26 | } |
27 | |
28 | // disconnect from tv service |
29 | void disconnect() |
30 | { |
31 | Parcel data, reply; |
32 | data.writeInterfaceToken(ITv::getInterfaceDescriptor()); |
33 | remote()->transact(DISCONNECT, data, &reply); |
34 | } |
35 | |
36 | status_t processCmd(const Parcel &p, Parcel *r) |
37 | { |
38 | Parcel data, reply; |
39 | data.writeInterfaceToken(ITv::getInterfaceDescriptor()); |
40 | data.write(p.data(), p.dataSize()); |
41 | remote()->transact(TV_CMD, data, &reply); |
42 | r->write(reply.data(), reply.dataSize()); |
43 | r->setDataPosition(0); |
44 | return 0; |
45 | } |
46 | |
47 | virtual status_t createVideoFrame(const sp<IMemory> &share_mem, int iSourceMode, int iCapVideoLayerOnly) |
48 | { |
49 | Parcel data, reply; |
50 | data.writeInterfaceToken(ITv::getInterfaceDescriptor()); |
51 | data.writeStrongBinder(IInterface::asBinder(share_mem)); |
52 | data.writeInt32(iSourceMode); |
53 | data.writeInt32(iCapVideoLayerOnly); |
54 | remote()->transact(TV_CREATE_VIDEO_FRAME, data, &reply); |
55 | return reply.readInt32(); |
56 | } |
57 | |
58 | virtual status_t createSubtitle(const sp<IMemory> &share_mem) |
59 | { |
60 | Parcel data, reply; |
61 | data.writeInterfaceToken(ITv::getInterfaceDescriptor()); |
62 | data.writeStrongBinder(IInterface::asBinder(share_mem)); |
63 | remote()->transact(TV_CREATE_SUBTITLE, data, &reply); |
64 | return reply.readInt32(); |
65 | } |
66 | virtual status_t connect(const sp<ITvClient> &tvClient) |
67 | { |
68 | Parcel data, reply; |
69 | data.writeInterfaceToken(ITv::getInterfaceDescriptor()); |
70 | data.writeStrongBinder(IInterface::asBinder(tvClient)); |
71 | remote()->transact(CONNECT, data, &reply); |
72 | return reply.readInt32(); |
73 | } |
74 | virtual status_t lock() |
75 | { |
76 | Parcel data, reply; |
77 | data.writeInterfaceToken(ITv::getInterfaceDescriptor()); |
78 | remote()->transact(LOCK, data, &reply); |
79 | return reply.readInt32(); |
80 | } |
81 | virtual status_t unlock() |
82 | { |
83 | Parcel data, reply; |
84 | data.writeInterfaceToken(ITv::getInterfaceDescriptor()); |
85 | remote()->transact(UNLOCK, data, &reply); |
86 | return reply.readInt32(); |
87 | } |
88 | }; |
89 | |
90 | IMPLEMENT_META_INTERFACE(Tv, "android.amlogic.ITv"); |
91 | |
92 | status_t BnTv::onTransact( |
93 | uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) |
94 | { |
95 | switch (code) { |
96 | case DISCONNECT: { |
97 | CHECK_INTERFACE(ITv, data, reply); |
98 | disconnect(); |
99 | return NO_ERROR; |
100 | } |
101 | break; |
102 | case CONNECT: { |
103 | CHECK_INTERFACE(ITv, data, reply); |
104 | sp<ITvClient> tvClient = interface_cast<ITvClient>(data.readStrongBinder()); |
105 | reply->writeInt32(connect(tvClient)); |
106 | return NO_ERROR; |
107 | } |
108 | break; |
109 | case LOCK: { |
110 | CHECK_INTERFACE(ITv, data, reply); |
111 | reply->writeInt32(lock()); |
112 | return NO_ERROR; |
113 | } |
114 | break; |
115 | case UNLOCK: { |
116 | CHECK_INTERFACE(ITv, data, reply); |
117 | reply->writeInt32(unlock()); |
118 | return NO_ERROR; |
119 | } |
120 | break; |
121 | case TV_CMD: { |
122 | CHECK_INTERFACE(ITv, data, reply); |
123 | processCmd(data, reply); |
124 | //reply->write(tmp.data(), tmp.dataSize()); |
125 | return NO_ERROR; |
126 | } |
127 | case TV_CREATE_SUBTITLE: { |
128 | CHECK_INTERFACE(ITv, data, reply); |
129 | sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder()); |
130 | createSubtitle(buffer); |
131 | //reply->write(tmp.data(), tmp.dataSize()); |
132 | return NO_ERROR; |
133 | } |
134 | case TV_CREATE_VIDEO_FRAME: { |
135 | CHECK_INTERFACE(ITv, data, reply); |
136 | sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder()); |
137 | int srcMode = data.readInt32(); |
138 | int capVideoLayerOnly = data.readInt32(); |
139 | createVideoFrame(buffer, srcMode, capVideoLayerOnly); |
140 | //reply->write(tmp.data(), tmp.dataSize()); |
141 | return NO_ERROR; |
142 | } |
143 | break; |
144 | default: |
145 | return BBinder::onTransact(code, data, reply, flags); |
146 | } |
147 | } |
148 | |
149 |