blob: b9ee91a7026fd106380eaee1df06e54d5b767398 [file] [log] [blame]
James Dong27c17442011-03-17 11:02:04 -07001/*
2 * Copyright (c) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Andreas Huber20111aa2009-07-14 16:56:47 -070017//#define LOG_NDEBUG 0
18#define LOG_TAG "IOMX"
19#include <utils/Log.h>
20
21#include <binder/IMemory.h>
22#include <binder/Parcel.h>
23#include <media/IOMX.h>
Andreas Huberb3912902011-01-19 10:34:52 -080024#include <media/stagefright/foundation/ADebug.h>
Andreas Huber20111aa2009-07-14 16:56:47 -070025
26namespace android {
27
28enum {
29 CONNECT = IBinder::FIRST_CALL_TRANSACTION,
Andreas Huber7eaa9c92010-01-15 15:28:19 -080030 LIVES_LOCALLY,
Andreas Huber20111aa2009-07-14 16:56:47 -070031 LIST_NODES,
32 ALLOCATE_NODE,
33 FREE_NODE,
34 SEND_COMMAND,
35 GET_PARAMETER,
36 SET_PARAMETER,
Andreas Huber693d2712009-08-14 14:37:10 -070037 GET_CONFIG,
38 SET_CONFIG,
Jamie Gennisb1d666f2011-10-19 21:14:13 -070039 GET_STATE,
Lajos Molnara63141a2016-02-11 16:40:36 -080040 ENABLE_NATIVE_BUFFERS,
Andreas Huber20111aa2009-07-14 16:56:47 -070041 USE_BUFFER,
Jamie Gennis83750ea2010-08-30 16:48:38 -070042 USE_GRAPHIC_BUFFER,
Andy McFadden7cd58532013-02-19 07:28:30 -080043 CREATE_INPUT_SURFACE,
Chong Zhangd291c222015-04-30 18:15:52 -070044 CREATE_PERSISTENT_INPUT_SURFACE,
Chong Zhang8f469e12015-05-13 10:21:33 -070045 SET_INPUT_SURFACE,
Andy McFadden7cd58532013-02-19 07:28:30 -080046 SIGNAL_END_OF_INPUT_STREAM,
James Donge8707722010-10-20 17:38:41 -070047 STORE_META_DATA_IN_BUFFERS,
Lajos Molnar56ce7262013-05-02 16:30:48 -070048 PREPARE_FOR_ADAPTIVE_PLAYBACK,
Lajos Molnara63141a2016-02-11 16:40:36 -080049 ALLOC_SECURE_BUFFER,
Andreas Huber20111aa2009-07-14 16:56:47 -070050 ALLOC_BUFFER_WITH_BACKUP,
51 FREE_BUFFER,
Andreas Huber20111aa2009-07-14 16:56:47 -070052 FILL_BUFFER,
53 EMPTY_BUFFER,
Andreas Huber693d2712009-08-14 14:37:10 -070054 GET_EXTENSION_INDEX,
Andreas Huber20111aa2009-07-14 16:56:47 -070055 OBSERVER_ON_MSG,
Jamie Gennise2ce6452011-02-23 19:01:28 -080056 GET_GRAPHIC_BUFFER_USAGE,
Andreas Hubere40cda72013-07-17 13:55:26 -070057 SET_INTERNAL_OPTION,
Lajos Molnard0715862013-07-22 12:57:43 -070058 UPDATE_GRAPHIC_BUFFER_IN_META,
Rachad5a446aa2014-07-29 16:47:56 -070059 CONFIGURE_VIDEO_TUNNEL_MODE,
Andreas Huber20111aa2009-07-14 16:56:47 -070060};
61
Andreas Huber20111aa2009-07-14 16:56:47 -070062class BpOMX : public BpInterface<IOMX> {
63public:
64 BpOMX(const sp<IBinder> &impl)
65 : BpInterface<IOMX>(impl) {
66 }
67
Andreas Huberd459b482012-01-31 11:16:24 -080068 virtual bool livesLocally(node_id node, pid_t pid) {
Andreas Huber7eaa9c92010-01-15 15:28:19 -080069 Parcel data, reply;
70 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -070071 data.writeInt32((int32_t)node);
Andreas Huber7eaa9c92010-01-15 15:28:19 -080072 data.writeInt32(pid);
73 remote()->transact(LIVES_LOCALLY, data, &reply);
74
75 return reply.readInt32() != 0;
76 }
77
Andreas Huber134ee6a2009-12-16 09:30:55 -080078 virtual status_t listNodes(List<ComponentInfo> *list) {
Andreas Huber20111aa2009-07-14 16:56:47 -070079 list->clear();
80
81 Parcel data, reply;
82 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
83 remote()->transact(LIST_NODES, data, &reply);
84
85 int32_t n = reply.readInt32();
86 for (int32_t i = 0; i < n; ++i) {
Andreas Huber134ee6a2009-12-16 09:30:55 -080087 list->push_back(ComponentInfo());
88 ComponentInfo &info = *--list->end();
Andreas Huber20111aa2009-07-14 16:56:47 -070089
Andreas Huber134ee6a2009-12-16 09:30:55 -080090 info.mName = reply.readString8();
91 int32_t numRoles = reply.readInt32();
92 for (int32_t j = 0; j < numRoles; ++j) {
93 info.mRoles.push_back(reply.readString8());
94 }
Andreas Huber20111aa2009-07-14 16:56:47 -070095 }
96
97 return OK;
98 }
99
Andreas Huber318ad9c2009-10-15 13:46:54 -0700100 virtual status_t allocateNode(
Marco Nelissen23858872016-02-17 13:12:13 -0800101 const char *name, const sp<IOMXObserver> &observer,
102 sp<IBinder> *nodeBinder,
103 node_id *node) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700104 Parcel data, reply;
105 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
106 data.writeCString(name);
Marco Nelissen06b46062014-11-14 07:58:25 -0800107 data.writeStrongBinder(IInterface::asBinder(observer));
Andreas Huber20111aa2009-07-14 16:56:47 -0700108 remote()->transact(ALLOCATE_NODE, data, &reply);
109
110 status_t err = reply.readInt32();
111 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700112 *node = (node_id)reply.readInt32();
Marco Nelissen23858872016-02-17 13:12:13 -0800113 if (nodeBinder != NULL) {
114 *nodeBinder = remote();
115 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700116 } else {
117 *node = 0;
118 }
119
120 return err;
121 }
122
Andreas Huber318ad9c2009-10-15 13:46:54 -0700123 virtual status_t freeNode(node_id node) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700124 Parcel data, reply;
125 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700126 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700127 remote()->transact(FREE_NODE, data, &reply);
128
129 return reply.readInt32();
130 }
131
Andreas Huber318ad9c2009-10-15 13:46:54 -0700132 virtual status_t sendCommand(
Andreas Huber20111aa2009-07-14 16:56:47 -0700133 node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) {
134 Parcel data, reply;
135 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700136 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700137 data.writeInt32(cmd);
138 data.writeInt32(param);
139 remote()->transact(SEND_COMMAND, data, &reply);
140
141 return reply.readInt32();
142 }
143
Andreas Huber318ad9c2009-10-15 13:46:54 -0700144 virtual status_t getParameter(
Andreas Huber20111aa2009-07-14 16:56:47 -0700145 node_id node, OMX_INDEXTYPE index,
146 void *params, size_t size) {
147 Parcel data, reply;
148 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700149 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700150 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800151 data.writeInt64(size);
Andreas Huber20111aa2009-07-14 16:56:47 -0700152 data.write(params, size);
153 remote()->transact(GET_PARAMETER, data, &reply);
154
155 status_t err = reply.readInt32();
156 if (err != OK) {
157 return err;
158 }
159
160 reply.read(params, size);
161
162 return OK;
163 }
164
Andreas Huber318ad9c2009-10-15 13:46:54 -0700165 virtual status_t setParameter(
Andreas Huber20111aa2009-07-14 16:56:47 -0700166 node_id node, OMX_INDEXTYPE index,
167 const void *params, size_t size) {
168 Parcel data, reply;
169 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700170 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700171 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800172 data.writeInt64(size);
Andreas Huber20111aa2009-07-14 16:56:47 -0700173 data.write(params, size);
174 remote()->transact(SET_PARAMETER, data, &reply);
175
176 return reply.readInt32();
177 }
178
Andreas Huber318ad9c2009-10-15 13:46:54 -0700179 virtual status_t getConfig(
Andreas Huber693d2712009-08-14 14:37:10 -0700180 node_id node, OMX_INDEXTYPE index,
181 void *params, size_t size) {
182 Parcel data, reply;
183 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700184 data.writeInt32((int32_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700185 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800186 data.writeInt64(size);
Andreas Huber693d2712009-08-14 14:37:10 -0700187 data.write(params, size);
188 remote()->transact(GET_CONFIG, data, &reply);
189
190 status_t err = reply.readInt32();
191 if (err != OK) {
192 return err;
193 }
194
195 reply.read(params, size);
196
197 return OK;
198 }
199
Andreas Huber318ad9c2009-10-15 13:46:54 -0700200 virtual status_t setConfig(
Andreas Huber693d2712009-08-14 14:37:10 -0700201 node_id node, OMX_INDEXTYPE index,
202 const void *params, size_t size) {
203 Parcel data, reply;
204 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700205 data.writeInt32((int32_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700206 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800207 data.writeInt64(size);
Andreas Huber693d2712009-08-14 14:37:10 -0700208 data.write(params, size);
209 remote()->transact(SET_CONFIG, data, &reply);
210
211 return reply.readInt32();
212 }
213
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700214 virtual status_t getState(
215 node_id node, OMX_STATETYPE* state) {
216 Parcel data, reply;
217 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700218 data.writeInt32((int32_t)node);
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700219 remote()->transact(GET_STATE, data, &reply);
220
221 *state = static_cast<OMX_STATETYPE>(reply.readInt32());
222 return reply.readInt32();
223 }
224
Lajos Molnara63141a2016-02-11 16:40:36 -0800225 virtual status_t enableNativeBuffers(
226 node_id node, OMX_U32 port_index, OMX_BOOL graphic, OMX_BOOL enable) {
Jamie Gennis83750ea2010-08-30 16:48:38 -0700227 Parcel data, reply;
228 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700229 data.writeInt32((int32_t)node);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700230 data.writeInt32(port_index);
Lajos Molnara63141a2016-02-11 16:40:36 -0800231 data.writeInt32((uint32_t)graphic);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700232 data.writeInt32((uint32_t)enable);
Lajos Molnara63141a2016-02-11 16:40:36 -0800233 remote()->transact(ENABLE_NATIVE_BUFFERS, data, &reply);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700234
235 status_t err = reply.readInt32();
236 return err;
237 }
238
Jamie Gennise2ce6452011-02-23 19:01:28 -0800239 virtual status_t getGraphicBufferUsage(
240 node_id node, OMX_U32 port_index, OMX_U32* usage) {
241 Parcel data, reply;
242 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700243 data.writeInt32((int32_t)node);
Jamie Gennise2ce6452011-02-23 19:01:28 -0800244 data.writeInt32(port_index);
245 remote()->transact(GET_GRAPHIC_BUFFER_USAGE, data, &reply);
246
247 status_t err = reply.readInt32();
248 *usage = reply.readInt32();
249 return err;
250 }
251
Andreas Huber318ad9c2009-10-15 13:46:54 -0700252 virtual status_t useBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700253 node_id node, OMX_U32 port_index, const sp<IMemory> &params,
Lajos Molnarcc7cc672015-06-01 14:58:37 -0700254 buffer_id *buffer, OMX_U32 allottedSize) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700255 Parcel data, reply;
256 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700257 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700258 data.writeInt32(port_index);
Marco Nelissen06b46062014-11-14 07:58:25 -0800259 data.writeStrongBinder(IInterface::asBinder(params));
Lajos Molnarcc7cc672015-06-01 14:58:37 -0700260 data.writeInt32(allottedSize);
Andreas Huber20111aa2009-07-14 16:56:47 -0700261 remote()->transact(USE_BUFFER, data, &reply);
262
263 status_t err = reply.readInt32();
264 if (err != OK) {
265 *buffer = 0;
266
267 return err;
268 }
269
Andy Hung609b8152014-05-02 11:05:04 -0700270 *buffer = (buffer_id)reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700271
272 return err;
273 }
274
Jamie Gennis83750ea2010-08-30 16:48:38 -0700275
276 virtual status_t useGraphicBuffer(
277 node_id node, OMX_U32 port_index,
278 const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) {
279 Parcel data, reply;
280 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700281 data.writeInt32((int32_t)node);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700282 data.writeInt32(port_index);
283 data.write(*graphicBuffer);
284 remote()->transact(USE_GRAPHIC_BUFFER, data, &reply);
285
286 status_t err = reply.readInt32();
287 if (err != OK) {
288 *buffer = 0;
289
290 return err;
291 }
292
Andy Hung609b8152014-05-02 11:05:04 -0700293 *buffer = (buffer_id)reply.readInt32();
Jamie Gennis83750ea2010-08-30 16:48:38 -0700294
295 return err;
296 }
297
Lajos Molnard0715862013-07-22 12:57:43 -0700298 virtual status_t updateGraphicBufferInMeta(
299 node_id node, OMX_U32 port_index,
300 const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer) {
301 Parcel data, reply;
302 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700303 data.writeInt32((int32_t)node);
Lajos Molnard0715862013-07-22 12:57:43 -0700304 data.writeInt32(port_index);
305 data.write(*graphicBuffer);
Andy Hung609b8152014-05-02 11:05:04 -0700306 data.writeInt32((int32_t)buffer);
Lajos Molnard0715862013-07-22 12:57:43 -0700307 remote()->transact(UPDATE_GRAPHIC_BUFFER_IN_META, data, &reply);
308
309 status_t err = reply.readInt32();
310 return err;
311 }
312
Andy McFadden7cd58532013-02-19 07:28:30 -0800313 virtual status_t createInputSurface(
314 node_id node, OMX_U32 port_index,
Lajos Molnar05421982015-05-15 20:39:14 -0700315 sp<IGraphicBufferProducer> *bufferProducer, MetadataBufferType *type) {
Andy McFadden7cd58532013-02-19 07:28:30 -0800316 Parcel data, reply;
317 status_t err;
318 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700319 data.writeInt32((int32_t)node);
Andy McFadden7cd58532013-02-19 07:28:30 -0800320 data.writeInt32(port_index);
321 err = remote()->transact(CREATE_INPUT_SURFACE, data, &reply);
322 if (err != OK) {
323 ALOGW("binder transaction failed: %d", err);
324 return err;
325 }
326
Lajos Molnar05421982015-05-15 20:39:14 -0700327 // read type even if createInputSurface failed
328 int negotiatedType = reply.readInt32();
329 if (type != NULL) {
330 *type = (MetadataBufferType)negotiatedType;
331 }
332
Andy McFadden7cd58532013-02-19 07:28:30 -0800333 err = reply.readInt32();
334 if (err != OK) {
335 return err;
336 }
337
338 *bufferProducer = IGraphicBufferProducer::asInterface(
339 reply.readStrongBinder());
340
341 return err;
342 }
343
Chong Zhangd291c222015-04-30 18:15:52 -0700344 virtual status_t createPersistentInputSurface(
345 sp<IGraphicBufferProducer> *bufferProducer,
346 sp<IGraphicBufferConsumer> *bufferConsumer) {
347 Parcel data, reply;
348 status_t err;
349 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
350 err = remote()->transact(CREATE_PERSISTENT_INPUT_SURFACE, data, &reply);
351 if (err != OK) {
352 ALOGW("binder transaction failed: %d", err);
353 return err;
354 }
355
356 err = reply.readInt32();
357 if (err != OK) {
358 return err;
359 }
360
361 *bufferProducer = IGraphicBufferProducer::asInterface(
362 reply.readStrongBinder());
363 *bufferConsumer = IGraphicBufferConsumer::asInterface(
364 reply.readStrongBinder());
365
366 return err;
367 }
368
Chong Zhang8f469e12015-05-13 10:21:33 -0700369 virtual status_t setInputSurface(
Chong Zhangd291c222015-04-30 18:15:52 -0700370 node_id node, OMX_U32 port_index,
Lajos Molnar05421982015-05-15 20:39:14 -0700371 const sp<IGraphicBufferConsumer> &bufferConsumer, MetadataBufferType *type) {
Chong Zhangd291c222015-04-30 18:15:52 -0700372 Parcel data, reply;
373 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
374 status_t err;
375 data.writeInt32((int32_t)node);
376 data.writeInt32(port_index);
377 data.writeStrongBinder(IInterface::asBinder(bufferConsumer));
378
Chong Zhang8f469e12015-05-13 10:21:33 -0700379 err = remote()->transact(SET_INPUT_SURFACE, data, &reply);
Chong Zhangd291c222015-04-30 18:15:52 -0700380
381 if (err != OK) {
382 ALOGW("binder transaction failed: %d", err);
383 return err;
384 }
Lajos Molnar05421982015-05-15 20:39:14 -0700385
386 // read type even if setInputSurface failed
387 int negotiatedType = reply.readInt32();
388 if (type != NULL) {
389 *type = (MetadataBufferType)negotiatedType;
390 }
391
Chong Zhangd291c222015-04-30 18:15:52 -0700392 return reply.readInt32();
393 }
394
Andy McFadden7cd58532013-02-19 07:28:30 -0800395 virtual status_t signalEndOfInputStream(node_id node) {
396 Parcel data, reply;
397 status_t err;
398 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700399 data.writeInt32((int32_t)node);
Andy McFadden7cd58532013-02-19 07:28:30 -0800400 err = remote()->transact(SIGNAL_END_OF_INPUT_STREAM, data, &reply);
401 if (err != OK) {
402 ALOGW("binder transaction failed: %d", err);
403 return err;
404 }
405
406 return reply.readInt32();
407 }
408
James Donge8707722010-10-20 17:38:41 -0700409 virtual status_t storeMetaDataInBuffers(
Lajos Molnar05421982015-05-15 20:39:14 -0700410 node_id node, OMX_U32 port_index, OMX_BOOL enable, MetadataBufferType *type) {
James Donge8707722010-10-20 17:38:41 -0700411 Parcel data, reply;
412 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700413 data.writeInt32((int32_t)node);
James Donge8707722010-10-20 17:38:41 -0700414 data.writeInt32(port_index);
415 data.writeInt32((uint32_t)enable);
416 remote()->transact(STORE_META_DATA_IN_BUFFERS, data, &reply);
417
Lajos Molnar05421982015-05-15 20:39:14 -0700418 // read type even storeMetaDataInBuffers failed
419 int negotiatedType = reply.readInt32();
420 if (type != NULL) {
421 *type = (MetadataBufferType)negotiatedType;
422 }
423
424 return reply.readInt32();
James Donge8707722010-10-20 17:38:41 -0700425 }
426
Lajos Molnar56ce7262013-05-02 16:30:48 -0700427 virtual status_t prepareForAdaptivePlayback(
428 node_id node, OMX_U32 port_index, OMX_BOOL enable,
429 OMX_U32 max_width, OMX_U32 max_height) {
430 Parcel data, reply;
431 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700432 data.writeInt32((int32_t)node);
Lajos Molnar56ce7262013-05-02 16:30:48 -0700433 data.writeInt32(port_index);
434 data.writeInt32((int32_t)enable);
435 data.writeInt32(max_width);
436 data.writeInt32(max_height);
437 remote()->transact(PREPARE_FOR_ADAPTIVE_PLAYBACK, data, &reply);
438
439 status_t err = reply.readInt32();
440 return err;
441 }
442
Rachad5a446aa2014-07-29 16:47:56 -0700443 virtual status_t configureVideoTunnelMode(
444 node_id node, OMX_U32 portIndex, OMX_BOOL tunneled,
445 OMX_U32 audioHwSync, native_handle_t **sidebandHandle ) {
446 Parcel data, reply;
447 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
448 data.writeInt32((int32_t)node);
449 data.writeInt32(portIndex);
450 data.writeInt32((int32_t)tunneled);
451 data.writeInt32(audioHwSync);
452 remote()->transact(CONFIGURE_VIDEO_TUNNEL_MODE, data, &reply);
453
454 status_t err = reply.readInt32();
455 if (sidebandHandle) {
456 *sidebandHandle = (native_handle_t *)reply.readNativeHandle();
457 }
458 return err;
459 }
460
461
Lajos Molnara63141a2016-02-11 16:40:36 -0800462 virtual status_t allocateSecureBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700463 node_id node, OMX_U32 port_index, size_t size,
Lajos Molnara63141a2016-02-11 16:40:36 -0800464 buffer_id *buffer, void **buffer_data, native_handle_t **native_handle) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700465 Parcel data, reply;
466 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700467 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700468 data.writeInt32(port_index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800469 data.writeInt64(size);
Lajos Molnara63141a2016-02-11 16:40:36 -0800470 remote()->transact(ALLOC_SECURE_BUFFER, data, &reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700471
472 status_t err = reply.readInt32();
473 if (err != OK) {
474 *buffer = 0;
Lajos Molnara63141a2016-02-11 16:40:36 -0800475 *buffer_data = NULL;
476 *native_handle = NULL;
Andreas Huber20111aa2009-07-14 16:56:47 -0700477 return err;
478 }
479
Andy Hung609b8152014-05-02 11:05:04 -0700480 *buffer = (buffer_id)reply.readInt32();
481 *buffer_data = (void *)reply.readInt64();
Lajos Molnara63141a2016-02-11 16:40:36 -0800482 if (*buffer_data == NULL) {
483 *native_handle = reply.readNativeHandle();
484 } else {
485 *native_handle = NULL;
486 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700487 return err;
488 }
489
Andreas Huber318ad9c2009-10-15 13:46:54 -0700490 virtual status_t allocateBufferWithBackup(
Andreas Huber20111aa2009-07-14 16:56:47 -0700491 node_id node, OMX_U32 port_index, const sp<IMemory> &params,
Lajos Molnarcc7cc672015-06-01 14:58:37 -0700492 buffer_id *buffer, OMX_U32 allottedSize) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700493 Parcel data, reply;
494 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700495 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700496 data.writeInt32(port_index);
Marco Nelissen06b46062014-11-14 07:58:25 -0800497 data.writeStrongBinder(IInterface::asBinder(params));
Lajos Molnarcc7cc672015-06-01 14:58:37 -0700498 data.writeInt32(allottedSize);
Andreas Huber20111aa2009-07-14 16:56:47 -0700499 remote()->transact(ALLOC_BUFFER_WITH_BACKUP, data, &reply);
500
501 status_t err = reply.readInt32();
502 if (err != OK) {
503 *buffer = 0;
504
505 return err;
506 }
507
Andy Hung609b8152014-05-02 11:05:04 -0700508 *buffer = (buffer_id)reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700509
510 return err;
511 }
512
Andreas Huber318ad9c2009-10-15 13:46:54 -0700513 virtual status_t freeBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700514 node_id node, OMX_U32 port_index, buffer_id buffer) {
515 Parcel data, reply;
516 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700517 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700518 data.writeInt32(port_index);
Andy Hung609b8152014-05-02 11:05:04 -0700519 data.writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700520 remote()->transact(FREE_BUFFER, data, &reply);
521
522 return reply.readInt32();
523 }
524
Lajos Molnar15ab4992015-06-01 10:54:31 -0700525 virtual status_t fillBuffer(node_id node, buffer_id buffer, int fenceFd) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700526 Parcel data, reply;
527 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700528 data.writeInt32((int32_t)node);
529 data.writeInt32((int32_t)buffer);
Lajos Molnar15ab4992015-06-01 10:54:31 -0700530 data.writeInt32(fenceFd >= 0);
531 if (fenceFd >= 0) {
532 data.writeFileDescriptor(fenceFd, true /* takeOwnership */);
533 }
Andreas Huber36efa032009-10-08 11:02:27 -0700534 remote()->transact(FILL_BUFFER, data, &reply);
535
536 return reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700537 }
538
Andreas Huber318ad9c2009-10-15 13:46:54 -0700539 virtual status_t emptyBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700540 node_id node,
541 buffer_id buffer,
542 OMX_U32 range_offset, OMX_U32 range_length,
Lajos Molnar15ab4992015-06-01 10:54:31 -0700543 OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700544 Parcel data, reply;
545 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700546 data.writeInt32((int32_t)node);
547 data.writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700548 data.writeInt32(range_offset);
549 data.writeInt32(range_length);
550 data.writeInt32(flags);
551 data.writeInt64(timestamp);
Lajos Molnar15ab4992015-06-01 10:54:31 -0700552 data.writeInt32(fenceFd >= 0);
553 if (fenceFd >= 0) {
554 data.writeFileDescriptor(fenceFd, true /* takeOwnership */);
555 }
Andreas Huber36efa032009-10-08 11:02:27 -0700556 remote()->transact(EMPTY_BUFFER, data, &reply);
557
558 return reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700559 }
Andreas Huber8b938cd2009-07-31 11:52:50 -0700560
Andreas Huber318ad9c2009-10-15 13:46:54 -0700561 virtual status_t getExtensionIndex(
Andreas Huber693d2712009-08-14 14:37:10 -0700562 node_id node,
563 const char *parameter_name,
564 OMX_INDEXTYPE *index) {
565 Parcel data, reply;
566 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700567 data.writeInt32((int32_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700568 data.writeCString(parameter_name);
569
570 remote()->transact(GET_EXTENSION_INDEX, data, &reply);
571
572 status_t err = reply.readInt32();
573 if (err == OK) {
574 *index = static_cast<OMX_INDEXTYPE>(reply.readInt32());
575 } else {
576 *index = OMX_IndexComponentStartUnused;
577 }
578
579 return err;
580 }
Andreas Hubere40cda72013-07-17 13:55:26 -0700581
582 virtual status_t setInternalOption(
583 node_id node,
584 OMX_U32 port_index,
585 InternalOptionType type,
586 const void *optionData,
587 size_t size) {
588 Parcel data, reply;
589 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700590 data.writeInt32((int32_t)node);
Andreas Hubere40cda72013-07-17 13:55:26 -0700591 data.writeInt32(port_index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800592 data.writeInt64(size);
Andreas Hubere40cda72013-07-17 13:55:26 -0700593 data.write(optionData, size);
594 data.writeInt32(type);
595 remote()->transact(SET_INTERNAL_OPTION, data, &reply);
596
597 return reply.readInt32();
598 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700599};
600
601IMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX");
602
603////////////////////////////////////////////////////////////////////////////////
604
Andy McFadden7cd58532013-02-19 07:28:30 -0800605#define CHECK_OMX_INTERFACE(interface, data, reply) \
Andreas Huber20111aa2009-07-14 16:56:47 -0700606 do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \
Steve Block5ff1dd52012-01-05 23:22:43 +0000607 ALOGW("Call incorrectly routed to " #interface); \
Andreas Huber20111aa2009-07-14 16:56:47 -0700608 return PERMISSION_DENIED; \
609 } } while (0)
610
611status_t BnOMX::onTransact(
612 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
613 switch (code) {
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800614 case LIVES_LOCALLY:
615 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800616 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andy Hung609b8152014-05-02 11:05:04 -0700617 node_id node = (node_id)data.readInt32();
Andreas Huberd459b482012-01-31 11:16:24 -0800618 pid_t pid = (pid_t)data.readInt32();
619 reply->writeInt32(livesLocally(node, pid));
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800620
621 return OK;
622 }
623
Andreas Huber20111aa2009-07-14 16:56:47 -0700624 case LIST_NODES:
625 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800626 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700627
Andreas Huber134ee6a2009-12-16 09:30:55 -0800628 List<ComponentInfo> list;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700629 listNodes(&list);
Andreas Huber20111aa2009-07-14 16:56:47 -0700630
631 reply->writeInt32(list.size());
Andreas Huber134ee6a2009-12-16 09:30:55 -0800632 for (List<ComponentInfo>::iterator it = list.begin();
Andreas Huber20111aa2009-07-14 16:56:47 -0700633 it != list.end(); ++it) {
Andreas Huber134ee6a2009-12-16 09:30:55 -0800634 ComponentInfo &cur = *it;
635
636 reply->writeString8(cur.mName);
637 reply->writeInt32(cur.mRoles.size());
638 for (List<String8>::iterator role_it = cur.mRoles.begin();
639 role_it != cur.mRoles.end(); ++role_it) {
640 reply->writeString8(*role_it);
641 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700642 }
643
644 return NO_ERROR;
645 }
646
647 case ALLOCATE_NODE:
648 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800649 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700650
Andreas Huber318ad9c2009-10-15 13:46:54 -0700651 const char *name = data.readCString();
652
653 sp<IOMXObserver> observer =
654 interface_cast<IOMXObserver>(data.readStrongBinder());
655
Wei Jia56c95c92016-01-06 10:30:46 -0800656 if (name == NULL || observer == NULL) {
657 ALOGE("b/26392700");
658 reply->writeInt32(INVALID_OPERATION);
659 return NO_ERROR;
660 }
661
Andreas Huber20111aa2009-07-14 16:56:47 -0700662 node_id node;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700663
Marco Nelissen23858872016-02-17 13:12:13 -0800664 status_t err = allocateNode(name, observer,
665 NULL /* nodeBinder */, &node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700666 reply->writeInt32(err);
667 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700668 reply->writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700669 }
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800670
Andreas Huber20111aa2009-07-14 16:56:47 -0700671 return NO_ERROR;
672 }
673
674 case FREE_NODE:
675 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800676 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700677
Andy Hung609b8152014-05-02 11:05:04 -0700678 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700679
Andreas Huber318ad9c2009-10-15 13:46:54 -0700680 reply->writeInt32(freeNode(node));
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800681
Andreas Huber20111aa2009-07-14 16:56:47 -0700682 return NO_ERROR;
683 }
684
685 case SEND_COMMAND:
686 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800687 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700688
Andy Hung609b8152014-05-02 11:05:04 -0700689 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700690
691 OMX_COMMANDTYPE cmd =
692 static_cast<OMX_COMMANDTYPE>(data.readInt32());
693
694 OMX_S32 param = data.readInt32();
Andreas Huber318ad9c2009-10-15 13:46:54 -0700695 reply->writeInt32(sendCommand(node, cmd, param));
Andreas Huber20111aa2009-07-14 16:56:47 -0700696
697 return NO_ERROR;
698 }
699
700 case GET_PARAMETER:
Andreas Huber20111aa2009-07-14 16:56:47 -0700701 case SET_PARAMETER:
Andreas Huber693d2712009-08-14 14:37:10 -0700702 case GET_CONFIG:
Andreas Huber693d2712009-08-14 14:37:10 -0700703 case SET_CONFIG:
Andreas Hubere40cda72013-07-17 13:55:26 -0700704 case SET_INTERNAL_OPTION:
Andreas Huber693d2712009-08-14 14:37:10 -0700705 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800706 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber693d2712009-08-14 14:37:10 -0700707
Andy Hung609b8152014-05-02 11:05:04 -0700708 node_id node = (node_id)data.readInt32();
Andreas Huber693d2712009-08-14 14:37:10 -0700709 OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
710
Glenn Kastene03dd222014-01-28 11:04:39 -0800711 size_t size = data.readInt64();
Andreas Huber693d2712009-08-14 14:37:10 -0700712
Andreas Huberb3912902011-01-19 10:34:52 -0800713 void *params = malloc(size);
714 data.read(params, size);
715
716 status_t err;
717 switch (code) {
718 case GET_PARAMETER:
719 err = getParameter(node, index, params, size);
720 break;
721 case SET_PARAMETER:
722 err = setParameter(node, index, params, size);
723 break;
724 case GET_CONFIG:
725 err = getConfig(node, index, params, size);
726 break;
727 case SET_CONFIG:
728 err = setConfig(node, index, params, size);
729 break;
Andreas Hubere40cda72013-07-17 13:55:26 -0700730 case SET_INTERNAL_OPTION:
731 {
732 InternalOptionType type =
733 (InternalOptionType)data.readInt32();
734
735 err = setInternalOption(node, index, type, params, size);
736 break;
737 }
738
Andreas Huberb3912902011-01-19 10:34:52 -0800739 default:
740 TRESPASS();
741 }
742
743 reply->writeInt32(err);
744
745 if ((code == GET_PARAMETER || code == GET_CONFIG) && err == OK) {
746 reply->write(params, size);
747 }
748
749 free(params);
750 params = NULL;
Andreas Huber693d2712009-08-14 14:37:10 -0700751
752 return NO_ERROR;
753 }
754
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700755 case GET_STATE:
756 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800757 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700758
Andy Hung609b8152014-05-02 11:05:04 -0700759 node_id node = (node_id)data.readInt32();
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700760 OMX_STATETYPE state = OMX_StateInvalid;
761
762 status_t err = getState(node, &state);
763 reply->writeInt32(state);
764 reply->writeInt32(err);
765
766 return NO_ERROR;
767 }
768
Lajos Molnara63141a2016-02-11 16:40:36 -0800769 case ENABLE_NATIVE_BUFFERS:
Jamie Gennis83750ea2010-08-30 16:48:38 -0700770 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800771 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700772
Andy Hung609b8152014-05-02 11:05:04 -0700773 node_id node = (node_id)data.readInt32();
Jamie Gennis83750ea2010-08-30 16:48:38 -0700774 OMX_U32 port_index = data.readInt32();
Lajos Molnara63141a2016-02-11 16:40:36 -0800775 OMX_BOOL graphic = (OMX_BOOL)data.readInt32();
Jamie Gennis83750ea2010-08-30 16:48:38 -0700776 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
777
Lajos Molnara63141a2016-02-11 16:40:36 -0800778 status_t err = enableNativeBuffers(node, port_index, graphic, enable);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700779 reply->writeInt32(err);
780
781 return NO_ERROR;
782 }
783
Jamie Gennise2ce6452011-02-23 19:01:28 -0800784 case GET_GRAPHIC_BUFFER_USAGE:
785 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800786 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennise2ce6452011-02-23 19:01:28 -0800787
Andy Hung609b8152014-05-02 11:05:04 -0700788 node_id node = (node_id)data.readInt32();
Jamie Gennise2ce6452011-02-23 19:01:28 -0800789 OMX_U32 port_index = data.readInt32();
790
791 OMX_U32 usage = 0;
792 status_t err = getGraphicBufferUsage(node, port_index, &usage);
793 reply->writeInt32(err);
794 reply->writeInt32(usage);
795
796 return NO_ERROR;
797 }
798
Andreas Huber20111aa2009-07-14 16:56:47 -0700799 case USE_BUFFER:
800 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800801 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700802
Andy Hung609b8152014-05-02 11:05:04 -0700803 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700804 OMX_U32 port_index = data.readInt32();
805 sp<IMemory> params =
806 interface_cast<IMemory>(data.readStrongBinder());
Lajos Molnarcc7cc672015-06-01 14:58:37 -0700807 OMX_U32 allottedSize = data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700808
Wei Jia56c95c92016-01-06 10:30:46 -0800809 if (params == NULL) {
810 ALOGE("b/26392700");
811 reply->writeInt32(INVALID_OPERATION);
812 return NO_ERROR;
813 }
814
Andreas Huber20111aa2009-07-14 16:56:47 -0700815 buffer_id buffer;
Lajos Molnarcc7cc672015-06-01 14:58:37 -0700816 status_t err = useBuffer(node, port_index, params, &buffer, allottedSize);
Andreas Huber20111aa2009-07-14 16:56:47 -0700817 reply->writeInt32(err);
818
819 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700820 reply->writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700821 }
822
823 return NO_ERROR;
824 }
825
Jamie Gennis83750ea2010-08-30 16:48:38 -0700826 case USE_GRAPHIC_BUFFER:
827 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800828 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700829
Andy Hung609b8152014-05-02 11:05:04 -0700830 node_id node = (node_id)data.readInt32();
Jamie Gennis83750ea2010-08-30 16:48:38 -0700831 OMX_U32 port_index = data.readInt32();
832 sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
833 data.read(*graphicBuffer);
834
835 buffer_id buffer;
836 status_t err = useGraphicBuffer(
837 node, port_index, graphicBuffer, &buffer);
838 reply->writeInt32(err);
839
840 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700841 reply->writeInt32((int32_t)buffer);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700842 }
843
844 return NO_ERROR;
845 }
846
Lajos Molnard0715862013-07-22 12:57:43 -0700847 case UPDATE_GRAPHIC_BUFFER_IN_META:
848 {
849 CHECK_OMX_INTERFACE(IOMX, data, reply);
850
Andy Hung609b8152014-05-02 11:05:04 -0700851 node_id node = (node_id)data.readInt32();
Lajos Molnard0715862013-07-22 12:57:43 -0700852 OMX_U32 port_index = data.readInt32();
853 sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
854 data.read(*graphicBuffer);
Andy Hung609b8152014-05-02 11:05:04 -0700855 buffer_id buffer = (buffer_id)data.readInt32();
Lajos Molnard0715862013-07-22 12:57:43 -0700856
857 status_t err = updateGraphicBufferInMeta(
858 node, port_index, graphicBuffer, buffer);
859 reply->writeInt32(err);
860
861 return NO_ERROR;
862 }
863
Andy McFadden7cd58532013-02-19 07:28:30 -0800864 case CREATE_INPUT_SURFACE:
865 {
866 CHECK_OMX_INTERFACE(IOMX, data, reply);
867
Andy Hung609b8152014-05-02 11:05:04 -0700868 node_id node = (node_id)data.readInt32();
Andy McFadden7cd58532013-02-19 07:28:30 -0800869 OMX_U32 port_index = data.readInt32();
870
871 sp<IGraphicBufferProducer> bufferProducer;
Lajos Molnar05421982015-05-15 20:39:14 -0700872 MetadataBufferType type;
873 status_t err = createInputSurface(node, port_index, &bufferProducer, &type);
Andy McFadden7cd58532013-02-19 07:28:30 -0800874
Lajos Molnar05421982015-05-15 20:39:14 -0700875 reply->writeInt32(type);
Andy McFadden7cd58532013-02-19 07:28:30 -0800876 reply->writeInt32(err);
877
878 if (err == OK) {
Marco Nelissen06b46062014-11-14 07:58:25 -0800879 reply->writeStrongBinder(IInterface::asBinder(bufferProducer));
Andy McFadden7cd58532013-02-19 07:28:30 -0800880 }
881
882 return NO_ERROR;
883 }
884
Chong Zhangd291c222015-04-30 18:15:52 -0700885 case CREATE_PERSISTENT_INPUT_SURFACE:
886 {
887 CHECK_OMX_INTERFACE(IOMX, data, reply);
888
889 sp<IGraphicBufferProducer> bufferProducer;
890 sp<IGraphicBufferConsumer> bufferConsumer;
891 status_t err = createPersistentInputSurface(
892 &bufferProducer, &bufferConsumer);
893
894 reply->writeInt32(err);
895
896 if (err == OK) {
897 reply->writeStrongBinder(IInterface::asBinder(bufferProducer));
898 reply->writeStrongBinder(IInterface::asBinder(bufferConsumer));
899 }
900
901 return NO_ERROR;
902 }
903
Chong Zhang8f469e12015-05-13 10:21:33 -0700904 case SET_INPUT_SURFACE:
Chong Zhangd291c222015-04-30 18:15:52 -0700905 {
906 CHECK_OMX_INTERFACE(IOMX, data, reply);
907
908 node_id node = (node_id)data.readInt32();
909 OMX_U32 port_index = data.readInt32();
910
911 sp<IGraphicBufferConsumer> bufferConsumer =
912 interface_cast<IGraphicBufferConsumer>(data.readStrongBinder());
913
Wei Jia56c95c92016-01-06 10:30:46 -0800914 MetadataBufferType type = kMetadataBufferTypeInvalid;
915 status_t err = INVALID_OPERATION;
916 if (bufferConsumer == NULL) {
917 ALOGE("b/26392700");
918 } else {
919 err = setInputSurface(node, port_index, bufferConsumer, &type);
920 }
Chong Zhangd291c222015-04-30 18:15:52 -0700921
Lajos Molnar05421982015-05-15 20:39:14 -0700922 reply->writeInt32(type);
Chong Zhangd291c222015-04-30 18:15:52 -0700923 reply->writeInt32(err);
924 return NO_ERROR;
925 }
926
Andy McFadden7cd58532013-02-19 07:28:30 -0800927 case SIGNAL_END_OF_INPUT_STREAM:
928 {
929 CHECK_OMX_INTERFACE(IOMX, data, reply);
930
Andy Hung609b8152014-05-02 11:05:04 -0700931 node_id node = (node_id)data.readInt32();
Andy McFadden7cd58532013-02-19 07:28:30 -0800932
933 status_t err = signalEndOfInputStream(node);
934 reply->writeInt32(err);
935
936 return NO_ERROR;
937 }
938
James Donge8707722010-10-20 17:38:41 -0700939 case STORE_META_DATA_IN_BUFFERS:
940 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800941 CHECK_OMX_INTERFACE(IOMX, data, reply);
James Donge8707722010-10-20 17:38:41 -0700942
Andy Hung609b8152014-05-02 11:05:04 -0700943 node_id node = (node_id)data.readInt32();
James Donge8707722010-10-20 17:38:41 -0700944 OMX_U32 port_index = data.readInt32();
945 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
946
Lajos Molnar05421982015-05-15 20:39:14 -0700947 MetadataBufferType type;
948 status_t err = storeMetaDataInBuffers(node, port_index, enable, &type);
949 reply->writeInt32(type);
James Donge8707722010-10-20 17:38:41 -0700950 reply->writeInt32(err);
951
952 return NO_ERROR;
953 }
954
Lajos Molnar56ce7262013-05-02 16:30:48 -0700955 case PREPARE_FOR_ADAPTIVE_PLAYBACK:
956 {
957 CHECK_OMX_INTERFACE(IOMX, data, reply);
958
Andy Hung609b8152014-05-02 11:05:04 -0700959 node_id node = (node_id)data.readInt32();
Lajos Molnar56ce7262013-05-02 16:30:48 -0700960 OMX_U32 port_index = data.readInt32();
961 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
962 OMX_U32 max_width = data.readInt32();
963 OMX_U32 max_height = data.readInt32();
964
965 status_t err = prepareForAdaptivePlayback(
966 node, port_index, enable, max_width, max_height);
967 reply->writeInt32(err);
968
969 return NO_ERROR;
970 }
971
Rachad5a446aa2014-07-29 16:47:56 -0700972 case CONFIGURE_VIDEO_TUNNEL_MODE:
973 {
974 CHECK_OMX_INTERFACE(IOMX, data, reply);
975
976 node_id node = (node_id)data.readInt32();
977 OMX_U32 port_index = data.readInt32();
978 OMX_BOOL tunneled = (OMX_BOOL)data.readInt32();
979 OMX_U32 audio_hw_sync = data.readInt32();
980
Lajos Molnara63141a2016-02-11 16:40:36 -0800981 native_handle_t *sideband_handle = NULL;
Rachad5a446aa2014-07-29 16:47:56 -0700982 status_t err = configureVideoTunnelMode(
983 node, port_index, tunneled, audio_hw_sync, &sideband_handle);
984 reply->writeInt32(err);
985 reply->writeNativeHandle(sideband_handle);
986
987 return NO_ERROR;
988 }
989
Lajos Molnara63141a2016-02-11 16:40:36 -0800990 case ALLOC_SECURE_BUFFER:
Andreas Huber20111aa2009-07-14 16:56:47 -0700991 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800992 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700993
Andy Hung609b8152014-05-02 11:05:04 -0700994 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700995 OMX_U32 port_index = data.readInt32();
Wei Jia8dde7262015-09-28 11:32:23 -0700996 if (!isSecure(node) || port_index != 0 /* kPortIndexInput */) {
997 ALOGE("b/24310423");
998 reply->writeInt32(INVALID_OPERATION);
999 return NO_ERROR;
1000 }
1001
Glenn Kastene03dd222014-01-28 11:04:39 -08001002 size_t size = data.readInt64();
Andreas Huber20111aa2009-07-14 16:56:47 -07001003
1004 buffer_id buffer;
Lajos Molnara63141a2016-02-11 16:40:36 -08001005 void *buffer_data = NULL;
1006 native_handle_t *native_handle = NULL;
1007 status_t err = allocateSecureBuffer(
1008 node, port_index, size, &buffer, &buffer_data, &native_handle);
Andreas Huber20111aa2009-07-14 16:56:47 -07001009 reply->writeInt32(err);
1010
1011 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -07001012 reply->writeInt32((int32_t)buffer);
1013 reply->writeInt64((uintptr_t)buffer_data);
Lajos Molnara63141a2016-02-11 16:40:36 -08001014 if (buffer_data == NULL) {
1015 reply->writeNativeHandle(native_handle);
1016 }
Andreas Huber20111aa2009-07-14 16:56:47 -07001017 }
1018
1019 return NO_ERROR;
1020 }
1021
1022 case ALLOC_BUFFER_WITH_BACKUP:
1023 {
Andy McFadden7cd58532013-02-19 07:28:30 -08001024 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -07001025
Andy Hung609b8152014-05-02 11:05:04 -07001026 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -07001027 OMX_U32 port_index = data.readInt32();
1028 sp<IMemory> params =
1029 interface_cast<IMemory>(data.readStrongBinder());
Lajos Molnarcc7cc672015-06-01 14:58:37 -07001030 OMX_U32 allottedSize = data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -07001031
Wei Jia56c95c92016-01-06 10:30:46 -08001032 if (params == NULL) {
1033 ALOGE("b/26392700");
1034 reply->writeInt32(INVALID_OPERATION);
1035 return NO_ERROR;
1036 }
1037
Andreas Huber20111aa2009-07-14 16:56:47 -07001038 buffer_id buffer;
Andreas Huber318ad9c2009-10-15 13:46:54 -07001039 status_t err = allocateBufferWithBackup(
Lajos Molnarcc7cc672015-06-01 14:58:37 -07001040 node, port_index, params, &buffer, allottedSize);
Andreas Huber20111aa2009-07-14 16:56:47 -07001041
1042 reply->writeInt32(err);
1043
1044 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -07001045 reply->writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -07001046 }
1047
1048 return NO_ERROR;
1049 }
1050
1051 case FREE_BUFFER:
1052 {
Andy McFadden7cd58532013-02-19 07:28:30 -08001053 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -07001054
Andy Hung609b8152014-05-02 11:05:04 -07001055 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -07001056 OMX_U32 port_index = data.readInt32();
Andy Hung609b8152014-05-02 11:05:04 -07001057 buffer_id buffer = (buffer_id)data.readInt32();
Andreas Huber318ad9c2009-10-15 13:46:54 -07001058 reply->writeInt32(freeBuffer(node, port_index, buffer));
Andreas Huber20111aa2009-07-14 16:56:47 -07001059
1060 return NO_ERROR;
1061 }
1062
1063 case FILL_BUFFER:
1064 {
Andy McFadden7cd58532013-02-19 07:28:30 -08001065 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -07001066
Andy Hung609b8152014-05-02 11:05:04 -07001067 node_id node = (node_id)data.readInt32();
1068 buffer_id buffer = (buffer_id)data.readInt32();
Lajos Molnar15ab4992015-06-01 10:54:31 -07001069 bool haveFence = data.readInt32();
1070 int fenceFd = haveFence ? ::dup(data.readFileDescriptor()) : -1;
1071 reply->writeInt32(fillBuffer(node, buffer, fenceFd));
Andreas Huber20111aa2009-07-14 16:56:47 -07001072
1073 return NO_ERROR;
1074 }
1075
1076 case EMPTY_BUFFER:
1077 {
Andy McFadden7cd58532013-02-19 07:28:30 -08001078 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -07001079
Andy Hung609b8152014-05-02 11:05:04 -07001080 node_id node = (node_id)data.readInt32();
1081 buffer_id buffer = (buffer_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -07001082 OMX_U32 range_offset = data.readInt32();
1083 OMX_U32 range_length = data.readInt32();
1084 OMX_U32 flags = data.readInt32();
1085 OMX_TICKS timestamp = data.readInt64();
Lajos Molnar15ab4992015-06-01 10:54:31 -07001086 bool haveFence = data.readInt32();
1087 int fenceFd = haveFence ? ::dup(data.readFileDescriptor()) : -1;
1088 reply->writeInt32(emptyBuffer(
1089 node, buffer, range_offset, range_length, flags, timestamp, fenceFd));
Andreas Huber20111aa2009-07-14 16:56:47 -07001090
1091 return NO_ERROR;
1092 }
Andreas Huber20111aa2009-07-14 16:56:47 -07001093
Andreas Huber693d2712009-08-14 14:37:10 -07001094 case GET_EXTENSION_INDEX:
1095 {
Andy McFadden7cd58532013-02-19 07:28:30 -08001096 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber693d2712009-08-14 14:37:10 -07001097
Andy Hung609b8152014-05-02 11:05:04 -07001098 node_id node = (node_id)data.readInt32();
Andreas Huber693d2712009-08-14 14:37:10 -07001099 const char *parameter_name = data.readCString();
Andreas Huber7eaa9c92010-01-15 15:28:19 -08001100
Wei Jia56c95c92016-01-06 10:30:46 -08001101 if (parameter_name == NULL) {
1102 ALOGE("b/26392700");
1103 reply->writeInt32(INVALID_OPERATION);
1104 return NO_ERROR;
1105 }
1106
Andreas Huber693d2712009-08-14 14:37:10 -07001107 OMX_INDEXTYPE index;
Andreas Huber318ad9c2009-10-15 13:46:54 -07001108 status_t err = getExtensionIndex(node, parameter_name, &index);
Andreas Huber693d2712009-08-14 14:37:10 -07001109
1110 reply->writeInt32(err);
1111
1112 if (err == OK) {
1113 reply->writeInt32(index);
1114 }
1115
1116 return OK;
1117 }
1118
Andreas Huber20111aa2009-07-14 16:56:47 -07001119 default:
1120 return BBinder::onTransact(code, data, reply, flags);
1121 }
1122}
1123
1124////////////////////////////////////////////////////////////////////////////////
1125
1126class BpOMXObserver : public BpInterface<IOMXObserver> {
1127public:
1128 BpOMXObserver(const sp<IBinder> &impl)
1129 : BpInterface<IOMXObserver>(impl) {
1130 }
1131
Lajos Molnar26a48f32015-06-04 10:30:02 -07001132 virtual void onMessages(const std::list<omx_message> &messages) {
Andreas Huber20111aa2009-07-14 16:56:47 -07001133 Parcel data, reply;
Lajos Molnar26a48f32015-06-04 10:30:02 -07001134 std::list<omx_message>::const_iterator it = messages.cbegin();
1135 bool first = true;
1136 while (it != messages.cend()) {
1137 const omx_message &msg = *it++;
1138 if (first) {
1139 data.writeInterfaceToken(IOMXObserver::getInterfaceDescriptor());
1140 data.writeInt32(msg.node);
1141 first = false;
1142 }
1143 data.writeInt32(msg.fenceFd >= 0);
1144 if (msg.fenceFd >= 0) {
1145 data.writeFileDescriptor(msg.fenceFd, true /* takeOwnership */);
1146 }
1147 data.writeInt32(msg.type);
1148 data.write(&msg.u, sizeof(msg.u));
1149 ALOGV("onMessage writing message %d, size %zu", msg.type, sizeof(msg));
Lajos Molnar15ab4992015-06-01 10:54:31 -07001150 }
Lajos Molnar26a48f32015-06-04 10:30:02 -07001151 if (!first) {
1152 data.writeInt32(-1); // mark end
1153 remote()->transact(OBSERVER_ON_MSG, data, &reply, IBinder::FLAG_ONEWAY);
1154 }
Andreas Huber20111aa2009-07-14 16:56:47 -07001155 }
1156};
1157
1158IMPLEMENT_META_INTERFACE(OMXObserver, "android.hardware.IOMXObserver");
1159
1160status_t BnOMXObserver::onTransact(
1161 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
1162 switch (code) {
1163 case OBSERVER_ON_MSG:
1164 {
Andy McFadden7cd58532013-02-19 07:28:30 -08001165 CHECK_OMX_INTERFACE(IOMXObserver, data, reply);
Lajos Molnar26a48f32015-06-04 10:30:02 -07001166 IOMX::node_id node = data.readInt32();
1167 std::list<omx_message> messages;
1168 status_t err = FAILED_TRANSACTION; // must receive at least one message
1169 do {
1170 int haveFence = data.readInt32();
1171 if (haveFence < 0) { // we use -1 to mark end of messages
1172 break;
1173 }
1174 omx_message msg;
1175 msg.node = node;
1176 msg.fenceFd = haveFence ? ::dup(data.readFileDescriptor()) : -1;
1177 msg.type = (typeof(msg.type))data.readInt32();
1178 err = data.read(&msg.u, sizeof(msg.u));
1179 ALOGV("onTransact reading message %d, size %zu", msg.type, sizeof(msg));
1180 messages.push_back(msg);
1181 } while (err == OK);
Andreas Huber20111aa2009-07-14 16:56:47 -07001182
Lajos Molnar26a48f32015-06-04 10:30:02 -07001183 if (err == OK) {
1184 onMessages(messages);
Lajos Molnar15ab4992015-06-01 10:54:31 -07001185 }
Andreas Huber20111aa2009-07-14 16:56:47 -07001186
Lajos Molnar26a48f32015-06-04 10:30:02 -07001187 return err;
Andreas Huber20111aa2009-07-14 16:56:47 -07001188 }
1189
1190 default:
1191 return BBinder::onTransact(code, data, reply, flags);
1192 }
1193}
1194
Andreas Huber20111aa2009-07-14 16:56:47 -07001195} // namespace android