blob: 74117c8cd1b5a4046806014e26f472e0b9c9f53d [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
Andy McFadden2adaf042012-12-18 09:49:45 -080030#include <gui/IGraphicBufferProducer.h>
Dan Stozaf0eaf252014-03-21 13:05:51 -070031#include <gui/IProducerListener.h>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080032
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -080033#include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h>
34
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080035namespace android {
36// ----------------------------------------------------------------------------
37
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -080038using ::android::hardware::graphics::bufferqueue::V1_0::utils::
39 H2BGraphicBufferProducer;
40
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080041enum {
42 REQUEST_BUFFER = IBinder::FIRST_CALL_TRANSACTION,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080043 DEQUEUE_BUFFER,
Dan Stoza9f3053d2014-03-06 15:14:33 -080044 DETACH_BUFFER,
Dan Stozad9822a32014-03-28 15:25:31 -070045 DETACH_NEXT_BUFFER,
Dan Stoza9f3053d2014-03-06 15:14:33 -080046 ATTACH_BUFFER,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080047 QUEUE_BUFFER,
48 CANCEL_BUFFER,
Mathias Agopianeafabcd2011-04-20 14:20:59 -070049 QUERY,
Jamie Gennisfe0a87b2011-07-13 19:12:20 -070050 CONNECT,
51 DISCONNECT,
Jesse Hall399184a2014-03-03 15:42:54 -080052 SET_SIDEBAND_STREAM,
Dan Stoza29a3e902014-06-20 13:13:57 -070053 ALLOCATE_BUFFERS,
Dan Stoza9de72932015-04-16 17:28:43 -070054 ALLOW_ALLOCATION,
Dan Stoza812ed062015-06-02 15:45:22 -070055 SET_GENERATION_NUMBER,
Dan Stozac6f30bd2015-06-08 09:32:50 -070056 GET_CONSUMER_NAME,
Pablo Ceballosfa455352015-08-12 17:47:47 -070057 SET_MAX_DEQUEUED_BUFFER_COUNT,
Dan Stoza7dde5992015-05-22 09:51:44 -070058 SET_ASYNC_MODE,
Pablo Ceballos3559fbf2016-03-17 15:50:23 -070059 SET_SHARED_BUFFER_MODE,
Pablo Ceballosff95aab2016-01-13 17:09:58 -080060 SET_AUTO_REFRESH,
Dan Stoza127fc632015-06-30 13:43:32 -070061 SET_DEQUEUE_TIMEOUT,
Dan Stoza50101d02016-04-07 16:53:23 -070062 GET_LAST_QUEUED_BUFFER,
Pablo Ceballosfc352582016-06-30 17:22:20 -070063 GET_FRAME_TIMESTAMPS,
64 GET_UNIQUE_ID
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080065};
66
Andy McFadden2adaf042012-12-18 09:49:45 -080067class BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080068{
69public:
Chih-Hung Hsiehe2347b72016-04-25 15:41:05 -070070 explicit BpGraphicBufferProducer(const sp<IBinder>& impl)
Andy McFadden2adaf042012-12-18 09:49:45 -080071 : BpInterface<IGraphicBufferProducer>(impl)
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080072 {
73 }
74
Dan Stoza3be1c6b2014-11-18 10:24:03 -080075 virtual ~BpGraphicBufferProducer();
76
Jamie Gennis7b305ff2011-07-19 12:08:33 -070077 virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080078 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -080079 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080080 data.writeInt32(bufferIdx);
Jamie Gennis8a29ff22011-10-14 15:03:17 -070081 status_t result =remote()->transact(REQUEST_BUFFER, data, &reply);
82 if (result != NO_ERROR) {
83 return result;
84 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080085 bool nonNull = reply.readInt32();
86 if (nonNull) {
Jamie Gennis7b305ff2011-07-19 12:08:33 -070087 *buf = new GraphicBuffer();
Lingyun Zhu2aff7022012-11-20 19:24:35 +080088 result = reply.read(**buf);
89 if(result != NO_ERROR) {
90 (*buf).clear();
91 return result;
92 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080093 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -070094 result = reply.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -070095 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080096 }
97
Pablo Ceballosfa455352015-08-12 17:47:47 -070098 virtual status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) {
99 Parcel data, reply;
100 data.writeInterfaceToken(
101 IGraphicBufferProducer::getInterfaceDescriptor());
102 data.writeInt32(maxDequeuedBuffers);
103 status_t result = remote()->transact(SET_MAX_DEQUEUED_BUFFER_COUNT,
104 data, &reply);
105 if (result != NO_ERROR) {
106 return result;
107 }
108 result = reply.readInt32();
109 return result;
110 }
111
112 virtual status_t setAsyncMode(bool async) {
113 Parcel data, reply;
114 data.writeInterfaceToken(
115 IGraphicBufferProducer::getInterfaceDescriptor());
116 data.writeInt32(async);
117 status_t result = remote()->transact(SET_ASYNC_MODE,
118 data, &reply);
119 if (result != NO_ERROR) {
120 return result;
121 }
122 result = reply.readInt32();
123 return result;
124 }
125
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700126 virtual status_t dequeueBuffer(int *buf, sp<Fence>* fence, uint32_t width,
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700127 uint32_t height, PixelFormat format, uint32_t usage,
128 FrameEventHistoryDelta* outTimestamps) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800129 Parcel data, reply;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700130 bool getFrameTimestamps = (outTimestamps != nullptr);
Brian Andersonbaaad322016-07-22 15:55:13 -0700131
Andy McFadden2adaf042012-12-18 09:49:45 -0800132 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800133 data.writeUint32(width);
134 data.writeUint32(height);
135 data.writeInt32(static_cast<int32_t>(format));
136 data.writeUint32(usage);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700137 data.writeBool(getFrameTimestamps);
Brian Andersonbaaad322016-07-22 15:55:13 -0700138
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700139 status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply);
140 if (result != NO_ERROR) {
141 return result;
142 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700143
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800144 *buf = reply.readInt32();
Brian Andersonbaaad322016-07-22 15:55:13 -0700145 *fence = new Fence();
146 result = reply.read(**fence);
147 if (result != NO_ERROR) {
148 fence->clear();
149 return result;
Jesse Hallf7857542012-06-14 15:26:33 -0700150 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700151 if (getFrameTimestamps) {
152 result = reply.read(*outTimestamps);
153 if (result != NO_ERROR) {
154 ALOGE("IGBP::dequeueBuffer failed to read timestamps: %d",
155 result);
156 return result;
157 }
158 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700159 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800160 return result;
161 }
162
Dan Stoza9f3053d2014-03-06 15:14:33 -0800163 virtual status_t detachBuffer(int slot) {
164 Parcel data, reply;
165 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
166 data.writeInt32(slot);
167 status_t result = remote()->transact(DETACH_BUFFER, data, &reply);
168 if (result != NO_ERROR) {
169 return result;
170 }
171 result = reply.readInt32();
172 return result;
173 }
174
Dan Stozad9822a32014-03-28 15:25:31 -0700175 virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer,
176 sp<Fence>* outFence) {
177 if (outBuffer == NULL) {
178 ALOGE("detachNextBuffer: outBuffer must not be NULL");
179 return BAD_VALUE;
180 } else if (outFence == NULL) {
181 ALOGE("detachNextBuffer: outFence must not be NULL");
182 return BAD_VALUE;
183 }
184 Parcel data, reply;
185 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
186 status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply);
187 if (result != NO_ERROR) {
188 return result;
189 }
190 result = reply.readInt32();
191 if (result == NO_ERROR) {
192 bool nonNull = reply.readInt32();
193 if (nonNull) {
194 *outBuffer = new GraphicBuffer;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700195 result = reply.read(**outBuffer);
196 if (result != NO_ERROR) {
197 outBuffer->clear();
198 return result;
199 }
Dan Stozad9822a32014-03-28 15:25:31 -0700200 }
201 nonNull = reply.readInt32();
202 if (nonNull) {
203 *outFence = new Fence;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700204 result = reply.read(**outFence);
205 if (result != NO_ERROR) {
206 outBuffer->clear();
207 outFence->clear();
208 return result;
209 }
Dan Stozad9822a32014-03-28 15:25:31 -0700210 }
211 }
212 return result;
213 }
214
Dan Stoza9f3053d2014-03-06 15:14:33 -0800215 virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) {
216 Parcel data, reply;
217 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
218 data.write(*buffer.get());
219 status_t result = remote()->transact(ATTACH_BUFFER, data, &reply);
220 if (result != NO_ERROR) {
221 return result;
222 }
223 *slot = reply.readInt32();
224 result = reply.readInt32();
225 return result;
226 }
227
Mathias Agopianf0bc2f12012-04-09 16:14:01 -0700228 virtual status_t queueBuffer(int buf,
229 const QueueBufferInput& input, QueueBufferOutput* output) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800230 Parcel data, reply;
Brian Andersonbaaad322016-07-22 15:55:13 -0700231
Andy McFadden2adaf042012-12-18 09:49:45 -0800232 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800233 data.writeInt32(buf);
Jesse Hallc777b0b2012-06-28 12:52:05 -0700234 data.write(input);
Brian Andersonbaaad322016-07-22 15:55:13 -0700235
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700236 status_t result = remote()->transact(QUEUE_BUFFER, data, &reply);
237 if (result != NO_ERROR) {
238 return result;
239 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700240
241 result = reply.read(*output);
242 if (result != NO_ERROR) {
243 return result;
244 }
245
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700246 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800247 return result;
248 }
249
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700250 virtual status_t cancelBuffer(int buf, const sp<Fence>& fence) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800251 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800252 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800253 data.writeInt32(buf);
Jamie Gennis1df8c342012-12-20 14:05:45 -0800254 data.write(*fence.get());
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700255 status_t result = remote()->transact(CANCEL_BUFFER, data, &reply);
256 if (result != NO_ERROR) {
257 return result;
258 }
259 result = reply.readInt32();
260 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800261 }
262
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700263 virtual int query(int what, int* value) {
264 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800265 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700266 data.writeInt32(what);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700267 status_t result = remote()->transact(QUERY, data, &reply);
268 if (result != NO_ERROR) {
269 return result;
270 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700271 value[0] = reply.readInt32();
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700272 result = reply.readInt32();
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700273 return result;
274 }
275
Dan Stozaf0eaf252014-03-21 13:05:51 -0700276 virtual status_t connect(const sp<IProducerListener>& listener,
Mathias Agopian365857d2013-09-11 19:35:45 -0700277 int api, bool producerControlledByApp, QueueBufferOutput* output) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700278 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800279 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stozaf0eaf252014-03-21 13:05:51 -0700280 if (listener != NULL) {
281 data.writeInt32(1);
Marco Nelissen097ca272014-11-14 08:01:01 -0800282 data.writeStrongBinder(IInterface::asBinder(listener));
Dan Stozaf0eaf252014-03-21 13:05:51 -0700283 } else {
284 data.writeInt32(0);
285 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700286 data.writeInt32(api);
Mathias Agopian595264f2013-07-16 22:56:09 -0700287 data.writeInt32(producerControlledByApp);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700288 status_t result = remote()->transact(CONNECT, data, &reply);
289 if (result != NO_ERROR) {
290 return result;
291 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700292 reply.read(*output);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700293 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700294 return result;
295 }
Mathias Agopian80727112011-05-02 19:51:12 -0700296
Robert Carr97b9c862016-09-08 13:54:35 -0700297 virtual status_t disconnect(int api, DisconnectMode mode) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700298 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800299 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700300 data.writeInt32(api);
Robert Carr97b9c862016-09-08 13:54:35 -0700301 data.writeInt32(static_cast<int32_t>(mode));
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700302 status_t result =remote()->transact(DISCONNECT, data, &reply);
303 if (result != NO_ERROR) {
304 return result;
305 }
306 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700307 return result;
308 }
Jesse Hall399184a2014-03-03 15:42:54 -0800309
310 virtual status_t setSidebandStream(const sp<NativeHandle>& stream) {
311 Parcel data, reply;
312 status_t result;
313 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
314 if (stream.get()) {
315 data.writeInt32(true);
316 data.writeNativeHandle(stream->handle());
317 } else {
318 data.writeInt32(false);
319 }
320 if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) {
321 result = reply.readInt32();
322 }
323 return result;
324 }
Dan Stoza29a3e902014-06-20 13:13:57 -0700325
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700326 virtual void allocateBuffers(uint32_t width, uint32_t height,
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800327 PixelFormat format, uint32_t usage) {
Dan Stoza29a3e902014-06-20 13:13:57 -0700328 Parcel data, reply;
329 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800330 data.writeUint32(width);
331 data.writeUint32(height);
Dan Stoza29a3e902014-06-20 13:13:57 -0700332 data.writeInt32(static_cast<int32_t>(format));
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800333 data.writeUint32(usage);
Dan Stoza29a3e902014-06-20 13:13:57 -0700334 status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply);
335 if (result != NO_ERROR) {
336 ALOGE("allocateBuffers failed to transact: %d", result);
337 }
338 }
Dan Stoza9de72932015-04-16 17:28:43 -0700339
340 virtual status_t allowAllocation(bool allow) {
341 Parcel data, reply;
342 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
343 data.writeInt32(static_cast<int32_t>(allow));
344 status_t result = remote()->transact(ALLOW_ALLOCATION, data, &reply);
345 if (result != NO_ERROR) {
346 return result;
347 }
348 result = reply.readInt32();
349 return result;
350 }
Dan Stoza812ed062015-06-02 15:45:22 -0700351
352 virtual status_t setGenerationNumber(uint32_t generationNumber) {
353 Parcel data, reply;
354 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
355 data.writeUint32(generationNumber);
356 status_t result = remote()->transact(SET_GENERATION_NUMBER, data, &reply);
357 if (result == NO_ERROR) {
358 result = reply.readInt32();
359 }
360 return result;
361 }
Dan Stozac6f30bd2015-06-08 09:32:50 -0700362
363 virtual String8 getConsumerName() const {
364 Parcel data, reply;
365 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
366 status_t result = remote()->transact(GET_CONSUMER_NAME, data, &reply);
367 if (result != NO_ERROR) {
368 ALOGE("getConsumerName failed to transact: %d", result);
369 return String8("TransactFailed");
370 }
371 return reply.readString8();
372 }
Dan Stoza7dde5992015-05-22 09:51:44 -0700373
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700374 virtual status_t setSharedBufferMode(bool sharedBufferMode) {
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700375 Parcel data, reply;
376 data.writeInterfaceToken(
377 IGraphicBufferProducer::getInterfaceDescriptor());
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700378 data.writeInt32(sharedBufferMode);
379 status_t result = remote()->transact(SET_SHARED_BUFFER_MODE, data,
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700380 &reply);
381 if (result == NO_ERROR) {
382 result = reply.readInt32();
383 }
384 return result;
385 }
Dan Stoza127fc632015-06-30 13:43:32 -0700386
Pablo Ceballosff95aab2016-01-13 17:09:58 -0800387 virtual status_t setAutoRefresh(bool autoRefresh) {
388 Parcel data, reply;
389 data.writeInterfaceToken(
390 IGraphicBufferProducer::getInterfaceDescriptor());
391 data.writeInt32(autoRefresh);
392 status_t result = remote()->transact(SET_AUTO_REFRESH, data, &reply);
393 if (result == NO_ERROR) {
394 result = reply.readInt32();
395 }
396 return result;
397 }
398
Dan Stoza127fc632015-06-30 13:43:32 -0700399 virtual status_t setDequeueTimeout(nsecs_t timeout) {
400 Parcel data, reply;
401 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
402 data.writeInt64(timeout);
403 status_t result = remote()->transact(SET_DEQUEUE_TIMEOUT, data, &reply);
404 if (result != NO_ERROR) {
405 ALOGE("setDequeueTimeout failed to transact: %d", result);
406 return result;
407 }
408 return reply.readInt32();
409 }
Dan Stoza50101d02016-04-07 16:53:23 -0700410
411 virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer,
John Reck1a61da52016-04-28 13:18:15 -0700412 sp<Fence>* outFence, float outTransformMatrix[16]) override {
Dan Stoza50101d02016-04-07 16:53:23 -0700413 Parcel data, reply;
414 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
415 status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER, data,
416 &reply);
417 if (result != NO_ERROR) {
418 ALOGE("getLastQueuedBuffer failed to transact: %d", result);
419 return result;
420 }
421 result = reply.readInt32();
422 if (result != NO_ERROR) {
423 return result;
424 }
John Reckce8e5df2016-04-28 10:12:47 -0700425 bool hasBuffer = reply.readBool();
426 sp<GraphicBuffer> buffer;
427 if (hasBuffer) {
428 buffer = new GraphicBuffer();
429 result = reply.read(*buffer);
John Reck1a61da52016-04-28 13:18:15 -0700430 if (result == NO_ERROR) {
431 result = reply.read(outTransformMatrix, sizeof(float) * 16);
432 }
John Reckce8e5df2016-04-28 10:12:47 -0700433 }
Dan Stoza50101d02016-04-07 16:53:23 -0700434 if (result != NO_ERROR) {
435 ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
436 return result;
437 }
438 sp<Fence> fence(new Fence);
439 result = reply.read(*fence);
440 if (result != NO_ERROR) {
441 ALOGE("getLastQueuedBuffer failed to read fence: %d", result);
442 return result;
443 }
444 *outBuffer = buffer;
445 *outFence = fence;
446 return result;
447 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800448
Brian Anderson3890c392016-07-25 12:48:08 -0700449 virtual void getFrameTimestamps(FrameEventHistoryDelta* outDelta) {
Pablo Ceballosce796e72016-02-04 19:10:51 -0800450 Parcel data, reply;
451 status_t result = data.writeInterfaceToken(
452 IGraphicBufferProducer::getInterfaceDescriptor());
453 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700454 ALOGE("IGBP::getFrameTimestamps failed to write token: %d", result);
455 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800456 }
457 result = remote()->transact(GET_FRAME_TIMESTAMPS, data, &reply);
458 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700459 ALOGE("IGBP::getFrameTimestamps failed to transact: %d", result);
460 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800461 }
Brian Anderson3890c392016-07-25 12:48:08 -0700462 result = reply.read(*outDelta);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800463 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700464 ALOGE("IGBP::getFrameTimestamps failed to read timestamps: %d",
465 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800466 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800467 }
Pablo Ceballos6155b402016-06-30 17:01:49 -0700468
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -0700469 virtual status_t getUniqueId(uint64_t* outId) const {
470 Parcel data, reply;
471 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
472 status_t result = remote()->transact(GET_UNIQUE_ID, data, &reply);
473 if (result != NO_ERROR) {
474 ALOGE("getUniqueId failed to transact: %d", result);
475 }
476 status_t actualResult = NO_ERROR;
477 result = reply.readInt32(&actualResult);
478 if (result != NO_ERROR) {
479 return result;
480 }
481 result = reply.readUint64(outId);
482 if (result != NO_ERROR) {
483 return result;
484 }
485 return actualResult;
486 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800487};
488
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800489// Out-of-line virtual method definition to trigger vtable emission in this
490// translation unit (see clang warning -Wweak-vtables)
491BpGraphicBufferProducer::~BpGraphicBufferProducer() {}
492
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800493class HpGraphicBufferProducer : public HpInterface<
494 BpGraphicBufferProducer, H2BGraphicBufferProducer> {
495public:
496 HpGraphicBufferProducer(const sp<IBinder>& base) : PBase(base) {}
497
498 status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) override {
499 return mBase->requestBuffer(slot, buf);
500 }
501
502 status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) override {
503 return mBase->setMaxDequeuedBufferCount(maxDequeuedBuffers);
504 }
505
506 status_t setAsyncMode(bool async) override {
507 return mBase->setAsyncMode(async);
508 }
509
510 status_t dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w, uint32_t h,
511 PixelFormat format, uint32_t usage,
512 FrameEventHistoryDelta* outTimestamps) override {
513 return mBase->dequeueBuffer(
514 slot, fence, w, h, format, usage, outTimestamps);
515 }
516
517 status_t detachBuffer(int slot) override {
518 return mBase->detachBuffer(slot);
519 }
520
521 status_t detachNextBuffer(
522 sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) override {
523 return mBase->detachNextBuffer(outBuffer, outFence);
524 }
525
526 status_t attachBuffer(
527 int* outSlot, const sp<GraphicBuffer>& buffer) override {
528 return mBase->attachBuffer(outSlot, buffer);
529 }
530
531 status_t queueBuffer(
532 int slot,
533 const QueueBufferInput& input,
534 QueueBufferOutput* output) override {
535 return mBase->queueBuffer(slot, input, output);
536 }
537
538 status_t cancelBuffer(int slot, const sp<Fence>& fence) override {
539 return mBase->cancelBuffer(slot, fence);
540 }
541
542 int query(int what, int* value) override {
543 return mBase->query(what, value);
544 }
545
546 status_t connect(
547 const sp<IProducerListener>& listener,
548 int api, bool producerControlledByApp,
549 QueueBufferOutput* output) override {
550 return mBase->connect(listener, api, producerControlledByApp, output);
551 }
552
553 status_t disconnect(
554 int api, DisconnectMode mode = DisconnectMode::Api) override {
555 return mBase->disconnect(api, mode);
556 }
557
558 status_t setSidebandStream(const sp<NativeHandle>& stream) override {
559 return mBase->setSidebandStream(stream);
560 }
561
562 void allocateBuffers(uint32_t width, uint32_t height,
563 PixelFormat format, uint32_t usage) override {
564 return mBase->allocateBuffers(width, height, format, usage);
565 }
566
567 status_t allowAllocation(bool allow) override {
568 return mBase->allowAllocation(allow);
569 }
570
571 status_t setGenerationNumber(uint32_t generationNumber) override {
572 return mBase->setGenerationNumber(generationNumber);
573 }
574
575 String8 getConsumerName() const override {
576 return mBase->getConsumerName();
577 }
578
579 status_t setSharedBufferMode(bool sharedBufferMode) override {
580 return mBase->setSharedBufferMode(sharedBufferMode);
581 }
582
583 status_t setAutoRefresh(bool autoRefresh) override {
584 return mBase->setAutoRefresh(autoRefresh);
585 }
586
587 status_t setDequeueTimeout(nsecs_t timeout) override {
588 return mBase->setDequeueTimeout(timeout);
589 }
590
591 status_t getLastQueuedBuffer(
592 sp<GraphicBuffer>* outBuffer,
593 sp<Fence>* outFence,
594 float outTransformMatrix[16]) override {
595 return mBase->getLastQueuedBuffer(
596 outBuffer, outFence, outTransformMatrix);
597 }
598
599 void getFrameTimestamps(FrameEventHistoryDelta* outDelta) override {
600 return mBase->getFrameTimestamps(outDelta);
601 }
602
603 status_t getUniqueId(uint64_t* outId) const override {
604 return mBase->getUniqueId(outId);
605 }
606};
607
608IMPLEMENT_HYBRID_META_INTERFACE(GraphicBufferProducer, HGraphicBufferProducer,
609 "android.gui.IGraphicBufferProducer");
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800610
611// ----------------------------------------------------------------------
612
Andy McFadden2adaf042012-12-18 09:49:45 -0800613status_t BnGraphicBufferProducer::onTransact(
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800614 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
615{
616 switch(code) {
617 case REQUEST_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800618 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800619 int bufferIdx = data.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700620 sp<GraphicBuffer> buffer;
621 int result = requestBuffer(bufferIdx, &buffer);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800622 reply->writeInt32(buffer != 0);
623 if (buffer != 0) {
624 reply->write(*buffer);
625 }
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700626 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800627 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800628 }
Pablo Ceballosfa455352015-08-12 17:47:47 -0700629 case SET_MAX_DEQUEUED_BUFFER_COUNT: {
630 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
631 int maxDequeuedBuffers = data.readInt32();
632 int result = setMaxDequeuedBufferCount(maxDequeuedBuffers);
633 reply->writeInt32(result);
634 return NO_ERROR;
635 }
636 case SET_ASYNC_MODE: {
637 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
638 bool async = data.readInt32();
639 int result = setAsyncMode(async);
640 reply->writeInt32(result);
641 return NO_ERROR;
642 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800643 case DEQUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800644 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800645 uint32_t width = data.readUint32();
646 uint32_t height = data.readUint32();
647 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
648 uint32_t usage = data.readUint32();
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700649 bool getTimestamps = data.readBool();
Brian Andersonbaaad322016-07-22 15:55:13 -0700650
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700651 int buf = 0;
Brian Andersonbaaad322016-07-22 15:55:13 -0700652 sp<Fence> fence = Fence::NO_FENCE;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700653 FrameEventHistoryDelta frameTimestamps;
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700654 int result = dequeueBuffer(&buf, &fence, width, height, format,
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700655 usage, getTimestamps ? &frameTimestamps : nullptr);
Brian Andersonbaaad322016-07-22 15:55:13 -0700656
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800657 reply->writeInt32(buf);
Brian Andersonbaaad322016-07-22 15:55:13 -0700658 reply->write(*fence);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700659 if (getTimestamps) {
660 reply->write(frameTimestamps);
661 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800662 reply->writeInt32(result);
663 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800664 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800665 case DETACH_BUFFER: {
666 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
667 int slot = data.readInt32();
668 int result = detachBuffer(slot);
669 reply->writeInt32(result);
670 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800671 }
Dan Stozad9822a32014-03-28 15:25:31 -0700672 case DETACH_NEXT_BUFFER: {
673 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
674 sp<GraphicBuffer> buffer;
675 sp<Fence> fence;
676 int32_t result = detachNextBuffer(&buffer, &fence);
677 reply->writeInt32(result);
678 if (result == NO_ERROR) {
679 reply->writeInt32(buffer != NULL);
680 if (buffer != NULL) {
681 reply->write(*buffer);
682 }
683 reply->writeInt32(fence != NULL);
684 if (fence != NULL) {
685 reply->write(*fence);
686 }
687 }
688 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800689 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800690 case ATTACH_BUFFER: {
691 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
692 sp<GraphicBuffer> buffer = new GraphicBuffer();
Pablo Ceballos70636b32016-07-06 15:24:54 -0700693 status_t result = data.read(*buffer.get());
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700694 int slot = 0;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700695 if (result == NO_ERROR) {
696 result = attachBuffer(&slot, buffer);
697 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800698 reply->writeInt32(slot);
699 reply->writeInt32(result);
700 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800701 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800702 case QUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800703 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700704
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800705 int buf = data.readInt32();
Jesse Hallc777b0b2012-06-28 12:52:05 -0700706 QueueBufferInput input(data);
Brian Andersonbaaad322016-07-22 15:55:13 -0700707 QueueBufferOutput output;
708 status_t result = queueBuffer(buf, input, &output);
Brian Andersonbaaad322016-07-22 15:55:13 -0700709 reply->write(output);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800710 reply->writeInt32(result);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700711
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800712 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800713 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800714 case CANCEL_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800715 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800716 int buf = data.readInt32();
Jamie Gennis1df8c342012-12-20 14:05:45 -0800717 sp<Fence> fence = new Fence();
Pablo Ceballos70636b32016-07-06 15:24:54 -0700718 status_t result = data.read(*fence.get());
719 if (result == NO_ERROR) {
720 result = cancelBuffer(buf, fence);
721 }
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700722 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800723 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800724 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700725 case QUERY: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800726 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700727 int value = 0;
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700728 int what = data.readInt32();
729 int res = query(what, &value);
730 reply->writeInt32(value);
731 reply->writeInt32(res);
732 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800733 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700734 case CONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800735 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stozaf0eaf252014-03-21 13:05:51 -0700736 sp<IProducerListener> listener;
737 if (data.readInt32() == 1) {
738 listener = IProducerListener::asInterface(data.readStrongBinder());
739 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700740 int api = data.readInt32();
Mathias Agopian595264f2013-07-16 22:56:09 -0700741 bool producerControlledByApp = data.readInt32();
Brian Andersonbaaad322016-07-22 15:55:13 -0700742 QueueBufferOutput output;
743 status_t res = connect(listener, api, producerControlledByApp, &output);
744 reply->write(output);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700745 reply->writeInt32(res);
746 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800747 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700748 case DISCONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800749 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700750 int api = data.readInt32();
Robert Carr97b9c862016-09-08 13:54:35 -0700751 DisconnectMode mode = static_cast<DisconnectMode>(data.readInt32());
752 status_t res = disconnect(api, mode);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700753 reply->writeInt32(res);
754 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800755 }
Jesse Hall399184a2014-03-03 15:42:54 -0800756 case SET_SIDEBAND_STREAM: {
757 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
758 sp<NativeHandle> stream;
759 if (data.readInt32()) {
Wonsik Kim0ec54e12014-03-21 10:46:24 +0900760 stream = NativeHandle::create(data.readNativeHandle(), true);
Jesse Hall399184a2014-03-03 15:42:54 -0800761 }
762 status_t result = setSidebandStream(stream);
763 reply->writeInt32(result);
764 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800765 }
Dan Stoza9de72932015-04-16 17:28:43 -0700766 case ALLOCATE_BUFFERS: {
Dan Stoza29a3e902014-06-20 13:13:57 -0700767 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800768 uint32_t width = data.readUint32();
769 uint32_t height = data.readUint32();
770 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
771 uint32_t usage = data.readUint32();
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700772 allocateBuffers(width, height, format, usage);
Dan Stoza29a3e902014-06-20 13:13:57 -0700773 return NO_ERROR;
Dan Stoza9de72932015-04-16 17:28:43 -0700774 }
775 case ALLOW_ALLOCATION: {
776 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
777 bool allow = static_cast<bool>(data.readInt32());
778 status_t result = allowAllocation(allow);
779 reply->writeInt32(result);
780 return NO_ERROR;
781 }
Dan Stoza812ed062015-06-02 15:45:22 -0700782 case SET_GENERATION_NUMBER: {
783 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
784 uint32_t generationNumber = data.readUint32();
785 status_t result = setGenerationNumber(generationNumber);
786 reply->writeInt32(result);
787 return NO_ERROR;
788 }
Dan Stozac6f30bd2015-06-08 09:32:50 -0700789 case GET_CONSUMER_NAME: {
790 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
791 reply->writeString8(getConsumerName());
792 return NO_ERROR;
793 }
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700794 case SET_SHARED_BUFFER_MODE: {
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700795 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700796 bool sharedBufferMode = data.readInt32();
797 status_t result = setSharedBufferMode(sharedBufferMode);
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700798 reply->writeInt32(result);
799 return NO_ERROR;
800 }
Pablo Ceballosff95aab2016-01-13 17:09:58 -0800801 case SET_AUTO_REFRESH: {
802 CHECK_INTERFACE(IGraphicBuffer, data, reply);
803 bool autoRefresh = data.readInt32();
804 status_t result = setAutoRefresh(autoRefresh);
805 reply->writeInt32(result);
806 return NO_ERROR;
807 }
Dan Stoza127fc632015-06-30 13:43:32 -0700808 case SET_DEQUEUE_TIMEOUT: {
809 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
810 nsecs_t timeout = data.readInt64();
811 status_t result = setDequeueTimeout(timeout);
812 reply->writeInt32(result);
813 return NO_ERROR;
814 }
Dan Stoza50101d02016-04-07 16:53:23 -0700815 case GET_LAST_QUEUED_BUFFER: {
816 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
817 sp<GraphicBuffer> buffer(nullptr);
818 sp<Fence> fence(Fence::NO_FENCE);
John Reck1a61da52016-04-28 13:18:15 -0700819 float transform[16] = {};
820 status_t result = getLastQueuedBuffer(&buffer, &fence, transform);
Dan Stoza50101d02016-04-07 16:53:23 -0700821 reply->writeInt32(result);
822 if (result != NO_ERROR) {
823 return result;
824 }
John Reckce8e5df2016-04-28 10:12:47 -0700825 if (!buffer.get()) {
826 reply->writeBool(false);
827 } else {
828 reply->writeBool(true);
829 result = reply->write(*buffer);
John Reck1a61da52016-04-28 13:18:15 -0700830 if (result == NO_ERROR) {
831 reply->write(transform, sizeof(float) * 16);
832 }
John Reckce8e5df2016-04-28 10:12:47 -0700833 }
Dan Stoza50101d02016-04-07 16:53:23 -0700834 if (result != NO_ERROR) {
835 ALOGE("getLastQueuedBuffer failed to write buffer: %d", result);
836 return result;
837 }
838 result = reply->write(*fence);
839 if (result != NO_ERROR) {
840 ALOGE("getLastQueuedBuffer failed to write fence: %d", result);
841 return result;
842 }
843 return NO_ERROR;
844 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800845 case GET_FRAME_TIMESTAMPS: {
846 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson3890c392016-07-25 12:48:08 -0700847 FrameEventHistoryDelta frameTimestamps;
848 getFrameTimestamps(&frameTimestamps);
849 status_t result = reply->write(frameTimestamps);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800850 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700851 ALOGE("BnGBP::GET_FRAME_TIMESTAMPS failed to write buffer: %d",
852 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800853 return result;
854 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800855 return NO_ERROR;
856 }
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -0700857 case GET_UNIQUE_ID: {
858 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
859 uint64_t outId = 0;
860 status_t actualResult = getUniqueId(&outId);
861 status_t result = reply->writeInt32(actualResult);
862 if (result != NO_ERROR) {
863 return result;
864 }
865 result = reply->writeUint64(outId);
866 if (result != NO_ERROR) {
867 return result;
868 }
869 return NO_ERROR;
870 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800871 }
872 return BBinder::onTransact(code, data, reply, flags);
873}
874
875// ----------------------------------------------------------------------------
876
Andy McFadden2adaf042012-12-18 09:49:45 -0800877IGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) {
Jesse Hallc777b0b2012-06-28 12:52:05 -0700878 parcel.read(*this);
879}
880
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700881constexpr size_t IGraphicBufferProducer::QueueBufferInput::minFlattenedSize() {
882 return sizeof(timestamp) +
883 sizeof(isAutoTimestamp) +
884 sizeof(dataSpace) +
885 sizeof(crop) +
886 sizeof(scalingMode) +
887 sizeof(transform) +
888 sizeof(stickyTransform) +
889 sizeof(getFrameTimestamps);
890}
891
Mathias Agopiane1424282013-07-29 21:24:40 -0700892size_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const {
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700893 return minFlattenedSize() +
894 fence->getFlattenedSize() +
895 surfaceDamage.getFlattenedSize();
Jesse Hallc777b0b2012-06-28 12:52:05 -0700896}
897
Mathias Agopiane1424282013-07-29 21:24:40 -0700898size_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const {
Jamie Gennis1df8c342012-12-20 14:05:45 -0800899 return fence->getFdCount();
Jesse Hallc777b0b2012-06-28 12:52:05 -0700900}
901
Mathias Agopiane1424282013-07-29 21:24:40 -0700902status_t IGraphicBufferProducer::QueueBufferInput::flatten(
903 void*& buffer, size_t& size, int*& fds, size_t& count) const
Jesse Hallc777b0b2012-06-28 12:52:05 -0700904{
Mathias Agopiane1424282013-07-29 21:24:40 -0700905 if (size < getFlattenedSize()) {
906 return NO_MEMORY;
907 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700908
Mathias Agopiane1424282013-07-29 21:24:40 -0700909 FlattenableUtils::write(buffer, size, timestamp);
Andy McFadden3c256212013-08-16 14:55:39 -0700910 FlattenableUtils::write(buffer, size, isAutoTimestamp);
Eino-Ville Talvala82c6bcc2015-02-19 16:10:43 -0800911 FlattenableUtils::write(buffer, size, dataSpace);
Mathias Agopiane1424282013-07-29 21:24:40 -0700912 FlattenableUtils::write(buffer, size, crop);
913 FlattenableUtils::write(buffer, size, scalingMode);
914 FlattenableUtils::write(buffer, size, transform);
Ruben Brunk1681d952014-06-27 15:51:55 -0700915 FlattenableUtils::write(buffer, size, stickyTransform);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700916 FlattenableUtils::write(buffer, size, getFrameTimestamps);
917
Dan Stoza5065a552015-03-17 16:23:42 -0700918 status_t result = fence->flatten(buffer, size, fds, count);
919 if (result != NO_ERROR) {
920 return result;
921 }
922 return surfaceDamage.flatten(buffer, size);
Jesse Hallc777b0b2012-06-28 12:52:05 -0700923}
924
Mathias Agopiane1424282013-07-29 21:24:40 -0700925status_t IGraphicBufferProducer::QueueBufferInput::unflatten(
926 void const*& buffer, size_t& size, int const*& fds, size_t& count)
Jesse Hallc777b0b2012-06-28 12:52:05 -0700927{
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700928 if (size < minFlattenedSize()) {
Mathias Agopiane1424282013-07-29 21:24:40 -0700929 return NO_MEMORY;
930 }
931
932 FlattenableUtils::read(buffer, size, timestamp);
Andy McFadden3c256212013-08-16 14:55:39 -0700933 FlattenableUtils::read(buffer, size, isAutoTimestamp);
Eino-Ville Talvala82c6bcc2015-02-19 16:10:43 -0800934 FlattenableUtils::read(buffer, size, dataSpace);
Mathias Agopiane1424282013-07-29 21:24:40 -0700935 FlattenableUtils::read(buffer, size, crop);
936 FlattenableUtils::read(buffer, size, scalingMode);
937 FlattenableUtils::read(buffer, size, transform);
Ruben Brunk1681d952014-06-27 15:51:55 -0700938 FlattenableUtils::read(buffer, size, stickyTransform);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700939 FlattenableUtils::read(buffer, size, getFrameTimestamps);
Mathias Agopiane1424282013-07-29 21:24:40 -0700940
Jamie Gennis1df8c342012-12-20 14:05:45 -0800941 fence = new Fence();
Dan Stoza5065a552015-03-17 16:23:42 -0700942 status_t result = fence->unflatten(buffer, size, fds, count);
943 if (result != NO_ERROR) {
944 return result;
945 }
946 return surfaceDamage.unflatten(buffer, size);
Jesse Hallc777b0b2012-06-28 12:52:05 -0700947}
948
Brian Andersonbaaad322016-07-22 15:55:13 -0700949// ----------------------------------------------------------------------------
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700950constexpr size_t IGraphicBufferProducer::QueueBufferOutput::minFlattenedSize() {
951 return sizeof(width) +
952 sizeof(height) +
953 sizeof(transformHint) +
954 sizeof(numPendingBuffers) +
Shuzhen Wang22f842b2017-01-18 23:02:36 -0800955 sizeof(nextFrameNumber) +
956 sizeof(bufferReplaced);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700957}
Brian Andersonbaaad322016-07-22 15:55:13 -0700958
959size_t IGraphicBufferProducer::QueueBufferOutput::getFlattenedSize() const {
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700960 return minFlattenedSize() + frameTimestamps.getFlattenedSize();
Brian Andersonbaaad322016-07-22 15:55:13 -0700961}
962
963size_t IGraphicBufferProducer::QueueBufferOutput::getFdCount() const {
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700964 return frameTimestamps.getFdCount();
Brian Andersonbaaad322016-07-22 15:55:13 -0700965}
966
967status_t IGraphicBufferProducer::QueueBufferOutput::flatten(
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700968 void*& buffer, size_t& size, int*& fds, size_t& count) const
Brian Andersonbaaad322016-07-22 15:55:13 -0700969{
970 if (size < getFlattenedSize()) {
971 return NO_MEMORY;
972 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700973
Brian Andersonbaaad322016-07-22 15:55:13 -0700974 FlattenableUtils::write(buffer, size, width);
975 FlattenableUtils::write(buffer, size, height);
976 FlattenableUtils::write(buffer, size, transformHint);
977 FlattenableUtils::write(buffer, size, numPendingBuffers);
978 FlattenableUtils::write(buffer, size, nextFrameNumber);
Shuzhen Wang22f842b2017-01-18 23:02:36 -0800979 FlattenableUtils::write(buffer, size, bufferReplaced);
Brian Andersonbaaad322016-07-22 15:55:13 -0700980
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700981 return frameTimestamps.flatten(buffer, size, fds, count);
Brian Andersonbaaad322016-07-22 15:55:13 -0700982}
983
984status_t IGraphicBufferProducer::QueueBufferOutput::unflatten(
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700985 void const*& buffer, size_t& size, int const*& fds, size_t& count)
Brian Andersonbaaad322016-07-22 15:55:13 -0700986{
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700987 if (size < minFlattenedSize()) {
Brian Andersonbaaad322016-07-22 15:55:13 -0700988 return NO_MEMORY;
989 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700990
Brian Andersonbaaad322016-07-22 15:55:13 -0700991 FlattenableUtils::read(buffer, size, width);
992 FlattenableUtils::read(buffer, size, height);
993 FlattenableUtils::read(buffer, size, transformHint);
994 FlattenableUtils::read(buffer, size, numPendingBuffers);
995 FlattenableUtils::read(buffer, size, nextFrameNumber);
Shuzhen Wang22f842b2017-01-18 23:02:36 -0800996 FlattenableUtils::read(buffer, size, bufferReplaced);
Brian Andersonbaaad322016-07-22 15:55:13 -0700997
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700998 return frameTimestamps.unflatten(buffer, size, fds, count);
Brian Andersonbaaad322016-07-22 15:55:13 -0700999}
1000
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001001}; // namespace android