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