blob: e37b65ba9c924ca54af4abadc0d6d712fdb8c8fd [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>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080023#include <utils/Timers.h>
Jesse Hall399184a2014-03-03 15:42:54 -080024#include <utils/Vector.h>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080025
26#include <binder/Parcel.h>
27#include <binder/IInterface.h>
28
Andy McFadden2adaf042012-12-18 09:49:45 -080029#include <gui/IGraphicBufferProducer.h>
Dan Stozaf0eaf252014-03-21 13:05:51 -070030#include <gui/IProducerListener.h>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080031
32namespace android {
33// ----------------------------------------------------------------------------
34
35enum {
36 REQUEST_BUFFER = IBinder::FIRST_CALL_TRANSACTION,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080037 DEQUEUE_BUFFER,
Dan Stoza9f3053d2014-03-06 15:14:33 -080038 DETACH_BUFFER,
Dan Stozad9822a32014-03-28 15:25:31 -070039 DETACH_NEXT_BUFFER,
Dan Stoza9f3053d2014-03-06 15:14:33 -080040 ATTACH_BUFFER,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080041 QUEUE_BUFFER,
42 CANCEL_BUFFER,
Mathias Agopianeafabcd2011-04-20 14:20:59 -070043 QUERY,
Jamie Gennisfe0a87b2011-07-13 19:12:20 -070044 CONNECT,
45 DISCONNECT,
Jesse Hall399184a2014-03-03 15:42:54 -080046 SET_SIDEBAND_STREAM,
Dan Stoza29a3e902014-06-20 13:13:57 -070047 ALLOCATE_BUFFERS,
Dan Stoza9de72932015-04-16 17:28:43 -070048 ALLOW_ALLOCATION,
Dan Stoza812ed062015-06-02 15:45:22 -070049 SET_GENERATION_NUMBER,
Dan Stozac6f30bd2015-06-08 09:32:50 -070050 GET_CONSUMER_NAME,
Pablo Ceballosfa455352015-08-12 17:47:47 -070051 SET_MAX_DEQUEUED_BUFFER_COUNT,
Dan Stoza7dde5992015-05-22 09:51:44 -070052 SET_ASYNC_MODE,
Pablo Ceballos3559fbf2016-03-17 15:50:23 -070053 SET_SHARED_BUFFER_MODE,
Pablo Ceballosff95aab2016-01-13 17:09:58 -080054 SET_AUTO_REFRESH,
Dan Stoza127fc632015-06-30 13:43:32 -070055 SET_DEQUEUE_TIMEOUT,
Dan Stoza50101d02016-04-07 16:53:23 -070056 GET_LAST_QUEUED_BUFFER,
Pablo Ceballosfc352582016-06-30 17:22:20 -070057 GET_FRAME_TIMESTAMPS,
58 GET_UNIQUE_ID
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080059};
60
Andy McFadden2adaf042012-12-18 09:49:45 -080061class BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080062{
63public:
Chih-Hung Hsiehe2347b72016-04-25 15:41:05 -070064 explicit BpGraphicBufferProducer(const sp<IBinder>& impl)
Andy McFadden2adaf042012-12-18 09:49:45 -080065 : BpInterface<IGraphicBufferProducer>(impl)
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080066 {
67 }
68
Dan Stoza3be1c6b2014-11-18 10:24:03 -080069 virtual ~BpGraphicBufferProducer();
70
Jamie Gennis7b305ff2011-07-19 12:08:33 -070071 virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080072 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -080073 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080074 data.writeInt32(bufferIdx);
Jamie Gennis8a29ff22011-10-14 15:03:17 -070075 status_t result =remote()->transact(REQUEST_BUFFER, data, &reply);
76 if (result != NO_ERROR) {
77 return result;
78 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080079 bool nonNull = reply.readInt32();
80 if (nonNull) {
Jamie Gennis7b305ff2011-07-19 12:08:33 -070081 *buf = new GraphicBuffer();
Lingyun Zhu2aff7022012-11-20 19:24:35 +080082 result = reply.read(**buf);
83 if(result != NO_ERROR) {
84 (*buf).clear();
85 return result;
86 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080087 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -070088 result = reply.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -070089 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080090 }
91
Pablo Ceballosfa455352015-08-12 17:47:47 -070092 virtual status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) {
93 Parcel data, reply;
94 data.writeInterfaceToken(
95 IGraphicBufferProducer::getInterfaceDescriptor());
96 data.writeInt32(maxDequeuedBuffers);
97 status_t result = remote()->transact(SET_MAX_DEQUEUED_BUFFER_COUNT,
98 data, &reply);
99 if (result != NO_ERROR) {
100 return result;
101 }
102 result = reply.readInt32();
103 return result;
104 }
105
106 virtual status_t setAsyncMode(bool async) {
107 Parcel data, reply;
108 data.writeInterfaceToken(
109 IGraphicBufferProducer::getInterfaceDescriptor());
110 data.writeInt32(async);
111 status_t result = remote()->transact(SET_ASYNC_MODE,
112 data, &reply);
113 if (result != NO_ERROR) {
114 return result;
115 }
116 result = reply.readInt32();
117 return result;
118 }
119
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700120 virtual status_t dequeueBuffer(int *buf, sp<Fence>* fence, uint32_t width,
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700121 uint32_t height, PixelFormat format, uint32_t usage,
122 FrameEventHistoryDelta* outTimestamps) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800123 Parcel data, reply;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700124 bool getFrameTimestamps = (outTimestamps != nullptr);
Brian Andersonbaaad322016-07-22 15:55:13 -0700125
Andy McFadden2adaf042012-12-18 09:49:45 -0800126 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800127 data.writeUint32(width);
128 data.writeUint32(height);
129 data.writeInt32(static_cast<int32_t>(format));
130 data.writeUint32(usage);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700131 data.writeBool(getFrameTimestamps);
Brian Andersonbaaad322016-07-22 15:55:13 -0700132
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700133 status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply);
134 if (result != NO_ERROR) {
135 return result;
136 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700137
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800138 *buf = reply.readInt32();
Brian Andersonbaaad322016-07-22 15:55:13 -0700139 *fence = new Fence();
140 result = reply.read(**fence);
141 if (result != NO_ERROR) {
142 fence->clear();
143 return result;
Jesse Hallf7857542012-06-14 15:26:33 -0700144 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700145 if (getFrameTimestamps) {
146 result = reply.read(*outTimestamps);
147 if (result != NO_ERROR) {
148 ALOGE("IGBP::dequeueBuffer failed to read timestamps: %d",
149 result);
150 return result;
151 }
152 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700153 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800154 return result;
155 }
156
Dan Stoza9f3053d2014-03-06 15:14:33 -0800157 virtual status_t detachBuffer(int slot) {
158 Parcel data, reply;
159 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
160 data.writeInt32(slot);
161 status_t result = remote()->transact(DETACH_BUFFER, data, &reply);
162 if (result != NO_ERROR) {
163 return result;
164 }
165 result = reply.readInt32();
166 return result;
167 }
168
Dan Stozad9822a32014-03-28 15:25:31 -0700169 virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer,
170 sp<Fence>* outFence) {
171 if (outBuffer == NULL) {
172 ALOGE("detachNextBuffer: outBuffer must not be NULL");
173 return BAD_VALUE;
174 } else if (outFence == NULL) {
175 ALOGE("detachNextBuffer: outFence must not be NULL");
176 return BAD_VALUE;
177 }
178 Parcel data, reply;
179 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
180 status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply);
181 if (result != NO_ERROR) {
182 return result;
183 }
184 result = reply.readInt32();
185 if (result == NO_ERROR) {
186 bool nonNull = reply.readInt32();
187 if (nonNull) {
188 *outBuffer = new GraphicBuffer;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700189 result = reply.read(**outBuffer);
190 if (result != NO_ERROR) {
191 outBuffer->clear();
192 return result;
193 }
Dan Stozad9822a32014-03-28 15:25:31 -0700194 }
195 nonNull = reply.readInt32();
196 if (nonNull) {
197 *outFence = new Fence;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700198 result = reply.read(**outFence);
199 if (result != NO_ERROR) {
200 outBuffer->clear();
201 outFence->clear();
202 return result;
203 }
Dan Stozad9822a32014-03-28 15:25:31 -0700204 }
205 }
206 return result;
207 }
208
Dan Stoza9f3053d2014-03-06 15:14:33 -0800209 virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) {
210 Parcel data, reply;
211 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
212 data.write(*buffer.get());
213 status_t result = remote()->transact(ATTACH_BUFFER, data, &reply);
214 if (result != NO_ERROR) {
215 return result;
216 }
217 *slot = reply.readInt32();
218 result = reply.readInt32();
219 return result;
220 }
221
Mathias Agopianf0bc2f12012-04-09 16:14:01 -0700222 virtual status_t queueBuffer(int buf,
223 const QueueBufferInput& input, QueueBufferOutput* output) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800224 Parcel data, reply;
Brian Andersonbaaad322016-07-22 15:55:13 -0700225
Andy McFadden2adaf042012-12-18 09:49:45 -0800226 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800227 data.writeInt32(buf);
Jesse Hallc777b0b2012-06-28 12:52:05 -0700228 data.write(input);
Brian Andersonbaaad322016-07-22 15:55:13 -0700229
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700230 status_t result = remote()->transact(QUEUE_BUFFER, data, &reply);
231 if (result != NO_ERROR) {
232 return result;
233 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700234
235 result = reply.read(*output);
236 if (result != NO_ERROR) {
237 return result;
238 }
239
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700240 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800241 return result;
242 }
243
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700244 virtual status_t cancelBuffer(int buf, const sp<Fence>& fence) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800245 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800246 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800247 data.writeInt32(buf);
Jamie Gennis1df8c342012-12-20 14:05:45 -0800248 data.write(*fence.get());
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700249 status_t result = remote()->transact(CANCEL_BUFFER, data, &reply);
250 if (result != NO_ERROR) {
251 return result;
252 }
253 result = reply.readInt32();
254 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800255 }
256
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700257 virtual int query(int what, int* value) {
258 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800259 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700260 data.writeInt32(what);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700261 status_t result = remote()->transact(QUERY, data, &reply);
262 if (result != NO_ERROR) {
263 return result;
264 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700265 value[0] = reply.readInt32();
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700266 result = reply.readInt32();
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700267 return result;
268 }
269
Dan Stozaf0eaf252014-03-21 13:05:51 -0700270 virtual status_t connect(const sp<IProducerListener>& listener,
Mathias Agopian365857d2013-09-11 19:35:45 -0700271 int api, bool producerControlledByApp, QueueBufferOutput* output) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700272 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800273 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stozaf0eaf252014-03-21 13:05:51 -0700274 if (listener != NULL) {
275 data.writeInt32(1);
Marco Nelissen097ca272014-11-14 08:01:01 -0800276 data.writeStrongBinder(IInterface::asBinder(listener));
Dan Stozaf0eaf252014-03-21 13:05:51 -0700277 } else {
278 data.writeInt32(0);
279 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700280 data.writeInt32(api);
Mathias Agopian595264f2013-07-16 22:56:09 -0700281 data.writeInt32(producerControlledByApp);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700282 status_t result = remote()->transact(CONNECT, data, &reply);
283 if (result != NO_ERROR) {
284 return result;
285 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700286 reply.read(*output);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700287 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700288 return result;
289 }
Mathias Agopian80727112011-05-02 19:51:12 -0700290
Robert Carr97b9c862016-09-08 13:54:35 -0700291 virtual status_t disconnect(int api, DisconnectMode mode) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700292 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800293 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700294 data.writeInt32(api);
Robert Carr97b9c862016-09-08 13:54:35 -0700295 data.writeInt32(static_cast<int32_t>(mode));
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700296 status_t result =remote()->transact(DISCONNECT, data, &reply);
297 if (result != NO_ERROR) {
298 return result;
299 }
300 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700301 return result;
302 }
Jesse Hall399184a2014-03-03 15:42:54 -0800303
304 virtual status_t setSidebandStream(const sp<NativeHandle>& stream) {
305 Parcel data, reply;
306 status_t result;
307 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
308 if (stream.get()) {
309 data.writeInt32(true);
310 data.writeNativeHandle(stream->handle());
311 } else {
312 data.writeInt32(false);
313 }
314 if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) {
315 result = reply.readInt32();
316 }
317 return result;
318 }
Dan Stoza29a3e902014-06-20 13:13:57 -0700319
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700320 virtual void allocateBuffers(uint32_t width, uint32_t height,
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800321 PixelFormat format, uint32_t usage) {
Dan Stoza29a3e902014-06-20 13:13:57 -0700322 Parcel data, reply;
323 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800324 data.writeUint32(width);
325 data.writeUint32(height);
Dan Stoza29a3e902014-06-20 13:13:57 -0700326 data.writeInt32(static_cast<int32_t>(format));
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800327 data.writeUint32(usage);
Dan Stoza29a3e902014-06-20 13:13:57 -0700328 status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply);
329 if (result != NO_ERROR) {
330 ALOGE("allocateBuffers failed to transact: %d", result);
331 }
332 }
Dan Stoza9de72932015-04-16 17:28:43 -0700333
334 virtual status_t allowAllocation(bool allow) {
335 Parcel data, reply;
336 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
337 data.writeInt32(static_cast<int32_t>(allow));
338 status_t result = remote()->transact(ALLOW_ALLOCATION, data, &reply);
339 if (result != NO_ERROR) {
340 return result;
341 }
342 result = reply.readInt32();
343 return result;
344 }
Dan Stoza812ed062015-06-02 15:45:22 -0700345
346 virtual status_t setGenerationNumber(uint32_t generationNumber) {
347 Parcel data, reply;
348 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
349 data.writeUint32(generationNumber);
350 status_t result = remote()->transact(SET_GENERATION_NUMBER, data, &reply);
351 if (result == NO_ERROR) {
352 result = reply.readInt32();
353 }
354 return result;
355 }
Dan Stozac6f30bd2015-06-08 09:32:50 -0700356
357 virtual String8 getConsumerName() const {
358 Parcel data, reply;
359 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
360 status_t result = remote()->transact(GET_CONSUMER_NAME, data, &reply);
361 if (result != NO_ERROR) {
362 ALOGE("getConsumerName failed to transact: %d", result);
363 return String8("TransactFailed");
364 }
365 return reply.readString8();
366 }
Dan Stoza7dde5992015-05-22 09:51:44 -0700367
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700368 virtual status_t setSharedBufferMode(bool sharedBufferMode) {
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700369 Parcel data, reply;
370 data.writeInterfaceToken(
371 IGraphicBufferProducer::getInterfaceDescriptor());
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700372 data.writeInt32(sharedBufferMode);
373 status_t result = remote()->transact(SET_SHARED_BUFFER_MODE, data,
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700374 &reply);
375 if (result == NO_ERROR) {
376 result = reply.readInt32();
377 }
378 return result;
379 }
Dan Stoza127fc632015-06-30 13:43:32 -0700380
Pablo Ceballosff95aab2016-01-13 17:09:58 -0800381 virtual status_t setAutoRefresh(bool autoRefresh) {
382 Parcel data, reply;
383 data.writeInterfaceToken(
384 IGraphicBufferProducer::getInterfaceDescriptor());
385 data.writeInt32(autoRefresh);
386 status_t result = remote()->transact(SET_AUTO_REFRESH, data, &reply);
387 if (result == NO_ERROR) {
388 result = reply.readInt32();
389 }
390 return result;
391 }
392
Dan Stoza127fc632015-06-30 13:43:32 -0700393 virtual status_t setDequeueTimeout(nsecs_t timeout) {
394 Parcel data, reply;
395 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
396 data.writeInt64(timeout);
397 status_t result = remote()->transact(SET_DEQUEUE_TIMEOUT, data, &reply);
398 if (result != NO_ERROR) {
399 ALOGE("setDequeueTimeout failed to transact: %d", result);
400 return result;
401 }
402 return reply.readInt32();
403 }
Dan Stoza50101d02016-04-07 16:53:23 -0700404
405 virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer,
John Reck1a61da52016-04-28 13:18:15 -0700406 sp<Fence>* outFence, float outTransformMatrix[16]) override {
Dan Stoza50101d02016-04-07 16:53:23 -0700407 Parcel data, reply;
408 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
409 status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER, data,
410 &reply);
411 if (result != NO_ERROR) {
412 ALOGE("getLastQueuedBuffer failed to transact: %d", result);
413 return result;
414 }
415 result = reply.readInt32();
416 if (result != NO_ERROR) {
417 return result;
418 }
John Reckce8e5df2016-04-28 10:12:47 -0700419 bool hasBuffer = reply.readBool();
420 sp<GraphicBuffer> buffer;
421 if (hasBuffer) {
422 buffer = new GraphicBuffer();
423 result = reply.read(*buffer);
John Reck1a61da52016-04-28 13:18:15 -0700424 if (result == NO_ERROR) {
425 result = reply.read(outTransformMatrix, sizeof(float) * 16);
426 }
John Reckce8e5df2016-04-28 10:12:47 -0700427 }
Dan Stoza50101d02016-04-07 16:53:23 -0700428 if (result != NO_ERROR) {
429 ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
430 return result;
431 }
432 sp<Fence> fence(new Fence);
433 result = reply.read(*fence);
434 if (result != NO_ERROR) {
435 ALOGE("getLastQueuedBuffer failed to read fence: %d", result);
436 return result;
437 }
438 *outBuffer = buffer;
439 *outFence = fence;
440 return result;
441 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800442
Brian Anderson3890c392016-07-25 12:48:08 -0700443 virtual void getFrameTimestamps(FrameEventHistoryDelta* outDelta) {
Pablo Ceballosce796e72016-02-04 19:10:51 -0800444 Parcel data, reply;
445 status_t result = data.writeInterfaceToken(
446 IGraphicBufferProducer::getInterfaceDescriptor());
447 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700448 ALOGE("IGBP::getFrameTimestamps failed to write token: %d", result);
449 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800450 }
451 result = remote()->transact(GET_FRAME_TIMESTAMPS, data, &reply);
452 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700453 ALOGE("IGBP::getFrameTimestamps failed to transact: %d", result);
454 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800455 }
Brian Anderson3890c392016-07-25 12:48:08 -0700456 result = reply.read(*outDelta);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800457 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700458 ALOGE("IGBP::getFrameTimestamps failed to read timestamps: %d",
459 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800460 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800461 }
Pablo Ceballos6155b402016-06-30 17:01:49 -0700462
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -0700463 virtual status_t getUniqueId(uint64_t* outId) const {
464 Parcel data, reply;
465 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
466 status_t result = remote()->transact(GET_UNIQUE_ID, data, &reply);
467 if (result != NO_ERROR) {
468 ALOGE("getUniqueId failed to transact: %d", result);
469 }
470 status_t actualResult = NO_ERROR;
471 result = reply.readInt32(&actualResult);
472 if (result != NO_ERROR) {
473 return result;
474 }
475 result = reply.readUint64(outId);
476 if (result != NO_ERROR) {
477 return result;
478 }
479 return actualResult;
480 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800481};
482
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800483// Out-of-line virtual method definition to trigger vtable emission in this
484// translation unit (see clang warning -Wweak-vtables)
485BpGraphicBufferProducer::~BpGraphicBufferProducer() {}
486
Andy McFadden466a1922013-01-08 11:25:51 -0800487IMPLEMENT_META_INTERFACE(GraphicBufferProducer, "android.gui.IGraphicBufferProducer");
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800488
489// ----------------------------------------------------------------------
490
Andy McFadden2adaf042012-12-18 09:49:45 -0800491status_t BnGraphicBufferProducer::onTransact(
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800492 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
493{
494 switch(code) {
495 case REQUEST_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800496 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800497 int bufferIdx = data.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700498 sp<GraphicBuffer> buffer;
499 int result = requestBuffer(bufferIdx, &buffer);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800500 reply->writeInt32(buffer != 0);
501 if (buffer != 0) {
502 reply->write(*buffer);
503 }
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700504 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800505 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800506 }
Pablo Ceballosfa455352015-08-12 17:47:47 -0700507 case SET_MAX_DEQUEUED_BUFFER_COUNT: {
508 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
509 int maxDequeuedBuffers = data.readInt32();
510 int result = setMaxDequeuedBufferCount(maxDequeuedBuffers);
511 reply->writeInt32(result);
512 return NO_ERROR;
513 }
514 case SET_ASYNC_MODE: {
515 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
516 bool async = data.readInt32();
517 int result = setAsyncMode(async);
518 reply->writeInt32(result);
519 return NO_ERROR;
520 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800521 case DEQUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800522 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800523 uint32_t width = data.readUint32();
524 uint32_t height = data.readUint32();
525 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
526 uint32_t usage = data.readUint32();
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700527 bool getTimestamps = data.readBool();
Brian Andersonbaaad322016-07-22 15:55:13 -0700528
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700529 int buf = 0;
Brian Andersonbaaad322016-07-22 15:55:13 -0700530 sp<Fence> fence = Fence::NO_FENCE;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700531 FrameEventHistoryDelta frameTimestamps;
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700532 int result = dequeueBuffer(&buf, &fence, width, height, format,
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700533 usage, getTimestamps ? &frameTimestamps : nullptr);
Brian Andersonbaaad322016-07-22 15:55:13 -0700534
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800535 reply->writeInt32(buf);
Brian Andersonbaaad322016-07-22 15:55:13 -0700536 reply->write(*fence);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700537 if (getTimestamps) {
538 reply->write(frameTimestamps);
539 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800540 reply->writeInt32(result);
541 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800542 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800543 case DETACH_BUFFER: {
544 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
545 int slot = data.readInt32();
546 int result = detachBuffer(slot);
547 reply->writeInt32(result);
548 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800549 }
Dan Stozad9822a32014-03-28 15:25:31 -0700550 case DETACH_NEXT_BUFFER: {
551 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
552 sp<GraphicBuffer> buffer;
553 sp<Fence> fence;
554 int32_t result = detachNextBuffer(&buffer, &fence);
555 reply->writeInt32(result);
556 if (result == NO_ERROR) {
557 reply->writeInt32(buffer != NULL);
558 if (buffer != NULL) {
559 reply->write(*buffer);
560 }
561 reply->writeInt32(fence != NULL);
562 if (fence != NULL) {
563 reply->write(*fence);
564 }
565 }
566 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800567 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800568 case ATTACH_BUFFER: {
569 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
570 sp<GraphicBuffer> buffer = new GraphicBuffer();
Pablo Ceballos70636b32016-07-06 15:24:54 -0700571 status_t result = data.read(*buffer.get());
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700572 int slot = 0;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700573 if (result == NO_ERROR) {
574 result = attachBuffer(&slot, buffer);
575 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800576 reply->writeInt32(slot);
577 reply->writeInt32(result);
578 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800579 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800580 case QUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800581 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700582
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800583 int buf = data.readInt32();
Jesse Hallc777b0b2012-06-28 12:52:05 -0700584 QueueBufferInput input(data);
Brian Andersonbaaad322016-07-22 15:55:13 -0700585 QueueBufferOutput output;
586 status_t result = queueBuffer(buf, input, &output);
Brian Andersonbaaad322016-07-22 15:55:13 -0700587 reply->write(output);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800588 reply->writeInt32(result);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700589
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800590 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800591 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800592 case CANCEL_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800593 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800594 int buf = data.readInt32();
Jamie Gennis1df8c342012-12-20 14:05:45 -0800595 sp<Fence> fence = new Fence();
Pablo Ceballos70636b32016-07-06 15:24:54 -0700596 status_t result = data.read(*fence.get());
597 if (result == NO_ERROR) {
598 result = cancelBuffer(buf, fence);
599 }
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700600 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800601 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800602 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700603 case QUERY: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800604 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700605 int value = 0;
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700606 int what = data.readInt32();
607 int res = query(what, &value);
608 reply->writeInt32(value);
609 reply->writeInt32(res);
610 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800611 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700612 case CONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800613 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stozaf0eaf252014-03-21 13:05:51 -0700614 sp<IProducerListener> listener;
615 if (data.readInt32() == 1) {
616 listener = IProducerListener::asInterface(data.readStrongBinder());
617 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700618 int api = data.readInt32();
Mathias Agopian595264f2013-07-16 22:56:09 -0700619 bool producerControlledByApp = data.readInt32();
Brian Andersonbaaad322016-07-22 15:55:13 -0700620 QueueBufferOutput output;
621 status_t res = connect(listener, api, producerControlledByApp, &output);
622 reply->write(output);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700623 reply->writeInt32(res);
624 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800625 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700626 case DISCONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800627 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700628 int api = data.readInt32();
Robert Carr97b9c862016-09-08 13:54:35 -0700629 DisconnectMode mode = static_cast<DisconnectMode>(data.readInt32());
630 status_t res = disconnect(api, mode);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700631 reply->writeInt32(res);
632 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800633 }
Jesse Hall399184a2014-03-03 15:42:54 -0800634 case SET_SIDEBAND_STREAM: {
635 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
636 sp<NativeHandle> stream;
637 if (data.readInt32()) {
Wonsik Kim0ec54e12014-03-21 10:46:24 +0900638 stream = NativeHandle::create(data.readNativeHandle(), true);
Jesse Hall399184a2014-03-03 15:42:54 -0800639 }
640 status_t result = setSidebandStream(stream);
641 reply->writeInt32(result);
642 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800643 }
Dan Stoza9de72932015-04-16 17:28:43 -0700644 case ALLOCATE_BUFFERS: {
Dan Stoza29a3e902014-06-20 13:13:57 -0700645 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800646 uint32_t width = data.readUint32();
647 uint32_t height = data.readUint32();
648 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
649 uint32_t usage = data.readUint32();
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700650 allocateBuffers(width, height, format, usage);
Dan Stoza29a3e902014-06-20 13:13:57 -0700651 return NO_ERROR;
Dan Stoza9de72932015-04-16 17:28:43 -0700652 }
653 case ALLOW_ALLOCATION: {
654 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
655 bool allow = static_cast<bool>(data.readInt32());
656 status_t result = allowAllocation(allow);
657 reply->writeInt32(result);
658 return NO_ERROR;
659 }
Dan Stoza812ed062015-06-02 15:45:22 -0700660 case SET_GENERATION_NUMBER: {
661 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
662 uint32_t generationNumber = data.readUint32();
663 status_t result = setGenerationNumber(generationNumber);
664 reply->writeInt32(result);
665 return NO_ERROR;
666 }
Dan Stozac6f30bd2015-06-08 09:32:50 -0700667 case GET_CONSUMER_NAME: {
668 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
669 reply->writeString8(getConsumerName());
670 return NO_ERROR;
671 }
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700672 case SET_SHARED_BUFFER_MODE: {
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700673 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700674 bool sharedBufferMode = data.readInt32();
675 status_t result = setSharedBufferMode(sharedBufferMode);
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700676 reply->writeInt32(result);
677 return NO_ERROR;
678 }
Pablo Ceballosff95aab2016-01-13 17:09:58 -0800679 case SET_AUTO_REFRESH: {
680 CHECK_INTERFACE(IGraphicBuffer, data, reply);
681 bool autoRefresh = data.readInt32();
682 status_t result = setAutoRefresh(autoRefresh);
683 reply->writeInt32(result);
684 return NO_ERROR;
685 }
Dan Stoza127fc632015-06-30 13:43:32 -0700686 case SET_DEQUEUE_TIMEOUT: {
687 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
688 nsecs_t timeout = data.readInt64();
689 status_t result = setDequeueTimeout(timeout);
690 reply->writeInt32(result);
691 return NO_ERROR;
692 }
Dan Stoza50101d02016-04-07 16:53:23 -0700693 case GET_LAST_QUEUED_BUFFER: {
694 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
695 sp<GraphicBuffer> buffer(nullptr);
696 sp<Fence> fence(Fence::NO_FENCE);
John Reck1a61da52016-04-28 13:18:15 -0700697 float transform[16] = {};
698 status_t result = getLastQueuedBuffer(&buffer, &fence, transform);
Dan Stoza50101d02016-04-07 16:53:23 -0700699 reply->writeInt32(result);
700 if (result != NO_ERROR) {
701 return result;
702 }
John Reckce8e5df2016-04-28 10:12:47 -0700703 if (!buffer.get()) {
704 reply->writeBool(false);
705 } else {
706 reply->writeBool(true);
707 result = reply->write(*buffer);
John Reck1a61da52016-04-28 13:18:15 -0700708 if (result == NO_ERROR) {
709 reply->write(transform, sizeof(float) * 16);
710 }
John Reckce8e5df2016-04-28 10:12:47 -0700711 }
Dan Stoza50101d02016-04-07 16:53:23 -0700712 if (result != NO_ERROR) {
713 ALOGE("getLastQueuedBuffer failed to write buffer: %d", result);
714 return result;
715 }
716 result = reply->write(*fence);
717 if (result != NO_ERROR) {
718 ALOGE("getLastQueuedBuffer failed to write fence: %d", result);
719 return result;
720 }
721 return NO_ERROR;
722 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800723 case GET_FRAME_TIMESTAMPS: {
724 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson3890c392016-07-25 12:48:08 -0700725 FrameEventHistoryDelta frameTimestamps;
726 getFrameTimestamps(&frameTimestamps);
727 status_t result = reply->write(frameTimestamps);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800728 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700729 ALOGE("BnGBP::GET_FRAME_TIMESTAMPS failed to write buffer: %d",
730 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800731 return result;
732 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800733 return NO_ERROR;
734 }
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -0700735 case GET_UNIQUE_ID: {
736 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
737 uint64_t outId = 0;
738 status_t actualResult = getUniqueId(&outId);
739 status_t result = reply->writeInt32(actualResult);
740 if (result != NO_ERROR) {
741 return result;
742 }
743 result = reply->writeUint64(outId);
744 if (result != NO_ERROR) {
745 return result;
746 }
747 return NO_ERROR;
748 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800749 }
750 return BBinder::onTransact(code, data, reply, flags);
751}
752
753// ----------------------------------------------------------------------------
754
Andy McFadden2adaf042012-12-18 09:49:45 -0800755IGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) {
Jesse Hallc777b0b2012-06-28 12:52:05 -0700756 parcel.read(*this);
757}
758
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700759constexpr size_t IGraphicBufferProducer::QueueBufferInput::minFlattenedSize() {
760 return sizeof(timestamp) +
761 sizeof(isAutoTimestamp) +
762 sizeof(dataSpace) +
763 sizeof(crop) +
764 sizeof(scalingMode) +
765 sizeof(transform) +
766 sizeof(stickyTransform) +
767 sizeof(getFrameTimestamps);
768}
769
Mathias Agopiane1424282013-07-29 21:24:40 -0700770size_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const {
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700771 return minFlattenedSize() +
772 fence->getFlattenedSize() +
773 surfaceDamage.getFlattenedSize();
Jesse Hallc777b0b2012-06-28 12:52:05 -0700774}
775
Mathias Agopiane1424282013-07-29 21:24:40 -0700776size_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const {
Jamie Gennis1df8c342012-12-20 14:05:45 -0800777 return fence->getFdCount();
Jesse Hallc777b0b2012-06-28 12:52:05 -0700778}
779
Mathias Agopiane1424282013-07-29 21:24:40 -0700780status_t IGraphicBufferProducer::QueueBufferInput::flatten(
781 void*& buffer, size_t& size, int*& fds, size_t& count) const
Jesse Hallc777b0b2012-06-28 12:52:05 -0700782{
Mathias Agopiane1424282013-07-29 21:24:40 -0700783 if (size < getFlattenedSize()) {
784 return NO_MEMORY;
785 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700786
Mathias Agopiane1424282013-07-29 21:24:40 -0700787 FlattenableUtils::write(buffer, size, timestamp);
Andy McFadden3c256212013-08-16 14:55:39 -0700788 FlattenableUtils::write(buffer, size, isAutoTimestamp);
Eino-Ville Talvala82c6bcc2015-02-19 16:10:43 -0800789 FlattenableUtils::write(buffer, size, dataSpace);
Mathias Agopiane1424282013-07-29 21:24:40 -0700790 FlattenableUtils::write(buffer, size, crop);
791 FlattenableUtils::write(buffer, size, scalingMode);
792 FlattenableUtils::write(buffer, size, transform);
Ruben Brunk1681d952014-06-27 15:51:55 -0700793 FlattenableUtils::write(buffer, size, stickyTransform);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700794 FlattenableUtils::write(buffer, size, getFrameTimestamps);
795
Dan Stoza5065a552015-03-17 16:23:42 -0700796 status_t result = fence->flatten(buffer, size, fds, count);
797 if (result != NO_ERROR) {
798 return result;
799 }
800 return surfaceDamage.flatten(buffer, size);
Jesse Hallc777b0b2012-06-28 12:52:05 -0700801}
802
Mathias Agopiane1424282013-07-29 21:24:40 -0700803status_t IGraphicBufferProducer::QueueBufferInput::unflatten(
804 void const*& buffer, size_t& size, int const*& fds, size_t& count)
Jesse Hallc777b0b2012-06-28 12:52:05 -0700805{
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700806 if (size < minFlattenedSize()) {
Mathias Agopiane1424282013-07-29 21:24:40 -0700807 return NO_MEMORY;
808 }
809
810 FlattenableUtils::read(buffer, size, timestamp);
Andy McFadden3c256212013-08-16 14:55:39 -0700811 FlattenableUtils::read(buffer, size, isAutoTimestamp);
Eino-Ville Talvala82c6bcc2015-02-19 16:10:43 -0800812 FlattenableUtils::read(buffer, size, dataSpace);
Mathias Agopiane1424282013-07-29 21:24:40 -0700813 FlattenableUtils::read(buffer, size, crop);
814 FlattenableUtils::read(buffer, size, scalingMode);
815 FlattenableUtils::read(buffer, size, transform);
Ruben Brunk1681d952014-06-27 15:51:55 -0700816 FlattenableUtils::read(buffer, size, stickyTransform);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700817 FlattenableUtils::read(buffer, size, getFrameTimestamps);
Mathias Agopiane1424282013-07-29 21:24:40 -0700818
Jamie Gennis1df8c342012-12-20 14:05:45 -0800819 fence = new Fence();
Dan Stoza5065a552015-03-17 16:23:42 -0700820 status_t result = fence->unflatten(buffer, size, fds, count);
821 if (result != NO_ERROR) {
822 return result;
823 }
824 return surfaceDamage.unflatten(buffer, size);
Jesse Hallc777b0b2012-06-28 12:52:05 -0700825}
826
Brian Andersonbaaad322016-07-22 15:55:13 -0700827// ----------------------------------------------------------------------------
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700828constexpr size_t IGraphicBufferProducer::QueueBufferOutput::minFlattenedSize() {
829 return sizeof(width) +
830 sizeof(height) +
831 sizeof(transformHint) +
832 sizeof(numPendingBuffers) +
833 sizeof(nextFrameNumber);
834}
Brian Andersonbaaad322016-07-22 15:55:13 -0700835
836size_t IGraphicBufferProducer::QueueBufferOutput::getFlattenedSize() const {
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700837 return minFlattenedSize() + frameTimestamps.getFlattenedSize();
Brian Andersonbaaad322016-07-22 15:55:13 -0700838}
839
840size_t IGraphicBufferProducer::QueueBufferOutput::getFdCount() const {
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700841 return frameTimestamps.getFdCount();
Brian Andersonbaaad322016-07-22 15:55:13 -0700842}
843
844status_t IGraphicBufferProducer::QueueBufferOutput::flatten(
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700845 void*& buffer, size_t& size, int*& fds, size_t& count) const
Brian Andersonbaaad322016-07-22 15:55:13 -0700846{
847 if (size < getFlattenedSize()) {
848 return NO_MEMORY;
849 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700850
Brian Andersonbaaad322016-07-22 15:55:13 -0700851 FlattenableUtils::write(buffer, size, width);
852 FlattenableUtils::write(buffer, size, height);
853 FlattenableUtils::write(buffer, size, transformHint);
854 FlattenableUtils::write(buffer, size, numPendingBuffers);
855 FlattenableUtils::write(buffer, size, nextFrameNumber);
856
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700857 return frameTimestamps.flatten(buffer, size, fds, count);
Brian Andersonbaaad322016-07-22 15:55:13 -0700858}
859
860status_t IGraphicBufferProducer::QueueBufferOutput::unflatten(
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700861 void const*& buffer, size_t& size, int const*& fds, size_t& count)
Brian Andersonbaaad322016-07-22 15:55:13 -0700862{
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700863 if (size < minFlattenedSize()) {
Brian Andersonbaaad322016-07-22 15:55:13 -0700864 return NO_MEMORY;
865 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700866
Brian Andersonbaaad322016-07-22 15:55:13 -0700867 FlattenableUtils::read(buffer, size, width);
868 FlattenableUtils::read(buffer, size, height);
869 FlattenableUtils::read(buffer, size, transformHint);
870 FlattenableUtils::read(buffer, size, numPendingBuffers);
871 FlattenableUtils::read(buffer, size, nextFrameNumber);
872
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700873 return frameTimestamps.unflatten(buffer, size, fds, count);
Brian Andersonbaaad322016-07-22 15:55:13 -0700874}
875
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800876}; // namespace android