blob: 5bbb2f0e618d0ba227ef130fbad97363739bab8d [file] [log] [blame]
James Dong27c17442011-03-17 11:02:04 -07001/*
2 * Copyright (c) 2009 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
Andreas Huber20111aa2009-07-14 16:56:47 -070017//#define LOG_NDEBUG 0
18#define LOG_TAG "IOMX"
19#include <utils/Log.h>
20
21#include <binder/IMemory.h>
22#include <binder/Parcel.h>
23#include <media/IOMX.h>
Andreas Huberb3912902011-01-19 10:34:52 -080024#include <media/stagefright/foundation/ADebug.h>
Andreas Huber20111aa2009-07-14 16:56:47 -070025
26namespace android {
27
28enum {
29 CONNECT = IBinder::FIRST_CALL_TRANSACTION,
Andreas Huber7eaa9c92010-01-15 15:28:19 -080030 LIVES_LOCALLY,
Andreas Huber20111aa2009-07-14 16:56:47 -070031 LIST_NODES,
32 ALLOCATE_NODE,
33 FREE_NODE,
34 SEND_COMMAND,
35 GET_PARAMETER,
36 SET_PARAMETER,
Andreas Huber693d2712009-08-14 14:37:10 -070037 GET_CONFIG,
38 SET_CONFIG,
Jamie Gennisb1d666f2011-10-19 21:14:13 -070039 GET_STATE,
Jamie Gennis83750ea2010-08-30 16:48:38 -070040 ENABLE_GRAPHIC_BUFFERS,
Andreas Huber20111aa2009-07-14 16:56:47 -070041 USE_BUFFER,
Jamie Gennis83750ea2010-08-30 16:48:38 -070042 USE_GRAPHIC_BUFFER,
Andy McFadden7cd58532013-02-19 07:28:30 -080043 CREATE_INPUT_SURFACE,
44 SIGNAL_END_OF_INPUT_STREAM,
James Donge8707722010-10-20 17:38:41 -070045 STORE_META_DATA_IN_BUFFERS,
Andreas Huber20111aa2009-07-14 16:56:47 -070046 ALLOC_BUFFER,
47 ALLOC_BUFFER_WITH_BACKUP,
48 FREE_BUFFER,
Andreas Huber20111aa2009-07-14 16:56:47 -070049 FILL_BUFFER,
50 EMPTY_BUFFER,
Andreas Huber693d2712009-08-14 14:37:10 -070051 GET_EXTENSION_INDEX,
Andreas Huber20111aa2009-07-14 16:56:47 -070052 OBSERVER_ON_MSG,
Jamie Gennise2ce6452011-02-23 19:01:28 -080053 GET_GRAPHIC_BUFFER_USAGE,
Andreas Hubere40cda72013-07-17 13:55:26 -070054 SET_INTERNAL_OPTION,
Andreas Huber20111aa2009-07-14 16:56:47 -070055};
56
Andreas Huber20111aa2009-07-14 16:56:47 -070057class BpOMX : public BpInterface<IOMX> {
58public:
59 BpOMX(const sp<IBinder> &impl)
60 : BpInterface<IOMX>(impl) {
61 }
62
Andreas Huberd459b482012-01-31 11:16:24 -080063 virtual bool livesLocally(node_id node, pid_t pid) {
Andreas Huber7eaa9c92010-01-15 15:28:19 -080064 Parcel data, reply;
65 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberd459b482012-01-31 11:16:24 -080066 data.writeIntPtr((intptr_t)node);
Andreas Huber7eaa9c92010-01-15 15:28:19 -080067 data.writeInt32(pid);
68 remote()->transact(LIVES_LOCALLY, data, &reply);
69
70 return reply.readInt32() != 0;
71 }
72
Andreas Huber134ee6a2009-12-16 09:30:55 -080073 virtual status_t listNodes(List<ComponentInfo> *list) {
Andreas Huber20111aa2009-07-14 16:56:47 -070074 list->clear();
75
76 Parcel data, reply;
77 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
78 remote()->transact(LIST_NODES, data, &reply);
79
80 int32_t n = reply.readInt32();
81 for (int32_t i = 0; i < n; ++i) {
Andreas Huber134ee6a2009-12-16 09:30:55 -080082 list->push_back(ComponentInfo());
83 ComponentInfo &info = *--list->end();
Andreas Huber20111aa2009-07-14 16:56:47 -070084
Andreas Huber134ee6a2009-12-16 09:30:55 -080085 info.mName = reply.readString8();
86 int32_t numRoles = reply.readInt32();
87 for (int32_t j = 0; j < numRoles; ++j) {
88 info.mRoles.push_back(reply.readString8());
89 }
Andreas Huber20111aa2009-07-14 16:56:47 -070090 }
91
92 return OK;
93 }
94
Andreas Huber318ad9c2009-10-15 13:46:54 -070095 virtual status_t allocateNode(
96 const char *name, const sp<IOMXObserver> &observer, node_id *node) {
Andreas Huber20111aa2009-07-14 16:56:47 -070097 Parcel data, reply;
98 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
99 data.writeCString(name);
Andreas Huber318ad9c2009-10-15 13:46:54 -0700100 data.writeStrongBinder(observer->asBinder());
Andreas Huber20111aa2009-07-14 16:56:47 -0700101 remote()->transact(ALLOCATE_NODE, data, &reply);
102
103 status_t err = reply.readInt32();
104 if (err == OK) {
Andreas Huberc6b59b72009-08-17 13:33:27 -0700105 *node = (void*)reply.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700106 } else {
107 *node = 0;
108 }
109
110 return err;
111 }
112
Andreas Huber318ad9c2009-10-15 13:46:54 -0700113 virtual status_t freeNode(node_id node) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700114 Parcel data, reply;
115 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700116 data.writeIntPtr((intptr_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700117 remote()->transact(FREE_NODE, data, &reply);
118
119 return reply.readInt32();
120 }
121
Andreas Huber318ad9c2009-10-15 13:46:54 -0700122 virtual status_t sendCommand(
Andreas Huber20111aa2009-07-14 16:56:47 -0700123 node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) {
124 Parcel data, reply;
125 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700126 data.writeIntPtr((intptr_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700127 data.writeInt32(cmd);
128 data.writeInt32(param);
129 remote()->transact(SEND_COMMAND, data, &reply);
130
131 return reply.readInt32();
132 }
133
Andreas Huber318ad9c2009-10-15 13:46:54 -0700134 virtual status_t getParameter(
Andreas Huber20111aa2009-07-14 16:56:47 -0700135 node_id node, OMX_INDEXTYPE index,
136 void *params, size_t size) {
137 Parcel data, reply;
138 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700139 data.writeIntPtr((intptr_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700140 data.writeInt32(index);
141 data.writeInt32(size);
142 data.write(params, size);
143 remote()->transact(GET_PARAMETER, data, &reply);
144
145 status_t err = reply.readInt32();
146 if (err != OK) {
147 return err;
148 }
149
150 reply.read(params, size);
151
152 return OK;
153 }
154
Andreas Huber318ad9c2009-10-15 13:46:54 -0700155 virtual status_t setParameter(
Andreas Huber20111aa2009-07-14 16:56:47 -0700156 node_id node, OMX_INDEXTYPE index,
157 const void *params, size_t size) {
158 Parcel data, reply;
159 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700160 data.writeIntPtr((intptr_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700161 data.writeInt32(index);
162 data.writeInt32(size);
163 data.write(params, size);
164 remote()->transact(SET_PARAMETER, data, &reply);
165
166 return reply.readInt32();
167 }
168
Andreas Huber318ad9c2009-10-15 13:46:54 -0700169 virtual status_t getConfig(
Andreas Huber693d2712009-08-14 14:37:10 -0700170 node_id node, OMX_INDEXTYPE index,
171 void *params, size_t size) {
172 Parcel data, reply;
173 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700174 data.writeIntPtr((intptr_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700175 data.writeInt32(index);
176 data.writeInt32(size);
177 data.write(params, size);
178 remote()->transact(GET_CONFIG, data, &reply);
179
180 status_t err = reply.readInt32();
181 if (err != OK) {
182 return err;
183 }
184
185 reply.read(params, size);
186
187 return OK;
188 }
189
Andreas Huber318ad9c2009-10-15 13:46:54 -0700190 virtual status_t setConfig(
Andreas Huber693d2712009-08-14 14:37:10 -0700191 node_id node, OMX_INDEXTYPE index,
192 const void *params, size_t size) {
193 Parcel data, reply;
194 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700195 data.writeIntPtr((intptr_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700196 data.writeInt32(index);
197 data.writeInt32(size);
198 data.write(params, size);
199 remote()->transact(SET_CONFIG, data, &reply);
200
201 return reply.readInt32();
202 }
203
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700204 virtual status_t getState(
205 node_id node, OMX_STATETYPE* state) {
206 Parcel data, reply;
207 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
208 data.writeIntPtr((intptr_t)node);
209 remote()->transact(GET_STATE, data, &reply);
210
211 *state = static_cast<OMX_STATETYPE>(reply.readInt32());
212 return reply.readInt32();
213 }
214
Jamie Gennis83750ea2010-08-30 16:48:38 -0700215 virtual status_t enableGraphicBuffers(
216 node_id node, OMX_U32 port_index, OMX_BOOL enable) {
217 Parcel data, reply;
218 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
219 data.writeIntPtr((intptr_t)node);
220 data.writeInt32(port_index);
221 data.writeInt32((uint32_t)enable);
222 remote()->transact(ENABLE_GRAPHIC_BUFFERS, data, &reply);
223
224 status_t err = reply.readInt32();
225 return err;
226 }
227
Jamie Gennise2ce6452011-02-23 19:01:28 -0800228 virtual status_t getGraphicBufferUsage(
229 node_id node, OMX_U32 port_index, OMX_U32* usage) {
230 Parcel data, reply;
231 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
232 data.writeIntPtr((intptr_t)node);
233 data.writeInt32(port_index);
234 remote()->transact(GET_GRAPHIC_BUFFER_USAGE, data, &reply);
235
236 status_t err = reply.readInt32();
237 *usage = reply.readInt32();
238 return err;
239 }
240
Andreas Huber318ad9c2009-10-15 13:46:54 -0700241 virtual status_t useBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700242 node_id node, OMX_U32 port_index, const sp<IMemory> &params,
243 buffer_id *buffer) {
244 Parcel data, reply;
245 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700246 data.writeIntPtr((intptr_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700247 data.writeInt32(port_index);
248 data.writeStrongBinder(params->asBinder());
249 remote()->transact(USE_BUFFER, data, &reply);
250
251 status_t err = reply.readInt32();
252 if (err != OK) {
253 *buffer = 0;
254
255 return err;
256 }
257
Andreas Huberc6b59b72009-08-17 13:33:27 -0700258 *buffer = (void*)reply.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700259
260 return err;
261 }
262
Jamie Gennis83750ea2010-08-30 16:48:38 -0700263
264 virtual status_t useGraphicBuffer(
265 node_id node, OMX_U32 port_index,
266 const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) {
267 Parcel data, reply;
268 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
269 data.writeIntPtr((intptr_t)node);
270 data.writeInt32(port_index);
271 data.write(*graphicBuffer);
272 remote()->transact(USE_GRAPHIC_BUFFER, data, &reply);
273
274 status_t err = reply.readInt32();
275 if (err != OK) {
276 *buffer = 0;
277
278 return err;
279 }
280
281 *buffer = (void*)reply.readIntPtr();
282
283 return err;
284 }
285
Andy McFadden7cd58532013-02-19 07:28:30 -0800286 virtual status_t createInputSurface(
287 node_id node, OMX_U32 port_index,
288 sp<IGraphicBufferProducer> *bufferProducer) {
289 Parcel data, reply;
290 status_t err;
291 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
292 data.writeIntPtr((intptr_t)node);
293 data.writeInt32(port_index);
294 err = remote()->transact(CREATE_INPUT_SURFACE, data, &reply);
295 if (err != OK) {
296 ALOGW("binder transaction failed: %d", err);
297 return err;
298 }
299
300 err = reply.readInt32();
301 if (err != OK) {
302 return err;
303 }
304
305 *bufferProducer = IGraphicBufferProducer::asInterface(
306 reply.readStrongBinder());
307
308 return err;
309 }
310
311 virtual status_t signalEndOfInputStream(node_id node) {
312 Parcel data, reply;
313 status_t err;
314 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
315 data.writeIntPtr((intptr_t)node);
316 err = remote()->transact(SIGNAL_END_OF_INPUT_STREAM, data, &reply);
317 if (err != OK) {
318 ALOGW("binder transaction failed: %d", err);
319 return err;
320 }
321
322 return reply.readInt32();
323 }
324
James Donge8707722010-10-20 17:38:41 -0700325 virtual status_t storeMetaDataInBuffers(
326 node_id node, OMX_U32 port_index, OMX_BOOL enable) {
327 Parcel data, reply;
328 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
329 data.writeIntPtr((intptr_t)node);
330 data.writeInt32(port_index);
331 data.writeInt32((uint32_t)enable);
332 remote()->transact(STORE_META_DATA_IN_BUFFERS, data, &reply);
333
334 status_t err = reply.readInt32();
335 return err;
336 }
337
Andreas Huber318ad9c2009-10-15 13:46:54 -0700338 virtual status_t allocateBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700339 node_id node, OMX_U32 port_index, size_t size,
Andreas Huber570a3cb2010-01-20 15:05:46 -0800340 buffer_id *buffer, void **buffer_data) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700341 Parcel data, reply;
342 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700343 data.writeIntPtr((intptr_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700344 data.writeInt32(port_index);
345 data.writeInt32(size);
346 remote()->transact(ALLOC_BUFFER, data, &reply);
347
348 status_t err = reply.readInt32();
349 if (err != OK) {
350 *buffer = 0;
351
352 return err;
353 }
354
Andreas Huber570a3cb2010-01-20 15:05:46 -0800355 *buffer = (void *)reply.readIntPtr();
356 *buffer_data = (void *)reply.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700357
358 return err;
359 }
360
Andreas Huber318ad9c2009-10-15 13:46:54 -0700361 virtual status_t allocateBufferWithBackup(
Andreas Huber20111aa2009-07-14 16:56:47 -0700362 node_id node, OMX_U32 port_index, const sp<IMemory> &params,
363 buffer_id *buffer) {
364 Parcel data, reply;
365 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700366 data.writeIntPtr((intptr_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700367 data.writeInt32(port_index);
368 data.writeStrongBinder(params->asBinder());
369 remote()->transact(ALLOC_BUFFER_WITH_BACKUP, data, &reply);
370
371 status_t err = reply.readInt32();
372 if (err != OK) {
373 *buffer = 0;
374
375 return err;
376 }
377
Andreas Huberc6b59b72009-08-17 13:33:27 -0700378 *buffer = (void*)reply.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700379
380 return err;
381 }
382
Andreas Huber318ad9c2009-10-15 13:46:54 -0700383 virtual status_t freeBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700384 node_id node, OMX_U32 port_index, buffer_id buffer) {
385 Parcel data, reply;
386 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700387 data.writeIntPtr((intptr_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700388 data.writeInt32(port_index);
Andreas Huberc6b59b72009-08-17 13:33:27 -0700389 data.writeIntPtr((intptr_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700390 remote()->transact(FREE_BUFFER, data, &reply);
391
392 return reply.readInt32();
393 }
394
Andreas Huber318ad9c2009-10-15 13:46:54 -0700395 virtual status_t fillBuffer(node_id node, buffer_id buffer) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700396 Parcel data, reply;
397 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700398 data.writeIntPtr((intptr_t)node);
399 data.writeIntPtr((intptr_t)buffer);
Andreas Huber36efa032009-10-08 11:02:27 -0700400 remote()->transact(FILL_BUFFER, data, &reply);
401
402 return reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700403 }
404
Andreas Huber318ad9c2009-10-15 13:46:54 -0700405 virtual status_t emptyBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700406 node_id node,
407 buffer_id buffer,
408 OMX_U32 range_offset, OMX_U32 range_length,
409 OMX_U32 flags, OMX_TICKS timestamp) {
410 Parcel data, reply;
411 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700412 data.writeIntPtr((intptr_t)node);
413 data.writeIntPtr((intptr_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700414 data.writeInt32(range_offset);
415 data.writeInt32(range_length);
416 data.writeInt32(flags);
417 data.writeInt64(timestamp);
Andreas Huber36efa032009-10-08 11:02:27 -0700418 remote()->transact(EMPTY_BUFFER, data, &reply);
419
420 return reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700421 }
Andreas Huber8b938cd2009-07-31 11:52:50 -0700422
Andreas Huber318ad9c2009-10-15 13:46:54 -0700423 virtual status_t getExtensionIndex(
Andreas Huber693d2712009-08-14 14:37:10 -0700424 node_id node,
425 const char *parameter_name,
426 OMX_INDEXTYPE *index) {
427 Parcel data, reply;
428 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700429 data.writeIntPtr((intptr_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700430 data.writeCString(parameter_name);
431
432 remote()->transact(GET_EXTENSION_INDEX, data, &reply);
433
434 status_t err = reply.readInt32();
435 if (err == OK) {
436 *index = static_cast<OMX_INDEXTYPE>(reply.readInt32());
437 } else {
438 *index = OMX_IndexComponentStartUnused;
439 }
440
441 return err;
442 }
Andreas Hubere40cda72013-07-17 13:55:26 -0700443
444 virtual status_t setInternalOption(
445 node_id node,
446 OMX_U32 port_index,
447 InternalOptionType type,
448 const void *optionData,
449 size_t size) {
450 Parcel data, reply;
451 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
452 data.writeIntPtr((intptr_t)node);
453 data.writeInt32(port_index);
454 data.writeInt32(size);
455 data.write(optionData, size);
456 data.writeInt32(type);
457 remote()->transact(SET_INTERNAL_OPTION, data, &reply);
458
459 return reply.readInt32();
460 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700461};
462
463IMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX");
464
465////////////////////////////////////////////////////////////////////////////////
466
Andy McFadden7cd58532013-02-19 07:28:30 -0800467#define CHECK_OMX_INTERFACE(interface, data, reply) \
Andreas Huber20111aa2009-07-14 16:56:47 -0700468 do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \
Steve Block5ff1dd52012-01-05 23:22:43 +0000469 ALOGW("Call incorrectly routed to " #interface); \
Andreas Huber20111aa2009-07-14 16:56:47 -0700470 return PERMISSION_DENIED; \
471 } } while (0)
472
473status_t BnOMX::onTransact(
474 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
475 switch (code) {
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800476 case LIVES_LOCALLY:
477 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800478 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huberd459b482012-01-31 11:16:24 -0800479 node_id node = (void *)data.readIntPtr();
480 pid_t pid = (pid_t)data.readInt32();
481 reply->writeInt32(livesLocally(node, pid));
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800482
483 return OK;
484 }
485
Andreas Huber20111aa2009-07-14 16:56:47 -0700486 case LIST_NODES:
487 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800488 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700489
Andreas Huber134ee6a2009-12-16 09:30:55 -0800490 List<ComponentInfo> list;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700491 listNodes(&list);
Andreas Huber20111aa2009-07-14 16:56:47 -0700492
493 reply->writeInt32(list.size());
Andreas Huber134ee6a2009-12-16 09:30:55 -0800494 for (List<ComponentInfo>::iterator it = list.begin();
Andreas Huber20111aa2009-07-14 16:56:47 -0700495 it != list.end(); ++it) {
Andreas Huber134ee6a2009-12-16 09:30:55 -0800496 ComponentInfo &cur = *it;
497
498 reply->writeString8(cur.mName);
499 reply->writeInt32(cur.mRoles.size());
500 for (List<String8>::iterator role_it = cur.mRoles.begin();
501 role_it != cur.mRoles.end(); ++role_it) {
502 reply->writeString8(*role_it);
503 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700504 }
505
506 return NO_ERROR;
507 }
508
509 case ALLOCATE_NODE:
510 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800511 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700512
Andreas Huber318ad9c2009-10-15 13:46:54 -0700513 const char *name = data.readCString();
514
515 sp<IOMXObserver> observer =
516 interface_cast<IOMXObserver>(data.readStrongBinder());
517
Andreas Huber20111aa2009-07-14 16:56:47 -0700518 node_id node;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700519
520 status_t err = allocateNode(name, observer, &node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700521 reply->writeInt32(err);
522 if (err == OK) {
Andreas Huberc6b59b72009-08-17 13:33:27 -0700523 reply->writeIntPtr((intptr_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700524 }
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800525
Andreas Huber20111aa2009-07-14 16:56:47 -0700526 return NO_ERROR;
527 }
528
529 case FREE_NODE:
530 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800531 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700532
Andreas Huberc6b59b72009-08-17 13:33:27 -0700533 node_id node = (void*)data.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700534
Andreas Huber318ad9c2009-10-15 13:46:54 -0700535 reply->writeInt32(freeNode(node));
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800536
Andreas Huber20111aa2009-07-14 16:56:47 -0700537 return NO_ERROR;
538 }
539
540 case SEND_COMMAND:
541 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800542 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700543
Andreas Huberc6b59b72009-08-17 13:33:27 -0700544 node_id node = (void*)data.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700545
546 OMX_COMMANDTYPE cmd =
547 static_cast<OMX_COMMANDTYPE>(data.readInt32());
548
549 OMX_S32 param = data.readInt32();
Andreas Huber318ad9c2009-10-15 13:46:54 -0700550 reply->writeInt32(sendCommand(node, cmd, param));
Andreas Huber20111aa2009-07-14 16:56:47 -0700551
552 return NO_ERROR;
553 }
554
555 case GET_PARAMETER:
Andreas Huber20111aa2009-07-14 16:56:47 -0700556 case SET_PARAMETER:
Andreas Huber693d2712009-08-14 14:37:10 -0700557 case GET_CONFIG:
Andreas Huber693d2712009-08-14 14:37:10 -0700558 case SET_CONFIG:
Andreas Hubere40cda72013-07-17 13:55:26 -0700559 case SET_INTERNAL_OPTION:
Andreas Huber693d2712009-08-14 14:37:10 -0700560 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800561 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber693d2712009-08-14 14:37:10 -0700562
Andreas Huberc6b59b72009-08-17 13:33:27 -0700563 node_id node = (void*)data.readIntPtr();
Andreas Huber693d2712009-08-14 14:37:10 -0700564 OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
565
566 size_t size = data.readInt32();
Andreas Huber693d2712009-08-14 14:37:10 -0700567
Andreas Huberb3912902011-01-19 10:34:52 -0800568 void *params = malloc(size);
569 data.read(params, size);
570
571 status_t err;
572 switch (code) {
573 case GET_PARAMETER:
574 err = getParameter(node, index, params, size);
575 break;
576 case SET_PARAMETER:
577 err = setParameter(node, index, params, size);
578 break;
579 case GET_CONFIG:
580 err = getConfig(node, index, params, size);
581 break;
582 case SET_CONFIG:
583 err = setConfig(node, index, params, size);
584 break;
Andreas Hubere40cda72013-07-17 13:55:26 -0700585 case SET_INTERNAL_OPTION:
586 {
587 InternalOptionType type =
588 (InternalOptionType)data.readInt32();
589
590 err = setInternalOption(node, index, type, params, size);
591 break;
592 }
593
Andreas Huberb3912902011-01-19 10:34:52 -0800594 default:
595 TRESPASS();
596 }
597
598 reply->writeInt32(err);
599
600 if ((code == GET_PARAMETER || code == GET_CONFIG) && err == OK) {
601 reply->write(params, size);
602 }
603
604 free(params);
605 params = NULL;
Andreas Huber693d2712009-08-14 14:37:10 -0700606
607 return NO_ERROR;
608 }
609
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700610 case GET_STATE:
611 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800612 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700613
614 node_id node = (void*)data.readIntPtr();
615 OMX_STATETYPE state = OMX_StateInvalid;
616
617 status_t err = getState(node, &state);
618 reply->writeInt32(state);
619 reply->writeInt32(err);
620
621 return NO_ERROR;
622 }
623
Jamie Gennis83750ea2010-08-30 16:48:38 -0700624 case ENABLE_GRAPHIC_BUFFERS:
625 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800626 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700627
628 node_id node = (void*)data.readIntPtr();
629 OMX_U32 port_index = data.readInt32();
630 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
631
632 status_t err = enableGraphicBuffers(node, port_index, enable);
633 reply->writeInt32(err);
634
635 return NO_ERROR;
636 }
637
Jamie Gennise2ce6452011-02-23 19:01:28 -0800638 case GET_GRAPHIC_BUFFER_USAGE:
639 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800640 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennise2ce6452011-02-23 19:01:28 -0800641
642 node_id node = (void*)data.readIntPtr();
643 OMX_U32 port_index = data.readInt32();
644
645 OMX_U32 usage = 0;
646 status_t err = getGraphicBufferUsage(node, port_index, &usage);
647 reply->writeInt32(err);
648 reply->writeInt32(usage);
649
650 return NO_ERROR;
651 }
652
Andreas Huber20111aa2009-07-14 16:56:47 -0700653 case USE_BUFFER:
654 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800655 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700656
Andreas Huberc6b59b72009-08-17 13:33:27 -0700657 node_id node = (void*)data.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700658 OMX_U32 port_index = data.readInt32();
659 sp<IMemory> params =
660 interface_cast<IMemory>(data.readStrongBinder());
661
662 buffer_id buffer;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700663 status_t err = useBuffer(node, port_index, params, &buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700664 reply->writeInt32(err);
665
666 if (err == OK) {
Andreas Huberc6b59b72009-08-17 13:33:27 -0700667 reply->writeIntPtr((intptr_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700668 }
669
670 return NO_ERROR;
671 }
672
Jamie Gennis83750ea2010-08-30 16:48:38 -0700673 case USE_GRAPHIC_BUFFER:
674 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800675 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700676
677 node_id node = (void*)data.readIntPtr();
678 OMX_U32 port_index = data.readInt32();
679 sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
680 data.read(*graphicBuffer);
681
682 buffer_id buffer;
683 status_t err = useGraphicBuffer(
684 node, port_index, graphicBuffer, &buffer);
685 reply->writeInt32(err);
686
687 if (err == OK) {
688 reply->writeIntPtr((intptr_t)buffer);
689 }
690
691 return NO_ERROR;
692 }
693
Andy McFadden7cd58532013-02-19 07:28:30 -0800694 case CREATE_INPUT_SURFACE:
695 {
696 CHECK_OMX_INTERFACE(IOMX, data, reply);
697
698 node_id node = (void*)data.readIntPtr();
699 OMX_U32 port_index = data.readInt32();
700
701 sp<IGraphicBufferProducer> bufferProducer;
702 status_t err = createInputSurface(node, port_index,
703 &bufferProducer);
704
705 reply->writeInt32(err);
706
707 if (err == OK) {
708 reply->writeStrongBinder(bufferProducer->asBinder());
709 }
710
711 return NO_ERROR;
712 }
713
714 case SIGNAL_END_OF_INPUT_STREAM:
715 {
716 CHECK_OMX_INTERFACE(IOMX, data, reply);
717
718 node_id node = (void*)data.readIntPtr();
719
720 status_t err = signalEndOfInputStream(node);
721 reply->writeInt32(err);
722
723 return NO_ERROR;
724 }
725
James Donge8707722010-10-20 17:38:41 -0700726 case STORE_META_DATA_IN_BUFFERS:
727 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800728 CHECK_OMX_INTERFACE(IOMX, data, reply);
James Donge8707722010-10-20 17:38:41 -0700729
730 node_id node = (void*)data.readIntPtr();
731 OMX_U32 port_index = data.readInt32();
732 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
733
734 status_t err = storeMetaDataInBuffers(node, port_index, enable);
735 reply->writeInt32(err);
736
737 return NO_ERROR;
738 }
739
Andreas Huber20111aa2009-07-14 16:56:47 -0700740 case ALLOC_BUFFER:
741 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800742 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700743
Andreas Huberc6b59b72009-08-17 13:33:27 -0700744 node_id node = (void*)data.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700745 OMX_U32 port_index = data.readInt32();
746 size_t size = data.readInt32();
747
748 buffer_id buffer;
Andreas Huber570a3cb2010-01-20 15:05:46 -0800749 void *buffer_data;
750 status_t err = allocateBuffer(
751 node, port_index, size, &buffer, &buffer_data);
Andreas Huber20111aa2009-07-14 16:56:47 -0700752 reply->writeInt32(err);
753
754 if (err == OK) {
Andreas Huberc6b59b72009-08-17 13:33:27 -0700755 reply->writeIntPtr((intptr_t)buffer);
Andreas Huber570a3cb2010-01-20 15:05:46 -0800756 reply->writeIntPtr((intptr_t)buffer_data);
Andreas Huber20111aa2009-07-14 16:56:47 -0700757 }
758
759 return NO_ERROR;
760 }
761
762 case ALLOC_BUFFER_WITH_BACKUP:
763 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800764 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700765
Andreas Huberc6b59b72009-08-17 13:33:27 -0700766 node_id node = (void*)data.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700767 OMX_U32 port_index = data.readInt32();
768 sp<IMemory> params =
769 interface_cast<IMemory>(data.readStrongBinder());
770
771 buffer_id buffer;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700772 status_t err = allocateBufferWithBackup(
Andreas Huber20111aa2009-07-14 16:56:47 -0700773 node, port_index, params, &buffer);
774
775 reply->writeInt32(err);
776
777 if (err == OK) {
Andreas Huberc6b59b72009-08-17 13:33:27 -0700778 reply->writeIntPtr((intptr_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700779 }
780
781 return NO_ERROR;
782 }
783
784 case FREE_BUFFER:
785 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800786 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700787
Andreas Huberc6b59b72009-08-17 13:33:27 -0700788 node_id node = (void*)data.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700789 OMX_U32 port_index = data.readInt32();
Andreas Huberc6b59b72009-08-17 13:33:27 -0700790 buffer_id buffer = (void*)data.readIntPtr();
Andreas Huber318ad9c2009-10-15 13:46:54 -0700791 reply->writeInt32(freeBuffer(node, port_index, buffer));
Andreas Huber20111aa2009-07-14 16:56:47 -0700792
793 return NO_ERROR;
794 }
795
796 case FILL_BUFFER:
797 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800798 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700799
Andreas Huberc6b59b72009-08-17 13:33:27 -0700800 node_id node = (void*)data.readIntPtr();
801 buffer_id buffer = (void*)data.readIntPtr();
Andreas Huber318ad9c2009-10-15 13:46:54 -0700802 reply->writeInt32(fillBuffer(node, buffer));
Andreas Huber20111aa2009-07-14 16:56:47 -0700803
804 return NO_ERROR;
805 }
806
807 case EMPTY_BUFFER:
808 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800809 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700810
Andreas Huberc6b59b72009-08-17 13:33:27 -0700811 node_id node = (void*)data.readIntPtr();
812 buffer_id buffer = (void*)data.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700813 OMX_U32 range_offset = data.readInt32();
814 OMX_U32 range_length = data.readInt32();
815 OMX_U32 flags = data.readInt32();
816 OMX_TICKS timestamp = data.readInt64();
817
Andreas Huber36efa032009-10-08 11:02:27 -0700818 reply->writeInt32(
Andreas Huber318ad9c2009-10-15 13:46:54 -0700819 emptyBuffer(
Andreas Huber36efa032009-10-08 11:02:27 -0700820 node, buffer, range_offset, range_length,
821 flags, timestamp));
Andreas Huber20111aa2009-07-14 16:56:47 -0700822
823 return NO_ERROR;
824 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700825
Andreas Huber693d2712009-08-14 14:37:10 -0700826 case GET_EXTENSION_INDEX:
827 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800828 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber693d2712009-08-14 14:37:10 -0700829
Andreas Huberc6b59b72009-08-17 13:33:27 -0700830 node_id node = (void*)data.readIntPtr();
Andreas Huber693d2712009-08-14 14:37:10 -0700831 const char *parameter_name = data.readCString();
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800832
Andreas Huber693d2712009-08-14 14:37:10 -0700833 OMX_INDEXTYPE index;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700834 status_t err = getExtensionIndex(node, parameter_name, &index);
Andreas Huber693d2712009-08-14 14:37:10 -0700835
836 reply->writeInt32(err);
837
838 if (err == OK) {
839 reply->writeInt32(index);
840 }
841
842 return OK;
843 }
844
Andreas Huber20111aa2009-07-14 16:56:47 -0700845 default:
846 return BBinder::onTransact(code, data, reply, flags);
847 }
848}
849
850////////////////////////////////////////////////////////////////////////////////
851
852class BpOMXObserver : public BpInterface<IOMXObserver> {
853public:
854 BpOMXObserver(const sp<IBinder> &impl)
855 : BpInterface<IOMXObserver>(impl) {
856 }
857
Andreas Huber318ad9c2009-10-15 13:46:54 -0700858 virtual void onMessage(const omx_message &msg) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700859 Parcel data, reply;
860 data.writeInterfaceToken(IOMXObserver::getInterfaceDescriptor());
861 data.write(&msg, sizeof(msg));
862
863 remote()->transact(OBSERVER_ON_MSG, data, &reply, IBinder::FLAG_ONEWAY);
864 }
865};
866
867IMPLEMENT_META_INTERFACE(OMXObserver, "android.hardware.IOMXObserver");
868
869status_t BnOMXObserver::onTransact(
870 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
871 switch (code) {
872 case OBSERVER_ON_MSG:
873 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800874 CHECK_OMX_INTERFACE(IOMXObserver, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700875
876 omx_message msg;
877 data.read(&msg, sizeof(msg));
878
879 // XXX Could use readInplace maybe?
Andreas Huber318ad9c2009-10-15 13:46:54 -0700880 onMessage(msg);
Andreas Huber20111aa2009-07-14 16:56:47 -0700881
882 return NO_ERROR;
883 }
884
885 default:
886 return BBinder::onTransact(code, data, reply, flags);
887 }
888}
889
Andreas Huber20111aa2009-07-14 16:56:47 -0700890} // namespace android