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