blob: 71e22cedf035605bdcbf4611e49ad440585b8ddd [file] [log] [blame]
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001/*
2 * Copyright (C) 2010 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
17#include <stdint.h>
18#include <sys/types.h>
19
20#include <utils/Errors.h>
Jesse Hall399184a2014-03-03 15:42:54 -080021#include <utils/NativeHandle.h>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080022#include <utils/RefBase.h>
Brian Anderson175a7202016-10-10 16:52:56 -070023#include <utils/String8.h>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080024#include <utils/Timers.h>
Jesse Hall399184a2014-03-03 15:42:54 -080025#include <utils/Vector.h>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080026
27#include <binder/Parcel.h>
28#include <binder/IInterface.h>
29
Chia-I Wuc79a2962017-05-15 10:32:27 -070030#include <gui/BufferQueueDefs.h>
Andy McFadden2adaf042012-12-18 09:49:45 -080031#include <gui/IGraphicBufferProducer.h>
Dan Stozaf0eaf252014-03-21 13:05:51 -070032#include <gui/IProducerListener.h>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080033
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -080034#include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h>
35
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080036namespace android {
37// ----------------------------------------------------------------------------
38
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -080039using ::android::hardware::graphics::bufferqueue::V1_0::utils::
40 H2BGraphicBufferProducer;
41
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080042enum {
43 REQUEST_BUFFER = IBinder::FIRST_CALL_TRANSACTION,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080044 DEQUEUE_BUFFER,
Dan Stoza9f3053d2014-03-06 15:14:33 -080045 DETACH_BUFFER,
Dan Stozad9822a32014-03-28 15:25:31 -070046 DETACH_NEXT_BUFFER,
Dan Stoza9f3053d2014-03-06 15:14:33 -080047 ATTACH_BUFFER,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080048 QUEUE_BUFFER,
49 CANCEL_BUFFER,
Mathias Agopianeafabcd2011-04-20 14:20:59 -070050 QUERY,
Jamie Gennisfe0a87b2011-07-13 19:12:20 -070051 CONNECT,
52 DISCONNECT,
Jesse Hall399184a2014-03-03 15:42:54 -080053 SET_SIDEBAND_STREAM,
Dan Stoza29a3e902014-06-20 13:13:57 -070054 ALLOCATE_BUFFERS,
Dan Stoza9de72932015-04-16 17:28:43 -070055 ALLOW_ALLOCATION,
Dan Stoza812ed062015-06-02 15:45:22 -070056 SET_GENERATION_NUMBER,
Dan Stozac6f30bd2015-06-08 09:32:50 -070057 GET_CONSUMER_NAME,
Pablo Ceballosfa455352015-08-12 17:47:47 -070058 SET_MAX_DEQUEUED_BUFFER_COUNT,
Dan Stoza7dde5992015-05-22 09:51:44 -070059 SET_ASYNC_MODE,
Pablo Ceballos3559fbf2016-03-17 15:50:23 -070060 SET_SHARED_BUFFER_MODE,
Pablo Ceballosff95aab2016-01-13 17:09:58 -080061 SET_AUTO_REFRESH,
Dan Stoza127fc632015-06-30 13:43:32 -070062 SET_DEQUEUE_TIMEOUT,
Dan Stoza50101d02016-04-07 16:53:23 -070063 GET_LAST_QUEUED_BUFFER,
Pablo Ceballosfc352582016-06-30 17:22:20 -070064 GET_FRAME_TIMESTAMPS,
Chia-I Wue2786ea2017-08-07 10:36:08 -070065 GET_UNIQUE_ID,
66 GET_CONSUMER_USAGE,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080067};
68
Andy McFadden2adaf042012-12-18 09:49:45 -080069class BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080070{
71public:
Chih-Hung Hsiehe2347b72016-04-25 15:41:05 -070072 explicit BpGraphicBufferProducer(const sp<IBinder>& impl)
Andy McFadden2adaf042012-12-18 09:49:45 -080073 : BpInterface<IGraphicBufferProducer>(impl)
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080074 {
75 }
76
Yi Kongca038512017-05-02 16:55:24 -070077 ~BpGraphicBufferProducer() override;
Dan Stoza3be1c6b2014-11-18 10:24:03 -080078
Jamie Gennis7b305ff2011-07-19 12:08:33 -070079 virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080080 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -080081 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080082 data.writeInt32(bufferIdx);
Jamie Gennis8a29ff22011-10-14 15:03:17 -070083 status_t result =remote()->transact(REQUEST_BUFFER, data, &reply);
84 if (result != NO_ERROR) {
85 return result;
86 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080087 bool nonNull = reply.readInt32();
88 if (nonNull) {
Jamie Gennis7b305ff2011-07-19 12:08:33 -070089 *buf = new GraphicBuffer();
Lingyun Zhu2aff7022012-11-20 19:24:35 +080090 result = reply.read(**buf);
91 if(result != NO_ERROR) {
92 (*buf).clear();
93 return result;
94 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080095 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -070096 result = reply.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -070097 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080098 }
99
Pablo Ceballosfa455352015-08-12 17:47:47 -0700100 virtual status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) {
101 Parcel data, reply;
102 data.writeInterfaceToken(
103 IGraphicBufferProducer::getInterfaceDescriptor());
104 data.writeInt32(maxDequeuedBuffers);
105 status_t result = remote()->transact(SET_MAX_DEQUEUED_BUFFER_COUNT,
106 data, &reply);
107 if (result != NO_ERROR) {
108 return result;
109 }
110 result = reply.readInt32();
111 return result;
112 }
113
114 virtual status_t setAsyncMode(bool async) {
115 Parcel data, reply;
116 data.writeInterfaceToken(
117 IGraphicBufferProducer::getInterfaceDescriptor());
118 data.writeInt32(async);
119 status_t result = remote()->transact(SET_ASYNC_MODE,
120 data, &reply);
121 if (result != NO_ERROR) {
122 return result;
123 }
124 result = reply.readInt32();
125 return result;
126 }
127
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600128 virtual status_t dequeueBuffer(int* buf, sp<Fence>* fence, uint32_t width, uint32_t height,
129 PixelFormat format, uint64_t usage, uint64_t* outBufferAge,
130 FrameEventHistoryDelta* outTimestamps) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800131 Parcel data, reply;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700132 bool getFrameTimestamps = (outTimestamps != nullptr);
Brian Andersonbaaad322016-07-22 15:55:13 -0700133
Andy McFadden2adaf042012-12-18 09:49:45 -0800134 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800135 data.writeUint32(width);
136 data.writeUint32(height);
137 data.writeInt32(static_cast<int32_t>(format));
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700138 data.writeUint64(usage);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700139 data.writeBool(getFrameTimestamps);
Brian Andersonbaaad322016-07-22 15:55:13 -0700140
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700141 status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply);
142 if (result != NO_ERROR) {
143 return result;
144 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700145
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800146 *buf = reply.readInt32();
Brian Andersonbaaad322016-07-22 15:55:13 -0700147 *fence = new Fence();
148 result = reply.read(**fence);
149 if (result != NO_ERROR) {
150 fence->clear();
151 return result;
Jesse Hallf7857542012-06-14 15:26:33 -0700152 }
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600153 if (outBufferAge) {
154 result = reply.readUint64(outBufferAge);
155 } else {
156 // Read the value even if outBufferAge is nullptr:
157 uint64_t bufferAge;
158 result = reply.readUint64(&bufferAge);
159 }
160 if (result != NO_ERROR) {
161 ALOGE("IGBP::dequeueBuffer failed to read buffer age: %d", result);
162 return result;
163 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700164 if (getFrameTimestamps) {
165 result = reply.read(*outTimestamps);
166 if (result != NO_ERROR) {
167 ALOGE("IGBP::dequeueBuffer failed to read timestamps: %d",
168 result);
169 return result;
170 }
171 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700172 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800173 return result;
174 }
175
Dan Stoza9f3053d2014-03-06 15:14:33 -0800176 virtual status_t detachBuffer(int slot) {
177 Parcel data, reply;
178 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
179 data.writeInt32(slot);
180 status_t result = remote()->transact(DETACH_BUFFER, data, &reply);
181 if (result != NO_ERROR) {
182 return result;
183 }
184 result = reply.readInt32();
185 return result;
186 }
187
Dan Stozad9822a32014-03-28 15:25:31 -0700188 virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer,
189 sp<Fence>* outFence) {
190 if (outBuffer == NULL) {
191 ALOGE("detachNextBuffer: outBuffer must not be NULL");
192 return BAD_VALUE;
193 } else if (outFence == NULL) {
194 ALOGE("detachNextBuffer: outFence must not be NULL");
195 return BAD_VALUE;
196 }
197 Parcel data, reply;
198 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
199 status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply);
200 if (result != NO_ERROR) {
201 return result;
202 }
203 result = reply.readInt32();
204 if (result == NO_ERROR) {
205 bool nonNull = reply.readInt32();
206 if (nonNull) {
207 *outBuffer = new GraphicBuffer;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700208 result = reply.read(**outBuffer);
209 if (result != NO_ERROR) {
210 outBuffer->clear();
211 return result;
212 }
Dan Stozad9822a32014-03-28 15:25:31 -0700213 }
214 nonNull = reply.readInt32();
215 if (nonNull) {
216 *outFence = new Fence;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700217 result = reply.read(**outFence);
218 if (result != NO_ERROR) {
219 outBuffer->clear();
220 outFence->clear();
221 return result;
222 }
Dan Stozad9822a32014-03-28 15:25:31 -0700223 }
224 }
225 return result;
226 }
227
Dan Stoza9f3053d2014-03-06 15:14:33 -0800228 virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) {
229 Parcel data, reply;
230 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
231 data.write(*buffer.get());
232 status_t result = remote()->transact(ATTACH_BUFFER, data, &reply);
233 if (result != NO_ERROR) {
234 return result;
235 }
Chia-I Wuc79a2962017-05-15 10:32:27 -0700236
Dan Stoza9f3053d2014-03-06 15:14:33 -0800237 *slot = reply.readInt32();
238 result = reply.readInt32();
Chia-I Wuc79a2962017-05-15 10:32:27 -0700239 if (result == NO_ERROR &&
240 (*slot < 0 || *slot >= BufferQueueDefs::NUM_BUFFER_SLOTS)) {
241 ALOGE("attachBuffer returned invalid slot %d", *slot);
242 android_errorWriteLog(0x534e4554, "37478824");
243 return UNKNOWN_ERROR;
244 }
245
Dan Stoza9f3053d2014-03-06 15:14:33 -0800246 return result;
247 }
248
Mathias Agopianf0bc2f12012-04-09 16:14:01 -0700249 virtual status_t queueBuffer(int buf,
250 const QueueBufferInput& input, QueueBufferOutput* output) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800251 Parcel data, reply;
Brian Andersonbaaad322016-07-22 15:55:13 -0700252
Andy McFadden2adaf042012-12-18 09:49:45 -0800253 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800254 data.writeInt32(buf);
Jesse Hallc777b0b2012-06-28 12:52:05 -0700255 data.write(input);
Brian Andersonbaaad322016-07-22 15:55:13 -0700256
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700257 status_t result = remote()->transact(QUEUE_BUFFER, data, &reply);
258 if (result != NO_ERROR) {
259 return result;
260 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700261
262 result = reply.read(*output);
263 if (result != NO_ERROR) {
264 return result;
265 }
266
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700267 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800268 return result;
269 }
270
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700271 virtual status_t cancelBuffer(int buf, const sp<Fence>& fence) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800272 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800273 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800274 data.writeInt32(buf);
Jamie Gennis1df8c342012-12-20 14:05:45 -0800275 data.write(*fence.get());
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700276 status_t result = remote()->transact(CANCEL_BUFFER, data, &reply);
277 if (result != NO_ERROR) {
278 return result;
279 }
280 result = reply.readInt32();
281 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800282 }
283
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700284 virtual int query(int what, int* value) {
285 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800286 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700287 data.writeInt32(what);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700288 status_t result = remote()->transact(QUERY, data, &reply);
289 if (result != NO_ERROR) {
290 return result;
291 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700292 value[0] = reply.readInt32();
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700293 result = reply.readInt32();
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700294 return result;
295 }
296
Dan Stozaf0eaf252014-03-21 13:05:51 -0700297 virtual status_t connect(const sp<IProducerListener>& listener,
Mathias Agopian365857d2013-09-11 19:35:45 -0700298 int api, bool producerControlledByApp, QueueBufferOutput* output) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700299 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800300 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stozaf0eaf252014-03-21 13:05:51 -0700301 if (listener != NULL) {
302 data.writeInt32(1);
Marco Nelissen097ca272014-11-14 08:01:01 -0800303 data.writeStrongBinder(IInterface::asBinder(listener));
Dan Stozaf0eaf252014-03-21 13:05:51 -0700304 } else {
305 data.writeInt32(0);
306 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700307 data.writeInt32(api);
Mathias Agopian595264f2013-07-16 22:56:09 -0700308 data.writeInt32(producerControlledByApp);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700309 status_t result = remote()->transact(CONNECT, data, &reply);
310 if (result != NO_ERROR) {
311 return result;
312 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700313 reply.read(*output);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700314 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700315 return result;
316 }
Mathias Agopian80727112011-05-02 19:51:12 -0700317
Robert Carr97b9c862016-09-08 13:54:35 -0700318 virtual status_t disconnect(int api, DisconnectMode mode) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700319 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800320 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700321 data.writeInt32(api);
Robert Carr97b9c862016-09-08 13:54:35 -0700322 data.writeInt32(static_cast<int32_t>(mode));
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700323 status_t result =remote()->transact(DISCONNECT, data, &reply);
324 if (result != NO_ERROR) {
325 return result;
326 }
327 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700328 return result;
329 }
Jesse Hall399184a2014-03-03 15:42:54 -0800330
331 virtual status_t setSidebandStream(const sp<NativeHandle>& stream) {
332 Parcel data, reply;
333 status_t result;
334 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
335 if (stream.get()) {
336 data.writeInt32(true);
337 data.writeNativeHandle(stream->handle());
338 } else {
339 data.writeInt32(false);
340 }
341 if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) {
342 result = reply.readInt32();
343 }
344 return result;
345 }
Dan Stoza29a3e902014-06-20 13:13:57 -0700346
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700347 virtual void allocateBuffers(uint32_t width, uint32_t height,
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700348 PixelFormat format, uint64_t usage) {
Dan Stoza29a3e902014-06-20 13:13:57 -0700349 Parcel data, reply;
350 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800351 data.writeUint32(width);
352 data.writeUint32(height);
Dan Stoza29a3e902014-06-20 13:13:57 -0700353 data.writeInt32(static_cast<int32_t>(format));
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700354 data.writeUint64(usage);
Dan Stoza29a3e902014-06-20 13:13:57 -0700355 status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply);
356 if (result != NO_ERROR) {
357 ALOGE("allocateBuffers failed to transact: %d", result);
358 }
359 }
Dan Stoza9de72932015-04-16 17:28:43 -0700360
361 virtual status_t allowAllocation(bool allow) {
362 Parcel data, reply;
363 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
364 data.writeInt32(static_cast<int32_t>(allow));
365 status_t result = remote()->transact(ALLOW_ALLOCATION, data, &reply);
366 if (result != NO_ERROR) {
367 return result;
368 }
369 result = reply.readInt32();
370 return result;
371 }
Dan Stoza812ed062015-06-02 15:45:22 -0700372
373 virtual status_t setGenerationNumber(uint32_t generationNumber) {
374 Parcel data, reply;
375 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
376 data.writeUint32(generationNumber);
377 status_t result = remote()->transact(SET_GENERATION_NUMBER, data, &reply);
378 if (result == NO_ERROR) {
379 result = reply.readInt32();
380 }
381 return result;
382 }
Dan Stozac6f30bd2015-06-08 09:32:50 -0700383
384 virtual String8 getConsumerName() const {
385 Parcel data, reply;
386 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
387 status_t result = remote()->transact(GET_CONSUMER_NAME, data, &reply);
388 if (result != NO_ERROR) {
389 ALOGE("getConsumerName failed to transact: %d", result);
390 return String8("TransactFailed");
391 }
392 return reply.readString8();
393 }
Dan Stoza7dde5992015-05-22 09:51:44 -0700394
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700395 virtual status_t setSharedBufferMode(bool sharedBufferMode) {
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700396 Parcel data, reply;
397 data.writeInterfaceToken(
398 IGraphicBufferProducer::getInterfaceDescriptor());
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700399 data.writeInt32(sharedBufferMode);
400 status_t result = remote()->transact(SET_SHARED_BUFFER_MODE, data,
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700401 &reply);
402 if (result == NO_ERROR) {
403 result = reply.readInt32();
404 }
405 return result;
406 }
Dan Stoza127fc632015-06-30 13:43:32 -0700407
Pablo Ceballosff95aab2016-01-13 17:09:58 -0800408 virtual status_t setAutoRefresh(bool autoRefresh) {
409 Parcel data, reply;
410 data.writeInterfaceToken(
411 IGraphicBufferProducer::getInterfaceDescriptor());
412 data.writeInt32(autoRefresh);
413 status_t result = remote()->transact(SET_AUTO_REFRESH, data, &reply);
414 if (result == NO_ERROR) {
415 result = reply.readInt32();
416 }
417 return result;
418 }
419
Dan Stoza127fc632015-06-30 13:43:32 -0700420 virtual status_t setDequeueTimeout(nsecs_t timeout) {
421 Parcel data, reply;
422 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
423 data.writeInt64(timeout);
424 status_t result = remote()->transact(SET_DEQUEUE_TIMEOUT, data, &reply);
425 if (result != NO_ERROR) {
426 ALOGE("setDequeueTimeout failed to transact: %d", result);
427 return result;
428 }
429 return reply.readInt32();
430 }
Dan Stoza50101d02016-04-07 16:53:23 -0700431
432 virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer,
John Reck1a61da52016-04-28 13:18:15 -0700433 sp<Fence>* outFence, float outTransformMatrix[16]) override {
Dan Stoza50101d02016-04-07 16:53:23 -0700434 Parcel data, reply;
435 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
436 status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER, data,
437 &reply);
438 if (result != NO_ERROR) {
439 ALOGE("getLastQueuedBuffer failed to transact: %d", result);
440 return result;
441 }
442 result = reply.readInt32();
443 if (result != NO_ERROR) {
444 return result;
445 }
John Reckce8e5df2016-04-28 10:12:47 -0700446 bool hasBuffer = reply.readBool();
447 sp<GraphicBuffer> buffer;
448 if (hasBuffer) {
449 buffer = new GraphicBuffer();
450 result = reply.read(*buffer);
John Reck1a61da52016-04-28 13:18:15 -0700451 if (result == NO_ERROR) {
452 result = reply.read(outTransformMatrix, sizeof(float) * 16);
453 }
John Reckce8e5df2016-04-28 10:12:47 -0700454 }
Dan Stoza50101d02016-04-07 16:53:23 -0700455 if (result != NO_ERROR) {
456 ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
457 return result;
458 }
459 sp<Fence> fence(new Fence);
460 result = reply.read(*fence);
461 if (result != NO_ERROR) {
462 ALOGE("getLastQueuedBuffer failed to read fence: %d", result);
463 return result;
464 }
465 *outBuffer = buffer;
466 *outFence = fence;
467 return result;
468 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800469
Brian Anderson3890c392016-07-25 12:48:08 -0700470 virtual void getFrameTimestamps(FrameEventHistoryDelta* outDelta) {
Pablo Ceballosce796e72016-02-04 19:10:51 -0800471 Parcel data, reply;
472 status_t result = data.writeInterfaceToken(
473 IGraphicBufferProducer::getInterfaceDescriptor());
474 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700475 ALOGE("IGBP::getFrameTimestamps failed to write token: %d", result);
476 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800477 }
478 result = remote()->transact(GET_FRAME_TIMESTAMPS, data, &reply);
479 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700480 ALOGE("IGBP::getFrameTimestamps failed to transact: %d", result);
481 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800482 }
Brian Anderson3890c392016-07-25 12:48:08 -0700483 result = reply.read(*outDelta);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800484 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700485 ALOGE("IGBP::getFrameTimestamps failed to read timestamps: %d",
486 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800487 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800488 }
Pablo Ceballos6155b402016-06-30 17:01:49 -0700489
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -0700490 virtual status_t getUniqueId(uint64_t* outId) const {
491 Parcel data, reply;
492 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
493 status_t result = remote()->transact(GET_UNIQUE_ID, data, &reply);
494 if (result != NO_ERROR) {
495 ALOGE("getUniqueId failed to transact: %d", result);
496 }
497 status_t actualResult = NO_ERROR;
498 result = reply.readInt32(&actualResult);
499 if (result != NO_ERROR) {
500 return result;
501 }
502 result = reply.readUint64(outId);
503 if (result != NO_ERROR) {
504 return result;
505 }
506 return actualResult;
507 }
Chia-I Wue2786ea2017-08-07 10:36:08 -0700508
509 virtual status_t getConsumerUsage(uint64_t* outUsage) const {
510 Parcel data, reply;
511 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
512 status_t result = remote()->transact(GET_CONSUMER_USAGE, data, &reply);
513 if (result != NO_ERROR) {
514 ALOGE("getConsumerUsage failed to transact: %d", result);
515 }
516 status_t actualResult = NO_ERROR;
517 result = reply.readInt32(&actualResult);
518 if (result != NO_ERROR) {
519 return result;
520 }
521 result = reply.readUint64(outUsage);
522 if (result != NO_ERROR) {
523 return result;
524 }
525 return actualResult;
526 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800527};
528
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800529// Out-of-line virtual method definition to trigger vtable emission in this
530// translation unit (see clang warning -Wweak-vtables)
531BpGraphicBufferProducer::~BpGraphicBufferProducer() {}
532
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800533class HpGraphicBufferProducer : public HpInterface<
534 BpGraphicBufferProducer, H2BGraphicBufferProducer> {
535public:
536 HpGraphicBufferProducer(const sp<IBinder>& base) : PBase(base) {}
537
538 status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) override {
539 return mBase->requestBuffer(slot, buf);
540 }
541
542 status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) override {
543 return mBase->setMaxDequeuedBufferCount(maxDequeuedBuffers);
544 }
545
546 status_t setAsyncMode(bool async) override {
547 return mBase->setAsyncMode(async);
548 }
549
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600550 status_t dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w, uint32_t h, PixelFormat format,
551 uint64_t usage, uint64_t* outBufferAge,
552 FrameEventHistoryDelta* outTimestamps) override {
553 return mBase->dequeueBuffer(slot, fence, w, h, format, usage, outBufferAge, outTimestamps);
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800554 }
555
556 status_t detachBuffer(int slot) override {
557 return mBase->detachBuffer(slot);
558 }
559
560 status_t detachNextBuffer(
561 sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) override {
562 return mBase->detachNextBuffer(outBuffer, outFence);
563 }
564
565 status_t attachBuffer(
566 int* outSlot, const sp<GraphicBuffer>& buffer) override {
567 return mBase->attachBuffer(outSlot, buffer);
568 }
569
570 status_t queueBuffer(
571 int slot,
572 const QueueBufferInput& input,
573 QueueBufferOutput* output) override {
574 return mBase->queueBuffer(slot, input, output);
575 }
576
577 status_t cancelBuffer(int slot, const sp<Fence>& fence) override {
578 return mBase->cancelBuffer(slot, fence);
579 }
580
581 int query(int what, int* value) override {
582 return mBase->query(what, value);
583 }
584
585 status_t connect(
586 const sp<IProducerListener>& listener,
587 int api, bool producerControlledByApp,
588 QueueBufferOutput* output) override {
589 return mBase->connect(listener, api, producerControlledByApp, output);
590 }
591
592 status_t disconnect(
593 int api, DisconnectMode mode = DisconnectMode::Api) override {
594 return mBase->disconnect(api, mode);
595 }
596
597 status_t setSidebandStream(const sp<NativeHandle>& stream) override {
598 return mBase->setSidebandStream(stream);
599 }
600
601 void allocateBuffers(uint32_t width, uint32_t height,
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700602 PixelFormat format, uint64_t usage) override {
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800603 return mBase->allocateBuffers(width, height, format, usage);
604 }
605
606 status_t allowAllocation(bool allow) override {
607 return mBase->allowAllocation(allow);
608 }
609
610 status_t setGenerationNumber(uint32_t generationNumber) override {
611 return mBase->setGenerationNumber(generationNumber);
612 }
613
614 String8 getConsumerName() const override {
615 return mBase->getConsumerName();
616 }
617
618 status_t setSharedBufferMode(bool sharedBufferMode) override {
619 return mBase->setSharedBufferMode(sharedBufferMode);
620 }
621
622 status_t setAutoRefresh(bool autoRefresh) override {
623 return mBase->setAutoRefresh(autoRefresh);
624 }
625
626 status_t setDequeueTimeout(nsecs_t timeout) override {
627 return mBase->setDequeueTimeout(timeout);
628 }
629
630 status_t getLastQueuedBuffer(
631 sp<GraphicBuffer>* outBuffer,
632 sp<Fence>* outFence,
633 float outTransformMatrix[16]) override {
634 return mBase->getLastQueuedBuffer(
635 outBuffer, outFence, outTransformMatrix);
636 }
637
638 void getFrameTimestamps(FrameEventHistoryDelta* outDelta) override {
639 return mBase->getFrameTimestamps(outDelta);
640 }
641
642 status_t getUniqueId(uint64_t* outId) const override {
643 return mBase->getUniqueId(outId);
644 }
Chia-I Wue2786ea2017-08-07 10:36:08 -0700645
646 status_t getConsumerUsage(uint64_t* outUsage) const override {
647 return mBase->getConsumerUsage(outUsage);
648 }
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800649};
650
651IMPLEMENT_HYBRID_META_INTERFACE(GraphicBufferProducer, HGraphicBufferProducer,
652 "android.gui.IGraphicBufferProducer");
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800653
654// ----------------------------------------------------------------------
655
Andy McFadden2adaf042012-12-18 09:49:45 -0800656status_t BnGraphicBufferProducer::onTransact(
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800657 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
658{
659 switch(code) {
660 case REQUEST_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800661 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800662 int bufferIdx = data.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700663 sp<GraphicBuffer> buffer;
664 int result = requestBuffer(bufferIdx, &buffer);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800665 reply->writeInt32(buffer != 0);
666 if (buffer != 0) {
667 reply->write(*buffer);
668 }
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700669 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800670 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800671 }
Pablo Ceballosfa455352015-08-12 17:47:47 -0700672 case SET_MAX_DEQUEUED_BUFFER_COUNT: {
673 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
674 int maxDequeuedBuffers = data.readInt32();
675 int result = setMaxDequeuedBufferCount(maxDequeuedBuffers);
676 reply->writeInt32(result);
677 return NO_ERROR;
678 }
679 case SET_ASYNC_MODE: {
680 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
681 bool async = data.readInt32();
682 int result = setAsyncMode(async);
683 reply->writeInt32(result);
684 return NO_ERROR;
685 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800686 case DEQUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800687 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800688 uint32_t width = data.readUint32();
689 uint32_t height = data.readUint32();
690 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700691 uint64_t usage = data.readUint64();
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600692 uint64_t bufferAge = 0;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700693 bool getTimestamps = data.readBool();
Brian Andersonbaaad322016-07-22 15:55:13 -0700694
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700695 int buf = 0;
Brian Andersonbaaad322016-07-22 15:55:13 -0700696 sp<Fence> fence = Fence::NO_FENCE;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700697 FrameEventHistoryDelta frameTimestamps;
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600698 int result = dequeueBuffer(&buf, &fence, width, height, format, usage, &bufferAge,
699 getTimestamps ? &frameTimestamps : nullptr);
Brian Andersonbaaad322016-07-22 15:55:13 -0700700
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800701 reply->writeInt32(buf);
Brian Andersonbaaad322016-07-22 15:55:13 -0700702 reply->write(*fence);
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600703 reply->writeUint64(bufferAge);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700704 if (getTimestamps) {
705 reply->write(frameTimestamps);
706 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800707 reply->writeInt32(result);
708 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800709 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800710 case DETACH_BUFFER: {
711 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
712 int slot = data.readInt32();
713 int result = detachBuffer(slot);
714 reply->writeInt32(result);
715 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800716 }
Dan Stozad9822a32014-03-28 15:25:31 -0700717 case DETACH_NEXT_BUFFER: {
718 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
719 sp<GraphicBuffer> buffer;
720 sp<Fence> fence;
721 int32_t result = detachNextBuffer(&buffer, &fence);
722 reply->writeInt32(result);
723 if (result == NO_ERROR) {
724 reply->writeInt32(buffer != NULL);
725 if (buffer != NULL) {
726 reply->write(*buffer);
727 }
728 reply->writeInt32(fence != NULL);
729 if (fence != NULL) {
730 reply->write(*fence);
731 }
732 }
733 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800734 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800735 case ATTACH_BUFFER: {
736 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
737 sp<GraphicBuffer> buffer = new GraphicBuffer();
Pablo Ceballos70636b32016-07-06 15:24:54 -0700738 status_t result = data.read(*buffer.get());
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700739 int slot = 0;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700740 if (result == NO_ERROR) {
741 result = attachBuffer(&slot, buffer);
742 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800743 reply->writeInt32(slot);
744 reply->writeInt32(result);
745 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800746 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800747 case QUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800748 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700749
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800750 int buf = data.readInt32();
Jesse Hallc777b0b2012-06-28 12:52:05 -0700751 QueueBufferInput input(data);
Brian Andersonbaaad322016-07-22 15:55:13 -0700752 QueueBufferOutput output;
753 status_t result = queueBuffer(buf, input, &output);
Brian Andersonbaaad322016-07-22 15:55:13 -0700754 reply->write(output);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800755 reply->writeInt32(result);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700756
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800757 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800758 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800759 case CANCEL_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800760 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800761 int buf = data.readInt32();
Jamie Gennis1df8c342012-12-20 14:05:45 -0800762 sp<Fence> fence = new Fence();
Pablo Ceballos70636b32016-07-06 15:24:54 -0700763 status_t result = data.read(*fence.get());
764 if (result == NO_ERROR) {
765 result = cancelBuffer(buf, fence);
766 }
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700767 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800768 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800769 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700770 case QUERY: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800771 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700772 int value = 0;
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700773 int what = data.readInt32();
774 int res = query(what, &value);
775 reply->writeInt32(value);
776 reply->writeInt32(res);
777 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800778 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700779 case CONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800780 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stozaf0eaf252014-03-21 13:05:51 -0700781 sp<IProducerListener> listener;
782 if (data.readInt32() == 1) {
783 listener = IProducerListener::asInterface(data.readStrongBinder());
784 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700785 int api = data.readInt32();
Mathias Agopian595264f2013-07-16 22:56:09 -0700786 bool producerControlledByApp = data.readInt32();
Brian Andersonbaaad322016-07-22 15:55:13 -0700787 QueueBufferOutput output;
788 status_t res = connect(listener, api, producerControlledByApp, &output);
789 reply->write(output);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700790 reply->writeInt32(res);
791 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800792 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700793 case DISCONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800794 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700795 int api = data.readInt32();
Robert Carr97b9c862016-09-08 13:54:35 -0700796 DisconnectMode mode = static_cast<DisconnectMode>(data.readInt32());
797 status_t res = disconnect(api, mode);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700798 reply->writeInt32(res);
799 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800800 }
Jesse Hall399184a2014-03-03 15:42:54 -0800801 case SET_SIDEBAND_STREAM: {
802 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
803 sp<NativeHandle> stream;
804 if (data.readInt32()) {
Wonsik Kim0ec54e12014-03-21 10:46:24 +0900805 stream = NativeHandle::create(data.readNativeHandle(), true);
Jesse Hall399184a2014-03-03 15:42:54 -0800806 }
807 status_t result = setSidebandStream(stream);
808 reply->writeInt32(result);
809 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800810 }
Dan Stoza9de72932015-04-16 17:28:43 -0700811 case ALLOCATE_BUFFERS: {
Dan Stoza29a3e902014-06-20 13:13:57 -0700812 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800813 uint32_t width = data.readUint32();
814 uint32_t height = data.readUint32();
815 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700816 uint64_t usage = data.readUint64();
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700817 allocateBuffers(width, height, format, usage);
Dan Stoza29a3e902014-06-20 13:13:57 -0700818 return NO_ERROR;
Dan Stoza9de72932015-04-16 17:28:43 -0700819 }
820 case ALLOW_ALLOCATION: {
821 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
822 bool allow = static_cast<bool>(data.readInt32());
823 status_t result = allowAllocation(allow);
824 reply->writeInt32(result);
825 return NO_ERROR;
826 }
Dan Stoza812ed062015-06-02 15:45:22 -0700827 case SET_GENERATION_NUMBER: {
828 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
829 uint32_t generationNumber = data.readUint32();
830 status_t result = setGenerationNumber(generationNumber);
831 reply->writeInt32(result);
832 return NO_ERROR;
833 }
Dan Stozac6f30bd2015-06-08 09:32:50 -0700834 case GET_CONSUMER_NAME: {
835 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
836 reply->writeString8(getConsumerName());
837 return NO_ERROR;
838 }
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700839 case SET_SHARED_BUFFER_MODE: {
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700840 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700841 bool sharedBufferMode = data.readInt32();
842 status_t result = setSharedBufferMode(sharedBufferMode);
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700843 reply->writeInt32(result);
844 return NO_ERROR;
845 }
Pablo Ceballosff95aab2016-01-13 17:09:58 -0800846 case SET_AUTO_REFRESH: {
847 CHECK_INTERFACE(IGraphicBuffer, data, reply);
848 bool autoRefresh = data.readInt32();
849 status_t result = setAutoRefresh(autoRefresh);
850 reply->writeInt32(result);
851 return NO_ERROR;
852 }
Dan Stoza127fc632015-06-30 13:43:32 -0700853 case SET_DEQUEUE_TIMEOUT: {
854 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
855 nsecs_t timeout = data.readInt64();
856 status_t result = setDequeueTimeout(timeout);
857 reply->writeInt32(result);
858 return NO_ERROR;
859 }
Dan Stoza50101d02016-04-07 16:53:23 -0700860 case GET_LAST_QUEUED_BUFFER: {
861 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
862 sp<GraphicBuffer> buffer(nullptr);
863 sp<Fence> fence(Fence::NO_FENCE);
John Reck1a61da52016-04-28 13:18:15 -0700864 float transform[16] = {};
865 status_t result = getLastQueuedBuffer(&buffer, &fence, transform);
Dan Stoza50101d02016-04-07 16:53:23 -0700866 reply->writeInt32(result);
867 if (result != NO_ERROR) {
868 return result;
869 }
John Reckce8e5df2016-04-28 10:12:47 -0700870 if (!buffer.get()) {
871 reply->writeBool(false);
872 } else {
873 reply->writeBool(true);
874 result = reply->write(*buffer);
John Reck1a61da52016-04-28 13:18:15 -0700875 if (result == NO_ERROR) {
876 reply->write(transform, sizeof(float) * 16);
877 }
John Reckce8e5df2016-04-28 10:12:47 -0700878 }
Dan Stoza50101d02016-04-07 16:53:23 -0700879 if (result != NO_ERROR) {
880 ALOGE("getLastQueuedBuffer failed to write buffer: %d", result);
881 return result;
882 }
883 result = reply->write(*fence);
884 if (result != NO_ERROR) {
885 ALOGE("getLastQueuedBuffer failed to write fence: %d", result);
886 return result;
887 }
888 return NO_ERROR;
889 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800890 case GET_FRAME_TIMESTAMPS: {
891 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson3890c392016-07-25 12:48:08 -0700892 FrameEventHistoryDelta frameTimestamps;
893 getFrameTimestamps(&frameTimestamps);
894 status_t result = reply->write(frameTimestamps);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800895 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700896 ALOGE("BnGBP::GET_FRAME_TIMESTAMPS failed to write buffer: %d",
897 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800898 return result;
899 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800900 return NO_ERROR;
901 }
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -0700902 case GET_UNIQUE_ID: {
903 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
904 uint64_t outId = 0;
905 status_t actualResult = getUniqueId(&outId);
906 status_t result = reply->writeInt32(actualResult);
907 if (result != NO_ERROR) {
908 return result;
909 }
910 result = reply->writeUint64(outId);
911 if (result != NO_ERROR) {
912 return result;
913 }
914 return NO_ERROR;
915 }
Chia-I Wue2786ea2017-08-07 10:36:08 -0700916 case GET_CONSUMER_USAGE: {
917 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
918 uint64_t outUsage = 0;
919 status_t actualResult = getConsumerUsage(&outUsage);
920 status_t result = reply->writeInt32(actualResult);
921 if (result != NO_ERROR) {
922 return result;
923 }
924 result = reply->writeUint64(outUsage);
925 if (result != NO_ERROR) {
926 return result;
927 }
928 return NO_ERROR;
929 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800930 }
931 return BBinder::onTransact(code, data, reply, flags);
932}
933
934// ----------------------------------------------------------------------------
935
Andy McFadden2adaf042012-12-18 09:49:45 -0800936IGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) {
Jesse Hallc777b0b2012-06-28 12:52:05 -0700937 parcel.read(*this);
938}
939
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700940constexpr size_t IGraphicBufferProducer::QueueBufferInput::minFlattenedSize() {
941 return sizeof(timestamp) +
942 sizeof(isAutoTimestamp) +
943 sizeof(dataSpace) +
944 sizeof(crop) +
945 sizeof(scalingMode) +
946 sizeof(transform) +
947 sizeof(stickyTransform) +
948 sizeof(getFrameTimestamps);
949}
950
Mathias Agopiane1424282013-07-29 21:24:40 -0700951size_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const {
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700952 return minFlattenedSize() +
953 fence->getFlattenedSize() +
954 surfaceDamage.getFlattenedSize();
Jesse Hallc777b0b2012-06-28 12:52:05 -0700955}
956
Mathias Agopiane1424282013-07-29 21:24:40 -0700957size_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const {
Jamie Gennis1df8c342012-12-20 14:05:45 -0800958 return fence->getFdCount();
Jesse Hallc777b0b2012-06-28 12:52:05 -0700959}
960
Mathias Agopiane1424282013-07-29 21:24:40 -0700961status_t IGraphicBufferProducer::QueueBufferInput::flatten(
962 void*& buffer, size_t& size, int*& fds, size_t& count) const
Jesse Hallc777b0b2012-06-28 12:52:05 -0700963{
Mathias Agopiane1424282013-07-29 21:24:40 -0700964 if (size < getFlattenedSize()) {
965 return NO_MEMORY;
966 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700967
Mathias Agopiane1424282013-07-29 21:24:40 -0700968 FlattenableUtils::write(buffer, size, timestamp);
Andy McFadden3c256212013-08-16 14:55:39 -0700969 FlattenableUtils::write(buffer, size, isAutoTimestamp);
Eino-Ville Talvala82c6bcc2015-02-19 16:10:43 -0800970 FlattenableUtils::write(buffer, size, dataSpace);
Mathias Agopiane1424282013-07-29 21:24:40 -0700971 FlattenableUtils::write(buffer, size, crop);
972 FlattenableUtils::write(buffer, size, scalingMode);
973 FlattenableUtils::write(buffer, size, transform);
Ruben Brunk1681d952014-06-27 15:51:55 -0700974 FlattenableUtils::write(buffer, size, stickyTransform);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700975 FlattenableUtils::write(buffer, size, getFrameTimestamps);
976
Dan Stoza5065a552015-03-17 16:23:42 -0700977 status_t result = fence->flatten(buffer, size, fds, count);
978 if (result != NO_ERROR) {
979 return result;
980 }
981 return surfaceDamage.flatten(buffer, size);
Jesse Hallc777b0b2012-06-28 12:52:05 -0700982}
983
Mathias Agopiane1424282013-07-29 21:24:40 -0700984status_t IGraphicBufferProducer::QueueBufferInput::unflatten(
985 void const*& buffer, size_t& size, int const*& fds, size_t& count)
Jesse Hallc777b0b2012-06-28 12:52:05 -0700986{
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700987 if (size < minFlattenedSize()) {
Mathias Agopiane1424282013-07-29 21:24:40 -0700988 return NO_MEMORY;
989 }
990
991 FlattenableUtils::read(buffer, size, timestamp);
Andy McFadden3c256212013-08-16 14:55:39 -0700992 FlattenableUtils::read(buffer, size, isAutoTimestamp);
Eino-Ville Talvala82c6bcc2015-02-19 16:10:43 -0800993 FlattenableUtils::read(buffer, size, dataSpace);
Mathias Agopiane1424282013-07-29 21:24:40 -0700994 FlattenableUtils::read(buffer, size, crop);
995 FlattenableUtils::read(buffer, size, scalingMode);
996 FlattenableUtils::read(buffer, size, transform);
Ruben Brunk1681d952014-06-27 15:51:55 -0700997 FlattenableUtils::read(buffer, size, stickyTransform);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700998 FlattenableUtils::read(buffer, size, getFrameTimestamps);
Mathias Agopiane1424282013-07-29 21:24:40 -0700999
Jamie Gennis1df8c342012-12-20 14:05:45 -08001000 fence = new Fence();
Dan Stoza5065a552015-03-17 16:23:42 -07001001 status_t result = fence->unflatten(buffer, size, fds, count);
1002 if (result != NO_ERROR) {
1003 return result;
1004 }
1005 return surfaceDamage.unflatten(buffer, size);
Jesse Hallc777b0b2012-06-28 12:52:05 -07001006}
1007
Brian Andersonbaaad322016-07-22 15:55:13 -07001008// ----------------------------------------------------------------------------
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001009constexpr size_t IGraphicBufferProducer::QueueBufferOutput::minFlattenedSize() {
1010 return sizeof(width) +
1011 sizeof(height) +
1012 sizeof(transformHint) +
1013 sizeof(numPendingBuffers) +
Shuzhen Wang22f842b2017-01-18 23:02:36 -08001014 sizeof(nextFrameNumber) +
1015 sizeof(bufferReplaced);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001016}
Brian Andersonbaaad322016-07-22 15:55:13 -07001017
1018size_t IGraphicBufferProducer::QueueBufferOutput::getFlattenedSize() const {
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001019 return minFlattenedSize() + frameTimestamps.getFlattenedSize();
Brian Andersonbaaad322016-07-22 15:55:13 -07001020}
1021
1022size_t IGraphicBufferProducer::QueueBufferOutput::getFdCount() const {
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001023 return frameTimestamps.getFdCount();
Brian Andersonbaaad322016-07-22 15:55:13 -07001024}
1025
1026status_t IGraphicBufferProducer::QueueBufferOutput::flatten(
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001027 void*& buffer, size_t& size, int*& fds, size_t& count) const
Brian Andersonbaaad322016-07-22 15:55:13 -07001028{
1029 if (size < getFlattenedSize()) {
1030 return NO_MEMORY;
1031 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001032
Brian Andersonbaaad322016-07-22 15:55:13 -07001033 FlattenableUtils::write(buffer, size, width);
1034 FlattenableUtils::write(buffer, size, height);
1035 FlattenableUtils::write(buffer, size, transformHint);
1036 FlattenableUtils::write(buffer, size, numPendingBuffers);
1037 FlattenableUtils::write(buffer, size, nextFrameNumber);
Shuzhen Wang22f842b2017-01-18 23:02:36 -08001038 FlattenableUtils::write(buffer, size, bufferReplaced);
Brian Andersonbaaad322016-07-22 15:55:13 -07001039
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001040 return frameTimestamps.flatten(buffer, size, fds, count);
Brian Andersonbaaad322016-07-22 15:55:13 -07001041}
1042
1043status_t IGraphicBufferProducer::QueueBufferOutput::unflatten(
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001044 void const*& buffer, size_t& size, int const*& fds, size_t& count)
Brian Andersonbaaad322016-07-22 15:55:13 -07001045{
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001046 if (size < minFlattenedSize()) {
Brian Andersonbaaad322016-07-22 15:55:13 -07001047 return NO_MEMORY;
1048 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001049
Brian Andersonbaaad322016-07-22 15:55:13 -07001050 FlattenableUtils::read(buffer, size, width);
1051 FlattenableUtils::read(buffer, size, height);
1052 FlattenableUtils::read(buffer, size, transformHint);
1053 FlattenableUtils::read(buffer, size, numPendingBuffers);
1054 FlattenableUtils::read(buffer, size, nextFrameNumber);
Shuzhen Wang22f842b2017-01-18 23:02:36 -08001055 FlattenableUtils::read(buffer, size, bufferReplaced);
Brian Andersonbaaad322016-07-22 15:55:13 -07001056
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001057 return frameTimestamps.unflatten(buffer, size, fds, count);
Brian Andersonbaaad322016-07-22 15:55:13 -07001058}
1059
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001060}; // namespace android