blob: d3aab084082228bf069be38f0d523779b431553a [file] [log] [blame]
James Dong2f1f2242011-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 Hubere46b7be2009-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 Huberd95b46a2011-01-19 10:34:52 -080024#include <media/stagefright/foundation/ADebug.h>
Mathias Agopian000479f2010-02-09 17:46:37 -080025#include <surfaceflinger/ISurface.h>
26#include <surfaceflinger/Surface.h>
Andreas Hubere46b7be2009-07-14 16:56:47 -070027
28namespace android {
29
30enum {
31 CONNECT = IBinder::FIRST_CALL_TRANSACTION,
Andreas Huberf1fe0642010-01-15 15:28:19 -080032 LIVES_LOCALLY,
Andreas Hubere46b7be2009-07-14 16:56:47 -070033 LIST_NODES,
34 ALLOCATE_NODE,
35 FREE_NODE,
36 SEND_COMMAND,
37 GET_PARAMETER,
38 SET_PARAMETER,
Andreas Huberbe06d262009-08-14 14:37:10 -070039 GET_CONFIG,
40 SET_CONFIG,
Jamie Gennis33a78142010-08-30 16:48:38 -070041 ENABLE_GRAPHIC_BUFFERS,
Andreas Hubere46b7be2009-07-14 16:56:47 -070042 USE_BUFFER,
Jamie Gennis33a78142010-08-30 16:48:38 -070043 USE_GRAPHIC_BUFFER,
James Dong387e38d2010-10-20 17:38:41 -070044 STORE_META_DATA_IN_BUFFERS,
Andreas Hubere46b7be2009-07-14 16:56:47 -070045 ALLOC_BUFFER,
46 ALLOC_BUFFER_WITH_BACKUP,
47 FREE_BUFFER,
Andreas Hubere46b7be2009-07-14 16:56:47 -070048 FILL_BUFFER,
49 EMPTY_BUFFER,
Andreas Huberbe06d262009-08-14 14:37:10 -070050 GET_EXTENSION_INDEX,
Andreas Hubere46b7be2009-07-14 16:56:47 -070051 OBSERVER_ON_MSG,
Jamie Gennise6befb82011-02-23 19:01:28 -080052 GET_GRAPHIC_BUFFER_USAGE,
Andreas Hubere46b7be2009-07-14 16:56:47 -070053};
54
Andreas Hubere46b7be2009-07-14 16:56:47 -070055class BpOMX : public BpInterface<IOMX> {
56public:
57 BpOMX(const sp<IBinder> &impl)
58 : BpInterface<IOMX>(impl) {
59 }
60
Andreas Huberf1fe0642010-01-15 15:28:19 -080061 virtual bool livesLocally(pid_t pid) {
62 Parcel data, reply;
63 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
64 data.writeInt32(pid);
65 remote()->transact(LIVES_LOCALLY, data, &reply);
66
67 return reply.readInt32() != 0;
68 }
69
Andreas Huber2ea14e22009-12-16 09:30:55 -080070 virtual status_t listNodes(List<ComponentInfo> *list) {
Andreas Hubere46b7be2009-07-14 16:56:47 -070071 list->clear();
72
73 Parcel data, reply;
74 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
75 remote()->transact(LIST_NODES, data, &reply);
76
77 int32_t n = reply.readInt32();
78 for (int32_t i = 0; i < n; ++i) {
Andreas Huber2ea14e22009-12-16 09:30:55 -080079 list->push_back(ComponentInfo());
80 ComponentInfo &info = *--list->end();
Andreas Hubere46b7be2009-07-14 16:56:47 -070081
Andreas Huber2ea14e22009-12-16 09:30:55 -080082 info.mName = reply.readString8();
83 int32_t numRoles = reply.readInt32();
84 for (int32_t j = 0; j < numRoles; ++j) {
85 info.mRoles.push_back(reply.readString8());
86 }
Andreas Hubere46b7be2009-07-14 16:56:47 -070087 }
88
89 return OK;
90 }
91
Andreas Huber784202e2009-10-15 13:46:54 -070092 virtual status_t allocateNode(
93 const char *name, const sp<IOMXObserver> &observer, node_id *node) {
Andreas Hubere46b7be2009-07-14 16:56:47 -070094 Parcel data, reply;
95 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
96 data.writeCString(name);
Andreas Huber784202e2009-10-15 13:46:54 -070097 data.writeStrongBinder(observer->asBinder());
Andreas Hubere46b7be2009-07-14 16:56:47 -070098 remote()->transact(ALLOCATE_NODE, data, &reply);
99
100 status_t err = reply.readInt32();
101 if (err == OK) {
Andreas Huber2f10ae02009-08-17 13:33:27 -0700102 *node = (void*)reply.readIntPtr();
Andreas Hubere46b7be2009-07-14 16:56:47 -0700103 } else {
104 *node = 0;
105 }
106
107 return err;
108 }
109
Andreas Huber784202e2009-10-15 13:46:54 -0700110 virtual status_t freeNode(node_id node) {
Andreas Hubere46b7be2009-07-14 16:56:47 -0700111 Parcel data, reply;
112 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huber2f10ae02009-08-17 13:33:27 -0700113 data.writeIntPtr((intptr_t)node);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700114 remote()->transact(FREE_NODE, data, &reply);
115
116 return reply.readInt32();
117 }
118
Andreas Huber784202e2009-10-15 13:46:54 -0700119 virtual status_t sendCommand(
Andreas Hubere46b7be2009-07-14 16:56:47 -0700120 node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) {
121 Parcel data, reply;
122 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huber2f10ae02009-08-17 13:33:27 -0700123 data.writeIntPtr((intptr_t)node);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700124 data.writeInt32(cmd);
125 data.writeInt32(param);
126 remote()->transact(SEND_COMMAND, data, &reply);
127
128 return reply.readInt32();
129 }
130
Andreas Huber784202e2009-10-15 13:46:54 -0700131 virtual status_t getParameter(
Andreas Hubere46b7be2009-07-14 16:56:47 -0700132 node_id node, OMX_INDEXTYPE index,
133 void *params, size_t size) {
134 Parcel data, reply;
135 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huber2f10ae02009-08-17 13:33:27 -0700136 data.writeIntPtr((intptr_t)node);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700137 data.writeInt32(index);
138 data.writeInt32(size);
139 data.write(params, size);
140 remote()->transact(GET_PARAMETER, data, &reply);
141
142 status_t err = reply.readInt32();
143 if (err != OK) {
144 return err;
145 }
146
147 reply.read(params, size);
148
149 return OK;
150 }
151
Andreas Huber784202e2009-10-15 13:46:54 -0700152 virtual status_t setParameter(
Andreas Hubere46b7be2009-07-14 16:56:47 -0700153 node_id node, OMX_INDEXTYPE index,
154 const void *params, size_t size) {
155 Parcel data, reply;
156 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huber2f10ae02009-08-17 13:33:27 -0700157 data.writeIntPtr((intptr_t)node);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700158 data.writeInt32(index);
159 data.writeInt32(size);
160 data.write(params, size);
161 remote()->transact(SET_PARAMETER, data, &reply);
162
163 return reply.readInt32();
164 }
165
Andreas Huber784202e2009-10-15 13:46:54 -0700166 virtual status_t getConfig(
Andreas Huberbe06d262009-08-14 14:37:10 -0700167 node_id node, OMX_INDEXTYPE index,
168 void *params, size_t size) {
169 Parcel data, reply;
170 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huber2f10ae02009-08-17 13:33:27 -0700171 data.writeIntPtr((intptr_t)node);
Andreas Huberbe06d262009-08-14 14:37:10 -0700172 data.writeInt32(index);
173 data.writeInt32(size);
174 data.write(params, size);
175 remote()->transact(GET_CONFIG, data, &reply);
176
177 status_t err = reply.readInt32();
178 if (err != OK) {
179 return err;
180 }
181
182 reply.read(params, size);
183
184 return OK;
185 }
186
Andreas Huber784202e2009-10-15 13:46:54 -0700187 virtual status_t setConfig(
Andreas Huberbe06d262009-08-14 14:37:10 -0700188 node_id node, OMX_INDEXTYPE index,
189 const void *params, size_t size) {
190 Parcel data, reply;
191 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huber2f10ae02009-08-17 13:33:27 -0700192 data.writeIntPtr((intptr_t)node);
Andreas Huberbe06d262009-08-14 14:37:10 -0700193 data.writeInt32(index);
194 data.writeInt32(size);
195 data.write(params, size);
196 remote()->transact(SET_CONFIG, data, &reply);
197
198 return reply.readInt32();
199 }
200
Jamie Gennis33a78142010-08-30 16:48:38 -0700201 virtual status_t enableGraphicBuffers(
202 node_id node, OMX_U32 port_index, OMX_BOOL enable) {
203 Parcel data, reply;
204 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
205 data.writeIntPtr((intptr_t)node);
206 data.writeInt32(port_index);
207 data.writeInt32((uint32_t)enable);
208 remote()->transact(ENABLE_GRAPHIC_BUFFERS, data, &reply);
209
210 status_t err = reply.readInt32();
211 return err;
212 }
213
Jamie Gennise6befb82011-02-23 19:01:28 -0800214 virtual status_t getGraphicBufferUsage(
215 node_id node, OMX_U32 port_index, OMX_U32* usage) {
216 Parcel data, reply;
217 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
218 data.writeIntPtr((intptr_t)node);
219 data.writeInt32(port_index);
220 remote()->transact(GET_GRAPHIC_BUFFER_USAGE, data, &reply);
221
222 status_t err = reply.readInt32();
223 *usage = reply.readInt32();
224 return err;
225 }
226
Andreas Huber784202e2009-10-15 13:46:54 -0700227 virtual status_t useBuffer(
Andreas Hubere46b7be2009-07-14 16:56:47 -0700228 node_id node, OMX_U32 port_index, const sp<IMemory> &params,
229 buffer_id *buffer) {
230 Parcel data, reply;
231 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huber2f10ae02009-08-17 13:33:27 -0700232 data.writeIntPtr((intptr_t)node);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700233 data.writeInt32(port_index);
234 data.writeStrongBinder(params->asBinder());
235 remote()->transact(USE_BUFFER, data, &reply);
236
237 status_t err = reply.readInt32();
238 if (err != OK) {
239 *buffer = 0;
240
241 return err;
242 }
243
Andreas Huber2f10ae02009-08-17 13:33:27 -0700244 *buffer = (void*)reply.readIntPtr();
Andreas Hubere46b7be2009-07-14 16:56:47 -0700245
246 return err;
247 }
248
Jamie Gennis33a78142010-08-30 16:48:38 -0700249
250 virtual status_t useGraphicBuffer(
251 node_id node, OMX_U32 port_index,
252 const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) {
253 Parcel data, reply;
254 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
255 data.writeIntPtr((intptr_t)node);
256 data.writeInt32(port_index);
257 data.write(*graphicBuffer);
258 remote()->transact(USE_GRAPHIC_BUFFER, data, &reply);
259
260 status_t err = reply.readInt32();
261 if (err != OK) {
262 *buffer = 0;
263
264 return err;
265 }
266
267 *buffer = (void*)reply.readIntPtr();
268
269 return err;
270 }
271
James Dong387e38d2010-10-20 17:38:41 -0700272 virtual status_t storeMetaDataInBuffers(
273 node_id node, OMX_U32 port_index, OMX_BOOL enable) {
274 Parcel data, reply;
275 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
276 data.writeIntPtr((intptr_t)node);
277 data.writeInt32(port_index);
278 data.writeInt32((uint32_t)enable);
279 remote()->transact(STORE_META_DATA_IN_BUFFERS, data, &reply);
280
281 status_t err = reply.readInt32();
282 return err;
283 }
284
Andreas Huber784202e2009-10-15 13:46:54 -0700285 virtual status_t allocateBuffer(
Andreas Hubere46b7be2009-07-14 16:56:47 -0700286 node_id node, OMX_U32 port_index, size_t size,
Andreas Huberc712b9f2010-01-20 15:05:46 -0800287 buffer_id *buffer, void **buffer_data) {
Andreas Hubere46b7be2009-07-14 16:56:47 -0700288 Parcel data, reply;
289 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huber2f10ae02009-08-17 13:33:27 -0700290 data.writeIntPtr((intptr_t)node);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700291 data.writeInt32(port_index);
292 data.writeInt32(size);
293 remote()->transact(ALLOC_BUFFER, data, &reply);
294
295 status_t err = reply.readInt32();
296 if (err != OK) {
297 *buffer = 0;
298
299 return err;
300 }
301
Andreas Huberc712b9f2010-01-20 15:05:46 -0800302 *buffer = (void *)reply.readIntPtr();
303 *buffer_data = (void *)reply.readIntPtr();
Andreas Hubere46b7be2009-07-14 16:56:47 -0700304
305 return err;
306 }
307
Andreas Huber784202e2009-10-15 13:46:54 -0700308 virtual status_t allocateBufferWithBackup(
Andreas Hubere46b7be2009-07-14 16:56:47 -0700309 node_id node, OMX_U32 port_index, const sp<IMemory> &params,
310 buffer_id *buffer) {
311 Parcel data, reply;
312 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huber2f10ae02009-08-17 13:33:27 -0700313 data.writeIntPtr((intptr_t)node);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700314 data.writeInt32(port_index);
315 data.writeStrongBinder(params->asBinder());
316 remote()->transact(ALLOC_BUFFER_WITH_BACKUP, data, &reply);
317
318 status_t err = reply.readInt32();
319 if (err != OK) {
320 *buffer = 0;
321
322 return err;
323 }
324
Andreas Huber2f10ae02009-08-17 13:33:27 -0700325 *buffer = (void*)reply.readIntPtr();
Andreas Hubere46b7be2009-07-14 16:56:47 -0700326
327 return err;
328 }
329
Andreas Huber784202e2009-10-15 13:46:54 -0700330 virtual status_t freeBuffer(
Andreas Hubere46b7be2009-07-14 16:56:47 -0700331 node_id node, OMX_U32 port_index, buffer_id buffer) {
332 Parcel data, reply;
333 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huber2f10ae02009-08-17 13:33:27 -0700334 data.writeIntPtr((intptr_t)node);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700335 data.writeInt32(port_index);
Andreas Huber2f10ae02009-08-17 13:33:27 -0700336 data.writeIntPtr((intptr_t)buffer);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700337 remote()->transact(FREE_BUFFER, data, &reply);
338
339 return reply.readInt32();
340 }
341
Andreas Huber784202e2009-10-15 13:46:54 -0700342 virtual status_t fillBuffer(node_id node, buffer_id buffer) {
Andreas Hubere46b7be2009-07-14 16:56:47 -0700343 Parcel data, reply;
344 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huber2f10ae02009-08-17 13:33:27 -0700345 data.writeIntPtr((intptr_t)node);
346 data.writeIntPtr((intptr_t)buffer);
Andreas Huber3f427072009-10-08 11:02:27 -0700347 remote()->transact(FILL_BUFFER, data, &reply);
348
349 return reply.readInt32();
Andreas Hubere46b7be2009-07-14 16:56:47 -0700350 }
351
Andreas Huber784202e2009-10-15 13:46:54 -0700352 virtual status_t emptyBuffer(
Andreas Hubere46b7be2009-07-14 16:56:47 -0700353 node_id node,
354 buffer_id buffer,
355 OMX_U32 range_offset, OMX_U32 range_length,
356 OMX_U32 flags, OMX_TICKS timestamp) {
357 Parcel data, reply;
358 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huber2f10ae02009-08-17 13:33:27 -0700359 data.writeIntPtr((intptr_t)node);
360 data.writeIntPtr((intptr_t)buffer);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700361 data.writeInt32(range_offset);
362 data.writeInt32(range_length);
363 data.writeInt32(flags);
364 data.writeInt64(timestamp);
Andreas Huber3f427072009-10-08 11:02:27 -0700365 remote()->transact(EMPTY_BUFFER, data, &reply);
366
367 return reply.readInt32();
Andreas Hubere46b7be2009-07-14 16:56:47 -0700368 }
Andreas Huber1de13162009-07-31 11:52:50 -0700369
Andreas Huber784202e2009-10-15 13:46:54 -0700370 virtual status_t getExtensionIndex(
Andreas Huberbe06d262009-08-14 14:37:10 -0700371 node_id node,
372 const char *parameter_name,
373 OMX_INDEXTYPE *index) {
374 Parcel data, reply;
375 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andreas Huber2f10ae02009-08-17 13:33:27 -0700376 data.writeIntPtr((intptr_t)node);
Andreas Huberbe06d262009-08-14 14:37:10 -0700377 data.writeCString(parameter_name);
378
379 remote()->transact(GET_EXTENSION_INDEX, data, &reply);
380
381 status_t err = reply.readInt32();
382 if (err == OK) {
383 *index = static_cast<OMX_INDEXTYPE>(reply.readInt32());
384 } else {
385 *index = OMX_IndexComponentStartUnused;
386 }
387
388 return err;
389 }
Andreas Hubere46b7be2009-07-14 16:56:47 -0700390};
391
392IMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX");
393
394////////////////////////////////////////////////////////////////////////////////
395
396#define CHECK_INTERFACE(interface, data, reply) \
397 do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \
398 LOGW("Call incorrectly routed to " #interface); \
399 return PERMISSION_DENIED; \
400 } } while (0)
401
402status_t BnOMX::onTransact(
403 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
404 switch (code) {
Andreas Huberf1fe0642010-01-15 15:28:19 -0800405 case LIVES_LOCALLY:
406 {
407 CHECK_INTERFACE(IOMX, data, reply);
408 reply->writeInt32(livesLocally((pid_t)data.readInt32()));
409
410 return OK;
411 }
412
Andreas Hubere46b7be2009-07-14 16:56:47 -0700413 case LIST_NODES:
414 {
415 CHECK_INTERFACE(IOMX, data, reply);
416
Andreas Huber2ea14e22009-12-16 09:30:55 -0800417 List<ComponentInfo> list;
Andreas Huber784202e2009-10-15 13:46:54 -0700418 listNodes(&list);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700419
420 reply->writeInt32(list.size());
Andreas Huber2ea14e22009-12-16 09:30:55 -0800421 for (List<ComponentInfo>::iterator it = list.begin();
Andreas Hubere46b7be2009-07-14 16:56:47 -0700422 it != list.end(); ++it) {
Andreas Huber2ea14e22009-12-16 09:30:55 -0800423 ComponentInfo &cur = *it;
424
425 reply->writeString8(cur.mName);
426 reply->writeInt32(cur.mRoles.size());
427 for (List<String8>::iterator role_it = cur.mRoles.begin();
428 role_it != cur.mRoles.end(); ++role_it) {
429 reply->writeString8(*role_it);
430 }
Andreas Hubere46b7be2009-07-14 16:56:47 -0700431 }
432
433 return NO_ERROR;
434 }
435
436 case ALLOCATE_NODE:
437 {
438 CHECK_INTERFACE(IOMX, data, reply);
439
Andreas Huber784202e2009-10-15 13:46:54 -0700440 const char *name = data.readCString();
441
442 sp<IOMXObserver> observer =
443 interface_cast<IOMXObserver>(data.readStrongBinder());
444
Andreas Hubere46b7be2009-07-14 16:56:47 -0700445 node_id node;
Andreas Huber784202e2009-10-15 13:46:54 -0700446
447 status_t err = allocateNode(name, observer, &node);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700448 reply->writeInt32(err);
449 if (err == OK) {
Andreas Huber2f10ae02009-08-17 13:33:27 -0700450 reply->writeIntPtr((intptr_t)node);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700451 }
Andreas Huberf1fe0642010-01-15 15:28:19 -0800452
Andreas Hubere46b7be2009-07-14 16:56:47 -0700453 return NO_ERROR;
454 }
455
456 case FREE_NODE:
457 {
458 CHECK_INTERFACE(IOMX, data, reply);
459
Andreas Huber2f10ae02009-08-17 13:33:27 -0700460 node_id node = (void*)data.readIntPtr();
Andreas Hubere46b7be2009-07-14 16:56:47 -0700461
Andreas Huber784202e2009-10-15 13:46:54 -0700462 reply->writeInt32(freeNode(node));
Andreas Huberf1fe0642010-01-15 15:28:19 -0800463
Andreas Hubere46b7be2009-07-14 16:56:47 -0700464 return NO_ERROR;
465 }
466
467 case SEND_COMMAND:
468 {
469 CHECK_INTERFACE(IOMX, data, reply);
470
Andreas Huber2f10ae02009-08-17 13:33:27 -0700471 node_id node = (void*)data.readIntPtr();
Andreas Hubere46b7be2009-07-14 16:56:47 -0700472
473 OMX_COMMANDTYPE cmd =
474 static_cast<OMX_COMMANDTYPE>(data.readInt32());
475
476 OMX_S32 param = data.readInt32();
Andreas Huber784202e2009-10-15 13:46:54 -0700477 reply->writeInt32(sendCommand(node, cmd, param));
Andreas Hubere46b7be2009-07-14 16:56:47 -0700478
479 return NO_ERROR;
480 }
481
482 case GET_PARAMETER:
Andreas Hubere46b7be2009-07-14 16:56:47 -0700483 case SET_PARAMETER:
Andreas Huberbe06d262009-08-14 14:37:10 -0700484 case GET_CONFIG:
Andreas Huberbe06d262009-08-14 14:37:10 -0700485 case SET_CONFIG:
486 {
487 CHECK_INTERFACE(IOMX, data, reply);
488
Andreas Huber2f10ae02009-08-17 13:33:27 -0700489 node_id node = (void*)data.readIntPtr();
Andreas Huberbe06d262009-08-14 14:37:10 -0700490 OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
491
492 size_t size = data.readInt32();
Andreas Huberbe06d262009-08-14 14:37:10 -0700493
Andreas Huberd95b46a2011-01-19 10:34:52 -0800494 void *params = malloc(size);
495 data.read(params, size);
496
497 status_t err;
498 switch (code) {
499 case GET_PARAMETER:
500 err = getParameter(node, index, params, size);
501 break;
502 case SET_PARAMETER:
503 err = setParameter(node, index, params, size);
504 break;
505 case GET_CONFIG:
506 err = getConfig(node, index, params, size);
507 break;
508 case SET_CONFIG:
509 err = setConfig(node, index, params, size);
510 break;
511 default:
512 TRESPASS();
513 }
514
515 reply->writeInt32(err);
516
517 if ((code == GET_PARAMETER || code == GET_CONFIG) && err == OK) {
518 reply->write(params, size);
519 }
520
521 free(params);
522 params = NULL;
Andreas Huberbe06d262009-08-14 14:37:10 -0700523
524 return NO_ERROR;
525 }
526
Jamie Gennis33a78142010-08-30 16:48:38 -0700527 case ENABLE_GRAPHIC_BUFFERS:
528 {
529 CHECK_INTERFACE(IOMX, data, reply);
530
531 node_id node = (void*)data.readIntPtr();
532 OMX_U32 port_index = data.readInt32();
533 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
534
535 status_t err = enableGraphicBuffers(node, port_index, enable);
536 reply->writeInt32(err);
537
538 return NO_ERROR;
539 }
540
Jamie Gennise6befb82011-02-23 19:01:28 -0800541 case GET_GRAPHIC_BUFFER_USAGE:
542 {
543 CHECK_INTERFACE(IOMX, data, reply);
544
545 node_id node = (void*)data.readIntPtr();
546 OMX_U32 port_index = data.readInt32();
547
548 OMX_U32 usage = 0;
549 status_t err = getGraphicBufferUsage(node, port_index, &usage);
550 reply->writeInt32(err);
551 reply->writeInt32(usage);
552
553 return NO_ERROR;
554 }
555
Andreas Hubere46b7be2009-07-14 16:56:47 -0700556 case USE_BUFFER:
557 {
558 CHECK_INTERFACE(IOMX, data, reply);
559
Andreas Huber2f10ae02009-08-17 13:33:27 -0700560 node_id node = (void*)data.readIntPtr();
Andreas Hubere46b7be2009-07-14 16:56:47 -0700561 OMX_U32 port_index = data.readInt32();
562 sp<IMemory> params =
563 interface_cast<IMemory>(data.readStrongBinder());
564
565 buffer_id buffer;
Andreas Huber784202e2009-10-15 13:46:54 -0700566 status_t err = useBuffer(node, port_index, params, &buffer);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700567 reply->writeInt32(err);
568
569 if (err == OK) {
Andreas Huber2f10ae02009-08-17 13:33:27 -0700570 reply->writeIntPtr((intptr_t)buffer);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700571 }
572
573 return NO_ERROR;
574 }
575
Jamie Gennis33a78142010-08-30 16:48:38 -0700576 case USE_GRAPHIC_BUFFER:
577 {
578 CHECK_INTERFACE(IOMX, data, reply);
579
580 node_id node = (void*)data.readIntPtr();
581 OMX_U32 port_index = data.readInt32();
582 sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
583 data.read(*graphicBuffer);
584
585 buffer_id buffer;
586 status_t err = useGraphicBuffer(
587 node, port_index, graphicBuffer, &buffer);
588 reply->writeInt32(err);
589
590 if (err == OK) {
591 reply->writeIntPtr((intptr_t)buffer);
592 }
593
594 return NO_ERROR;
595 }
596
James Dong387e38d2010-10-20 17:38:41 -0700597 case STORE_META_DATA_IN_BUFFERS:
598 {
599 CHECK_INTERFACE(IOMX, data, reply);
600
601 node_id node = (void*)data.readIntPtr();
602 OMX_U32 port_index = data.readInt32();
603 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
604
605 status_t err = storeMetaDataInBuffers(node, port_index, enable);
606 reply->writeInt32(err);
607
608 return NO_ERROR;
609 }
610
Andreas Hubere46b7be2009-07-14 16:56:47 -0700611 case ALLOC_BUFFER:
612 {
613 CHECK_INTERFACE(IOMX, data, reply);
614
Andreas Huber2f10ae02009-08-17 13:33:27 -0700615 node_id node = (void*)data.readIntPtr();
Andreas Hubere46b7be2009-07-14 16:56:47 -0700616 OMX_U32 port_index = data.readInt32();
617 size_t size = data.readInt32();
618
619 buffer_id buffer;
Andreas Huberc712b9f2010-01-20 15:05:46 -0800620 void *buffer_data;
621 status_t err = allocateBuffer(
622 node, port_index, size, &buffer, &buffer_data);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700623 reply->writeInt32(err);
624
625 if (err == OK) {
Andreas Huber2f10ae02009-08-17 13:33:27 -0700626 reply->writeIntPtr((intptr_t)buffer);
Andreas Huberc712b9f2010-01-20 15:05:46 -0800627 reply->writeIntPtr((intptr_t)buffer_data);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700628 }
629
630 return NO_ERROR;
631 }
632
633 case ALLOC_BUFFER_WITH_BACKUP:
634 {
635 CHECK_INTERFACE(IOMX, data, reply);
636
Andreas Huber2f10ae02009-08-17 13:33:27 -0700637 node_id node = (void*)data.readIntPtr();
Andreas Hubere46b7be2009-07-14 16:56:47 -0700638 OMX_U32 port_index = data.readInt32();
639 sp<IMemory> params =
640 interface_cast<IMemory>(data.readStrongBinder());
641
642 buffer_id buffer;
Andreas Huber784202e2009-10-15 13:46:54 -0700643 status_t err = allocateBufferWithBackup(
Andreas Hubere46b7be2009-07-14 16:56:47 -0700644 node, port_index, params, &buffer);
645
646 reply->writeInt32(err);
647
648 if (err == OK) {
Andreas Huber2f10ae02009-08-17 13:33:27 -0700649 reply->writeIntPtr((intptr_t)buffer);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700650 }
651
652 return NO_ERROR;
653 }
654
655 case FREE_BUFFER:
656 {
657 CHECK_INTERFACE(IOMX, data, reply);
658
Andreas Huber2f10ae02009-08-17 13:33:27 -0700659 node_id node = (void*)data.readIntPtr();
Andreas Hubere46b7be2009-07-14 16:56:47 -0700660 OMX_U32 port_index = data.readInt32();
Andreas Huber2f10ae02009-08-17 13:33:27 -0700661 buffer_id buffer = (void*)data.readIntPtr();
Andreas Huber784202e2009-10-15 13:46:54 -0700662 reply->writeInt32(freeBuffer(node, port_index, buffer));
Andreas Hubere46b7be2009-07-14 16:56:47 -0700663
664 return NO_ERROR;
665 }
666
667 case FILL_BUFFER:
668 {
669 CHECK_INTERFACE(IOMX, data, reply);
670
Andreas Huber2f10ae02009-08-17 13:33:27 -0700671 node_id node = (void*)data.readIntPtr();
672 buffer_id buffer = (void*)data.readIntPtr();
Andreas Huber784202e2009-10-15 13:46:54 -0700673 reply->writeInt32(fillBuffer(node, buffer));
Andreas Hubere46b7be2009-07-14 16:56:47 -0700674
675 return NO_ERROR;
676 }
677
678 case EMPTY_BUFFER:
679 {
680 CHECK_INTERFACE(IOMX, data, reply);
681
Andreas Huber2f10ae02009-08-17 13:33:27 -0700682 node_id node = (void*)data.readIntPtr();
683 buffer_id buffer = (void*)data.readIntPtr();
Andreas Hubere46b7be2009-07-14 16:56:47 -0700684 OMX_U32 range_offset = data.readInt32();
685 OMX_U32 range_length = data.readInt32();
686 OMX_U32 flags = data.readInt32();
687 OMX_TICKS timestamp = data.readInt64();
688
Andreas Huber3f427072009-10-08 11:02:27 -0700689 reply->writeInt32(
Andreas Huber784202e2009-10-15 13:46:54 -0700690 emptyBuffer(
Andreas Huber3f427072009-10-08 11:02:27 -0700691 node, buffer, range_offset, range_length,
692 flags, timestamp));
Andreas Hubere46b7be2009-07-14 16:56:47 -0700693
694 return NO_ERROR;
695 }
Andreas Hubere46b7be2009-07-14 16:56:47 -0700696
Andreas Huberbe06d262009-08-14 14:37:10 -0700697 case GET_EXTENSION_INDEX:
698 {
699 CHECK_INTERFACE(IOMX, data, reply);
700
Andreas Huber2f10ae02009-08-17 13:33:27 -0700701 node_id node = (void*)data.readIntPtr();
Andreas Huberbe06d262009-08-14 14:37:10 -0700702 const char *parameter_name = data.readCString();
Andreas Huberf1fe0642010-01-15 15:28:19 -0800703
Andreas Huberbe06d262009-08-14 14:37:10 -0700704 OMX_INDEXTYPE index;
Andreas Huber784202e2009-10-15 13:46:54 -0700705 status_t err = getExtensionIndex(node, parameter_name, &index);
Andreas Huberbe06d262009-08-14 14:37:10 -0700706
707 reply->writeInt32(err);
708
709 if (err == OK) {
710 reply->writeInt32(index);
711 }
712
713 return OK;
714 }
715
Andreas Hubere46b7be2009-07-14 16:56:47 -0700716 default:
717 return BBinder::onTransact(code, data, reply, flags);
718 }
719}
720
721////////////////////////////////////////////////////////////////////////////////
722
723class BpOMXObserver : public BpInterface<IOMXObserver> {
724public:
725 BpOMXObserver(const sp<IBinder> &impl)
726 : BpInterface<IOMXObserver>(impl) {
727 }
728
Andreas Huber784202e2009-10-15 13:46:54 -0700729 virtual void onMessage(const omx_message &msg) {
Andreas Hubere46b7be2009-07-14 16:56:47 -0700730 Parcel data, reply;
731 data.writeInterfaceToken(IOMXObserver::getInterfaceDescriptor());
732 data.write(&msg, sizeof(msg));
733
734 remote()->transact(OBSERVER_ON_MSG, data, &reply, IBinder::FLAG_ONEWAY);
735 }
736};
737
738IMPLEMENT_META_INTERFACE(OMXObserver, "android.hardware.IOMXObserver");
739
740status_t BnOMXObserver::onTransact(
741 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
742 switch (code) {
743 case OBSERVER_ON_MSG:
744 {
745 CHECK_INTERFACE(IOMXObserver, data, reply);
746
747 omx_message msg;
748 data.read(&msg, sizeof(msg));
749
750 // XXX Could use readInplace maybe?
Andreas Huber784202e2009-10-15 13:46:54 -0700751 onMessage(msg);
Andreas Hubere46b7be2009-07-14 16:56:47 -0700752
753 return NO_ERROR;
754 }
755
756 default:
757 return BBinder::onTransact(code, data, reply, flags);
758 }
759}
760
Andreas Hubere46b7be2009-07-14 16:56:47 -0700761} // namespace android