blob: bc0c2cd91730a4a489b3d5783fdd90008c446893 [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
Marco Nelissen2720c8b2016-02-29 12:47:20 -080021#include <sys/mman.h>
22
Andreas Huber20111aa2009-07-14 16:56:47 -070023#include <binder/IMemory.h>
24#include <binder/Parcel.h>
25#include <media/IOMX.h>
Andreas Huberb3912902011-01-19 10:34:52 -080026#include <media/stagefright/foundation/ADebug.h>
Marco Nelissenc1c50e72016-03-10 15:02:13 -080027#include <media/openmax/OMX_IndexExt.h>
Chong Zhang3fd200f2016-10-07 17:25:58 -070028#include <media/OMXBuffer.h>
Mathias Agopianbc1713d2017-02-13 18:37:50 -080029#include <utils/NativeHandle.h>
Andreas Huber20111aa2009-07-14 16:56:47 -070030
Pawin Vongmasad2075e82017-07-11 04:50:40 -070031#include <media/omx/1.0/WOmxNode.h>
Chong Zhang6d332d22016-09-07 12:06:50 -070032#include <android/IGraphicBufferSource.h>
Chong Zhangaddf2cb2016-09-28 17:53:01 -070033#include <android/IOMXBufferSource.h>
Chong Zhang6d332d22016-09-07 12:06:50 -070034
Andreas Huber20111aa2009-07-14 16:56:47 -070035namespace android {
36
37enum {
38 CONNECT = IBinder::FIRST_CALL_TRANSACTION,
39 LIST_NODES,
40 ALLOCATE_NODE,
Chong Zhangd02c0862016-10-13 14:32:32 -070041 CREATE_INPUT_SURFACE,
Andreas Huber20111aa2009-07-14 16:56:47 -070042 FREE_NODE,
43 SEND_COMMAND,
44 GET_PARAMETER,
45 SET_PARAMETER,
Andreas Huber693d2712009-08-14 14:37:10 -070046 GET_CONFIG,
47 SET_CONFIG,
Chong Zhangd02c0862016-10-13 14:32:32 -070048 SET_PORT_MODE,
Chong Zhang8f469e12015-05-13 10:21:33 -070049 SET_INPUT_SURFACE,
Lajos Molnar56ce7262013-05-02 16:30:48 -070050 PREPARE_FOR_ADAPTIVE_PLAYBACK,
Lajos Molnara63141a2016-02-11 16:40:36 -080051 ALLOC_SECURE_BUFFER,
Chong Zhangd02c0862016-10-13 14:32:32 -070052 USE_BUFFER,
Andreas Huber20111aa2009-07-14 16:56:47 -070053 FREE_BUFFER,
Andreas Huber20111aa2009-07-14 16:56:47 -070054 FILL_BUFFER,
55 EMPTY_BUFFER,
Andreas Huber693d2712009-08-14 14:37:10 -070056 GET_EXTENSION_INDEX,
Andreas Huber20111aa2009-07-14 16:56:47 -070057 OBSERVER_ON_MSG,
Jamie Gennise2ce6452011-02-23 19:01:28 -080058 GET_GRAPHIC_BUFFER_USAGE,
Rachad5a446aa2014-07-29 16:47:56 -070059 CONFIGURE_VIDEO_TUNNEL_MODE,
Chong Zhang6cf9a122016-09-08 23:25:52 -070060 DISPATCH_MESSAGE,
Chong Zhang21b46582016-10-04 12:44:53 -070061 SET_QUIRKS,
Andreas Huber20111aa2009-07-14 16:56:47 -070062};
63
Chong Zhangd59b9722016-09-20 16:31:18 -070064class BpOMXNode : public BpInterface<IOMXNode> {
65public:
66 explicit BpOMXNode(const sp<IBinder> &impl)
67 : BpInterface<IOMXNode>(impl) {
68 }
69
70 virtual status_t freeNode() {
71 Parcel data, reply;
72 data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
73 remote()->transact(FREE_NODE, data, &reply);
74
75 return reply.readInt32();
76 }
77
78 virtual status_t sendCommand(
79 OMX_COMMANDTYPE cmd, OMX_S32 param) {
80 Parcel data, reply;
81 data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
82 data.writeInt32(cmd);
83 data.writeInt32(param);
84 remote()->transact(SEND_COMMAND, data, &reply);
85
86 return reply.readInt32();
87 }
88
89 virtual status_t getParameter(
90 OMX_INDEXTYPE index,
91 void *params, size_t size) {
92 Parcel data, reply;
93 data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
94 data.writeInt32(index);
95 data.writeInt64(size);
96 data.write(params, size);
97 remote()->transact(GET_PARAMETER, data, &reply);
98
99 status_t err = reply.readInt32();
100 if (err != OK) {
101 return err;
102 }
103
104 reply.read(params, size);
105
106 return OK;
107 }
108
109 virtual status_t setParameter(
110 OMX_INDEXTYPE index,
111 const void *params, size_t size) {
112 Parcel data, reply;
113 data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
114 data.writeInt32(index);
115 data.writeInt64(size);
116 data.write(params, size);
117 remote()->transact(SET_PARAMETER, data, &reply);
118
119 return reply.readInt32();
120 }
121
122 virtual status_t getConfig(
123 OMX_INDEXTYPE index,
124 void *params, size_t size) {
125 Parcel data, reply;
126 data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
127 data.writeInt32(index);
128 data.writeInt64(size);
129 data.write(params, size);
130 remote()->transact(GET_CONFIG, data, &reply);
131
132 status_t err = reply.readInt32();
133 if (err != OK) {
134 return err;
135 }
136
137 reply.read(params, size);
138
139 return OK;
140 }
141
142 virtual status_t setConfig(
143 OMX_INDEXTYPE index,
144 const void *params, size_t size) {
145 Parcel data, reply;
146 data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
147 data.writeInt32(index);
148 data.writeInt64(size);
149 data.write(params, size);
150 remote()->transact(SET_CONFIG, data, &reply);
151
152 return reply.readInt32();
153 }
154
Chong Zhangd02c0862016-10-13 14:32:32 -0700155 virtual status_t setPortMode(
156 OMX_U32 port_index, IOMX::PortMode mode) {
Chong Zhangd59b9722016-09-20 16:31:18 -0700157 Parcel data, reply;
158 data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
159 data.writeInt32(port_index);
Chong Zhangd02c0862016-10-13 14:32:32 -0700160 data.writeInt32(mode);
161 remote()->transact(SET_PORT_MODE, data, &reply);
Chong Zhangd59b9722016-09-20 16:31:18 -0700162
Chong Zhangd02c0862016-10-13 14:32:32 -0700163 return reply.readInt32();
Chong Zhangd59b9722016-09-20 16:31:18 -0700164 }
165
166 virtual status_t getGraphicBufferUsage(
167 OMX_U32 port_index, OMX_U32* usage) {
168 Parcel data, reply;
169 data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
170 data.writeInt32(port_index);
171 remote()->transact(GET_GRAPHIC_BUFFER_USAGE, data, &reply);
172
173 status_t err = reply.readInt32();
174 *usage = reply.readInt32();
175 return err;
176 }
177
178 virtual status_t useBuffer(
Chong Zhang3fd200f2016-10-07 17:25:58 -0700179 OMX_U32 port_index, const OMXBuffer &omxBuf, buffer_id *buffer) {
Chong Zhangd59b9722016-09-20 16:31:18 -0700180 Parcel data, reply;
181 data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
182 data.writeInt32(port_index);
Chong Zhang3fd200f2016-10-07 17:25:58 -0700183
184 status_t err = omxBuf.writeToParcel(&data);
185 if (err != OK) {
186 return err;
187 }
188
Chong Zhangd59b9722016-09-20 16:31:18 -0700189 remote()->transact(USE_BUFFER, data, &reply);
190
Chong Zhang3fd200f2016-10-07 17:25:58 -0700191 err = reply.readInt32();
Chong Zhangd59b9722016-09-20 16:31:18 -0700192 if (err != OK) {
193 *buffer = 0;
194
195 return err;
196 }
197
198 *buffer = (buffer_id)reply.readInt32();
199
200 return err;
201 }
202
Chong Zhang8f469e12015-05-13 10:21:33 -0700203 virtual status_t setInputSurface(
Chong Zhangaddf2cb2016-09-28 17:53:01 -0700204 const sp<IOMXBufferSource> &bufferSource) {
Chong Zhangd291c222015-04-30 18:15:52 -0700205 Parcel data, reply;
Chong Zhangd59b9722016-09-20 16:31:18 -0700206 data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
Chong Zhangd291c222015-04-30 18:15:52 -0700207
Chong Zhangaddf2cb2016-09-28 17:53:01 -0700208 data.writeStrongBinder(IInterface::asBinder(bufferSource));
209
210 status_t err = remote()->transact(SET_INPUT_SURFACE, data, &reply);
Chong Zhangd291c222015-04-30 18:15:52 -0700211
212 if (err != OK) {
213 ALOGW("binder transaction failed: %d", err);
214 return err;
215 }
Lajos Molnar05421982015-05-15 20:39:14 -0700216
Chong Zhang6d332d22016-09-07 12:06:50 -0700217 err = reply.readInt32();
Chong Zhang6d332d22016-09-07 12:06:50 -0700218
219 return err;
Andy McFadden7cd58532013-02-19 07:28:30 -0800220 }
221
Lajos Molnar56ce7262013-05-02 16:30:48 -0700222 virtual status_t prepareForAdaptivePlayback(
Chong Zhangd59b9722016-09-20 16:31:18 -0700223 OMX_U32 port_index, OMX_BOOL enable,
Lajos Molnar56ce7262013-05-02 16:30:48 -0700224 OMX_U32 max_width, OMX_U32 max_height) {
225 Parcel data, reply;
Chong Zhangd59b9722016-09-20 16:31:18 -0700226 data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
Lajos Molnar56ce7262013-05-02 16:30:48 -0700227 data.writeInt32(port_index);
228 data.writeInt32((int32_t)enable);
229 data.writeInt32(max_width);
230 data.writeInt32(max_height);
231 remote()->transact(PREPARE_FOR_ADAPTIVE_PLAYBACK, data, &reply);
232
233 status_t err = reply.readInt32();
234 return err;
235 }
236
Rachad5a446aa2014-07-29 16:47:56 -0700237 virtual status_t configureVideoTunnelMode(
Chong Zhangd59b9722016-09-20 16:31:18 -0700238 OMX_U32 portIndex, OMX_BOOL tunneled,
Rachad5a446aa2014-07-29 16:47:56 -0700239 OMX_U32 audioHwSync, native_handle_t **sidebandHandle ) {
240 Parcel data, reply;
Chong Zhangd59b9722016-09-20 16:31:18 -0700241 data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
Rachad5a446aa2014-07-29 16:47:56 -0700242 data.writeInt32(portIndex);
243 data.writeInt32((int32_t)tunneled);
244 data.writeInt32(audioHwSync);
245 remote()->transact(CONFIGURE_VIDEO_TUNNEL_MODE, data, &reply);
246
247 status_t err = reply.readInt32();
mspector@google.com9d72eb02016-02-08 10:56:13 -0800248 if (err == OK && sidebandHandle) {
Rachad5a446aa2014-07-29 16:47:56 -0700249 *sidebandHandle = (native_handle_t *)reply.readNativeHandle();
250 }
251 return err;
252 }
253
254
Lajos Molnara63141a2016-02-11 16:40:36 -0800255 virtual status_t allocateSecureBuffer(
Chong Zhangd59b9722016-09-20 16:31:18 -0700256 OMX_U32 port_index, size_t size,
Lajos Molnar1b40f282016-05-09 22:24:52 -0700257 buffer_id *buffer, void **buffer_data, sp<NativeHandle> *native_handle) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700258 Parcel data, reply;
Chong Zhangd59b9722016-09-20 16:31:18 -0700259 data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
Andreas Huber20111aa2009-07-14 16:56:47 -0700260 data.writeInt32(port_index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800261 data.writeInt64(size);
Lajos Molnara63141a2016-02-11 16:40:36 -0800262 remote()->transact(ALLOC_SECURE_BUFFER, data, &reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700263
264 status_t err = reply.readInt32();
265 if (err != OK) {
266 *buffer = 0;
Lajos Molnara63141a2016-02-11 16:40:36 -0800267 *buffer_data = NULL;
268 *native_handle = NULL;
Andreas Huber20111aa2009-07-14 16:56:47 -0700269 return err;
270 }
271
Andy Hung609b8152014-05-02 11:05:04 -0700272 *buffer = (buffer_id)reply.readInt32();
273 *buffer_data = (void *)reply.readInt64();
Lajos Molnara63141a2016-02-11 16:40:36 -0800274 if (*buffer_data == NULL) {
Lajos Molnar1b40f282016-05-09 22:24:52 -0700275 *native_handle = NativeHandle::create(
276 reply.readNativeHandle(), true /* ownsHandle */);
Lajos Molnara63141a2016-02-11 16:40:36 -0800277 } else {
278 *native_handle = NULL;
279 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700280 return err;
281 }
282
Andreas Huber318ad9c2009-10-15 13:46:54 -0700283 virtual status_t freeBuffer(
Chong Zhangd59b9722016-09-20 16:31:18 -0700284 OMX_U32 port_index, buffer_id buffer) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700285 Parcel data, reply;
Chong Zhangd59b9722016-09-20 16:31:18 -0700286 data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
Andreas Huber20111aa2009-07-14 16:56:47 -0700287 data.writeInt32(port_index);
Andy Hung609b8152014-05-02 11:05:04 -0700288 data.writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700289 remote()->transact(FREE_BUFFER, data, &reply);
290
291 return reply.readInt32();
292 }
293
Chong Zhang3fd200f2016-10-07 17:25:58 -0700294 virtual status_t fillBuffer(
295 buffer_id buffer, const OMXBuffer &omxBuf, int fenceFd) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700296 Parcel data, reply;
Chong Zhangd59b9722016-09-20 16:31:18 -0700297 data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700298 data.writeInt32((int32_t)buffer);
Chong Zhang3fd200f2016-10-07 17:25:58 -0700299 status_t err = omxBuf.writeToParcel(&data);
300 if (err != OK) {
301 return err;
302 }
Lajos Molnar15ab4992015-06-01 10:54:31 -0700303 data.writeInt32(fenceFd >= 0);
304 if (fenceFd >= 0) {
305 data.writeFileDescriptor(fenceFd, true /* takeOwnership */);
306 }
Andreas Huber36efa032009-10-08 11:02:27 -0700307 remote()->transact(FILL_BUFFER, data, &reply);
308
309 return reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700310 }
311
Andreas Huber318ad9c2009-10-15 13:46:54 -0700312 virtual status_t emptyBuffer(
Chong Zhang3fd200f2016-10-07 17:25:58 -0700313 buffer_id buffer, const OMXBuffer &omxBuf,
Lajos Molnar15ab4992015-06-01 10:54:31 -0700314 OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700315 Parcel data, reply;
Chong Zhangd59b9722016-09-20 16:31:18 -0700316 data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700317 data.writeInt32((int32_t)buffer);
Chong Zhang3fd200f2016-10-07 17:25:58 -0700318 status_t err = omxBuf.writeToParcel(&data);
319 if (err != OK) {
320 return err;
321 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700322 data.writeInt32(flags);
323 data.writeInt64(timestamp);
Lajos Molnar15ab4992015-06-01 10:54:31 -0700324 data.writeInt32(fenceFd >= 0);
325 if (fenceFd >= 0) {
326 data.writeFileDescriptor(fenceFd, true /* takeOwnership */);
327 }
Andreas Huber36efa032009-10-08 11:02:27 -0700328 remote()->transact(EMPTY_BUFFER, data, &reply);
329
330 return reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700331 }
Andreas Huber8b938cd2009-07-31 11:52:50 -0700332
Andreas Huber318ad9c2009-10-15 13:46:54 -0700333 virtual status_t getExtensionIndex(
Andreas Huber693d2712009-08-14 14:37:10 -0700334 const char *parameter_name,
335 OMX_INDEXTYPE *index) {
336 Parcel data, reply;
Chong Zhangd59b9722016-09-20 16:31:18 -0700337 data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
Andreas Huber693d2712009-08-14 14:37:10 -0700338 data.writeCString(parameter_name);
339
340 remote()->transact(GET_EXTENSION_INDEX, data, &reply);
341
342 status_t err = reply.readInt32();
343 if (err == OK) {
344 *index = static_cast<OMX_INDEXTYPE>(reply.readInt32());
345 } else {
346 *index = OMX_IndexComponentStartUnused;
347 }
348
349 return err;
350 }
Andreas Hubere40cda72013-07-17 13:55:26 -0700351
Chong Zhang6cf9a122016-09-08 23:25:52 -0700352 virtual status_t dispatchMessage(const omx_message &msg) {
353 Parcel data, reply;
Chong Zhangd59b9722016-09-20 16:31:18 -0700354 data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
Chong Zhang6cf9a122016-09-08 23:25:52 -0700355 data.writeInt32(msg.fenceFd >= 0);
356 if (msg.fenceFd >= 0) {
357 data.writeFileDescriptor(msg.fenceFd, true /* takeOwnership */);
358 }
359 data.writeInt32(msg.type);
360 data.write(&msg.u, sizeof(msg.u));
361
362 remote()->transact(DISPATCH_MESSAGE, data, &reply);
363
364 return reply.readInt32();
365 }
Chong Zhang21b46582016-10-04 12:44:53 -0700366
367 virtual status_t setQuirks(OMX_U32 quirks) {
368 Parcel data, reply;
369 data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
370 data.writeInt32(quirks);
371
372 remote()->transact(SET_QUIRKS, data, &reply);
373
374 return reply.readInt32();
375 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700376};
377
Pawin Vongmasaac7d4122017-03-01 05:48:42 -0800378using ::android::hardware::media::omx::V1_0::utils::LWOmxNode;
379class HpOMXNode : public HpInterface<BpOMXNode, LWOmxNode> {
380public:
381 HpOMXNode(const sp<IBinder>& base) : PBase(base) {}
382
383 virtual status_t freeNode() {
384 return mBase->freeNode();
385 }
386
387 virtual status_t sendCommand(
388 OMX_COMMANDTYPE cmd, OMX_S32 param) {
389 return mBase->sendCommand(cmd, param);
390 }
391
392 virtual status_t getParameter(
393 OMX_INDEXTYPE index, void *params, size_t size) {
394 return mBase->getParameter(index, params, size);
395 }
396
397 virtual status_t setParameter(
398 OMX_INDEXTYPE index, const void *params, size_t size) {
399 return mBase->setParameter(index, params, size);
400 }
401
402 virtual status_t getConfig(
403 OMX_INDEXTYPE index, void *params, size_t size) {
404 return mBase->getConfig(index, params, size);
405 }
406
407 virtual status_t setConfig(
408 OMX_INDEXTYPE index, const void *params, size_t size) {
409 return mBase->setConfig(index, params, size);
410 }
411
412 virtual status_t setPortMode(
413 OMX_U32 port_index, IOMX::PortMode mode) {
414 return mBase->setPortMode(port_index, mode);
415 }
416
417 virtual status_t prepareForAdaptivePlayback(
418 OMX_U32 portIndex, OMX_BOOL enable,
419 OMX_U32 maxFrameWidth, OMX_U32 maxFrameHeight) {
420 return mBase->prepareForAdaptivePlayback(
421 portIndex, enable, maxFrameWidth, maxFrameHeight);
422 }
423
424 virtual status_t configureVideoTunnelMode(
425 OMX_U32 portIndex, OMX_BOOL tunneled,
426 OMX_U32 audioHwSync, native_handle_t **sidebandHandle) {
427 return mBase->configureVideoTunnelMode(
428 portIndex, tunneled, audioHwSync, sidebandHandle);
429 }
430
431 virtual status_t getGraphicBufferUsage(
432 OMX_U32 port_index, OMX_U32* usage) {
433 return mBase->getGraphicBufferUsage(port_index, usage);
434 }
435
436 virtual status_t setInputSurface(
437 const sp<IOMXBufferSource> &bufferSource) {
438 return mBase->setInputSurface(bufferSource);
439 }
440
441 virtual status_t allocateSecureBuffer(
442 OMX_U32 port_index, size_t size, buffer_id *buffer,
443 void **buffer_data, sp<NativeHandle> *native_handle) {
444 return mBase->allocateSecureBuffer(
445 port_index, size, buffer, buffer_data, native_handle);
446 }
447
448 virtual status_t useBuffer(
449 OMX_U32 port_index, const OMXBuffer &omxBuf, buffer_id *buffer) {
450 return mBase->useBuffer(port_index, omxBuf, buffer);
451 }
452
453 virtual status_t freeBuffer(
454 OMX_U32 port_index, buffer_id buffer) {
455 return mBase->freeBuffer(port_index, buffer);
456 }
457
458 virtual status_t fillBuffer(
459 buffer_id buffer, const OMXBuffer &omxBuf, int fenceFd = -1) {
460 return mBase->fillBuffer(buffer, omxBuf, fenceFd);
461 }
462
463 virtual status_t emptyBuffer(
464 buffer_id buffer, const OMXBuffer &omxBuf,
465 OMX_U32 flags, OMX_TICKS timestamp, int fenceFd = -1) {
466 return mBase->emptyBuffer(buffer, omxBuf, flags, timestamp, fenceFd);
467 }
468
469 virtual status_t getExtensionIndex(
470 const char *parameter_name,
471 OMX_INDEXTYPE *index) {
472 return mBase->getExtensionIndex(parameter_name, index);
473 }
474
475 virtual status_t dispatchMessage(const omx_message &msg) {
476 return mBase->dispatchMessage(msg);
477 }
Pawin Vongmasaac7d4122017-03-01 05:48:42 -0800478};
479
Pawin Vongmasa3866c7e2019-01-31 05:21:29 -0800480IMPLEMENT_HYBRID_META_INTERFACE(OMXNode, "android.hardware.IOMXNode");
Andreas Huber20111aa2009-07-14 16:56:47 -0700481
482////////////////////////////////////////////////////////////////////////////////
483
Andy McFadden7cd58532013-02-19 07:28:30 -0800484#define CHECK_OMX_INTERFACE(interface, data, reply) \
Chih-Hung Hsieh83fbbb82016-05-17 15:08:10 -0700485 do { if (!(data).enforceInterface(interface::getInterfaceDescriptor())) { \
Steve Block5ff1dd52012-01-05 23:22:43 +0000486 ALOGW("Call incorrectly routed to " #interface); \
Andreas Huber20111aa2009-07-14 16:56:47 -0700487 return PERMISSION_DENIED; \
488 } } while (0)
489
Chong Zhangd59b9722016-09-20 16:31:18 -0700490status_t BnOMXNode::onTransact(
491 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
492 switch (code) {
493 case FREE_NODE:
494 {
495 CHECK_OMX_INTERFACE(IOMXNode, data, reply);
496
497 reply->writeInt32(freeNode());
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800498
Andreas Huber20111aa2009-07-14 16:56:47 -0700499 return NO_ERROR;
500 }
501
502 case SEND_COMMAND:
503 {
Chong Zhangd59b9722016-09-20 16:31:18 -0700504 CHECK_OMX_INTERFACE(IOMXNode, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700505
506 OMX_COMMANDTYPE cmd =
507 static_cast<OMX_COMMANDTYPE>(data.readInt32());
508
509 OMX_S32 param = data.readInt32();
Chong Zhangd59b9722016-09-20 16:31:18 -0700510 reply->writeInt32(sendCommand(cmd, param));
Andreas Huber20111aa2009-07-14 16:56:47 -0700511
512 return NO_ERROR;
513 }
514
515 case GET_PARAMETER:
Andreas Huber20111aa2009-07-14 16:56:47 -0700516 case SET_PARAMETER:
Andreas Huber693d2712009-08-14 14:37:10 -0700517 case GET_CONFIG:
Andreas Huber693d2712009-08-14 14:37:10 -0700518 case SET_CONFIG:
519 {
Chong Zhangd59b9722016-09-20 16:31:18 -0700520 CHECK_OMX_INTERFACE(IOMXNode, data, reply);
Andreas Huber693d2712009-08-14 14:37:10 -0700521
Andreas Huber693d2712009-08-14 14:37:10 -0700522 OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
523
Glenn Kastene03dd222014-01-28 11:04:39 -0800524 size_t size = data.readInt64();
Andreas Huber693d2712009-08-14 14:37:10 -0700525
Marco Nelissen2720c8b2016-02-29 12:47:20 -0800526 status_t err = NOT_ENOUGH_DATA;
527 void *params = NULL;
528 size_t pageSize = 0;
529 size_t allocSize = 0;
Marco Nelissen788b0b62016-03-21 11:31:53 -0700530 bool isUsageBits = (index == (OMX_INDEXTYPE) OMX_IndexParamConsumerUsageBits);
Chong Zhang6d332d22016-09-07 12:06:50 -0700531 if ((isUsageBits && size < 4) || (!isUsageBits && size < 8)) {
Marco Nelissen2720c8b2016-02-29 12:47:20 -0800532 // we expect the structure to contain at least the size and
533 // version, 8 bytes total
Marco Nelissen788b0b62016-03-21 11:31:53 -0700534 ALOGE("b/27207275 (%zu) (%d/%d)", size, int(index), int(code));
Marco Nelissen2720c8b2016-02-29 12:47:20 -0800535 android_errorWriteLog(0x534e4554, "27207275");
536 } else {
537 err = NO_MEMORY;
538 pageSize = (size_t) sysconf(_SC_PAGE_SIZE);
539 if (size > SIZE_MAX - (pageSize * 2)) {
540 ALOGE("requested param size too big");
Marco Nelissenf7a38822016-02-22 13:05:15 -0800541 } else {
Marco Nelissen2720c8b2016-02-29 12:47:20 -0800542 allocSize = (size + pageSize * 2) & ~(pageSize - 1);
543 params = mmap(NULL, allocSize, PROT_READ | PROT_WRITE,
544 MAP_PRIVATE | MAP_ANONYMOUS, -1 /* fd */, 0 /* offset */);
545 }
Caroline Tice225fc692016-11-15 18:03:48 -0800546 if (params != MAP_FAILED && params != NULL) {
Marco Nelissen2720c8b2016-02-29 12:47:20 -0800547 err = data.read(params, size);
548 if (err != OK) {
549 android_errorWriteLog(0x534e4554, "26914474");
550 } else {
551 err = NOT_ENOUGH_DATA;
552 OMX_U32 declaredSize = *(OMX_U32*)params;
Chong Zhang6d332d22016-09-07 12:06:50 -0700553 if (index != (OMX_INDEXTYPE) OMX_IndexParamConsumerUsageBits &&
Marco Nelissenc1c50e72016-03-10 15:02:13 -0800554 declaredSize > size) {
Marco Nelissen2720c8b2016-02-29 12:47:20 -0800555 // the buffer says it's bigger than it actually is
556 ALOGE("b/27207275 (%u/%zu)", declaredSize, size);
557 android_errorWriteLog(0x534e4554, "27207275");
558 } else {
559 // mark the last page as inaccessible, to avoid exploitation
560 // of codecs that access past the end of the allocation because
561 // they didn't check the size
Marco Nelissen866c8002016-09-20 13:36:40 -0700562 if (mprotect((char*)params + allocSize - pageSize, pageSize,
563 PROT_NONE) != 0) {
564 ALOGE("mprotect failed: %s", strerror(errno));
565 } else {
566 switch (code) {
567 case GET_PARAMETER:
Chong Zhangd59b9722016-09-20 16:31:18 -0700568 err = getParameter(index, params, size);
Marco Nelissen866c8002016-09-20 13:36:40 -0700569 break;
570 case SET_PARAMETER:
Chong Zhangd59b9722016-09-20 16:31:18 -0700571 err = setParameter(index, params, size);
Marco Nelissen866c8002016-09-20 13:36:40 -0700572 break;
573 case GET_CONFIG:
Chong Zhangd59b9722016-09-20 16:31:18 -0700574 err = getConfig(index, params, size);
Marco Nelissen866c8002016-09-20 13:36:40 -0700575 break;
576 case SET_CONFIG:
Chong Zhangd59b9722016-09-20 16:31:18 -0700577 err = setConfig(index, params, size);
Marco Nelissen866c8002016-09-20 13:36:40 -0700578 break;
Marco Nelissen866c8002016-09-20 13:36:40 -0700579 default:
580 TRESPASS();
Marco Nelissen2720c8b2016-02-29 12:47:20 -0800581 }
Marco Nelissen2720c8b2016-02-29 12:47:20 -0800582 }
Marco Nelissenf7a38822016-02-22 13:05:15 -0800583 }
Marco Nelissenf7a38822016-02-22 13:05:15 -0800584 }
Marco Nelissen2720c8b2016-02-29 12:47:20 -0800585 } else {
586 ALOGE("couldn't map: %s", strerror(errno));
Andreas Hubere40cda72013-07-17 13:55:26 -0700587 }
Andreas Huberb3912902011-01-19 10:34:52 -0800588 }
589
590 reply->writeInt32(err);
591
592 if ((code == GET_PARAMETER || code == GET_CONFIG) && err == OK) {
593 reply->write(params, size);
594 }
595
Marco Nelissen2720c8b2016-02-29 12:47:20 -0800596 if (params) {
597 munmap(params, allocSize);
598 }
Andreas Huberb3912902011-01-19 10:34:52 -0800599 params = NULL;
Andreas Huber693d2712009-08-14 14:37:10 -0700600
601 return NO_ERROR;
602 }
603
Chong Zhangd02c0862016-10-13 14:32:32 -0700604 case SET_PORT_MODE:
Jamie Gennis83750ea2010-08-30 16:48:38 -0700605 {
Chong Zhangd59b9722016-09-20 16:31:18 -0700606 CHECK_OMX_INTERFACE(IOMXNode, data, reply);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700607 OMX_U32 port_index = data.readInt32();
Chong Zhangd02c0862016-10-13 14:32:32 -0700608 IOMX::PortMode mode = (IOMX::PortMode) data.readInt32();
609 reply->writeInt32(setPortMode(port_index, mode));
Jamie Gennis83750ea2010-08-30 16:48:38 -0700610
611 return NO_ERROR;
612 }
613
Jamie Gennise2ce6452011-02-23 19:01:28 -0800614 case GET_GRAPHIC_BUFFER_USAGE:
615 {
Chong Zhangd59b9722016-09-20 16:31:18 -0700616 CHECK_OMX_INTERFACE(IOMXNode, data, reply);
Jamie Gennise2ce6452011-02-23 19:01:28 -0800617
Jamie Gennise2ce6452011-02-23 19:01:28 -0800618 OMX_U32 port_index = data.readInt32();
619
620 OMX_U32 usage = 0;
Chong Zhangd59b9722016-09-20 16:31:18 -0700621 status_t err = getGraphicBufferUsage(port_index, &usage);
Jamie Gennise2ce6452011-02-23 19:01:28 -0800622 reply->writeInt32(err);
623 reply->writeInt32(usage);
624
625 return NO_ERROR;
626 }
627
Andreas Huber20111aa2009-07-14 16:56:47 -0700628 case USE_BUFFER:
629 {
Chong Zhangd59b9722016-09-20 16:31:18 -0700630 CHECK_OMX_INTERFACE(IOMXNode, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700631
Andreas Huber20111aa2009-07-14 16:56:47 -0700632 OMX_U32 port_index = data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700633
Chong Zhang3fd200f2016-10-07 17:25:58 -0700634 OMXBuffer omxBuf;
635 status_t err = omxBuf.readFromParcel(&data);
636 if (err != OK) {
637 return err;
Wei Jia56c95c92016-01-06 10:30:46 -0800638 }
639
Andreas Huber20111aa2009-07-14 16:56:47 -0700640 buffer_id buffer;
Chong Zhang3fd200f2016-10-07 17:25:58 -0700641 err = useBuffer(port_index, omxBuf, &buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700642 reply->writeInt32(err);
643
644 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700645 reply->writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700646 }
647
648 return NO_ERROR;
649 }
650
Chong Zhang8f469e12015-05-13 10:21:33 -0700651 case SET_INPUT_SURFACE:
Chong Zhangd291c222015-04-30 18:15:52 -0700652 {
Chong Zhangd59b9722016-09-20 16:31:18 -0700653 CHECK_OMX_INTERFACE(IOMXNode, data, reply);
Chong Zhangd291c222015-04-30 18:15:52 -0700654
Chong Zhangaddf2cb2016-09-28 17:53:01 -0700655 sp<IOMXBufferSource> bufferSource =
656 interface_cast<IOMXBufferSource>(data.readStrongBinder());
Chong Zhangd291c222015-04-30 18:15:52 -0700657
Chong Zhangaddf2cb2016-09-28 17:53:01 -0700658 status_t err = setInputSurface(bufferSource);
Chong Zhangd291c222015-04-30 18:15:52 -0700659 reply->writeInt32(err);
Chong Zhangaddf2cb2016-09-28 17:53:01 -0700660
Andy McFadden7cd58532013-02-19 07:28:30 -0800661 return NO_ERROR;
662 }
663
Lajos Molnar56ce7262013-05-02 16:30:48 -0700664 case PREPARE_FOR_ADAPTIVE_PLAYBACK:
665 {
Chong Zhangd59b9722016-09-20 16:31:18 -0700666 CHECK_OMX_INTERFACE(IOMXNode, data, reply);
Lajos Molnar56ce7262013-05-02 16:30:48 -0700667
Lajos Molnar56ce7262013-05-02 16:30:48 -0700668 OMX_U32 port_index = data.readInt32();
669 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
670 OMX_U32 max_width = data.readInt32();
671 OMX_U32 max_height = data.readInt32();
672
673 status_t err = prepareForAdaptivePlayback(
Chong Zhangd59b9722016-09-20 16:31:18 -0700674 port_index, enable, max_width, max_height);
Lajos Molnar56ce7262013-05-02 16:30:48 -0700675 reply->writeInt32(err);
676
677 return NO_ERROR;
678 }
679
Rachad5a446aa2014-07-29 16:47:56 -0700680 case CONFIGURE_VIDEO_TUNNEL_MODE:
681 {
Chong Zhangd59b9722016-09-20 16:31:18 -0700682 CHECK_OMX_INTERFACE(IOMXNode, data, reply);
Rachad5a446aa2014-07-29 16:47:56 -0700683
Rachad5a446aa2014-07-29 16:47:56 -0700684 OMX_U32 port_index = data.readInt32();
685 OMX_BOOL tunneled = (OMX_BOOL)data.readInt32();
686 OMX_U32 audio_hw_sync = data.readInt32();
687
Lajos Molnara63141a2016-02-11 16:40:36 -0800688 native_handle_t *sideband_handle = NULL;
Rachad5a446aa2014-07-29 16:47:56 -0700689 status_t err = configureVideoTunnelMode(
Chong Zhangd59b9722016-09-20 16:31:18 -0700690 port_index, tunneled, audio_hw_sync, &sideband_handle);
Rachad5a446aa2014-07-29 16:47:56 -0700691 reply->writeInt32(err);
mspector@google.com9d72eb02016-02-08 10:56:13 -0800692 if(err == OK){
693 reply->writeNativeHandle(sideband_handle);
694 }
Rachad5a446aa2014-07-29 16:47:56 -0700695
696 return NO_ERROR;
697 }
698
Lajos Molnara63141a2016-02-11 16:40:36 -0800699 case ALLOC_SECURE_BUFFER:
Andreas Huber20111aa2009-07-14 16:56:47 -0700700 {
Chong Zhangd59b9722016-09-20 16:31:18 -0700701 CHECK_OMX_INTERFACE(IOMXNode, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700702
Andreas Huber20111aa2009-07-14 16:56:47 -0700703 OMX_U32 port_index = data.readInt32();
Chong Zhangd59b9722016-09-20 16:31:18 -0700704 if (!isSecure() || port_index != 0 /* kPortIndexInput */) {
Wei Jia8dde7262015-09-28 11:32:23 -0700705 ALOGE("b/24310423");
706 reply->writeInt32(INVALID_OPERATION);
707 return NO_ERROR;
708 }
709
Glenn Kastene03dd222014-01-28 11:04:39 -0800710 size_t size = data.readInt64();
Andreas Huber20111aa2009-07-14 16:56:47 -0700711
712 buffer_id buffer;
Lajos Molnara63141a2016-02-11 16:40:36 -0800713 void *buffer_data = NULL;
Lajos Molnar1b40f282016-05-09 22:24:52 -0700714 sp<NativeHandle> native_handle;
Lajos Molnara63141a2016-02-11 16:40:36 -0800715 status_t err = allocateSecureBuffer(
Chong Zhangd59b9722016-09-20 16:31:18 -0700716 port_index, size, &buffer, &buffer_data, &native_handle);
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);
721 reply->writeInt64((uintptr_t)buffer_data);
Lajos Molnara63141a2016-02-11 16:40:36 -0800722 if (buffer_data == NULL) {
Lajos Molnar1b40f282016-05-09 22:24:52 -0700723 reply->writeNativeHandle(native_handle == NULL ? NULL : native_handle->handle());
Lajos Molnara63141a2016-02-11 16:40:36 -0800724 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700725 }
726
727 return NO_ERROR;
728 }
729
Andreas Huber20111aa2009-07-14 16:56:47 -0700730 case FREE_BUFFER:
731 {
Chong Zhangd59b9722016-09-20 16:31:18 -0700732 CHECK_OMX_INTERFACE(IOMXNode, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700733
Andreas Huber20111aa2009-07-14 16:56:47 -0700734 OMX_U32 port_index = data.readInt32();
Andy Hung609b8152014-05-02 11:05:04 -0700735 buffer_id buffer = (buffer_id)data.readInt32();
Chong Zhangd59b9722016-09-20 16:31:18 -0700736 reply->writeInt32(freeBuffer(port_index, buffer));
Andreas Huber20111aa2009-07-14 16:56:47 -0700737
738 return NO_ERROR;
739 }
740
741 case FILL_BUFFER:
742 {
Chong Zhangd59b9722016-09-20 16:31:18 -0700743 CHECK_OMX_INTERFACE(IOMXNode, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700744
Andy Hung609b8152014-05-02 11:05:04 -0700745 buffer_id buffer = (buffer_id)data.readInt32();
Chong Zhang3fd200f2016-10-07 17:25:58 -0700746
747 OMXBuffer omxBuf;
748 status_t err = omxBuf.readFromParcel(&data);
749 if (err != OK) {
750 return err;
751 }
752
Lajos Molnar15ab4992015-06-01 10:54:31 -0700753 bool haveFence = data.readInt32();
754 int fenceFd = haveFence ? ::dup(data.readFileDescriptor()) : -1;
Chong Zhang3fd200f2016-10-07 17:25:58 -0700755
756 reply->writeInt32(fillBuffer(buffer, omxBuf, fenceFd));
Andreas Huber20111aa2009-07-14 16:56:47 -0700757
758 return NO_ERROR;
759 }
760
761 case EMPTY_BUFFER:
762 {
Chong Zhangd59b9722016-09-20 16:31:18 -0700763 CHECK_OMX_INTERFACE(IOMXNode, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700764
Andy Hung609b8152014-05-02 11:05:04 -0700765 buffer_id buffer = (buffer_id)data.readInt32();
Chong Zhang3fd200f2016-10-07 17:25:58 -0700766 OMXBuffer omxBuf;
767 status_t err = omxBuf.readFromParcel(&data);
768 if (err != OK) {
769 return err;
770 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700771 OMX_U32 flags = data.readInt32();
772 OMX_TICKS timestamp = data.readInt64();
Lajos Molnar15ab4992015-06-01 10:54:31 -0700773 bool haveFence = data.readInt32();
774 int fenceFd = haveFence ? ::dup(data.readFileDescriptor()) : -1;
775 reply->writeInt32(emptyBuffer(
Chong Zhang3fd200f2016-10-07 17:25:58 -0700776 buffer, omxBuf, flags, timestamp, fenceFd));
Chong Zhang6cf9a122016-09-08 23:25:52 -0700777
778 return NO_ERROR;
779 }
780
Andreas Huber693d2712009-08-14 14:37:10 -0700781 case GET_EXTENSION_INDEX:
782 {
Chong Zhangd59b9722016-09-20 16:31:18 -0700783 CHECK_OMX_INTERFACE(IOMXNode, data, reply);
Andreas Huber693d2712009-08-14 14:37:10 -0700784
Andreas Huber693d2712009-08-14 14:37:10 -0700785 const char *parameter_name = data.readCString();
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800786
Wei Jia56c95c92016-01-06 10:30:46 -0800787 if (parameter_name == NULL) {
788 ALOGE("b/26392700");
789 reply->writeInt32(INVALID_OPERATION);
790 return NO_ERROR;
791 }
792
Andreas Huber693d2712009-08-14 14:37:10 -0700793 OMX_INDEXTYPE index;
Chong Zhangd59b9722016-09-20 16:31:18 -0700794 status_t err = getExtensionIndex(parameter_name, &index);
Andreas Huber693d2712009-08-14 14:37:10 -0700795
796 reply->writeInt32(err);
797
798 if (err == OK) {
799 reply->writeInt32(index);
800 }
801
802 return OK;
803 }
804
Chong Zhang6cf9a122016-09-08 23:25:52 -0700805 case DISPATCH_MESSAGE:
806 {
Chong Zhangd59b9722016-09-20 16:31:18 -0700807 CHECK_OMX_INTERFACE(IOMXNode, data, reply);
Chong Zhang6cf9a122016-09-08 23:25:52 -0700808 omx_message msg;
Chong Zhang6cf9a122016-09-08 23:25:52 -0700809 int haveFence = data.readInt32();
810 msg.fenceFd = haveFence ? ::dup(data.readFileDescriptor()) : -1;
811 msg.type = (typeof(msg.type))data.readInt32();
812 status_t err = data.read(&msg.u, sizeof(msg.u));
813
814 if (err == OK) {
815 err = dispatchMessage(msg);
816 }
817 reply->writeInt32(err);
818
819 return NO_ERROR;
820 }
821
Andreas Huber20111aa2009-07-14 16:56:47 -0700822 default:
823 return BBinder::onTransact(code, data, reply, flags);
824 }
825}
826
827////////////////////////////////////////////////////////////////////////////////
828
829class BpOMXObserver : public BpInterface<IOMXObserver> {
830public:
Chih-Hung Hsieh090ef602016-04-27 10:39:54 -0700831 explicit BpOMXObserver(const sp<IBinder> &impl)
Andreas Huber20111aa2009-07-14 16:56:47 -0700832 : BpInterface<IOMXObserver>(impl) {
833 }
834
Lajos Molnar26a48f32015-06-04 10:30:02 -0700835 virtual void onMessages(const std::list<omx_message> &messages) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700836 Parcel data, reply;
Lajos Molnar26a48f32015-06-04 10:30:02 -0700837 std::list<omx_message>::const_iterator it = messages.cbegin();
Chong Zhangd59b9722016-09-20 16:31:18 -0700838 if (messages.empty()) {
839 return;
840 }
841 data.writeInterfaceToken(IOMXObserver::getInterfaceDescriptor());
Lajos Molnar26a48f32015-06-04 10:30:02 -0700842 while (it != messages.cend()) {
843 const omx_message &msg = *it++;
Lajos Molnar26a48f32015-06-04 10:30:02 -0700844 data.writeInt32(msg.fenceFd >= 0);
845 if (msg.fenceFd >= 0) {
846 data.writeFileDescriptor(msg.fenceFd, true /* takeOwnership */);
847 }
848 data.writeInt32(msg.type);
849 data.write(&msg.u, sizeof(msg.u));
850 ALOGV("onMessage writing message %d, size %zu", msg.type, sizeof(msg));
Lajos Molnar15ab4992015-06-01 10:54:31 -0700851 }
Chong Zhangd59b9722016-09-20 16:31:18 -0700852 data.writeInt32(-1); // mark end
853 remote()->transact(OBSERVER_ON_MSG, data, &reply, IBinder::FLAG_ONEWAY);
Andreas Huber20111aa2009-07-14 16:56:47 -0700854 }
855};
856
857IMPLEMENT_META_INTERFACE(OMXObserver, "android.hardware.IOMXObserver");
858
859status_t BnOMXObserver::onTransact(
860 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
861 switch (code) {
862 case OBSERVER_ON_MSG:
863 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800864 CHECK_OMX_INTERFACE(IOMXObserver, data, reply);
Lajos Molnar26a48f32015-06-04 10:30:02 -0700865 std::list<omx_message> messages;
866 status_t err = FAILED_TRANSACTION; // must receive at least one message
867 do {
868 int haveFence = data.readInt32();
869 if (haveFence < 0) { // we use -1 to mark end of messages
870 break;
871 }
872 omx_message msg;
Lajos Molnar26a48f32015-06-04 10:30:02 -0700873 msg.fenceFd = haveFence ? ::dup(data.readFileDescriptor()) : -1;
874 msg.type = (typeof(msg.type))data.readInt32();
875 err = data.read(&msg.u, sizeof(msg.u));
876 ALOGV("onTransact reading message %d, size %zu", msg.type, sizeof(msg));
877 messages.push_back(msg);
878 } while (err == OK);
Andreas Huber20111aa2009-07-14 16:56:47 -0700879
Lajos Molnar26a48f32015-06-04 10:30:02 -0700880 if (err == OK) {
881 onMessages(messages);
Lajos Molnar15ab4992015-06-01 10:54:31 -0700882 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700883
Lajos Molnar26a48f32015-06-04 10:30:02 -0700884 return err;
Andreas Huber20111aa2009-07-14 16:56:47 -0700885 }
886
887 default:
888 return BBinder::onTransact(code, data, reply, flags);
889 }
890}
891
Andreas Huber20111aa2009-07-14 16:56:47 -0700892} // namespace android