blob: 1a08130c447b97df513ee66c3ab9807cb6ae1d4f [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
Chia-I Wuc79a2962017-05-15 10:32:27 -070029#include <gui/BufferQueueDefs.h>
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
33namespace android {
34// ----------------------------------------------------------------------------
35
36enum {
37 REQUEST_BUFFER = IBinder::FIRST_CALL_TRANSACTION,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080038 DEQUEUE_BUFFER,
Dan Stoza9f3053d2014-03-06 15:14:33 -080039 DETACH_BUFFER,
Dan Stozad9822a32014-03-28 15:25:31 -070040 DETACH_NEXT_BUFFER,
Dan Stoza9f3053d2014-03-06 15:14:33 -080041 ATTACH_BUFFER,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080042 QUEUE_BUFFER,
43 CANCEL_BUFFER,
Mathias Agopianeafabcd2011-04-20 14:20:59 -070044 QUERY,
Jamie Gennisfe0a87b2011-07-13 19:12:20 -070045 CONNECT,
46 DISCONNECT,
Jesse Hall399184a2014-03-03 15:42:54 -080047 SET_SIDEBAND_STREAM,
Dan Stoza29a3e902014-06-20 13:13:57 -070048 ALLOCATE_BUFFERS,
Dan Stoza9de72932015-04-16 17:28:43 -070049 ALLOW_ALLOCATION,
Dan Stoza812ed062015-06-02 15:45:22 -070050 SET_GENERATION_NUMBER,
Dan Stozac6f30bd2015-06-08 09:32:50 -070051 GET_CONSUMER_NAME,
Pablo Ceballosfa455352015-08-12 17:47:47 -070052 SET_MAX_DEQUEUED_BUFFER_COUNT,
Dan Stoza7dde5992015-05-22 09:51:44 -070053 SET_ASYNC_MODE,
Pablo Ceballos3559fbf2016-03-17 15:50:23 -070054 SET_SHARED_BUFFER_MODE,
Pablo Ceballosff95aab2016-01-13 17:09:58 -080055 SET_AUTO_REFRESH,
Dan Stoza127fc632015-06-30 13:43:32 -070056 SET_DEQUEUE_TIMEOUT,
Dan Stoza50101d02016-04-07 16:53:23 -070057 GET_LAST_QUEUED_BUFFER,
Pablo Ceballos0ade2472016-06-30 16:48:02 -070058 GET_FRAME_TIMESTAMPS,
59 GET_UNIQUE_ID
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080060};
61
Andy McFadden2adaf042012-12-18 09:49:45 -080062class BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080063{
64public:
Andy McFadden2adaf042012-12-18 09:49:45 -080065 BpGraphicBufferProducer(const sp<IBinder>& impl)
66 : BpInterface<IGraphicBufferProducer>(impl)
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080067 {
68 }
69
Dan Stoza3be1c6b2014-11-18 10:24:03 -080070 virtual ~BpGraphicBufferProducer();
71
Jamie Gennis7b305ff2011-07-19 12:08:33 -070072 virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080073 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -080074 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080075 data.writeInt32(bufferIdx);
Jamie Gennis8a29ff22011-10-14 15:03:17 -070076 status_t result =remote()->transact(REQUEST_BUFFER, data, &reply);
77 if (result != NO_ERROR) {
78 return result;
79 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080080 bool nonNull = reply.readInt32();
81 if (nonNull) {
Jamie Gennis7b305ff2011-07-19 12:08:33 -070082 *buf = new GraphicBuffer();
Lingyun Zhu2aff7022012-11-20 19:24:35 +080083 result = reply.read(**buf);
84 if(result != NO_ERROR) {
85 (*buf).clear();
86 return result;
87 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080088 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -070089 result = reply.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -070090 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080091 }
92
Pablo Ceballosfa455352015-08-12 17:47:47 -070093 virtual status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) {
94 Parcel data, reply;
95 data.writeInterfaceToken(
96 IGraphicBufferProducer::getInterfaceDescriptor());
97 data.writeInt32(maxDequeuedBuffers);
98 status_t result = remote()->transact(SET_MAX_DEQUEUED_BUFFER_COUNT,
99 data, &reply);
100 if (result != NO_ERROR) {
101 return result;
102 }
103 result = reply.readInt32();
104 return result;
105 }
106
107 virtual status_t setAsyncMode(bool async) {
108 Parcel data, reply;
109 data.writeInterfaceToken(
110 IGraphicBufferProducer::getInterfaceDescriptor());
111 data.writeInt32(async);
112 status_t result = remote()->transact(SET_ASYNC_MODE,
113 data, &reply);
114 if (result != NO_ERROR) {
115 return result;
116 }
117 result = reply.readInt32();
118 return result;
119 }
120
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700121 virtual status_t dequeueBuffer(int *buf, sp<Fence>* fence, uint32_t width,
122 uint32_t height, PixelFormat format, uint32_t usage) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800123 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800124 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800125 data.writeUint32(width);
126 data.writeUint32(height);
127 data.writeInt32(static_cast<int32_t>(format));
128 data.writeUint32(usage);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700129 status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply);
130 if (result != NO_ERROR) {
131 return result;
132 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800133 *buf = reply.readInt32();
Mathias Agopianba93b3f2013-08-01 15:48:40 -0700134 bool nonNull = reply.readInt32();
135 if (nonNull) {
Jesse Hall4c00cc12013-03-15 21:34:30 -0700136 *fence = new Fence();
Pablo Ceballos70636b32016-07-06 15:24:54 -0700137 result = reply.read(**fence);
138 if (result != NO_ERROR) {
139 fence->clear();
140 return result;
141 }
Jesse Hallf7857542012-06-14 15:26:33 -0700142 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700143 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800144 return result;
145 }
146
Dan Stoza9f3053d2014-03-06 15:14:33 -0800147 virtual status_t detachBuffer(int slot) {
148 Parcel data, reply;
149 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
150 data.writeInt32(slot);
151 status_t result = remote()->transact(DETACH_BUFFER, data, &reply);
152 if (result != NO_ERROR) {
153 return result;
154 }
155 result = reply.readInt32();
156 return result;
157 }
158
Dan Stozad9822a32014-03-28 15:25:31 -0700159 virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer,
160 sp<Fence>* outFence) {
161 if (outBuffer == NULL) {
162 ALOGE("detachNextBuffer: outBuffer must not be NULL");
163 return BAD_VALUE;
164 } else if (outFence == NULL) {
165 ALOGE("detachNextBuffer: outFence must not be NULL");
166 return BAD_VALUE;
167 }
168 Parcel data, reply;
169 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
170 status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply);
171 if (result != NO_ERROR) {
172 return result;
173 }
174 result = reply.readInt32();
175 if (result == NO_ERROR) {
176 bool nonNull = reply.readInt32();
177 if (nonNull) {
178 *outBuffer = new GraphicBuffer;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700179 result = reply.read(**outBuffer);
180 if (result != NO_ERROR) {
181 outBuffer->clear();
182 return result;
183 }
Dan Stozad9822a32014-03-28 15:25:31 -0700184 }
185 nonNull = reply.readInt32();
186 if (nonNull) {
187 *outFence = new Fence;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700188 result = reply.read(**outFence);
189 if (result != NO_ERROR) {
190 outBuffer->clear();
191 outFence->clear();
192 return result;
193 }
Dan Stozad9822a32014-03-28 15:25:31 -0700194 }
195 }
196 return result;
197 }
198
Dan Stoza9f3053d2014-03-06 15:14:33 -0800199 virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) {
200 Parcel data, reply;
201 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
202 data.write(*buffer.get());
203 status_t result = remote()->transact(ATTACH_BUFFER, data, &reply);
204 if (result != NO_ERROR) {
205 return result;
206 }
Chia-I Wuc79a2962017-05-15 10:32:27 -0700207
Dan Stoza9f3053d2014-03-06 15:14:33 -0800208 *slot = reply.readInt32();
209 result = reply.readInt32();
Chia-I Wuc79a2962017-05-15 10:32:27 -0700210 if (result == NO_ERROR &&
211 (*slot < 0 || *slot >= BufferQueueDefs::NUM_BUFFER_SLOTS)) {
212 ALOGE("attachBuffer returned invalid slot %d", *slot);
213 android_errorWriteLog(0x534e4554, "37478824");
214 return UNKNOWN_ERROR;
215 }
216
Dan Stoza9f3053d2014-03-06 15:14:33 -0800217 return result;
218 }
219
Mathias Agopianf0bc2f12012-04-09 16:14:01 -0700220 virtual status_t queueBuffer(int buf,
221 const QueueBufferInput& input, QueueBufferOutput* output) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800222 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800223 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800224 data.writeInt32(buf);
Jesse Hallc777b0b2012-06-28 12:52:05 -0700225 data.write(input);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700226 status_t result = remote()->transact(QUEUE_BUFFER, data, &reply);
227 if (result != NO_ERROR) {
228 return result;
229 }
Mathias Agopianf0bc2f12012-04-09 16:14:01 -0700230 memcpy(output, reply.readInplace(sizeof(*output)), sizeof(*output));
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700231 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800232 return result;
233 }
234
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700235 virtual status_t cancelBuffer(int buf, const sp<Fence>& fence) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800236 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800237 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800238 data.writeInt32(buf);
Jamie Gennis1df8c342012-12-20 14:05:45 -0800239 data.write(*fence.get());
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700240 status_t result = remote()->transact(CANCEL_BUFFER, data, &reply);
241 if (result != NO_ERROR) {
242 return result;
243 }
244 result = reply.readInt32();
245 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800246 }
247
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700248 virtual int query(int what, int* value) {
249 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800250 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700251 data.writeInt32(what);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700252 status_t result = remote()->transact(QUERY, data, &reply);
253 if (result != NO_ERROR) {
254 return result;
255 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700256 value[0] = reply.readInt32();
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700257 result = reply.readInt32();
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700258 return result;
259 }
260
Dan Stozaf0eaf252014-03-21 13:05:51 -0700261 virtual status_t connect(const sp<IProducerListener>& listener,
Mathias Agopian365857d2013-09-11 19:35:45 -0700262 int api, bool producerControlledByApp, QueueBufferOutput* output) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700263 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800264 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stozaf0eaf252014-03-21 13:05:51 -0700265 if (listener != NULL) {
266 data.writeInt32(1);
Marco Nelissen097ca272014-11-14 08:01:01 -0800267 data.writeStrongBinder(IInterface::asBinder(listener));
Dan Stozaf0eaf252014-03-21 13:05:51 -0700268 } else {
269 data.writeInt32(0);
270 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700271 data.writeInt32(api);
Mathias Agopian595264f2013-07-16 22:56:09 -0700272 data.writeInt32(producerControlledByApp);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700273 status_t result = remote()->transact(CONNECT, data, &reply);
274 if (result != NO_ERROR) {
275 return result;
276 }
Mathias Agopian24202f52012-04-23 14:28:58 -0700277 memcpy(output, reply.readInplace(sizeof(*output)), sizeof(*output));
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700278 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700279 return result;
280 }
Mathias Agopian80727112011-05-02 19:51:12 -0700281
Robert Carr97b9c862016-09-08 13:54:35 -0700282 virtual status_t disconnect(int api, DisconnectMode mode) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700283 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800284 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700285 data.writeInt32(api);
Robert Carr97b9c862016-09-08 13:54:35 -0700286 data.writeInt32(static_cast<int32_t>(mode));
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700287 status_t result =remote()->transact(DISCONNECT, data, &reply);
288 if (result != NO_ERROR) {
289 return result;
290 }
291 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700292 return result;
293 }
Jesse Hall399184a2014-03-03 15:42:54 -0800294
295 virtual status_t setSidebandStream(const sp<NativeHandle>& stream) {
296 Parcel data, reply;
297 status_t result;
298 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
299 if (stream.get()) {
300 data.writeInt32(true);
301 data.writeNativeHandle(stream->handle());
302 } else {
303 data.writeInt32(false);
304 }
305 if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) {
306 result = reply.readInt32();
307 }
308 return result;
309 }
Dan Stoza29a3e902014-06-20 13:13:57 -0700310
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700311 virtual void allocateBuffers(uint32_t width, uint32_t height,
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800312 PixelFormat format, uint32_t usage) {
Dan Stoza29a3e902014-06-20 13:13:57 -0700313 Parcel data, reply;
314 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800315 data.writeUint32(width);
316 data.writeUint32(height);
Dan Stoza29a3e902014-06-20 13:13:57 -0700317 data.writeInt32(static_cast<int32_t>(format));
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800318 data.writeUint32(usage);
Dan Stoza29a3e902014-06-20 13:13:57 -0700319 status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply);
320 if (result != NO_ERROR) {
321 ALOGE("allocateBuffers failed to transact: %d", result);
322 }
323 }
Dan Stoza9de72932015-04-16 17:28:43 -0700324
325 virtual status_t allowAllocation(bool allow) {
326 Parcel data, reply;
327 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
328 data.writeInt32(static_cast<int32_t>(allow));
329 status_t result = remote()->transact(ALLOW_ALLOCATION, data, &reply);
330 if (result != NO_ERROR) {
331 return result;
332 }
333 result = reply.readInt32();
334 return result;
335 }
Dan Stoza812ed062015-06-02 15:45:22 -0700336
337 virtual status_t setGenerationNumber(uint32_t generationNumber) {
338 Parcel data, reply;
339 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
340 data.writeUint32(generationNumber);
341 status_t result = remote()->transact(SET_GENERATION_NUMBER, data, &reply);
342 if (result == NO_ERROR) {
343 result = reply.readInt32();
344 }
345 return result;
346 }
Dan Stozac6f30bd2015-06-08 09:32:50 -0700347
348 virtual String8 getConsumerName() const {
349 Parcel data, reply;
350 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
351 status_t result = remote()->transact(GET_CONSUMER_NAME, data, &reply);
352 if (result != NO_ERROR) {
353 ALOGE("getConsumerName failed to transact: %d", result);
354 return String8("TransactFailed");
355 }
356 return reply.readString8();
357 }
Dan Stoza7dde5992015-05-22 09:51:44 -0700358
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700359 virtual status_t setSharedBufferMode(bool sharedBufferMode) {
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700360 Parcel data, reply;
361 data.writeInterfaceToken(
362 IGraphicBufferProducer::getInterfaceDescriptor());
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700363 data.writeInt32(sharedBufferMode);
364 status_t result = remote()->transact(SET_SHARED_BUFFER_MODE, data,
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700365 &reply);
366 if (result == NO_ERROR) {
367 result = reply.readInt32();
368 }
369 return result;
370 }
Dan Stoza127fc632015-06-30 13:43:32 -0700371
Pablo Ceballosff95aab2016-01-13 17:09:58 -0800372 virtual status_t setAutoRefresh(bool autoRefresh) {
373 Parcel data, reply;
374 data.writeInterfaceToken(
375 IGraphicBufferProducer::getInterfaceDescriptor());
376 data.writeInt32(autoRefresh);
377 status_t result = remote()->transact(SET_AUTO_REFRESH, data, &reply);
378 if (result == NO_ERROR) {
379 result = reply.readInt32();
380 }
381 return result;
382 }
383
Dan Stoza127fc632015-06-30 13:43:32 -0700384 virtual status_t setDequeueTimeout(nsecs_t timeout) {
385 Parcel data, reply;
386 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
387 data.writeInt64(timeout);
388 status_t result = remote()->transact(SET_DEQUEUE_TIMEOUT, data, &reply);
389 if (result != NO_ERROR) {
390 ALOGE("setDequeueTimeout failed to transact: %d", result);
391 return result;
392 }
393 return reply.readInt32();
394 }
Dan Stoza50101d02016-04-07 16:53:23 -0700395
396 virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer,
John Reck1a61da52016-04-28 13:18:15 -0700397 sp<Fence>* outFence, float outTransformMatrix[16]) override {
Dan Stoza50101d02016-04-07 16:53:23 -0700398 Parcel data, reply;
399 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
400 status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER, data,
401 &reply);
402 if (result != NO_ERROR) {
403 ALOGE("getLastQueuedBuffer failed to transact: %d", result);
404 return result;
405 }
406 result = reply.readInt32();
407 if (result != NO_ERROR) {
408 return result;
409 }
John Reckce8e5df2016-04-28 10:12:47 -0700410 bool hasBuffer = reply.readBool();
411 sp<GraphicBuffer> buffer;
412 if (hasBuffer) {
413 buffer = new GraphicBuffer();
414 result = reply.read(*buffer);
John Reck1a61da52016-04-28 13:18:15 -0700415 if (result == NO_ERROR) {
416 result = reply.read(outTransformMatrix, sizeof(float) * 16);
417 }
John Reckce8e5df2016-04-28 10:12:47 -0700418 }
Dan Stoza50101d02016-04-07 16:53:23 -0700419 if (result != NO_ERROR) {
420 ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
421 return result;
422 }
423 sp<Fence> fence(new Fence);
424 result = reply.read(*fence);
425 if (result != NO_ERROR) {
426 ALOGE("getLastQueuedBuffer failed to read fence: %d", result);
427 return result;
428 }
429 *outBuffer = buffer;
430 *outFence = fence;
431 return result;
432 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800433
434 virtual bool getFrameTimestamps(uint64_t frameNumber,
435 FrameTimestamps* outTimestamps) const {
436 Parcel data, reply;
437 status_t result = data.writeInterfaceToken(
438 IGraphicBufferProducer::getInterfaceDescriptor());
439 if (result != NO_ERROR) {
440 ALOGE("getFrameTimestamps failed to write token: %d", result);
441 return false;
442 }
443 result = data.writeUint64(frameNumber);
444 if (result != NO_ERROR) {
445 ALOGE("getFrameTimestamps failed to write: %d", result);
446 return false;
447 }
448 result = remote()->transact(GET_FRAME_TIMESTAMPS, data, &reply);
449 if (result != NO_ERROR) {
450 ALOGE("getFrameTimestamps failed to transact: %d", result);
451 return false;
452 }
453 bool found = false;
454 result = reply.readBool(&found);
455 if (result != NO_ERROR) {
456 ALOGE("getFrameTimestamps failed to read: %d", result);
457 return false;
458 }
459 if (found) {
460 result = reply.read(*outTimestamps);
461 if (result != NO_ERROR) {
462 ALOGE("getFrameTimestamps failed to read timestamps: %d",
463 result);
464 return false;
465 }
466 }
467 return found;
468 }
Pablo Ceballos0ade2472016-06-30 16:48:02 -0700469
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -0700470 virtual status_t getUniqueId(uint64_t* outId) const {
471 Parcel data, reply;
472 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
473 status_t result = remote()->transact(GET_UNIQUE_ID, data, &reply);
474 if (result != NO_ERROR) {
475 ALOGE("getUniqueId failed to transact: %d", result);
476 }
477 status_t actualResult = NO_ERROR;
478 result = reply.readInt32(&actualResult);
479 if (result != NO_ERROR) {
480 return result;
481 }
482 result = reply.readUint64(outId);
483 if (result != NO_ERROR) {
484 return result;
485 }
486 return actualResult;
487 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800488};
489
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800490// Out-of-line virtual method definition to trigger vtable emission in this
491// translation unit (see clang warning -Wweak-vtables)
492BpGraphicBufferProducer::~BpGraphicBufferProducer() {}
493
Andy McFadden466a1922013-01-08 11:25:51 -0800494IMPLEMENT_META_INTERFACE(GraphicBufferProducer, "android.gui.IGraphicBufferProducer");
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800495
496// ----------------------------------------------------------------------
497
Andy McFadden2adaf042012-12-18 09:49:45 -0800498status_t BnGraphicBufferProducer::onTransact(
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800499 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
500{
501 switch(code) {
502 case REQUEST_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800503 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800504 int bufferIdx = data.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700505 sp<GraphicBuffer> buffer;
506 int result = requestBuffer(bufferIdx, &buffer);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800507 reply->writeInt32(buffer != 0);
508 if (buffer != 0) {
509 reply->write(*buffer);
510 }
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700511 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800512 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800513 }
Pablo Ceballosfa455352015-08-12 17:47:47 -0700514 case SET_MAX_DEQUEUED_BUFFER_COUNT: {
515 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
516 int maxDequeuedBuffers = data.readInt32();
517 int result = setMaxDequeuedBufferCount(maxDequeuedBuffers);
518 reply->writeInt32(result);
519 return NO_ERROR;
520 }
521 case SET_ASYNC_MODE: {
522 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
523 bool async = data.readInt32();
524 int result = setAsyncMode(async);
525 reply->writeInt32(result);
526 return NO_ERROR;
527 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800528 case DEQUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800529 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800530 uint32_t width = data.readUint32();
531 uint32_t height = data.readUint32();
532 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
533 uint32_t usage = data.readUint32();
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700534 int buf = 0;
Jesse Hallf7857542012-06-14 15:26:33 -0700535 sp<Fence> fence;
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700536 int result = dequeueBuffer(&buf, &fence, width, height, format,
537 usage);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800538 reply->writeInt32(buf);
Jamie Gennis1df8c342012-12-20 14:05:45 -0800539 reply->writeInt32(fence != NULL);
540 if (fence != NULL) {
Mathias Agopianba93b3f2013-08-01 15:48:40 -0700541 reply->write(*fence);
Jesse Hallf7857542012-06-14 15:26:33 -0700542 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800543 reply->writeInt32(result);
544 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800545 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800546 case DETACH_BUFFER: {
547 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
548 int slot = data.readInt32();
549 int result = detachBuffer(slot);
550 reply->writeInt32(result);
551 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800552 }
Dan Stozad9822a32014-03-28 15:25:31 -0700553 case DETACH_NEXT_BUFFER: {
554 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
555 sp<GraphicBuffer> buffer;
556 sp<Fence> fence;
557 int32_t result = detachNextBuffer(&buffer, &fence);
558 reply->writeInt32(result);
559 if (result == NO_ERROR) {
560 reply->writeInt32(buffer != NULL);
561 if (buffer != NULL) {
562 reply->write(*buffer);
563 }
564 reply->writeInt32(fence != NULL);
565 if (fence != NULL) {
566 reply->write(*fence);
567 }
568 }
569 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800570 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800571 case ATTACH_BUFFER: {
572 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
573 sp<GraphicBuffer> buffer = new GraphicBuffer();
Pablo Ceballos70636b32016-07-06 15:24:54 -0700574 status_t result = data.read(*buffer.get());
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700575 int slot = 0;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700576 if (result == NO_ERROR) {
577 result = attachBuffer(&slot, buffer);
578 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800579 reply->writeInt32(slot);
580 reply->writeInt32(result);
581 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800582 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800583 case QUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800584 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800585 int buf = data.readInt32();
Jesse Hallc777b0b2012-06-28 12:52:05 -0700586 QueueBufferInput input(data);
Mathias Agopianf0bc2f12012-04-09 16:14:01 -0700587 QueueBufferOutput* const output =
588 reinterpret_cast<QueueBufferOutput *>(
589 reply->writeInplace(sizeof(QueueBufferOutput)));
Robert Shihd06421f2016-01-11 15:02:12 -0800590 memset(output, 0, sizeof(QueueBufferOutput));
Jesse Hallc777b0b2012-06-28 12:52:05 -0700591 status_t result = queueBuffer(buf, input, output);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800592 reply->writeInt32(result);
593 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800594 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800595 case CANCEL_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800596 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800597 int buf = data.readInt32();
Jamie Gennis1df8c342012-12-20 14:05:45 -0800598 sp<Fence> fence = new Fence();
Pablo Ceballos70636b32016-07-06 15:24:54 -0700599 status_t result = data.read(*fence.get());
600 if (result == NO_ERROR) {
601 result = cancelBuffer(buf, fence);
602 }
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700603 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800604 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800605 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700606 case QUERY: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800607 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700608 int value = 0;
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700609 int what = data.readInt32();
610 int res = query(what, &value);
611 reply->writeInt32(value);
612 reply->writeInt32(res);
613 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800614 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700615 case CONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800616 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stozaf0eaf252014-03-21 13:05:51 -0700617 sp<IProducerListener> listener;
618 if (data.readInt32() == 1) {
619 listener = IProducerListener::asInterface(data.readStrongBinder());
620 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700621 int api = data.readInt32();
Mathias Agopian595264f2013-07-16 22:56:09 -0700622 bool producerControlledByApp = data.readInt32();
Mathias Agopian24202f52012-04-23 14:28:58 -0700623 QueueBufferOutput* const output =
624 reinterpret_cast<QueueBufferOutput *>(
625 reply->writeInplace(sizeof(QueueBufferOutput)));
Pablo Ceballos93c617f2016-03-15 18:10:49 -0700626 memset(output, 0, sizeof(QueueBufferOutput));
Dan Stozaf0eaf252014-03-21 13:05:51 -0700627 status_t res = connect(listener, api, producerControlledByApp, output);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700628 reply->writeInt32(res);
629 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800630 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700631 case DISCONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800632 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700633 int api = data.readInt32();
Robert Carr97b9c862016-09-08 13:54:35 -0700634 DisconnectMode mode = static_cast<DisconnectMode>(data.readInt32());
635 status_t res = disconnect(api, mode);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700636 reply->writeInt32(res);
637 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800638 }
Jesse Hall399184a2014-03-03 15:42:54 -0800639 case SET_SIDEBAND_STREAM: {
640 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
641 sp<NativeHandle> stream;
642 if (data.readInt32()) {
Wonsik Kim0ec54e12014-03-21 10:46:24 +0900643 stream = NativeHandle::create(data.readNativeHandle(), true);
Jesse Hall399184a2014-03-03 15:42:54 -0800644 }
645 status_t result = setSidebandStream(stream);
646 reply->writeInt32(result);
647 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800648 }
Dan Stoza9de72932015-04-16 17:28:43 -0700649 case ALLOCATE_BUFFERS: {
Dan Stoza29a3e902014-06-20 13:13:57 -0700650 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800651 uint32_t width = data.readUint32();
652 uint32_t height = data.readUint32();
653 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
654 uint32_t usage = data.readUint32();
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700655 allocateBuffers(width, height, format, usage);
Dan Stoza29a3e902014-06-20 13:13:57 -0700656 return NO_ERROR;
Dan Stoza9de72932015-04-16 17:28:43 -0700657 }
658 case ALLOW_ALLOCATION: {
659 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
660 bool allow = static_cast<bool>(data.readInt32());
661 status_t result = allowAllocation(allow);
662 reply->writeInt32(result);
663 return NO_ERROR;
664 }
Dan Stoza812ed062015-06-02 15:45:22 -0700665 case SET_GENERATION_NUMBER: {
666 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
667 uint32_t generationNumber = data.readUint32();
668 status_t result = setGenerationNumber(generationNumber);
669 reply->writeInt32(result);
670 return NO_ERROR;
671 }
Dan Stozac6f30bd2015-06-08 09:32:50 -0700672 case GET_CONSUMER_NAME: {
673 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
674 reply->writeString8(getConsumerName());
675 return NO_ERROR;
676 }
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700677 case SET_SHARED_BUFFER_MODE: {
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700678 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700679 bool sharedBufferMode = data.readInt32();
680 status_t result = setSharedBufferMode(sharedBufferMode);
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700681 reply->writeInt32(result);
682 return NO_ERROR;
683 }
Pablo Ceballosff95aab2016-01-13 17:09:58 -0800684 case SET_AUTO_REFRESH: {
685 CHECK_INTERFACE(IGraphicBuffer, data, reply);
686 bool autoRefresh = data.readInt32();
687 status_t result = setAutoRefresh(autoRefresh);
688 reply->writeInt32(result);
689 return NO_ERROR;
690 }
Dan Stoza127fc632015-06-30 13:43:32 -0700691 case SET_DEQUEUE_TIMEOUT: {
692 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
693 nsecs_t timeout = data.readInt64();
694 status_t result = setDequeueTimeout(timeout);
695 reply->writeInt32(result);
696 return NO_ERROR;
697 }
Dan Stoza50101d02016-04-07 16:53:23 -0700698 case GET_LAST_QUEUED_BUFFER: {
699 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
700 sp<GraphicBuffer> buffer(nullptr);
701 sp<Fence> fence(Fence::NO_FENCE);
John Reck1a61da52016-04-28 13:18:15 -0700702 float transform[16] = {};
703 status_t result = getLastQueuedBuffer(&buffer, &fence, transform);
Dan Stoza50101d02016-04-07 16:53:23 -0700704 reply->writeInt32(result);
705 if (result != NO_ERROR) {
706 return result;
707 }
John Reckce8e5df2016-04-28 10:12:47 -0700708 if (!buffer.get()) {
709 reply->writeBool(false);
710 } else {
711 reply->writeBool(true);
712 result = reply->write(*buffer);
John Reck1a61da52016-04-28 13:18:15 -0700713 if (result == NO_ERROR) {
714 reply->write(transform, sizeof(float) * 16);
715 }
John Reckce8e5df2016-04-28 10:12:47 -0700716 }
Dan Stoza50101d02016-04-07 16:53:23 -0700717 if (result != NO_ERROR) {
718 ALOGE("getLastQueuedBuffer failed to write buffer: %d", result);
719 return result;
720 }
721 result = reply->write(*fence);
722 if (result != NO_ERROR) {
723 ALOGE("getLastQueuedBuffer failed to write fence: %d", result);
724 return result;
725 }
726 return NO_ERROR;
727 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800728 case GET_FRAME_TIMESTAMPS: {
729 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
730 uint64_t frameNumber = 0;
731 status_t result = data.readUint64(&frameNumber);
732 if (result != NO_ERROR) {
733 ALOGE("onTransact failed to read: %d", result);
734 return result;
735 }
736 FrameTimestamps timestamps;
737 bool found = getFrameTimestamps(frameNumber, &timestamps);
738 result = reply->writeBool(found);
739 if (result != NO_ERROR) {
740 ALOGE("onTransact failed to write: %d", result);
741 return result;
742 }
743 if (found) {
744 result = reply->write(timestamps);
745 if (result != NO_ERROR) {
746 ALOGE("onTransact failed to write timestamps: %d", result);
747 return result;
748 }
749 }
750 return NO_ERROR;
751 }
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -0700752 case GET_UNIQUE_ID: {
753 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
754 uint64_t outId = 0;
755 status_t actualResult = getUniqueId(&outId);
756 status_t result = reply->writeInt32(actualResult);
757 if (result != NO_ERROR) {
758 return result;
759 }
760 result = reply->writeUint64(outId);
761 if (result != NO_ERROR) {
762 return result;
763 }
764 return NO_ERROR;
765 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800766 }
767 return BBinder::onTransact(code, data, reply, flags);
768}
769
770// ----------------------------------------------------------------------------
771
Andy McFadden2adaf042012-12-18 09:49:45 -0800772IGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) {
Jesse Hallc777b0b2012-06-28 12:52:05 -0700773 parcel.read(*this);
774}
775
Mathias Agopiane1424282013-07-29 21:24:40 -0700776size_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const {
Jesse Hallc777b0b2012-06-28 12:52:05 -0700777 return sizeof(timestamp)
Andy McFadden3c256212013-08-16 14:55:39 -0700778 + sizeof(isAutoTimestamp)
Eino-Ville Talvala82c6bcc2015-02-19 16:10:43 -0800779 + sizeof(dataSpace)
Jesse Hallc777b0b2012-06-28 12:52:05 -0700780 + sizeof(crop)
781 + sizeof(scalingMode)
782 + sizeof(transform)
Ruben Brunk1681d952014-06-27 15:51:55 -0700783 + sizeof(stickyTransform)
Dan Stoza5065a552015-03-17 16:23:42 -0700784 + fence->getFlattenedSize()
785 + surfaceDamage.getFlattenedSize();
Jesse Hallc777b0b2012-06-28 12:52:05 -0700786}
787
Mathias Agopiane1424282013-07-29 21:24:40 -0700788size_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const {
Jamie Gennis1df8c342012-12-20 14:05:45 -0800789 return fence->getFdCount();
Jesse Hallc777b0b2012-06-28 12:52:05 -0700790}
791
Mathias Agopiane1424282013-07-29 21:24:40 -0700792status_t IGraphicBufferProducer::QueueBufferInput::flatten(
793 void*& buffer, size_t& size, int*& fds, size_t& count) const
Jesse Hallc777b0b2012-06-28 12:52:05 -0700794{
Mathias Agopiane1424282013-07-29 21:24:40 -0700795 if (size < getFlattenedSize()) {
796 return NO_MEMORY;
797 }
798 FlattenableUtils::write(buffer, size, timestamp);
Andy McFadden3c256212013-08-16 14:55:39 -0700799 FlattenableUtils::write(buffer, size, isAutoTimestamp);
Eino-Ville Talvala82c6bcc2015-02-19 16:10:43 -0800800 FlattenableUtils::write(buffer, size, dataSpace);
Mathias Agopiane1424282013-07-29 21:24:40 -0700801 FlattenableUtils::write(buffer, size, crop);
802 FlattenableUtils::write(buffer, size, scalingMode);
803 FlattenableUtils::write(buffer, size, transform);
Ruben Brunk1681d952014-06-27 15:51:55 -0700804 FlattenableUtils::write(buffer, size, stickyTransform);
Dan Stoza5065a552015-03-17 16:23:42 -0700805 status_t result = fence->flatten(buffer, size, fds, count);
806 if (result != NO_ERROR) {
807 return result;
808 }
809 return surfaceDamage.flatten(buffer, size);
Jesse Hallc777b0b2012-06-28 12:52:05 -0700810}
811
Mathias Agopiane1424282013-07-29 21:24:40 -0700812status_t IGraphicBufferProducer::QueueBufferInput::unflatten(
813 void const*& buffer, size_t& size, int const*& fds, size_t& count)
Jesse Hallc777b0b2012-06-28 12:52:05 -0700814{
Mathias Agopiane1424282013-07-29 21:24:40 -0700815 size_t minNeeded =
816 sizeof(timestamp)
Andy McFadden3c256212013-08-16 14:55:39 -0700817 + sizeof(isAutoTimestamp)
Eino-Ville Talvala82c6bcc2015-02-19 16:10:43 -0800818 + sizeof(dataSpace)
Mathias Agopiane1424282013-07-29 21:24:40 -0700819 + sizeof(crop)
820 + sizeof(scalingMode)
821 + sizeof(transform)
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700822 + sizeof(stickyTransform);
Mathias Agopiane1424282013-07-29 21:24:40 -0700823
824 if (size < minNeeded) {
825 return NO_MEMORY;
826 }
827
828 FlattenableUtils::read(buffer, size, timestamp);
Andy McFadden3c256212013-08-16 14:55:39 -0700829 FlattenableUtils::read(buffer, size, isAutoTimestamp);
Eino-Ville Talvala82c6bcc2015-02-19 16:10:43 -0800830 FlattenableUtils::read(buffer, size, dataSpace);
Mathias Agopiane1424282013-07-29 21:24:40 -0700831 FlattenableUtils::read(buffer, size, crop);
832 FlattenableUtils::read(buffer, size, scalingMode);
833 FlattenableUtils::read(buffer, size, transform);
Ruben Brunk1681d952014-06-27 15:51:55 -0700834 FlattenableUtils::read(buffer, size, stickyTransform);
Mathias Agopiane1424282013-07-29 21:24:40 -0700835
Jamie Gennis1df8c342012-12-20 14:05:45 -0800836 fence = new Fence();
Dan Stoza5065a552015-03-17 16:23:42 -0700837 status_t result = fence->unflatten(buffer, size, fds, count);
838 if (result != NO_ERROR) {
839 return result;
840 }
841 return surfaceDamage.unflatten(buffer, size);
Jesse Hallc777b0b2012-06-28 12:52:05 -0700842}
843
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800844}; // namespace android