blob: 1090a8330eb550acd9d479c852181e12121b1774 [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>
Lajos Molnar7e0bef82016-05-09 10:48:30 -070028#include <utils/NativeHandle.h>
Andreas Huber20111aa2009-07-14 16:56:47 -070029
30namespace android {
31
32enum {
33 CONNECT = IBinder::FIRST_CALL_TRANSACTION,
Andreas Huber7eaa9c92010-01-15 15:28:19 -080034 LIVES_LOCALLY,
Andreas Huber20111aa2009-07-14 16:56:47 -070035 LIST_NODES,
36 ALLOCATE_NODE,
37 FREE_NODE,
38 SEND_COMMAND,
39 GET_PARAMETER,
40 SET_PARAMETER,
Andreas Huber693d2712009-08-14 14:37:10 -070041 GET_CONFIG,
42 SET_CONFIG,
Jamie Gennisb1d666f2011-10-19 21:14:13 -070043 GET_STATE,
Lajos Molnara63141a2016-02-11 16:40:36 -080044 ENABLE_NATIVE_BUFFERS,
Andreas Huber20111aa2009-07-14 16:56:47 -070045 USE_BUFFER,
Jamie Gennis83750ea2010-08-30 16:48:38 -070046 USE_GRAPHIC_BUFFER,
Andy McFadden7cd58532013-02-19 07:28:30 -080047 CREATE_INPUT_SURFACE,
Chong Zhangd291c222015-04-30 18:15:52 -070048 CREATE_PERSISTENT_INPUT_SURFACE,
Chong Zhang8f469e12015-05-13 10:21:33 -070049 SET_INPUT_SURFACE,
Andy McFadden7cd58532013-02-19 07:28:30 -080050 SIGNAL_END_OF_INPUT_STREAM,
James Donge8707722010-10-20 17:38:41 -070051 STORE_META_DATA_IN_BUFFERS,
Lajos Molnar56ce7262013-05-02 16:30:48 -070052 PREPARE_FOR_ADAPTIVE_PLAYBACK,
Lajos Molnara63141a2016-02-11 16:40:36 -080053 ALLOC_SECURE_BUFFER,
Andreas Huber20111aa2009-07-14 16:56:47 -070054 ALLOC_BUFFER_WITH_BACKUP,
55 FREE_BUFFER,
Andreas Huber20111aa2009-07-14 16:56:47 -070056 FILL_BUFFER,
57 EMPTY_BUFFER,
Andreas Huber693d2712009-08-14 14:37:10 -070058 GET_EXTENSION_INDEX,
Andreas Huber20111aa2009-07-14 16:56:47 -070059 OBSERVER_ON_MSG,
Jamie Gennise2ce6452011-02-23 19:01:28 -080060 GET_GRAPHIC_BUFFER_USAGE,
Andreas Hubere40cda72013-07-17 13:55:26 -070061 SET_INTERNAL_OPTION,
Lajos Molnard0715862013-07-22 12:57:43 -070062 UPDATE_GRAPHIC_BUFFER_IN_META,
Rachad5a446aa2014-07-29 16:47:56 -070063 CONFIGURE_VIDEO_TUNNEL_MODE,
Lajos Molnar7e0bef82016-05-09 10:48:30 -070064 UPDATE_NATIVE_HANDLE_IN_META,
Andreas Huber20111aa2009-07-14 16:56:47 -070065};
66
Andreas Huber20111aa2009-07-14 16:56:47 -070067class BpOMX : public BpInterface<IOMX> {
68public:
69 BpOMX(const sp<IBinder> &impl)
70 : BpInterface<IOMX>(impl) {
71 }
72
Andreas Huberd459b482012-01-31 11:16:24 -080073 virtual bool livesLocally(node_id node, pid_t pid) {
Andreas Huber7eaa9c92010-01-15 15:28:19 -080074 Parcel data, reply;
75 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -070076 data.writeInt32((int32_t)node);
Andreas Huber7eaa9c92010-01-15 15:28:19 -080077 data.writeInt32(pid);
78 remote()->transact(LIVES_LOCALLY, data, &reply);
79
80 return reply.readInt32() != 0;
81 }
82
Andreas Huber134ee6a2009-12-16 09:30:55 -080083 virtual status_t listNodes(List<ComponentInfo> *list) {
Andreas Huber20111aa2009-07-14 16:56:47 -070084 list->clear();
85
86 Parcel data, reply;
87 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
88 remote()->transact(LIST_NODES, data, &reply);
89
90 int32_t n = reply.readInt32();
91 for (int32_t i = 0; i < n; ++i) {
Andreas Huber134ee6a2009-12-16 09:30:55 -080092 list->push_back(ComponentInfo());
93 ComponentInfo &info = *--list->end();
Andreas Huber20111aa2009-07-14 16:56:47 -070094
Andreas Huber134ee6a2009-12-16 09:30:55 -080095 info.mName = reply.readString8();
96 int32_t numRoles = reply.readInt32();
97 for (int32_t j = 0; j < numRoles; ++j) {
98 info.mRoles.push_back(reply.readString8());
99 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700100 }
101
102 return OK;
103 }
104
Andreas Huber318ad9c2009-10-15 13:46:54 -0700105 virtual status_t allocateNode(
Marco Nelissen23858872016-02-17 13:12:13 -0800106 const char *name, const sp<IOMXObserver> &observer,
107 sp<IBinder> *nodeBinder,
108 node_id *node) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700109 Parcel data, reply;
110 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
111 data.writeCString(name);
Marco Nelissen06b46062014-11-14 07:58:25 -0800112 data.writeStrongBinder(IInterface::asBinder(observer));
Andreas Huber20111aa2009-07-14 16:56:47 -0700113 remote()->transact(ALLOCATE_NODE, data, &reply);
114
115 status_t err = reply.readInt32();
116 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700117 *node = (node_id)reply.readInt32();
Marco Nelissen23858872016-02-17 13:12:13 -0800118 if (nodeBinder != NULL) {
119 *nodeBinder = remote();
120 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700121 } else {
122 *node = 0;
123 }
124
125 return err;
126 }
127
Andreas Huber318ad9c2009-10-15 13:46:54 -0700128 virtual status_t freeNode(node_id node) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700129 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 remote()->transact(FREE_NODE, data, &reply);
133
134 return reply.readInt32();
135 }
136
Andreas Huber318ad9c2009-10-15 13:46:54 -0700137 virtual status_t sendCommand(
Andreas Huber20111aa2009-07-14 16:56:47 -0700138 node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) {
139 Parcel data, reply;
140 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700141 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700142 data.writeInt32(cmd);
143 data.writeInt32(param);
144 remote()->transact(SEND_COMMAND, data, &reply);
145
146 return reply.readInt32();
147 }
148
Andreas Huber318ad9c2009-10-15 13:46:54 -0700149 virtual status_t getParameter(
Andreas Huber20111aa2009-07-14 16:56:47 -0700150 node_id node, OMX_INDEXTYPE index,
151 void *params, size_t size) {
152 Parcel data, reply;
153 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700154 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700155 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800156 data.writeInt64(size);
Andreas Huber20111aa2009-07-14 16:56:47 -0700157 data.write(params, size);
158 remote()->transact(GET_PARAMETER, data, &reply);
159
160 status_t err = reply.readInt32();
161 if (err != OK) {
162 return err;
163 }
164
165 reply.read(params, size);
166
167 return OK;
168 }
169
Andreas Huber318ad9c2009-10-15 13:46:54 -0700170 virtual status_t setParameter(
Andreas Huber20111aa2009-07-14 16:56:47 -0700171 node_id node, OMX_INDEXTYPE index,
172 const void *params, size_t size) {
173 Parcel data, reply;
174 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700175 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700176 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800177 data.writeInt64(size);
Andreas Huber20111aa2009-07-14 16:56:47 -0700178 data.write(params, size);
179 remote()->transact(SET_PARAMETER, data, &reply);
180
181 return reply.readInt32();
182 }
183
Andreas Huber318ad9c2009-10-15 13:46:54 -0700184 virtual status_t getConfig(
Andreas Huber693d2712009-08-14 14:37:10 -0700185 node_id node, OMX_INDEXTYPE index,
186 void *params, size_t size) {
187 Parcel data, reply;
188 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700189 data.writeInt32((int32_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700190 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800191 data.writeInt64(size);
Andreas Huber693d2712009-08-14 14:37:10 -0700192 data.write(params, size);
193 remote()->transact(GET_CONFIG, data, &reply);
194
195 status_t err = reply.readInt32();
196 if (err != OK) {
197 return err;
198 }
199
200 reply.read(params, size);
201
202 return OK;
203 }
204
Andreas Huber318ad9c2009-10-15 13:46:54 -0700205 virtual status_t setConfig(
Andreas Huber693d2712009-08-14 14:37:10 -0700206 node_id node, OMX_INDEXTYPE index,
207 const void *params, size_t size) {
208 Parcel data, reply;
209 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700210 data.writeInt32((int32_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700211 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800212 data.writeInt64(size);
Andreas Huber693d2712009-08-14 14:37:10 -0700213 data.write(params, size);
214 remote()->transact(SET_CONFIG, data, &reply);
215
216 return reply.readInt32();
217 }
218
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700219 virtual status_t getState(
220 node_id node, OMX_STATETYPE* state) {
221 Parcel data, reply;
222 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700223 data.writeInt32((int32_t)node);
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700224 remote()->transact(GET_STATE, data, &reply);
225
226 *state = static_cast<OMX_STATETYPE>(reply.readInt32());
227 return reply.readInt32();
228 }
229
Lajos Molnara63141a2016-02-11 16:40:36 -0800230 virtual status_t enableNativeBuffers(
231 node_id node, OMX_U32 port_index, OMX_BOOL graphic, OMX_BOOL enable) {
Jamie Gennis83750ea2010-08-30 16:48:38 -0700232 Parcel data, reply;
233 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700234 data.writeInt32((int32_t)node);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700235 data.writeInt32(port_index);
Lajos Molnara63141a2016-02-11 16:40:36 -0800236 data.writeInt32((uint32_t)graphic);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700237 data.writeInt32((uint32_t)enable);
Lajos Molnara63141a2016-02-11 16:40:36 -0800238 remote()->transact(ENABLE_NATIVE_BUFFERS, data, &reply);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700239
240 status_t err = reply.readInt32();
241 return err;
242 }
243
Jamie Gennise2ce6452011-02-23 19:01:28 -0800244 virtual status_t getGraphicBufferUsage(
245 node_id node, OMX_U32 port_index, OMX_U32* usage) {
246 Parcel data, reply;
247 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700248 data.writeInt32((int32_t)node);
Jamie Gennise2ce6452011-02-23 19:01:28 -0800249 data.writeInt32(port_index);
250 remote()->transact(GET_GRAPHIC_BUFFER_USAGE, data, &reply);
251
252 status_t err = reply.readInt32();
253 *usage = reply.readInt32();
254 return err;
255 }
256
Andreas Huber318ad9c2009-10-15 13:46:54 -0700257 virtual status_t useBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700258 node_id node, OMX_U32 port_index, const sp<IMemory> &params,
Lajos Molnarcc7cc672015-06-01 14:58:37 -0700259 buffer_id *buffer, OMX_U32 allottedSize) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700260 Parcel data, reply;
261 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700262 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700263 data.writeInt32(port_index);
Marco Nelissen06b46062014-11-14 07:58:25 -0800264 data.writeStrongBinder(IInterface::asBinder(params));
Lajos Molnarcc7cc672015-06-01 14:58:37 -0700265 data.writeInt32(allottedSize);
Andreas Huber20111aa2009-07-14 16:56:47 -0700266 remote()->transact(USE_BUFFER, data, &reply);
267
268 status_t err = reply.readInt32();
269 if (err != OK) {
270 *buffer = 0;
271
272 return err;
273 }
274
Andy Hung609b8152014-05-02 11:05:04 -0700275 *buffer = (buffer_id)reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700276
277 return err;
278 }
279
Jamie Gennis83750ea2010-08-30 16:48:38 -0700280
281 virtual status_t useGraphicBuffer(
282 node_id node, OMX_U32 port_index,
283 const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) {
284 Parcel data, reply;
285 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700286 data.writeInt32((int32_t)node);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700287 data.writeInt32(port_index);
288 data.write(*graphicBuffer);
289 remote()->transact(USE_GRAPHIC_BUFFER, data, &reply);
290
291 status_t err = reply.readInt32();
292 if (err != OK) {
293 *buffer = 0;
294
295 return err;
296 }
297
Andy Hung609b8152014-05-02 11:05:04 -0700298 *buffer = (buffer_id)reply.readInt32();
Jamie Gennis83750ea2010-08-30 16:48:38 -0700299
300 return err;
301 }
302
Lajos Molnard0715862013-07-22 12:57:43 -0700303 virtual status_t updateGraphicBufferInMeta(
304 node_id node, OMX_U32 port_index,
305 const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer) {
306 Parcel data, reply;
307 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700308 data.writeInt32((int32_t)node);
Lajos Molnard0715862013-07-22 12:57:43 -0700309 data.writeInt32(port_index);
310 data.write(*graphicBuffer);
Andy Hung609b8152014-05-02 11:05:04 -0700311 data.writeInt32((int32_t)buffer);
Lajos Molnard0715862013-07-22 12:57:43 -0700312 remote()->transact(UPDATE_GRAPHIC_BUFFER_IN_META, data, &reply);
313
314 status_t err = reply.readInt32();
315 return err;
316 }
317
Lajos Molnar7e0bef82016-05-09 10:48:30 -0700318 virtual status_t updateNativeHandleInMeta(
319 node_id node, OMX_U32 port_index,
320 const sp<NativeHandle> &nativeHandle, buffer_id buffer) {
321 Parcel data, reply;
322 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
323 data.writeInt32((int32_t)node);
324 data.writeInt32(port_index);
325 data.writeInt32(nativeHandle != NULL);
326 if (nativeHandle != NULL) {
327 data.writeNativeHandle(nativeHandle->handle());
328 }
329 data.writeInt32((int32_t)buffer);
330 remote()->transact(UPDATE_NATIVE_HANDLE_IN_META, data, &reply);
331
332 status_t err = reply.readInt32();
333 return err;
334 }
335
Andy McFadden7cd58532013-02-19 07:28:30 -0800336 virtual status_t createInputSurface(
Lajos Molnar57fad3c2016-03-08 13:09:35 -0800337 node_id node, OMX_U32 port_index, android_dataspace dataSpace,
Lajos Molnar05421982015-05-15 20:39:14 -0700338 sp<IGraphicBufferProducer> *bufferProducer, MetadataBufferType *type) {
Andy McFadden7cd58532013-02-19 07:28:30 -0800339 Parcel data, reply;
340 status_t err;
341 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700342 data.writeInt32((int32_t)node);
Andy McFadden7cd58532013-02-19 07:28:30 -0800343 data.writeInt32(port_index);
Lajos Molnar57fad3c2016-03-08 13:09:35 -0800344 data.writeInt32(dataSpace);
Andy McFadden7cd58532013-02-19 07:28:30 -0800345 err = remote()->transact(CREATE_INPUT_SURFACE, data, &reply);
346 if (err != OK) {
347 ALOGW("binder transaction failed: %d", err);
348 return err;
349 }
350
Lajos Molnar05421982015-05-15 20:39:14 -0700351 // read type even if createInputSurface failed
352 int negotiatedType = reply.readInt32();
353 if (type != NULL) {
354 *type = (MetadataBufferType)negotiatedType;
355 }
356
Andy McFadden7cd58532013-02-19 07:28:30 -0800357 err = reply.readInt32();
358 if (err != OK) {
359 return err;
360 }
361
362 *bufferProducer = IGraphicBufferProducer::asInterface(
363 reply.readStrongBinder());
364
365 return err;
366 }
367
Chong Zhangd291c222015-04-30 18:15:52 -0700368 virtual status_t createPersistentInputSurface(
369 sp<IGraphicBufferProducer> *bufferProducer,
370 sp<IGraphicBufferConsumer> *bufferConsumer) {
371 Parcel data, reply;
372 status_t err;
373 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
374 err = remote()->transact(CREATE_PERSISTENT_INPUT_SURFACE, data, &reply);
375 if (err != OK) {
376 ALOGW("binder transaction failed: %d", err);
377 return err;
378 }
379
380 err = reply.readInt32();
381 if (err != OK) {
382 return err;
383 }
384
385 *bufferProducer = IGraphicBufferProducer::asInterface(
386 reply.readStrongBinder());
387 *bufferConsumer = IGraphicBufferConsumer::asInterface(
388 reply.readStrongBinder());
389
390 return err;
391 }
392
Chong Zhang8f469e12015-05-13 10:21:33 -0700393 virtual status_t setInputSurface(
Chong Zhangd291c222015-04-30 18:15:52 -0700394 node_id node, OMX_U32 port_index,
Lajos Molnar05421982015-05-15 20:39:14 -0700395 const sp<IGraphicBufferConsumer> &bufferConsumer, MetadataBufferType *type) {
Chong Zhangd291c222015-04-30 18:15:52 -0700396 Parcel data, reply;
397 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
398 status_t err;
399 data.writeInt32((int32_t)node);
400 data.writeInt32(port_index);
401 data.writeStrongBinder(IInterface::asBinder(bufferConsumer));
402
Chong Zhang8f469e12015-05-13 10:21:33 -0700403 err = remote()->transact(SET_INPUT_SURFACE, data, &reply);
Chong Zhangd291c222015-04-30 18:15:52 -0700404
405 if (err != OK) {
406 ALOGW("binder transaction failed: %d", err);
407 return err;
408 }
Lajos Molnar05421982015-05-15 20:39:14 -0700409
410 // read type even if setInputSurface failed
411 int negotiatedType = reply.readInt32();
412 if (type != NULL) {
413 *type = (MetadataBufferType)negotiatedType;
414 }
415
Chong Zhangd291c222015-04-30 18:15:52 -0700416 return reply.readInt32();
417 }
418
Andy McFadden7cd58532013-02-19 07:28:30 -0800419 virtual status_t signalEndOfInputStream(node_id node) {
420 Parcel data, reply;
421 status_t err;
422 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700423 data.writeInt32((int32_t)node);
Andy McFadden7cd58532013-02-19 07:28:30 -0800424 err = remote()->transact(SIGNAL_END_OF_INPUT_STREAM, data, &reply);
425 if (err != OK) {
426 ALOGW("binder transaction failed: %d", err);
427 return err;
428 }
429
430 return reply.readInt32();
431 }
432
James Donge8707722010-10-20 17:38:41 -0700433 virtual status_t storeMetaDataInBuffers(
Lajos Molnar05421982015-05-15 20:39:14 -0700434 node_id node, OMX_U32 port_index, OMX_BOOL enable, MetadataBufferType *type) {
James Donge8707722010-10-20 17:38:41 -0700435 Parcel data, reply;
436 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700437 data.writeInt32((int32_t)node);
James Donge8707722010-10-20 17:38:41 -0700438 data.writeInt32(port_index);
Lajos Molnar3e328782016-05-09 10:56:46 -0700439 data.writeInt32((int32_t)enable);
440 data.writeInt32(type == NULL ? kMetadataBufferTypeANWBuffer : *type);
441
James Donge8707722010-10-20 17:38:41 -0700442 remote()->transact(STORE_META_DATA_IN_BUFFERS, data, &reply);
443
Lajos Molnar05421982015-05-15 20:39:14 -0700444 // read type even storeMetaDataInBuffers failed
445 int negotiatedType = reply.readInt32();
446 if (type != NULL) {
447 *type = (MetadataBufferType)negotiatedType;
448 }
449
450 return reply.readInt32();
James Donge8707722010-10-20 17:38:41 -0700451 }
452
Lajos Molnar56ce7262013-05-02 16:30:48 -0700453 virtual status_t prepareForAdaptivePlayback(
454 node_id node, OMX_U32 port_index, OMX_BOOL enable,
455 OMX_U32 max_width, OMX_U32 max_height) {
456 Parcel data, reply;
457 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700458 data.writeInt32((int32_t)node);
Lajos Molnar56ce7262013-05-02 16:30:48 -0700459 data.writeInt32(port_index);
460 data.writeInt32((int32_t)enable);
461 data.writeInt32(max_width);
462 data.writeInt32(max_height);
463 remote()->transact(PREPARE_FOR_ADAPTIVE_PLAYBACK, data, &reply);
464
465 status_t err = reply.readInt32();
466 return err;
467 }
468
Rachad5a446aa2014-07-29 16:47:56 -0700469 virtual status_t configureVideoTunnelMode(
470 node_id node, OMX_U32 portIndex, OMX_BOOL tunneled,
471 OMX_U32 audioHwSync, native_handle_t **sidebandHandle ) {
472 Parcel data, reply;
473 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
474 data.writeInt32((int32_t)node);
475 data.writeInt32(portIndex);
476 data.writeInt32((int32_t)tunneled);
477 data.writeInt32(audioHwSync);
478 remote()->transact(CONFIGURE_VIDEO_TUNNEL_MODE, data, &reply);
479
480 status_t err = reply.readInt32();
mspector@google.com9d72eb02016-02-08 10:56:13 -0800481 if (err == OK && sidebandHandle) {
Rachad5a446aa2014-07-29 16:47:56 -0700482 *sidebandHandle = (native_handle_t *)reply.readNativeHandle();
483 }
484 return err;
485 }
486
487
Lajos Molnara63141a2016-02-11 16:40:36 -0800488 virtual status_t allocateSecureBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700489 node_id node, OMX_U32 port_index, size_t size,
Lajos Molnar1b40f282016-05-09 22:24:52 -0700490 buffer_id *buffer, void **buffer_data, sp<NativeHandle> *native_handle) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700491 Parcel data, reply;
492 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700493 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700494 data.writeInt32(port_index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800495 data.writeInt64(size);
Lajos Molnara63141a2016-02-11 16:40:36 -0800496 remote()->transact(ALLOC_SECURE_BUFFER, data, &reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700497
498 status_t err = reply.readInt32();
499 if (err != OK) {
500 *buffer = 0;
Lajos Molnara63141a2016-02-11 16:40:36 -0800501 *buffer_data = NULL;
502 *native_handle = NULL;
Andreas Huber20111aa2009-07-14 16:56:47 -0700503 return err;
504 }
505
Andy Hung609b8152014-05-02 11:05:04 -0700506 *buffer = (buffer_id)reply.readInt32();
507 *buffer_data = (void *)reply.readInt64();
Lajos Molnara63141a2016-02-11 16:40:36 -0800508 if (*buffer_data == NULL) {
Lajos Molnar1b40f282016-05-09 22:24:52 -0700509 *native_handle = NativeHandle::create(
510 reply.readNativeHandle(), true /* ownsHandle */);
Lajos Molnara63141a2016-02-11 16:40:36 -0800511 } else {
512 *native_handle = NULL;
513 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700514 return err;
515 }
516
Andreas Huber318ad9c2009-10-15 13:46:54 -0700517 virtual status_t allocateBufferWithBackup(
Andreas Huber20111aa2009-07-14 16:56:47 -0700518 node_id node, OMX_U32 port_index, const sp<IMemory> &params,
Lajos Molnarcc7cc672015-06-01 14:58:37 -0700519 buffer_id *buffer, OMX_U32 allottedSize) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700520 Parcel data, reply;
521 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700522 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700523 data.writeInt32(port_index);
Marco Nelissen06b46062014-11-14 07:58:25 -0800524 data.writeStrongBinder(IInterface::asBinder(params));
Lajos Molnarcc7cc672015-06-01 14:58:37 -0700525 data.writeInt32(allottedSize);
Andreas Huber20111aa2009-07-14 16:56:47 -0700526 remote()->transact(ALLOC_BUFFER_WITH_BACKUP, data, &reply);
527
528 status_t err = reply.readInt32();
529 if (err != OK) {
530 *buffer = 0;
531
532 return err;
533 }
534
Andy Hung609b8152014-05-02 11:05:04 -0700535 *buffer = (buffer_id)reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700536
537 return err;
538 }
539
Andreas Huber318ad9c2009-10-15 13:46:54 -0700540 virtual status_t freeBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700541 node_id node, OMX_U32 port_index, buffer_id buffer) {
542 Parcel data, reply;
543 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700544 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700545 data.writeInt32(port_index);
Andy Hung609b8152014-05-02 11:05:04 -0700546 data.writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700547 remote()->transact(FREE_BUFFER, data, &reply);
548
549 return reply.readInt32();
550 }
551
Lajos Molnar15ab4992015-06-01 10:54:31 -0700552 virtual status_t fillBuffer(node_id node, buffer_id buffer, int fenceFd) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700553 Parcel data, reply;
554 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700555 data.writeInt32((int32_t)node);
556 data.writeInt32((int32_t)buffer);
Lajos Molnar15ab4992015-06-01 10:54:31 -0700557 data.writeInt32(fenceFd >= 0);
558 if (fenceFd >= 0) {
559 data.writeFileDescriptor(fenceFd, true /* takeOwnership */);
560 }
Andreas Huber36efa032009-10-08 11:02:27 -0700561 remote()->transact(FILL_BUFFER, data, &reply);
562
563 return reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700564 }
565
Andreas Huber318ad9c2009-10-15 13:46:54 -0700566 virtual status_t emptyBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700567 node_id node,
568 buffer_id buffer,
569 OMX_U32 range_offset, OMX_U32 range_length,
Lajos Molnar15ab4992015-06-01 10:54:31 -0700570 OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700571 Parcel data, reply;
572 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700573 data.writeInt32((int32_t)node);
574 data.writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700575 data.writeInt32(range_offset);
576 data.writeInt32(range_length);
577 data.writeInt32(flags);
578 data.writeInt64(timestamp);
Lajos Molnar15ab4992015-06-01 10:54:31 -0700579 data.writeInt32(fenceFd >= 0);
580 if (fenceFd >= 0) {
581 data.writeFileDescriptor(fenceFd, true /* takeOwnership */);
582 }
Andreas Huber36efa032009-10-08 11:02:27 -0700583 remote()->transact(EMPTY_BUFFER, data, &reply);
584
585 return reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700586 }
Andreas Huber8b938cd2009-07-31 11:52:50 -0700587
Andreas Huber318ad9c2009-10-15 13:46:54 -0700588 virtual status_t getExtensionIndex(
Andreas Huber693d2712009-08-14 14:37:10 -0700589 node_id node,
590 const char *parameter_name,
591 OMX_INDEXTYPE *index) {
592 Parcel data, reply;
593 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700594 data.writeInt32((int32_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700595 data.writeCString(parameter_name);
596
597 remote()->transact(GET_EXTENSION_INDEX, data, &reply);
598
599 status_t err = reply.readInt32();
600 if (err == OK) {
601 *index = static_cast<OMX_INDEXTYPE>(reply.readInt32());
602 } else {
603 *index = OMX_IndexComponentStartUnused;
604 }
605
606 return err;
607 }
Andreas Hubere40cda72013-07-17 13:55:26 -0700608
609 virtual status_t setInternalOption(
610 node_id node,
611 OMX_U32 port_index,
612 InternalOptionType type,
613 const void *optionData,
614 size_t size) {
615 Parcel data, reply;
616 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700617 data.writeInt32((int32_t)node);
Andreas Hubere40cda72013-07-17 13:55:26 -0700618 data.writeInt32(port_index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800619 data.writeInt64(size);
Andreas Hubere40cda72013-07-17 13:55:26 -0700620 data.write(optionData, size);
621 data.writeInt32(type);
622 remote()->transact(SET_INTERNAL_OPTION, data, &reply);
623
624 return reply.readInt32();
625 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700626};
627
628IMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX");
629
630////////////////////////////////////////////////////////////////////////////////
631
Andy McFadden7cd58532013-02-19 07:28:30 -0800632#define CHECK_OMX_INTERFACE(interface, data, reply) \
Andreas Huber20111aa2009-07-14 16:56:47 -0700633 do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \
Steve Block5ff1dd52012-01-05 23:22:43 +0000634 ALOGW("Call incorrectly routed to " #interface); \
Andreas Huber20111aa2009-07-14 16:56:47 -0700635 return PERMISSION_DENIED; \
636 } } while (0)
637
638status_t BnOMX::onTransact(
639 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
640 switch (code) {
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800641 case LIVES_LOCALLY:
642 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800643 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andy Hung609b8152014-05-02 11:05:04 -0700644 node_id node = (node_id)data.readInt32();
Andreas Huberd459b482012-01-31 11:16:24 -0800645 pid_t pid = (pid_t)data.readInt32();
646 reply->writeInt32(livesLocally(node, pid));
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800647
648 return OK;
649 }
650
Andreas Huber20111aa2009-07-14 16:56:47 -0700651 case LIST_NODES:
652 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800653 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700654
Andreas Huber134ee6a2009-12-16 09:30:55 -0800655 List<ComponentInfo> list;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700656 listNodes(&list);
Andreas Huber20111aa2009-07-14 16:56:47 -0700657
658 reply->writeInt32(list.size());
Andreas Huber134ee6a2009-12-16 09:30:55 -0800659 for (List<ComponentInfo>::iterator it = list.begin();
Andreas Huber20111aa2009-07-14 16:56:47 -0700660 it != list.end(); ++it) {
Andreas Huber134ee6a2009-12-16 09:30:55 -0800661 ComponentInfo &cur = *it;
662
663 reply->writeString8(cur.mName);
664 reply->writeInt32(cur.mRoles.size());
665 for (List<String8>::iterator role_it = cur.mRoles.begin();
666 role_it != cur.mRoles.end(); ++role_it) {
667 reply->writeString8(*role_it);
668 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700669 }
670
671 return NO_ERROR;
672 }
673
674 case ALLOCATE_NODE:
675 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800676 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700677
Andreas Huber318ad9c2009-10-15 13:46:54 -0700678 const char *name = data.readCString();
679
680 sp<IOMXObserver> observer =
681 interface_cast<IOMXObserver>(data.readStrongBinder());
682
Wei Jia56c95c92016-01-06 10:30:46 -0800683 if (name == NULL || observer == NULL) {
684 ALOGE("b/26392700");
685 reply->writeInt32(INVALID_OPERATION);
686 return NO_ERROR;
687 }
688
Andreas Huber20111aa2009-07-14 16:56:47 -0700689 node_id node;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700690
Marco Nelissen23858872016-02-17 13:12:13 -0800691 status_t err = allocateNode(name, observer,
692 NULL /* nodeBinder */, &node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700693 reply->writeInt32(err);
694 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700695 reply->writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700696 }
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800697
Andreas Huber20111aa2009-07-14 16:56:47 -0700698 return NO_ERROR;
699 }
700
701 case FREE_NODE:
702 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800703 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700704
Andy Hung609b8152014-05-02 11:05:04 -0700705 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700706
Andreas Huber318ad9c2009-10-15 13:46:54 -0700707 reply->writeInt32(freeNode(node));
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800708
Andreas Huber20111aa2009-07-14 16:56:47 -0700709 return NO_ERROR;
710 }
711
712 case SEND_COMMAND:
713 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800714 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700715
Andy Hung609b8152014-05-02 11:05:04 -0700716 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700717
718 OMX_COMMANDTYPE cmd =
719 static_cast<OMX_COMMANDTYPE>(data.readInt32());
720
721 OMX_S32 param = data.readInt32();
Andreas Huber318ad9c2009-10-15 13:46:54 -0700722 reply->writeInt32(sendCommand(node, cmd, param));
Andreas Huber20111aa2009-07-14 16:56:47 -0700723
724 return NO_ERROR;
725 }
726
727 case GET_PARAMETER:
Andreas Huber20111aa2009-07-14 16:56:47 -0700728 case SET_PARAMETER:
Andreas Huber693d2712009-08-14 14:37:10 -0700729 case GET_CONFIG:
Andreas Huber693d2712009-08-14 14:37:10 -0700730 case SET_CONFIG:
Andreas Hubere40cda72013-07-17 13:55:26 -0700731 case SET_INTERNAL_OPTION:
Andreas Huber693d2712009-08-14 14:37:10 -0700732 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800733 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber693d2712009-08-14 14:37:10 -0700734
Andy Hung609b8152014-05-02 11:05:04 -0700735 node_id node = (node_id)data.readInt32();
Andreas Huber693d2712009-08-14 14:37:10 -0700736 OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
737
Glenn Kastene03dd222014-01-28 11:04:39 -0800738 size_t size = data.readInt64();
Andreas Huber693d2712009-08-14 14:37:10 -0700739
Marco Nelissen2720c8b2016-02-29 12:47:20 -0800740 status_t err = NOT_ENOUGH_DATA;
741 void *params = NULL;
742 size_t pageSize = 0;
743 size_t allocSize = 0;
Marco Nelissen788b0b62016-03-21 11:31:53 -0700744 bool isUsageBits = (index == (OMX_INDEXTYPE) OMX_IndexParamConsumerUsageBits);
745 if ((isUsageBits && size < 4) ||
746 (!isUsageBits && code != SET_INTERNAL_OPTION && size < 8)) {
Marco Nelissen2720c8b2016-02-29 12:47:20 -0800747 // we expect the structure to contain at least the size and
748 // version, 8 bytes total
Marco Nelissen788b0b62016-03-21 11:31:53 -0700749 ALOGE("b/27207275 (%zu) (%d/%d)", size, int(index), int(code));
Marco Nelissen2720c8b2016-02-29 12:47:20 -0800750 android_errorWriteLog(0x534e4554, "27207275");
751 } else {
752 err = NO_MEMORY;
753 pageSize = (size_t) sysconf(_SC_PAGE_SIZE);
754 if (size > SIZE_MAX - (pageSize * 2)) {
755 ALOGE("requested param size too big");
Marco Nelissenf7a38822016-02-22 13:05:15 -0800756 } else {
Marco Nelissen2720c8b2016-02-29 12:47:20 -0800757 allocSize = (size + pageSize * 2) & ~(pageSize - 1);
758 params = mmap(NULL, allocSize, PROT_READ | PROT_WRITE,
759 MAP_PRIVATE | MAP_ANONYMOUS, -1 /* fd */, 0 /* offset */);
760 }
761 if (params != MAP_FAILED) {
762 err = data.read(params, size);
763 if (err != OK) {
764 android_errorWriteLog(0x534e4554, "26914474");
765 } else {
766 err = NOT_ENOUGH_DATA;
767 OMX_U32 declaredSize = *(OMX_U32*)params;
Marco Nelissenc1c50e72016-03-10 15:02:13 -0800768 if (code != SET_INTERNAL_OPTION &&
769 index != (OMX_INDEXTYPE) OMX_IndexParamConsumerUsageBits &&
770 declaredSize > size) {
Marco Nelissen2720c8b2016-02-29 12:47:20 -0800771 // the buffer says it's bigger than it actually is
772 ALOGE("b/27207275 (%u/%zu)", declaredSize, size);
773 android_errorWriteLog(0x534e4554, "27207275");
774 } else {
775 // mark the last page as inaccessible, to avoid exploitation
776 // of codecs that access past the end of the allocation because
777 // they didn't check the size
Marco Nelissen866c8002016-09-20 13:36:40 -0700778 if (mprotect((char*)params + allocSize - pageSize, pageSize,
779 PROT_NONE) != 0) {
780 ALOGE("mprotect failed: %s", strerror(errno));
781 } else {
782 switch (code) {
783 case GET_PARAMETER:
784 err = getParameter(node, index, params, size);
785 break;
786 case SET_PARAMETER:
787 err = setParameter(node, index, params, size);
788 break;
789 case GET_CONFIG:
790 err = getConfig(node, index, params, size);
791 break;
792 case SET_CONFIG:
793 err = setConfig(node, index, params, size);
794 break;
795 case SET_INTERNAL_OPTION:
796 {
797 InternalOptionType type =
798 (InternalOptionType)data.readInt32();
Andreas Huberb3912902011-01-19 10:34:52 -0800799
Marco Nelissen866c8002016-09-20 13:36:40 -0700800 err = setInternalOption(node, index, type, params, size);
801 break;
802 }
803
804 default:
805 TRESPASS();
Marco Nelissen2720c8b2016-02-29 12:47:20 -0800806 }
Marco Nelissen2720c8b2016-02-29 12:47:20 -0800807 }
Marco Nelissenf7a38822016-02-22 13:05:15 -0800808 }
Marco Nelissenf7a38822016-02-22 13:05:15 -0800809 }
Marco Nelissen2720c8b2016-02-29 12:47:20 -0800810 } else {
811 ALOGE("couldn't map: %s", strerror(errno));
Andreas Hubere40cda72013-07-17 13:55:26 -0700812 }
Andreas Huberb3912902011-01-19 10:34:52 -0800813 }
814
815 reply->writeInt32(err);
816
817 if ((code == GET_PARAMETER || code == GET_CONFIG) && err == OK) {
818 reply->write(params, size);
819 }
820
Marco Nelissen2720c8b2016-02-29 12:47:20 -0800821 if (params) {
822 munmap(params, allocSize);
823 }
Andreas Huberb3912902011-01-19 10:34:52 -0800824 params = NULL;
Andreas Huber693d2712009-08-14 14:37:10 -0700825
826 return NO_ERROR;
827 }
828
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700829 case GET_STATE:
830 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800831 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700832
Andy Hung609b8152014-05-02 11:05:04 -0700833 node_id node = (node_id)data.readInt32();
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700834 OMX_STATETYPE state = OMX_StateInvalid;
835
836 status_t err = getState(node, &state);
837 reply->writeInt32(state);
838 reply->writeInt32(err);
839
840 return NO_ERROR;
841 }
842
Lajos Molnara63141a2016-02-11 16:40:36 -0800843 case ENABLE_NATIVE_BUFFERS:
Jamie Gennis83750ea2010-08-30 16:48:38 -0700844 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800845 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700846
Andy Hung609b8152014-05-02 11:05:04 -0700847 node_id node = (node_id)data.readInt32();
Jamie Gennis83750ea2010-08-30 16:48:38 -0700848 OMX_U32 port_index = data.readInt32();
Lajos Molnara63141a2016-02-11 16:40:36 -0800849 OMX_BOOL graphic = (OMX_BOOL)data.readInt32();
Jamie Gennis83750ea2010-08-30 16:48:38 -0700850 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
851
Lajos Molnara63141a2016-02-11 16:40:36 -0800852 status_t err = enableNativeBuffers(node, port_index, graphic, enable);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700853 reply->writeInt32(err);
854
855 return NO_ERROR;
856 }
857
Jamie Gennise2ce6452011-02-23 19:01:28 -0800858 case GET_GRAPHIC_BUFFER_USAGE:
859 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800860 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennise2ce6452011-02-23 19:01:28 -0800861
Andy Hung609b8152014-05-02 11:05:04 -0700862 node_id node = (node_id)data.readInt32();
Jamie Gennise2ce6452011-02-23 19:01:28 -0800863 OMX_U32 port_index = data.readInt32();
864
865 OMX_U32 usage = 0;
866 status_t err = getGraphicBufferUsage(node, port_index, &usage);
867 reply->writeInt32(err);
868 reply->writeInt32(usage);
869
870 return NO_ERROR;
871 }
872
Andreas Huber20111aa2009-07-14 16:56:47 -0700873 case USE_BUFFER:
874 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800875 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700876
Andy Hung609b8152014-05-02 11:05:04 -0700877 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700878 OMX_U32 port_index = data.readInt32();
879 sp<IMemory> params =
880 interface_cast<IMemory>(data.readStrongBinder());
Lajos Molnarcc7cc672015-06-01 14:58:37 -0700881 OMX_U32 allottedSize = data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700882
Wei Jia56c95c92016-01-06 10:30:46 -0800883 if (params == NULL) {
884 ALOGE("b/26392700");
885 reply->writeInt32(INVALID_OPERATION);
886 return NO_ERROR;
887 }
888
Andreas Huber20111aa2009-07-14 16:56:47 -0700889 buffer_id buffer;
Lajos Molnarcc7cc672015-06-01 14:58:37 -0700890 status_t err = useBuffer(node, port_index, params, &buffer, allottedSize);
Andreas Huber20111aa2009-07-14 16:56:47 -0700891 reply->writeInt32(err);
892
893 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700894 reply->writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700895 }
896
897 return NO_ERROR;
898 }
899
Jamie Gennis83750ea2010-08-30 16:48:38 -0700900 case USE_GRAPHIC_BUFFER:
901 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800902 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700903
Andy Hung609b8152014-05-02 11:05:04 -0700904 node_id node = (node_id)data.readInt32();
Jamie Gennis83750ea2010-08-30 16:48:38 -0700905 OMX_U32 port_index = data.readInt32();
906 sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
907 data.read(*graphicBuffer);
908
909 buffer_id buffer;
910 status_t err = useGraphicBuffer(
911 node, port_index, graphicBuffer, &buffer);
912 reply->writeInt32(err);
913
914 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700915 reply->writeInt32((int32_t)buffer);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700916 }
917
918 return NO_ERROR;
919 }
920
Lajos Molnard0715862013-07-22 12:57:43 -0700921 case UPDATE_GRAPHIC_BUFFER_IN_META:
922 {
923 CHECK_OMX_INTERFACE(IOMX, data, reply);
924
Andy Hung609b8152014-05-02 11:05:04 -0700925 node_id node = (node_id)data.readInt32();
Lajos Molnard0715862013-07-22 12:57:43 -0700926 OMX_U32 port_index = data.readInt32();
927 sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
928 data.read(*graphicBuffer);
Andy Hung609b8152014-05-02 11:05:04 -0700929 buffer_id buffer = (buffer_id)data.readInt32();
Lajos Molnard0715862013-07-22 12:57:43 -0700930
931 status_t err = updateGraphicBufferInMeta(
932 node, port_index, graphicBuffer, buffer);
933 reply->writeInt32(err);
934
935 return NO_ERROR;
936 }
937
Lajos Molnar7e0bef82016-05-09 10:48:30 -0700938 case UPDATE_NATIVE_HANDLE_IN_META:
939 {
940 CHECK_OMX_INTERFACE(IOMX, data, reply);
941
942 node_id node = (node_id)data.readInt32();
943 OMX_U32 port_index = data.readInt32();
944 native_handle *handle = NULL;
945 if (data.readInt32()) {
946 handle = data.readNativeHandle();
947 }
948 buffer_id buffer = (buffer_id)data.readInt32();
949
950 status_t err = updateNativeHandleInMeta(
951 node, port_index, NativeHandle::create(handle, true /* ownshandle */), buffer);
952 reply->writeInt32(err);
953
954 return NO_ERROR;
955 }
956
Andy McFadden7cd58532013-02-19 07:28:30 -0800957 case CREATE_INPUT_SURFACE:
958 {
959 CHECK_OMX_INTERFACE(IOMX, data, reply);
960
Andy Hung609b8152014-05-02 11:05:04 -0700961 node_id node = (node_id)data.readInt32();
Andy McFadden7cd58532013-02-19 07:28:30 -0800962 OMX_U32 port_index = data.readInt32();
Lajos Molnar57fad3c2016-03-08 13:09:35 -0800963 android_dataspace dataSpace = (android_dataspace)data.readInt32();
Andy McFadden7cd58532013-02-19 07:28:30 -0800964
965 sp<IGraphicBufferProducer> bufferProducer;
mspector@google.comda9ca912016-02-08 17:07:06 -0800966 MetadataBufferType type = kMetadataBufferTypeInvalid;
Lajos Molnar57fad3c2016-03-08 13:09:35 -0800967 status_t err = createInputSurface(node, port_index, dataSpace, &bufferProducer, &type);
Andy McFadden7cd58532013-02-19 07:28:30 -0800968
mspector@google.comda9ca912016-02-08 17:07:06 -0800969 if ((err != OK) && (type == kMetadataBufferTypeInvalid)) {
970 android_errorWriteLog(0x534e4554, "26324358");
971 }
972
Lajos Molnar05421982015-05-15 20:39:14 -0700973 reply->writeInt32(type);
Andy McFadden7cd58532013-02-19 07:28:30 -0800974 reply->writeInt32(err);
975
976 if (err == OK) {
Marco Nelissen06b46062014-11-14 07:58:25 -0800977 reply->writeStrongBinder(IInterface::asBinder(bufferProducer));
Andy McFadden7cd58532013-02-19 07:28:30 -0800978 }
979
980 return NO_ERROR;
981 }
982
Chong Zhangd291c222015-04-30 18:15:52 -0700983 case CREATE_PERSISTENT_INPUT_SURFACE:
984 {
985 CHECK_OMX_INTERFACE(IOMX, data, reply);
986
987 sp<IGraphicBufferProducer> bufferProducer;
988 sp<IGraphicBufferConsumer> bufferConsumer;
989 status_t err = createPersistentInputSurface(
990 &bufferProducer, &bufferConsumer);
991
992 reply->writeInt32(err);
993
994 if (err == OK) {
995 reply->writeStrongBinder(IInterface::asBinder(bufferProducer));
996 reply->writeStrongBinder(IInterface::asBinder(bufferConsumer));
997 }
998
999 return NO_ERROR;
1000 }
1001
Chong Zhang8f469e12015-05-13 10:21:33 -07001002 case SET_INPUT_SURFACE:
Chong Zhangd291c222015-04-30 18:15:52 -07001003 {
1004 CHECK_OMX_INTERFACE(IOMX, data, reply);
1005
1006 node_id node = (node_id)data.readInt32();
1007 OMX_U32 port_index = data.readInt32();
1008
1009 sp<IGraphicBufferConsumer> bufferConsumer =
1010 interface_cast<IGraphicBufferConsumer>(data.readStrongBinder());
1011
Wei Jia56c95c92016-01-06 10:30:46 -08001012 MetadataBufferType type = kMetadataBufferTypeInvalid;
Chong Zhangd291c222015-04-30 18:15:52 -07001013
Wei Jia56c95c92016-01-06 10:30:46 -08001014 status_t err = INVALID_OPERATION;
1015 if (bufferConsumer == NULL) {
1016 ALOGE("b/26392700");
1017 } else {
1018 err = setInputSurface(node, port_index, bufferConsumer, &type);
mspector@google.comc3ed9d02016-02-18 19:52:08 -08001019
1020 if ((err != OK) && (type == kMetadataBufferTypeInvalid)) {
1021 android_errorWriteLog(0x534e4554, "26324358");
1022 }
Wei Jia56c95c92016-01-06 10:30:46 -08001023 }
Chong Zhangd291c222015-04-30 18:15:52 -07001024
Lajos Molnar05421982015-05-15 20:39:14 -07001025 reply->writeInt32(type);
Chong Zhangd291c222015-04-30 18:15:52 -07001026 reply->writeInt32(err);
1027 return NO_ERROR;
1028 }
1029
Andy McFadden7cd58532013-02-19 07:28:30 -08001030 case SIGNAL_END_OF_INPUT_STREAM:
1031 {
1032 CHECK_OMX_INTERFACE(IOMX, data, reply);
1033
Andy Hung609b8152014-05-02 11:05:04 -07001034 node_id node = (node_id)data.readInt32();
Andy McFadden7cd58532013-02-19 07:28:30 -08001035
1036 status_t err = signalEndOfInputStream(node);
1037 reply->writeInt32(err);
1038
1039 return NO_ERROR;
1040 }
1041
James Donge8707722010-10-20 17:38:41 -07001042 case STORE_META_DATA_IN_BUFFERS:
1043 {
Andy McFadden7cd58532013-02-19 07:28:30 -08001044 CHECK_OMX_INTERFACE(IOMX, data, reply);
James Donge8707722010-10-20 17:38:41 -07001045
Andy Hung609b8152014-05-02 11:05:04 -07001046 node_id node = (node_id)data.readInt32();
James Donge8707722010-10-20 17:38:41 -07001047 OMX_U32 port_index = data.readInt32();
1048 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
1049
Lajos Molnar3e328782016-05-09 10:56:46 -07001050 MetadataBufferType type = (MetadataBufferType)data.readInt32();
Lajos Molnar05421982015-05-15 20:39:14 -07001051 status_t err = storeMetaDataInBuffers(node, port_index, enable, &type);
mspector@google.comda9ca912016-02-08 17:07:06 -08001052
Lajos Molnar05421982015-05-15 20:39:14 -07001053 reply->writeInt32(type);
James Donge8707722010-10-20 17:38:41 -07001054 reply->writeInt32(err);
1055
1056 return NO_ERROR;
1057 }
1058
Lajos Molnar56ce7262013-05-02 16:30:48 -07001059 case PREPARE_FOR_ADAPTIVE_PLAYBACK:
1060 {
1061 CHECK_OMX_INTERFACE(IOMX, data, reply);
1062
Andy Hung609b8152014-05-02 11:05:04 -07001063 node_id node = (node_id)data.readInt32();
Lajos Molnar56ce7262013-05-02 16:30:48 -07001064 OMX_U32 port_index = data.readInt32();
1065 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
1066 OMX_U32 max_width = data.readInt32();
1067 OMX_U32 max_height = data.readInt32();
1068
1069 status_t err = prepareForAdaptivePlayback(
1070 node, port_index, enable, max_width, max_height);
1071 reply->writeInt32(err);
1072
1073 return NO_ERROR;
1074 }
1075
Rachad5a446aa2014-07-29 16:47:56 -07001076 case CONFIGURE_VIDEO_TUNNEL_MODE:
1077 {
1078 CHECK_OMX_INTERFACE(IOMX, data, reply);
1079
1080 node_id node = (node_id)data.readInt32();
1081 OMX_U32 port_index = data.readInt32();
1082 OMX_BOOL tunneled = (OMX_BOOL)data.readInt32();
1083 OMX_U32 audio_hw_sync = data.readInt32();
1084
Lajos Molnara63141a2016-02-11 16:40:36 -08001085 native_handle_t *sideband_handle = NULL;
Rachad5a446aa2014-07-29 16:47:56 -07001086 status_t err = configureVideoTunnelMode(
1087 node, port_index, tunneled, audio_hw_sync, &sideband_handle);
1088 reply->writeInt32(err);
mspector@google.com9d72eb02016-02-08 10:56:13 -08001089 if(err == OK){
1090 reply->writeNativeHandle(sideband_handle);
1091 }
Rachad5a446aa2014-07-29 16:47:56 -07001092
1093 return NO_ERROR;
1094 }
1095
Lajos Molnara63141a2016-02-11 16:40:36 -08001096 case ALLOC_SECURE_BUFFER:
Andreas Huber20111aa2009-07-14 16:56:47 -07001097 {
Andy McFadden7cd58532013-02-19 07:28:30 -08001098 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -07001099
Andy Hung609b8152014-05-02 11:05:04 -07001100 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -07001101 OMX_U32 port_index = data.readInt32();
Wei Jia8dde7262015-09-28 11:32:23 -07001102 if (!isSecure(node) || port_index != 0 /* kPortIndexInput */) {
1103 ALOGE("b/24310423");
1104 reply->writeInt32(INVALID_OPERATION);
1105 return NO_ERROR;
1106 }
1107
Glenn Kastene03dd222014-01-28 11:04:39 -08001108 size_t size = data.readInt64();
Andreas Huber20111aa2009-07-14 16:56:47 -07001109
1110 buffer_id buffer;
Lajos Molnara63141a2016-02-11 16:40:36 -08001111 void *buffer_data = NULL;
Lajos Molnar1b40f282016-05-09 22:24:52 -07001112 sp<NativeHandle> native_handle;
Lajos Molnara63141a2016-02-11 16:40:36 -08001113 status_t err = allocateSecureBuffer(
1114 node, port_index, size, &buffer, &buffer_data, &native_handle);
Andreas Huber20111aa2009-07-14 16:56:47 -07001115 reply->writeInt32(err);
1116
1117 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -07001118 reply->writeInt32((int32_t)buffer);
1119 reply->writeInt64((uintptr_t)buffer_data);
Lajos Molnara63141a2016-02-11 16:40:36 -08001120 if (buffer_data == NULL) {
Lajos Molnar1b40f282016-05-09 22:24:52 -07001121 reply->writeNativeHandle(native_handle == NULL ? NULL : native_handle->handle());
Lajos Molnara63141a2016-02-11 16:40:36 -08001122 }
Andreas Huber20111aa2009-07-14 16:56:47 -07001123 }
1124
1125 return NO_ERROR;
1126 }
1127
1128 case ALLOC_BUFFER_WITH_BACKUP:
1129 {
Andy McFadden7cd58532013-02-19 07:28:30 -08001130 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -07001131
Andy Hung609b8152014-05-02 11:05:04 -07001132 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -07001133 OMX_U32 port_index = data.readInt32();
1134 sp<IMemory> params =
1135 interface_cast<IMemory>(data.readStrongBinder());
Lajos Molnarcc7cc672015-06-01 14:58:37 -07001136 OMX_U32 allottedSize = data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -07001137
Wei Jia56c95c92016-01-06 10:30:46 -08001138 if (params == NULL) {
1139 ALOGE("b/26392700");
1140 reply->writeInt32(INVALID_OPERATION);
1141 return NO_ERROR;
1142 }
1143
Andreas Huber20111aa2009-07-14 16:56:47 -07001144 buffer_id buffer;
Andreas Huber318ad9c2009-10-15 13:46:54 -07001145 status_t err = allocateBufferWithBackup(
Lajos Molnarcc7cc672015-06-01 14:58:37 -07001146 node, port_index, params, &buffer, allottedSize);
Andreas Huber20111aa2009-07-14 16:56:47 -07001147
1148 reply->writeInt32(err);
1149
1150 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -07001151 reply->writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -07001152 }
1153
1154 return NO_ERROR;
1155 }
1156
1157 case FREE_BUFFER:
1158 {
Andy McFadden7cd58532013-02-19 07:28:30 -08001159 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -07001160
Andy Hung609b8152014-05-02 11:05:04 -07001161 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -07001162 OMX_U32 port_index = data.readInt32();
Andy Hung609b8152014-05-02 11:05:04 -07001163 buffer_id buffer = (buffer_id)data.readInt32();
Andreas Huber318ad9c2009-10-15 13:46:54 -07001164 reply->writeInt32(freeBuffer(node, port_index, buffer));
Andreas Huber20111aa2009-07-14 16:56:47 -07001165
1166 return NO_ERROR;
1167 }
1168
1169 case FILL_BUFFER:
1170 {
Andy McFadden7cd58532013-02-19 07:28:30 -08001171 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -07001172
Andy Hung609b8152014-05-02 11:05:04 -07001173 node_id node = (node_id)data.readInt32();
1174 buffer_id buffer = (buffer_id)data.readInt32();
Lajos Molnar15ab4992015-06-01 10:54:31 -07001175 bool haveFence = data.readInt32();
1176 int fenceFd = haveFence ? ::dup(data.readFileDescriptor()) : -1;
1177 reply->writeInt32(fillBuffer(node, buffer, fenceFd));
Andreas Huber20111aa2009-07-14 16:56:47 -07001178
1179 return NO_ERROR;
1180 }
1181
1182 case EMPTY_BUFFER:
1183 {
Andy McFadden7cd58532013-02-19 07:28:30 -08001184 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -07001185
Andy Hung609b8152014-05-02 11:05:04 -07001186 node_id node = (node_id)data.readInt32();
1187 buffer_id buffer = (buffer_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -07001188 OMX_U32 range_offset = data.readInt32();
1189 OMX_U32 range_length = data.readInt32();
1190 OMX_U32 flags = data.readInt32();
1191 OMX_TICKS timestamp = data.readInt64();
Lajos Molnar15ab4992015-06-01 10:54:31 -07001192 bool haveFence = data.readInt32();
1193 int fenceFd = haveFence ? ::dup(data.readFileDescriptor()) : -1;
1194 reply->writeInt32(emptyBuffer(
1195 node, buffer, range_offset, range_length, flags, timestamp, fenceFd));
Andreas Huber20111aa2009-07-14 16:56:47 -07001196
1197 return NO_ERROR;
1198 }
Andreas Huber20111aa2009-07-14 16:56:47 -07001199
Andreas Huber693d2712009-08-14 14:37:10 -07001200 case GET_EXTENSION_INDEX:
1201 {
Andy McFadden7cd58532013-02-19 07:28:30 -08001202 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber693d2712009-08-14 14:37:10 -07001203
Andy Hung609b8152014-05-02 11:05:04 -07001204 node_id node = (node_id)data.readInt32();
Andreas Huber693d2712009-08-14 14:37:10 -07001205 const char *parameter_name = data.readCString();
Andreas Huber7eaa9c92010-01-15 15:28:19 -08001206
Wei Jia56c95c92016-01-06 10:30:46 -08001207 if (parameter_name == NULL) {
1208 ALOGE("b/26392700");
1209 reply->writeInt32(INVALID_OPERATION);
1210 return NO_ERROR;
1211 }
1212
Andreas Huber693d2712009-08-14 14:37:10 -07001213 OMX_INDEXTYPE index;
Andreas Huber318ad9c2009-10-15 13:46:54 -07001214 status_t err = getExtensionIndex(node, parameter_name, &index);
Andreas Huber693d2712009-08-14 14:37:10 -07001215
1216 reply->writeInt32(err);
1217
1218 if (err == OK) {
1219 reply->writeInt32(index);
1220 }
1221
1222 return OK;
1223 }
1224
Andreas Huber20111aa2009-07-14 16:56:47 -07001225 default:
1226 return BBinder::onTransact(code, data, reply, flags);
1227 }
1228}
1229
1230////////////////////////////////////////////////////////////////////////////////
1231
1232class BpOMXObserver : public BpInterface<IOMXObserver> {
1233public:
1234 BpOMXObserver(const sp<IBinder> &impl)
1235 : BpInterface<IOMXObserver>(impl) {
1236 }
1237
Lajos Molnar26a48f32015-06-04 10:30:02 -07001238 virtual void onMessages(const std::list<omx_message> &messages) {
Andreas Huber20111aa2009-07-14 16:56:47 -07001239 Parcel data, reply;
Lajos Molnar26a48f32015-06-04 10:30:02 -07001240 std::list<omx_message>::const_iterator it = messages.cbegin();
1241 bool first = true;
1242 while (it != messages.cend()) {
1243 const omx_message &msg = *it++;
1244 if (first) {
1245 data.writeInterfaceToken(IOMXObserver::getInterfaceDescriptor());
1246 data.writeInt32(msg.node);
1247 first = false;
1248 }
1249 data.writeInt32(msg.fenceFd >= 0);
1250 if (msg.fenceFd >= 0) {
1251 data.writeFileDescriptor(msg.fenceFd, true /* takeOwnership */);
1252 }
1253 data.writeInt32(msg.type);
1254 data.write(&msg.u, sizeof(msg.u));
1255 ALOGV("onMessage writing message %d, size %zu", msg.type, sizeof(msg));
Lajos Molnar15ab4992015-06-01 10:54:31 -07001256 }
Lajos Molnar26a48f32015-06-04 10:30:02 -07001257 if (!first) {
1258 data.writeInt32(-1); // mark end
1259 remote()->transact(OBSERVER_ON_MSG, data, &reply, IBinder::FLAG_ONEWAY);
1260 }
Andreas Huber20111aa2009-07-14 16:56:47 -07001261 }
1262};
1263
1264IMPLEMENT_META_INTERFACE(OMXObserver, "android.hardware.IOMXObserver");
1265
1266status_t BnOMXObserver::onTransact(
1267 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
1268 switch (code) {
1269 case OBSERVER_ON_MSG:
1270 {
Andy McFadden7cd58532013-02-19 07:28:30 -08001271 CHECK_OMX_INTERFACE(IOMXObserver, data, reply);
Lajos Molnar26a48f32015-06-04 10:30:02 -07001272 IOMX::node_id node = data.readInt32();
1273 std::list<omx_message> messages;
1274 status_t err = FAILED_TRANSACTION; // must receive at least one message
1275 do {
1276 int haveFence = data.readInt32();
1277 if (haveFence < 0) { // we use -1 to mark end of messages
1278 break;
1279 }
1280 omx_message msg;
1281 msg.node = node;
1282 msg.fenceFd = haveFence ? ::dup(data.readFileDescriptor()) : -1;
1283 msg.type = (typeof(msg.type))data.readInt32();
1284 err = data.read(&msg.u, sizeof(msg.u));
1285 ALOGV("onTransact reading message %d, size %zu", msg.type, sizeof(msg));
1286 messages.push_back(msg);
1287 } while (err == OK);
Andreas Huber20111aa2009-07-14 16:56:47 -07001288
Lajos Molnar26a48f32015-06-04 10:30:02 -07001289 if (err == OK) {
1290 onMessages(messages);
Lajos Molnar15ab4992015-06-01 10:54:31 -07001291 }
Andreas Huber20111aa2009-07-14 16:56:47 -07001292
Lajos Molnar26a48f32015-06-04 10:30:02 -07001293 return err;
Andreas Huber20111aa2009-07-14 16:56:47 -07001294 }
1295
1296 default:
1297 return BBinder::onTransact(code, data, reply, flags);
1298 }
1299}
1300
Andreas Huber20111aa2009-07-14 16:56:47 -07001301} // namespace android