1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker * Copyright (c) 2009 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker *
4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker *
8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker *
10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker */
16*ec779b8eSAndroid Build Coastguard Worker
17*ec779b8eSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
18*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "IOMX"
19*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
20*ec779b8eSAndroid Build Coastguard Worker
21*ec779b8eSAndroid Build Coastguard Worker #include <sys/mman.h>
22*ec779b8eSAndroid Build Coastguard Worker
23*ec779b8eSAndroid Build Coastguard Worker #include <binder/IMemory.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <binder/Parcel.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <media/IOMX.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/ADebug.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <media/openmax/OMX_IndexExt.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <media/OMXBuffer.h>
29*ec779b8eSAndroid Build Coastguard Worker #include <utils/NativeHandle.h>
30*ec779b8eSAndroid Build Coastguard Worker
31*ec779b8eSAndroid Build Coastguard Worker #include <media/omx/1.0/WOmxNode.h>
32*ec779b8eSAndroid Build Coastguard Worker #include <android/IOMXBufferSource.h>
33*ec779b8eSAndroid Build Coastguard Worker
34*ec779b8eSAndroid Build Coastguard Worker namespace android {
35*ec779b8eSAndroid Build Coastguard Worker
36*ec779b8eSAndroid Build Coastguard Worker enum {
37*ec779b8eSAndroid Build Coastguard Worker CONNECT = IBinder::FIRST_CALL_TRANSACTION,
38*ec779b8eSAndroid Build Coastguard Worker LIST_NODES,
39*ec779b8eSAndroid Build Coastguard Worker ALLOCATE_NODE,
40*ec779b8eSAndroid Build Coastguard Worker CREATE_INPUT_SURFACE,
41*ec779b8eSAndroid Build Coastguard Worker FREE_NODE,
42*ec779b8eSAndroid Build Coastguard Worker SEND_COMMAND,
43*ec779b8eSAndroid Build Coastguard Worker GET_PARAMETER,
44*ec779b8eSAndroid Build Coastguard Worker SET_PARAMETER,
45*ec779b8eSAndroid Build Coastguard Worker GET_CONFIG,
46*ec779b8eSAndroid Build Coastguard Worker SET_CONFIG,
47*ec779b8eSAndroid Build Coastguard Worker SET_PORT_MODE,
48*ec779b8eSAndroid Build Coastguard Worker SET_INPUT_SURFACE,
49*ec779b8eSAndroid Build Coastguard Worker PREPARE_FOR_ADAPTIVE_PLAYBACK,
50*ec779b8eSAndroid Build Coastguard Worker ALLOC_SECURE_BUFFER,
51*ec779b8eSAndroid Build Coastguard Worker USE_BUFFER,
52*ec779b8eSAndroid Build Coastguard Worker FREE_BUFFER,
53*ec779b8eSAndroid Build Coastguard Worker FILL_BUFFER,
54*ec779b8eSAndroid Build Coastguard Worker EMPTY_BUFFER,
55*ec779b8eSAndroid Build Coastguard Worker GET_EXTENSION_INDEX,
56*ec779b8eSAndroid Build Coastguard Worker OBSERVER_ON_MSG,
57*ec779b8eSAndroid Build Coastguard Worker GET_GRAPHIC_BUFFER_USAGE,
58*ec779b8eSAndroid Build Coastguard Worker CONFIGURE_VIDEO_TUNNEL_MODE,
59*ec779b8eSAndroid Build Coastguard Worker DISPATCH_MESSAGE,
60*ec779b8eSAndroid Build Coastguard Worker SET_QUIRKS,
61*ec779b8eSAndroid Build Coastguard Worker };
62*ec779b8eSAndroid Build Coastguard Worker
63*ec779b8eSAndroid Build Coastguard Worker class BpOMXNode : public BpInterface<IOMXNode> {
64*ec779b8eSAndroid Build Coastguard Worker public:
BpOMXNode(const sp<IBinder> & impl)65*ec779b8eSAndroid Build Coastguard Worker explicit BpOMXNode(const sp<IBinder> &impl)
66*ec779b8eSAndroid Build Coastguard Worker : BpInterface<IOMXNode>(impl) {
67*ec779b8eSAndroid Build Coastguard Worker }
68*ec779b8eSAndroid Build Coastguard Worker
freeNode()69*ec779b8eSAndroid Build Coastguard Worker virtual status_t freeNode() {
70*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
71*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
72*ec779b8eSAndroid Build Coastguard Worker remote()->transact(FREE_NODE, data, &reply);
73*ec779b8eSAndroid Build Coastguard Worker
74*ec779b8eSAndroid Build Coastguard Worker return reply.readInt32();
75*ec779b8eSAndroid Build Coastguard Worker }
76*ec779b8eSAndroid Build Coastguard Worker
sendCommand(OMX_COMMANDTYPE cmd,OMX_S32 param)77*ec779b8eSAndroid Build Coastguard Worker virtual status_t sendCommand(
78*ec779b8eSAndroid Build Coastguard Worker OMX_COMMANDTYPE cmd, OMX_S32 param) {
79*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
80*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
81*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(cmd);
82*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(param);
83*ec779b8eSAndroid Build Coastguard Worker remote()->transact(SEND_COMMAND, data, &reply);
84*ec779b8eSAndroid Build Coastguard Worker
85*ec779b8eSAndroid Build Coastguard Worker return reply.readInt32();
86*ec779b8eSAndroid Build Coastguard Worker }
87*ec779b8eSAndroid Build Coastguard Worker
getParameter(OMX_INDEXTYPE index,void * params,size_t size)88*ec779b8eSAndroid Build Coastguard Worker virtual status_t getParameter(
89*ec779b8eSAndroid Build Coastguard Worker OMX_INDEXTYPE index,
90*ec779b8eSAndroid Build Coastguard Worker void *params, size_t size) {
91*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
92*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
93*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(index);
94*ec779b8eSAndroid Build Coastguard Worker data.writeInt64(size);
95*ec779b8eSAndroid Build Coastguard Worker data.write(params, size);
96*ec779b8eSAndroid Build Coastguard Worker remote()->transact(GET_PARAMETER, data, &reply);
97*ec779b8eSAndroid Build Coastguard Worker
98*ec779b8eSAndroid Build Coastguard Worker status_t err = reply.readInt32();
99*ec779b8eSAndroid Build Coastguard Worker if (err != OK) {
100*ec779b8eSAndroid Build Coastguard Worker return err;
101*ec779b8eSAndroid Build Coastguard Worker }
102*ec779b8eSAndroid Build Coastguard Worker
103*ec779b8eSAndroid Build Coastguard Worker reply.read(params, size);
104*ec779b8eSAndroid Build Coastguard Worker
105*ec779b8eSAndroid Build Coastguard Worker return OK;
106*ec779b8eSAndroid Build Coastguard Worker }
107*ec779b8eSAndroid Build Coastguard Worker
setParameter(OMX_INDEXTYPE index,const void * params,size_t size)108*ec779b8eSAndroid Build Coastguard Worker virtual status_t setParameter(
109*ec779b8eSAndroid Build Coastguard Worker OMX_INDEXTYPE index,
110*ec779b8eSAndroid Build Coastguard Worker const void *params, size_t size) {
111*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
112*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
113*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(index);
114*ec779b8eSAndroid Build Coastguard Worker data.writeInt64(size);
115*ec779b8eSAndroid Build Coastguard Worker data.write(params, size);
116*ec779b8eSAndroid Build Coastguard Worker remote()->transact(SET_PARAMETER, data, &reply);
117*ec779b8eSAndroid Build Coastguard Worker
118*ec779b8eSAndroid Build Coastguard Worker return reply.readInt32();
119*ec779b8eSAndroid Build Coastguard Worker }
120*ec779b8eSAndroid Build Coastguard Worker
getConfig(OMX_INDEXTYPE index,void * params,size_t size)121*ec779b8eSAndroid Build Coastguard Worker virtual status_t getConfig(
122*ec779b8eSAndroid Build Coastguard Worker OMX_INDEXTYPE index,
123*ec779b8eSAndroid Build Coastguard Worker void *params, size_t size) {
124*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
125*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
126*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(index);
127*ec779b8eSAndroid Build Coastguard Worker data.writeInt64(size);
128*ec779b8eSAndroid Build Coastguard Worker data.write(params, size);
129*ec779b8eSAndroid Build Coastguard Worker remote()->transact(GET_CONFIG, data, &reply);
130*ec779b8eSAndroid Build Coastguard Worker
131*ec779b8eSAndroid Build Coastguard Worker status_t err = reply.readInt32();
132*ec779b8eSAndroid Build Coastguard Worker if (err != OK) {
133*ec779b8eSAndroid Build Coastguard Worker return err;
134*ec779b8eSAndroid Build Coastguard Worker }
135*ec779b8eSAndroid Build Coastguard Worker
136*ec779b8eSAndroid Build Coastguard Worker reply.read(params, size);
137*ec779b8eSAndroid Build Coastguard Worker
138*ec779b8eSAndroid Build Coastguard Worker return OK;
139*ec779b8eSAndroid Build Coastguard Worker }
140*ec779b8eSAndroid Build Coastguard Worker
setConfig(OMX_INDEXTYPE index,const void * params,size_t size)141*ec779b8eSAndroid Build Coastguard Worker virtual status_t setConfig(
142*ec779b8eSAndroid Build Coastguard Worker OMX_INDEXTYPE index,
143*ec779b8eSAndroid Build Coastguard Worker const void *params, size_t size) {
144*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
145*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
146*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(index);
147*ec779b8eSAndroid Build Coastguard Worker data.writeInt64(size);
148*ec779b8eSAndroid Build Coastguard Worker data.write(params, size);
149*ec779b8eSAndroid Build Coastguard Worker remote()->transact(SET_CONFIG, data, &reply);
150*ec779b8eSAndroid Build Coastguard Worker
151*ec779b8eSAndroid Build Coastguard Worker return reply.readInt32();
152*ec779b8eSAndroid Build Coastguard Worker }
153*ec779b8eSAndroid Build Coastguard Worker
setPortMode(OMX_U32 port_index,IOMX::PortMode mode)154*ec779b8eSAndroid Build Coastguard Worker virtual status_t setPortMode(
155*ec779b8eSAndroid Build Coastguard Worker OMX_U32 port_index, IOMX::PortMode mode) {
156*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
157*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
158*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(port_index);
159*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(mode);
160*ec779b8eSAndroid Build Coastguard Worker remote()->transact(SET_PORT_MODE, data, &reply);
161*ec779b8eSAndroid Build Coastguard Worker
162*ec779b8eSAndroid Build Coastguard Worker return reply.readInt32();
163*ec779b8eSAndroid Build Coastguard Worker }
164*ec779b8eSAndroid Build Coastguard Worker
getGraphicBufferUsage(OMX_U32 port_index,OMX_U32 * usage)165*ec779b8eSAndroid Build Coastguard Worker virtual status_t getGraphicBufferUsage(
166*ec779b8eSAndroid Build Coastguard Worker OMX_U32 port_index, OMX_U32* usage) {
167*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
168*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
169*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(port_index);
170*ec779b8eSAndroid Build Coastguard Worker remote()->transact(GET_GRAPHIC_BUFFER_USAGE, data, &reply);
171*ec779b8eSAndroid Build Coastguard Worker
172*ec779b8eSAndroid Build Coastguard Worker status_t err = reply.readInt32();
173*ec779b8eSAndroid Build Coastguard Worker *usage = reply.readInt32();
174*ec779b8eSAndroid Build Coastguard Worker return err;
175*ec779b8eSAndroid Build Coastguard Worker }
176*ec779b8eSAndroid Build Coastguard Worker
useBuffer(OMX_U32 port_index,const OMXBuffer & omxBuf,buffer_id * buffer)177*ec779b8eSAndroid Build Coastguard Worker virtual status_t useBuffer(
178*ec779b8eSAndroid Build Coastguard Worker OMX_U32 port_index, const OMXBuffer &omxBuf, buffer_id *buffer) {
179*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
180*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
181*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(port_index);
182*ec779b8eSAndroid Build Coastguard Worker
183*ec779b8eSAndroid Build Coastguard Worker status_t err = omxBuf.writeToParcel(&data);
184*ec779b8eSAndroid Build Coastguard Worker if (err != OK) {
185*ec779b8eSAndroid Build Coastguard Worker return err;
186*ec779b8eSAndroid Build Coastguard Worker }
187*ec779b8eSAndroid Build Coastguard Worker
188*ec779b8eSAndroid Build Coastguard Worker remote()->transact(USE_BUFFER, data, &reply);
189*ec779b8eSAndroid Build Coastguard Worker
190*ec779b8eSAndroid Build Coastguard Worker err = reply.readInt32();
191*ec779b8eSAndroid Build Coastguard Worker if (err != OK) {
192*ec779b8eSAndroid Build Coastguard Worker *buffer = 0;
193*ec779b8eSAndroid Build Coastguard Worker
194*ec779b8eSAndroid Build Coastguard Worker return err;
195*ec779b8eSAndroid Build Coastguard Worker }
196*ec779b8eSAndroid Build Coastguard Worker
197*ec779b8eSAndroid Build Coastguard Worker *buffer = (buffer_id)reply.readInt32();
198*ec779b8eSAndroid Build Coastguard Worker
199*ec779b8eSAndroid Build Coastguard Worker return err;
200*ec779b8eSAndroid Build Coastguard Worker }
201*ec779b8eSAndroid Build Coastguard Worker
setInputSurface(const sp<IOMXBufferSource> & bufferSource)202*ec779b8eSAndroid Build Coastguard Worker virtual status_t setInputSurface(
203*ec779b8eSAndroid Build Coastguard Worker const sp<IOMXBufferSource> &bufferSource) {
204*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
205*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
206*ec779b8eSAndroid Build Coastguard Worker
207*ec779b8eSAndroid Build Coastguard Worker data.writeStrongBinder(IInterface::asBinder(bufferSource));
208*ec779b8eSAndroid Build Coastguard Worker
209*ec779b8eSAndroid Build Coastguard Worker status_t err = remote()->transact(SET_INPUT_SURFACE, data, &reply);
210*ec779b8eSAndroid Build Coastguard Worker
211*ec779b8eSAndroid Build Coastguard Worker if (err != OK) {
212*ec779b8eSAndroid Build Coastguard Worker ALOGW("binder transaction failed: %d", err);
213*ec779b8eSAndroid Build Coastguard Worker return err;
214*ec779b8eSAndroid Build Coastguard Worker }
215*ec779b8eSAndroid Build Coastguard Worker
216*ec779b8eSAndroid Build Coastguard Worker err = reply.readInt32();
217*ec779b8eSAndroid Build Coastguard Worker
218*ec779b8eSAndroid Build Coastguard Worker return err;
219*ec779b8eSAndroid Build Coastguard Worker }
220*ec779b8eSAndroid Build Coastguard Worker
prepareForAdaptivePlayback(OMX_U32 port_index,OMX_BOOL enable,OMX_U32 max_width,OMX_U32 max_height)221*ec779b8eSAndroid Build Coastguard Worker virtual status_t prepareForAdaptivePlayback(
222*ec779b8eSAndroid Build Coastguard Worker OMX_U32 port_index, OMX_BOOL enable,
223*ec779b8eSAndroid Build Coastguard Worker OMX_U32 max_width, OMX_U32 max_height) {
224*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
225*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
226*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(port_index);
227*ec779b8eSAndroid Build Coastguard Worker data.writeInt32((int32_t)enable);
228*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(max_width);
229*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(max_height);
230*ec779b8eSAndroid Build Coastguard Worker remote()->transact(PREPARE_FOR_ADAPTIVE_PLAYBACK, data, &reply);
231*ec779b8eSAndroid Build Coastguard Worker
232*ec779b8eSAndroid Build Coastguard Worker status_t err = reply.readInt32();
233*ec779b8eSAndroid Build Coastguard Worker return err;
234*ec779b8eSAndroid Build Coastguard Worker }
235*ec779b8eSAndroid Build Coastguard Worker
configureVideoTunnelMode(OMX_U32 portIndex,OMX_BOOL tunneled,OMX_U32 audioHwSync,native_handle_t ** sidebandHandle)236*ec779b8eSAndroid Build Coastguard Worker virtual status_t configureVideoTunnelMode(
237*ec779b8eSAndroid Build Coastguard Worker OMX_U32 portIndex, OMX_BOOL tunneled,
238*ec779b8eSAndroid Build Coastguard Worker OMX_U32 audioHwSync, native_handle_t **sidebandHandle ) {
239*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
240*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
241*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(portIndex);
242*ec779b8eSAndroid Build Coastguard Worker data.writeInt32((int32_t)tunneled);
243*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(audioHwSync);
244*ec779b8eSAndroid Build Coastguard Worker remote()->transact(CONFIGURE_VIDEO_TUNNEL_MODE, data, &reply);
245*ec779b8eSAndroid Build Coastguard Worker
246*ec779b8eSAndroid Build Coastguard Worker status_t err = reply.readInt32();
247*ec779b8eSAndroid Build Coastguard Worker if (err == OK && sidebandHandle) {
248*ec779b8eSAndroid Build Coastguard Worker *sidebandHandle = (native_handle_t *)reply.readNativeHandle();
249*ec779b8eSAndroid Build Coastguard Worker }
250*ec779b8eSAndroid Build Coastguard Worker return err;
251*ec779b8eSAndroid Build Coastguard Worker }
252*ec779b8eSAndroid Build Coastguard Worker
253*ec779b8eSAndroid Build Coastguard Worker
allocateSecureBuffer(OMX_U32 port_index,size_t size,buffer_id * buffer,void ** buffer_data,sp<NativeHandle> * native_handle)254*ec779b8eSAndroid Build Coastguard Worker virtual status_t allocateSecureBuffer(
255*ec779b8eSAndroid Build Coastguard Worker OMX_U32 port_index, size_t size,
256*ec779b8eSAndroid Build Coastguard Worker buffer_id *buffer, void **buffer_data, sp<NativeHandle> *native_handle) {
257*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
258*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
259*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(port_index);
260*ec779b8eSAndroid Build Coastguard Worker data.writeInt64(size);
261*ec779b8eSAndroid Build Coastguard Worker remote()->transact(ALLOC_SECURE_BUFFER, data, &reply);
262*ec779b8eSAndroid Build Coastguard Worker
263*ec779b8eSAndroid Build Coastguard Worker status_t err = reply.readInt32();
264*ec779b8eSAndroid Build Coastguard Worker if (err != OK) {
265*ec779b8eSAndroid Build Coastguard Worker *buffer = 0;
266*ec779b8eSAndroid Build Coastguard Worker *buffer_data = NULL;
267*ec779b8eSAndroid Build Coastguard Worker *native_handle = NULL;
268*ec779b8eSAndroid Build Coastguard Worker return err;
269*ec779b8eSAndroid Build Coastguard Worker }
270*ec779b8eSAndroid Build Coastguard Worker
271*ec779b8eSAndroid Build Coastguard Worker *buffer = (buffer_id)reply.readInt32();
272*ec779b8eSAndroid Build Coastguard Worker *buffer_data = (void *)reply.readInt64();
273*ec779b8eSAndroid Build Coastguard Worker if (*buffer_data == NULL) {
274*ec779b8eSAndroid Build Coastguard Worker *native_handle = NativeHandle::create(
275*ec779b8eSAndroid Build Coastguard Worker reply.readNativeHandle(), true /* ownsHandle */);
276*ec779b8eSAndroid Build Coastguard Worker } else {
277*ec779b8eSAndroid Build Coastguard Worker *native_handle = NULL;
278*ec779b8eSAndroid Build Coastguard Worker }
279*ec779b8eSAndroid Build Coastguard Worker return err;
280*ec779b8eSAndroid Build Coastguard Worker }
281*ec779b8eSAndroid Build Coastguard Worker
freeBuffer(OMX_U32 port_index,buffer_id buffer)282*ec779b8eSAndroid Build Coastguard Worker virtual status_t freeBuffer(
283*ec779b8eSAndroid Build Coastguard Worker OMX_U32 port_index, buffer_id buffer) {
284*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
285*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
286*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(port_index);
287*ec779b8eSAndroid Build Coastguard Worker data.writeInt32((int32_t)buffer);
288*ec779b8eSAndroid Build Coastguard Worker remote()->transact(FREE_BUFFER, data, &reply);
289*ec779b8eSAndroid Build Coastguard Worker
290*ec779b8eSAndroid Build Coastguard Worker return reply.readInt32();
291*ec779b8eSAndroid Build Coastguard Worker }
292*ec779b8eSAndroid Build Coastguard Worker
fillBuffer(buffer_id buffer,const OMXBuffer & omxBuf,int fenceFd)293*ec779b8eSAndroid Build Coastguard Worker virtual status_t fillBuffer(
294*ec779b8eSAndroid Build Coastguard Worker buffer_id buffer, const OMXBuffer &omxBuf, int fenceFd) {
295*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
296*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
297*ec779b8eSAndroid Build Coastguard Worker data.writeInt32((int32_t)buffer);
298*ec779b8eSAndroid Build Coastguard Worker status_t err = omxBuf.writeToParcel(&data);
299*ec779b8eSAndroid Build Coastguard Worker if (err != OK) {
300*ec779b8eSAndroid Build Coastguard Worker return err;
301*ec779b8eSAndroid Build Coastguard Worker }
302*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(fenceFd >= 0);
303*ec779b8eSAndroid Build Coastguard Worker if (fenceFd >= 0) {
304*ec779b8eSAndroid Build Coastguard Worker data.writeFileDescriptor(fenceFd, true /* takeOwnership */);
305*ec779b8eSAndroid Build Coastguard Worker }
306*ec779b8eSAndroid Build Coastguard Worker remote()->transact(FILL_BUFFER, data, &reply);
307*ec779b8eSAndroid Build Coastguard Worker
308*ec779b8eSAndroid Build Coastguard Worker return reply.readInt32();
309*ec779b8eSAndroid Build Coastguard Worker }
310*ec779b8eSAndroid Build Coastguard Worker
emptyBuffer(buffer_id buffer,const OMXBuffer & omxBuf,OMX_U32 flags,OMX_TICKS timestamp,int fenceFd)311*ec779b8eSAndroid Build Coastguard Worker virtual status_t emptyBuffer(
312*ec779b8eSAndroid Build Coastguard Worker buffer_id buffer, const OMXBuffer &omxBuf,
313*ec779b8eSAndroid Build Coastguard Worker OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) {
314*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
315*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
316*ec779b8eSAndroid Build Coastguard Worker data.writeInt32((int32_t)buffer);
317*ec779b8eSAndroid Build Coastguard Worker status_t err = omxBuf.writeToParcel(&data);
318*ec779b8eSAndroid Build Coastguard Worker if (err != OK) {
319*ec779b8eSAndroid Build Coastguard Worker return err;
320*ec779b8eSAndroid Build Coastguard Worker }
321*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(flags);
322*ec779b8eSAndroid Build Coastguard Worker data.writeInt64(timestamp);
323*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(fenceFd >= 0);
324*ec779b8eSAndroid Build Coastguard Worker if (fenceFd >= 0) {
325*ec779b8eSAndroid Build Coastguard Worker data.writeFileDescriptor(fenceFd, true /* takeOwnership */);
326*ec779b8eSAndroid Build Coastguard Worker }
327*ec779b8eSAndroid Build Coastguard Worker remote()->transact(EMPTY_BUFFER, data, &reply);
328*ec779b8eSAndroid Build Coastguard Worker
329*ec779b8eSAndroid Build Coastguard Worker return reply.readInt32();
330*ec779b8eSAndroid Build Coastguard Worker }
331*ec779b8eSAndroid Build Coastguard Worker
getExtensionIndex(const char * parameter_name,OMX_INDEXTYPE * index)332*ec779b8eSAndroid Build Coastguard Worker virtual status_t getExtensionIndex(
333*ec779b8eSAndroid Build Coastguard Worker const char *parameter_name,
334*ec779b8eSAndroid Build Coastguard Worker OMX_INDEXTYPE *index) {
335*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
336*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
337*ec779b8eSAndroid Build Coastguard Worker data.writeCString(parameter_name);
338*ec779b8eSAndroid Build Coastguard Worker
339*ec779b8eSAndroid Build Coastguard Worker remote()->transact(GET_EXTENSION_INDEX, data, &reply);
340*ec779b8eSAndroid Build Coastguard Worker
341*ec779b8eSAndroid Build Coastguard Worker status_t err = reply.readInt32();
342*ec779b8eSAndroid Build Coastguard Worker if (err == OK) {
343*ec779b8eSAndroid Build Coastguard Worker *index = static_cast<OMX_INDEXTYPE>(reply.readInt32());
344*ec779b8eSAndroid Build Coastguard Worker } else {
345*ec779b8eSAndroid Build Coastguard Worker *index = OMX_IndexComponentStartUnused;
346*ec779b8eSAndroid Build Coastguard Worker }
347*ec779b8eSAndroid Build Coastguard Worker
348*ec779b8eSAndroid Build Coastguard Worker return err;
349*ec779b8eSAndroid Build Coastguard Worker }
350*ec779b8eSAndroid Build Coastguard Worker
dispatchMessage(const omx_message & msg)351*ec779b8eSAndroid Build Coastguard Worker virtual status_t dispatchMessage(const omx_message &msg) {
352*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
353*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
354*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(msg.fenceFd >= 0);
355*ec779b8eSAndroid Build Coastguard Worker if (msg.fenceFd >= 0) {
356*ec779b8eSAndroid Build Coastguard Worker data.writeFileDescriptor(msg.fenceFd, true /* takeOwnership */);
357*ec779b8eSAndroid Build Coastguard Worker }
358*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(msg.type);
359*ec779b8eSAndroid Build Coastguard Worker data.write(&msg.u, sizeof(msg.u));
360*ec779b8eSAndroid Build Coastguard Worker
361*ec779b8eSAndroid Build Coastguard Worker remote()->transact(DISPATCH_MESSAGE, data, &reply);
362*ec779b8eSAndroid Build Coastguard Worker
363*ec779b8eSAndroid Build Coastguard Worker return reply.readInt32();
364*ec779b8eSAndroid Build Coastguard Worker }
365*ec779b8eSAndroid Build Coastguard Worker
setQuirks(OMX_U32 quirks)366*ec779b8eSAndroid Build Coastguard Worker virtual status_t setQuirks(OMX_U32 quirks) {
367*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
368*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
369*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(quirks);
370*ec779b8eSAndroid Build Coastguard Worker
371*ec779b8eSAndroid Build Coastguard Worker remote()->transact(SET_QUIRKS, data, &reply);
372*ec779b8eSAndroid Build Coastguard Worker
373*ec779b8eSAndroid Build Coastguard Worker return reply.readInt32();
374*ec779b8eSAndroid Build Coastguard Worker }
375*ec779b8eSAndroid Build Coastguard Worker };
376*ec779b8eSAndroid Build Coastguard Worker
377*ec779b8eSAndroid Build Coastguard Worker using ::android::hardware::media::omx::V1_0::utils::LWOmxNode;
378*ec779b8eSAndroid Build Coastguard Worker class HpOMXNode : public HpInterface<BpOMXNode, LWOmxNode> {
379*ec779b8eSAndroid Build Coastguard Worker public:
HpOMXNode(const sp<IBinder> & base)380*ec779b8eSAndroid Build Coastguard Worker HpOMXNode(const sp<IBinder>& base) : PBase(base) {}
381*ec779b8eSAndroid Build Coastguard Worker
freeNode()382*ec779b8eSAndroid Build Coastguard Worker virtual status_t freeNode() {
383*ec779b8eSAndroid Build Coastguard Worker return mBase->freeNode();
384*ec779b8eSAndroid Build Coastguard Worker }
385*ec779b8eSAndroid Build Coastguard Worker
sendCommand(OMX_COMMANDTYPE cmd,OMX_S32 param)386*ec779b8eSAndroid Build Coastguard Worker virtual status_t sendCommand(
387*ec779b8eSAndroid Build Coastguard Worker OMX_COMMANDTYPE cmd, OMX_S32 param) {
388*ec779b8eSAndroid Build Coastguard Worker return mBase->sendCommand(cmd, param);
389*ec779b8eSAndroid Build Coastguard Worker }
390*ec779b8eSAndroid Build Coastguard Worker
getParameter(OMX_INDEXTYPE index,void * params,size_t size)391*ec779b8eSAndroid Build Coastguard Worker virtual status_t getParameter(
392*ec779b8eSAndroid Build Coastguard Worker OMX_INDEXTYPE index, void *params, size_t size) {
393*ec779b8eSAndroid Build Coastguard Worker return mBase->getParameter(index, params, size);
394*ec779b8eSAndroid Build Coastguard Worker }
395*ec779b8eSAndroid Build Coastguard Worker
setParameter(OMX_INDEXTYPE index,const void * params,size_t size)396*ec779b8eSAndroid Build Coastguard Worker virtual status_t setParameter(
397*ec779b8eSAndroid Build Coastguard Worker OMX_INDEXTYPE index, const void *params, size_t size) {
398*ec779b8eSAndroid Build Coastguard Worker return mBase->setParameter(index, params, size);
399*ec779b8eSAndroid Build Coastguard Worker }
400*ec779b8eSAndroid Build Coastguard Worker
getConfig(OMX_INDEXTYPE index,void * params,size_t size)401*ec779b8eSAndroid Build Coastguard Worker virtual status_t getConfig(
402*ec779b8eSAndroid Build Coastguard Worker OMX_INDEXTYPE index, void *params, size_t size) {
403*ec779b8eSAndroid Build Coastguard Worker return mBase->getConfig(index, params, size);
404*ec779b8eSAndroid Build Coastguard Worker }
405*ec779b8eSAndroid Build Coastguard Worker
setConfig(OMX_INDEXTYPE index,const void * params,size_t size)406*ec779b8eSAndroid Build Coastguard Worker virtual status_t setConfig(
407*ec779b8eSAndroid Build Coastguard Worker OMX_INDEXTYPE index, const void *params, size_t size) {
408*ec779b8eSAndroid Build Coastguard Worker return mBase->setConfig(index, params, size);
409*ec779b8eSAndroid Build Coastguard Worker }
410*ec779b8eSAndroid Build Coastguard Worker
setPortMode(OMX_U32 port_index,IOMX::PortMode mode)411*ec779b8eSAndroid Build Coastguard Worker virtual status_t setPortMode(
412*ec779b8eSAndroid Build Coastguard Worker OMX_U32 port_index, IOMX::PortMode mode) {
413*ec779b8eSAndroid Build Coastguard Worker return mBase->setPortMode(port_index, mode);
414*ec779b8eSAndroid Build Coastguard Worker }
415*ec779b8eSAndroid Build Coastguard Worker
prepareForAdaptivePlayback(OMX_U32 portIndex,OMX_BOOL enable,OMX_U32 maxFrameWidth,OMX_U32 maxFrameHeight)416*ec779b8eSAndroid Build Coastguard Worker virtual status_t prepareForAdaptivePlayback(
417*ec779b8eSAndroid Build Coastguard Worker OMX_U32 portIndex, OMX_BOOL enable,
418*ec779b8eSAndroid Build Coastguard Worker OMX_U32 maxFrameWidth, OMX_U32 maxFrameHeight) {
419*ec779b8eSAndroid Build Coastguard Worker return mBase->prepareForAdaptivePlayback(
420*ec779b8eSAndroid Build Coastguard Worker portIndex, enable, maxFrameWidth, maxFrameHeight);
421*ec779b8eSAndroid Build Coastguard Worker }
422*ec779b8eSAndroid Build Coastguard Worker
configureVideoTunnelMode(OMX_U32 portIndex,OMX_BOOL tunneled,OMX_U32 audioHwSync,native_handle_t ** sidebandHandle)423*ec779b8eSAndroid Build Coastguard Worker virtual status_t configureVideoTunnelMode(
424*ec779b8eSAndroid Build Coastguard Worker OMX_U32 portIndex, OMX_BOOL tunneled,
425*ec779b8eSAndroid Build Coastguard Worker OMX_U32 audioHwSync, native_handle_t **sidebandHandle) {
426*ec779b8eSAndroid Build Coastguard Worker return mBase->configureVideoTunnelMode(
427*ec779b8eSAndroid Build Coastguard Worker portIndex, tunneled, audioHwSync, sidebandHandle);
428*ec779b8eSAndroid Build Coastguard Worker }
429*ec779b8eSAndroid Build Coastguard Worker
getGraphicBufferUsage(OMX_U32 port_index,OMX_U32 * usage)430*ec779b8eSAndroid Build Coastguard Worker virtual status_t getGraphicBufferUsage(
431*ec779b8eSAndroid Build Coastguard Worker OMX_U32 port_index, OMX_U32* usage) {
432*ec779b8eSAndroid Build Coastguard Worker return mBase->getGraphicBufferUsage(port_index, usage);
433*ec779b8eSAndroid Build Coastguard Worker }
434*ec779b8eSAndroid Build Coastguard Worker
setInputSurface(const sp<IOMXBufferSource> & bufferSource)435*ec779b8eSAndroid Build Coastguard Worker virtual status_t setInputSurface(
436*ec779b8eSAndroid Build Coastguard Worker const sp<IOMXBufferSource> &bufferSource) {
437*ec779b8eSAndroid Build Coastguard Worker return mBase->setInputSurface(bufferSource);
438*ec779b8eSAndroid Build Coastguard Worker }
439*ec779b8eSAndroid Build Coastguard Worker
allocateSecureBuffer(OMX_U32 port_index,size_t size,buffer_id * buffer,void ** buffer_data,sp<NativeHandle> * native_handle)440*ec779b8eSAndroid Build Coastguard Worker virtual status_t allocateSecureBuffer(
441*ec779b8eSAndroid Build Coastguard Worker OMX_U32 port_index, size_t size, buffer_id *buffer,
442*ec779b8eSAndroid Build Coastguard Worker void **buffer_data, sp<NativeHandle> *native_handle) {
443*ec779b8eSAndroid Build Coastguard Worker return mBase->allocateSecureBuffer(
444*ec779b8eSAndroid Build Coastguard Worker port_index, size, buffer, buffer_data, native_handle);
445*ec779b8eSAndroid Build Coastguard Worker }
446*ec779b8eSAndroid Build Coastguard Worker
useBuffer(OMX_U32 port_index,const OMXBuffer & omxBuf,buffer_id * buffer)447*ec779b8eSAndroid Build Coastguard Worker virtual status_t useBuffer(
448*ec779b8eSAndroid Build Coastguard Worker OMX_U32 port_index, const OMXBuffer &omxBuf, buffer_id *buffer) {
449*ec779b8eSAndroid Build Coastguard Worker return mBase->useBuffer(port_index, omxBuf, buffer);
450*ec779b8eSAndroid Build Coastguard Worker }
451*ec779b8eSAndroid Build Coastguard Worker
freeBuffer(OMX_U32 port_index,buffer_id buffer)452*ec779b8eSAndroid Build Coastguard Worker virtual status_t freeBuffer(
453*ec779b8eSAndroid Build Coastguard Worker OMX_U32 port_index, buffer_id buffer) {
454*ec779b8eSAndroid Build Coastguard Worker return mBase->freeBuffer(port_index, buffer);
455*ec779b8eSAndroid Build Coastguard Worker }
456*ec779b8eSAndroid Build Coastguard Worker
fillBuffer(buffer_id buffer,const OMXBuffer & omxBuf,int fenceFd=-1)457*ec779b8eSAndroid Build Coastguard Worker virtual status_t fillBuffer(
458*ec779b8eSAndroid Build Coastguard Worker buffer_id buffer, const OMXBuffer &omxBuf, int fenceFd = -1) {
459*ec779b8eSAndroid Build Coastguard Worker return mBase->fillBuffer(buffer, omxBuf, fenceFd);
460*ec779b8eSAndroid Build Coastguard Worker }
461*ec779b8eSAndroid Build Coastguard Worker
emptyBuffer(buffer_id buffer,const OMXBuffer & omxBuf,OMX_U32 flags,OMX_TICKS timestamp,int fenceFd=-1)462*ec779b8eSAndroid Build Coastguard Worker virtual status_t emptyBuffer(
463*ec779b8eSAndroid Build Coastguard Worker buffer_id buffer, const OMXBuffer &omxBuf,
464*ec779b8eSAndroid Build Coastguard Worker OMX_U32 flags, OMX_TICKS timestamp, int fenceFd = -1) {
465*ec779b8eSAndroid Build Coastguard Worker return mBase->emptyBuffer(buffer, omxBuf, flags, timestamp, fenceFd);
466*ec779b8eSAndroid Build Coastguard Worker }
467*ec779b8eSAndroid Build Coastguard Worker
getExtensionIndex(const char * parameter_name,OMX_INDEXTYPE * index)468*ec779b8eSAndroid Build Coastguard Worker virtual status_t getExtensionIndex(
469*ec779b8eSAndroid Build Coastguard Worker const char *parameter_name,
470*ec779b8eSAndroid Build Coastguard Worker OMX_INDEXTYPE *index) {
471*ec779b8eSAndroid Build Coastguard Worker return mBase->getExtensionIndex(parameter_name, index);
472*ec779b8eSAndroid Build Coastguard Worker }
473*ec779b8eSAndroid Build Coastguard Worker
dispatchMessage(const omx_message & msg)474*ec779b8eSAndroid Build Coastguard Worker virtual status_t dispatchMessage(const omx_message &msg) {
475*ec779b8eSAndroid Build Coastguard Worker return mBase->dispatchMessage(msg);
476*ec779b8eSAndroid Build Coastguard Worker }
477*ec779b8eSAndroid Build Coastguard Worker };
478*ec779b8eSAndroid Build Coastguard Worker
479*ec779b8eSAndroid Build Coastguard Worker IMPLEMENT_HYBRID_META_INTERFACE(OMXNode, "android.hardware.IOMXNode");
480*ec779b8eSAndroid Build Coastguard Worker
481*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
482*ec779b8eSAndroid Build Coastguard Worker
483*ec779b8eSAndroid Build Coastguard Worker #define CHECK_OMX_INTERFACE(interface, data, reply) \
484*ec779b8eSAndroid Build Coastguard Worker do { if (!(data).enforceInterface(interface::getInterfaceDescriptor())) { \
485*ec779b8eSAndroid Build Coastguard Worker ALOGW("Call incorrectly routed to " #interface); \
486*ec779b8eSAndroid Build Coastguard Worker return PERMISSION_DENIED; \
487*ec779b8eSAndroid Build Coastguard Worker } } while (0)
488*ec779b8eSAndroid Build Coastguard Worker
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)489*ec779b8eSAndroid Build Coastguard Worker status_t BnOMXNode::onTransact(
490*ec779b8eSAndroid Build Coastguard Worker uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
491*ec779b8eSAndroid Build Coastguard Worker switch (code) {
492*ec779b8eSAndroid Build Coastguard Worker case FREE_NODE:
493*ec779b8eSAndroid Build Coastguard Worker {
494*ec779b8eSAndroid Build Coastguard Worker CHECK_OMX_INTERFACE(IOMXNode, data, reply);
495*ec779b8eSAndroid Build Coastguard Worker
496*ec779b8eSAndroid Build Coastguard Worker reply->writeInt32(freeNode());
497*ec779b8eSAndroid Build Coastguard Worker
498*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
499*ec779b8eSAndroid Build Coastguard Worker }
500*ec779b8eSAndroid Build Coastguard Worker
501*ec779b8eSAndroid Build Coastguard Worker case SEND_COMMAND:
502*ec779b8eSAndroid Build Coastguard Worker {
503*ec779b8eSAndroid Build Coastguard Worker CHECK_OMX_INTERFACE(IOMXNode, data, reply);
504*ec779b8eSAndroid Build Coastguard Worker
505*ec779b8eSAndroid Build Coastguard Worker OMX_COMMANDTYPE cmd =
506*ec779b8eSAndroid Build Coastguard Worker static_cast<OMX_COMMANDTYPE>(data.readInt32());
507*ec779b8eSAndroid Build Coastguard Worker
508*ec779b8eSAndroid Build Coastguard Worker OMX_S32 param = data.readInt32();
509*ec779b8eSAndroid Build Coastguard Worker reply->writeInt32(sendCommand(cmd, param));
510*ec779b8eSAndroid Build Coastguard Worker
511*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
512*ec779b8eSAndroid Build Coastguard Worker }
513*ec779b8eSAndroid Build Coastguard Worker
514*ec779b8eSAndroid Build Coastguard Worker case GET_PARAMETER:
515*ec779b8eSAndroid Build Coastguard Worker case SET_PARAMETER:
516*ec779b8eSAndroid Build Coastguard Worker case GET_CONFIG:
517*ec779b8eSAndroid Build Coastguard Worker case SET_CONFIG:
518*ec779b8eSAndroid Build Coastguard Worker {
519*ec779b8eSAndroid Build Coastguard Worker CHECK_OMX_INTERFACE(IOMXNode, data, reply);
520*ec779b8eSAndroid Build Coastguard Worker
521*ec779b8eSAndroid Build Coastguard Worker OMX_INDEXTYPE index = static_cast<OMX_INDEXTYPE>(data.readInt32());
522*ec779b8eSAndroid Build Coastguard Worker
523*ec779b8eSAndroid Build Coastguard Worker size_t size = data.readInt64();
524*ec779b8eSAndroid Build Coastguard Worker
525*ec779b8eSAndroid Build Coastguard Worker status_t err = NOT_ENOUGH_DATA;
526*ec779b8eSAndroid Build Coastguard Worker void *params = NULL;
527*ec779b8eSAndroid Build Coastguard Worker size_t pageSize = 0;
528*ec779b8eSAndroid Build Coastguard Worker size_t allocSize = 0;
529*ec779b8eSAndroid Build Coastguard Worker bool isUsageBits = (index == (OMX_INDEXTYPE) OMX_IndexParamConsumerUsageBits);
530*ec779b8eSAndroid Build Coastguard Worker if ((isUsageBits && size < 4) || (!isUsageBits && size < 8)) {
531*ec779b8eSAndroid Build Coastguard Worker // we expect the structure to contain at least the size and
532*ec779b8eSAndroid Build Coastguard Worker // version, 8 bytes total
533*ec779b8eSAndroid Build Coastguard Worker ALOGE("b/27207275 (%zu) (%d/%d)", size, int(index), int(code));
534*ec779b8eSAndroid Build Coastguard Worker android_errorWriteLog(0x534e4554, "27207275");
535*ec779b8eSAndroid Build Coastguard Worker } else {
536*ec779b8eSAndroid Build Coastguard Worker err = NO_MEMORY;
537*ec779b8eSAndroid Build Coastguard Worker pageSize = (size_t) sysconf(_SC_PAGE_SIZE);
538*ec779b8eSAndroid Build Coastguard Worker if (size > SIZE_MAX - (pageSize * 2)) {
539*ec779b8eSAndroid Build Coastguard Worker ALOGE("requested param size too big");
540*ec779b8eSAndroid Build Coastguard Worker } else {
541*ec779b8eSAndroid Build Coastguard Worker allocSize = (size + pageSize * 2) & ~(pageSize - 1);
542*ec779b8eSAndroid Build Coastguard Worker params = mmap(NULL, allocSize, PROT_READ | PROT_WRITE,
543*ec779b8eSAndroid Build Coastguard Worker MAP_PRIVATE | MAP_ANONYMOUS, -1 /* fd */, 0 /* offset */);
544*ec779b8eSAndroid Build Coastguard Worker }
545*ec779b8eSAndroid Build Coastguard Worker if (params != MAP_FAILED && params != NULL) {
546*ec779b8eSAndroid Build Coastguard Worker err = data.read(params, size);
547*ec779b8eSAndroid Build Coastguard Worker if (err != OK) {
548*ec779b8eSAndroid Build Coastguard Worker android_errorWriteLog(0x534e4554, "26914474");
549*ec779b8eSAndroid Build Coastguard Worker } else {
550*ec779b8eSAndroid Build Coastguard Worker err = NOT_ENOUGH_DATA;
551*ec779b8eSAndroid Build Coastguard Worker OMX_U32 declaredSize = *(OMX_U32*)params;
552*ec779b8eSAndroid Build Coastguard Worker if (index != (OMX_INDEXTYPE) OMX_IndexParamConsumerUsageBits &&
553*ec779b8eSAndroid Build Coastguard Worker declaredSize > size) {
554*ec779b8eSAndroid Build Coastguard Worker // the buffer says it's bigger than it actually is
555*ec779b8eSAndroid Build Coastguard Worker ALOGE("b/27207275 (%u/%zu)", declaredSize, size);
556*ec779b8eSAndroid Build Coastguard Worker android_errorWriteLog(0x534e4554, "27207275");
557*ec779b8eSAndroid Build Coastguard Worker } else {
558*ec779b8eSAndroid Build Coastguard Worker // mark the last page as inaccessible, to avoid exploitation
559*ec779b8eSAndroid Build Coastguard Worker // of codecs that access past the end of the allocation because
560*ec779b8eSAndroid Build Coastguard Worker // they didn't check the size
561*ec779b8eSAndroid Build Coastguard Worker if (mprotect((char*)params + allocSize - pageSize, pageSize,
562*ec779b8eSAndroid Build Coastguard Worker PROT_NONE) != 0) {
563*ec779b8eSAndroid Build Coastguard Worker ALOGE("mprotect failed: %s", strerror(errno));
564*ec779b8eSAndroid Build Coastguard Worker } else {
565*ec779b8eSAndroid Build Coastguard Worker switch (code) {
566*ec779b8eSAndroid Build Coastguard Worker case GET_PARAMETER:
567*ec779b8eSAndroid Build Coastguard Worker err = getParameter(index, params, size);
568*ec779b8eSAndroid Build Coastguard Worker break;
569*ec779b8eSAndroid Build Coastguard Worker case SET_PARAMETER:
570*ec779b8eSAndroid Build Coastguard Worker err = setParameter(index, params, size);
571*ec779b8eSAndroid Build Coastguard Worker break;
572*ec779b8eSAndroid Build Coastguard Worker case GET_CONFIG:
573*ec779b8eSAndroid Build Coastguard Worker err = getConfig(index, params, size);
574*ec779b8eSAndroid Build Coastguard Worker break;
575*ec779b8eSAndroid Build Coastguard Worker case SET_CONFIG:
576*ec779b8eSAndroid Build Coastguard Worker err = setConfig(index, params, size);
577*ec779b8eSAndroid Build Coastguard Worker break;
578*ec779b8eSAndroid Build Coastguard Worker default:
579*ec779b8eSAndroid Build Coastguard Worker TRESPASS();
580*ec779b8eSAndroid Build Coastguard Worker }
581*ec779b8eSAndroid Build Coastguard Worker }
582*ec779b8eSAndroid Build Coastguard Worker }
583*ec779b8eSAndroid Build Coastguard Worker }
584*ec779b8eSAndroid Build Coastguard Worker } else {
585*ec779b8eSAndroid Build Coastguard Worker ALOGE("couldn't map: %s", strerror(errno));
586*ec779b8eSAndroid Build Coastguard Worker }
587*ec779b8eSAndroid Build Coastguard Worker }
588*ec779b8eSAndroid Build Coastguard Worker
589*ec779b8eSAndroid Build Coastguard Worker reply->writeInt32(err);
590*ec779b8eSAndroid Build Coastguard Worker
591*ec779b8eSAndroid Build Coastguard Worker if ((code == GET_PARAMETER || code == GET_CONFIG) && err == OK) {
592*ec779b8eSAndroid Build Coastguard Worker reply->write(params, size);
593*ec779b8eSAndroid Build Coastguard Worker }
594*ec779b8eSAndroid Build Coastguard Worker
595*ec779b8eSAndroid Build Coastguard Worker if (params) {
596*ec779b8eSAndroid Build Coastguard Worker munmap(params, allocSize);
597*ec779b8eSAndroid Build Coastguard Worker }
598*ec779b8eSAndroid Build Coastguard Worker params = NULL;
599*ec779b8eSAndroid Build Coastguard Worker
600*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
601*ec779b8eSAndroid Build Coastguard Worker }
602*ec779b8eSAndroid Build Coastguard Worker
603*ec779b8eSAndroid Build Coastguard Worker case SET_PORT_MODE:
604*ec779b8eSAndroid Build Coastguard Worker {
605*ec779b8eSAndroid Build Coastguard Worker CHECK_OMX_INTERFACE(IOMXNode, data, reply);
606*ec779b8eSAndroid Build Coastguard Worker OMX_U32 port_index = data.readInt32();
607*ec779b8eSAndroid Build Coastguard Worker IOMX::PortMode mode = (IOMX::PortMode) data.readInt32();
608*ec779b8eSAndroid Build Coastguard Worker reply->writeInt32(setPortMode(port_index, mode));
609*ec779b8eSAndroid Build Coastguard Worker
610*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
611*ec779b8eSAndroid Build Coastguard Worker }
612*ec779b8eSAndroid Build Coastguard Worker
613*ec779b8eSAndroid Build Coastguard Worker case GET_GRAPHIC_BUFFER_USAGE:
614*ec779b8eSAndroid Build Coastguard Worker {
615*ec779b8eSAndroid Build Coastguard Worker CHECK_OMX_INTERFACE(IOMXNode, data, reply);
616*ec779b8eSAndroid Build Coastguard Worker
617*ec779b8eSAndroid Build Coastguard Worker OMX_U32 port_index = data.readInt32();
618*ec779b8eSAndroid Build Coastguard Worker
619*ec779b8eSAndroid Build Coastguard Worker OMX_U32 usage = 0;
620*ec779b8eSAndroid Build Coastguard Worker status_t err = getGraphicBufferUsage(port_index, &usage);
621*ec779b8eSAndroid Build Coastguard Worker reply->writeInt32(err);
622*ec779b8eSAndroid Build Coastguard Worker reply->writeInt32(usage);
623*ec779b8eSAndroid Build Coastguard Worker
624*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
625*ec779b8eSAndroid Build Coastguard Worker }
626*ec779b8eSAndroid Build Coastguard Worker
627*ec779b8eSAndroid Build Coastguard Worker case USE_BUFFER:
628*ec779b8eSAndroid Build Coastguard Worker {
629*ec779b8eSAndroid Build Coastguard Worker CHECK_OMX_INTERFACE(IOMXNode, data, reply);
630*ec779b8eSAndroid Build Coastguard Worker
631*ec779b8eSAndroid Build Coastguard Worker OMX_U32 port_index = data.readInt32();
632*ec779b8eSAndroid Build Coastguard Worker
633*ec779b8eSAndroid Build Coastguard Worker OMXBuffer omxBuf;
634*ec779b8eSAndroid Build Coastguard Worker status_t err = omxBuf.readFromParcel(&data);
635*ec779b8eSAndroid Build Coastguard Worker if (err != OK) {
636*ec779b8eSAndroid Build Coastguard Worker return err;
637*ec779b8eSAndroid Build Coastguard Worker }
638*ec779b8eSAndroid Build Coastguard Worker
639*ec779b8eSAndroid Build Coastguard Worker buffer_id buffer;
640*ec779b8eSAndroid Build Coastguard Worker err = useBuffer(port_index, omxBuf, &buffer);
641*ec779b8eSAndroid Build Coastguard Worker reply->writeInt32(err);
642*ec779b8eSAndroid Build Coastguard Worker
643*ec779b8eSAndroid Build Coastguard Worker if (err == OK) {
644*ec779b8eSAndroid Build Coastguard Worker reply->writeInt32((int32_t)buffer);
645*ec779b8eSAndroid Build Coastguard Worker }
646*ec779b8eSAndroid Build Coastguard Worker
647*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
648*ec779b8eSAndroid Build Coastguard Worker }
649*ec779b8eSAndroid Build Coastguard Worker
650*ec779b8eSAndroid Build Coastguard Worker case SET_INPUT_SURFACE:
651*ec779b8eSAndroid Build Coastguard Worker {
652*ec779b8eSAndroid Build Coastguard Worker CHECK_OMX_INTERFACE(IOMXNode, data, reply);
653*ec779b8eSAndroid Build Coastguard Worker
654*ec779b8eSAndroid Build Coastguard Worker sp<IOMXBufferSource> bufferSource =
655*ec779b8eSAndroid Build Coastguard Worker interface_cast<IOMXBufferSource>(data.readStrongBinder());
656*ec779b8eSAndroid Build Coastguard Worker
657*ec779b8eSAndroid Build Coastguard Worker status_t err = setInputSurface(bufferSource);
658*ec779b8eSAndroid Build Coastguard Worker reply->writeInt32(err);
659*ec779b8eSAndroid Build Coastguard Worker
660*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
661*ec779b8eSAndroid Build Coastguard Worker }
662*ec779b8eSAndroid Build Coastguard Worker
663*ec779b8eSAndroid Build Coastguard Worker case PREPARE_FOR_ADAPTIVE_PLAYBACK:
664*ec779b8eSAndroid Build Coastguard Worker {
665*ec779b8eSAndroid Build Coastguard Worker CHECK_OMX_INTERFACE(IOMXNode, data, reply);
666*ec779b8eSAndroid Build Coastguard Worker
667*ec779b8eSAndroid Build Coastguard Worker OMX_U32 port_index = data.readInt32();
668*ec779b8eSAndroid Build Coastguard Worker OMX_BOOL enable = (OMX_BOOL)data.readInt32();
669*ec779b8eSAndroid Build Coastguard Worker OMX_U32 max_width = data.readInt32();
670*ec779b8eSAndroid Build Coastguard Worker OMX_U32 max_height = data.readInt32();
671*ec779b8eSAndroid Build Coastguard Worker
672*ec779b8eSAndroid Build Coastguard Worker status_t err = prepareForAdaptivePlayback(
673*ec779b8eSAndroid Build Coastguard Worker port_index, enable, max_width, max_height);
674*ec779b8eSAndroid Build Coastguard Worker reply->writeInt32(err);
675*ec779b8eSAndroid Build Coastguard Worker
676*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
677*ec779b8eSAndroid Build Coastguard Worker }
678*ec779b8eSAndroid Build Coastguard Worker
679*ec779b8eSAndroid Build Coastguard Worker case CONFIGURE_VIDEO_TUNNEL_MODE:
680*ec779b8eSAndroid Build Coastguard Worker {
681*ec779b8eSAndroid Build Coastguard Worker CHECK_OMX_INTERFACE(IOMXNode, data, reply);
682*ec779b8eSAndroid Build Coastguard Worker
683*ec779b8eSAndroid Build Coastguard Worker OMX_U32 port_index = data.readInt32();
684*ec779b8eSAndroid Build Coastguard Worker OMX_BOOL tunneled = (OMX_BOOL)data.readInt32();
685*ec779b8eSAndroid Build Coastguard Worker OMX_U32 audio_hw_sync = data.readInt32();
686*ec779b8eSAndroid Build Coastguard Worker
687*ec779b8eSAndroid Build Coastguard Worker native_handle_t *sideband_handle = NULL;
688*ec779b8eSAndroid Build Coastguard Worker status_t err = configureVideoTunnelMode(
689*ec779b8eSAndroid Build Coastguard Worker port_index, tunneled, audio_hw_sync, &sideband_handle);
690*ec779b8eSAndroid Build Coastguard Worker reply->writeInt32(err);
691*ec779b8eSAndroid Build Coastguard Worker if(err == OK){
692*ec779b8eSAndroid Build Coastguard Worker reply->writeNativeHandle(sideband_handle);
693*ec779b8eSAndroid Build Coastguard Worker }
694*ec779b8eSAndroid Build Coastguard Worker
695*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
696*ec779b8eSAndroid Build Coastguard Worker }
697*ec779b8eSAndroid Build Coastguard Worker
698*ec779b8eSAndroid Build Coastguard Worker case ALLOC_SECURE_BUFFER:
699*ec779b8eSAndroid Build Coastguard Worker {
700*ec779b8eSAndroid Build Coastguard Worker CHECK_OMX_INTERFACE(IOMXNode, data, reply);
701*ec779b8eSAndroid Build Coastguard Worker
702*ec779b8eSAndroid Build Coastguard Worker OMX_U32 port_index = data.readInt32();
703*ec779b8eSAndroid Build Coastguard Worker if (!isSecure() || port_index != 0 /* kPortIndexInput */) {
704*ec779b8eSAndroid Build Coastguard Worker ALOGE("b/24310423");
705*ec779b8eSAndroid Build Coastguard Worker reply->writeInt32(INVALID_OPERATION);
706*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
707*ec779b8eSAndroid Build Coastguard Worker }
708*ec779b8eSAndroid Build Coastguard Worker
709*ec779b8eSAndroid Build Coastguard Worker size_t size = data.readInt64();
710*ec779b8eSAndroid Build Coastguard Worker
711*ec779b8eSAndroid Build Coastguard Worker buffer_id buffer;
712*ec779b8eSAndroid Build Coastguard Worker void *buffer_data = NULL;
713*ec779b8eSAndroid Build Coastguard Worker sp<NativeHandle> native_handle;
714*ec779b8eSAndroid Build Coastguard Worker status_t err = allocateSecureBuffer(
715*ec779b8eSAndroid Build Coastguard Worker port_index, size, &buffer, &buffer_data, &native_handle);
716*ec779b8eSAndroid Build Coastguard Worker reply->writeInt32(err);
717*ec779b8eSAndroid Build Coastguard Worker
718*ec779b8eSAndroid Build Coastguard Worker if (err == OK) {
719*ec779b8eSAndroid Build Coastguard Worker reply->writeInt32((int32_t)buffer);
720*ec779b8eSAndroid Build Coastguard Worker reply->writeInt64((uintptr_t)buffer_data);
721*ec779b8eSAndroid Build Coastguard Worker if (buffer_data == NULL) {
722*ec779b8eSAndroid Build Coastguard Worker reply->writeNativeHandle(native_handle == NULL ? NULL : native_handle->handle());
723*ec779b8eSAndroid Build Coastguard Worker }
724*ec779b8eSAndroid Build Coastguard Worker }
725*ec779b8eSAndroid Build Coastguard Worker
726*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
727*ec779b8eSAndroid Build Coastguard Worker }
728*ec779b8eSAndroid Build Coastguard Worker
729*ec779b8eSAndroid Build Coastguard Worker case FREE_BUFFER:
730*ec779b8eSAndroid Build Coastguard Worker {
731*ec779b8eSAndroid Build Coastguard Worker CHECK_OMX_INTERFACE(IOMXNode, data, reply);
732*ec779b8eSAndroid Build Coastguard Worker
733*ec779b8eSAndroid Build Coastguard Worker OMX_U32 port_index = data.readInt32();
734*ec779b8eSAndroid Build Coastguard Worker buffer_id buffer = (buffer_id)data.readInt32();
735*ec779b8eSAndroid Build Coastguard Worker reply->writeInt32(freeBuffer(port_index, buffer));
736*ec779b8eSAndroid Build Coastguard Worker
737*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
738*ec779b8eSAndroid Build Coastguard Worker }
739*ec779b8eSAndroid Build Coastguard Worker
740*ec779b8eSAndroid Build Coastguard Worker case FILL_BUFFER:
741*ec779b8eSAndroid Build Coastguard Worker {
742*ec779b8eSAndroid Build Coastguard Worker CHECK_OMX_INTERFACE(IOMXNode, data, reply);
743*ec779b8eSAndroid Build Coastguard Worker
744*ec779b8eSAndroid Build Coastguard Worker buffer_id buffer = (buffer_id)data.readInt32();
745*ec779b8eSAndroid Build Coastguard Worker
746*ec779b8eSAndroid Build Coastguard Worker OMXBuffer omxBuf;
747*ec779b8eSAndroid Build Coastguard Worker status_t err = omxBuf.readFromParcel(&data);
748*ec779b8eSAndroid Build Coastguard Worker if (err != OK) {
749*ec779b8eSAndroid Build Coastguard Worker return err;
750*ec779b8eSAndroid Build Coastguard Worker }
751*ec779b8eSAndroid Build Coastguard Worker
752*ec779b8eSAndroid Build Coastguard Worker bool haveFence = data.readInt32();
753*ec779b8eSAndroid Build Coastguard Worker int fenceFd = haveFence ? ::dup(data.readFileDescriptor()) : -1;
754*ec779b8eSAndroid Build Coastguard Worker
755*ec779b8eSAndroid Build Coastguard Worker reply->writeInt32(fillBuffer(buffer, omxBuf, fenceFd));
756*ec779b8eSAndroid Build Coastguard Worker
757*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
758*ec779b8eSAndroid Build Coastguard Worker }
759*ec779b8eSAndroid Build Coastguard Worker
760*ec779b8eSAndroid Build Coastguard Worker case EMPTY_BUFFER:
761*ec779b8eSAndroid Build Coastguard Worker {
762*ec779b8eSAndroid Build Coastguard Worker CHECK_OMX_INTERFACE(IOMXNode, data, reply);
763*ec779b8eSAndroid Build Coastguard Worker
764*ec779b8eSAndroid Build Coastguard Worker buffer_id buffer = (buffer_id)data.readInt32();
765*ec779b8eSAndroid Build Coastguard Worker OMXBuffer omxBuf;
766*ec779b8eSAndroid Build Coastguard Worker status_t err = omxBuf.readFromParcel(&data);
767*ec779b8eSAndroid Build Coastguard Worker if (err != OK) {
768*ec779b8eSAndroid Build Coastguard Worker return err;
769*ec779b8eSAndroid Build Coastguard Worker }
770*ec779b8eSAndroid Build Coastguard Worker OMX_U32 flags = data.readInt32();
771*ec779b8eSAndroid Build Coastguard Worker OMX_TICKS timestamp = data.readInt64();
772*ec779b8eSAndroid Build Coastguard Worker bool haveFence = data.readInt32();
773*ec779b8eSAndroid Build Coastguard Worker int fenceFd = haveFence ? ::dup(data.readFileDescriptor()) : -1;
774*ec779b8eSAndroid Build Coastguard Worker reply->writeInt32(emptyBuffer(
775*ec779b8eSAndroid Build Coastguard Worker buffer, omxBuf, flags, timestamp, fenceFd));
776*ec779b8eSAndroid Build Coastguard Worker
777*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
778*ec779b8eSAndroid Build Coastguard Worker }
779*ec779b8eSAndroid Build Coastguard Worker
780*ec779b8eSAndroid Build Coastguard Worker case GET_EXTENSION_INDEX:
781*ec779b8eSAndroid Build Coastguard Worker {
782*ec779b8eSAndroid Build Coastguard Worker CHECK_OMX_INTERFACE(IOMXNode, data, reply);
783*ec779b8eSAndroid Build Coastguard Worker
784*ec779b8eSAndroid Build Coastguard Worker const char *parameter_name = data.readCString();
785*ec779b8eSAndroid Build Coastguard Worker
786*ec779b8eSAndroid Build Coastguard Worker if (parameter_name == NULL) {
787*ec779b8eSAndroid Build Coastguard Worker ALOGE("b/26392700");
788*ec779b8eSAndroid Build Coastguard Worker reply->writeInt32(INVALID_OPERATION);
789*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
790*ec779b8eSAndroid Build Coastguard Worker }
791*ec779b8eSAndroid Build Coastguard Worker
792*ec779b8eSAndroid Build Coastguard Worker OMX_INDEXTYPE index;
793*ec779b8eSAndroid Build Coastguard Worker status_t err = getExtensionIndex(parameter_name, &index);
794*ec779b8eSAndroid Build Coastguard Worker
795*ec779b8eSAndroid Build Coastguard Worker reply->writeInt32(err);
796*ec779b8eSAndroid Build Coastguard Worker
797*ec779b8eSAndroid Build Coastguard Worker if (err == OK) {
798*ec779b8eSAndroid Build Coastguard Worker reply->writeInt32(index);
799*ec779b8eSAndroid Build Coastguard Worker }
800*ec779b8eSAndroid Build Coastguard Worker
801*ec779b8eSAndroid Build Coastguard Worker return OK;
802*ec779b8eSAndroid Build Coastguard Worker }
803*ec779b8eSAndroid Build Coastguard Worker
804*ec779b8eSAndroid Build Coastguard Worker case DISPATCH_MESSAGE:
805*ec779b8eSAndroid Build Coastguard Worker {
806*ec779b8eSAndroid Build Coastguard Worker CHECK_OMX_INTERFACE(IOMXNode, data, reply);
807*ec779b8eSAndroid Build Coastguard Worker omx_message msg;
808*ec779b8eSAndroid Build Coastguard Worker int haveFence = data.readInt32();
809*ec779b8eSAndroid Build Coastguard Worker msg.fenceFd = haveFence ? ::dup(data.readFileDescriptor()) : -1;
810*ec779b8eSAndroid Build Coastguard Worker msg.type = (typeof(msg.type))data.readInt32();
811*ec779b8eSAndroid Build Coastguard Worker status_t err = data.read(&msg.u, sizeof(msg.u));
812*ec779b8eSAndroid Build Coastguard Worker
813*ec779b8eSAndroid Build Coastguard Worker if (err == OK) {
814*ec779b8eSAndroid Build Coastguard Worker err = dispatchMessage(msg);
815*ec779b8eSAndroid Build Coastguard Worker }
816*ec779b8eSAndroid Build Coastguard Worker reply->writeInt32(err);
817*ec779b8eSAndroid Build Coastguard Worker
818*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
819*ec779b8eSAndroid Build Coastguard Worker }
820*ec779b8eSAndroid Build Coastguard Worker
821*ec779b8eSAndroid Build Coastguard Worker default:
822*ec779b8eSAndroid Build Coastguard Worker return BBinder::onTransact(code, data, reply, flags);
823*ec779b8eSAndroid Build Coastguard Worker }
824*ec779b8eSAndroid Build Coastguard Worker }
825*ec779b8eSAndroid Build Coastguard Worker
826*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
827*ec779b8eSAndroid Build Coastguard Worker
828*ec779b8eSAndroid Build Coastguard Worker class BpOMXObserver : public BpInterface<IOMXObserver> {
829*ec779b8eSAndroid Build Coastguard Worker public:
BpOMXObserver(const sp<IBinder> & impl)830*ec779b8eSAndroid Build Coastguard Worker explicit BpOMXObserver(const sp<IBinder> &impl)
831*ec779b8eSAndroid Build Coastguard Worker : BpInterface<IOMXObserver>(impl) {
832*ec779b8eSAndroid Build Coastguard Worker }
833*ec779b8eSAndroid Build Coastguard Worker
onMessages(const std::list<omx_message> & messages)834*ec779b8eSAndroid Build Coastguard Worker virtual void onMessages(const std::list<omx_message> &messages) {
835*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
836*ec779b8eSAndroid Build Coastguard Worker std::list<omx_message>::const_iterator it = messages.cbegin();
837*ec779b8eSAndroid Build Coastguard Worker if (messages.empty()) {
838*ec779b8eSAndroid Build Coastguard Worker return;
839*ec779b8eSAndroid Build Coastguard Worker }
840*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IOMXObserver::getInterfaceDescriptor());
841*ec779b8eSAndroid Build Coastguard Worker while (it != messages.cend()) {
842*ec779b8eSAndroid Build Coastguard Worker const omx_message &msg = *it++;
843*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(msg.fenceFd >= 0);
844*ec779b8eSAndroid Build Coastguard Worker if (msg.fenceFd >= 0) {
845*ec779b8eSAndroid Build Coastguard Worker data.writeFileDescriptor(msg.fenceFd, true /* takeOwnership */);
846*ec779b8eSAndroid Build Coastguard Worker }
847*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(msg.type);
848*ec779b8eSAndroid Build Coastguard Worker data.write(&msg.u, sizeof(msg.u));
849*ec779b8eSAndroid Build Coastguard Worker ALOGV("onMessage writing message %d, size %zu", msg.type, sizeof(msg));
850*ec779b8eSAndroid Build Coastguard Worker }
851*ec779b8eSAndroid Build Coastguard Worker data.writeInt32(-1); // mark end
852*ec779b8eSAndroid Build Coastguard Worker remote()->transact(OBSERVER_ON_MSG, data, &reply, IBinder::FLAG_ONEWAY);
853*ec779b8eSAndroid Build Coastguard Worker }
854*ec779b8eSAndroid Build Coastguard Worker };
855*ec779b8eSAndroid Build Coastguard Worker
856*ec779b8eSAndroid Build Coastguard Worker IMPLEMENT_META_INTERFACE(OMXObserver, "android.hardware.IOMXObserver");
857*ec779b8eSAndroid Build Coastguard Worker
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)858*ec779b8eSAndroid Build Coastguard Worker status_t BnOMXObserver::onTransact(
859*ec779b8eSAndroid Build Coastguard Worker uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
860*ec779b8eSAndroid Build Coastguard Worker switch (code) {
861*ec779b8eSAndroid Build Coastguard Worker case OBSERVER_ON_MSG:
862*ec779b8eSAndroid Build Coastguard Worker {
863*ec779b8eSAndroid Build Coastguard Worker CHECK_OMX_INTERFACE(IOMXObserver, data, reply);
864*ec779b8eSAndroid Build Coastguard Worker std::list<omx_message> messages;
865*ec779b8eSAndroid Build Coastguard Worker status_t err = FAILED_TRANSACTION; // must receive at least one message
866*ec779b8eSAndroid Build Coastguard Worker do {
867*ec779b8eSAndroid Build Coastguard Worker int haveFence = data.readInt32();
868*ec779b8eSAndroid Build Coastguard Worker if (haveFence < 0) { // we use -1 to mark end of messages
869*ec779b8eSAndroid Build Coastguard Worker break;
870*ec779b8eSAndroid Build Coastguard Worker }
871*ec779b8eSAndroid Build Coastguard Worker omx_message msg;
872*ec779b8eSAndroid Build Coastguard Worker msg.fenceFd = haveFence ? ::dup(data.readFileDescriptor()) : -1;
873*ec779b8eSAndroid Build Coastguard Worker msg.type = (typeof(msg.type))data.readInt32();
874*ec779b8eSAndroid Build Coastguard Worker err = data.read(&msg.u, sizeof(msg.u));
875*ec779b8eSAndroid Build Coastguard Worker ALOGV("onTransact reading message %d, size %zu", msg.type, sizeof(msg));
876*ec779b8eSAndroid Build Coastguard Worker messages.push_back(msg);
877*ec779b8eSAndroid Build Coastguard Worker } while (err == OK);
878*ec779b8eSAndroid Build Coastguard Worker
879*ec779b8eSAndroid Build Coastguard Worker if (err == OK) {
880*ec779b8eSAndroid Build Coastguard Worker onMessages(messages);
881*ec779b8eSAndroid Build Coastguard Worker }
882*ec779b8eSAndroid Build Coastguard Worker
883*ec779b8eSAndroid Build Coastguard Worker return err;
884*ec779b8eSAndroid Build Coastguard Worker }
885*ec779b8eSAndroid Build Coastguard Worker
886*ec779b8eSAndroid Build Coastguard Worker default:
887*ec779b8eSAndroid Build Coastguard Worker return BBinder::onTransact(code, data, reply, flags);
888*ec779b8eSAndroid Build Coastguard Worker }
889*ec779b8eSAndroid Build Coastguard Worker }
890*ec779b8eSAndroid Build Coastguard Worker
891*ec779b8eSAndroid Build Coastguard Worker } // namespace android
892