blob: 41c8a751a6325c2845ff797e15fc91d725cb9892 [file] [log] [blame]
James Dong27c17442011-03-17 11:02:04 -07001/*
2 * Copyright (c) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Andreas Huber20111aa2009-07-14 16:56:47 -070017//#define LOG_NDEBUG 0
18#define LOG_TAG "IOMX"
19#include <utils/Log.h>
20
21#include <binder/IMemory.h>
22#include <binder/Parcel.h>
23#include <media/IOMX.h>
Andreas Huberb3912902011-01-19 10:34:52 -080024#include <media/stagefright/foundation/ADebug.h>
Andreas Huber20111aa2009-07-14 16:56:47 -070025
26namespace android {
27
28enum {
29 CONNECT = IBinder::FIRST_CALL_TRANSACTION,
Andreas Huber7eaa9c92010-01-15 15:28:19 -080030 LIVES_LOCALLY,
Andreas Huber20111aa2009-07-14 16:56:47 -070031 LIST_NODES,
32 ALLOCATE_NODE,
33 FREE_NODE,
34 SEND_COMMAND,
35 GET_PARAMETER,
36 SET_PARAMETER,
Andreas Huber693d2712009-08-14 14:37:10 -070037 GET_CONFIG,
38 SET_CONFIG,
Jamie Gennisb1d666f2011-10-19 21:14:13 -070039 GET_STATE,
Jamie Gennis83750ea2010-08-30 16:48:38 -070040 ENABLE_GRAPHIC_BUFFERS,
Andreas Huber20111aa2009-07-14 16:56:47 -070041 USE_BUFFER,
Jamie Gennis83750ea2010-08-30 16:48:38 -070042 USE_GRAPHIC_BUFFER,
Andy McFadden7cd58532013-02-19 07:28:30 -080043 CREATE_INPUT_SURFACE,
44 SIGNAL_END_OF_INPUT_STREAM,
James Donge8707722010-10-20 17:38:41 -070045 STORE_META_DATA_IN_BUFFERS,
Lajos Molnar56ce7262013-05-02 16:30:48 -070046 PREPARE_FOR_ADAPTIVE_PLAYBACK,
Andreas Huber20111aa2009-07-14 16:56:47 -070047 ALLOC_BUFFER,
48 ALLOC_BUFFER_WITH_BACKUP,
49 FREE_BUFFER,
Andreas Huber20111aa2009-07-14 16:56:47 -070050 FILL_BUFFER,
51 EMPTY_BUFFER,
Andreas Huber693d2712009-08-14 14:37:10 -070052 GET_EXTENSION_INDEX,
Andreas Huber20111aa2009-07-14 16:56:47 -070053 OBSERVER_ON_MSG,
Jamie Gennise2ce6452011-02-23 19:01:28 -080054 GET_GRAPHIC_BUFFER_USAGE,
Andreas Hubere40cda72013-07-17 13:55:26 -070055 SET_INTERNAL_OPTION,
Lajos Molnard0715862013-07-22 12:57:43 -070056 UPDATE_GRAPHIC_BUFFER_IN_META,
Rachad5a446aa2014-07-29 16:47:56 -070057 CONFIGURE_VIDEO_TUNNEL_MODE,
Andreas Huber20111aa2009-07-14 16:56:47 -070058};
59
Andreas Huber20111aa2009-07-14 16:56:47 -070060class BpOMX : public BpInterface<IOMX> {
61public:
62 BpOMX(const sp<IBinder> &impl)
63 : BpInterface<IOMX>(impl) {
64 }
65
Andreas Huberd459b482012-01-31 11:16:24 -080066 virtual bool livesLocally(node_id node, pid_t pid) {
Andreas Huber7eaa9c92010-01-15 15:28:19 -080067 Parcel data, reply;
68 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -070069 data.writeInt32((int32_t)node);
Andreas Huber7eaa9c92010-01-15 15:28:19 -080070 data.writeInt32(pid);
71 remote()->transact(LIVES_LOCALLY, data, &reply);
72
73 return reply.readInt32() != 0;
74 }
75
Andreas Huber134ee6a2009-12-16 09:30:55 -080076 virtual status_t listNodes(List<ComponentInfo> *list) {
Andreas Huber20111aa2009-07-14 16:56:47 -070077 list->clear();
78
79 Parcel data, reply;
80 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
81 remote()->transact(LIST_NODES, data, &reply);
82
83 int32_t n = reply.readInt32();
84 for (int32_t i = 0; i < n; ++i) {
Andreas Huber134ee6a2009-12-16 09:30:55 -080085 list->push_back(ComponentInfo());
86 ComponentInfo &info = *--list->end();
Andreas Huber20111aa2009-07-14 16:56:47 -070087
Andreas Huber134ee6a2009-12-16 09:30:55 -080088 info.mName = reply.readString8();
89 int32_t numRoles = reply.readInt32();
90 for (int32_t j = 0; j < numRoles; ++j) {
91 info.mRoles.push_back(reply.readString8());
92 }
Andreas Huber20111aa2009-07-14 16:56:47 -070093 }
94
95 return OK;
96 }
97
Andreas Huber318ad9c2009-10-15 13:46:54 -070098 virtual status_t allocateNode(
99 const char *name, const sp<IOMXObserver> &observer, node_id *node) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700100 Parcel data, reply;
101 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
102 data.writeCString(name);
Marco Nelissenf8880202014-11-14 07:58:25 -0800103 data.writeStrongBinder(IInterface::asBinder(observer));
Andreas Huber20111aa2009-07-14 16:56:47 -0700104 remote()->transact(ALLOCATE_NODE, data, &reply);
105
106 status_t err = reply.readInt32();
107 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700108 *node = (node_id)reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700109 } else {
110 *node = 0;
111 }
112
113 return err;
114 }
115
Andreas Huber318ad9c2009-10-15 13:46:54 -0700116 virtual status_t freeNode(node_id node) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700117 Parcel data, reply;
118 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700119 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700120 remote()->transact(FREE_NODE, data, &reply);
121
122 return reply.readInt32();
123 }
124
Andreas Huber318ad9c2009-10-15 13:46:54 -0700125 virtual status_t sendCommand(
Andreas Huber20111aa2009-07-14 16:56:47 -0700126 node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) {
127 Parcel data, reply;
128 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700129 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700130 data.writeInt32(cmd);
131 data.writeInt32(param);
132 remote()->transact(SEND_COMMAND, data, &reply);
133
134 return reply.readInt32();
135 }
136
Andreas Huber318ad9c2009-10-15 13:46:54 -0700137 virtual status_t getParameter(
Andreas Huber20111aa2009-07-14 16:56:47 -0700138 node_id node, OMX_INDEXTYPE index,
139 void *params, size_t size) {
140 Parcel data, reply;
141 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700142 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700143 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800144 data.writeInt64(size);
Andreas Huber20111aa2009-07-14 16:56:47 -0700145 data.write(params, size);
146 remote()->transact(GET_PARAMETER, data, &reply);
147
148 status_t err = reply.readInt32();
149 if (err != OK) {
150 return err;
151 }
152
153 reply.read(params, size);
154
155 return OK;
156 }
157
Andreas Huber318ad9c2009-10-15 13:46:54 -0700158 virtual status_t setParameter(
Andreas Huber20111aa2009-07-14 16:56:47 -0700159 node_id node, OMX_INDEXTYPE index,
160 const void *params, size_t size) {
161 Parcel data, reply;
162 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700163 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700164 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800165 data.writeInt64(size);
Andreas Huber20111aa2009-07-14 16:56:47 -0700166 data.write(params, size);
167 remote()->transact(SET_PARAMETER, data, &reply);
168
169 return reply.readInt32();
170 }
171
Andreas Huber318ad9c2009-10-15 13:46:54 -0700172 virtual status_t getConfig(
Andreas Huber693d2712009-08-14 14:37:10 -0700173 node_id node, OMX_INDEXTYPE index,
174 void *params, size_t size) {
175 Parcel data, reply;
176 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700177 data.writeInt32((int32_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700178 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800179 data.writeInt64(size);
Andreas Huber693d2712009-08-14 14:37:10 -0700180 data.write(params, size);
181 remote()->transact(GET_CONFIG, data, &reply);
182
183 status_t err = reply.readInt32();
184 if (err != OK) {
185 return err;
186 }
187
188 reply.read(params, size);
189
190 return OK;
191 }
192
Andreas Huber318ad9c2009-10-15 13:46:54 -0700193 virtual status_t setConfig(
Andreas Huber693d2712009-08-14 14:37:10 -0700194 node_id node, OMX_INDEXTYPE index,
195 const void *params, size_t size) {
196 Parcel data, reply;
197 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700198 data.writeInt32((int32_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700199 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800200 data.writeInt64(size);
Andreas Huber693d2712009-08-14 14:37:10 -0700201 data.write(params, size);
202 remote()->transact(SET_CONFIG, data, &reply);
203
204 return reply.readInt32();
205 }
206
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700207 virtual status_t getState(
208 node_id node, OMX_STATETYPE* state) {
209 Parcel data, reply;
210 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700211 data.writeInt32((int32_t)node);
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700212 remote()->transact(GET_STATE, data, &reply);
213
214 *state = static_cast<OMX_STATETYPE>(reply.readInt32());
215 return reply.readInt32();
216 }
217
Jamie Gennis83750ea2010-08-30 16:48:38 -0700218 virtual status_t enableGraphicBuffers(
219 node_id node, OMX_U32 port_index, OMX_BOOL enable) {
220 Parcel data, reply;
221 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700222 data.writeInt32((int32_t)node);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700223 data.writeInt32(port_index);
224 data.writeInt32((uint32_t)enable);
225 remote()->transact(ENABLE_GRAPHIC_BUFFERS, data, &reply);
226
227 status_t err = reply.readInt32();
228 return err;
229 }
230
Jamie Gennise2ce6452011-02-23 19:01:28 -0800231 virtual status_t getGraphicBufferUsage(
232 node_id node, OMX_U32 port_index, OMX_U32* usage) {
233 Parcel data, reply;
234 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700235 data.writeInt32((int32_t)node);
Jamie Gennise2ce6452011-02-23 19:01:28 -0800236 data.writeInt32(port_index);
237 remote()->transact(GET_GRAPHIC_BUFFER_USAGE, data, &reply);
238
239 status_t err = reply.readInt32();
240 *usage = reply.readInt32();
241 return err;
242 }
243
Andreas Huber318ad9c2009-10-15 13:46:54 -0700244 virtual status_t useBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700245 node_id node, OMX_U32 port_index, const sp<IMemory> &params,
246 buffer_id *buffer) {
247 Parcel data, reply;
248 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700249 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700250 data.writeInt32(port_index);
Marco Nelissenf8880202014-11-14 07:58:25 -0800251 data.writeStrongBinder(IInterface::asBinder(params));
Andreas Huber20111aa2009-07-14 16:56:47 -0700252 remote()->transact(USE_BUFFER, data, &reply);
253
254 status_t err = reply.readInt32();
255 if (err != OK) {
256 *buffer = 0;
257
258 return err;
259 }
260
Andy Hung609b8152014-05-02 11:05:04 -0700261 *buffer = (buffer_id)reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700262
263 return err;
264 }
265
Jamie Gennis83750ea2010-08-30 16:48:38 -0700266
267 virtual status_t useGraphicBuffer(
268 node_id node, OMX_U32 port_index,
269 const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) {
270 Parcel data, reply;
271 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700272 data.writeInt32((int32_t)node);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700273 data.writeInt32(port_index);
274 data.write(*graphicBuffer);
275 remote()->transact(USE_GRAPHIC_BUFFER, data, &reply);
276
277 status_t err = reply.readInt32();
278 if (err != OK) {
279 *buffer = 0;
280
281 return err;
282 }
283
Andy Hung609b8152014-05-02 11:05:04 -0700284 *buffer = (buffer_id)reply.readInt32();
Jamie Gennis83750ea2010-08-30 16:48:38 -0700285
286 return err;
287 }
288
Lajos Molnard0715862013-07-22 12:57:43 -0700289 virtual status_t updateGraphicBufferInMeta(
290 node_id node, OMX_U32 port_index,
291 const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer) {
292 Parcel data, reply;
293 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700294 data.writeInt32((int32_t)node);
Lajos Molnard0715862013-07-22 12:57:43 -0700295 data.writeInt32(port_index);
296 data.write(*graphicBuffer);
Andy Hung609b8152014-05-02 11:05:04 -0700297 data.writeInt32((int32_t)buffer);
Lajos Molnard0715862013-07-22 12:57:43 -0700298 remote()->transact(UPDATE_GRAPHIC_BUFFER_IN_META, data, &reply);
299
300 status_t err = reply.readInt32();
301 return err;
302 }
303
Andy McFadden7cd58532013-02-19 07:28:30 -0800304 virtual status_t createInputSurface(
305 node_id node, OMX_U32 port_index,
306 sp<IGraphicBufferProducer> *bufferProducer) {
307 Parcel data, reply;
308 status_t err;
309 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700310 data.writeInt32((int32_t)node);
Andy McFadden7cd58532013-02-19 07:28:30 -0800311 data.writeInt32(port_index);
312 err = remote()->transact(CREATE_INPUT_SURFACE, data, &reply);
313 if (err != OK) {
314 ALOGW("binder transaction failed: %d", err);
315 return err;
316 }
317
318 err = reply.readInt32();
319 if (err != OK) {
320 return err;
321 }
322
323 *bufferProducer = IGraphicBufferProducer::asInterface(
324 reply.readStrongBinder());
325
326 return err;
327 }
328
329 virtual status_t signalEndOfInputStream(node_id node) {
330 Parcel data, reply;
331 status_t err;
332 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700333 data.writeInt32((int32_t)node);
Andy McFadden7cd58532013-02-19 07:28:30 -0800334 err = remote()->transact(SIGNAL_END_OF_INPUT_STREAM, data, &reply);
335 if (err != OK) {
336 ALOGW("binder transaction failed: %d", err);
337 return err;
338 }
339
340 return reply.readInt32();
341 }
342
James Donge8707722010-10-20 17:38:41 -0700343 virtual status_t storeMetaDataInBuffers(
344 node_id node, OMX_U32 port_index, OMX_BOOL enable) {
345 Parcel data, reply;
346 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700347 data.writeInt32((int32_t)node);
James Donge8707722010-10-20 17:38:41 -0700348 data.writeInt32(port_index);
349 data.writeInt32((uint32_t)enable);
350 remote()->transact(STORE_META_DATA_IN_BUFFERS, data, &reply);
351
352 status_t err = reply.readInt32();
353 return err;
354 }
355
Lajos Molnar56ce7262013-05-02 16:30:48 -0700356 virtual status_t prepareForAdaptivePlayback(
357 node_id node, OMX_U32 port_index, OMX_BOOL enable,
358 OMX_U32 max_width, OMX_U32 max_height) {
359 Parcel data, reply;
360 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700361 data.writeInt32((int32_t)node);
Lajos Molnar56ce7262013-05-02 16:30:48 -0700362 data.writeInt32(port_index);
363 data.writeInt32((int32_t)enable);
364 data.writeInt32(max_width);
365 data.writeInt32(max_height);
366 remote()->transact(PREPARE_FOR_ADAPTIVE_PLAYBACK, data, &reply);
367
368 status_t err = reply.readInt32();
369 return err;
370 }
371
Rachad5a446aa2014-07-29 16:47:56 -0700372 virtual status_t configureVideoTunnelMode(
373 node_id node, OMX_U32 portIndex, OMX_BOOL tunneled,
374 OMX_U32 audioHwSync, native_handle_t **sidebandHandle ) {
375 Parcel data, reply;
376 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
377 data.writeInt32((int32_t)node);
378 data.writeInt32(portIndex);
379 data.writeInt32((int32_t)tunneled);
380 data.writeInt32(audioHwSync);
381 remote()->transact(CONFIGURE_VIDEO_TUNNEL_MODE, data, &reply);
382
383 status_t err = reply.readInt32();
mspector@google.com9d72eb02016-02-08 10:56:13 -0800384 if (err == OK && sidebandHandle) {
Rachad5a446aa2014-07-29 16:47:56 -0700385 *sidebandHandle = (native_handle_t *)reply.readNativeHandle();
386 }
387 return err;
388 }
389
390
Andreas Huber318ad9c2009-10-15 13:46:54 -0700391 virtual status_t allocateBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700392 node_id node, OMX_U32 port_index, size_t size,
Andreas Huber570a3cb2010-01-20 15:05:46 -0800393 buffer_id *buffer, void **buffer_data) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700394 Parcel data, reply;
395 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700396 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700397 data.writeInt32(port_index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800398 data.writeInt64(size);
Andreas Huber20111aa2009-07-14 16:56:47 -0700399 remote()->transact(ALLOC_BUFFER, data, &reply);
400
401 status_t err = reply.readInt32();
402 if (err != OK) {
403 *buffer = 0;
404
405 return err;
406 }
407
Andy Hung609b8152014-05-02 11:05:04 -0700408 *buffer = (buffer_id)reply.readInt32();
409 *buffer_data = (void *)reply.readInt64();
Andreas Huber20111aa2009-07-14 16:56:47 -0700410
411 return err;
412 }
413
Andreas Huber318ad9c2009-10-15 13:46:54 -0700414 virtual status_t allocateBufferWithBackup(
Andreas Huber20111aa2009-07-14 16:56:47 -0700415 node_id node, OMX_U32 port_index, const sp<IMemory> &params,
416 buffer_id *buffer) {
417 Parcel data, reply;
418 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700419 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700420 data.writeInt32(port_index);
Marco Nelissenf8880202014-11-14 07:58:25 -0800421 data.writeStrongBinder(IInterface::asBinder(params));
Andreas Huber20111aa2009-07-14 16:56:47 -0700422 remote()->transact(ALLOC_BUFFER_WITH_BACKUP, data, &reply);
423
424 status_t err = reply.readInt32();
425 if (err != OK) {
426 *buffer = 0;
427
428 return err;
429 }
430
Andy Hung609b8152014-05-02 11:05:04 -0700431 *buffer = (buffer_id)reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700432
433 return err;
434 }
435
Andreas Huber318ad9c2009-10-15 13:46:54 -0700436 virtual status_t freeBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700437 node_id node, OMX_U32 port_index, buffer_id buffer) {
438 Parcel data, reply;
439 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700440 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700441 data.writeInt32(port_index);
Andy Hung609b8152014-05-02 11:05:04 -0700442 data.writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700443 remote()->transact(FREE_BUFFER, data, &reply);
444
445 return reply.readInt32();
446 }
447
Andreas Huber318ad9c2009-10-15 13:46:54 -0700448 virtual status_t fillBuffer(node_id node, buffer_id buffer) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700449 Parcel data, reply;
450 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700451 data.writeInt32((int32_t)node);
452 data.writeInt32((int32_t)buffer);
Andreas Huber36efa032009-10-08 11:02:27 -0700453 remote()->transact(FILL_BUFFER, data, &reply);
454
455 return reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700456 }
457
Andreas Huber318ad9c2009-10-15 13:46:54 -0700458 virtual status_t emptyBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700459 node_id node,
460 buffer_id buffer,
461 OMX_U32 range_offset, OMX_U32 range_length,
462 OMX_U32 flags, OMX_TICKS timestamp) {
463 Parcel data, reply;
464 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700465 data.writeInt32((int32_t)node);
466 data.writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700467 data.writeInt32(range_offset);
468 data.writeInt32(range_length);
469 data.writeInt32(flags);
470 data.writeInt64(timestamp);
Andreas Huber36efa032009-10-08 11:02:27 -0700471 remote()->transact(EMPTY_BUFFER, data, &reply);
472
473 return reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700474 }
Andreas Huber8b938cd2009-07-31 11:52:50 -0700475
Andreas Huber318ad9c2009-10-15 13:46:54 -0700476 virtual status_t getExtensionIndex(
Andreas Huber693d2712009-08-14 14:37:10 -0700477 node_id node,
478 const char *parameter_name,
479 OMX_INDEXTYPE *index) {
480 Parcel data, reply;
481 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700482 data.writeInt32((int32_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700483 data.writeCString(parameter_name);
484
485 remote()->transact(GET_EXTENSION_INDEX, data, &reply);
486
487 status_t err = reply.readInt32();
488 if (err == OK) {
489 *index = static_cast<OMX_INDEXTYPE>(reply.readInt32());
490 } else {
491 *index = OMX_IndexComponentStartUnused;
492 }
493
494 return err;
495 }
Andreas Hubere40cda72013-07-17 13:55:26 -0700496
497 virtual status_t setInternalOption(
498 node_id node,
499 OMX_U32 port_index,
500 InternalOptionType type,
501 const void *optionData,
502 size_t size) {
503 Parcel data, reply;
504 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700505 data.writeInt32((int32_t)node);
Andreas Hubere40cda72013-07-17 13:55:26 -0700506 data.writeInt32(port_index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800507 data.writeInt64(size);
Andreas Hubere40cda72013-07-17 13:55:26 -0700508 data.write(optionData, size);
509 data.writeInt32(type);
510 remote()->transact(SET_INTERNAL_OPTION, data, &reply);
511
512 return reply.readInt32();
513 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700514};
515
516IMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX");
517
518////////////////////////////////////////////////////////////////////////////////
519
Andy McFadden7cd58532013-02-19 07:28:30 -0800520#define CHECK_OMX_INTERFACE(interface, data, reply) \
Andreas Huber20111aa2009-07-14 16:56:47 -0700521 do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \
Steve Block5ff1dd52012-01-05 23:22:43 +0000522 ALOGW("Call incorrectly routed to " #interface); \
Andreas Huber20111aa2009-07-14 16:56:47 -0700523 return PERMISSION_DENIED; \
524 } } while (0)
525
526status_t BnOMX::onTransact(
527 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
528 switch (code) {
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800529 case LIVES_LOCALLY:
530 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800531 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andy Hung609b8152014-05-02 11:05:04 -0700532 node_id node = (node_id)data.readInt32();
Andreas Huberd459b482012-01-31 11:16:24 -0800533 pid_t pid = (pid_t)data.readInt32();
534 reply->writeInt32(livesLocally(node, pid));
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800535
536 return OK;
537 }
538
Andreas Huber20111aa2009-07-14 16:56:47 -0700539 case LIST_NODES:
540 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800541 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700542
Andreas Huber134ee6a2009-12-16 09:30:55 -0800543 List<ComponentInfo> list;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700544 listNodes(&list);
Andreas Huber20111aa2009-07-14 16:56:47 -0700545
546 reply->writeInt32(list.size());
Andreas Huber134ee6a2009-12-16 09:30:55 -0800547 for (List<ComponentInfo>::iterator it = list.begin();
Andreas Huber20111aa2009-07-14 16:56:47 -0700548 it != list.end(); ++it) {
Andreas Huber134ee6a2009-12-16 09:30:55 -0800549 ComponentInfo &cur = *it;
550
551 reply->writeString8(cur.mName);
552 reply->writeInt32(cur.mRoles.size());
553 for (List<String8>::iterator role_it = cur.mRoles.begin();
554 role_it != cur.mRoles.end(); ++role_it) {
555 reply->writeString8(*role_it);
556 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700557 }
558
559 return NO_ERROR;
560 }
561
562 case ALLOCATE_NODE:
563 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800564 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700565
Andreas Huber318ad9c2009-10-15 13:46:54 -0700566 const char *name = data.readCString();
567
568 sp<IOMXObserver> observer =
569 interface_cast<IOMXObserver>(data.readStrongBinder());
570
Andreas Huber20111aa2009-07-14 16:56:47 -0700571 node_id node;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700572
573 status_t err = allocateNode(name, observer, &node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700574 reply->writeInt32(err);
575 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700576 reply->writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700577 }
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800578
Andreas Huber20111aa2009-07-14 16:56:47 -0700579 return NO_ERROR;
580 }
581
582 case FREE_NODE:
583 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800584 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700585
Andy Hung609b8152014-05-02 11:05:04 -0700586 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700587
Andreas Huber318ad9c2009-10-15 13:46:54 -0700588 reply->writeInt32(freeNode(node));
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800589
Andreas Huber20111aa2009-07-14 16:56:47 -0700590 return NO_ERROR;
591 }
592
593 case SEND_COMMAND:
594 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800595 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700596
Andy Hung609b8152014-05-02 11:05:04 -0700597 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700598
599 OMX_COMMANDTYPE cmd =
600 static_cast<OMX_COMMANDTYPE>(data.readInt32());
601
602 OMX_S32 param = data.readInt32();
Andreas Huber318ad9c2009-10-15 13:46:54 -0700603 reply->writeInt32(sendCommand(node, cmd, param));
Andreas Huber20111aa2009-07-14 16:56:47 -0700604
605 return NO_ERROR;
606 }
607
608 case GET_PARAMETER:
Andreas Huber20111aa2009-07-14 16:56:47 -0700609 case SET_PARAMETER:
Andreas Huber693d2712009-08-14 14:37:10 -0700610 case GET_CONFIG:
Andreas Huber693d2712009-08-14 14:37:10 -0700611 case SET_CONFIG:
Andreas Hubere40cda72013-07-17 13:55:26 -0700612 case SET_INTERNAL_OPTION:
Andreas Huber693d2712009-08-14 14:37:10 -0700613 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800614 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber693d2712009-08-14 14:37:10 -0700615
Andy Hung609b8152014-05-02 11:05:04 -0700616 node_id node = (node_id)data.readInt32();
Andreas Huber693d2712009-08-14 14:37:10 -0700617 OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
618
Glenn Kastene03dd222014-01-28 11:04:39 -0800619 size_t size = data.readInt64();
Andreas Huber693d2712009-08-14 14:37:10 -0700620
Marco Nelissenf7a38822016-02-22 13:05:15 -0800621 status_t err = NO_MEMORY;
622 void *params = calloc(size, 1);
623 if (params) {
624 err = data.read(params, size);
625 if (err != OK) {
626 android_errorWriteLog(0x534e4554, "26914474");
627 } else {
628 switch (code) {
629 case GET_PARAMETER:
630 err = getParameter(node, index, params, size);
631 break;
632 case SET_PARAMETER:
633 err = setParameter(node, index, params, size);
634 break;
635 case GET_CONFIG:
636 err = getConfig(node, index, params, size);
637 break;
638 case SET_CONFIG:
639 err = setConfig(node, index, params, size);
640 break;
641 case SET_INTERNAL_OPTION:
642 {
643 InternalOptionType type =
644 (InternalOptionType)data.readInt32();
Andreas Huberb3912902011-01-19 10:34:52 -0800645
Marco Nelissenf7a38822016-02-22 13:05:15 -0800646 err = setInternalOption(node, index, type, params, size);
647 break;
648 }
Andreas Hubere40cda72013-07-17 13:55:26 -0700649
Marco Nelissenf7a38822016-02-22 13:05:15 -0800650 default:
651 TRESPASS();
652 }
Andreas Hubere40cda72013-07-17 13:55:26 -0700653 }
Andreas Huberb3912902011-01-19 10:34:52 -0800654 }
655
656 reply->writeInt32(err);
657
658 if ((code == GET_PARAMETER || code == GET_CONFIG) && err == OK) {
659 reply->write(params, size);
660 }
661
662 free(params);
663 params = NULL;
Andreas Huber693d2712009-08-14 14:37:10 -0700664
665 return NO_ERROR;
666 }
667
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700668 case GET_STATE:
669 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800670 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700671
Andy Hung609b8152014-05-02 11:05:04 -0700672 node_id node = (node_id)data.readInt32();
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700673 OMX_STATETYPE state = OMX_StateInvalid;
674
675 status_t err = getState(node, &state);
676 reply->writeInt32(state);
677 reply->writeInt32(err);
678
679 return NO_ERROR;
680 }
681
Jamie Gennis83750ea2010-08-30 16:48:38 -0700682 case ENABLE_GRAPHIC_BUFFERS:
683 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800684 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700685
Andy Hung609b8152014-05-02 11:05:04 -0700686 node_id node = (node_id)data.readInt32();
Jamie Gennis83750ea2010-08-30 16:48:38 -0700687 OMX_U32 port_index = data.readInt32();
688 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
689
690 status_t err = enableGraphicBuffers(node, port_index, enable);
691 reply->writeInt32(err);
692
693 return NO_ERROR;
694 }
695
Jamie Gennise2ce6452011-02-23 19:01:28 -0800696 case GET_GRAPHIC_BUFFER_USAGE:
697 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800698 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennise2ce6452011-02-23 19:01:28 -0800699
Andy Hung609b8152014-05-02 11:05:04 -0700700 node_id node = (node_id)data.readInt32();
Jamie Gennise2ce6452011-02-23 19:01:28 -0800701 OMX_U32 port_index = data.readInt32();
702
703 OMX_U32 usage = 0;
704 status_t err = getGraphicBufferUsage(node, port_index, &usage);
705 reply->writeInt32(err);
706 reply->writeInt32(usage);
707
708 return NO_ERROR;
709 }
710
Andreas Huber20111aa2009-07-14 16:56:47 -0700711 case USE_BUFFER:
712 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800713 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700714
Andy Hung609b8152014-05-02 11:05:04 -0700715 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700716 OMX_U32 port_index = data.readInt32();
717 sp<IMemory> params =
718 interface_cast<IMemory>(data.readStrongBinder());
719
720 buffer_id buffer;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700721 status_t err = useBuffer(node, port_index, params, &buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700722 reply->writeInt32(err);
723
724 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700725 reply->writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700726 }
727
728 return NO_ERROR;
729 }
730
Jamie Gennis83750ea2010-08-30 16:48:38 -0700731 case USE_GRAPHIC_BUFFER:
732 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800733 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700734
Andy Hung609b8152014-05-02 11:05:04 -0700735 node_id node = (node_id)data.readInt32();
Jamie Gennis83750ea2010-08-30 16:48:38 -0700736 OMX_U32 port_index = data.readInt32();
737 sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
738 data.read(*graphicBuffer);
739
740 buffer_id buffer;
741 status_t err = useGraphicBuffer(
742 node, port_index, graphicBuffer, &buffer);
743 reply->writeInt32(err);
744
745 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700746 reply->writeInt32((int32_t)buffer);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700747 }
748
749 return NO_ERROR;
750 }
751
Lajos Molnard0715862013-07-22 12:57:43 -0700752 case UPDATE_GRAPHIC_BUFFER_IN_META:
753 {
754 CHECK_OMX_INTERFACE(IOMX, data, reply);
755
Andy Hung609b8152014-05-02 11:05:04 -0700756 node_id node = (node_id)data.readInt32();
Lajos Molnard0715862013-07-22 12:57:43 -0700757 OMX_U32 port_index = data.readInt32();
758 sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
759 data.read(*graphicBuffer);
Andy Hung609b8152014-05-02 11:05:04 -0700760 buffer_id buffer = (buffer_id)data.readInt32();
Lajos Molnard0715862013-07-22 12:57:43 -0700761
762 status_t err = updateGraphicBufferInMeta(
763 node, port_index, graphicBuffer, buffer);
764 reply->writeInt32(err);
765
766 return NO_ERROR;
767 }
768
Andy McFadden7cd58532013-02-19 07:28:30 -0800769 case CREATE_INPUT_SURFACE:
770 {
771 CHECK_OMX_INTERFACE(IOMX, data, reply);
772
Andy Hung609b8152014-05-02 11:05:04 -0700773 node_id node = (node_id)data.readInt32();
Andy McFadden7cd58532013-02-19 07:28:30 -0800774 OMX_U32 port_index = data.readInt32();
775
776 sp<IGraphicBufferProducer> bufferProducer;
777 status_t err = createInputSurface(node, port_index,
778 &bufferProducer);
779
780 reply->writeInt32(err);
781
782 if (err == OK) {
Marco Nelissenf8880202014-11-14 07:58:25 -0800783 reply->writeStrongBinder(IInterface::asBinder(bufferProducer));
Andy McFadden7cd58532013-02-19 07:28:30 -0800784 }
785
786 return NO_ERROR;
787 }
788
789 case SIGNAL_END_OF_INPUT_STREAM:
790 {
791 CHECK_OMX_INTERFACE(IOMX, data, reply);
792
Andy Hung609b8152014-05-02 11:05:04 -0700793 node_id node = (node_id)data.readInt32();
Andy McFadden7cd58532013-02-19 07:28:30 -0800794
795 status_t err = signalEndOfInputStream(node);
796 reply->writeInt32(err);
797
798 return NO_ERROR;
799 }
800
James Donge8707722010-10-20 17:38:41 -0700801 case STORE_META_DATA_IN_BUFFERS:
802 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800803 CHECK_OMX_INTERFACE(IOMX, data, reply);
James Donge8707722010-10-20 17:38:41 -0700804
Andy Hung609b8152014-05-02 11:05:04 -0700805 node_id node = (node_id)data.readInt32();
James Donge8707722010-10-20 17:38:41 -0700806 OMX_U32 port_index = data.readInt32();
807 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
808
809 status_t err = storeMetaDataInBuffers(node, port_index, enable);
810 reply->writeInt32(err);
811
812 return NO_ERROR;
813 }
814
Lajos Molnar56ce7262013-05-02 16:30:48 -0700815 case PREPARE_FOR_ADAPTIVE_PLAYBACK:
816 {
817 CHECK_OMX_INTERFACE(IOMX, data, reply);
818
Andy Hung609b8152014-05-02 11:05:04 -0700819 node_id node = (node_id)data.readInt32();
Lajos Molnar56ce7262013-05-02 16:30:48 -0700820 OMX_U32 port_index = data.readInt32();
821 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
822 OMX_U32 max_width = data.readInt32();
823 OMX_U32 max_height = data.readInt32();
824
825 status_t err = prepareForAdaptivePlayback(
826 node, port_index, enable, max_width, max_height);
827 reply->writeInt32(err);
828
829 return NO_ERROR;
830 }
831
Rachad5a446aa2014-07-29 16:47:56 -0700832 case CONFIGURE_VIDEO_TUNNEL_MODE:
833 {
834 CHECK_OMX_INTERFACE(IOMX, data, reply);
835
836 node_id node = (node_id)data.readInt32();
837 OMX_U32 port_index = data.readInt32();
838 OMX_BOOL tunneled = (OMX_BOOL)data.readInt32();
839 OMX_U32 audio_hw_sync = data.readInt32();
840
mspector@google.com9d72eb02016-02-08 10:56:13 -0800841 native_handle_t *sideband_handle = NULL;
Rachad5a446aa2014-07-29 16:47:56 -0700842 status_t err = configureVideoTunnelMode(
843 node, port_index, tunneled, audio_hw_sync, &sideband_handle);
844 reply->writeInt32(err);
mspector@google.com9d72eb02016-02-08 10:56:13 -0800845 if(err == OK){
846 reply->writeNativeHandle(sideband_handle);
847 }
Rachad5a446aa2014-07-29 16:47:56 -0700848
849 return NO_ERROR;
850 }
851
Andreas Huber20111aa2009-07-14 16:56:47 -0700852 case ALLOC_BUFFER:
853 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800854 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700855
Andy Hung609b8152014-05-02 11:05:04 -0700856 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700857 OMX_U32 port_index = data.readInt32();
Wei Jia24825952015-09-28 11:32:23 -0700858 if (!isSecure(node) || port_index != 0 /* kPortIndexInput */) {
859 ALOGE("b/24310423");
860 reply->writeInt32(INVALID_OPERATION);
861 return NO_ERROR;
862 }
863
Glenn Kastene03dd222014-01-28 11:04:39 -0800864 size_t size = data.readInt64();
Andreas Huber20111aa2009-07-14 16:56:47 -0700865
866 buffer_id buffer;
Andreas Huber570a3cb2010-01-20 15:05:46 -0800867 void *buffer_data;
868 status_t err = allocateBuffer(
869 node, port_index, size, &buffer, &buffer_data);
Andreas Huber20111aa2009-07-14 16:56:47 -0700870 reply->writeInt32(err);
871
872 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700873 reply->writeInt32((int32_t)buffer);
874 reply->writeInt64((uintptr_t)buffer_data);
Andreas Huber20111aa2009-07-14 16:56:47 -0700875 }
876
877 return NO_ERROR;
878 }
879
880 case ALLOC_BUFFER_WITH_BACKUP:
881 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800882 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700883
Andy Hung609b8152014-05-02 11:05:04 -0700884 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700885 OMX_U32 port_index = data.readInt32();
886 sp<IMemory> params =
887 interface_cast<IMemory>(data.readStrongBinder());
888
889 buffer_id buffer;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700890 status_t err = allocateBufferWithBackup(
Andreas Huber20111aa2009-07-14 16:56:47 -0700891 node, port_index, params, &buffer);
892
893 reply->writeInt32(err);
894
895 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700896 reply->writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700897 }
898
899 return NO_ERROR;
900 }
901
902 case FREE_BUFFER:
903 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800904 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700905
Andy Hung609b8152014-05-02 11:05:04 -0700906 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700907 OMX_U32 port_index = data.readInt32();
Andy Hung609b8152014-05-02 11:05:04 -0700908 buffer_id buffer = (buffer_id)data.readInt32();
Andreas Huber318ad9c2009-10-15 13:46:54 -0700909 reply->writeInt32(freeBuffer(node, port_index, buffer));
Andreas Huber20111aa2009-07-14 16:56:47 -0700910
911 return NO_ERROR;
912 }
913
914 case FILL_BUFFER:
915 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800916 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700917
Andy Hung609b8152014-05-02 11:05:04 -0700918 node_id node = (node_id)data.readInt32();
919 buffer_id buffer = (buffer_id)data.readInt32();
Andreas Huber318ad9c2009-10-15 13:46:54 -0700920 reply->writeInt32(fillBuffer(node, buffer));
Andreas Huber20111aa2009-07-14 16:56:47 -0700921
922 return NO_ERROR;
923 }
924
925 case EMPTY_BUFFER:
926 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800927 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700928
Andy Hung609b8152014-05-02 11:05:04 -0700929 node_id node = (node_id)data.readInt32();
930 buffer_id buffer = (buffer_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700931 OMX_U32 range_offset = data.readInt32();
932 OMX_U32 range_length = data.readInt32();
933 OMX_U32 flags = data.readInt32();
934 OMX_TICKS timestamp = data.readInt64();
935
Andreas Huber36efa032009-10-08 11:02:27 -0700936 reply->writeInt32(
Andreas Huber318ad9c2009-10-15 13:46:54 -0700937 emptyBuffer(
Andreas Huber36efa032009-10-08 11:02:27 -0700938 node, buffer, range_offset, range_length,
939 flags, timestamp));
Andreas Huber20111aa2009-07-14 16:56:47 -0700940
941 return NO_ERROR;
942 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700943
Andreas Huber693d2712009-08-14 14:37:10 -0700944 case GET_EXTENSION_INDEX:
945 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800946 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber693d2712009-08-14 14:37:10 -0700947
Andy Hung609b8152014-05-02 11:05:04 -0700948 node_id node = (node_id)data.readInt32();
Andreas Huber693d2712009-08-14 14:37:10 -0700949 const char *parameter_name = data.readCString();
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800950
Andreas Huber693d2712009-08-14 14:37:10 -0700951 OMX_INDEXTYPE index;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700952 status_t err = getExtensionIndex(node, parameter_name, &index);
Andreas Huber693d2712009-08-14 14:37:10 -0700953
954 reply->writeInt32(err);
955
956 if (err == OK) {
957 reply->writeInt32(index);
958 }
959
960 return OK;
961 }
962
Andreas Huber20111aa2009-07-14 16:56:47 -0700963 default:
964 return BBinder::onTransact(code, data, reply, flags);
965 }
966}
967
968////////////////////////////////////////////////////////////////////////////////
969
970class BpOMXObserver : public BpInterface<IOMXObserver> {
971public:
972 BpOMXObserver(const sp<IBinder> &impl)
973 : BpInterface<IOMXObserver>(impl) {
974 }
975
Andreas Huber318ad9c2009-10-15 13:46:54 -0700976 virtual void onMessage(const omx_message &msg) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700977 Parcel data, reply;
978 data.writeInterfaceToken(IOMXObserver::getInterfaceDescriptor());
979 data.write(&msg, sizeof(msg));
980
Andy Hung609b8152014-05-02 11:05:04 -0700981 ALOGV("onMessage writing message %d, size %zu", msg.type, sizeof(msg));
982
Andreas Huber20111aa2009-07-14 16:56:47 -0700983 remote()->transact(OBSERVER_ON_MSG, data, &reply, IBinder::FLAG_ONEWAY);
984 }
985};
986
987IMPLEMENT_META_INTERFACE(OMXObserver, "android.hardware.IOMXObserver");
988
989status_t BnOMXObserver::onTransact(
990 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
991 switch (code) {
992 case OBSERVER_ON_MSG:
993 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800994 CHECK_OMX_INTERFACE(IOMXObserver, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700995
996 omx_message msg;
997 data.read(&msg, sizeof(msg));
998
Andy Hung609b8152014-05-02 11:05:04 -0700999 ALOGV("onTransact reading message %d, size %zu", msg.type, sizeof(msg));
1000
Andreas Huber20111aa2009-07-14 16:56:47 -07001001 // XXX Could use readInplace maybe?
Andreas Huber318ad9c2009-10-15 13:46:54 -07001002 onMessage(msg);
Andreas Huber20111aa2009-07-14 16:56:47 -07001003
1004 return NO_ERROR;
1005 }
1006
1007 default:
1008 return BBinder::onTransact(code, data, reply, flags);
1009 }
1010}
1011
Andreas Huber20111aa2009-07-14 16:56:47 -07001012} // namespace android