blob: 74ab5ac1c80eaf8a15cc7f0432ca71f3e8c3e904 [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
Jiwen 'Steve' Caif5f36c72018-05-02 10:24:29 -070030#ifndef NO_BUFFERHUB
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -080031#include <gui/BufferHubProducer.h>
Jiwen 'Steve' Caif5f36c72018-05-02 10:24:29 -070032#endif
Chia-I Wuc79a2962017-05-15 10:32:27 -070033#include <gui/BufferQueueDefs.h>
Andy McFadden2adaf042012-12-18 09:49:45 -080034#include <gui/IGraphicBufferProducer.h>
Dan Stozaf0eaf252014-03-21 13:05:51 -070035#include <gui/IProducerListener.h>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080036
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -080037#include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h>
38
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080039namespace android {
40// ----------------------------------------------------------------------------
41
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -080042using ::android::hardware::graphics::bufferqueue::V1_0::utils::
43 H2BGraphicBufferProducer;
44
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080045enum {
46 REQUEST_BUFFER = IBinder::FIRST_CALL_TRANSACTION,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080047 DEQUEUE_BUFFER,
Dan Stoza9f3053d2014-03-06 15:14:33 -080048 DETACH_BUFFER,
Dan Stozad9822a32014-03-28 15:25:31 -070049 DETACH_NEXT_BUFFER,
Dan Stoza9f3053d2014-03-06 15:14:33 -080050 ATTACH_BUFFER,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080051 QUEUE_BUFFER,
52 CANCEL_BUFFER,
Mathias Agopianeafabcd2011-04-20 14:20:59 -070053 QUERY,
Jamie Gennisfe0a87b2011-07-13 19:12:20 -070054 CONNECT,
55 DISCONNECT,
Jesse Hall399184a2014-03-03 15:42:54 -080056 SET_SIDEBAND_STREAM,
Dan Stoza29a3e902014-06-20 13:13:57 -070057 ALLOCATE_BUFFERS,
Dan Stoza9de72932015-04-16 17:28:43 -070058 ALLOW_ALLOCATION,
Dan Stoza812ed062015-06-02 15:45:22 -070059 SET_GENERATION_NUMBER,
Dan Stozac6f30bd2015-06-08 09:32:50 -070060 GET_CONSUMER_NAME,
Pablo Ceballosfa455352015-08-12 17:47:47 -070061 SET_MAX_DEQUEUED_BUFFER_COUNT,
Dan Stoza7dde5992015-05-22 09:51:44 -070062 SET_ASYNC_MODE,
Pablo Ceballos3559fbf2016-03-17 15:50:23 -070063 SET_SHARED_BUFFER_MODE,
Pablo Ceballosff95aab2016-01-13 17:09:58 -080064 SET_AUTO_REFRESH,
Dan Stoza127fc632015-06-30 13:43:32 -070065 SET_DEQUEUE_TIMEOUT,
Dan Stoza50101d02016-04-07 16:53:23 -070066 GET_LAST_QUEUED_BUFFER,
Pablo Ceballosfc352582016-06-30 17:22:20 -070067 GET_FRAME_TIMESTAMPS,
Chia-I Wue2786ea2017-08-07 10:36:08 -070068 GET_UNIQUE_ID,
69 GET_CONSUMER_USAGE,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080070};
71
Andy McFadden2adaf042012-12-18 09:49:45 -080072class BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080073{
74public:
Chih-Hung Hsiehe2347b72016-04-25 15:41:05 -070075 explicit BpGraphicBufferProducer(const sp<IBinder>& impl)
Andy McFadden2adaf042012-12-18 09:49:45 -080076 : BpInterface<IGraphicBufferProducer>(impl)
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080077 {
78 }
79
Yi Kongca038512017-05-02 16:55:24 -070080 ~BpGraphicBufferProducer() override;
Dan Stoza3be1c6b2014-11-18 10:24:03 -080081
Jamie Gennis7b305ff2011-07-19 12:08:33 -070082 virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080083 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -080084 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080085 data.writeInt32(bufferIdx);
Jamie Gennis8a29ff22011-10-14 15:03:17 -070086 status_t result =remote()->transact(REQUEST_BUFFER, data, &reply);
87 if (result != NO_ERROR) {
88 return result;
89 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080090 bool nonNull = reply.readInt32();
91 if (nonNull) {
Jamie Gennis7b305ff2011-07-19 12:08:33 -070092 *buf = new GraphicBuffer();
Lingyun Zhu2aff7022012-11-20 19:24:35 +080093 result = reply.read(**buf);
94 if(result != NO_ERROR) {
95 (*buf).clear();
96 return result;
97 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080098 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -070099 result = reply.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700100 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800101 }
102
Pablo Ceballosfa455352015-08-12 17:47:47 -0700103 virtual status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) {
104 Parcel data, reply;
105 data.writeInterfaceToken(
106 IGraphicBufferProducer::getInterfaceDescriptor());
107 data.writeInt32(maxDequeuedBuffers);
108 status_t result = remote()->transact(SET_MAX_DEQUEUED_BUFFER_COUNT,
109 data, &reply);
110 if (result != NO_ERROR) {
111 return result;
112 }
113 result = reply.readInt32();
114 return result;
115 }
116
117 virtual status_t setAsyncMode(bool async) {
118 Parcel data, reply;
119 data.writeInterfaceToken(
120 IGraphicBufferProducer::getInterfaceDescriptor());
121 data.writeInt32(async);
122 status_t result = remote()->transact(SET_ASYNC_MODE,
123 data, &reply);
124 if (result != NO_ERROR) {
125 return result;
126 }
127 result = reply.readInt32();
128 return result;
129 }
130
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600131 virtual status_t dequeueBuffer(int* buf, sp<Fence>* fence, uint32_t width, uint32_t height,
132 PixelFormat format, uint64_t usage, uint64_t* outBufferAge,
133 FrameEventHistoryDelta* outTimestamps) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800134 Parcel data, reply;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700135 bool getFrameTimestamps = (outTimestamps != nullptr);
Brian Andersonbaaad322016-07-22 15:55:13 -0700136
Andy McFadden2adaf042012-12-18 09:49:45 -0800137 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800138 data.writeUint32(width);
139 data.writeUint32(height);
140 data.writeInt32(static_cast<int32_t>(format));
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700141 data.writeUint64(usage);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700142 data.writeBool(getFrameTimestamps);
Brian Andersonbaaad322016-07-22 15:55:13 -0700143
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700144 status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply);
145 if (result != NO_ERROR) {
146 return result;
147 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700148
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800149 *buf = reply.readInt32();
Brian Andersonbaaad322016-07-22 15:55:13 -0700150 *fence = new Fence();
151 result = reply.read(**fence);
152 if (result != NO_ERROR) {
153 fence->clear();
154 return result;
Jesse Hallf7857542012-06-14 15:26:33 -0700155 }
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600156 if (outBufferAge) {
157 result = reply.readUint64(outBufferAge);
158 } else {
159 // Read the value even if outBufferAge is nullptr:
160 uint64_t bufferAge;
161 result = reply.readUint64(&bufferAge);
162 }
163 if (result != NO_ERROR) {
164 ALOGE("IGBP::dequeueBuffer failed to read buffer age: %d", result);
165 return result;
166 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700167 if (getFrameTimestamps) {
168 result = reply.read(*outTimestamps);
169 if (result != NO_ERROR) {
170 ALOGE("IGBP::dequeueBuffer failed to read timestamps: %d",
171 result);
172 return result;
173 }
174 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700175 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800176 return result;
177 }
178
Dan Stoza9f3053d2014-03-06 15:14:33 -0800179 virtual status_t detachBuffer(int slot) {
180 Parcel data, reply;
181 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
182 data.writeInt32(slot);
183 status_t result = remote()->transact(DETACH_BUFFER, data, &reply);
184 if (result != NO_ERROR) {
185 return result;
186 }
187 result = reply.readInt32();
188 return result;
189 }
190
Dan Stozad9822a32014-03-28 15:25:31 -0700191 virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer,
192 sp<Fence>* outFence) {
193 if (outBuffer == NULL) {
194 ALOGE("detachNextBuffer: outBuffer must not be NULL");
195 return BAD_VALUE;
196 } else if (outFence == NULL) {
197 ALOGE("detachNextBuffer: outFence must not be NULL");
198 return BAD_VALUE;
199 }
200 Parcel data, reply;
201 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
202 status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply);
203 if (result != NO_ERROR) {
204 return result;
205 }
206 result = reply.readInt32();
207 if (result == NO_ERROR) {
208 bool nonNull = reply.readInt32();
209 if (nonNull) {
210 *outBuffer = new GraphicBuffer;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700211 result = reply.read(**outBuffer);
212 if (result != NO_ERROR) {
213 outBuffer->clear();
214 return result;
215 }
Dan Stozad9822a32014-03-28 15:25:31 -0700216 }
217 nonNull = reply.readInt32();
218 if (nonNull) {
219 *outFence = new Fence;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700220 result = reply.read(**outFence);
221 if (result != NO_ERROR) {
222 outBuffer->clear();
223 outFence->clear();
224 return result;
225 }
Dan Stozad9822a32014-03-28 15:25:31 -0700226 }
227 }
228 return result;
229 }
230
Dan Stoza9f3053d2014-03-06 15:14:33 -0800231 virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) {
232 Parcel data, reply;
233 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
234 data.write(*buffer.get());
235 status_t result = remote()->transact(ATTACH_BUFFER, data, &reply);
236 if (result != NO_ERROR) {
237 return result;
238 }
Chia-I Wuc79a2962017-05-15 10:32:27 -0700239
Dan Stoza9f3053d2014-03-06 15:14:33 -0800240 *slot = reply.readInt32();
241 result = reply.readInt32();
Chia-I Wuc79a2962017-05-15 10:32:27 -0700242 if (result == NO_ERROR &&
243 (*slot < 0 || *slot >= BufferQueueDefs::NUM_BUFFER_SLOTS)) {
244 ALOGE("attachBuffer returned invalid slot %d", *slot);
245 android_errorWriteLog(0x534e4554, "37478824");
246 return UNKNOWN_ERROR;
247 }
248
Dan Stoza9f3053d2014-03-06 15:14:33 -0800249 return result;
250 }
251
Mathias Agopianf0bc2f12012-04-09 16:14:01 -0700252 virtual status_t queueBuffer(int buf,
253 const QueueBufferInput& input, QueueBufferOutput* output) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800254 Parcel data, reply;
Brian Andersonbaaad322016-07-22 15:55:13 -0700255
Andy McFadden2adaf042012-12-18 09:49:45 -0800256 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800257 data.writeInt32(buf);
Jesse Hallc777b0b2012-06-28 12:52:05 -0700258 data.write(input);
Brian Andersonbaaad322016-07-22 15:55:13 -0700259
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700260 status_t result = remote()->transact(QUEUE_BUFFER, data, &reply);
261 if (result != NO_ERROR) {
262 return result;
263 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700264
265 result = reply.read(*output);
266 if (result != NO_ERROR) {
267 return result;
268 }
269
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700270 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800271 return result;
272 }
273
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700274 virtual status_t cancelBuffer(int buf, const sp<Fence>& fence) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800275 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800276 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800277 data.writeInt32(buf);
Jamie Gennis1df8c342012-12-20 14:05:45 -0800278 data.write(*fence.get());
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700279 status_t result = remote()->transact(CANCEL_BUFFER, data, &reply);
280 if (result != NO_ERROR) {
281 return result;
282 }
283 result = reply.readInt32();
284 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800285 }
286
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700287 virtual int query(int what, int* value) {
288 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800289 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700290 data.writeInt32(what);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700291 status_t result = remote()->transact(QUERY, data, &reply);
292 if (result != NO_ERROR) {
293 return result;
294 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700295 value[0] = reply.readInt32();
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700296 result = reply.readInt32();
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700297 return result;
298 }
299
Dan Stozaf0eaf252014-03-21 13:05:51 -0700300 virtual status_t connect(const sp<IProducerListener>& listener,
Mathias Agopian365857d2013-09-11 19:35:45 -0700301 int api, bool producerControlledByApp, QueueBufferOutput* output) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700302 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800303 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stozaf0eaf252014-03-21 13:05:51 -0700304 if (listener != NULL) {
305 data.writeInt32(1);
Marco Nelissen097ca272014-11-14 08:01:01 -0800306 data.writeStrongBinder(IInterface::asBinder(listener));
Dan Stozaf0eaf252014-03-21 13:05:51 -0700307 } else {
308 data.writeInt32(0);
309 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700310 data.writeInt32(api);
Mathias Agopian595264f2013-07-16 22:56:09 -0700311 data.writeInt32(producerControlledByApp);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700312 status_t result = remote()->transact(CONNECT, data, &reply);
313 if (result != NO_ERROR) {
314 return result;
315 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700316 reply.read(*output);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700317 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700318 return result;
319 }
Mathias Agopian80727112011-05-02 19:51:12 -0700320
Robert Carr97b9c862016-09-08 13:54:35 -0700321 virtual status_t disconnect(int api, DisconnectMode mode) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700322 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800323 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700324 data.writeInt32(api);
Robert Carr97b9c862016-09-08 13:54:35 -0700325 data.writeInt32(static_cast<int32_t>(mode));
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700326 status_t result =remote()->transact(DISCONNECT, data, &reply);
327 if (result != NO_ERROR) {
328 return result;
329 }
330 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700331 return result;
332 }
Jesse Hall399184a2014-03-03 15:42:54 -0800333
334 virtual status_t setSidebandStream(const sp<NativeHandle>& stream) {
335 Parcel data, reply;
336 status_t result;
337 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
338 if (stream.get()) {
339 data.writeInt32(true);
340 data.writeNativeHandle(stream->handle());
341 } else {
342 data.writeInt32(false);
343 }
344 if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) {
345 result = reply.readInt32();
346 }
347 return result;
348 }
Dan Stoza29a3e902014-06-20 13:13:57 -0700349
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700350 virtual void allocateBuffers(uint32_t width, uint32_t height,
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700351 PixelFormat format, uint64_t usage) {
Dan Stoza29a3e902014-06-20 13:13:57 -0700352 Parcel data, reply;
353 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800354 data.writeUint32(width);
355 data.writeUint32(height);
Dan Stoza29a3e902014-06-20 13:13:57 -0700356 data.writeInt32(static_cast<int32_t>(format));
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700357 data.writeUint64(usage);
Jorim Jaggi0a3e7842018-07-17 13:48:33 +0200358 status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply, TF_ONE_WAY);
Dan Stoza29a3e902014-06-20 13:13:57 -0700359 if (result != NO_ERROR) {
360 ALOGE("allocateBuffers failed to transact: %d", result);
361 }
362 }
Dan Stoza9de72932015-04-16 17:28:43 -0700363
364 virtual status_t allowAllocation(bool allow) {
365 Parcel data, reply;
366 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
367 data.writeInt32(static_cast<int32_t>(allow));
368 status_t result = remote()->transact(ALLOW_ALLOCATION, data, &reply);
369 if (result != NO_ERROR) {
370 return result;
371 }
372 result = reply.readInt32();
373 return result;
374 }
Dan Stoza812ed062015-06-02 15:45:22 -0700375
376 virtual status_t setGenerationNumber(uint32_t generationNumber) {
377 Parcel data, reply;
378 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
379 data.writeUint32(generationNumber);
380 status_t result = remote()->transact(SET_GENERATION_NUMBER, data, &reply);
381 if (result == NO_ERROR) {
382 result = reply.readInt32();
383 }
384 return result;
385 }
Dan Stozac6f30bd2015-06-08 09:32:50 -0700386
387 virtual String8 getConsumerName() const {
388 Parcel data, reply;
389 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
390 status_t result = remote()->transact(GET_CONSUMER_NAME, data, &reply);
391 if (result != NO_ERROR) {
392 ALOGE("getConsumerName failed to transact: %d", result);
393 return String8("TransactFailed");
394 }
395 return reply.readString8();
396 }
Dan Stoza7dde5992015-05-22 09:51:44 -0700397
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700398 virtual status_t setSharedBufferMode(bool sharedBufferMode) {
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700399 Parcel data, reply;
400 data.writeInterfaceToken(
401 IGraphicBufferProducer::getInterfaceDescriptor());
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700402 data.writeInt32(sharedBufferMode);
403 status_t result = remote()->transact(SET_SHARED_BUFFER_MODE, data,
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700404 &reply);
405 if (result == NO_ERROR) {
406 result = reply.readInt32();
407 }
408 return result;
409 }
Dan Stoza127fc632015-06-30 13:43:32 -0700410
Pablo Ceballosff95aab2016-01-13 17:09:58 -0800411 virtual status_t setAutoRefresh(bool autoRefresh) {
412 Parcel data, reply;
413 data.writeInterfaceToken(
414 IGraphicBufferProducer::getInterfaceDescriptor());
415 data.writeInt32(autoRefresh);
416 status_t result = remote()->transact(SET_AUTO_REFRESH, data, &reply);
417 if (result == NO_ERROR) {
418 result = reply.readInt32();
419 }
420 return result;
421 }
422
Dan Stoza127fc632015-06-30 13:43:32 -0700423 virtual status_t setDequeueTimeout(nsecs_t timeout) {
424 Parcel data, reply;
425 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
426 data.writeInt64(timeout);
427 status_t result = remote()->transact(SET_DEQUEUE_TIMEOUT, data, &reply);
428 if (result != NO_ERROR) {
429 ALOGE("setDequeueTimeout failed to transact: %d", result);
430 return result;
431 }
432 return reply.readInt32();
433 }
Dan Stoza50101d02016-04-07 16:53:23 -0700434
435 virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer,
John Reck1a61da52016-04-28 13:18:15 -0700436 sp<Fence>* outFence, float outTransformMatrix[16]) override {
Dan Stoza50101d02016-04-07 16:53:23 -0700437 Parcel data, reply;
438 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
439 status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER, data,
440 &reply);
441 if (result != NO_ERROR) {
442 ALOGE("getLastQueuedBuffer failed to transact: %d", result);
443 return result;
444 }
445 result = reply.readInt32();
446 if (result != NO_ERROR) {
447 return result;
448 }
John Reckce8e5df2016-04-28 10:12:47 -0700449 bool hasBuffer = reply.readBool();
450 sp<GraphicBuffer> buffer;
451 if (hasBuffer) {
452 buffer = new GraphicBuffer();
453 result = reply.read(*buffer);
John Reck1a61da52016-04-28 13:18:15 -0700454 if (result == NO_ERROR) {
455 result = reply.read(outTransformMatrix, sizeof(float) * 16);
456 }
John Reckce8e5df2016-04-28 10:12:47 -0700457 }
Dan Stoza50101d02016-04-07 16:53:23 -0700458 if (result != NO_ERROR) {
459 ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
460 return result;
461 }
462 sp<Fence> fence(new Fence);
463 result = reply.read(*fence);
464 if (result != NO_ERROR) {
465 ALOGE("getLastQueuedBuffer failed to read fence: %d", result);
466 return result;
467 }
468 *outBuffer = buffer;
469 *outFence = fence;
470 return result;
471 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800472
Brian Anderson3890c392016-07-25 12:48:08 -0700473 virtual void getFrameTimestamps(FrameEventHistoryDelta* outDelta) {
Pablo Ceballosce796e72016-02-04 19:10:51 -0800474 Parcel data, reply;
475 status_t result = data.writeInterfaceToken(
476 IGraphicBufferProducer::getInterfaceDescriptor());
477 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700478 ALOGE("IGBP::getFrameTimestamps failed to write token: %d", result);
479 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800480 }
481 result = remote()->transact(GET_FRAME_TIMESTAMPS, data, &reply);
482 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700483 ALOGE("IGBP::getFrameTimestamps failed to transact: %d", result);
484 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800485 }
Brian Anderson3890c392016-07-25 12:48:08 -0700486 result = reply.read(*outDelta);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800487 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700488 ALOGE("IGBP::getFrameTimestamps failed to read timestamps: %d",
489 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800490 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800491 }
Pablo Ceballos6155b402016-06-30 17:01:49 -0700492
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -0700493 virtual status_t getUniqueId(uint64_t* outId) const {
494 Parcel data, reply;
495 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
496 status_t result = remote()->transact(GET_UNIQUE_ID, data, &reply);
497 if (result != NO_ERROR) {
498 ALOGE("getUniqueId failed to transact: %d", result);
499 }
500 status_t actualResult = NO_ERROR;
501 result = reply.readInt32(&actualResult);
502 if (result != NO_ERROR) {
503 return result;
504 }
505 result = reply.readUint64(outId);
506 if (result != NO_ERROR) {
507 return result;
508 }
509 return actualResult;
510 }
Chia-I Wue2786ea2017-08-07 10:36:08 -0700511
512 virtual status_t getConsumerUsage(uint64_t* outUsage) const {
513 Parcel data, reply;
514 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
515 status_t result = remote()->transact(GET_CONSUMER_USAGE, data, &reply);
516 if (result != NO_ERROR) {
517 ALOGE("getConsumerUsage failed to transact: %d", result);
518 }
519 status_t actualResult = NO_ERROR;
520 result = reply.readInt32(&actualResult);
521 if (result != NO_ERROR) {
522 return result;
523 }
524 result = reply.readUint64(outUsage);
525 if (result != NO_ERROR) {
526 return result;
527 }
528 return actualResult;
529 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800530};
531
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800532// Out-of-line virtual method definition to trigger vtable emission in this
533// translation unit (see clang warning -Wweak-vtables)
534BpGraphicBufferProducer::~BpGraphicBufferProducer() {}
535
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800536class HpGraphicBufferProducer : public HpInterface<
537 BpGraphicBufferProducer, H2BGraphicBufferProducer> {
538public:
Chih-Hung Hsiehaaf62162018-12-20 15:45:04 -0800539 explicit HpGraphicBufferProducer(const sp<IBinder>& base) : PBase(base) {}
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800540
541 status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) override {
542 return mBase->requestBuffer(slot, buf);
543 }
544
545 status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) override {
546 return mBase->setMaxDequeuedBufferCount(maxDequeuedBuffers);
547 }
548
549 status_t setAsyncMode(bool async) override {
550 return mBase->setAsyncMode(async);
551 }
552
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600553 status_t dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w, uint32_t h, PixelFormat format,
554 uint64_t usage, uint64_t* outBufferAge,
555 FrameEventHistoryDelta* outTimestamps) override {
556 return mBase->dequeueBuffer(slot, fence, w, h, format, usage, outBufferAge, outTimestamps);
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800557 }
558
559 status_t detachBuffer(int slot) override {
560 return mBase->detachBuffer(slot);
561 }
562
563 status_t detachNextBuffer(
564 sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) override {
565 return mBase->detachNextBuffer(outBuffer, outFence);
566 }
567
568 status_t attachBuffer(
569 int* outSlot, const sp<GraphicBuffer>& buffer) override {
570 return mBase->attachBuffer(outSlot, buffer);
571 }
572
573 status_t queueBuffer(
574 int slot,
575 const QueueBufferInput& input,
576 QueueBufferOutput* output) override {
577 return mBase->queueBuffer(slot, input, output);
578 }
579
580 status_t cancelBuffer(int slot, const sp<Fence>& fence) override {
581 return mBase->cancelBuffer(slot, fence);
582 }
583
584 int query(int what, int* value) override {
585 return mBase->query(what, value);
586 }
587
588 status_t connect(
589 const sp<IProducerListener>& listener,
590 int api, bool producerControlledByApp,
591 QueueBufferOutput* output) override {
592 return mBase->connect(listener, api, producerControlledByApp, output);
593 }
594
595 status_t disconnect(
596 int api, DisconnectMode mode = DisconnectMode::Api) override {
597 return mBase->disconnect(api, mode);
598 }
599
600 status_t setSidebandStream(const sp<NativeHandle>& stream) override {
601 return mBase->setSidebandStream(stream);
602 }
603
604 void allocateBuffers(uint32_t width, uint32_t height,
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700605 PixelFormat format, uint64_t usage) override {
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800606 return mBase->allocateBuffers(width, height, format, usage);
607 }
608
609 status_t allowAllocation(bool allow) override {
610 return mBase->allowAllocation(allow);
611 }
612
613 status_t setGenerationNumber(uint32_t generationNumber) override {
614 return mBase->setGenerationNumber(generationNumber);
615 }
616
617 String8 getConsumerName() const override {
618 return mBase->getConsumerName();
619 }
620
621 status_t setSharedBufferMode(bool sharedBufferMode) override {
622 return mBase->setSharedBufferMode(sharedBufferMode);
623 }
624
625 status_t setAutoRefresh(bool autoRefresh) override {
626 return mBase->setAutoRefresh(autoRefresh);
627 }
628
629 status_t setDequeueTimeout(nsecs_t timeout) override {
630 return mBase->setDequeueTimeout(timeout);
631 }
632
633 status_t getLastQueuedBuffer(
634 sp<GraphicBuffer>* outBuffer,
635 sp<Fence>* outFence,
636 float outTransformMatrix[16]) override {
637 return mBase->getLastQueuedBuffer(
638 outBuffer, outFence, outTransformMatrix);
639 }
640
641 void getFrameTimestamps(FrameEventHistoryDelta* outDelta) override {
642 return mBase->getFrameTimestamps(outDelta);
643 }
644
645 status_t getUniqueId(uint64_t* outId) const override {
646 return mBase->getUniqueId(outId);
647 }
Chia-I Wue2786ea2017-08-07 10:36:08 -0700648
649 status_t getConsumerUsage(uint64_t* outUsage) const override {
650 return mBase->getConsumerUsage(outUsage);
651 }
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800652};
653
654IMPLEMENT_HYBRID_META_INTERFACE(GraphicBufferProducer, HGraphicBufferProducer,
655 "android.gui.IGraphicBufferProducer");
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800656
657// ----------------------------------------------------------------------
658
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -0800659status_t IGraphicBufferProducer::exportToParcel(Parcel* parcel) {
660 status_t res = OK;
661 res = parcel->writeUint32(USE_BUFFER_QUEUE);
662 if (res != NO_ERROR) {
663 ALOGE("exportToParcel: Cannot write magic, res=%d.", res);
664 return res;
665 }
666
667 return parcel->writeStrongBinder(IInterface::asBinder(this));
668}
669
670/* static */
671status_t IGraphicBufferProducer::exportToParcel(const sp<IGraphicBufferProducer>& producer,
672 Parcel* parcel) {
673 if (parcel == nullptr) {
674 ALOGE("exportToParcel: Invalid parcel object.");
675 return BAD_VALUE;
676 }
677
678 if (producer == nullptr) {
679 status_t res = OK;
680 res = parcel->writeUint32(IGraphicBufferProducer::USE_BUFFER_QUEUE);
681 if (res != NO_ERROR) return res;
682 return parcel->writeStrongBinder(nullptr);
683 } else {
684 return producer->exportToParcel(parcel);
685 }
686}
687
688/* static */
689sp<IGraphicBufferProducer> IGraphicBufferProducer::createFromParcel(const Parcel* parcel) {
690 uint32_t outMagic = 0;
691 status_t res = NO_ERROR;
692
693 res = parcel->readUint32(&outMagic);
694 if (res != NO_ERROR) {
695 ALOGE("createFromParcel: Failed to read magic, error=%d.", res);
696 return nullptr;
697 }
698
699 switch (outMagic) {
700 case USE_BUFFER_QUEUE: {
701 sp<IBinder> binder;
702 res = parcel->readNullableStrongBinder(&binder);
703 if (res != NO_ERROR) {
704 ALOGE("createFromParcel: Can't read strong binder.");
705 return nullptr;
706 }
707 return interface_cast<IGraphicBufferProducer>(binder);
708 }
709 case USE_BUFFER_HUB: {
710 ALOGE("createFromParcel: BufferHub not implemented.");
Jiwen 'Steve' Caif5f36c72018-05-02 10:24:29 -0700711#ifndef NO_BUFFERHUB
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -0800712 dvr::ProducerQueueParcelable producerParcelable;
713 res = producerParcelable.readFromParcel(parcel);
714 if (res != NO_ERROR) {
715 ALOGE("createFromParcel: Failed to read from parcel, error=%d", res);
716 return nullptr;
717 }
718 return BufferHubProducer::Create(std::move(producerParcelable));
Jiwen 'Steve' Caif5f36c72018-05-02 10:24:29 -0700719#else
720 return nullptr;
721#endif
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -0800722 }
723 default: {
724 ALOGE("createFromParcel: Unexpected mgaic: 0x%x.", outMagic);
725 return nullptr;
726 }
727 }
728}
729
730// ----------------------------------------------------------------------------
731
Andy McFadden2adaf042012-12-18 09:49:45 -0800732status_t BnGraphicBufferProducer::onTransact(
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800733 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
734{
735 switch(code) {
736 case REQUEST_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800737 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800738 int bufferIdx = data.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700739 sp<GraphicBuffer> buffer;
740 int result = requestBuffer(bufferIdx, &buffer);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800741 reply->writeInt32(buffer != 0);
742 if (buffer != 0) {
743 reply->write(*buffer);
744 }
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700745 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800746 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800747 }
Pablo Ceballosfa455352015-08-12 17:47:47 -0700748 case SET_MAX_DEQUEUED_BUFFER_COUNT: {
749 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
750 int maxDequeuedBuffers = data.readInt32();
751 int result = setMaxDequeuedBufferCount(maxDequeuedBuffers);
752 reply->writeInt32(result);
753 return NO_ERROR;
754 }
755 case SET_ASYNC_MODE: {
756 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
757 bool async = data.readInt32();
758 int result = setAsyncMode(async);
759 reply->writeInt32(result);
760 return NO_ERROR;
761 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800762 case DEQUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800763 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800764 uint32_t width = data.readUint32();
765 uint32_t height = data.readUint32();
766 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700767 uint64_t usage = data.readUint64();
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600768 uint64_t bufferAge = 0;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700769 bool getTimestamps = data.readBool();
Brian Andersonbaaad322016-07-22 15:55:13 -0700770
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700771 int buf = 0;
Brian Andersonbaaad322016-07-22 15:55:13 -0700772 sp<Fence> fence = Fence::NO_FENCE;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700773 FrameEventHistoryDelta frameTimestamps;
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600774 int result = dequeueBuffer(&buf, &fence, width, height, format, usage, &bufferAge,
775 getTimestamps ? &frameTimestamps : nullptr);
Brian Andersonbaaad322016-07-22 15:55:13 -0700776
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800777 reply->writeInt32(buf);
Brian Andersonbaaad322016-07-22 15:55:13 -0700778 reply->write(*fence);
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600779 reply->writeUint64(bufferAge);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700780 if (getTimestamps) {
781 reply->write(frameTimestamps);
782 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800783 reply->writeInt32(result);
784 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800785 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800786 case DETACH_BUFFER: {
787 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
788 int slot = data.readInt32();
789 int result = detachBuffer(slot);
790 reply->writeInt32(result);
791 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800792 }
Dan Stozad9822a32014-03-28 15:25:31 -0700793 case DETACH_NEXT_BUFFER: {
794 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
795 sp<GraphicBuffer> buffer;
796 sp<Fence> fence;
797 int32_t result = detachNextBuffer(&buffer, &fence);
798 reply->writeInt32(result);
799 if (result == NO_ERROR) {
800 reply->writeInt32(buffer != NULL);
801 if (buffer != NULL) {
802 reply->write(*buffer);
803 }
804 reply->writeInt32(fence != NULL);
805 if (fence != NULL) {
806 reply->write(*fence);
807 }
808 }
809 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800810 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800811 case ATTACH_BUFFER: {
812 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
813 sp<GraphicBuffer> buffer = new GraphicBuffer();
Pablo Ceballos70636b32016-07-06 15:24:54 -0700814 status_t result = data.read(*buffer.get());
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700815 int slot = 0;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700816 if (result == NO_ERROR) {
817 result = attachBuffer(&slot, buffer);
818 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800819 reply->writeInt32(slot);
820 reply->writeInt32(result);
821 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800822 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800823 case QUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800824 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700825
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800826 int buf = data.readInt32();
Jesse Hallc777b0b2012-06-28 12:52:05 -0700827 QueueBufferInput input(data);
Brian Andersonbaaad322016-07-22 15:55:13 -0700828 QueueBufferOutput output;
829 status_t result = queueBuffer(buf, input, &output);
Brian Andersonbaaad322016-07-22 15:55:13 -0700830 reply->write(output);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800831 reply->writeInt32(result);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700832
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800833 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800834 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800835 case CANCEL_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800836 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800837 int buf = data.readInt32();
Jamie Gennis1df8c342012-12-20 14:05:45 -0800838 sp<Fence> fence = new Fence();
Pablo Ceballos70636b32016-07-06 15:24:54 -0700839 status_t result = data.read(*fence.get());
840 if (result == NO_ERROR) {
841 result = cancelBuffer(buf, fence);
842 }
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700843 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800844 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800845 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700846 case QUERY: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800847 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700848 int value = 0;
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700849 int what = data.readInt32();
850 int res = query(what, &value);
851 reply->writeInt32(value);
852 reply->writeInt32(res);
853 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800854 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700855 case CONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800856 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stozaf0eaf252014-03-21 13:05:51 -0700857 sp<IProducerListener> listener;
858 if (data.readInt32() == 1) {
859 listener = IProducerListener::asInterface(data.readStrongBinder());
860 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700861 int api = data.readInt32();
Mathias Agopian595264f2013-07-16 22:56:09 -0700862 bool producerControlledByApp = data.readInt32();
Brian Andersonbaaad322016-07-22 15:55:13 -0700863 QueueBufferOutput output;
864 status_t res = connect(listener, api, producerControlledByApp, &output);
865 reply->write(output);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700866 reply->writeInt32(res);
867 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800868 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700869 case DISCONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800870 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700871 int api = data.readInt32();
Robert Carr97b9c862016-09-08 13:54:35 -0700872 DisconnectMode mode = static_cast<DisconnectMode>(data.readInt32());
873 status_t res = disconnect(api, mode);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700874 reply->writeInt32(res);
875 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800876 }
Jesse Hall399184a2014-03-03 15:42:54 -0800877 case SET_SIDEBAND_STREAM: {
878 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
879 sp<NativeHandle> stream;
880 if (data.readInt32()) {
Wonsik Kim0ec54e12014-03-21 10:46:24 +0900881 stream = NativeHandle::create(data.readNativeHandle(), true);
Jesse Hall399184a2014-03-03 15:42:54 -0800882 }
883 status_t result = setSidebandStream(stream);
884 reply->writeInt32(result);
885 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800886 }
Dan Stoza9de72932015-04-16 17:28:43 -0700887 case ALLOCATE_BUFFERS: {
Dan Stoza29a3e902014-06-20 13:13:57 -0700888 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800889 uint32_t width = data.readUint32();
890 uint32_t height = data.readUint32();
891 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700892 uint64_t usage = data.readUint64();
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700893 allocateBuffers(width, height, format, usage);
Dan Stoza29a3e902014-06-20 13:13:57 -0700894 return NO_ERROR;
Dan Stoza9de72932015-04-16 17:28:43 -0700895 }
896 case ALLOW_ALLOCATION: {
897 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
898 bool allow = static_cast<bool>(data.readInt32());
899 status_t result = allowAllocation(allow);
900 reply->writeInt32(result);
901 return NO_ERROR;
902 }
Dan Stoza812ed062015-06-02 15:45:22 -0700903 case SET_GENERATION_NUMBER: {
904 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
905 uint32_t generationNumber = data.readUint32();
906 status_t result = setGenerationNumber(generationNumber);
907 reply->writeInt32(result);
908 return NO_ERROR;
909 }
Dan Stozac6f30bd2015-06-08 09:32:50 -0700910 case GET_CONSUMER_NAME: {
911 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
912 reply->writeString8(getConsumerName());
913 return NO_ERROR;
914 }
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700915 case SET_SHARED_BUFFER_MODE: {
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700916 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700917 bool sharedBufferMode = data.readInt32();
918 status_t result = setSharedBufferMode(sharedBufferMode);
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700919 reply->writeInt32(result);
920 return NO_ERROR;
921 }
Pablo Ceballosff95aab2016-01-13 17:09:58 -0800922 case SET_AUTO_REFRESH: {
923 CHECK_INTERFACE(IGraphicBuffer, data, reply);
924 bool autoRefresh = data.readInt32();
925 status_t result = setAutoRefresh(autoRefresh);
926 reply->writeInt32(result);
927 return NO_ERROR;
928 }
Dan Stoza127fc632015-06-30 13:43:32 -0700929 case SET_DEQUEUE_TIMEOUT: {
930 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
931 nsecs_t timeout = data.readInt64();
932 status_t result = setDequeueTimeout(timeout);
933 reply->writeInt32(result);
934 return NO_ERROR;
935 }
Dan Stoza50101d02016-04-07 16:53:23 -0700936 case GET_LAST_QUEUED_BUFFER: {
937 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
938 sp<GraphicBuffer> buffer(nullptr);
939 sp<Fence> fence(Fence::NO_FENCE);
John Reck1a61da52016-04-28 13:18:15 -0700940 float transform[16] = {};
941 status_t result = getLastQueuedBuffer(&buffer, &fence, transform);
Dan Stoza50101d02016-04-07 16:53:23 -0700942 reply->writeInt32(result);
943 if (result != NO_ERROR) {
944 return result;
945 }
John Reckce8e5df2016-04-28 10:12:47 -0700946 if (!buffer.get()) {
947 reply->writeBool(false);
948 } else {
949 reply->writeBool(true);
950 result = reply->write(*buffer);
John Reck1a61da52016-04-28 13:18:15 -0700951 if (result == NO_ERROR) {
952 reply->write(transform, sizeof(float) * 16);
953 }
John Reckce8e5df2016-04-28 10:12:47 -0700954 }
Dan Stoza50101d02016-04-07 16:53:23 -0700955 if (result != NO_ERROR) {
956 ALOGE("getLastQueuedBuffer failed to write buffer: %d", result);
957 return result;
958 }
959 result = reply->write(*fence);
960 if (result != NO_ERROR) {
961 ALOGE("getLastQueuedBuffer failed to write fence: %d", result);
962 return result;
963 }
964 return NO_ERROR;
965 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800966 case GET_FRAME_TIMESTAMPS: {
967 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson3890c392016-07-25 12:48:08 -0700968 FrameEventHistoryDelta frameTimestamps;
969 getFrameTimestamps(&frameTimestamps);
970 status_t result = reply->write(frameTimestamps);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800971 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700972 ALOGE("BnGBP::GET_FRAME_TIMESTAMPS failed to write buffer: %d",
973 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800974 return result;
975 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800976 return NO_ERROR;
977 }
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -0700978 case GET_UNIQUE_ID: {
979 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
980 uint64_t outId = 0;
981 status_t actualResult = getUniqueId(&outId);
982 status_t result = reply->writeInt32(actualResult);
983 if (result != NO_ERROR) {
984 return result;
985 }
986 result = reply->writeUint64(outId);
987 if (result != NO_ERROR) {
988 return result;
989 }
990 return NO_ERROR;
991 }
Chia-I Wue2786ea2017-08-07 10:36:08 -0700992 case GET_CONSUMER_USAGE: {
993 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
994 uint64_t outUsage = 0;
995 status_t actualResult = getConsumerUsage(&outUsage);
996 status_t result = reply->writeInt32(actualResult);
997 if (result != NO_ERROR) {
998 return result;
999 }
1000 result = reply->writeUint64(outUsage);
1001 if (result != NO_ERROR) {
1002 return result;
1003 }
1004 return NO_ERROR;
1005 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001006 }
1007 return BBinder::onTransact(code, data, reply, flags);
1008}
1009
1010// ----------------------------------------------------------------------------
1011
Andy McFadden2adaf042012-12-18 09:49:45 -08001012IGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) {
Jesse Hallc777b0b2012-06-28 12:52:05 -07001013 parcel.read(*this);
1014}
1015
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001016constexpr size_t IGraphicBufferProducer::QueueBufferInput::minFlattenedSize() {
1017 return sizeof(timestamp) +
1018 sizeof(isAutoTimestamp) +
1019 sizeof(dataSpace) +
1020 sizeof(crop) +
1021 sizeof(scalingMode) +
1022 sizeof(transform) +
1023 sizeof(stickyTransform) +
1024 sizeof(getFrameTimestamps);
1025}
1026
Mathias Agopiane1424282013-07-29 21:24:40 -07001027size_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const {
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001028 return minFlattenedSize() +
1029 fence->getFlattenedSize() +
Courtney Goeltzenleuchter9bad0d72017-12-19 12:34:34 -07001030 surfaceDamage.getFlattenedSize() +
1031 hdrMetadata.getFlattenedSize();
Jesse Hallc777b0b2012-06-28 12:52:05 -07001032}
1033
Mathias Agopiane1424282013-07-29 21:24:40 -07001034size_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const {
Jamie Gennis1df8c342012-12-20 14:05:45 -08001035 return fence->getFdCount();
Jesse Hallc777b0b2012-06-28 12:52:05 -07001036}
1037
Mathias Agopiane1424282013-07-29 21:24:40 -07001038status_t IGraphicBufferProducer::QueueBufferInput::flatten(
1039 void*& buffer, size_t& size, int*& fds, size_t& count) const
Jesse Hallc777b0b2012-06-28 12:52:05 -07001040{
Mathias Agopiane1424282013-07-29 21:24:40 -07001041 if (size < getFlattenedSize()) {
1042 return NO_MEMORY;
1043 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001044
Mathias Agopiane1424282013-07-29 21:24:40 -07001045 FlattenableUtils::write(buffer, size, timestamp);
Andy McFadden3c256212013-08-16 14:55:39 -07001046 FlattenableUtils::write(buffer, size, isAutoTimestamp);
Eino-Ville Talvala82c6bcc2015-02-19 16:10:43 -08001047 FlattenableUtils::write(buffer, size, dataSpace);
Mathias Agopiane1424282013-07-29 21:24:40 -07001048 FlattenableUtils::write(buffer, size, crop);
1049 FlattenableUtils::write(buffer, size, scalingMode);
1050 FlattenableUtils::write(buffer, size, transform);
Ruben Brunk1681d952014-06-27 15:51:55 -07001051 FlattenableUtils::write(buffer, size, stickyTransform);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001052 FlattenableUtils::write(buffer, size, getFrameTimestamps);
1053
Dan Stoza5065a552015-03-17 16:23:42 -07001054 status_t result = fence->flatten(buffer, size, fds, count);
1055 if (result != NO_ERROR) {
1056 return result;
1057 }
Courtney Goeltzenleuchter9bad0d72017-12-19 12:34:34 -07001058 result = surfaceDamage.flatten(buffer, size);
1059 if (result != NO_ERROR) {
1060 return result;
1061 }
1062 FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize());
1063 return hdrMetadata.flatten(buffer, size);
Jesse Hallc777b0b2012-06-28 12:52:05 -07001064}
1065
Mathias Agopiane1424282013-07-29 21:24:40 -07001066status_t IGraphicBufferProducer::QueueBufferInput::unflatten(
1067 void const*& buffer, size_t& size, int const*& fds, size_t& count)
Jesse Hallc777b0b2012-06-28 12:52:05 -07001068{
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001069 if (size < minFlattenedSize()) {
Mathias Agopiane1424282013-07-29 21:24:40 -07001070 return NO_MEMORY;
1071 }
1072
1073 FlattenableUtils::read(buffer, size, timestamp);
Andy McFadden3c256212013-08-16 14:55:39 -07001074 FlattenableUtils::read(buffer, size, isAutoTimestamp);
Eino-Ville Talvala82c6bcc2015-02-19 16:10:43 -08001075 FlattenableUtils::read(buffer, size, dataSpace);
Mathias Agopiane1424282013-07-29 21:24:40 -07001076 FlattenableUtils::read(buffer, size, crop);
1077 FlattenableUtils::read(buffer, size, scalingMode);
1078 FlattenableUtils::read(buffer, size, transform);
Ruben Brunk1681d952014-06-27 15:51:55 -07001079 FlattenableUtils::read(buffer, size, stickyTransform);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001080 FlattenableUtils::read(buffer, size, getFrameTimestamps);
Mathias Agopiane1424282013-07-29 21:24:40 -07001081
Jamie Gennis1df8c342012-12-20 14:05:45 -08001082 fence = new Fence();
Dan Stoza5065a552015-03-17 16:23:42 -07001083 status_t result = fence->unflatten(buffer, size, fds, count);
1084 if (result != NO_ERROR) {
1085 return result;
1086 }
Courtney Goeltzenleuchter9bad0d72017-12-19 12:34:34 -07001087 result = surfaceDamage.unflatten(buffer, size);
1088 if (result != NO_ERROR) {
1089 return result;
1090 }
1091 FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize());
1092 return hdrMetadata.unflatten(buffer, size);
Jesse Hallc777b0b2012-06-28 12:52:05 -07001093}
1094
Brian Andersonbaaad322016-07-22 15:55:13 -07001095// ----------------------------------------------------------------------------
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001096constexpr size_t IGraphicBufferProducer::QueueBufferOutput::minFlattenedSize() {
1097 return sizeof(width) +
1098 sizeof(height) +
1099 sizeof(transformHint) +
1100 sizeof(numPendingBuffers) +
Shuzhen Wang22f842b2017-01-18 23:02:36 -08001101 sizeof(nextFrameNumber) +
1102 sizeof(bufferReplaced);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001103}
Brian Andersonbaaad322016-07-22 15:55:13 -07001104
1105size_t IGraphicBufferProducer::QueueBufferOutput::getFlattenedSize() const {
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001106 return minFlattenedSize() + frameTimestamps.getFlattenedSize();
Brian Andersonbaaad322016-07-22 15:55:13 -07001107}
1108
1109size_t IGraphicBufferProducer::QueueBufferOutput::getFdCount() const {
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001110 return frameTimestamps.getFdCount();
Brian Andersonbaaad322016-07-22 15:55:13 -07001111}
1112
1113status_t IGraphicBufferProducer::QueueBufferOutput::flatten(
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001114 void*& buffer, size_t& size, int*& fds, size_t& count) const
Brian Andersonbaaad322016-07-22 15:55:13 -07001115{
1116 if (size < getFlattenedSize()) {
1117 return NO_MEMORY;
1118 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001119
Brian Andersonbaaad322016-07-22 15:55:13 -07001120 FlattenableUtils::write(buffer, size, width);
1121 FlattenableUtils::write(buffer, size, height);
1122 FlattenableUtils::write(buffer, size, transformHint);
1123 FlattenableUtils::write(buffer, size, numPendingBuffers);
1124 FlattenableUtils::write(buffer, size, nextFrameNumber);
Shuzhen Wang22f842b2017-01-18 23:02:36 -08001125 FlattenableUtils::write(buffer, size, bufferReplaced);
Brian Andersonbaaad322016-07-22 15:55:13 -07001126
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001127 return frameTimestamps.flatten(buffer, size, fds, count);
Brian Andersonbaaad322016-07-22 15:55:13 -07001128}
1129
1130status_t IGraphicBufferProducer::QueueBufferOutput::unflatten(
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001131 void const*& buffer, size_t& size, int const*& fds, size_t& count)
Brian Andersonbaaad322016-07-22 15:55:13 -07001132{
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001133 if (size < minFlattenedSize()) {
Brian Andersonbaaad322016-07-22 15:55:13 -07001134 return NO_MEMORY;
1135 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001136
Brian Andersonbaaad322016-07-22 15:55:13 -07001137 FlattenableUtils::read(buffer, size, width);
1138 FlattenableUtils::read(buffer, size, height);
1139 FlattenableUtils::read(buffer, size, transformHint);
1140 FlattenableUtils::read(buffer, size, numPendingBuffers);
1141 FlattenableUtils::read(buffer, size, nextFrameNumber);
Shuzhen Wang22f842b2017-01-18 23:02:36 -08001142 FlattenableUtils::read(buffer, size, bufferReplaced);
Brian Andersonbaaad322016-07-22 15:55:13 -07001143
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001144 return frameTimestamps.unflatten(buffer, size, fds, count);
Brian Andersonbaaad322016-07-22 15:55:13 -07001145}
1146
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001147}; // namespace android