blob: 787c8288c0bdc6ef8721c9e60968188458ab8a6d [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());
Andreas Huberd459b482012-01-31 11:16:24 -080068 data.writeIntPtr((intptr_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) {
Andreas Huberc6b59b72009-08-17 13:33:27 -0700107 *node = (void*)reply.readIntPtr();
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());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700118 data.writeIntPtr((intptr_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());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700128 data.writeIntPtr((intptr_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());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700141 data.writeIntPtr((intptr_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700142 data.writeInt32(index);
143 data.writeInt32(size);
144 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());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700162 data.writeIntPtr((intptr_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700163 data.writeInt32(index);
164 data.writeInt32(size);
165 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());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700176 data.writeIntPtr((intptr_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700177 data.writeInt32(index);
178 data.writeInt32(size);
179 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());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700197 data.writeIntPtr((intptr_t)node);
Andreas Huber693d2712009-08-14 14:37:10 -0700198 data.writeInt32(index);
199 data.writeInt32(size);
200 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());
210 data.writeIntPtr((intptr_t)node);
211 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());
221 data.writeIntPtr((intptr_t)node);
222 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());
234 data.writeIntPtr((intptr_t)node);
235 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());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700248 data.writeIntPtr((intptr_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
Andreas Huberc6b59b72009-08-17 13:33:27 -0700260 *buffer = (void*)reply.readIntPtr();
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());
271 data.writeIntPtr((intptr_t)node);
272 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
283 *buffer = (void*)reply.readIntPtr();
284
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());
293 data.writeIntPtr((intptr_t)node);
294 data.writeInt32(port_index);
295 data.write(*graphicBuffer);
296 data.writeIntPtr((intptr_t)buffer);
297 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());
309 data.writeIntPtr((intptr_t)node);
310 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());
332 data.writeIntPtr((intptr_t)node);
333 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());
346 data.writeIntPtr((intptr_t)node);
347 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());
360 data.writeIntPtr((intptr_t)node);
361 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());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700376 data.writeIntPtr((intptr_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700377 data.writeInt32(port_index);
378 data.writeInt32(size);
379 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
Andreas Huber570a3cb2010-01-20 15:05:46 -0800388 *buffer = (void *)reply.readIntPtr();
389 *buffer_data = (void *)reply.readIntPtr();
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());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700399 data.writeIntPtr((intptr_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
Andreas Huberc6b59b72009-08-17 13:33:27 -0700411 *buffer = (void*)reply.readIntPtr();
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());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700420 data.writeIntPtr((intptr_t)node);
Andreas Huber20111aa2009-07-14 16:56:47 -0700421 data.writeInt32(port_index);
Andreas Huberc6b59b72009-08-17 13:33:27 -0700422 data.writeIntPtr((intptr_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());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700431 data.writeIntPtr((intptr_t)node);
432 data.writeIntPtr((intptr_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());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700445 data.writeIntPtr((intptr_t)node);
446 data.writeIntPtr((intptr_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());
Andreas Huberc6b59b72009-08-17 13:33:27 -0700462 data.writeIntPtr((intptr_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());
485 data.writeIntPtr((intptr_t)node);
486 data.writeInt32(port_index);
487 data.writeInt32(size);
488 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);
Andreas Huberd459b482012-01-31 11:16:24 -0800512 node_id node = (void *)data.readIntPtr();
513 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) {
Andreas Huberc6b59b72009-08-17 13:33:27 -0700556 reply->writeIntPtr((intptr_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
Andreas Huberc6b59b72009-08-17 13:33:27 -0700566 node_id node = (void*)data.readIntPtr();
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
Andreas Huberc6b59b72009-08-17 13:33:27 -0700577 node_id node = (void*)data.readIntPtr();
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
Andreas Huberc6b59b72009-08-17 13:33:27 -0700596 node_id node = (void*)data.readIntPtr();
Andreas Huber693d2712009-08-14 14:37:10 -0700597 OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
598
599 size_t size = data.readInt32();
Andreas Huber693d2712009-08-14 14:37:10 -0700600
Marco Nelissenf7a38822016-02-22 13:05:15 -0800601 status_t err = NO_MEMORY;
602 void *params = calloc(size, 1);
603 if (params) {
604 err = data.read(params, size);
605 if (err != OK) {
606 android_errorWriteLog(0x534e4554, "26914474");
607 } else {
608 switch (code) {
609 case GET_PARAMETER:
610 err = getParameter(node, index, params, size);
611 break;
612 case SET_PARAMETER:
613 err = setParameter(node, index, params, size);
614 break;
615 case GET_CONFIG:
616 err = getConfig(node, index, params, size);
617 break;
618 case SET_CONFIG:
619 err = setConfig(node, index, params, size);
620 break;
621 case SET_INTERNAL_OPTION:
622 {
623 InternalOptionType type =
624 (InternalOptionType)data.readInt32();
Andreas Huberb3912902011-01-19 10:34:52 -0800625
Marco Nelissenf7a38822016-02-22 13:05:15 -0800626 err = setInternalOption(node, index, type, params, size);
627 break;
628 }
Andreas Hubere40cda72013-07-17 13:55:26 -0700629
Marco Nelissenf7a38822016-02-22 13:05:15 -0800630 default:
631 TRESPASS();
632 }
Andreas Hubere40cda72013-07-17 13:55:26 -0700633 }
Andreas Huberb3912902011-01-19 10:34:52 -0800634 }
635
636 reply->writeInt32(err);
637
638 if ((code == GET_PARAMETER || code == GET_CONFIG) && err == OK) {
639 reply->write(params, size);
640 }
641
642 free(params);
643 params = NULL;
Andreas Huber693d2712009-08-14 14:37:10 -0700644
645 return NO_ERROR;
646 }
647
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700648 case GET_STATE:
649 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800650 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennisb1d666f2011-10-19 21:14:13 -0700651
652 node_id node = (void*)data.readIntPtr();
653 OMX_STATETYPE state = OMX_StateInvalid;
654
655 status_t err = getState(node, &state);
656 reply->writeInt32(state);
657 reply->writeInt32(err);
658
659 return NO_ERROR;
660 }
661
Jamie Gennis83750ea2010-08-30 16:48:38 -0700662 case ENABLE_GRAPHIC_BUFFERS:
663 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800664 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700665
666 node_id node = (void*)data.readIntPtr();
667 OMX_U32 port_index = data.readInt32();
668 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
669
670 status_t err = enableGraphicBuffers(node, port_index, enable);
671 reply->writeInt32(err);
672
673 return NO_ERROR;
674 }
675
Jamie Gennise2ce6452011-02-23 19:01:28 -0800676 case GET_GRAPHIC_BUFFER_USAGE:
677 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800678 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennise2ce6452011-02-23 19:01:28 -0800679
680 node_id node = (void*)data.readIntPtr();
681 OMX_U32 port_index = data.readInt32();
682
683 OMX_U32 usage = 0;
684 status_t err = getGraphicBufferUsage(node, port_index, &usage);
685 reply->writeInt32(err);
686 reply->writeInt32(usage);
687
688 return NO_ERROR;
689 }
690
Andreas Huber20111aa2009-07-14 16:56:47 -0700691 case USE_BUFFER:
692 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800693 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700694
Andreas Huberc6b59b72009-08-17 13:33:27 -0700695 node_id node = (void*)data.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700696 OMX_U32 port_index = data.readInt32();
697 sp<IMemory> params =
698 interface_cast<IMemory>(data.readStrongBinder());
699
700 buffer_id buffer;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700701 status_t err = useBuffer(node, port_index, params, &buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700702 reply->writeInt32(err);
703
704 if (err == OK) {
Andreas Huberc6b59b72009-08-17 13:33:27 -0700705 reply->writeIntPtr((intptr_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700706 }
707
708 return NO_ERROR;
709 }
710
Jamie Gennis83750ea2010-08-30 16:48:38 -0700711 case USE_GRAPHIC_BUFFER:
712 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800713 CHECK_OMX_INTERFACE(IOMX, data, reply);
Jamie Gennis83750ea2010-08-30 16:48:38 -0700714
715 node_id node = (void*)data.readIntPtr();
716 OMX_U32 port_index = data.readInt32();
717 sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
718 data.read(*graphicBuffer);
719
720 buffer_id buffer;
721 status_t err = useGraphicBuffer(
722 node, port_index, graphicBuffer, &buffer);
723 reply->writeInt32(err);
724
725 if (err == OK) {
726 reply->writeIntPtr((intptr_t)buffer);
727 }
728
729 return NO_ERROR;
730 }
731
Lajos Molnard0715862013-07-22 12:57:43 -0700732 case UPDATE_GRAPHIC_BUFFER_IN_META:
733 {
734 CHECK_OMX_INTERFACE(IOMX, data, reply);
735
736 node_id node = (void*)data.readIntPtr();
737 OMX_U32 port_index = data.readInt32();
738 sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
739 data.read(*graphicBuffer);
740 buffer_id buffer = (void*)data.readIntPtr();
741
742 status_t err = updateGraphicBufferInMeta(
743 node, port_index, graphicBuffer, buffer);
744 reply->writeInt32(err);
745
746 return NO_ERROR;
747 }
748
Andy McFadden7cd58532013-02-19 07:28:30 -0800749 case CREATE_INPUT_SURFACE:
750 {
751 CHECK_OMX_INTERFACE(IOMX, data, reply);
752
753 node_id node = (void*)data.readIntPtr();
754 OMX_U32 port_index = data.readInt32();
755
756 sp<IGraphicBufferProducer> bufferProducer;
757 status_t err = createInputSurface(node, port_index,
758 &bufferProducer);
759
760 reply->writeInt32(err);
761
762 if (err == OK) {
763 reply->writeStrongBinder(bufferProducer->asBinder());
764 }
765
766 return NO_ERROR;
767 }
768
769 case SIGNAL_END_OF_INPUT_STREAM:
770 {
771 CHECK_OMX_INTERFACE(IOMX, data, reply);
772
773 node_id node = (void*)data.readIntPtr();
774
775 status_t err = signalEndOfInputStream(node);
776 reply->writeInt32(err);
777
778 return NO_ERROR;
779 }
780
James Donge8707722010-10-20 17:38:41 -0700781 case STORE_META_DATA_IN_BUFFERS:
782 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800783 CHECK_OMX_INTERFACE(IOMX, data, reply);
James Donge8707722010-10-20 17:38:41 -0700784
785 node_id node = (void*)data.readIntPtr();
786 OMX_U32 port_index = data.readInt32();
787 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
788
789 status_t err = storeMetaDataInBuffers(node, port_index, enable);
790 reply->writeInt32(err);
791
792 return NO_ERROR;
793 }
794
Lajos Molnar56ce7262013-05-02 16:30:48 -0700795 case PREPARE_FOR_ADAPTIVE_PLAYBACK:
796 {
797 CHECK_OMX_INTERFACE(IOMX, data, reply);
798
799 node_id node = (void*)data.readIntPtr();
800 OMX_U32 port_index = data.readInt32();
801 OMX_BOOL enable = (OMX_BOOL)data.readInt32();
802 OMX_U32 max_width = data.readInt32();
803 OMX_U32 max_height = data.readInt32();
804
805 status_t err = prepareForAdaptivePlayback(
806 node, port_index, enable, max_width, max_height);
807 reply->writeInt32(err);
808
809 return NO_ERROR;
810 }
811
Andreas Huber20111aa2009-07-14 16:56:47 -0700812 case ALLOC_BUFFER:
813 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800814 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700815
Andreas Huberc6b59b72009-08-17 13:33:27 -0700816 node_id node = (void*)data.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700817 OMX_U32 port_index = data.readInt32();
Wei Jia4a03d782015-09-28 11:32:23 -0700818 if (!isSecure(node) || port_index != 0 /* kPortIndexInput */) {
819 ALOGE("b/24310423");
820 reply->writeInt32(INVALID_OPERATION);
821 return NO_ERROR;
822 }
823
Andreas Huber20111aa2009-07-14 16:56:47 -0700824 size_t size = data.readInt32();
825
826 buffer_id buffer;
Andreas Huber570a3cb2010-01-20 15:05:46 -0800827 void *buffer_data;
828 status_t err = allocateBuffer(
829 node, port_index, size, &buffer, &buffer_data);
Andreas Huber20111aa2009-07-14 16:56:47 -0700830 reply->writeInt32(err);
831
832 if (err == OK) {
Andreas Huberc6b59b72009-08-17 13:33:27 -0700833 reply->writeIntPtr((intptr_t)buffer);
Andreas Huber570a3cb2010-01-20 15:05:46 -0800834 reply->writeIntPtr((intptr_t)buffer_data);
Andreas Huber20111aa2009-07-14 16:56:47 -0700835 }
836
837 return NO_ERROR;
838 }
839
840 case ALLOC_BUFFER_WITH_BACKUP:
841 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800842 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700843
Andreas Huberc6b59b72009-08-17 13:33:27 -0700844 node_id node = (void*)data.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700845 OMX_U32 port_index = data.readInt32();
846 sp<IMemory> params =
847 interface_cast<IMemory>(data.readStrongBinder());
848
849 buffer_id buffer;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700850 status_t err = allocateBufferWithBackup(
Andreas Huber20111aa2009-07-14 16:56:47 -0700851 node, port_index, params, &buffer);
852
853 reply->writeInt32(err);
854
855 if (err == OK) {
Andreas Huberc6b59b72009-08-17 13:33:27 -0700856 reply->writeIntPtr((intptr_t)buffer);
Andreas Huber20111aa2009-07-14 16:56:47 -0700857 }
858
859 return NO_ERROR;
860 }
861
862 case FREE_BUFFER:
863 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800864 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700865
Andreas Huberc6b59b72009-08-17 13:33:27 -0700866 node_id node = (void*)data.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700867 OMX_U32 port_index = data.readInt32();
Andreas Huberc6b59b72009-08-17 13:33:27 -0700868 buffer_id buffer = (void*)data.readIntPtr();
Andreas Huber318ad9c2009-10-15 13:46:54 -0700869 reply->writeInt32(freeBuffer(node, port_index, buffer));
Andreas Huber20111aa2009-07-14 16:56:47 -0700870
871 return NO_ERROR;
872 }
873
874 case FILL_BUFFER:
875 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800876 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700877
Andreas Huberc6b59b72009-08-17 13:33:27 -0700878 node_id node = (void*)data.readIntPtr();
879 buffer_id buffer = (void*)data.readIntPtr();
Andreas Huber318ad9c2009-10-15 13:46:54 -0700880 reply->writeInt32(fillBuffer(node, buffer));
Andreas Huber20111aa2009-07-14 16:56:47 -0700881
882 return NO_ERROR;
883 }
884
885 case EMPTY_BUFFER:
886 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800887 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700888
Andreas Huberc6b59b72009-08-17 13:33:27 -0700889 node_id node = (void*)data.readIntPtr();
890 buffer_id buffer = (void*)data.readIntPtr();
Andreas Huber20111aa2009-07-14 16:56:47 -0700891 OMX_U32 range_offset = data.readInt32();
892 OMX_U32 range_length = data.readInt32();
893 OMX_U32 flags = data.readInt32();
894 OMX_TICKS timestamp = data.readInt64();
895
Andreas Huber36efa032009-10-08 11:02:27 -0700896 reply->writeInt32(
Andreas Huber318ad9c2009-10-15 13:46:54 -0700897 emptyBuffer(
Andreas Huber36efa032009-10-08 11:02:27 -0700898 node, buffer, range_offset, range_length,
899 flags, timestamp));
Andreas Huber20111aa2009-07-14 16:56:47 -0700900
901 return NO_ERROR;
902 }
Andreas Huber20111aa2009-07-14 16:56:47 -0700903
Andreas Huber693d2712009-08-14 14:37:10 -0700904 case GET_EXTENSION_INDEX:
905 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800906 CHECK_OMX_INTERFACE(IOMX, data, reply);
Andreas Huber693d2712009-08-14 14:37:10 -0700907
Andreas Huberc6b59b72009-08-17 13:33:27 -0700908 node_id node = (void*)data.readIntPtr();
Andreas Huber693d2712009-08-14 14:37:10 -0700909 const char *parameter_name = data.readCString();
Andreas Huber7eaa9c92010-01-15 15:28:19 -0800910
Andreas Huber693d2712009-08-14 14:37:10 -0700911 OMX_INDEXTYPE index;
Andreas Huber318ad9c2009-10-15 13:46:54 -0700912 status_t err = getExtensionIndex(node, parameter_name, &index);
Andreas Huber693d2712009-08-14 14:37:10 -0700913
914 reply->writeInt32(err);
915
916 if (err == OK) {
917 reply->writeInt32(index);
918 }
919
920 return OK;
921 }
922
Andreas Huber20111aa2009-07-14 16:56:47 -0700923 default:
924 return BBinder::onTransact(code, data, reply, flags);
925 }
926}
927
928////////////////////////////////////////////////////////////////////////////////
929
930class BpOMXObserver : public BpInterface<IOMXObserver> {
931public:
932 BpOMXObserver(const sp<IBinder> &impl)
933 : BpInterface<IOMXObserver>(impl) {
934 }
935
Andreas Huber318ad9c2009-10-15 13:46:54 -0700936 virtual void onMessage(const omx_message &msg) {
Andreas Huber20111aa2009-07-14 16:56:47 -0700937 Parcel data, reply;
938 data.writeInterfaceToken(IOMXObserver::getInterfaceDescriptor());
939 data.write(&msg, sizeof(msg));
940
941 remote()->transact(OBSERVER_ON_MSG, data, &reply, IBinder::FLAG_ONEWAY);
942 }
943};
944
945IMPLEMENT_META_INTERFACE(OMXObserver, "android.hardware.IOMXObserver");
946
947status_t BnOMXObserver::onTransact(
948 uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
949 switch (code) {
950 case OBSERVER_ON_MSG:
951 {
Andy McFadden7cd58532013-02-19 07:28:30 -0800952 CHECK_OMX_INTERFACE(IOMXObserver, data, reply);
Andreas Huber20111aa2009-07-14 16:56:47 -0700953
954 omx_message msg;
955 data.read(&msg, sizeof(msg));
956
957 // XXX Could use readInplace maybe?
Andreas Huber318ad9c2009-10-15 13:46:54 -0700958 onMessage(msg);
Andreas Huber20111aa2009-07-14 16:56:47 -0700959
960 return NO_ERROR;
961 }
962
963 default:
964 return BBinder::onTransact(code, data, reply, flags);
965 }
966}
967
Andreas Huber20111aa2009-07-14 16:56:47 -0700968} // namespace android