blob: e208df922943b3588fd9aa1cd3d7b1581ea0a296 [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,
Lajos Molnar56ce7262013-05-02 16:30:48 -070046 PREPARE_FOR_ADAPTIVE_PLAYBACK,
Andreas Huber20111aa2009-07-14 16:56:47 -070047 ALLOC_BUFFER,
48 ALLOC_BUFFER_WITH_BACKUP,
49 FREE_BUFFER,
Andreas Huber20111aa2009-07-14 16:56:47 -070050 FILL_BUFFER,
51 EMPTY_BUFFER,
Andreas Huber693d2712009-08-14 14:37:10 -070052 GET_EXTENSION_INDEX,
Andreas Huber20111aa2009-07-14 16:56:47 -070053 OBSERVER_ON_MSG,
Jamie Gennise2ce6452011-02-23 19:01:28 -080054 GET_GRAPHIC_BUFFER_USAGE,
Andreas Hubere40cda72013-07-17 13:55:26 -070055 SET_INTERNAL_OPTION,
Lajos Molnard0715862013-07-22 12:57:43 -070056 UPDATE_GRAPHIC_BUFFER_IN_META,
Rachad5a446aa2014-07-29 16:47:56 -070057 CONFIGURE_VIDEO_TUNNEL_MODE,
Andreas Huber20111aa2009-07-14 16:56:47 -070058};
59
Andreas Huber20111aa2009-07-14 16:56:47 -070060class BpOMX : public BpInterface<IOMX> {
61public:
62 BpOMX(const sp<IBinder> &impl)
63 : BpInterface<IOMX>(impl) {
64 }
65
Andreas Huberd459b482012-01-31 11:16:24 -080066 virtual bool livesLocally(node_id node, pid_t pid) {
Andreas Huber7eaa9c92010-01-15 15:28:19 -080067 Parcel data, reply;
68 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -070069 data.writeInt32((int32_t)node);
Andreas Huber7eaa9c92010-01-15 15:28:19 -080070 data.writeInt32(pid);
71 remote()->transact(LIVES_LOCALLY, data, &reply);
72
73 return reply.readInt32() != 0;
74 }
75
Andreas Huber134ee6a2009-12-16 09:30:55 -080076 virtual status_t listNodes(List<ComponentInfo> *list) {
Andreas Huber20111aa2009-07-14 16:56:47 -070077 list->clear();
78
79 Parcel data, reply;
80 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
81 remote()->transact(LIST_NODES, data, &reply);
82
83 int32_t n = reply.readInt32();
84 for (int32_t i = 0; i < n; ++i) {
Andreas Huber134ee6a2009-12-16 09:30:55 -080085 list->push_back(ComponentInfo());
86 ComponentInfo &info = *--list->end();
Andreas Huber20111aa2009-07-14 16:56:47 -070087
Andreas Huber134ee6a2009-12-16 09:30:55 -080088 info.mName = reply.readString8();
89 int32_t numRoles = reply.readInt32();
90 for (int32_t j = 0; j < numRoles; ++j) {
91 info.mRoles.push_back(reply.readString8());
92 }
Andreas Huber20111aa2009-07-14 16:56:47 -070093 }
94
95 return OK;
96 }
97
Andreas Huber318ad9c2009-10-15 13:46:54 -070098 virtual status_t allocateNode(
99 const char *name, const sp<IOMXObserver> &observer, node_id *node) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700100 Parcel data, reply;
101 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
102 data.writeCString(name);
Marco Nelissen06b46062014-11-14 07:58:25 -0800103 data.writeStrongBinder(IInterface::asBinder(observer));
Andreas Huber20111aa2009-07-14 16:56:47 -0700104 remote()->transact(ALLOCATE_NODE, data, &reply);
105
106 status_t err = reply.readInt32();
107 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700108 *node = (node_id)reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700109 } else {
110 *node = 0;
111 }
112
113 return err;
114 }
115
Andreas Huber318ad9c2009-10-15 13:46:54 -0700116 virtual status_t freeNode(node_id node) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700117 Parcel data, reply;
118 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700119 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700120 remote()->transact(FREE_NODE, data, &reply);
121
122 return reply.readInt32();
123 }
124
Andreas Huber318ad9c2009-10-15 13:46:54 -0700125 virtual status_t sendCommand(
Andreas Huber20111aa2009-07-14 16:56:47 -0700126 node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) {
127 Parcel data, reply;
128 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700129 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700130 data.writeInt32(cmd);
131 data.writeInt32(param);
132 remote()->transact(SEND_COMMAND, data, &reply);
133
134 return reply.readInt32();
135 }
136
Andreas Huber318ad9c2009-10-15 13:46:54 -0700137 virtual status_t getParameter(
Andreas Huber20111aa2009-07-14 16:56:47 -0700138 node_id node, OMX_INDEXTYPE index,
139 void *params, size_t size) {
140 Parcel data, reply;
141 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700142 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700143 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800144 data.writeInt64(size);
Andreas Huber20111aa2009-07-14 16:56:47 -0700145 data.write(params, size);
146 remote()->transact(GET_PARAMETER, data, &reply);
147
148 status_t err = reply.readInt32();
149 if (err != OK) {
150 return err;
151 }
152
153 reply.read(params, size);
154
155 return OK;
156 }
157
Andreas Huber318ad9c2009-10-15 13:46:54 -0700158 virtual status_t setParameter(
Andreas Huber20111aa2009-07-14 16:56:47 -0700159 node_id node, OMX_INDEXTYPE index,
160 const void *params, size_t size) {
161 Parcel data, reply;
162 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700163 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700164 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800165 data.writeInt64(size);
Andreas Huber20111aa2009-07-14 16:56:47 -0700166 data.write(params, size);
167 remote()->transact(SET_PARAMETER, data, &reply);
168
169 return reply.readInt32();
170 }
171
Andreas Huber318ad9c2009-10-15 13:46:54 -0700172 virtual status_t getConfig(
Andreas Huber693d2712009-08-14 14:37:10 -0700173 node_id node, OMX_INDEXTYPE index,
174 void *params, size_t size) {
175 Parcel data, reply;
176 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700177 data.writeInt32((int32_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700178 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800179 data.writeInt64(size);
Andreas Huber693d2712009-08-14 14:37:10 -0700180 data.write(params, size);
181 remote()->transact(GET_CONFIG, data, &reply);
182
183 status_t err = reply.readInt32();
184 if (err != OK) {
185 return err;
186 }
187
188 reply.read(params, size);
189
190 return OK;
191 }
192
Andreas Huber318ad9c2009-10-15 13:46:54 -0700193 virtual status_t setConfig(
Andreas Huber693d2712009-08-14 14:37:10 -0700194 node_id node, OMX_INDEXTYPE index,
195 const void *params, size_t size) {
196 Parcel data, reply;
197 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700198 data.writeInt32((int32_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700199 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800200 data.writeInt64(size);
Andreas Huber693d2712009-08-14 14:37:10 -0700201 data.write(params, size);
202 remote()->transact(SET_CONFIG, data, &reply);
203
204 return reply.readInt32();
205 }
206
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700207 virtual status_t getState(
208 node_id node, OMX_STATETYPE* state) {
209 Parcel data, reply;
210 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700211 data.writeInt32((int32_t)node);
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700212 remote()->transact(GET_STATE, data, &reply);
213
214 *state = static_cast<OMX_STATETYPE>(reply.readInt32());
215 return reply.readInt32();
216 }
217
Jamie Gennis83750ea2010-08-30 16:48:38 -0700218 virtual status_t enableGraphicBuffers(
219 node_id node, OMX_U32 port_index, OMX_BOOL enable) {
220 Parcel data, reply;
221 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700222 data.writeInt32((int32_t)node);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700223 data.writeInt32(port_index);
224 data.writeInt32((uint32_t)enable);
225 remote()->transact(ENABLE_GRAPHIC_BUFFERS, data, &reply);
226
227 status_t err = reply.readInt32();
228 return err;
229 }
230
Jamie Gennise2ce6452011-02-23 19:01:28 -0800231 virtual status_t getGraphicBufferUsage(
232 node_id node, OMX_U32 port_index, OMX_U32* usage) {
233 Parcel data, reply;
234 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700235 data.writeInt32((int32_t)node);
Jamie Gennise2ce6452011-02-23 19:01:28 -0800236 data.writeInt32(port_index);
237 remote()->transact(GET_GRAPHIC_BUFFER_USAGE, data, &reply);
238
239 status_t err = reply.readInt32();
240 *usage = reply.readInt32();
241 return err;
242 }
243
Andreas Huber318ad9c2009-10-15 13:46:54 -0700244 virtual status_t useBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700245 node_id node, OMX_U32 port_index, const sp<IMemory> &params,
246 buffer_id *buffer) {
247 Parcel data, reply;
248 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700249 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700250 data.writeInt32(port_index);
Marco Nelissen06b46062014-11-14 07:58:25 -0800251 data.writeStrongBinder(IInterface::asBinder(params));
Andreas Huber20111aa2009-07-14 16:56:47 -0700252 remote()->transact(USE_BUFFER, data, &reply);
253
254 status_t err = reply.readInt32();
255 if (err != OK) {
256 *buffer = 0;
257
258 return err;
259 }
260
Andy Hung609b8152014-05-02 11:05:04 -0700261 *buffer = (buffer_id)reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700262
263 return err;
264 }
265
Jamie Gennis83750ea2010-08-30 16:48:38 -0700266
267 virtual status_t useGraphicBuffer(
268 node_id node, OMX_U32 port_index,
269 const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) {
270 Parcel data, reply;
271 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700272 data.writeInt32((int32_t)node);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700273 data.writeInt32(port_index);
274 data.write(*graphicBuffer);
275 remote()->transact(USE_GRAPHIC_BUFFER, data, &reply);
276
277 status_t err = reply.readInt32();
278 if (err != OK) {
279 *buffer = 0;
280
281 return err;
282 }
283
Andy Hung609b8152014-05-02 11:05:04 -0700284 *buffer = (buffer_id)reply.readInt32();
Jamie Gennis83750ea2010-08-30 16:48:38 -0700285
286 return err;
287 }
288
Lajos Molnard0715862013-07-22 12:57:43 -0700289 virtual status_t updateGraphicBufferInMeta(
290 node_id node, OMX_U32 port_index,
291 const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer) {
292 Parcel data, reply;
293 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700294 data.writeInt32((int32_t)node);
Lajos Molnard0715862013-07-22 12:57:43 -0700295 data.writeInt32(port_index);
296 data.write(*graphicBuffer);
Andy Hung609b8152014-05-02 11:05:04 -0700297 data.writeInt32((int32_t)buffer);
Lajos Molnard0715862013-07-22 12:57:43 -0700298 remote()->transact(UPDATE_GRAPHIC_BUFFER_IN_META, data, &reply);
299
300 status_t err = reply.readInt32();
301 return err;
302 }
303
Andy McFadden7cd58532013-02-19 07:28:30 -0800304 virtual status_t createInputSurface(
305 node_id node, OMX_U32 port_index,
306 sp<IGraphicBufferProducer> *bufferProducer) {
307 Parcel data, reply;
308 status_t err;
309 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700310 data.writeInt32((int32_t)node);
Andy McFadden7cd58532013-02-19 07:28:30 -0800311 data.writeInt32(port_index);
312 err = remote()->transact(CREATE_INPUT_SURFACE, data, &reply);
313 if (err != OK) {
314 ALOGW("binder transaction failed: %d", err);
315 return err;
316 }
317
318 err = reply.readInt32();
319 if (err != OK) {
320 return err;
321 }
322
323 *bufferProducer = IGraphicBufferProducer::asInterface(
324 reply.readStrongBinder());
325
326 return err;
327 }
328
329 virtual status_t signalEndOfInputStream(node_id node) {
330 Parcel data, reply;
331 status_t err;
332 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700333 data.writeInt32((int32_t)node);
Andy McFadden7cd58532013-02-19 07:28:30 -0800334 err = remote()->transact(SIGNAL_END_OF_INPUT_STREAM, data, &reply);
335 if (err != OK) {
336 ALOGW("binder transaction failed: %d", err);
337 return err;
338 }
339
340 return reply.readInt32();
341 }
342
James Donge8707722010-10-20 17:38:41 -0700343 virtual status_t storeMetaDataInBuffers(
344 node_id node, OMX_U32 port_index, OMX_BOOL enable) {
345 Parcel data, reply;
346 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700347 data.writeInt32((int32_t)node);
James Donge8707722010-10-20 17:38:41 -0700348 data.writeInt32(port_index);
349 data.writeInt32((uint32_t)enable);
350 remote()->transact(STORE_META_DATA_IN_BUFFERS, data, &reply);
351
352 status_t err = reply.readInt32();
353 return err;
354 }
355
Lajos Molnar56ce7262013-05-02 16:30:48 -0700356 virtual status_t prepareForAdaptivePlayback(
357 node_id node, OMX_U32 port_index, OMX_BOOL enable,
358 OMX_U32 max_width, OMX_U32 max_height) {
359 Parcel data, reply;
360 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700361 data.writeInt32((int32_t)node);
Lajos Molnar56ce7262013-05-02 16:30:48 -0700362 data.writeInt32(port_index);
363 data.writeInt32((int32_t)enable);
364 data.writeInt32(max_width);
365 data.writeInt32(max_height);
366 remote()->transact(PREPARE_FOR_ADAPTIVE_PLAYBACK, data, &reply);
367
368 status_t err = reply.readInt32();
369 return err;
370 }
371
Rachad5a446aa2014-07-29 16:47:56 -0700372 virtual status_t configureVideoTunnelMode(
373 node_id node, OMX_U32 portIndex, OMX_BOOL tunneled,
374 OMX_U32 audioHwSync, native_handle_t **sidebandHandle ) {
375 Parcel data, reply;
376 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
377 data.writeInt32((int32_t)node);
378 data.writeInt32(portIndex);
379 data.writeInt32((int32_t)tunneled);
380 data.writeInt32(audioHwSync);
381 remote()->transact(CONFIGURE_VIDEO_TUNNEL_MODE, data, &reply);
382
383 status_t err = reply.readInt32();
384 if (sidebandHandle) {
385 *sidebandHandle = (native_handle_t *)reply.readNativeHandle();
386 }
387 return err;
388 }
389
390
Andreas Huber318ad9c2009-10-15 13:46:54 -0700391 virtual status_t allocateBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700392 node_id node, OMX_U32 port_index, size_t size,
Andreas Huber570a3cb2010-01-20 15:05:46 -0800393 buffer_id *buffer, void **buffer_data) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700394 Parcel data, reply;
395 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700396 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700397 data.writeInt32(port_index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800398 data.writeInt64(size);
Andreas Huber20111aa2009-07-14 16:56:47 -0700399 remote()->transact(ALLOC_BUFFER, data, &reply);
400
401 status_t err = reply.readInt32();
402 if (err != OK) {
403 *buffer = 0;
404
405 return err;
406 }
407
Andy Hung609b8152014-05-02 11:05:04 -0700408 *buffer = (buffer_id)reply.readInt32();
409 *buffer_data = (void *)reply.readInt64();
Andreas Huber20111aa2009-07-14 16:56:47 -0700410
411 return err;
412 }
413
Andreas Huber318ad9c2009-10-15 13:46:54 -0700414 virtual status_t allocateBufferWithBackup(
Andreas Huber20111aa2009-07-14 16:56:47 -0700415 node_id node, OMX_U32 port_index, const sp<IMemory> &params,
416 buffer_id *buffer) {
417 Parcel data, reply;
418 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700419 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700420 data.writeInt32(port_index);
Marco Nelissen06b46062014-11-14 07:58:25 -0800421 data.writeStrongBinder(IInterface::asBinder(params));
Andreas Huber20111aa2009-07-14 16:56:47 -0700422 remote()->transact(ALLOC_BUFFER_WITH_BACKUP, data, &reply);
423
424 status_t err = reply.readInt32();
425 if (err != OK) {
426 *buffer = 0;
427
428 return err;
429 }
430
Andy Hung609b8152014-05-02 11:05:04 -0700431 *buffer = (buffer_id)reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700432
433 return err;
434 }
435
Andreas Huber318ad9c2009-10-15 13:46:54 -0700436 virtual status_t freeBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700437 node_id node, OMX_U32 port_index, buffer_id buffer) {
438 Parcel data, reply;
439 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700440 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700441 data.writeInt32(port_index);
Andy Hung609b8152014-05-02 11:05:04 -0700442 data.writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700443 remote()->transact(FREE_BUFFER, data, &reply);
444
445 return reply.readInt32();
446 }
447
Andreas Huber318ad9c2009-10-15 13:46:54 -0700448 virtual status_t fillBuffer(node_id node, buffer_id buffer) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700449 Parcel data, reply;
450 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700451 data.writeInt32((int32_t)node);
452 data.writeInt32((int32_t)buffer);
Andreas Huber36efa032009-10-08 11:02:27 -0700453 remote()->transact(FILL_BUFFER, data, &reply);
454
455 return reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700456 }
457
Andreas Huber318ad9c2009-10-15 13:46:54 -0700458 virtual status_t emptyBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700459 node_id node,
460 buffer_id buffer,
461 OMX_U32 range_offset, OMX_U32 range_length,
462 OMX_U32 flags, OMX_TICKS timestamp) {
463 Parcel data, reply;
464 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700465 data.writeInt32((int32_t)node);
466 data.writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700467 data.writeInt32(range_offset);
468 data.writeInt32(range_length);
469 data.writeInt32(flags);
470 data.writeInt64(timestamp);
Andreas Huber36efa032009-10-08 11:02:27 -0700471 remote()->transact(EMPTY_BUFFER, data, &reply);
472
473 return reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700474 }
Andreas Huber8b938cd2009-07-31 11:52:50 -0700475
Andreas Huber318ad9c2009-10-15 13:46:54 -0700476 virtual status_t getExtensionIndex(
Andreas Huber693d2712009-08-14 14:37:10 -0700477 node_id node,
478 const char *parameter_name,
479 OMX_INDEXTYPE *index) {
480 Parcel data, reply;
481 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700482 data.writeInt32((int32_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700483 data.writeCString(parameter_name);
484
485 remote()->transact(GET_EXTENSION_INDEX, data, &reply);
486
487 status_t err = reply.readInt32();
488 if (err == OK) {
489 *index = static_cast<OMX_INDEXTYPE>(reply.readInt32());
490 } else {
491 *index = OMX_IndexComponentStartUnused;
492 }
493
494 return err;
495 }
Andreas Hubere40cda72013-07-17 13:55:26 -0700496
497 virtual status_t setInternalOption(
498 node_id node,
499 OMX_U32 port_index,
500 InternalOptionType type,
501 const void *optionData,
502 size_t size) {
503 Parcel data, reply;
504 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700505 data.writeInt32((int32_t)node);
Andreas Hubere40cda72013-07-17 13:55:26 -0700506 data.writeInt32(port_index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800507 data.writeInt64(size);
Andreas Hubere40cda72013-07-17 13:55:26 -0700508 data.write(optionData, size);
509 data.writeInt32(type);
510 remote()->transact(SET_INTERNAL_OPTION, data, &reply);
511
512 return reply.readInt32();
513 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700514};
515
516IMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX");
517
518////////////////////////////////////////////////////////////////////////////////
519
Andy McFadden7cd58532013-02-19 07:28:30 -0800520#define CHECK_OMX_INTERFACE(interface, data, reply) \
Andreas Huber20111aa2009-07-14 16:56:47 -0700521 do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \
Steve Block5ff1dd52012-01-05 23:22:43 +0000522 ALOGW("Call incorrectly routed to " #interface); \
Andreas Huber20111aa2009-07-14 16:56:47 -0700523 return PERMISSION_DENIED; \
524 } } while (0)
525
526status_t BnOMX::onTransact(
527 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
528 switch (code) {
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800529 case LIVES_LOCALLY:
530 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800531 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andy Hung609b8152014-05-02 11:05:04 -0700532 node_id node = (node_id)data.readInt32();
Andreas Huberd459b482012-01-31 11:16:24 -0800533 pid_t pid = (pid_t)data.readInt32();
534 reply->writeInt32(livesLocally(node, pid));
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800535
536 return OK;
537 }
538
Andreas Huber20111aa2009-07-14 16:56:47 -0700539 case LIST_NODES:
540 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800541 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700542
Andreas Huber134ee6a2009-12-16 09:30:55 -0800543 List<ComponentInfo> list;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700544 listNodes(&list);
Andreas Huber20111aa2009-07-14 16:56:47 -0700545
546 reply->writeInt32(list.size());
Andreas Huber134ee6a2009-12-16 09:30:55 -0800547 for (List<ComponentInfo>::iterator it = list.begin();
Andreas Huber20111aa2009-07-14 16:56:47 -0700548 it != list.end(); ++it) {
Andreas Huber134ee6a2009-12-16 09:30:55 -0800549 ComponentInfo &cur = *it;
550
551 reply->writeString8(cur.mName);
552 reply->writeInt32(cur.mRoles.size());
553 for (List<String8>::iterator role_it = cur.mRoles.begin();
554 role_it != cur.mRoles.end(); ++role_it) {
555 reply->writeString8(*role_it);
556 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700557 }
558
559 return NO_ERROR;
560 }
561
562 case ALLOCATE_NODE:
563 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800564 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700565
Andreas Huber318ad9c2009-10-15 13:46:54 -0700566 const char *name = data.readCString();
567
568 sp<IOMXObserver> observer =
569 interface_cast<IOMXObserver>(data.readStrongBinder());
570
Andreas Huber20111aa2009-07-14 16:56:47 -0700571 node_id node;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700572
573 status_t err = allocateNode(name, observer, &node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700574 reply->writeInt32(err);
575 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700576 reply->writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700577 }
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800578
Andreas Huber20111aa2009-07-14 16:56:47 -0700579 return NO_ERROR;
580 }
581
582 case FREE_NODE:
583 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800584 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700585
Andy Hung609b8152014-05-02 11:05:04 -0700586 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700587
Andreas Huber318ad9c2009-10-15 13:46:54 -0700588 reply->writeInt32(freeNode(node));
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800589
Andreas Huber20111aa2009-07-14 16:56:47 -0700590 return NO_ERROR;
591 }
592
593 case SEND_COMMAND:
594 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800595 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700596
Andy Hung609b8152014-05-02 11:05:04 -0700597 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700598
599 OMX_COMMANDTYPE cmd =
600 static_cast<OMX_COMMANDTYPE>(data.readInt32());
601
602 OMX_S32 param = data.readInt32();
Andreas Huber318ad9c2009-10-15 13:46:54 -0700603 reply->writeInt32(sendCommand(node, cmd, param));
Andreas Huber20111aa2009-07-14 16:56:47 -0700604
605 return NO_ERROR;
606 }
607
608 case GET_PARAMETER:
Andreas Huber20111aa2009-07-14 16:56:47 -0700609 case SET_PARAMETER:
Andreas Huber693d2712009-08-14 14:37:10 -0700610 case GET_CONFIG:
Andreas Huber693d2712009-08-14 14:37:10 -0700611 case SET_CONFIG:
Andreas Hubere40cda72013-07-17 13:55:26 -0700612 case SET_INTERNAL_OPTION:
Andreas Huber693d2712009-08-14 14:37:10 -0700613 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800614 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber693d2712009-08-14 14:37:10 -0700615
Andy Hung609b8152014-05-02 11:05:04 -0700616 node_id node = (node_id)data.readInt32();
Andreas Huber693d2712009-08-14 14:37:10 -0700617 OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
618
Glenn Kastene03dd222014-01-28 11:04:39 -0800619 size_t size = data.readInt64();
Andreas Huber693d2712009-08-14 14:37:10 -0700620
Andreas Huberb3912902011-01-19 10:34:52 -0800621 void *params = malloc(size);
622 data.read(params, size);
623
624 status_t err;
625 switch (code) {
626 case GET_PARAMETER:
627 err = getParameter(node, index, params, size);
628 break;
629 case SET_PARAMETER:
630 err = setParameter(node, index, params, size);
631 break;
632 case GET_CONFIG:
633 err = getConfig(node, index, params, size);
634 break;
635 case SET_CONFIG:
636 err = setConfig(node, index, params, size);
637 break;
Andreas Hubere40cda72013-07-17 13:55:26 -0700638 case SET_INTERNAL_OPTION:
639 {
640 InternalOptionType type =
641 (InternalOptionType)data.readInt32();
642
643 err = setInternalOption(node, index, type, params, size);
644 break;
645 }
646
Andreas Huberb3912902011-01-19 10:34:52 -0800647 default:
648 TRESPASS();
649 }
650
651 reply->writeInt32(err);
652
653 if ((code == GET_PARAMETER || code == GET_CONFIG) && err == OK) {
654 reply->write(params, size);
655 }
656
657 free(params);
658 params = NULL;
Andreas Huber693d2712009-08-14 14:37:10 -0700659
660 return NO_ERROR;
661 }
662
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700663 case GET_STATE:
664 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800665 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700666
Andy Hung609b8152014-05-02 11:05:04 -0700667 node_id node = (node_id)data.readInt32();
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700668 OMX_STATETYPE state = OMX_StateInvalid;
669
670 status_t err = getState(node, &state);
671 reply->writeInt32(state);
672 reply->writeInt32(err);
673
674 return NO_ERROR;
675 }
676
Jamie Gennis83750ea2010-08-30 16:48:38 -0700677 case ENABLE_GRAPHIC_BUFFERS:
678 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800679 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700680
Andy Hung609b8152014-05-02 11:05:04 -0700681 node_id node = (node_id)data.readInt32();
Jamie Gennis83750ea2010-08-30 16:48:38 -0700682 OMX_U32 port_index = data.readInt32();
683 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
684
685 status_t err = enableGraphicBuffers(node, port_index, enable);
686 reply->writeInt32(err);
687
688 return NO_ERROR;
689 }
690
Jamie Gennise2ce6452011-02-23 19:01:28 -0800691 case GET_GRAPHIC_BUFFER_USAGE:
692 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800693 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennise2ce6452011-02-23 19:01:28 -0800694
Andy Hung609b8152014-05-02 11:05:04 -0700695 node_id node = (node_id)data.readInt32();
Jamie Gennise2ce6452011-02-23 19:01:28 -0800696 OMX_U32 port_index = data.readInt32();
697
698 OMX_U32 usage = 0;
699 status_t err = getGraphicBufferUsage(node, port_index, &usage);
700 reply->writeInt32(err);
701 reply->writeInt32(usage);
702
703 return NO_ERROR;
704 }
705
Andreas Huber20111aa2009-07-14 16:56:47 -0700706 case USE_BUFFER:
707 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800708 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700709
Andy Hung609b8152014-05-02 11:05:04 -0700710 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700711 OMX_U32 port_index = data.readInt32();
712 sp<IMemory> params =
713 interface_cast<IMemory>(data.readStrongBinder());
714
715 buffer_id buffer;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700716 status_t err = useBuffer(node, port_index, params, &buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700717 reply->writeInt32(err);
718
719 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700720 reply->writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700721 }
722
723 return NO_ERROR;
724 }
725
Jamie Gennis83750ea2010-08-30 16:48:38 -0700726 case USE_GRAPHIC_BUFFER:
727 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800728 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700729
Andy Hung609b8152014-05-02 11:05:04 -0700730 node_id node = (node_id)data.readInt32();
Jamie Gennis83750ea2010-08-30 16:48:38 -0700731 OMX_U32 port_index = data.readInt32();
732 sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
733 data.read(*graphicBuffer);
734
735 buffer_id buffer;
736 status_t err = useGraphicBuffer(
737 node, port_index, graphicBuffer, &buffer);
738 reply->writeInt32(err);
739
740 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700741 reply->writeInt32((int32_t)buffer);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700742 }
743
744 return NO_ERROR;
745 }
746
Lajos Molnard0715862013-07-22 12:57:43 -0700747 case UPDATE_GRAPHIC_BUFFER_IN_META:
748 {
749 CHECK_OMX_INTERFACE(IOMX, data, reply);
750
Andy Hung609b8152014-05-02 11:05:04 -0700751 node_id node = (node_id)data.readInt32();
Lajos Molnard0715862013-07-22 12:57:43 -0700752 OMX_U32 port_index = data.readInt32();
753 sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
754 data.read(*graphicBuffer);
Andy Hung609b8152014-05-02 11:05:04 -0700755 buffer_id buffer = (buffer_id)data.readInt32();
Lajos Molnard0715862013-07-22 12:57:43 -0700756
757 status_t err = updateGraphicBufferInMeta(
758 node, port_index, graphicBuffer, buffer);
759 reply->writeInt32(err);
760
761 return NO_ERROR;
762 }
763
Andy McFadden7cd58532013-02-19 07:28:30 -0800764 case CREATE_INPUT_SURFACE:
765 {
766 CHECK_OMX_INTERFACE(IOMX, data, reply);
767
Andy Hung609b8152014-05-02 11:05:04 -0700768 node_id node = (node_id)data.readInt32();
Andy McFadden7cd58532013-02-19 07:28:30 -0800769 OMX_U32 port_index = data.readInt32();
770
771 sp<IGraphicBufferProducer> bufferProducer;
772 status_t err = createInputSurface(node, port_index,
773 &bufferProducer);
774
775 reply->writeInt32(err);
776
777 if (err == OK) {
Marco Nelissen06b46062014-11-14 07:58:25 -0800778 reply->writeStrongBinder(IInterface::asBinder(bufferProducer));
Andy McFadden7cd58532013-02-19 07:28:30 -0800779 }
780
781 return NO_ERROR;
782 }
783
784 case SIGNAL_END_OF_INPUT_STREAM:
785 {
786 CHECK_OMX_INTERFACE(IOMX, data, reply);
787
Andy Hung609b8152014-05-02 11:05:04 -0700788 node_id node = (node_id)data.readInt32();
Andy McFadden7cd58532013-02-19 07:28:30 -0800789
790 status_t err = signalEndOfInputStream(node);
791 reply->writeInt32(err);
792
793 return NO_ERROR;
794 }
795
James Donge8707722010-10-20 17:38:41 -0700796 case STORE_META_DATA_IN_BUFFERS:
797 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800798 CHECK_OMX_INTERFACE(IOMX, data, reply);
James Donge8707722010-10-20 17:38:41 -0700799
Andy Hung609b8152014-05-02 11:05:04 -0700800 node_id node = (node_id)data.readInt32();
James Donge8707722010-10-20 17:38:41 -0700801 OMX_U32 port_index = data.readInt32();
802 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
803
804 status_t err = storeMetaDataInBuffers(node, port_index, enable);
805 reply->writeInt32(err);
806
807 return NO_ERROR;
808 }
809
Lajos Molnar56ce7262013-05-02 16:30:48 -0700810 case PREPARE_FOR_ADAPTIVE_PLAYBACK:
811 {
812 CHECK_OMX_INTERFACE(IOMX, data, reply);
813
Andy Hung609b8152014-05-02 11:05:04 -0700814 node_id node = (node_id)data.readInt32();
Lajos Molnar56ce7262013-05-02 16:30:48 -0700815 OMX_U32 port_index = data.readInt32();
816 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
817 OMX_U32 max_width = data.readInt32();
818 OMX_U32 max_height = data.readInt32();
819
820 status_t err = prepareForAdaptivePlayback(
821 node, port_index, enable, max_width, max_height);
822 reply->writeInt32(err);
823
824 return NO_ERROR;
825 }
826
Rachad5a446aa2014-07-29 16:47:56 -0700827 case CONFIGURE_VIDEO_TUNNEL_MODE:
828 {
829 CHECK_OMX_INTERFACE(IOMX, data, reply);
830
831 node_id node = (node_id)data.readInt32();
832 OMX_U32 port_index = data.readInt32();
833 OMX_BOOL tunneled = (OMX_BOOL)data.readInt32();
834 OMX_U32 audio_hw_sync = data.readInt32();
835
836 native_handle_t *sideband_handle;
837 status_t err = configureVideoTunnelMode(
838 node, port_index, tunneled, audio_hw_sync, &sideband_handle);
839 reply->writeInt32(err);
840 reply->writeNativeHandle(sideband_handle);
841
842 return NO_ERROR;
843 }
844
Andreas Huber20111aa2009-07-14 16:56:47 -0700845 case ALLOC_BUFFER:
846 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800847 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700848
Andy Hung609b8152014-05-02 11:05:04 -0700849 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700850 OMX_U32 port_index = data.readInt32();
Glenn Kastene03dd222014-01-28 11:04:39 -0800851 size_t size = data.readInt64();
Andreas Huber20111aa2009-07-14 16:56:47 -0700852
853 buffer_id buffer;
Andreas Huber570a3cb2010-01-20 15:05:46 -0800854 void *buffer_data;
855 status_t err = allocateBuffer(
856 node, port_index, size, &buffer, &buffer_data);
Andreas Huber20111aa2009-07-14 16:56:47 -0700857 reply->writeInt32(err);
858
859 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700860 reply->writeInt32((int32_t)buffer);
861 reply->writeInt64((uintptr_t)buffer_data);
Andreas Huber20111aa2009-07-14 16:56:47 -0700862 }
863
864 return NO_ERROR;
865 }
866
867 case ALLOC_BUFFER_WITH_BACKUP:
868 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800869 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700870
Andy Hung609b8152014-05-02 11:05:04 -0700871 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700872 OMX_U32 port_index = data.readInt32();
873 sp<IMemory> params =
874 interface_cast<IMemory>(data.readStrongBinder());
875
876 buffer_id buffer;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700877 status_t err = allocateBufferWithBackup(
Andreas Huber20111aa2009-07-14 16:56:47 -0700878 node, port_index, params, &buffer);
879
880 reply->writeInt32(err);
881
882 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700883 reply->writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700884 }
885
886 return NO_ERROR;
887 }
888
889 case FREE_BUFFER:
890 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800891 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700892
Andy Hung609b8152014-05-02 11:05:04 -0700893 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700894 OMX_U32 port_index = data.readInt32();
Andy Hung609b8152014-05-02 11:05:04 -0700895 buffer_id buffer = (buffer_id)data.readInt32();
Andreas Huber318ad9c2009-10-15 13:46:54 -0700896 reply->writeInt32(freeBuffer(node, port_index, buffer));
Andreas Huber20111aa2009-07-14 16:56:47 -0700897
898 return NO_ERROR;
899 }
900
901 case FILL_BUFFER:
902 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800903 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700904
Andy Hung609b8152014-05-02 11:05:04 -0700905 node_id node = (node_id)data.readInt32();
906 buffer_id buffer = (buffer_id)data.readInt32();
Andreas Huber318ad9c2009-10-15 13:46:54 -0700907 reply->writeInt32(fillBuffer(node, buffer));
Andreas Huber20111aa2009-07-14 16:56:47 -0700908
909 return NO_ERROR;
910 }
911
912 case EMPTY_BUFFER:
913 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800914 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700915
Andy Hung609b8152014-05-02 11:05:04 -0700916 node_id node = (node_id)data.readInt32();
917 buffer_id buffer = (buffer_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700918 OMX_U32 range_offset = data.readInt32();
919 OMX_U32 range_length = data.readInt32();
920 OMX_U32 flags = data.readInt32();
921 OMX_TICKS timestamp = data.readInt64();
922
Andreas Huber36efa032009-10-08 11:02:27 -0700923 reply->writeInt32(
Andreas Huber318ad9c2009-10-15 13:46:54 -0700924 emptyBuffer(
Andreas Huber36efa032009-10-08 11:02:27 -0700925 node, buffer, range_offset, range_length,
926 flags, timestamp));
Andreas Huber20111aa2009-07-14 16:56:47 -0700927
928 return NO_ERROR;
929 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700930
Andreas Huber693d2712009-08-14 14:37:10 -0700931 case GET_EXTENSION_INDEX:
932 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800933 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber693d2712009-08-14 14:37:10 -0700934
Andy Hung609b8152014-05-02 11:05:04 -0700935 node_id node = (node_id)data.readInt32();
Andreas Huber693d2712009-08-14 14:37:10 -0700936 const char *parameter_name = data.readCString();
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800937
Andreas Huber693d2712009-08-14 14:37:10 -0700938 OMX_INDEXTYPE index;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700939 status_t err = getExtensionIndex(node, parameter_name, &index);
Andreas Huber693d2712009-08-14 14:37:10 -0700940
941 reply->writeInt32(err);
942
943 if (err == OK) {
944 reply->writeInt32(index);
945 }
946
947 return OK;
948 }
949
Andreas Huber20111aa2009-07-14 16:56:47 -0700950 default:
951 return BBinder::onTransact(code, data, reply, flags);
952 }
953}
954
955////////////////////////////////////////////////////////////////////////////////
956
957class BpOMXObserver : public BpInterface<IOMXObserver> {
958public:
959 BpOMXObserver(const sp<IBinder> &impl)
960 : BpInterface<IOMXObserver>(impl) {
961 }
962
Andreas Huber318ad9c2009-10-15 13:46:54 -0700963 virtual void onMessage(const omx_message &msg) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700964 Parcel data, reply;
965 data.writeInterfaceToken(IOMXObserver::getInterfaceDescriptor());
966 data.write(&msg, sizeof(msg));
967
Andy Hung609b8152014-05-02 11:05:04 -0700968 ALOGV("onMessage writing message %d, size %zu", msg.type, sizeof(msg));
969
Andreas Huber20111aa2009-07-14 16:56:47 -0700970 remote()->transact(OBSERVER_ON_MSG, data, &reply, IBinder::FLAG_ONEWAY);
971 }
972};
973
974IMPLEMENT_META_INTERFACE(OMXObserver, "android.hardware.IOMXObserver");
975
976status_t BnOMXObserver::onTransact(
977 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
978 switch (code) {
979 case OBSERVER_ON_MSG:
980 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800981 CHECK_OMX_INTERFACE(IOMXObserver, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700982
983 omx_message msg;
984 data.read(&msg, sizeof(msg));
985
Andy Hung609b8152014-05-02 11:05:04 -0700986 ALOGV("onTransact reading message %d, size %zu", msg.type, sizeof(msg));
987
Andreas Huber20111aa2009-07-14 16:56:47 -0700988 // XXX Could use readInplace maybe?
Andreas Huber318ad9c2009-10-15 13:46:54 -0700989 onMessage(msg);
Andreas Huber20111aa2009-07-14 16:56:47 -0700990
991 return NO_ERROR;
992 }
993
994 default:
995 return BBinder::onTransact(code, data, reply, flags);
996 }
997}
998
Andreas Huber20111aa2009-07-14 16:56:47 -0700999} // namespace android