blob: 39b135b918d97afb6c405002fbca4f48bfefd187 [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,
Chong Zhangd291c222015-04-30 18:15:52 -070044 CREATE_PERSISTENT_INPUT_SURFACE,
45 USE_PERSISTENT_INPUT_SURFACE,
Andy McFadden7cd58532013-02-19 07:28:30 -080046 SIGNAL_END_OF_INPUT_STREAM,
James Donge8707722010-10-20 17:38:41 -070047 STORE_META_DATA_IN_BUFFERS,
Lajos Molnar56ce7262013-05-02 16:30:48 -070048 PREPARE_FOR_ADAPTIVE_PLAYBACK,
Andreas Huber20111aa2009-07-14 16:56:47 -070049 ALLOC_BUFFER,
50 ALLOC_BUFFER_WITH_BACKUP,
51 FREE_BUFFER,
Andreas Huber20111aa2009-07-14 16:56:47 -070052 FILL_BUFFER,
53 EMPTY_BUFFER,
Andreas Huber693d2712009-08-14 14:37:10 -070054 GET_EXTENSION_INDEX,
Andreas Huber20111aa2009-07-14 16:56:47 -070055 OBSERVER_ON_MSG,
Jamie Gennise2ce6452011-02-23 19:01:28 -080056 GET_GRAPHIC_BUFFER_USAGE,
Andreas Hubere40cda72013-07-17 13:55:26 -070057 SET_INTERNAL_OPTION,
Lajos Molnard0715862013-07-22 12:57:43 -070058 UPDATE_GRAPHIC_BUFFER_IN_META,
Rachad5a446aa2014-07-29 16:47:56 -070059 CONFIGURE_VIDEO_TUNNEL_MODE,
Andreas Huber20111aa2009-07-14 16:56:47 -070060};
61
Andreas Huber20111aa2009-07-14 16:56:47 -070062class BpOMX : public BpInterface<IOMX> {
63public:
64 BpOMX(const sp<IBinder> &impl)
65 : BpInterface<IOMX>(impl) {
66 }
67
Andreas Huberd459b482012-01-31 11:16:24 -080068 virtual bool livesLocally(node_id node, pid_t pid) {
Andreas Huber7eaa9c92010-01-15 15:28:19 -080069 Parcel data, reply;
70 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -070071 data.writeInt32((int32_t)node);
Andreas Huber7eaa9c92010-01-15 15:28:19 -080072 data.writeInt32(pid);
73 remote()->transact(LIVES_LOCALLY, data, &reply);
74
75 return reply.readInt32() != 0;
76 }
77
Andreas Huber134ee6a2009-12-16 09:30:55 -080078 virtual status_t listNodes(List<ComponentInfo> *list) {
Andreas Huber20111aa2009-07-14 16:56:47 -070079 list->clear();
80
81 Parcel data, reply;
82 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
83 remote()->transact(LIST_NODES, data, &reply);
84
85 int32_t n = reply.readInt32();
86 for (int32_t i = 0; i < n; ++i) {
Andreas Huber134ee6a2009-12-16 09:30:55 -080087 list->push_back(ComponentInfo());
88 ComponentInfo &info = *--list->end();
Andreas Huber20111aa2009-07-14 16:56:47 -070089
Andreas Huber134ee6a2009-12-16 09:30:55 -080090 info.mName = reply.readString8();
91 int32_t numRoles = reply.readInt32();
92 for (int32_t j = 0; j < numRoles; ++j) {
93 info.mRoles.push_back(reply.readString8());
94 }
Andreas Huber20111aa2009-07-14 16:56:47 -070095 }
96
97 return OK;
98 }
99
Andreas Huber318ad9c2009-10-15 13:46:54 -0700100 virtual status_t allocateNode(
101 const char *name, const sp<IOMXObserver> &observer, node_id *node) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700102 Parcel data, reply;
103 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
104 data.writeCString(name);
Marco Nelissen06b46062014-11-14 07:58:25 -0800105 data.writeStrongBinder(IInterface::asBinder(observer));
Andreas Huber20111aa2009-07-14 16:56:47 -0700106 remote()->transact(ALLOCATE_NODE, data, &reply);
107
108 status_t err = reply.readInt32();
109 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700110 *node = (node_id)reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700111 } else {
112 *node = 0;
113 }
114
115 return err;
116 }
117
Andreas Huber318ad9c2009-10-15 13:46:54 -0700118 virtual status_t freeNode(node_id node) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700119 Parcel data, reply;
120 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700121 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700122 remote()->transact(FREE_NODE, data, &reply);
123
124 return reply.readInt32();
125 }
126
Andreas Huber318ad9c2009-10-15 13:46:54 -0700127 virtual status_t sendCommand(
Andreas Huber20111aa2009-07-14 16:56:47 -0700128 node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) {
129 Parcel data, reply;
130 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700131 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700132 data.writeInt32(cmd);
133 data.writeInt32(param);
134 remote()->transact(SEND_COMMAND, data, &reply);
135
136 return reply.readInt32();
137 }
138
Andreas Huber318ad9c2009-10-15 13:46:54 -0700139 virtual status_t getParameter(
Andreas Huber20111aa2009-07-14 16:56:47 -0700140 node_id node, OMX_INDEXTYPE index,
141 void *params, size_t size) {
142 Parcel data, reply;
143 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700144 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700145 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800146 data.writeInt64(size);
Andreas Huber20111aa2009-07-14 16:56:47 -0700147 data.write(params, size);
148 remote()->transact(GET_PARAMETER, data, &reply);
149
150 status_t err = reply.readInt32();
151 if (err != OK) {
152 return err;
153 }
154
155 reply.read(params, size);
156
157 return OK;
158 }
159
Andreas Huber318ad9c2009-10-15 13:46:54 -0700160 virtual status_t setParameter(
Andreas Huber20111aa2009-07-14 16:56:47 -0700161 node_id node, OMX_INDEXTYPE index,
162 const void *params, size_t size) {
163 Parcel data, reply;
164 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700165 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700166 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800167 data.writeInt64(size);
Andreas Huber20111aa2009-07-14 16:56:47 -0700168 data.write(params, size);
169 remote()->transact(SET_PARAMETER, data, &reply);
170
171 return reply.readInt32();
172 }
173
Andreas Huber318ad9c2009-10-15 13:46:54 -0700174 virtual status_t getConfig(
Andreas Huber693d2712009-08-14 14:37:10 -0700175 node_id node, OMX_INDEXTYPE index,
176 void *params, size_t size) {
177 Parcel data, reply;
178 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700179 data.writeInt32((int32_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700180 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800181 data.writeInt64(size);
Andreas Huber693d2712009-08-14 14:37:10 -0700182 data.write(params, size);
183 remote()->transact(GET_CONFIG, data, &reply);
184
185 status_t err = reply.readInt32();
186 if (err != OK) {
187 return err;
188 }
189
190 reply.read(params, size);
191
192 return OK;
193 }
194
Andreas Huber318ad9c2009-10-15 13:46:54 -0700195 virtual status_t setConfig(
Andreas Huber693d2712009-08-14 14:37:10 -0700196 node_id node, OMX_INDEXTYPE index,
197 const void *params, size_t size) {
198 Parcel data, reply;
199 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700200 data.writeInt32((int32_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700201 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800202 data.writeInt64(size);
Andreas Huber693d2712009-08-14 14:37:10 -0700203 data.write(params, size);
204 remote()->transact(SET_CONFIG, data, &reply);
205
206 return reply.readInt32();
207 }
208
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700209 virtual status_t getState(
210 node_id node, OMX_STATETYPE* state) {
211 Parcel data, reply;
212 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700213 data.writeInt32((int32_t)node);
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700214 remote()->transact(GET_STATE, data, &reply);
215
216 *state = static_cast<OMX_STATETYPE>(reply.readInt32());
217 return reply.readInt32();
218 }
219
Jamie Gennis83750ea2010-08-30 16:48:38 -0700220 virtual status_t enableGraphicBuffers(
221 node_id node, OMX_U32 port_index, OMX_BOOL enable) {
222 Parcel data, reply;
223 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700224 data.writeInt32((int32_t)node);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700225 data.writeInt32(port_index);
226 data.writeInt32((uint32_t)enable);
227 remote()->transact(ENABLE_GRAPHIC_BUFFERS, data, &reply);
228
229 status_t err = reply.readInt32();
230 return err;
231 }
232
Jamie Gennise2ce6452011-02-23 19:01:28 -0800233 virtual status_t getGraphicBufferUsage(
234 node_id node, OMX_U32 port_index, OMX_U32* usage) {
235 Parcel data, reply;
236 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700237 data.writeInt32((int32_t)node);
Jamie Gennise2ce6452011-02-23 19:01:28 -0800238 data.writeInt32(port_index);
239 remote()->transact(GET_GRAPHIC_BUFFER_USAGE, data, &reply);
240
241 status_t err = reply.readInt32();
242 *usage = reply.readInt32();
243 return err;
244 }
245
Andreas Huber318ad9c2009-10-15 13:46:54 -0700246 virtual status_t useBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700247 node_id node, OMX_U32 port_index, const sp<IMemory> &params,
248 buffer_id *buffer) {
249 Parcel data, reply;
250 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700251 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700252 data.writeInt32(port_index);
Marco Nelissen06b46062014-11-14 07:58:25 -0800253 data.writeStrongBinder(IInterface::asBinder(params));
Andreas Huber20111aa2009-07-14 16:56:47 -0700254 remote()->transact(USE_BUFFER, data, &reply);
255
256 status_t err = reply.readInt32();
257 if (err != OK) {
258 *buffer = 0;
259
260 return err;
261 }
262
Andy Hung609b8152014-05-02 11:05:04 -0700263 *buffer = (buffer_id)reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700264
265 return err;
266 }
267
Jamie Gennis83750ea2010-08-30 16:48:38 -0700268
269 virtual status_t useGraphicBuffer(
270 node_id node, OMX_U32 port_index,
271 const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) {
272 Parcel data, reply;
273 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700274 data.writeInt32((int32_t)node);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700275 data.writeInt32(port_index);
276 data.write(*graphicBuffer);
277 remote()->transact(USE_GRAPHIC_BUFFER, data, &reply);
278
279 status_t err = reply.readInt32();
280 if (err != OK) {
281 *buffer = 0;
282
283 return err;
284 }
285
Andy Hung609b8152014-05-02 11:05:04 -0700286 *buffer = (buffer_id)reply.readInt32();
Jamie Gennis83750ea2010-08-30 16:48:38 -0700287
288 return err;
289 }
290
Lajos Molnard0715862013-07-22 12:57:43 -0700291 virtual status_t updateGraphicBufferInMeta(
292 node_id node, OMX_U32 port_index,
293 const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer) {
294 Parcel data, reply;
295 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700296 data.writeInt32((int32_t)node);
Lajos Molnard0715862013-07-22 12:57:43 -0700297 data.writeInt32(port_index);
298 data.write(*graphicBuffer);
Andy Hung609b8152014-05-02 11:05:04 -0700299 data.writeInt32((int32_t)buffer);
Lajos Molnard0715862013-07-22 12:57:43 -0700300 remote()->transact(UPDATE_GRAPHIC_BUFFER_IN_META, data, &reply);
301
302 status_t err = reply.readInt32();
303 return err;
304 }
305
Andy McFadden7cd58532013-02-19 07:28:30 -0800306 virtual status_t createInputSurface(
307 node_id node, OMX_U32 port_index,
308 sp<IGraphicBufferProducer> *bufferProducer) {
309 Parcel data, reply;
310 status_t err;
311 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700312 data.writeInt32((int32_t)node);
Andy McFadden7cd58532013-02-19 07:28:30 -0800313 data.writeInt32(port_index);
314 err = remote()->transact(CREATE_INPUT_SURFACE, data, &reply);
315 if (err != OK) {
316 ALOGW("binder transaction failed: %d", err);
317 return err;
318 }
319
320 err = reply.readInt32();
321 if (err != OK) {
322 return err;
323 }
324
325 *bufferProducer = IGraphicBufferProducer::asInterface(
326 reply.readStrongBinder());
327
328 return err;
329 }
330
Chong Zhangd291c222015-04-30 18:15:52 -0700331 virtual status_t createPersistentInputSurface(
332 sp<IGraphicBufferProducer> *bufferProducer,
333 sp<IGraphicBufferConsumer> *bufferConsumer) {
334 Parcel data, reply;
335 status_t err;
336 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
337 err = remote()->transact(CREATE_PERSISTENT_INPUT_SURFACE, data, &reply);
338 if (err != OK) {
339 ALOGW("binder transaction failed: %d", err);
340 return err;
341 }
342
343 err = reply.readInt32();
344 if (err != OK) {
345 return err;
346 }
347
348 *bufferProducer = IGraphicBufferProducer::asInterface(
349 reply.readStrongBinder());
350 *bufferConsumer = IGraphicBufferConsumer::asInterface(
351 reply.readStrongBinder());
352
353 return err;
354 }
355
356 virtual status_t usePersistentInputSurface(
357 node_id node, OMX_U32 port_index,
358 const sp<IGraphicBufferConsumer> &bufferConsumer) {
359 Parcel data, reply;
360 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
361 status_t err;
362 data.writeInt32((int32_t)node);
363 data.writeInt32(port_index);
364 data.writeStrongBinder(IInterface::asBinder(bufferConsumer));
365
366 err = remote()->transact(USE_PERSISTENT_INPUT_SURFACE, data, &reply);
367
368 if (err != OK) {
369 ALOGW("binder transaction failed: %d", err);
370 return err;
371 }
372 return reply.readInt32();
373 }
374
375
Andy McFadden7cd58532013-02-19 07:28:30 -0800376 virtual status_t signalEndOfInputStream(node_id node) {
377 Parcel data, reply;
378 status_t err;
379 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700380 data.writeInt32((int32_t)node);
Andy McFadden7cd58532013-02-19 07:28:30 -0800381 err = remote()->transact(SIGNAL_END_OF_INPUT_STREAM, data, &reply);
382 if (err != OK) {
383 ALOGW("binder transaction failed: %d", err);
384 return err;
385 }
386
387 return reply.readInt32();
388 }
389
James Donge8707722010-10-20 17:38:41 -0700390 virtual status_t storeMetaDataInBuffers(
391 node_id node, OMX_U32 port_index, OMX_BOOL enable) {
392 Parcel data, reply;
393 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700394 data.writeInt32((int32_t)node);
James Donge8707722010-10-20 17:38:41 -0700395 data.writeInt32(port_index);
396 data.writeInt32((uint32_t)enable);
397 remote()->transact(STORE_META_DATA_IN_BUFFERS, data, &reply);
398
399 status_t err = reply.readInt32();
400 return err;
401 }
402
Lajos Molnar56ce7262013-05-02 16:30:48 -0700403 virtual status_t prepareForAdaptivePlayback(
404 node_id node, OMX_U32 port_index, OMX_BOOL enable,
405 OMX_U32 max_width, OMX_U32 max_height) {
406 Parcel data, reply;
407 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700408 data.writeInt32((int32_t)node);
Lajos Molnar56ce7262013-05-02 16:30:48 -0700409 data.writeInt32(port_index);
410 data.writeInt32((int32_t)enable);
411 data.writeInt32(max_width);
412 data.writeInt32(max_height);
413 remote()->transact(PREPARE_FOR_ADAPTIVE_PLAYBACK, data, &reply);
414
415 status_t err = reply.readInt32();
416 return err;
417 }
418
Rachad5a446aa2014-07-29 16:47:56 -0700419 virtual status_t configureVideoTunnelMode(
420 node_id node, OMX_U32 portIndex, OMX_BOOL tunneled,
421 OMX_U32 audioHwSync, native_handle_t **sidebandHandle ) {
422 Parcel data, reply;
423 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
424 data.writeInt32((int32_t)node);
425 data.writeInt32(portIndex);
426 data.writeInt32((int32_t)tunneled);
427 data.writeInt32(audioHwSync);
428 remote()->transact(CONFIGURE_VIDEO_TUNNEL_MODE, data, &reply);
429
430 status_t err = reply.readInt32();
431 if (sidebandHandle) {
432 *sidebandHandle = (native_handle_t *)reply.readNativeHandle();
433 }
434 return err;
435 }
436
437
Andreas Huber318ad9c2009-10-15 13:46:54 -0700438 virtual status_t allocateBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700439 node_id node, OMX_U32 port_index, size_t size,
Andreas Huber570a3cb2010-01-20 15:05:46 -0800440 buffer_id *buffer, void **buffer_data) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700441 Parcel data, reply;
442 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700443 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700444 data.writeInt32(port_index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800445 data.writeInt64(size);
Andreas Huber20111aa2009-07-14 16:56:47 -0700446 remote()->transact(ALLOC_BUFFER, data, &reply);
447
448 status_t err = reply.readInt32();
449 if (err != OK) {
450 *buffer = 0;
451
452 return err;
453 }
454
Andy Hung609b8152014-05-02 11:05:04 -0700455 *buffer = (buffer_id)reply.readInt32();
456 *buffer_data = (void *)reply.readInt64();
Andreas Huber20111aa2009-07-14 16:56:47 -0700457
458 return err;
459 }
460
Andreas Huber318ad9c2009-10-15 13:46:54 -0700461 virtual status_t allocateBufferWithBackup(
Andreas Huber20111aa2009-07-14 16:56:47 -0700462 node_id node, OMX_U32 port_index, const sp<IMemory> &params,
463 buffer_id *buffer) {
464 Parcel data, reply;
465 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700466 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700467 data.writeInt32(port_index);
Marco Nelissen06b46062014-11-14 07:58:25 -0800468 data.writeStrongBinder(IInterface::asBinder(params));
Andreas Huber20111aa2009-07-14 16:56:47 -0700469 remote()->transact(ALLOC_BUFFER_WITH_BACKUP, data, &reply);
470
471 status_t err = reply.readInt32();
472 if (err != OK) {
473 *buffer = 0;
474
475 return err;
476 }
477
Andy Hung609b8152014-05-02 11:05:04 -0700478 *buffer = (buffer_id)reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700479
480 return err;
481 }
482
Andreas Huber318ad9c2009-10-15 13:46:54 -0700483 virtual status_t freeBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700484 node_id node, OMX_U32 port_index, buffer_id buffer) {
485 Parcel data, reply;
486 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700487 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700488 data.writeInt32(port_index);
Andy Hung609b8152014-05-02 11:05:04 -0700489 data.writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700490 remote()->transact(FREE_BUFFER, data, &reply);
491
492 return reply.readInt32();
493 }
494
Andreas Huber318ad9c2009-10-15 13:46:54 -0700495 virtual status_t fillBuffer(node_id node, buffer_id buffer) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700496 Parcel data, reply;
497 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700498 data.writeInt32((int32_t)node);
499 data.writeInt32((int32_t)buffer);
Andreas Huber36efa032009-10-08 11:02:27 -0700500 remote()->transact(FILL_BUFFER, data, &reply);
501
502 return reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700503 }
504
Andreas Huber318ad9c2009-10-15 13:46:54 -0700505 virtual status_t emptyBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700506 node_id node,
507 buffer_id buffer,
508 OMX_U32 range_offset, OMX_U32 range_length,
509 OMX_U32 flags, OMX_TICKS timestamp) {
510 Parcel data, reply;
511 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700512 data.writeInt32((int32_t)node);
513 data.writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700514 data.writeInt32(range_offset);
515 data.writeInt32(range_length);
516 data.writeInt32(flags);
517 data.writeInt64(timestamp);
Andreas Huber36efa032009-10-08 11:02:27 -0700518 remote()->transact(EMPTY_BUFFER, data, &reply);
519
520 return reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700521 }
Andreas Huber8b938cd2009-07-31 11:52:50 -0700522
Andreas Huber318ad9c2009-10-15 13:46:54 -0700523 virtual status_t getExtensionIndex(
Andreas Huber693d2712009-08-14 14:37:10 -0700524 node_id node,
525 const char *parameter_name,
526 OMX_INDEXTYPE *index) {
527 Parcel data, reply;
528 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700529 data.writeInt32((int32_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700530 data.writeCString(parameter_name);
531
532 remote()->transact(GET_EXTENSION_INDEX, data, &reply);
533
534 status_t err = reply.readInt32();
535 if (err == OK) {
536 *index = static_cast<OMX_INDEXTYPE>(reply.readInt32());
537 } else {
538 *index = OMX_IndexComponentStartUnused;
539 }
540
541 return err;
542 }
Andreas Hubere40cda72013-07-17 13:55:26 -0700543
544 virtual status_t setInternalOption(
545 node_id node,
546 OMX_U32 port_index,
547 InternalOptionType type,
548 const void *optionData,
549 size_t size) {
550 Parcel data, reply;
551 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700552 data.writeInt32((int32_t)node);
Andreas Hubere40cda72013-07-17 13:55:26 -0700553 data.writeInt32(port_index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800554 data.writeInt64(size);
Andreas Hubere40cda72013-07-17 13:55:26 -0700555 data.write(optionData, size);
556 data.writeInt32(type);
557 remote()->transact(SET_INTERNAL_OPTION, data, &reply);
558
559 return reply.readInt32();
560 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700561};
562
563IMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX");
564
565////////////////////////////////////////////////////////////////////////////////
566
Andy McFadden7cd58532013-02-19 07:28:30 -0800567#define CHECK_OMX_INTERFACE(interface, data, reply) \
Andreas Huber20111aa2009-07-14 16:56:47 -0700568 do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \
Steve Block5ff1dd52012-01-05 23:22:43 +0000569 ALOGW("Call incorrectly routed to " #interface); \
Andreas Huber20111aa2009-07-14 16:56:47 -0700570 return PERMISSION_DENIED; \
571 } } while (0)
572
573status_t BnOMX::onTransact(
574 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
575 switch (code) {
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800576 case LIVES_LOCALLY:
577 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800578 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andy Hung609b8152014-05-02 11:05:04 -0700579 node_id node = (node_id)data.readInt32();
Andreas Huberd459b482012-01-31 11:16:24 -0800580 pid_t pid = (pid_t)data.readInt32();
581 reply->writeInt32(livesLocally(node, pid));
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800582
583 return OK;
584 }
585
Andreas Huber20111aa2009-07-14 16:56:47 -0700586 case LIST_NODES:
587 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800588 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700589
Andreas Huber134ee6a2009-12-16 09:30:55 -0800590 List<ComponentInfo> list;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700591 listNodes(&list);
Andreas Huber20111aa2009-07-14 16:56:47 -0700592
593 reply->writeInt32(list.size());
Andreas Huber134ee6a2009-12-16 09:30:55 -0800594 for (List<ComponentInfo>::iterator it = list.begin();
Andreas Huber20111aa2009-07-14 16:56:47 -0700595 it != list.end(); ++it) {
Andreas Huber134ee6a2009-12-16 09:30:55 -0800596 ComponentInfo &cur = *it;
597
598 reply->writeString8(cur.mName);
599 reply->writeInt32(cur.mRoles.size());
600 for (List<String8>::iterator role_it = cur.mRoles.begin();
601 role_it != cur.mRoles.end(); ++role_it) {
602 reply->writeString8(*role_it);
603 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700604 }
605
606 return NO_ERROR;
607 }
608
609 case ALLOCATE_NODE:
610 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800611 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700612
Andreas Huber318ad9c2009-10-15 13:46:54 -0700613 const char *name = data.readCString();
614
615 sp<IOMXObserver> observer =
616 interface_cast<IOMXObserver>(data.readStrongBinder());
617
Andreas Huber20111aa2009-07-14 16:56:47 -0700618 node_id node;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700619
620 status_t err = allocateNode(name, observer, &node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700621 reply->writeInt32(err);
622 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700623 reply->writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700624 }
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800625
Andreas Huber20111aa2009-07-14 16:56:47 -0700626 return NO_ERROR;
627 }
628
629 case FREE_NODE:
630 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800631 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700632
Andy Hung609b8152014-05-02 11:05:04 -0700633 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700634
Andreas Huber318ad9c2009-10-15 13:46:54 -0700635 reply->writeInt32(freeNode(node));
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800636
Andreas Huber20111aa2009-07-14 16:56:47 -0700637 return NO_ERROR;
638 }
639
640 case SEND_COMMAND:
641 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800642 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700643
Andy Hung609b8152014-05-02 11:05:04 -0700644 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700645
646 OMX_COMMANDTYPE cmd =
647 static_cast<OMX_COMMANDTYPE>(data.readInt32());
648
649 OMX_S32 param = data.readInt32();
Andreas Huber318ad9c2009-10-15 13:46:54 -0700650 reply->writeInt32(sendCommand(node, cmd, param));
Andreas Huber20111aa2009-07-14 16:56:47 -0700651
652 return NO_ERROR;
653 }
654
655 case GET_PARAMETER:
Andreas Huber20111aa2009-07-14 16:56:47 -0700656 case SET_PARAMETER:
Andreas Huber693d2712009-08-14 14:37:10 -0700657 case GET_CONFIG:
Andreas Huber693d2712009-08-14 14:37:10 -0700658 case SET_CONFIG:
Andreas Hubere40cda72013-07-17 13:55:26 -0700659 case SET_INTERNAL_OPTION:
Andreas Huber693d2712009-08-14 14:37:10 -0700660 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800661 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber693d2712009-08-14 14:37:10 -0700662
Andy Hung609b8152014-05-02 11:05:04 -0700663 node_id node = (node_id)data.readInt32();
Andreas Huber693d2712009-08-14 14:37:10 -0700664 OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
665
Glenn Kastene03dd222014-01-28 11:04:39 -0800666 size_t size = data.readInt64();
Andreas Huber693d2712009-08-14 14:37:10 -0700667
Andreas Huberb3912902011-01-19 10:34:52 -0800668 void *params = malloc(size);
669 data.read(params, size);
670
671 status_t err;
672 switch (code) {
673 case GET_PARAMETER:
674 err = getParameter(node, index, params, size);
675 break;
676 case SET_PARAMETER:
677 err = setParameter(node, index, params, size);
678 break;
679 case GET_CONFIG:
680 err = getConfig(node, index, params, size);
681 break;
682 case SET_CONFIG:
683 err = setConfig(node, index, params, size);
684 break;
Andreas Hubere40cda72013-07-17 13:55:26 -0700685 case SET_INTERNAL_OPTION:
686 {
687 InternalOptionType type =
688 (InternalOptionType)data.readInt32();
689
690 err = setInternalOption(node, index, type, params, size);
691 break;
692 }
693
Andreas Huberb3912902011-01-19 10:34:52 -0800694 default:
695 TRESPASS();
696 }
697
698 reply->writeInt32(err);
699
700 if ((code == GET_PARAMETER || code == GET_CONFIG) && err == OK) {
701 reply->write(params, size);
702 }
703
704 free(params);
705 params = NULL;
Andreas Huber693d2712009-08-14 14:37:10 -0700706
707 return NO_ERROR;
708 }
709
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700710 case GET_STATE:
711 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800712 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700713
Andy Hung609b8152014-05-02 11:05:04 -0700714 node_id node = (node_id)data.readInt32();
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700715 OMX_STATETYPE state = OMX_StateInvalid;
716
717 status_t err = getState(node, &state);
718 reply->writeInt32(state);
719 reply->writeInt32(err);
720
721 return NO_ERROR;
722 }
723
Jamie Gennis83750ea2010-08-30 16:48:38 -0700724 case ENABLE_GRAPHIC_BUFFERS:
725 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800726 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700727
Andy Hung609b8152014-05-02 11:05:04 -0700728 node_id node = (node_id)data.readInt32();
Jamie Gennis83750ea2010-08-30 16:48:38 -0700729 OMX_U32 port_index = data.readInt32();
730 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
731
732 status_t err = enableGraphicBuffers(node, port_index, enable);
733 reply->writeInt32(err);
734
735 return NO_ERROR;
736 }
737
Jamie Gennise2ce6452011-02-23 19:01:28 -0800738 case GET_GRAPHIC_BUFFER_USAGE:
739 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800740 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennise2ce6452011-02-23 19:01:28 -0800741
Andy Hung609b8152014-05-02 11:05:04 -0700742 node_id node = (node_id)data.readInt32();
Jamie Gennise2ce6452011-02-23 19:01:28 -0800743 OMX_U32 port_index = data.readInt32();
744
745 OMX_U32 usage = 0;
746 status_t err = getGraphicBufferUsage(node, port_index, &usage);
747 reply->writeInt32(err);
748 reply->writeInt32(usage);
749
750 return NO_ERROR;
751 }
752
Andreas Huber20111aa2009-07-14 16:56:47 -0700753 case USE_BUFFER:
754 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800755 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700756
Andy Hung609b8152014-05-02 11:05:04 -0700757 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700758 OMX_U32 port_index = data.readInt32();
759 sp<IMemory> params =
760 interface_cast<IMemory>(data.readStrongBinder());
761
762 buffer_id buffer;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700763 status_t err = useBuffer(node, port_index, params, &buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700764 reply->writeInt32(err);
765
766 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700767 reply->writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700768 }
769
770 return NO_ERROR;
771 }
772
Jamie Gennis83750ea2010-08-30 16:48:38 -0700773 case USE_GRAPHIC_BUFFER:
774 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800775 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700776
Andy Hung609b8152014-05-02 11:05:04 -0700777 node_id node = (node_id)data.readInt32();
Jamie Gennis83750ea2010-08-30 16:48:38 -0700778 OMX_U32 port_index = data.readInt32();
779 sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
780 data.read(*graphicBuffer);
781
782 buffer_id buffer;
783 status_t err = useGraphicBuffer(
784 node, port_index, graphicBuffer, &buffer);
785 reply->writeInt32(err);
786
787 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700788 reply->writeInt32((int32_t)buffer);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700789 }
790
791 return NO_ERROR;
792 }
793
Lajos Molnard0715862013-07-22 12:57:43 -0700794 case UPDATE_GRAPHIC_BUFFER_IN_META:
795 {
796 CHECK_OMX_INTERFACE(IOMX, data, reply);
797
Andy Hung609b8152014-05-02 11:05:04 -0700798 node_id node = (node_id)data.readInt32();
Lajos Molnard0715862013-07-22 12:57:43 -0700799 OMX_U32 port_index = data.readInt32();
800 sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
801 data.read(*graphicBuffer);
Andy Hung609b8152014-05-02 11:05:04 -0700802 buffer_id buffer = (buffer_id)data.readInt32();
Lajos Molnard0715862013-07-22 12:57:43 -0700803
804 status_t err = updateGraphicBufferInMeta(
805 node, port_index, graphicBuffer, buffer);
806 reply->writeInt32(err);
807
808 return NO_ERROR;
809 }
810
Andy McFadden7cd58532013-02-19 07:28:30 -0800811 case CREATE_INPUT_SURFACE:
812 {
813 CHECK_OMX_INTERFACE(IOMX, data, reply);
814
Andy Hung609b8152014-05-02 11:05:04 -0700815 node_id node = (node_id)data.readInt32();
Andy McFadden7cd58532013-02-19 07:28:30 -0800816 OMX_U32 port_index = data.readInt32();
817
818 sp<IGraphicBufferProducer> bufferProducer;
819 status_t err = createInputSurface(node, port_index,
820 &bufferProducer);
821
822 reply->writeInt32(err);
823
824 if (err == OK) {
Marco Nelissen06b46062014-11-14 07:58:25 -0800825 reply->writeStrongBinder(IInterface::asBinder(bufferProducer));
Andy McFadden7cd58532013-02-19 07:28:30 -0800826 }
827
828 return NO_ERROR;
829 }
830
Chong Zhangd291c222015-04-30 18:15:52 -0700831 case CREATE_PERSISTENT_INPUT_SURFACE:
832 {
833 CHECK_OMX_INTERFACE(IOMX, data, reply);
834
835 sp<IGraphicBufferProducer> bufferProducer;
836 sp<IGraphicBufferConsumer> bufferConsumer;
837 status_t err = createPersistentInputSurface(
838 &bufferProducer, &bufferConsumer);
839
840 reply->writeInt32(err);
841
842 if (err == OK) {
843 reply->writeStrongBinder(IInterface::asBinder(bufferProducer));
844 reply->writeStrongBinder(IInterface::asBinder(bufferConsumer));
845 }
846
847 return NO_ERROR;
848 }
849
850 case USE_PERSISTENT_INPUT_SURFACE:
851 {
852 CHECK_OMX_INTERFACE(IOMX, data, reply);
853
854 node_id node = (node_id)data.readInt32();
855 OMX_U32 port_index = data.readInt32();
856
857 sp<IGraphicBufferConsumer> bufferConsumer =
858 interface_cast<IGraphicBufferConsumer>(data.readStrongBinder());
859
860 status_t err = usePersistentInputSurface(
861 node, port_index, bufferConsumer);
862
863 reply->writeInt32(err);
864 return NO_ERROR;
865 }
866
Andy McFadden7cd58532013-02-19 07:28:30 -0800867 case SIGNAL_END_OF_INPUT_STREAM:
868 {
869 CHECK_OMX_INTERFACE(IOMX, data, reply);
870
Andy Hung609b8152014-05-02 11:05:04 -0700871 node_id node = (node_id)data.readInt32();
Andy McFadden7cd58532013-02-19 07:28:30 -0800872
873 status_t err = signalEndOfInputStream(node);
874 reply->writeInt32(err);
875
876 return NO_ERROR;
877 }
878
James Donge8707722010-10-20 17:38:41 -0700879 case STORE_META_DATA_IN_BUFFERS:
880 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800881 CHECK_OMX_INTERFACE(IOMX, data, reply);
James Donge8707722010-10-20 17:38:41 -0700882
Andy Hung609b8152014-05-02 11:05:04 -0700883 node_id node = (node_id)data.readInt32();
James Donge8707722010-10-20 17:38:41 -0700884 OMX_U32 port_index = data.readInt32();
885 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
886
887 status_t err = storeMetaDataInBuffers(node, port_index, enable);
888 reply->writeInt32(err);
889
890 return NO_ERROR;
891 }
892
Lajos Molnar56ce7262013-05-02 16:30:48 -0700893 case PREPARE_FOR_ADAPTIVE_PLAYBACK:
894 {
895 CHECK_OMX_INTERFACE(IOMX, data, reply);
896
Andy Hung609b8152014-05-02 11:05:04 -0700897 node_id node = (node_id)data.readInt32();
Lajos Molnar56ce7262013-05-02 16:30:48 -0700898 OMX_U32 port_index = data.readInt32();
899 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
900 OMX_U32 max_width = data.readInt32();
901 OMX_U32 max_height = data.readInt32();
902
903 status_t err = prepareForAdaptivePlayback(
904 node, port_index, enable, max_width, max_height);
905 reply->writeInt32(err);
906
907 return NO_ERROR;
908 }
909
Rachad5a446aa2014-07-29 16:47:56 -0700910 case CONFIGURE_VIDEO_TUNNEL_MODE:
911 {
912 CHECK_OMX_INTERFACE(IOMX, data, reply);
913
914 node_id node = (node_id)data.readInt32();
915 OMX_U32 port_index = data.readInt32();
916 OMX_BOOL tunneled = (OMX_BOOL)data.readInt32();
917 OMX_U32 audio_hw_sync = data.readInt32();
918
919 native_handle_t *sideband_handle;
920 status_t err = configureVideoTunnelMode(
921 node, port_index, tunneled, audio_hw_sync, &sideband_handle);
922 reply->writeInt32(err);
923 reply->writeNativeHandle(sideband_handle);
924
925 return NO_ERROR;
926 }
927
Andreas Huber20111aa2009-07-14 16:56:47 -0700928 case ALLOC_BUFFER:
929 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800930 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700931
Andy Hung609b8152014-05-02 11:05:04 -0700932 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700933 OMX_U32 port_index = data.readInt32();
Glenn Kastene03dd222014-01-28 11:04:39 -0800934 size_t size = data.readInt64();
Andreas Huber20111aa2009-07-14 16:56:47 -0700935
936 buffer_id buffer;
Andreas Huber570a3cb2010-01-20 15:05:46 -0800937 void *buffer_data;
938 status_t err = allocateBuffer(
939 node, port_index, size, &buffer, &buffer_data);
Andreas Huber20111aa2009-07-14 16:56:47 -0700940 reply->writeInt32(err);
941
942 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700943 reply->writeInt32((int32_t)buffer);
944 reply->writeInt64((uintptr_t)buffer_data);
Andreas Huber20111aa2009-07-14 16:56:47 -0700945 }
946
947 return NO_ERROR;
948 }
949
950 case ALLOC_BUFFER_WITH_BACKUP:
951 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800952 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700953
Andy Hung609b8152014-05-02 11:05:04 -0700954 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700955 OMX_U32 port_index = data.readInt32();
956 sp<IMemory> params =
957 interface_cast<IMemory>(data.readStrongBinder());
958
959 buffer_id buffer;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700960 status_t err = allocateBufferWithBackup(
Andreas Huber20111aa2009-07-14 16:56:47 -0700961 node, port_index, params, &buffer);
962
963 reply->writeInt32(err);
964
965 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700966 reply->writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700967 }
968
969 return NO_ERROR;
970 }
971
972 case FREE_BUFFER:
973 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800974 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700975
Andy Hung609b8152014-05-02 11:05:04 -0700976 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700977 OMX_U32 port_index = data.readInt32();
Andy Hung609b8152014-05-02 11:05:04 -0700978 buffer_id buffer = (buffer_id)data.readInt32();
Andreas Huber318ad9c2009-10-15 13:46:54 -0700979 reply->writeInt32(freeBuffer(node, port_index, buffer));
Andreas Huber20111aa2009-07-14 16:56:47 -0700980
981 return NO_ERROR;
982 }
983
984 case FILL_BUFFER:
985 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800986 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700987
Andy Hung609b8152014-05-02 11:05:04 -0700988 node_id node = (node_id)data.readInt32();
989 buffer_id buffer = (buffer_id)data.readInt32();
Andreas Huber318ad9c2009-10-15 13:46:54 -0700990 reply->writeInt32(fillBuffer(node, buffer));
Andreas Huber20111aa2009-07-14 16:56:47 -0700991
992 return NO_ERROR;
993 }
994
995 case EMPTY_BUFFER:
996 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800997 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700998
Andy Hung609b8152014-05-02 11:05:04 -0700999 node_id node = (node_id)data.readInt32();
1000 buffer_id buffer = (buffer_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -07001001 OMX_U32 range_offset = data.readInt32();
1002 OMX_U32 range_length = data.readInt32();
1003 OMX_U32 flags = data.readInt32();
1004 OMX_TICKS timestamp = data.readInt64();
1005
Andreas Huber36efa032009-10-08 11:02:27 -07001006 reply->writeInt32(
Andreas Huber318ad9c2009-10-15 13:46:54 -07001007 emptyBuffer(
Andreas Huber36efa032009-10-08 11:02:27 -07001008 node, buffer, range_offset, range_length,
1009 flags, timestamp));
Andreas Huber20111aa2009-07-14 16:56:47 -07001010
1011 return NO_ERROR;
1012 }
Andreas Huber20111aa2009-07-14 16:56:47 -07001013
Andreas Huber693d2712009-08-14 14:37:10 -07001014 case GET_EXTENSION_INDEX:
1015 {
Andy McFadden7cd58532013-02-19 07:28:30 -08001016 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber693d2712009-08-14 14:37:10 -07001017
Andy Hung609b8152014-05-02 11:05:04 -07001018 node_id node = (node_id)data.readInt32();
Andreas Huber693d2712009-08-14 14:37:10 -07001019 const char *parameter_name = data.readCString();
Andreas Huber7eaa9c92010-01-15 15:28:19 -08001020
Andreas Huber693d2712009-08-14 14:37:10 -07001021 OMX_INDEXTYPE index;
Andreas Huber318ad9c2009-10-15 13:46:54 -07001022 status_t err = getExtensionIndex(node, parameter_name, &index);
Andreas Huber693d2712009-08-14 14:37:10 -07001023
1024 reply->writeInt32(err);
1025
1026 if (err == OK) {
1027 reply->writeInt32(index);
1028 }
1029
1030 return OK;
1031 }
1032
Andreas Huber20111aa2009-07-14 16:56:47 -07001033 default:
1034 return BBinder::onTransact(code, data, reply, flags);
1035 }
1036}
1037
1038////////////////////////////////////////////////////////////////////////////////
1039
1040class BpOMXObserver : public BpInterface<IOMXObserver> {
1041public:
1042 BpOMXObserver(const sp<IBinder> &impl)
1043 : BpInterface<IOMXObserver>(impl) {
1044 }
1045
Andreas Huber318ad9c2009-10-15 13:46:54 -07001046 virtual void onMessage(const omx_message &msg) {
Andreas Huber20111aa2009-07-14 16:56:47 -07001047 Parcel data, reply;
1048 data.writeInterfaceToken(IOMXObserver::getInterfaceDescriptor());
1049 data.write(&msg, sizeof(msg));
1050
Andy Hung609b8152014-05-02 11:05:04 -07001051 ALOGV("onMessage writing message %d, size %zu", msg.type, sizeof(msg));
1052
Andreas Huber20111aa2009-07-14 16:56:47 -07001053 remote()->transact(OBSERVER_ON_MSG, data, &reply, IBinder::FLAG_ONEWAY);
1054 }
1055};
1056
1057IMPLEMENT_META_INTERFACE(OMXObserver, "android.hardware.IOMXObserver");
1058
1059status_t BnOMXObserver::onTransact(
1060 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
1061 switch (code) {
1062 case OBSERVER_ON_MSG:
1063 {
Andy McFadden7cd58532013-02-19 07:28:30 -08001064 CHECK_OMX_INTERFACE(IOMXObserver, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -07001065
1066 omx_message msg;
1067 data.read(&msg, sizeof(msg));
1068
Andy Hung609b8152014-05-02 11:05:04 -07001069 ALOGV("onTransact reading message %d, size %zu", msg.type, sizeof(msg));
1070
Andreas Huber20111aa2009-07-14 16:56:47 -07001071 // XXX Could use readInplace maybe?
Andreas Huber318ad9c2009-10-15 13:46:54 -07001072 onMessage(msg);
Andreas Huber20111aa2009-07-14 16:56:47 -07001073
1074 return NO_ERROR;
1075 }
1076
1077 default:
1078 return BBinder::onTransact(code, data, reply, flags);
1079 }
1080}
1081
Andreas Huber20111aa2009-07-14 16:56:47 -07001082} // namespace android