blob: 5df232fb3b6e3aa33b48f3ba9b2df279e87b7b26 [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,
Andreas Huber20111aa2009-07-14 16:56:47 -070057};
58
Andreas Huber20111aa2009-07-14 16:56:47 -070059class BpOMX : public BpInterface<IOMX> {
60public:
61 BpOMX(const sp<IBinder> &impl)
62 : BpInterface<IOMX>(impl) {
63 }
64
Andreas Huberd459b482012-01-31 11:16:24 -080065 virtual bool livesLocally(node_id node, pid_t pid) {
Andreas Huber7eaa9c92010-01-15 15:28:19 -080066 Parcel data, reply;
67 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -070068 data.writeInt32((int32_t)node);
Andreas Huber7eaa9c92010-01-15 15:28:19 -080069 data.writeInt32(pid);
70 remote()->transact(LIVES_LOCALLY, data, &reply);
71
72 return reply.readInt32() != 0;
73 }
74
Andreas Huber134ee6a2009-12-16 09:30:55 -080075 virtual status_t listNodes(List<ComponentInfo> *list) {
Andreas Huber20111aa2009-07-14 16:56:47 -070076 list->clear();
77
78 Parcel data, reply;
79 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
80 remote()->transact(LIST_NODES, data, &reply);
81
82 int32_t n = reply.readInt32();
83 for (int32_t i = 0; i < n; ++i) {
Andreas Huber134ee6a2009-12-16 09:30:55 -080084 list->push_back(ComponentInfo());
85 ComponentInfo &info = *--list->end();
Andreas Huber20111aa2009-07-14 16:56:47 -070086
Andreas Huber134ee6a2009-12-16 09:30:55 -080087 info.mName = reply.readString8();
88 int32_t numRoles = reply.readInt32();
89 for (int32_t j = 0; j < numRoles; ++j) {
90 info.mRoles.push_back(reply.readString8());
91 }
Andreas Huber20111aa2009-07-14 16:56:47 -070092 }
93
94 return OK;
95 }
96
Andreas Huber318ad9c2009-10-15 13:46:54 -070097 virtual status_t allocateNode(
98 const char *name, const sp<IOMXObserver> &observer, node_id *node) {
Andreas Huber20111aa2009-07-14 16:56:47 -070099 Parcel data, reply;
100 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
101 data.writeCString(name);
Andreas Huber318ad9c2009-10-15 13:46:54 -0700102 data.writeStrongBinder(observer->asBinder());
Andreas Huber20111aa2009-07-14 16:56:47 -0700103 remote()->transact(ALLOCATE_NODE, data, &reply);
104
105 status_t err = reply.readInt32();
106 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700107 *node = (node_id)reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700108 } else {
109 *node = 0;
110 }
111
112 return err;
113 }
114
Andreas Huber318ad9c2009-10-15 13:46:54 -0700115 virtual status_t freeNode(node_id node) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700116 Parcel data, reply;
117 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700118 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700119 remote()->transact(FREE_NODE, data, &reply);
120
121 return reply.readInt32();
122 }
123
Andreas Huber318ad9c2009-10-15 13:46:54 -0700124 virtual status_t sendCommand(
Andreas Huber20111aa2009-07-14 16:56:47 -0700125 node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) {
126 Parcel data, reply;
127 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700128 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700129 data.writeInt32(cmd);
130 data.writeInt32(param);
131 remote()->transact(SEND_COMMAND, data, &reply);
132
133 return reply.readInt32();
134 }
135
Andreas Huber318ad9c2009-10-15 13:46:54 -0700136 virtual status_t getParameter(
Andreas Huber20111aa2009-07-14 16:56:47 -0700137 node_id node, OMX_INDEXTYPE index,
138 void *params, size_t size) {
139 Parcel data, reply;
140 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700141 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700142 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800143 data.writeInt64(size);
Andreas Huber20111aa2009-07-14 16:56:47 -0700144 data.write(params, size);
145 remote()->transact(GET_PARAMETER, data, &reply);
146
147 status_t err = reply.readInt32();
148 if (err != OK) {
149 return err;
150 }
151
152 reply.read(params, size);
153
154 return OK;
155 }
156
Andreas Huber318ad9c2009-10-15 13:46:54 -0700157 virtual status_t setParameter(
Andreas Huber20111aa2009-07-14 16:56:47 -0700158 node_id node, OMX_INDEXTYPE index,
159 const void *params, size_t size) {
160 Parcel data, reply;
161 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700162 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700163 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800164 data.writeInt64(size);
Andreas Huber20111aa2009-07-14 16:56:47 -0700165 data.write(params, size);
166 remote()->transact(SET_PARAMETER, data, &reply);
167
168 return reply.readInt32();
169 }
170
Andreas Huber318ad9c2009-10-15 13:46:54 -0700171 virtual status_t getConfig(
Andreas Huber693d2712009-08-14 14:37:10 -0700172 node_id node, OMX_INDEXTYPE index,
173 void *params, size_t size) {
174 Parcel data, reply;
175 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700176 data.writeInt32((int32_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700177 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800178 data.writeInt64(size);
Andreas Huber693d2712009-08-14 14:37:10 -0700179 data.write(params, size);
180 remote()->transact(GET_CONFIG, data, &reply);
181
182 status_t err = reply.readInt32();
183 if (err != OK) {
184 return err;
185 }
186
187 reply.read(params, size);
188
189 return OK;
190 }
191
Andreas Huber318ad9c2009-10-15 13:46:54 -0700192 virtual status_t setConfig(
Andreas Huber693d2712009-08-14 14:37:10 -0700193 node_id node, OMX_INDEXTYPE index,
194 const void *params, size_t size) {
195 Parcel data, reply;
196 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700197 data.writeInt32((int32_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700198 data.writeInt32(index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800199 data.writeInt64(size);
Andreas Huber693d2712009-08-14 14:37:10 -0700200 data.write(params, size);
201 remote()->transact(SET_CONFIG, data, &reply);
202
203 return reply.readInt32();
204 }
205
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700206 virtual status_t getState(
207 node_id node, OMX_STATETYPE* state) {
208 Parcel data, reply;
209 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700210 data.writeInt32((int32_t)node);
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700211 remote()->transact(GET_STATE, data, &reply);
212
213 *state = static_cast<OMX_STATETYPE>(reply.readInt32());
214 return reply.readInt32();
215 }
216
Jamie Gennis83750ea2010-08-30 16:48:38 -0700217 virtual status_t enableGraphicBuffers(
218 node_id node, OMX_U32 port_index, OMX_BOOL enable) {
219 Parcel data, reply;
220 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700221 data.writeInt32((int32_t)node);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700222 data.writeInt32(port_index);
223 data.writeInt32((uint32_t)enable);
224 remote()->transact(ENABLE_GRAPHIC_BUFFERS, data, &reply);
225
226 status_t err = reply.readInt32();
227 return err;
228 }
229
Jamie Gennise2ce6452011-02-23 19:01:28 -0800230 virtual status_t getGraphicBufferUsage(
231 node_id node, OMX_U32 port_index, OMX_U32* usage) {
232 Parcel data, reply;
233 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700234 data.writeInt32((int32_t)node);
Jamie Gennise2ce6452011-02-23 19:01:28 -0800235 data.writeInt32(port_index);
236 remote()->transact(GET_GRAPHIC_BUFFER_USAGE, data, &reply);
237
238 status_t err = reply.readInt32();
239 *usage = reply.readInt32();
240 return err;
241 }
242
Andreas Huber318ad9c2009-10-15 13:46:54 -0700243 virtual status_t useBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700244 node_id node, OMX_U32 port_index, const sp<IMemory> &params,
245 buffer_id *buffer) {
246 Parcel data, reply;
247 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700248 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700249 data.writeInt32(port_index);
250 data.writeStrongBinder(params->asBinder());
251 remote()->transact(USE_BUFFER, data, &reply);
252
253 status_t err = reply.readInt32();
254 if (err != OK) {
255 *buffer = 0;
256
257 return err;
258 }
259
Andy Hung609b8152014-05-02 11:05:04 -0700260 *buffer = (buffer_id)reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700261
262 return err;
263 }
264
Jamie Gennis83750ea2010-08-30 16:48:38 -0700265
266 virtual status_t useGraphicBuffer(
267 node_id node, OMX_U32 port_index,
268 const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) {
269 Parcel data, reply;
270 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700271 data.writeInt32((int32_t)node);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700272 data.writeInt32(port_index);
273 data.write(*graphicBuffer);
274 remote()->transact(USE_GRAPHIC_BUFFER, data, &reply);
275
276 status_t err = reply.readInt32();
277 if (err != OK) {
278 *buffer = 0;
279
280 return err;
281 }
282
Andy Hung609b8152014-05-02 11:05:04 -0700283 *buffer = (buffer_id)reply.readInt32();
Jamie Gennis83750ea2010-08-30 16:48:38 -0700284
285 return err;
286 }
287
Lajos Molnard0715862013-07-22 12:57:43 -0700288 virtual status_t updateGraphicBufferInMeta(
289 node_id node, OMX_U32 port_index,
290 const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer) {
291 Parcel data, reply;
292 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700293 data.writeInt32((int32_t)node);
Lajos Molnard0715862013-07-22 12:57:43 -0700294 data.writeInt32(port_index);
295 data.write(*graphicBuffer);
Andy Hung609b8152014-05-02 11:05:04 -0700296 data.writeInt32((int32_t)buffer);
Lajos Molnard0715862013-07-22 12:57:43 -0700297 remote()->transact(UPDATE_GRAPHIC_BUFFER_IN_META, data, &reply);
298
299 status_t err = reply.readInt32();
300 return err;
301 }
302
Andy McFadden7cd58532013-02-19 07:28:30 -0800303 virtual status_t createInputSurface(
304 node_id node, OMX_U32 port_index,
305 sp<IGraphicBufferProducer> *bufferProducer) {
306 Parcel data, reply;
307 status_t err;
308 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700309 data.writeInt32((int32_t)node);
Andy McFadden7cd58532013-02-19 07:28:30 -0800310 data.writeInt32(port_index);
311 err = remote()->transact(CREATE_INPUT_SURFACE, data, &reply);
312 if (err != OK) {
313 ALOGW("binder transaction failed: %d", err);
314 return err;
315 }
316
317 err = reply.readInt32();
318 if (err != OK) {
319 return err;
320 }
321
322 *bufferProducer = IGraphicBufferProducer::asInterface(
323 reply.readStrongBinder());
324
325 return err;
326 }
327
328 virtual status_t signalEndOfInputStream(node_id node) {
329 Parcel data, reply;
330 status_t err;
331 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700332 data.writeInt32((int32_t)node);
Andy McFadden7cd58532013-02-19 07:28:30 -0800333 err = remote()->transact(SIGNAL_END_OF_INPUT_STREAM, data, &reply);
334 if (err != OK) {
335 ALOGW("binder transaction failed: %d", err);
336 return err;
337 }
338
339 return reply.readInt32();
340 }
341
James Donge8707722010-10-20 17:38:41 -0700342 virtual status_t storeMetaDataInBuffers(
343 node_id node, OMX_U32 port_index, OMX_BOOL enable) {
344 Parcel data, reply;
345 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700346 data.writeInt32((int32_t)node);
James Donge8707722010-10-20 17:38:41 -0700347 data.writeInt32(port_index);
348 data.writeInt32((uint32_t)enable);
349 remote()->transact(STORE_META_DATA_IN_BUFFERS, data, &reply);
350
351 status_t err = reply.readInt32();
352 return err;
353 }
354
Lajos Molnar56ce7262013-05-02 16:30:48 -0700355 virtual status_t prepareForAdaptivePlayback(
356 node_id node, OMX_U32 port_index, OMX_BOOL enable,
357 OMX_U32 max_width, OMX_U32 max_height) {
358 Parcel data, reply;
359 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700360 data.writeInt32((int32_t)node);
Lajos Molnar56ce7262013-05-02 16:30:48 -0700361 data.writeInt32(port_index);
362 data.writeInt32((int32_t)enable);
363 data.writeInt32(max_width);
364 data.writeInt32(max_height);
365 remote()->transact(PREPARE_FOR_ADAPTIVE_PLAYBACK, data, &reply);
366
367 status_t err = reply.readInt32();
368 return err;
369 }
370
Andreas Huber318ad9c2009-10-15 13:46:54 -0700371 virtual status_t allocateBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700372 node_id node, OMX_U32 port_index, size_t size,
Andreas Huber570a3cb2010-01-20 15:05:46 -0800373 buffer_id *buffer, void **buffer_data) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700374 Parcel data, reply;
375 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700376 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700377 data.writeInt32(port_index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800378 data.writeInt64(size);
Andreas Huber20111aa2009-07-14 16:56:47 -0700379 remote()->transact(ALLOC_BUFFER, data, &reply);
380
381 status_t err = reply.readInt32();
382 if (err != OK) {
383 *buffer = 0;
384
385 return err;
386 }
387
Andy Hung609b8152014-05-02 11:05:04 -0700388 *buffer = (buffer_id)reply.readInt32();
389 *buffer_data = (void *)reply.readInt64();
Andreas Huber20111aa2009-07-14 16:56:47 -0700390
391 return err;
392 }
393
Andreas Huber318ad9c2009-10-15 13:46:54 -0700394 virtual status_t allocateBufferWithBackup(
Andreas Huber20111aa2009-07-14 16:56:47 -0700395 node_id node, OMX_U32 port_index, const sp<IMemory> &params,
396 buffer_id *buffer) {
397 Parcel data, reply;
398 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700399 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700400 data.writeInt32(port_index);
401 data.writeStrongBinder(params->asBinder());
402 remote()->transact(ALLOC_BUFFER_WITH_BACKUP, data, &reply);
403
404 status_t err = reply.readInt32();
405 if (err != OK) {
406 *buffer = 0;
407
408 return err;
409 }
410
Andy Hung609b8152014-05-02 11:05:04 -0700411 *buffer = (buffer_id)reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700412
413 return err;
414 }
415
Andreas Huber318ad9c2009-10-15 13:46:54 -0700416 virtual status_t freeBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700417 node_id node, OMX_U32 port_index, buffer_id buffer) {
418 Parcel data, reply;
419 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700420 data.writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700421 data.writeInt32(port_index);
Andy Hung609b8152014-05-02 11:05:04 -0700422 data.writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700423 remote()->transact(FREE_BUFFER, data, &reply);
424
425 return reply.readInt32();
426 }
427
Andreas Huber318ad9c2009-10-15 13:46:54 -0700428 virtual status_t fillBuffer(node_id node, buffer_id buffer) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700429 Parcel data, reply;
430 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700431 data.writeInt32((int32_t)node);
432 data.writeInt32((int32_t)buffer);
Andreas Huber36efa032009-10-08 11:02:27 -0700433 remote()->transact(FILL_BUFFER, data, &reply);
434
435 return reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700436 }
437
Andreas Huber318ad9c2009-10-15 13:46:54 -0700438 virtual status_t emptyBuffer(
Andreas Huber20111aa2009-07-14 16:56:47 -0700439 node_id node,
440 buffer_id buffer,
441 OMX_U32 range_offset, OMX_U32 range_length,
442 OMX_U32 flags, OMX_TICKS timestamp) {
443 Parcel data, reply;
444 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700445 data.writeInt32((int32_t)node);
446 data.writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700447 data.writeInt32(range_offset);
448 data.writeInt32(range_length);
449 data.writeInt32(flags);
450 data.writeInt64(timestamp);
Andreas Huber36efa032009-10-08 11:02:27 -0700451 remote()->transact(EMPTY_BUFFER, data, &reply);
452
453 return reply.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700454 }
Andreas Huber8b938cd2009-07-31 11:52:50 -0700455
Andreas Huber318ad9c2009-10-15 13:46:54 -0700456 virtual status_t getExtensionIndex(
Andreas Huber693d2712009-08-14 14:37:10 -0700457 node_id node,
458 const char *parameter_name,
459 OMX_INDEXTYPE *index) {
460 Parcel data, reply;
461 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700462 data.writeInt32((int32_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700463 data.writeCString(parameter_name);
464
465 remote()->transact(GET_EXTENSION_INDEX, data, &reply);
466
467 status_t err = reply.readInt32();
468 if (err == OK) {
469 *index = static_cast<OMX_INDEXTYPE>(reply.readInt32());
470 } else {
471 *index = OMX_IndexComponentStartUnused;
472 }
473
474 return err;
475 }
Andreas Hubere40cda72013-07-17 13:55:26 -0700476
477 virtual status_t setInternalOption(
478 node_id node,
479 OMX_U32 port_index,
480 InternalOptionType type,
481 const void *optionData,
482 size_t size) {
483 Parcel data, reply;
484 data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
Andy Hung609b8152014-05-02 11:05:04 -0700485 data.writeInt32((int32_t)node);
Andreas Hubere40cda72013-07-17 13:55:26 -0700486 data.writeInt32(port_index);
Glenn Kastene03dd222014-01-28 11:04:39 -0800487 data.writeInt64(size);
Andreas Hubere40cda72013-07-17 13:55:26 -0700488 data.write(optionData, size);
489 data.writeInt32(type);
490 remote()->transact(SET_INTERNAL_OPTION, data, &reply);
491
492 return reply.readInt32();
493 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700494};
495
496IMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX");
497
498////////////////////////////////////////////////////////////////////////////////
499
Andy McFadden7cd58532013-02-19 07:28:30 -0800500#define CHECK_OMX_INTERFACE(interface, data, reply) \
Andreas Huber20111aa2009-07-14 16:56:47 -0700501 do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \
Steve Block5ff1dd52012-01-05 23:22:43 +0000502 ALOGW("Call incorrectly routed to " #interface); \
Andreas Huber20111aa2009-07-14 16:56:47 -0700503 return PERMISSION_DENIED; \
504 } } while (0)
505
506status_t BnOMX::onTransact(
507 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
508 switch (code) {
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800509 case LIVES_LOCALLY:
510 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800511 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andy Hung609b8152014-05-02 11:05:04 -0700512 node_id node = (node_id)data.readInt32();
Andreas Huberd459b482012-01-31 11:16:24 -0800513 pid_t pid = (pid_t)data.readInt32();
514 reply->writeInt32(livesLocally(node, pid));
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800515
516 return OK;
517 }
518
Andreas Huber20111aa2009-07-14 16:56:47 -0700519 case LIST_NODES:
520 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800521 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700522
Andreas Huber134ee6a2009-12-16 09:30:55 -0800523 List<ComponentInfo> list;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700524 listNodes(&list);
Andreas Huber20111aa2009-07-14 16:56:47 -0700525
526 reply->writeInt32(list.size());
Andreas Huber134ee6a2009-12-16 09:30:55 -0800527 for (List<ComponentInfo>::iterator it = list.begin();
Andreas Huber20111aa2009-07-14 16:56:47 -0700528 it != list.end(); ++it) {
Andreas Huber134ee6a2009-12-16 09:30:55 -0800529 ComponentInfo &cur = *it;
530
531 reply->writeString8(cur.mName);
532 reply->writeInt32(cur.mRoles.size());
533 for (List<String8>::iterator role_it = cur.mRoles.begin();
534 role_it != cur.mRoles.end(); ++role_it) {
535 reply->writeString8(*role_it);
536 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700537 }
538
539 return NO_ERROR;
540 }
541
542 case ALLOCATE_NODE:
543 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800544 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700545
Andreas Huber318ad9c2009-10-15 13:46:54 -0700546 const char *name = data.readCString();
547
548 sp<IOMXObserver> observer =
549 interface_cast<IOMXObserver>(data.readStrongBinder());
550
Andreas Huber20111aa2009-07-14 16:56:47 -0700551 node_id node;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700552
553 status_t err = allocateNode(name, observer, &node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700554 reply->writeInt32(err);
555 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700556 reply->writeInt32((int32_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700557 }
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800558
Andreas Huber20111aa2009-07-14 16:56:47 -0700559 return NO_ERROR;
560 }
561
562 case FREE_NODE:
563 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800564 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700565
Andy Hung609b8152014-05-02 11:05:04 -0700566 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700567
Andreas Huber318ad9c2009-10-15 13:46:54 -0700568 reply->writeInt32(freeNode(node));
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800569
Andreas Huber20111aa2009-07-14 16:56:47 -0700570 return NO_ERROR;
571 }
572
573 case SEND_COMMAND:
574 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800575 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700576
Andy Hung609b8152014-05-02 11:05:04 -0700577 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700578
579 OMX_COMMANDTYPE cmd =
580 static_cast<OMX_COMMANDTYPE>(data.readInt32());
581
582 OMX_S32 param = data.readInt32();
Andreas Huber318ad9c2009-10-15 13:46:54 -0700583 reply->writeInt32(sendCommand(node, cmd, param));
Andreas Huber20111aa2009-07-14 16:56:47 -0700584
585 return NO_ERROR;
586 }
587
588 case GET_PARAMETER:
Andreas Huber20111aa2009-07-14 16:56:47 -0700589 case SET_PARAMETER:
Andreas Huber693d2712009-08-14 14:37:10 -0700590 case GET_CONFIG:
Andreas Huber693d2712009-08-14 14:37:10 -0700591 case SET_CONFIG:
Andreas Hubere40cda72013-07-17 13:55:26 -0700592 case SET_INTERNAL_OPTION:
Andreas Huber693d2712009-08-14 14:37:10 -0700593 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800594 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber693d2712009-08-14 14:37:10 -0700595
Andy Hung609b8152014-05-02 11:05:04 -0700596 node_id node = (node_id)data.readInt32();
Andreas Huber693d2712009-08-14 14:37:10 -0700597 OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
598
Glenn Kastene03dd222014-01-28 11:04:39 -0800599 size_t size = data.readInt64();
Andreas Huber693d2712009-08-14 14:37:10 -0700600
Andreas Huberb3912902011-01-19 10:34:52 -0800601 void *params = malloc(size);
602 data.read(params, size);
603
604 status_t err;
605 switch (code) {
606 case GET_PARAMETER:
607 err = getParameter(node, index, params, size);
608 break;
609 case SET_PARAMETER:
610 err = setParameter(node, index, params, size);
611 break;
612 case GET_CONFIG:
613 err = getConfig(node, index, params, size);
614 break;
615 case SET_CONFIG:
616 err = setConfig(node, index, params, size);
617 break;
Andreas Hubere40cda72013-07-17 13:55:26 -0700618 case SET_INTERNAL_OPTION:
619 {
620 InternalOptionType type =
621 (InternalOptionType)data.readInt32();
622
623 err = setInternalOption(node, index, type, params, size);
624 break;
625 }
626
Andreas Huberb3912902011-01-19 10:34:52 -0800627 default:
628 TRESPASS();
629 }
630
631 reply->writeInt32(err);
632
633 if ((code == GET_PARAMETER || code == GET_CONFIG) && err == OK) {
634 reply->write(params, size);
635 }
636
637 free(params);
638 params = NULL;
Andreas Huber693d2712009-08-14 14:37:10 -0700639
640 return NO_ERROR;
641 }
642
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700643 case GET_STATE:
644 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800645 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700646
Andy Hung609b8152014-05-02 11:05:04 -0700647 node_id node = (node_id)data.readInt32();
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700648 OMX_STATETYPE state = OMX_StateInvalid;
649
650 status_t err = getState(node, &state);
651 reply->writeInt32(state);
652 reply->writeInt32(err);
653
654 return NO_ERROR;
655 }
656
Jamie Gennis83750ea2010-08-30 16:48:38 -0700657 case ENABLE_GRAPHIC_BUFFERS:
658 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800659 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700660
Andy Hung609b8152014-05-02 11:05:04 -0700661 node_id node = (node_id)data.readInt32();
Jamie Gennis83750ea2010-08-30 16:48:38 -0700662 OMX_U32 port_index = data.readInt32();
663 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
664
665 status_t err = enableGraphicBuffers(node, port_index, enable);
666 reply->writeInt32(err);
667
668 return NO_ERROR;
669 }
670
Jamie Gennise2ce6452011-02-23 19:01:28 -0800671 case GET_GRAPHIC_BUFFER_USAGE:
672 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800673 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennise2ce6452011-02-23 19:01:28 -0800674
Andy Hung609b8152014-05-02 11:05:04 -0700675 node_id node = (node_id)data.readInt32();
Jamie Gennise2ce6452011-02-23 19:01:28 -0800676 OMX_U32 port_index = data.readInt32();
677
678 OMX_U32 usage = 0;
679 status_t err = getGraphicBufferUsage(node, port_index, &usage);
680 reply->writeInt32(err);
681 reply->writeInt32(usage);
682
683 return NO_ERROR;
684 }
685
Andreas Huber20111aa2009-07-14 16:56:47 -0700686 case USE_BUFFER:
687 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800688 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700689
Andy Hung609b8152014-05-02 11:05:04 -0700690 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700691 OMX_U32 port_index = data.readInt32();
692 sp<IMemory> params =
693 interface_cast<IMemory>(data.readStrongBinder());
694
695 buffer_id buffer;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700696 status_t err = useBuffer(node, port_index, params, &buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700697 reply->writeInt32(err);
698
699 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700700 reply->writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700701 }
702
703 return NO_ERROR;
704 }
705
Jamie Gennis83750ea2010-08-30 16:48:38 -0700706 case USE_GRAPHIC_BUFFER:
707 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800708 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700709
Andy Hung609b8152014-05-02 11:05:04 -0700710 node_id node = (node_id)data.readInt32();
Jamie Gennis83750ea2010-08-30 16:48:38 -0700711 OMX_U32 port_index = data.readInt32();
712 sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
713 data.read(*graphicBuffer);
714
715 buffer_id buffer;
716 status_t err = useGraphicBuffer(
717 node, port_index, graphicBuffer, &buffer);
718 reply->writeInt32(err);
719
720 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700721 reply->writeInt32((int32_t)buffer);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700722 }
723
724 return NO_ERROR;
725 }
726
Lajos Molnard0715862013-07-22 12:57:43 -0700727 case UPDATE_GRAPHIC_BUFFER_IN_META:
728 {
729 CHECK_OMX_INTERFACE(IOMX, data, reply);
730
Andy Hung609b8152014-05-02 11:05:04 -0700731 node_id node = (node_id)data.readInt32();
Lajos Molnard0715862013-07-22 12:57:43 -0700732 OMX_U32 port_index = data.readInt32();
733 sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
734 data.read(*graphicBuffer);
Andy Hung609b8152014-05-02 11:05:04 -0700735 buffer_id buffer = (buffer_id)data.readInt32();
Lajos Molnard0715862013-07-22 12:57:43 -0700736
737 status_t err = updateGraphicBufferInMeta(
738 node, port_index, graphicBuffer, buffer);
739 reply->writeInt32(err);
740
741 return NO_ERROR;
742 }
743
Andy McFadden7cd58532013-02-19 07:28:30 -0800744 case CREATE_INPUT_SURFACE:
745 {
746 CHECK_OMX_INTERFACE(IOMX, data, reply);
747
Andy Hung609b8152014-05-02 11:05:04 -0700748 node_id node = (node_id)data.readInt32();
Andy McFadden7cd58532013-02-19 07:28:30 -0800749 OMX_U32 port_index = data.readInt32();
750
751 sp<IGraphicBufferProducer> bufferProducer;
752 status_t err = createInputSurface(node, port_index,
753 &bufferProducer);
754
755 reply->writeInt32(err);
756
757 if (err == OK) {
758 reply->writeStrongBinder(bufferProducer->asBinder());
759 }
760
761 return NO_ERROR;
762 }
763
764 case SIGNAL_END_OF_INPUT_STREAM:
765 {
766 CHECK_OMX_INTERFACE(IOMX, data, reply);
767
Andy Hung609b8152014-05-02 11:05:04 -0700768 node_id node = (node_id)data.readInt32();
Andy McFadden7cd58532013-02-19 07:28:30 -0800769
770 status_t err = signalEndOfInputStream(node);
771 reply->writeInt32(err);
772
773 return NO_ERROR;
774 }
775
James Donge8707722010-10-20 17:38:41 -0700776 case STORE_META_DATA_IN_BUFFERS:
777 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800778 CHECK_OMX_INTERFACE(IOMX, data, reply);
James Donge8707722010-10-20 17:38:41 -0700779
Andy Hung609b8152014-05-02 11:05:04 -0700780 node_id node = (node_id)data.readInt32();
James Donge8707722010-10-20 17:38:41 -0700781 OMX_U32 port_index = data.readInt32();
782 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
783
784 status_t err = storeMetaDataInBuffers(node, port_index, enable);
785 reply->writeInt32(err);
786
787 return NO_ERROR;
788 }
789
Lajos Molnar56ce7262013-05-02 16:30:48 -0700790 case PREPARE_FOR_ADAPTIVE_PLAYBACK:
791 {
792 CHECK_OMX_INTERFACE(IOMX, data, reply);
793
Andy Hung609b8152014-05-02 11:05:04 -0700794 node_id node = (node_id)data.readInt32();
Lajos Molnar56ce7262013-05-02 16:30:48 -0700795 OMX_U32 port_index = data.readInt32();
796 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
797 OMX_U32 max_width = data.readInt32();
798 OMX_U32 max_height = data.readInt32();
799
800 status_t err = prepareForAdaptivePlayback(
801 node, port_index, enable, max_width, max_height);
802 reply->writeInt32(err);
803
804 return NO_ERROR;
805 }
806
Andreas Huber20111aa2009-07-14 16:56:47 -0700807 case ALLOC_BUFFER:
808 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800809 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700810
Andy Hung609b8152014-05-02 11:05:04 -0700811 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700812 OMX_U32 port_index = data.readInt32();
Glenn Kastene03dd222014-01-28 11:04:39 -0800813 size_t size = data.readInt64();
Andreas Huber20111aa2009-07-14 16:56:47 -0700814
815 buffer_id buffer;
Andreas Huber570a3cb2010-01-20 15:05:46 -0800816 void *buffer_data;
817 status_t err = allocateBuffer(
818 node, port_index, size, &buffer, &buffer_data);
Andreas Huber20111aa2009-07-14 16:56:47 -0700819 reply->writeInt32(err);
820
821 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700822 reply->writeInt32((int32_t)buffer);
823 reply->writeInt64((uintptr_t)buffer_data);
Andreas Huber20111aa2009-07-14 16:56:47 -0700824 }
825
826 return NO_ERROR;
827 }
828
829 case ALLOC_BUFFER_WITH_BACKUP:
830 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800831 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700832
Andy Hung609b8152014-05-02 11:05:04 -0700833 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700834 OMX_U32 port_index = data.readInt32();
835 sp<IMemory> params =
836 interface_cast<IMemory>(data.readStrongBinder());
837
838 buffer_id buffer;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700839 status_t err = allocateBufferWithBackup(
Andreas Huber20111aa2009-07-14 16:56:47 -0700840 node, port_index, params, &buffer);
841
842 reply->writeInt32(err);
843
844 if (err == OK) {
Andy Hung609b8152014-05-02 11:05:04 -0700845 reply->writeInt32((int32_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700846 }
847
848 return NO_ERROR;
849 }
850
851 case FREE_BUFFER:
852 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800853 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700854
Andy Hung609b8152014-05-02 11:05:04 -0700855 node_id node = (node_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700856 OMX_U32 port_index = data.readInt32();
Andy Hung609b8152014-05-02 11:05:04 -0700857 buffer_id buffer = (buffer_id)data.readInt32();
Andreas Huber318ad9c2009-10-15 13:46:54 -0700858 reply->writeInt32(freeBuffer(node, port_index, buffer));
Andreas Huber20111aa2009-07-14 16:56:47 -0700859
860 return NO_ERROR;
861 }
862
863 case FILL_BUFFER:
864 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800865 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700866
Andy Hung609b8152014-05-02 11:05:04 -0700867 node_id node = (node_id)data.readInt32();
868 buffer_id buffer = (buffer_id)data.readInt32();
Andreas Huber318ad9c2009-10-15 13:46:54 -0700869 reply->writeInt32(fillBuffer(node, buffer));
Andreas Huber20111aa2009-07-14 16:56:47 -0700870
871 return NO_ERROR;
872 }
873
874 case EMPTY_BUFFER:
875 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800876 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700877
Andy Hung609b8152014-05-02 11:05:04 -0700878 node_id node = (node_id)data.readInt32();
879 buffer_id buffer = (buffer_id)data.readInt32();
Andreas Huber20111aa2009-07-14 16:56:47 -0700880 OMX_U32 range_offset = data.readInt32();
881 OMX_U32 range_length = data.readInt32();
882 OMX_U32 flags = data.readInt32();
883 OMX_TICKS timestamp = data.readInt64();
884
Andreas Huber36efa032009-10-08 11:02:27 -0700885 reply->writeInt32(
Andreas Huber318ad9c2009-10-15 13:46:54 -0700886 emptyBuffer(
Andreas Huber36efa032009-10-08 11:02:27 -0700887 node, buffer, range_offset, range_length,
888 flags, timestamp));
Andreas Huber20111aa2009-07-14 16:56:47 -0700889
890 return NO_ERROR;
891 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700892
Andreas Huber693d2712009-08-14 14:37:10 -0700893 case GET_EXTENSION_INDEX:
894 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800895 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber693d2712009-08-14 14:37:10 -0700896
Andy Hung609b8152014-05-02 11:05:04 -0700897 node_id node = (node_id)data.readInt32();
Andreas Huber693d2712009-08-14 14:37:10 -0700898 const char *parameter_name = data.readCString();
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800899
Andreas Huber693d2712009-08-14 14:37:10 -0700900 OMX_INDEXTYPE index;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700901 status_t err = getExtensionIndex(node, parameter_name, &index);
Andreas Huber693d2712009-08-14 14:37:10 -0700902
903 reply->writeInt32(err);
904
905 if (err == OK) {
906 reply->writeInt32(index);
907 }
908
909 return OK;
910 }
911
Andreas Huber20111aa2009-07-14 16:56:47 -0700912 default:
913 return BBinder::onTransact(code, data, reply, flags);
914 }
915}
916
917////////////////////////////////////////////////////////////////////////////////
918
919class BpOMXObserver : public BpInterface<IOMXObserver> {
920public:
921 BpOMXObserver(const sp<IBinder> &impl)
922 : BpInterface<IOMXObserver>(impl) {
923 }
924
Andreas Huber318ad9c2009-10-15 13:46:54 -0700925 virtual void onMessage(const omx_message &msg) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700926 Parcel data, reply;
927 data.writeInterfaceToken(IOMXObserver::getInterfaceDescriptor());
928 data.write(&msg, sizeof(msg));
929
Andy Hung609b8152014-05-02 11:05:04 -0700930 ALOGV("onMessage writing message %d, size %zu", msg.type, sizeof(msg));
931
Andreas Huber20111aa2009-07-14 16:56:47 -0700932 remote()->transact(OBSERVER_ON_MSG, data, &reply, IBinder::FLAG_ONEWAY);
933 }
934};
935
936IMPLEMENT_META_INTERFACE(OMXObserver, "android.hardware.IOMXObserver");
937
938status_t BnOMXObserver::onTransact(
939 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
940 switch (code) {
941 case OBSERVER_ON_MSG:
942 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800943 CHECK_OMX_INTERFACE(IOMXObserver, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700944
945 omx_message msg;
946 data.read(&msg, sizeof(msg));
947
Andy Hung609b8152014-05-02 11:05:04 -0700948 ALOGV("onTransact reading message %d, size %zu", msg.type, sizeof(msg));
949
Andreas Huber20111aa2009-07-14 16:56:47 -0700950 // XXX Could use readInplace maybe?
Andreas Huber318ad9c2009-10-15 13:46:54 -0700951 onMessage(msg);
Andreas Huber20111aa2009-07-14 16:56:47 -0700952
953 return NO_ERROR;
954 }
955
956 default:
957 return BBinder::onTransact(code, data, reply, flags);
958 }
959}
960
Andreas Huber20111aa2009-07-14 16:56:47 -0700961} // namespace android