blob: d6cd43a32f72ef62f869536a165cb0c87d12a3d5 [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 Huber20111aa2009-07-14 16:56:47 -070054};
55
Andreas Huber20111aa2009-07-14 16:56:47 -070056class BpOMX : public BpInterface<IOMX> {
57public:
58 BpOMX(const sp<IBinder> &impl)
59 : BpInterface<IOMX>(impl) {
60 }
61
Andreas Huberd459b482012-01-31 11:16:24 -080062 virtual bool livesLocally(node_id node, pid_t pid) {
Andreas Huber7eaa9c92010-01-15 15:28:19 -080063 Parcel data, reply;
64 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberd459b482012-01-31 11:16:24 -080065 data.writeIntPtr((intptr_t)node);
Andreas Huber7eaa9c92010-01-15 15:28:19 -080066 data.writeInt32(pid);
67 remote()->transact(LIVES_LOCALLY, data, &reply);
68
69 return reply.readInt32() != 0;
70 }
71
Andreas Huber134ee6a2009-12-16 09:30:55 -080072 virtual status_t listNodes(List<ComponentInfo> *list) {
Andreas Huber20111aa2009-07-14 16:56:47 -070073 list->clear();
74
75 Parcel data, reply;
76 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
77 remote()->transact(LIST_NODES, data, &reply);
78
79 int32_t n = reply.readInt32();
80 for (int32_t i = 0; i < n; ++i) {
Andreas Huber134ee6a2009-12-16 09:30:55 -080081 list->push_back(ComponentInfo());
82 ComponentInfo &info = *--list->end();
Andreas Huber20111aa2009-07-14 16:56:47 -070083
Andreas Huber134ee6a2009-12-16 09:30:55 -080084 info.mName = reply.readString8();
85 int32_t numRoles = reply.readInt32();
86 for (int32_t j = 0; j < numRoles; ++j) {
87 info.mRoles.push_back(reply.readString8());
88 }
Andreas Huber20111aa2009-07-14 16:56:47 -070089 }
90
91 return OK;
92 }
93
Andreas Huber318ad9c2009-10-15 13:46:54 -070094 virtual status_t allocateNode(
95 const char *name, const sp<IOMXObserver> &observer, node_id *node) {
Andreas Huber20111aa2009-07-14 16:56:47 -070096 Parcel data, reply;
97 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
98 data.writeCString(name);
Andreas Huber318ad9c2009-10-15 13:46:54 -070099 data.writeStrongBinder(observer->asBinder());
Andreas Huber20111aa2009-07-14 16:56:47 -0700100 remote()->transact(ALLOCATE_NODE, data, &reply);
101
102 status_t err = reply.readInt32();
103 if (err == OK) {
Andreas Huberc6b59b72009-08-17 13:33:27 -0700104 *node = (void*)reply.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700105 } else {
106 *node = 0;
107 }
108
109 return err;
110 }
111
Andreas Huber318ad9c2009-10-15 13:46:54 -0700112 virtual status_t freeNode(node_id node) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700113 Parcel data, reply;
114 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700115 data.writeIntPtr((intptr_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700116 remote()->transact(FREE_NODE, data, &reply);
117
118 return reply.readInt32();
119 }
120
Andreas Huber318ad9c2009-10-15 13:46:54 -0700121 virtual status_t sendCommand(
Andreas Huber20111aa2009-07-14 16:56:47 -0700122 node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) {
123 Parcel data, reply;
124 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700125 data.writeIntPtr((intptr_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700126 data.writeInt32(cmd);
127 data.writeInt32(param);
128 remote()->transact(SEND_COMMAND, data, &reply);
129
130 return reply.readInt32();
131 }
132
Andreas Huber318ad9c2009-10-15 13:46:54 -0700133 virtual status_t getParameter(
Andreas Huber20111aa2009-07-14 16:56:47 -0700134 node_id node, OMX_INDEXTYPE index,
135 void *params, size_t size) {
136 Parcel data, reply;
137 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700138 data.writeIntPtr((intptr_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700139 data.writeInt32(index);
140 data.writeInt32(size);
141 data.write(params, size);
142 remote()->transact(GET_PARAMETER, data, &reply);
143
144 status_t err = reply.readInt32();
145 if (err != OK) {
146 return err;
147 }
148
149 reply.read(params, size);
150
151 return OK;
152 }
153
Andreas Huber318ad9c2009-10-15 13:46:54 -0700154 virtual status_t setParameter(
Andreas Huber20111aa2009-07-14 16:56:47 -0700155 node_id node, OMX_INDEXTYPE index,
156 const void *params, size_t size) {
157 Parcel data, reply;
158 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700159 data.writeIntPtr((intptr_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700160 data.writeInt32(index);
161 data.writeInt32(size);
162 data.write(params, size);
163 remote()->transact(SET_PARAMETER, data, &reply);
164
165 return reply.readInt32();
166 }
167
Andreas Huber318ad9c2009-10-15 13:46:54 -0700168 virtual status_t getConfig(
Andreas Huber693d2712009-08-14 14:37:10 -0700169 node_id node, OMX_INDEXTYPE index,
170 void *params, size_t size) {
171 Parcel data, reply;
172 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700173 data.writeIntPtr((intptr_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700174 data.writeInt32(index);
175 data.writeInt32(size);
176 data.write(params, size);
177 remote()->transact(GET_CONFIG, data, &reply);
178
179 status_t err = reply.readInt32();
180 if (err != OK) {
181 return err;
182 }
183
184 reply.read(params, size);
185
186 return OK;
187 }
188
Andreas Huber318ad9c2009-10-15 13:46:54 -0700189 virtual status_t setConfig(
Andreas Huber693d2712009-08-14 14:37:10 -0700190 node_id node, OMX_INDEXTYPE index,
191 const void *params, size_t size) {
192 Parcel data, reply;
193 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700194 data.writeIntPtr((intptr_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700195 data.writeInt32(index);
196 data.writeInt32(size);
197 data.write(params, size);
198 remote()->transact(SET_CONFIG, data, &reply);
199
200 return reply.readInt32();
201 }
202
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700203 virtual status_t getState(
204 node_id node, OMX_STATETYPE* state) {
205 Parcel data, reply;
206 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
207 data.writeIntPtr((intptr_t)node);
208 remote()->transact(GET_STATE, data, &reply);
209
210 *state = static_cast<OMX_STATETYPE>(reply.readInt32());
211 return reply.readInt32();
212 }
213
Jamie Gennis83750ea2010-08-30 16:48:38 -0700214 virtual status_t enableGraphicBuffers(
215 node_id node, OMX_U32 port_index, OMX_BOOL enable) {
216 Parcel data, reply;
217 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
218 data.writeIntPtr((intptr_t)node);
219 data.writeInt32(port_index);
220 data.writeInt32((uint32_t)enable);
221 remote()->transact(ENABLE_GRAPHIC_BUFFERS, data, &reply);
222
223 status_t err = reply.readInt32();
224 return err;
225 }
226
Jamie Gennise2ce6452011-02-23 19:01:28 -0800227 virtual status_t getGraphicBufferUsage(
228 node_id node, OMX_U32 port_index, OMX_U32* usage) {
229 Parcel data, reply;
230 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
231 data.writeIntPtr((intptr_t)node);
232 data.writeInt32(port_index);
233 remote()->transact(GET_GRAPHIC_BUFFER_USAGE, data, &reply);
234
235 status_t err = reply.readInt32();
236 *usage = reply.readInt32();
237 return err;
238 }
239
Andreas Huber318ad9c2009-10-15 13:46:54 -0700240 virtual status_t useBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700241 node_id node, OMX_U32 port_index, const sp<IMemory> &params,
242 buffer_id *buffer) {
243 Parcel data, reply;
244 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700245 data.writeIntPtr((intptr_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700246 data.writeInt32(port_index);
247 data.writeStrongBinder(params->asBinder());
248 remote()->transact(USE_BUFFER, data, &reply);
249
250 status_t err = reply.readInt32();
251 if (err != OK) {
252 *buffer = 0;
253
254 return err;
255 }
256
Andreas Huberc6b59b72009-08-17 13:33:27 -0700257 *buffer = (void*)reply.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700258
259 return err;
260 }
261
Jamie Gennis83750ea2010-08-30 16:48:38 -0700262
263 virtual status_t useGraphicBuffer(
264 node_id node, OMX_U32 port_index,
265 const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) {
266 Parcel data, reply;
267 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
268 data.writeIntPtr((intptr_t)node);
269 data.writeInt32(port_index);
270 data.write(*graphicBuffer);
271 remote()->transact(USE_GRAPHIC_BUFFER, data, &reply);
272
273 status_t err = reply.readInt32();
274 if (err != OK) {
275 *buffer = 0;
276
277 return err;
278 }
279
280 *buffer = (void*)reply.readIntPtr();
281
282 return err;
283 }
284
Andy McFadden7cd58532013-02-19 07:28:30 -0800285 virtual status_t createInputSurface(
286 node_id node, OMX_U32 port_index,
287 sp<IGraphicBufferProducer> *bufferProducer) {
288 Parcel data, reply;
289 status_t err;
290 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
291 data.writeIntPtr((intptr_t)node);
292 data.writeInt32(port_index);
293 err = remote()->transact(CREATE_INPUT_SURFACE, data, &reply);
294 if (err != OK) {
295 ALOGW("binder transaction failed: %d", err);
296 return err;
297 }
298
299 err = reply.readInt32();
300 if (err != OK) {
301 return err;
302 }
303
304 *bufferProducer = IGraphicBufferProducer::asInterface(
305 reply.readStrongBinder());
306
307 return err;
308 }
309
310 virtual status_t signalEndOfInputStream(node_id node) {
311 Parcel data, reply;
312 status_t err;
313 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
314 data.writeIntPtr((intptr_t)node);
315 err = remote()->transact(SIGNAL_END_OF_INPUT_STREAM, data, &reply);
316 if (err != OK) {
317 ALOGW("binder transaction failed: %d", err);
318 return err;
319 }
320
321 return reply.readInt32();
322 }
323
James Donge8707722010-10-20 17:38:41 -0700324 virtual status_t storeMetaDataInBuffers(
325 node_id node, OMX_U32 port_index, OMX_BOOL enable) {
326 Parcel data, reply;
327 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
328 data.writeIntPtr((intptr_t)node);
329 data.writeInt32(port_index);
330 data.writeInt32((uint32_t)enable);
331 remote()->transact(STORE_META_DATA_IN_BUFFERS, data, &reply);
332
333 status_t err = reply.readInt32();
334 return err;
335 }
336
Andreas Huber318ad9c2009-10-15 13:46:54 -0700337 virtual status_t allocateBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700338 node_id node, OMX_U32 port_index, size_t size,
Andreas Huber570a3cb2010-01-20 15:05:46 -0800339 buffer_id *buffer, void **buffer_data) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700340 Parcel data, reply;
341 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700342 data.writeIntPtr((intptr_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700343 data.writeInt32(port_index);
344 data.writeInt32(size);
345 remote()->transact(ALLOC_BUFFER, data, &reply);
346
347 status_t err = reply.readInt32();
348 if (err != OK) {
349 *buffer = 0;
350
351 return err;
352 }
353
Andreas Huber570a3cb2010-01-20 15:05:46 -0800354 *buffer = (void *)reply.readIntPtr();
355 *buffer_data = (void *)reply.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700356
357 return err;
358 }
359
Andreas Huber318ad9c2009-10-15 13:46:54 -0700360 virtual status_t allocateBufferWithBackup(
Andreas Huber20111aa2009-07-14 16:56:47 -0700361 node_id node, OMX_U32 port_index, const sp<IMemory> &params,
362 buffer_id *buffer) {
363 Parcel data, reply;
364 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700365 data.writeIntPtr((intptr_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700366 data.writeInt32(port_index);
367 data.writeStrongBinder(params->asBinder());
368 remote()->transact(ALLOC_BUFFER_WITH_BACKUP, data, &reply);
369
370 status_t err = reply.readInt32();
371 if (err != OK) {
372 *buffer = 0;
373
374 return err;
375 }
376
Andreas Huberc6b59b72009-08-17 13:33:27 -0700377 *buffer = (void*)reply.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700378
379 return err;
380 }
381
Andreas Huber318ad9c2009-10-15 13:46:54 -0700382 virtual status_t freeBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700383 node_id node, OMX_U32 port_index, buffer_id buffer) {
384 Parcel data, reply;
385 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700386 data.writeIntPtr((intptr_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700387 data.writeInt32(port_index);
Andreas Huberc6b59b72009-08-17 13:33:27 -0700388 data.writeIntPtr((intptr_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700389 remote()->transact(FREE_BUFFER, data, &reply);
390
391 return reply.readInt32();
392 }
393
Andreas Huber318ad9c2009-10-15 13:46:54 -0700394 virtual status_t fillBuffer(node_id node, buffer_id buffer) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700395 Parcel data, reply;
396 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700397 data.writeIntPtr((intptr_t)node);
398 data.writeIntPtr((intptr_t)buffer);
Andreas Huber36efa032009-10-08 11:02:27 -0700399 remote()->transact(FILL_BUFFER, data, &reply);
400
401 return reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700402 }
403
Andreas Huber318ad9c2009-10-15 13:46:54 -0700404 virtual status_t emptyBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700405 node_id node,
406 buffer_id buffer,
407 OMX_U32 range_offset, OMX_U32 range_length,
408 OMX_U32 flags, OMX_TICKS timestamp) {
409 Parcel data, reply;
410 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700411 data.writeIntPtr((intptr_t)node);
412 data.writeIntPtr((intptr_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700413 data.writeInt32(range_offset);
414 data.writeInt32(range_length);
415 data.writeInt32(flags);
416 data.writeInt64(timestamp);
Andreas Huber36efa032009-10-08 11:02:27 -0700417 remote()->transact(EMPTY_BUFFER, data, &reply);
418
419 return reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700420 }
Andreas Huber8b938cd2009-07-31 11:52:50 -0700421
Andreas Huber318ad9c2009-10-15 13:46:54 -0700422 virtual status_t getExtensionIndex(
Andreas Huber693d2712009-08-14 14:37:10 -0700423 node_id node,
424 const char *parameter_name,
425 OMX_INDEXTYPE *index) {
426 Parcel data, reply;
427 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700428 data.writeIntPtr((intptr_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700429 data.writeCString(parameter_name);
430
431 remote()->transact(GET_EXTENSION_INDEX, data, &reply);
432
433 status_t err = reply.readInt32();
434 if (err == OK) {
435 *index = static_cast<OMX_INDEXTYPE>(reply.readInt32());
436 } else {
437 *index = OMX_IndexComponentStartUnused;
438 }
439
440 return err;
441 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700442};
443
444IMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX");
445
446////////////////////////////////////////////////////////////////////////////////
447
Andy McFadden7cd58532013-02-19 07:28:30 -0800448#define CHECK_OMX_INTERFACE(interface, data, reply) \
Andreas Huber20111aa2009-07-14 16:56:47 -0700449 do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \
Steve Block5ff1dd52012-01-05 23:22:43 +0000450 ALOGW("Call incorrectly routed to " #interface); \
Andreas Huber20111aa2009-07-14 16:56:47 -0700451 return PERMISSION_DENIED; \
452 } } while (0)
453
454status_t BnOMX::onTransact(
455 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
456 switch (code) {
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800457 case LIVES_LOCALLY:
458 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800459 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huberd459b482012-01-31 11:16:24 -0800460 node_id node = (void *)data.readIntPtr();
461 pid_t pid = (pid_t)data.readInt32();
462 reply->writeInt32(livesLocally(node, pid));
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800463
464 return OK;
465 }
466
Andreas Huber20111aa2009-07-14 16:56:47 -0700467 case LIST_NODES:
468 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800469 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700470
Andreas Huber134ee6a2009-12-16 09:30:55 -0800471 List<ComponentInfo> list;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700472 listNodes(&list);
Andreas Huber20111aa2009-07-14 16:56:47 -0700473
474 reply->writeInt32(list.size());
Andreas Huber134ee6a2009-12-16 09:30:55 -0800475 for (List<ComponentInfo>::iterator it = list.begin();
Andreas Huber20111aa2009-07-14 16:56:47 -0700476 it != list.end(); ++it) {
Andreas Huber134ee6a2009-12-16 09:30:55 -0800477 ComponentInfo &cur = *it;
478
479 reply->writeString8(cur.mName);
480 reply->writeInt32(cur.mRoles.size());
481 for (List<String8>::iterator role_it = cur.mRoles.begin();
482 role_it != cur.mRoles.end(); ++role_it) {
483 reply->writeString8(*role_it);
484 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700485 }
486
487 return NO_ERROR;
488 }
489
490 case ALLOCATE_NODE:
491 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800492 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700493
Andreas Huber318ad9c2009-10-15 13:46:54 -0700494 const char *name = data.readCString();
495
496 sp<IOMXObserver> observer =
497 interface_cast<IOMXObserver>(data.readStrongBinder());
498
Andreas Huber20111aa2009-07-14 16:56:47 -0700499 node_id node;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700500
501 status_t err = allocateNode(name, observer, &node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700502 reply->writeInt32(err);
503 if (err == OK) {
Andreas Huberc6b59b72009-08-17 13:33:27 -0700504 reply->writeIntPtr((intptr_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700505 }
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800506
Andreas Huber20111aa2009-07-14 16:56:47 -0700507 return NO_ERROR;
508 }
509
510 case FREE_NODE:
511 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800512 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700513
Andreas Huberc6b59b72009-08-17 13:33:27 -0700514 node_id node = (void*)data.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700515
Andreas Huber318ad9c2009-10-15 13:46:54 -0700516 reply->writeInt32(freeNode(node));
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800517
Andreas Huber20111aa2009-07-14 16:56:47 -0700518 return NO_ERROR;
519 }
520
521 case SEND_COMMAND:
522 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800523 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700524
Andreas Huberc6b59b72009-08-17 13:33:27 -0700525 node_id node = (void*)data.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700526
527 OMX_COMMANDTYPE cmd =
528 static_cast<OMX_COMMANDTYPE>(data.readInt32());
529
530 OMX_S32 param = data.readInt32();
Andreas Huber318ad9c2009-10-15 13:46:54 -0700531 reply->writeInt32(sendCommand(node, cmd, param));
Andreas Huber20111aa2009-07-14 16:56:47 -0700532
533 return NO_ERROR;
534 }
535
536 case GET_PARAMETER:
Andreas Huber20111aa2009-07-14 16:56:47 -0700537 case SET_PARAMETER:
Andreas Huber693d2712009-08-14 14:37:10 -0700538 case GET_CONFIG:
Andreas Huber693d2712009-08-14 14:37:10 -0700539 case SET_CONFIG:
540 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800541 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber693d2712009-08-14 14:37:10 -0700542
Andreas Huberc6b59b72009-08-17 13:33:27 -0700543 node_id node = (void*)data.readIntPtr();
Andreas Huber693d2712009-08-14 14:37:10 -0700544 OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
545
546 size_t size = data.readInt32();
Andreas Huber693d2712009-08-14 14:37:10 -0700547
Andreas Huberb3912902011-01-19 10:34:52 -0800548 void *params = malloc(size);
549 data.read(params, size);
550
551 status_t err;
552 switch (code) {
553 case GET_PARAMETER:
554 err = getParameter(node, index, params, size);
555 break;
556 case SET_PARAMETER:
557 err = setParameter(node, index, params, size);
558 break;
559 case GET_CONFIG:
560 err = getConfig(node, index, params, size);
561 break;
562 case SET_CONFIG:
563 err = setConfig(node, index, params, size);
564 break;
565 default:
566 TRESPASS();
567 }
568
569 reply->writeInt32(err);
570
571 if ((code == GET_PARAMETER || code == GET_CONFIG) && err == OK) {
572 reply->write(params, size);
573 }
574
575 free(params);
576 params = NULL;
Andreas Huber693d2712009-08-14 14:37:10 -0700577
578 return NO_ERROR;
579 }
580
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700581 case GET_STATE:
582 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800583 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700584
585 node_id node = (void*)data.readIntPtr();
586 OMX_STATETYPE state = OMX_StateInvalid;
587
588 status_t err = getState(node, &state);
589 reply->writeInt32(state);
590 reply->writeInt32(err);
591
592 return NO_ERROR;
593 }
594
Jamie Gennis83750ea2010-08-30 16:48:38 -0700595 case ENABLE_GRAPHIC_BUFFERS:
596 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800597 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700598
599 node_id node = (void*)data.readIntPtr();
600 OMX_U32 port_index = data.readInt32();
601 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
602
603 status_t err = enableGraphicBuffers(node, port_index, enable);
604 reply->writeInt32(err);
605
606 return NO_ERROR;
607 }
608
Jamie Gennise2ce6452011-02-23 19:01:28 -0800609 case GET_GRAPHIC_BUFFER_USAGE:
610 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800611 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennise2ce6452011-02-23 19:01:28 -0800612
613 node_id node = (void*)data.readIntPtr();
614 OMX_U32 port_index = data.readInt32();
615
616 OMX_U32 usage = 0;
617 status_t err = getGraphicBufferUsage(node, port_index, &usage);
618 reply->writeInt32(err);
619 reply->writeInt32(usage);
620
621 return NO_ERROR;
622 }
623
Andreas Huber20111aa2009-07-14 16:56:47 -0700624 case USE_BUFFER:
625 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800626 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700627
Andreas Huberc6b59b72009-08-17 13:33:27 -0700628 node_id node = (void*)data.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700629 OMX_U32 port_index = data.readInt32();
630 sp<IMemory> params =
631 interface_cast<IMemory>(data.readStrongBinder());
632
633 buffer_id buffer;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700634 status_t err = useBuffer(node, port_index, params, &buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700635 reply->writeInt32(err);
636
637 if (err == OK) {
Andreas Huberc6b59b72009-08-17 13:33:27 -0700638 reply->writeIntPtr((intptr_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700639 }
640
641 return NO_ERROR;
642 }
643
Jamie Gennis83750ea2010-08-30 16:48:38 -0700644 case USE_GRAPHIC_BUFFER:
645 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800646 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700647
648 node_id node = (void*)data.readIntPtr();
649 OMX_U32 port_index = data.readInt32();
650 sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
651 data.read(*graphicBuffer);
652
653 buffer_id buffer;
654 status_t err = useGraphicBuffer(
655 node, port_index, graphicBuffer, &buffer);
656 reply->writeInt32(err);
657
658 if (err == OK) {
659 reply->writeIntPtr((intptr_t)buffer);
660 }
661
662 return NO_ERROR;
663 }
664
Andy McFadden7cd58532013-02-19 07:28:30 -0800665 case CREATE_INPUT_SURFACE:
666 {
667 CHECK_OMX_INTERFACE(IOMX, data, reply);
668
669 node_id node = (void*)data.readIntPtr();
670 OMX_U32 port_index = data.readInt32();
671
672 sp<IGraphicBufferProducer> bufferProducer;
673 status_t err = createInputSurface(node, port_index,
674 &bufferProducer);
675
676 reply->writeInt32(err);
677
678 if (err == OK) {
679 reply->writeStrongBinder(bufferProducer->asBinder());
680 }
681
682 return NO_ERROR;
683 }
684
685 case SIGNAL_END_OF_INPUT_STREAM:
686 {
687 CHECK_OMX_INTERFACE(IOMX, data, reply);
688
689 node_id node = (void*)data.readIntPtr();
690
691 status_t err = signalEndOfInputStream(node);
692 reply->writeInt32(err);
693
694 return NO_ERROR;
695 }
696
James Donge8707722010-10-20 17:38:41 -0700697 case STORE_META_DATA_IN_BUFFERS:
698 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800699 CHECK_OMX_INTERFACE(IOMX, data, reply);
James Donge8707722010-10-20 17:38:41 -0700700
701 node_id node = (void*)data.readIntPtr();
702 OMX_U32 port_index = data.readInt32();
703 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
704
705 status_t err = storeMetaDataInBuffers(node, port_index, enable);
706 reply->writeInt32(err);
707
708 return NO_ERROR;
709 }
710
Andreas Huber20111aa2009-07-14 16:56:47 -0700711 case ALLOC_BUFFER:
712 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800713 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700714
Andreas Huberc6b59b72009-08-17 13:33:27 -0700715 node_id node = (void*)data.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700716 OMX_U32 port_index = data.readInt32();
717 size_t size = data.readInt32();
718
719 buffer_id buffer;
Andreas Huber570a3cb2010-01-20 15:05:46 -0800720 void *buffer_data;
721 status_t err = allocateBuffer(
722 node, port_index, size, &buffer, &buffer_data);
Andreas Huber20111aa2009-07-14 16:56:47 -0700723 reply->writeInt32(err);
724
725 if (err == OK) {
Andreas Huberc6b59b72009-08-17 13:33:27 -0700726 reply->writeIntPtr((intptr_t)buffer);
Andreas Huber570a3cb2010-01-20 15:05:46 -0800727 reply->writeIntPtr((intptr_t)buffer_data);
Andreas Huber20111aa2009-07-14 16:56:47 -0700728 }
729
730 return NO_ERROR;
731 }
732
733 case ALLOC_BUFFER_WITH_BACKUP:
734 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800735 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700736
Andreas Huberc6b59b72009-08-17 13:33:27 -0700737 node_id node = (void*)data.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700738 OMX_U32 port_index = data.readInt32();
739 sp<IMemory> params =
740 interface_cast<IMemory>(data.readStrongBinder());
741
742 buffer_id buffer;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700743 status_t err = allocateBufferWithBackup(
Andreas Huber20111aa2009-07-14 16:56:47 -0700744 node, port_index, params, &buffer);
745
746 reply->writeInt32(err);
747
748 if (err == OK) {
Andreas Huberc6b59b72009-08-17 13:33:27 -0700749 reply->writeIntPtr((intptr_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700750 }
751
752 return NO_ERROR;
753 }
754
755 case FREE_BUFFER:
756 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800757 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700758
Andreas Huberc6b59b72009-08-17 13:33:27 -0700759 node_id node = (void*)data.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700760 OMX_U32 port_index = data.readInt32();
Andreas Huberc6b59b72009-08-17 13:33:27 -0700761 buffer_id buffer = (void*)data.readIntPtr();
Andreas Huber318ad9c2009-10-15 13:46:54 -0700762 reply->writeInt32(freeBuffer(node, port_index, buffer));
Andreas Huber20111aa2009-07-14 16:56:47 -0700763
764 return NO_ERROR;
765 }
766
767 case FILL_BUFFER:
768 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800769 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700770
Andreas Huberc6b59b72009-08-17 13:33:27 -0700771 node_id node = (void*)data.readIntPtr();
772 buffer_id buffer = (void*)data.readIntPtr();
Andreas Huber318ad9c2009-10-15 13:46:54 -0700773 reply->writeInt32(fillBuffer(node, buffer));
Andreas Huber20111aa2009-07-14 16:56:47 -0700774
775 return NO_ERROR;
776 }
777
778 case EMPTY_BUFFER:
779 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800780 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700781
Andreas Huberc6b59b72009-08-17 13:33:27 -0700782 node_id node = (void*)data.readIntPtr();
783 buffer_id buffer = (void*)data.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700784 OMX_U32 range_offset = data.readInt32();
785 OMX_U32 range_length = data.readInt32();
786 OMX_U32 flags = data.readInt32();
787 OMX_TICKS timestamp = data.readInt64();
788
Andreas Huber36efa032009-10-08 11:02:27 -0700789 reply->writeInt32(
Andreas Huber318ad9c2009-10-15 13:46:54 -0700790 emptyBuffer(
Andreas Huber36efa032009-10-08 11:02:27 -0700791 node, buffer, range_offset, range_length,
792 flags, timestamp));
Andreas Huber20111aa2009-07-14 16:56:47 -0700793
794 return NO_ERROR;
795 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700796
Andreas Huber693d2712009-08-14 14:37:10 -0700797 case GET_EXTENSION_INDEX:
798 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800799 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber693d2712009-08-14 14:37:10 -0700800
Andreas Huberc6b59b72009-08-17 13:33:27 -0700801 node_id node = (void*)data.readIntPtr();
Andreas Huber693d2712009-08-14 14:37:10 -0700802 const char *parameter_name = data.readCString();
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800803
Andreas Huber693d2712009-08-14 14:37:10 -0700804 OMX_INDEXTYPE index;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700805 status_t err = getExtensionIndex(node, parameter_name, &index);
Andreas Huber693d2712009-08-14 14:37:10 -0700806
807 reply->writeInt32(err);
808
809 if (err == OK) {
810 reply->writeInt32(index);
811 }
812
813 return OK;
814 }
815
Andreas Huber20111aa2009-07-14 16:56:47 -0700816 default:
817 return BBinder::onTransact(code, data, reply, flags);
818 }
819}
820
821////////////////////////////////////////////////////////////////////////////////
822
823class BpOMXObserver : public BpInterface<IOMXObserver> {
824public:
825 BpOMXObserver(const sp<IBinder> &impl)
826 : BpInterface<IOMXObserver>(impl) {
827 }
828
Andreas Huber318ad9c2009-10-15 13:46:54 -0700829 virtual void onMessage(const omx_message &msg) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700830 Parcel data, reply;
831 data.writeInterfaceToken(IOMXObserver::getInterfaceDescriptor());
832 data.write(&msg, sizeof(msg));
833
834 remote()->transact(OBSERVER_ON_MSG, data, &reply, IBinder::FLAG_ONEWAY);
835 }
836};
837
838IMPLEMENT_META_INTERFACE(OMXObserver, "android.hardware.IOMXObserver");
839
840status_t BnOMXObserver::onTransact(
841 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
842 switch (code) {
843 case OBSERVER_ON_MSG:
844 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800845 CHECK_OMX_INTERFACE(IOMXObserver, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700846
847 omx_message msg;
848 data.read(&msg, sizeof(msg));
849
850 // XXX Could use readInplace maybe?
Andreas Huber318ad9c2009-10-15 13:46:54 -0700851 onMessage(msg);
Andreas Huber20111aa2009-07-14 16:56:47 -0700852
853 return NO_ERROR;
854 }
855
856 default:
857 return BBinder::onTransact(code, data, reply, flags);
858 }
859}
860
Andreas Huber20111aa2009-07-14 16:56:47 -0700861} // namespace android