blob: 6c485341e5f8d709af09b79b1897ff0d6a55ddcb [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
Jiyong Parka75d3d62018-04-09 12:16:30 +090030#ifndef NO_BUFFERHUB
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -080031#include <gui/BufferHubProducer.h>
Jiyong Parka75d3d62018-04-09 12:16:30 +090032#endif
Pawin Vongmasae672cd02019-02-14 16:01:29 -080033
34#include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h>
35#include <gui/bufferqueue/2.0/H2BGraphicBufferProducer.h>
Chia-I Wuc79a2962017-05-15 10:32:27 -070036#include <gui/BufferQueueDefs.h>
Andy McFadden2adaf042012-12-18 09:49:45 -080037#include <gui/IGraphicBufferProducer.h>
Dan Stozaf0eaf252014-03-21 13:05:51 -070038#include <gui/IProducerListener.h>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080039
40namespace android {
41// ----------------------------------------------------------------------------
42
Pawin Vongmasae672cd02019-02-14 16:01:29 -080043using H2BGraphicBufferProducerV1_0 =
44 ::android::hardware::graphics::bufferqueue::V1_0::utils::
45 H2BGraphicBufferProducer;
46using H2BGraphicBufferProducerV2_0 =
47 ::android::hardware::graphics::bufferqueue::V2_0::utils::
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -080048 H2BGraphicBufferProducer;
49
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080050enum {
51 REQUEST_BUFFER = IBinder::FIRST_CALL_TRANSACTION,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080052 DEQUEUE_BUFFER,
Dan Stoza9f3053d2014-03-06 15:14:33 -080053 DETACH_BUFFER,
Dan Stozad9822a32014-03-28 15:25:31 -070054 DETACH_NEXT_BUFFER,
Dan Stoza9f3053d2014-03-06 15:14:33 -080055 ATTACH_BUFFER,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080056 QUEUE_BUFFER,
57 CANCEL_BUFFER,
Mathias Agopianeafabcd2011-04-20 14:20:59 -070058 QUERY,
Jamie Gennisfe0a87b2011-07-13 19:12:20 -070059 CONNECT,
60 DISCONNECT,
Jesse Hall399184a2014-03-03 15:42:54 -080061 SET_SIDEBAND_STREAM,
Dan Stoza29a3e902014-06-20 13:13:57 -070062 ALLOCATE_BUFFERS,
Dan Stoza9de72932015-04-16 17:28:43 -070063 ALLOW_ALLOCATION,
Dan Stoza812ed062015-06-02 15:45:22 -070064 SET_GENERATION_NUMBER,
Dan Stozac6f30bd2015-06-08 09:32:50 -070065 GET_CONSUMER_NAME,
Pablo Ceballosfa455352015-08-12 17:47:47 -070066 SET_MAX_DEQUEUED_BUFFER_COUNT,
Dan Stoza7dde5992015-05-22 09:51:44 -070067 SET_ASYNC_MODE,
Pablo Ceballos3559fbf2016-03-17 15:50:23 -070068 SET_SHARED_BUFFER_MODE,
Pablo Ceballosff95aab2016-01-13 17:09:58 -080069 SET_AUTO_REFRESH,
Dan Stoza127fc632015-06-30 13:43:32 -070070 SET_DEQUEUE_TIMEOUT,
Dan Stoza50101d02016-04-07 16:53:23 -070071 GET_LAST_QUEUED_BUFFER,
Pablo Ceballosfc352582016-06-30 17:22:20 -070072 GET_FRAME_TIMESTAMPS,
Chia-I Wue2786ea2017-08-07 10:36:08 -070073 GET_UNIQUE_ID,
74 GET_CONSUMER_USAGE,
Sungtak Lee3249fb62019-03-02 16:40:47 -080075 SET_LEGACY_BUFFER_DROP,
Yiwei Zhang538cedc2019-06-24 19:35:03 -070076 SET_AUTO_PREROTATION,
John Reckf0f13e82021-05-18 00:42:56 -040077 GET_LAST_QUEUED_BUFFER2,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080078};
79
Andy McFadden2adaf042012-12-18 09:49:45 -080080class BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080081{
82public:
Chih-Hung Hsiehe2347b72016-04-25 15:41:05 -070083 explicit BpGraphicBufferProducer(const sp<IBinder>& impl)
Andy McFadden2adaf042012-12-18 09:49:45 -080084 : BpInterface<IGraphicBufferProducer>(impl)
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080085 {
86 }
87
Yi Kongca038512017-05-02 16:55:24 -070088 ~BpGraphicBufferProducer() override;
Dan Stoza3be1c6b2014-11-18 10:24:03 -080089
Jamie Gennis7b305ff2011-07-19 12:08:33 -070090 virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080091 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -080092 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080093 data.writeInt32(bufferIdx);
Jamie Gennis8a29ff22011-10-14 15:03:17 -070094 status_t result =remote()->transact(REQUEST_BUFFER, data, &reply);
95 if (result != NO_ERROR) {
96 return result;
97 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080098 bool nonNull = reply.readInt32();
99 if (nonNull) {
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700100 *buf = new GraphicBuffer();
Lingyun Zhu2aff7022012-11-20 19:24:35 +0800101 result = reply.read(**buf);
102 if(result != NO_ERROR) {
103 (*buf).clear();
104 return result;
105 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800106 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700107 result = reply.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700108 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800109 }
110
Pablo Ceballosfa455352015-08-12 17:47:47 -0700111 virtual status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) {
112 Parcel data, reply;
113 data.writeInterfaceToken(
114 IGraphicBufferProducer::getInterfaceDescriptor());
115 data.writeInt32(maxDequeuedBuffers);
116 status_t result = remote()->transact(SET_MAX_DEQUEUED_BUFFER_COUNT,
117 data, &reply);
118 if (result != NO_ERROR) {
119 return result;
120 }
121 result = reply.readInt32();
122 return result;
123 }
124
125 virtual status_t setAsyncMode(bool async) {
126 Parcel data, reply;
127 data.writeInterfaceToken(
128 IGraphicBufferProducer::getInterfaceDescriptor());
129 data.writeInt32(async);
130 status_t result = remote()->transact(SET_ASYNC_MODE,
131 data, &reply);
132 if (result != NO_ERROR) {
133 return result;
134 }
135 result = reply.readInt32();
136 return result;
137 }
138
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600139 virtual status_t dequeueBuffer(int* buf, sp<Fence>* fence, uint32_t width, uint32_t height,
140 PixelFormat format, uint64_t usage, uint64_t* outBufferAge,
141 FrameEventHistoryDelta* outTimestamps) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800142 Parcel data, reply;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700143 bool getFrameTimestamps = (outTimestamps != nullptr);
Brian Andersonbaaad322016-07-22 15:55:13 -0700144
Andy McFadden2adaf042012-12-18 09:49:45 -0800145 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800146 data.writeUint32(width);
147 data.writeUint32(height);
148 data.writeInt32(static_cast<int32_t>(format));
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700149 data.writeUint64(usage);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700150 data.writeBool(getFrameTimestamps);
Brian Andersonbaaad322016-07-22 15:55:13 -0700151
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700152 status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply);
153 if (result != NO_ERROR) {
154 return result;
155 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700156
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800157 *buf = reply.readInt32();
Brian Andersonbaaad322016-07-22 15:55:13 -0700158 *fence = new Fence();
159 result = reply.read(**fence);
160 if (result != NO_ERROR) {
161 fence->clear();
162 return result;
Jesse Hallf7857542012-06-14 15:26:33 -0700163 }
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600164 if (outBufferAge) {
165 result = reply.readUint64(outBufferAge);
166 } else {
167 // Read the value even if outBufferAge is nullptr:
168 uint64_t bufferAge;
169 result = reply.readUint64(&bufferAge);
170 }
171 if (result != NO_ERROR) {
172 ALOGE("IGBP::dequeueBuffer failed to read buffer age: %d", result);
173 return result;
174 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700175 if (getFrameTimestamps) {
176 result = reply.read(*outTimestamps);
177 if (result != NO_ERROR) {
178 ALOGE("IGBP::dequeueBuffer failed to read timestamps: %d",
179 result);
180 return result;
181 }
182 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700183 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800184 return result;
185 }
186
Dan Stoza9f3053d2014-03-06 15:14:33 -0800187 virtual status_t detachBuffer(int slot) {
188 Parcel data, reply;
189 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
190 data.writeInt32(slot);
191 status_t result = remote()->transact(DETACH_BUFFER, data, &reply);
192 if (result != NO_ERROR) {
193 return result;
194 }
195 result = reply.readInt32();
196 return result;
197 }
198
Dan Stozad9822a32014-03-28 15:25:31 -0700199 virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer,
200 sp<Fence>* outFence) {
Yi Kong48a619f2018-06-05 16:34:59 -0700201 if (outBuffer == nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -0700202 ALOGE("detachNextBuffer: outBuffer must not be NULL");
203 return BAD_VALUE;
Yi Kong48a619f2018-06-05 16:34:59 -0700204 } else if (outFence == nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -0700205 ALOGE("detachNextBuffer: outFence must not be NULL");
206 return BAD_VALUE;
207 }
208 Parcel data, reply;
209 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
210 status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply);
211 if (result != NO_ERROR) {
212 return result;
213 }
214 result = reply.readInt32();
215 if (result == NO_ERROR) {
216 bool nonNull = reply.readInt32();
217 if (nonNull) {
218 *outBuffer = new GraphicBuffer;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700219 result = reply.read(**outBuffer);
220 if (result != NO_ERROR) {
221 outBuffer->clear();
222 return result;
223 }
Dan Stozad9822a32014-03-28 15:25:31 -0700224 }
225 nonNull = reply.readInt32();
226 if (nonNull) {
227 *outFence = new Fence;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700228 result = reply.read(**outFence);
229 if (result != NO_ERROR) {
230 outBuffer->clear();
231 outFence->clear();
232 return result;
233 }
Dan Stozad9822a32014-03-28 15:25:31 -0700234 }
235 }
236 return result;
237 }
238
Dan Stoza9f3053d2014-03-06 15:14:33 -0800239 virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) {
240 Parcel data, reply;
241 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
242 data.write(*buffer.get());
243 status_t result = remote()->transact(ATTACH_BUFFER, data, &reply);
244 if (result != NO_ERROR) {
245 return result;
246 }
Chia-I Wuc79a2962017-05-15 10:32:27 -0700247
Dan Stoza9f3053d2014-03-06 15:14:33 -0800248 *slot = reply.readInt32();
249 result = reply.readInt32();
Chia-I Wuc79a2962017-05-15 10:32:27 -0700250 if (result == NO_ERROR &&
251 (*slot < 0 || *slot >= BufferQueueDefs::NUM_BUFFER_SLOTS)) {
252 ALOGE("attachBuffer returned invalid slot %d", *slot);
253 android_errorWriteLog(0x534e4554, "37478824");
254 return UNKNOWN_ERROR;
255 }
256
Dan Stoza9f3053d2014-03-06 15:14:33 -0800257 return result;
258 }
259
Mathias Agopianf0bc2f12012-04-09 16:14:01 -0700260 virtual status_t queueBuffer(int buf,
261 const QueueBufferInput& input, QueueBufferOutput* output) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800262 Parcel data, reply;
Brian Andersonbaaad322016-07-22 15:55:13 -0700263
Andy McFadden2adaf042012-12-18 09:49:45 -0800264 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800265 data.writeInt32(buf);
Jesse Hallc777b0b2012-06-28 12:52:05 -0700266 data.write(input);
Brian Andersonbaaad322016-07-22 15:55:13 -0700267
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700268 status_t result = remote()->transact(QUEUE_BUFFER, data, &reply);
269 if (result != NO_ERROR) {
270 return result;
271 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700272
273 result = reply.read(*output);
274 if (result != NO_ERROR) {
275 return result;
276 }
277
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700278 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800279 return result;
280 }
281
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700282 virtual status_t cancelBuffer(int buf, const sp<Fence>& fence) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800283 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800284 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800285 data.writeInt32(buf);
Jamie Gennis1df8c342012-12-20 14:05:45 -0800286 data.write(*fence.get());
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700287 status_t result = remote()->transact(CANCEL_BUFFER, data, &reply);
288 if (result != NO_ERROR) {
289 return result;
290 }
291 result = reply.readInt32();
292 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800293 }
294
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700295 virtual int query(int what, int* value) {
296 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800297 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700298 data.writeInt32(what);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700299 status_t result = remote()->transact(QUERY, data, &reply);
300 if (result != NO_ERROR) {
301 return result;
302 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700303 value[0] = reply.readInt32();
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700304 result = reply.readInt32();
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700305 return result;
306 }
307
Dan Stozaf0eaf252014-03-21 13:05:51 -0700308 virtual status_t connect(const sp<IProducerListener>& listener,
Mathias Agopian365857d2013-09-11 19:35:45 -0700309 int api, bool producerControlledByApp, QueueBufferOutput* output) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700310 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800311 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Yi Kong48a619f2018-06-05 16:34:59 -0700312 if (listener != nullptr) {
Dan Stozaf0eaf252014-03-21 13:05:51 -0700313 data.writeInt32(1);
Marco Nelissen097ca272014-11-14 08:01:01 -0800314 data.writeStrongBinder(IInterface::asBinder(listener));
Dan Stozaf0eaf252014-03-21 13:05:51 -0700315 } else {
316 data.writeInt32(0);
317 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700318 data.writeInt32(api);
Mathias Agopian595264f2013-07-16 22:56:09 -0700319 data.writeInt32(producerControlledByApp);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700320 status_t result = remote()->transact(CONNECT, data, &reply);
321 if (result != NO_ERROR) {
322 return result;
323 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700324 reply.read(*output);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700325 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700326 return result;
327 }
Mathias Agopian80727112011-05-02 19:51:12 -0700328
Robert Carr97b9c862016-09-08 13:54:35 -0700329 virtual status_t disconnect(int api, DisconnectMode mode) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700330 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800331 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700332 data.writeInt32(api);
Robert Carr97b9c862016-09-08 13:54:35 -0700333 data.writeInt32(static_cast<int32_t>(mode));
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700334 status_t result =remote()->transact(DISCONNECT, data, &reply);
335 if (result != NO_ERROR) {
336 return result;
337 }
338 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700339 return result;
340 }
Jesse Hall399184a2014-03-03 15:42:54 -0800341
342 virtual status_t setSidebandStream(const sp<NativeHandle>& stream) {
343 Parcel data, reply;
344 status_t result;
345 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
346 if (stream.get()) {
347 data.writeInt32(true);
348 data.writeNativeHandle(stream->handle());
349 } else {
350 data.writeInt32(false);
351 }
352 if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) {
353 result = reply.readInt32();
354 }
355 return result;
356 }
Dan Stoza29a3e902014-06-20 13:13:57 -0700357
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700358 virtual void allocateBuffers(uint32_t width, uint32_t height,
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700359 PixelFormat format, uint64_t usage) {
Dan Stoza29a3e902014-06-20 13:13:57 -0700360 Parcel data, reply;
361 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800362 data.writeUint32(width);
363 data.writeUint32(height);
Dan Stoza29a3e902014-06-20 13:13:57 -0700364 data.writeInt32(static_cast<int32_t>(format));
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700365 data.writeUint64(usage);
Steven Moreland366eb422019-04-01 19:22:32 -0700366 status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply, IBinder::FLAG_ONEWAY);
Dan Stoza29a3e902014-06-20 13:13:57 -0700367 if (result != NO_ERROR) {
368 ALOGE("allocateBuffers failed to transact: %d", result);
369 }
370 }
Dan Stoza9de72932015-04-16 17:28:43 -0700371
372 virtual status_t allowAllocation(bool allow) {
373 Parcel data, reply;
374 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
375 data.writeInt32(static_cast<int32_t>(allow));
376 status_t result = remote()->transact(ALLOW_ALLOCATION, data, &reply);
377 if (result != NO_ERROR) {
378 return result;
379 }
380 result = reply.readInt32();
381 return result;
382 }
Dan Stoza812ed062015-06-02 15:45:22 -0700383
384 virtual status_t setGenerationNumber(uint32_t generationNumber) {
385 Parcel data, reply;
386 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
387 data.writeUint32(generationNumber);
388 status_t result = remote()->transact(SET_GENERATION_NUMBER, data, &reply);
389 if (result == NO_ERROR) {
390 result = reply.readInt32();
391 }
392 return result;
393 }
Dan Stozac6f30bd2015-06-08 09:32:50 -0700394
395 virtual String8 getConsumerName() const {
396 Parcel data, reply;
397 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
398 status_t result = remote()->transact(GET_CONSUMER_NAME, data, &reply);
399 if (result != NO_ERROR) {
400 ALOGE("getConsumerName failed to transact: %d", result);
401 return String8("TransactFailed");
402 }
403 return reply.readString8();
404 }
Dan Stoza7dde5992015-05-22 09:51:44 -0700405
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700406 virtual status_t setSharedBufferMode(bool sharedBufferMode) {
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700407 Parcel data, reply;
408 data.writeInterfaceToken(
409 IGraphicBufferProducer::getInterfaceDescriptor());
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700410 data.writeInt32(sharedBufferMode);
411 status_t result = remote()->transact(SET_SHARED_BUFFER_MODE, data,
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700412 &reply);
413 if (result == NO_ERROR) {
414 result = reply.readInt32();
415 }
416 return result;
417 }
Dan Stoza127fc632015-06-30 13:43:32 -0700418
Pablo Ceballosff95aab2016-01-13 17:09:58 -0800419 virtual status_t setAutoRefresh(bool autoRefresh) {
420 Parcel data, reply;
421 data.writeInterfaceToken(
422 IGraphicBufferProducer::getInterfaceDescriptor());
423 data.writeInt32(autoRefresh);
424 status_t result = remote()->transact(SET_AUTO_REFRESH, data, &reply);
425 if (result == NO_ERROR) {
426 result = reply.readInt32();
427 }
428 return result;
429 }
430
Dan Stoza127fc632015-06-30 13:43:32 -0700431 virtual status_t setDequeueTimeout(nsecs_t timeout) {
432 Parcel data, reply;
433 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
434 data.writeInt64(timeout);
435 status_t result = remote()->transact(SET_DEQUEUE_TIMEOUT, data, &reply);
436 if (result != NO_ERROR) {
437 ALOGE("setDequeueTimeout failed to transact: %d", result);
438 return result;
439 }
440 return reply.readInt32();
441 }
Dan Stoza50101d02016-04-07 16:53:23 -0700442
Sungtak Lee3249fb62019-03-02 16:40:47 -0800443 virtual status_t setLegacyBufferDrop(bool drop) {
444 Parcel data, reply;
445 data.writeInterfaceToken(
446 IGraphicBufferProducer::getInterfaceDescriptor());
447 data.writeInt32(drop);
448 status_t result = remote()->transact(SET_LEGACY_BUFFER_DROP,
449 data, &reply);
450 if (result != NO_ERROR) {
451 return result;
452 }
453 result = reply.readInt32();
454 return result;
455 }
456
Dan Stoza50101d02016-04-07 16:53:23 -0700457 virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer,
John Reck1a61da52016-04-28 13:18:15 -0700458 sp<Fence>* outFence, float outTransformMatrix[16]) override {
Dan Stoza50101d02016-04-07 16:53:23 -0700459 Parcel data, reply;
460 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
461 status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER, data,
462 &reply);
463 if (result != NO_ERROR) {
464 ALOGE("getLastQueuedBuffer failed to transact: %d", result);
465 return result;
466 }
467 result = reply.readInt32();
468 if (result != NO_ERROR) {
469 return result;
470 }
John Reckce8e5df2016-04-28 10:12:47 -0700471 bool hasBuffer = reply.readBool();
472 sp<GraphicBuffer> buffer;
473 if (hasBuffer) {
474 buffer = new GraphicBuffer();
475 result = reply.read(*buffer);
John Reck1a61da52016-04-28 13:18:15 -0700476 if (result == NO_ERROR) {
477 result = reply.read(outTransformMatrix, sizeof(float) * 16);
478 }
John Reckce8e5df2016-04-28 10:12:47 -0700479 }
Dan Stoza50101d02016-04-07 16:53:23 -0700480 if (result != NO_ERROR) {
481 ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
482 return result;
483 }
484 sp<Fence> fence(new Fence);
485 result = reply.read(*fence);
486 if (result != NO_ERROR) {
487 ALOGE("getLastQueuedBuffer failed to read fence: %d", result);
488 return result;
489 }
490 *outBuffer = buffer;
491 *outFence = fence;
492 return result;
493 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800494
John Reckf0f13e82021-05-18 00:42:56 -0400495 virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence,
496 Rect* outRect, uint32_t* outTransform) override {
497 Parcel data, reply;
498 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
499 status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER2, data, &reply);
500 if (result != NO_ERROR) {
501 ALOGE("getLastQueuedBuffer failed to transact: %d", result);
502 return result;
503 }
504 status_t remoteError = NO_ERROR;
505 result = reply.readInt32(&remoteError);
506 if (result != NO_ERROR) {
507 ALOGE("getLastQueuedBuffer failed to read status: %d", result);
508 return result;
509 }
510 if (remoteError != NO_ERROR) {
511 return remoteError;
512 }
513 bool hasBuffer = false;
514 result = reply.readBool(&hasBuffer);
515 if (result != NO_ERROR) {
516 ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
517 return result;
518 }
519 sp<GraphicBuffer> buffer;
520 if (hasBuffer) {
521 buffer = new GraphicBuffer();
522 result = reply.read(*buffer);
523 if (result == NO_ERROR) {
524 result = reply.read(*outRect);
525 }
526 if (result == NO_ERROR) {
527 result = reply.readUint32(outTransform);
528 }
529 }
530 if (result != NO_ERROR) {
531 ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
532 return result;
533 }
534 sp<Fence> fence(new Fence);
535 result = reply.read(*fence);
536 if (result != NO_ERROR) {
537 ALOGE("getLastQueuedBuffer failed to read fence: %d", result);
538 return result;
539 }
540 *outBuffer = buffer;
541 *outFence = fence;
542 return result;
543 }
544
Brian Anderson3890c392016-07-25 12:48:08 -0700545 virtual void getFrameTimestamps(FrameEventHistoryDelta* outDelta) {
Pablo Ceballosce796e72016-02-04 19:10:51 -0800546 Parcel data, reply;
547 status_t result = data.writeInterfaceToken(
548 IGraphicBufferProducer::getInterfaceDescriptor());
549 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700550 ALOGE("IGBP::getFrameTimestamps failed to write token: %d", result);
551 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800552 }
553 result = remote()->transact(GET_FRAME_TIMESTAMPS, data, &reply);
554 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700555 ALOGE("IGBP::getFrameTimestamps failed to transact: %d", result);
556 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800557 }
Brian Anderson3890c392016-07-25 12:48:08 -0700558 result = reply.read(*outDelta);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800559 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700560 ALOGE("IGBP::getFrameTimestamps failed to read timestamps: %d",
561 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800562 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800563 }
Pablo Ceballos6155b402016-06-30 17:01:49 -0700564
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -0700565 virtual status_t getUniqueId(uint64_t* outId) const {
566 Parcel data, reply;
567 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
568 status_t result = remote()->transact(GET_UNIQUE_ID, data, &reply);
569 if (result != NO_ERROR) {
570 ALOGE("getUniqueId failed to transact: %d", result);
571 }
572 status_t actualResult = NO_ERROR;
573 result = reply.readInt32(&actualResult);
574 if (result != NO_ERROR) {
575 return result;
576 }
577 result = reply.readUint64(outId);
578 if (result != NO_ERROR) {
579 return result;
580 }
581 return actualResult;
582 }
Chia-I Wue2786ea2017-08-07 10:36:08 -0700583
584 virtual status_t getConsumerUsage(uint64_t* outUsage) const {
585 Parcel data, reply;
586 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
587 status_t result = remote()->transact(GET_CONSUMER_USAGE, data, &reply);
588 if (result != NO_ERROR) {
589 ALOGE("getConsumerUsage failed to transact: %d", result);
590 }
591 status_t actualResult = NO_ERROR;
592 result = reply.readInt32(&actualResult);
593 if (result != NO_ERROR) {
594 return result;
595 }
596 result = reply.readUint64(outUsage);
597 if (result != NO_ERROR) {
598 return result;
599 }
600 return actualResult;
601 }
Yiwei Zhang538cedc2019-06-24 19:35:03 -0700602
603 virtual status_t setAutoPrerotation(bool autoPrerotation) {
604 Parcel data, reply;
605 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
606 data.writeBool(autoPrerotation);
607 status_t result = remote()->transact(SET_AUTO_PREROTATION, data, &reply);
608 if (result == NO_ERROR) {
609 result = reply.readInt32();
610 }
611 return result;
612 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800613};
614
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800615// Out-of-line virtual method definition to trigger vtable emission in this
616// translation unit (see clang warning -Wweak-vtables)
617BpGraphicBufferProducer::~BpGraphicBufferProducer() {}
618
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800619class HpGraphicBufferProducer : public HpInterface<
Pawin Vongmasae672cd02019-02-14 16:01:29 -0800620 BpGraphicBufferProducer,
621 H2BGraphicBufferProducerV1_0,
622 H2BGraphicBufferProducerV2_0> {
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800623public:
Chih-Hung Hsiehaaf62162018-12-20 15:45:04 -0800624 explicit HpGraphicBufferProducer(const sp<IBinder>& base) : PBase(base) {}
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800625
626 status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) override {
627 return mBase->requestBuffer(slot, buf);
628 }
629
630 status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) override {
631 return mBase->setMaxDequeuedBufferCount(maxDequeuedBuffers);
632 }
633
634 status_t setAsyncMode(bool async) override {
635 return mBase->setAsyncMode(async);
636 }
637
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600638 status_t dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w, uint32_t h, PixelFormat format,
639 uint64_t usage, uint64_t* outBufferAge,
640 FrameEventHistoryDelta* outTimestamps) override {
641 return mBase->dequeueBuffer(slot, fence, w, h, format, usage, outBufferAge, outTimestamps);
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800642 }
643
644 status_t detachBuffer(int slot) override {
645 return mBase->detachBuffer(slot);
646 }
647
648 status_t detachNextBuffer(
649 sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) override {
650 return mBase->detachNextBuffer(outBuffer, outFence);
651 }
652
653 status_t attachBuffer(
654 int* outSlot, const sp<GraphicBuffer>& buffer) override {
655 return mBase->attachBuffer(outSlot, buffer);
656 }
657
658 status_t queueBuffer(
659 int slot,
660 const QueueBufferInput& input,
661 QueueBufferOutput* output) override {
662 return mBase->queueBuffer(slot, input, output);
663 }
664
665 status_t cancelBuffer(int slot, const sp<Fence>& fence) override {
666 return mBase->cancelBuffer(slot, fence);
667 }
668
669 int query(int what, int* value) override {
670 return mBase->query(what, value);
671 }
672
673 status_t connect(
674 const sp<IProducerListener>& listener,
675 int api, bool producerControlledByApp,
676 QueueBufferOutput* output) override {
677 return mBase->connect(listener, api, producerControlledByApp, output);
678 }
679
680 status_t disconnect(
681 int api, DisconnectMode mode = DisconnectMode::Api) override {
682 return mBase->disconnect(api, mode);
683 }
684
685 status_t setSidebandStream(const sp<NativeHandle>& stream) override {
686 return mBase->setSidebandStream(stream);
687 }
688
689 void allocateBuffers(uint32_t width, uint32_t height,
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700690 PixelFormat format, uint64_t usage) override {
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800691 return mBase->allocateBuffers(width, height, format, usage);
692 }
693
694 status_t allowAllocation(bool allow) override {
695 return mBase->allowAllocation(allow);
696 }
697
698 status_t setGenerationNumber(uint32_t generationNumber) override {
699 return mBase->setGenerationNumber(generationNumber);
700 }
701
702 String8 getConsumerName() const override {
703 return mBase->getConsumerName();
704 }
705
706 status_t setSharedBufferMode(bool sharedBufferMode) override {
707 return mBase->setSharedBufferMode(sharedBufferMode);
708 }
709
710 status_t setAutoRefresh(bool autoRefresh) override {
711 return mBase->setAutoRefresh(autoRefresh);
712 }
713
714 status_t setDequeueTimeout(nsecs_t timeout) override {
715 return mBase->setDequeueTimeout(timeout);
716 }
717
Sungtak Lee3249fb62019-03-02 16:40:47 -0800718 status_t setLegacyBufferDrop(bool drop) override {
719 return mBase->setLegacyBufferDrop(drop);
720 }
721
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800722 status_t getLastQueuedBuffer(
723 sp<GraphicBuffer>* outBuffer,
724 sp<Fence>* outFence,
725 float outTransformMatrix[16]) override {
726 return mBase->getLastQueuedBuffer(
727 outBuffer, outFence, outTransformMatrix);
728 }
729
John Reckf0f13e82021-05-18 00:42:56 -0400730 status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence, Rect* outRect,
731 uint32_t* outTransform) override {
732 return mBase->getLastQueuedBuffer(outBuffer, outFence, outRect, outTransform);
733 }
734
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800735 void getFrameTimestamps(FrameEventHistoryDelta* outDelta) override {
736 return mBase->getFrameTimestamps(outDelta);
737 }
738
739 status_t getUniqueId(uint64_t* outId) const override {
740 return mBase->getUniqueId(outId);
741 }
Chia-I Wue2786ea2017-08-07 10:36:08 -0700742
743 status_t getConsumerUsage(uint64_t* outUsage) const override {
744 return mBase->getConsumerUsage(outUsage);
745 }
Yiwei Zhang538cedc2019-06-24 19:35:03 -0700746
747 status_t setAutoPrerotation(bool autoPrerotation) override {
748 return mBase->setAutoPrerotation(autoPrerotation);
749 }
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800750};
751
Pawin Vongmasa338b81d2019-01-31 05:20:07 -0800752IMPLEMENT_HYBRID_META_INTERFACE(GraphicBufferProducer,
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800753 "android.gui.IGraphicBufferProducer");
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800754
755// ----------------------------------------------------------------------
756
Sungtak Lee3249fb62019-03-02 16:40:47 -0800757status_t IGraphicBufferProducer::setLegacyBufferDrop(bool drop) {
758 // No-op for IGBP other than BufferQueue.
759 (void) drop;
760 return INVALID_OPERATION;
761}
762
Yiwei Zhang538cedc2019-06-24 19:35:03 -0700763status_t IGraphicBufferProducer::setAutoPrerotation(bool autoPrerotation) {
764 // No-op for IGBP other than BufferQueue.
765 (void)autoPrerotation;
766 return INVALID_OPERATION;
767}
768
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -0800769status_t IGraphicBufferProducer::exportToParcel(Parcel* parcel) {
770 status_t res = OK;
771 res = parcel->writeUint32(USE_BUFFER_QUEUE);
772 if (res != NO_ERROR) {
773 ALOGE("exportToParcel: Cannot write magic, res=%d.", res);
774 return res;
775 }
776
777 return parcel->writeStrongBinder(IInterface::asBinder(this));
778}
779
780/* static */
781status_t IGraphicBufferProducer::exportToParcel(const sp<IGraphicBufferProducer>& producer,
782 Parcel* parcel) {
783 if (parcel == nullptr) {
784 ALOGE("exportToParcel: Invalid parcel object.");
785 return BAD_VALUE;
786 }
787
788 if (producer == nullptr) {
789 status_t res = OK;
790 res = parcel->writeUint32(IGraphicBufferProducer::USE_BUFFER_QUEUE);
791 if (res != NO_ERROR) return res;
792 return parcel->writeStrongBinder(nullptr);
793 } else {
794 return producer->exportToParcel(parcel);
795 }
796}
797
798/* static */
799sp<IGraphicBufferProducer> IGraphicBufferProducer::createFromParcel(const Parcel* parcel) {
800 uint32_t outMagic = 0;
801 status_t res = NO_ERROR;
802
803 res = parcel->readUint32(&outMagic);
804 if (res != NO_ERROR) {
805 ALOGE("createFromParcel: Failed to read magic, error=%d.", res);
806 return nullptr;
807 }
808
809 switch (outMagic) {
810 case USE_BUFFER_QUEUE: {
811 sp<IBinder> binder;
812 res = parcel->readNullableStrongBinder(&binder);
813 if (res != NO_ERROR) {
814 ALOGE("createFromParcel: Can't read strong binder.");
815 return nullptr;
816 }
817 return interface_cast<IGraphicBufferProducer>(binder);
818 }
819 case USE_BUFFER_HUB: {
820 ALOGE("createFromParcel: BufferHub not implemented.");
Jiyong Parka75d3d62018-04-09 12:16:30 +0900821#ifndef NO_BUFFERHUB
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -0800822 dvr::ProducerQueueParcelable producerParcelable;
823 res = producerParcelable.readFromParcel(parcel);
824 if (res != NO_ERROR) {
825 ALOGE("createFromParcel: Failed to read from parcel, error=%d", res);
826 return nullptr;
827 }
828 return BufferHubProducer::Create(std::move(producerParcelable));
Jiyong Parka75d3d62018-04-09 12:16:30 +0900829#else
830 return nullptr;
831#endif
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -0800832 }
833 default: {
834 ALOGE("createFromParcel: Unexpected mgaic: 0x%x.", outMagic);
835 return nullptr;
836 }
837 }
838}
839
840// ----------------------------------------------------------------------------
841
Andy McFadden2adaf042012-12-18 09:49:45 -0800842status_t BnGraphicBufferProducer::onTransact(
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800843 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
844{
845 switch(code) {
846 case REQUEST_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800847 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800848 int bufferIdx = data.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700849 sp<GraphicBuffer> buffer;
850 int result = requestBuffer(bufferIdx, &buffer);
Yi Kong48a619f2018-06-05 16:34:59 -0700851 reply->writeInt32(buffer != nullptr);
852 if (buffer != nullptr) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800853 reply->write(*buffer);
854 }
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700855 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800856 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800857 }
Pablo Ceballosfa455352015-08-12 17:47:47 -0700858 case SET_MAX_DEQUEUED_BUFFER_COUNT: {
859 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
860 int maxDequeuedBuffers = data.readInt32();
861 int result = setMaxDequeuedBufferCount(maxDequeuedBuffers);
862 reply->writeInt32(result);
863 return NO_ERROR;
864 }
865 case SET_ASYNC_MODE: {
866 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
867 bool async = data.readInt32();
868 int result = setAsyncMode(async);
869 reply->writeInt32(result);
870 return NO_ERROR;
871 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800872 case DEQUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800873 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800874 uint32_t width = data.readUint32();
875 uint32_t height = data.readUint32();
876 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700877 uint64_t usage = data.readUint64();
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600878 uint64_t bufferAge = 0;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700879 bool getTimestamps = data.readBool();
Brian Andersonbaaad322016-07-22 15:55:13 -0700880
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700881 int buf = 0;
Brian Andersonbaaad322016-07-22 15:55:13 -0700882 sp<Fence> fence = Fence::NO_FENCE;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700883 FrameEventHistoryDelta frameTimestamps;
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600884 int result = dequeueBuffer(&buf, &fence, width, height, format, usage, &bufferAge,
885 getTimestamps ? &frameTimestamps : nullptr);
Brian Andersonbaaad322016-07-22 15:55:13 -0700886
Tobin Ehlis209e5fb2019-03-26 14:06:29 -0600887 if (fence == nullptr) {
888 ALOGE("dequeueBuffer returned a NULL fence, setting to Fence::NO_FENCE");
889 fence = Fence::NO_FENCE;
890 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800891 reply->writeInt32(buf);
Brian Andersonbaaad322016-07-22 15:55:13 -0700892 reply->write(*fence);
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600893 reply->writeUint64(bufferAge);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700894 if (getTimestamps) {
895 reply->write(frameTimestamps);
896 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800897 reply->writeInt32(result);
898 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800899 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800900 case DETACH_BUFFER: {
901 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
902 int slot = data.readInt32();
903 int result = detachBuffer(slot);
904 reply->writeInt32(result);
905 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800906 }
Dan Stozad9822a32014-03-28 15:25:31 -0700907 case DETACH_NEXT_BUFFER: {
908 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
909 sp<GraphicBuffer> buffer;
910 sp<Fence> fence;
911 int32_t result = detachNextBuffer(&buffer, &fence);
912 reply->writeInt32(result);
913 if (result == NO_ERROR) {
Yi Kong48a619f2018-06-05 16:34:59 -0700914 reply->writeInt32(buffer != nullptr);
915 if (buffer != nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -0700916 reply->write(*buffer);
917 }
Yi Kong48a619f2018-06-05 16:34:59 -0700918 reply->writeInt32(fence != nullptr);
919 if (fence != nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -0700920 reply->write(*fence);
921 }
922 }
923 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800924 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800925 case ATTACH_BUFFER: {
926 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
927 sp<GraphicBuffer> buffer = new GraphicBuffer();
Pablo Ceballos70636b32016-07-06 15:24:54 -0700928 status_t result = data.read(*buffer.get());
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700929 int slot = 0;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700930 if (result == NO_ERROR) {
931 result = attachBuffer(&slot, buffer);
932 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800933 reply->writeInt32(slot);
934 reply->writeInt32(result);
935 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800936 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800937 case QUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800938 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700939
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800940 int buf = data.readInt32();
Jesse Hallc777b0b2012-06-28 12:52:05 -0700941 QueueBufferInput input(data);
Brian Andersonbaaad322016-07-22 15:55:13 -0700942 QueueBufferOutput output;
943 status_t result = queueBuffer(buf, input, &output);
Brian Andersonbaaad322016-07-22 15:55:13 -0700944 reply->write(output);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800945 reply->writeInt32(result);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700946
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800947 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800948 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800949 case CANCEL_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800950 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800951 int buf = data.readInt32();
Jamie Gennis1df8c342012-12-20 14:05:45 -0800952 sp<Fence> fence = new Fence();
Pablo Ceballos70636b32016-07-06 15:24:54 -0700953 status_t result = data.read(*fence.get());
954 if (result == NO_ERROR) {
955 result = cancelBuffer(buf, fence);
956 }
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700957 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800958 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800959 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700960 case QUERY: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800961 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700962 int value = 0;
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700963 int what = data.readInt32();
964 int res = query(what, &value);
965 reply->writeInt32(value);
966 reply->writeInt32(res);
967 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800968 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700969 case CONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800970 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stozaf0eaf252014-03-21 13:05:51 -0700971 sp<IProducerListener> listener;
972 if (data.readInt32() == 1) {
973 listener = IProducerListener::asInterface(data.readStrongBinder());
974 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700975 int api = data.readInt32();
Mathias Agopian595264f2013-07-16 22:56:09 -0700976 bool producerControlledByApp = data.readInt32();
Brian Andersonbaaad322016-07-22 15:55:13 -0700977 QueueBufferOutput output;
978 status_t res = connect(listener, api, producerControlledByApp, &output);
979 reply->write(output);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700980 reply->writeInt32(res);
981 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800982 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700983 case DISCONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800984 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700985 int api = data.readInt32();
Robert Carr97b9c862016-09-08 13:54:35 -0700986 DisconnectMode mode = static_cast<DisconnectMode>(data.readInt32());
987 status_t res = disconnect(api, mode);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700988 reply->writeInt32(res);
989 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800990 }
Jesse Hall399184a2014-03-03 15:42:54 -0800991 case SET_SIDEBAND_STREAM: {
992 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
993 sp<NativeHandle> stream;
994 if (data.readInt32()) {
Wonsik Kim0ec54e12014-03-21 10:46:24 +0900995 stream = NativeHandle::create(data.readNativeHandle(), true);
Jesse Hall399184a2014-03-03 15:42:54 -0800996 }
997 status_t result = setSidebandStream(stream);
998 reply->writeInt32(result);
999 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001000 }
Dan Stoza9de72932015-04-16 17:28:43 -07001001 case ALLOCATE_BUFFERS: {
Dan Stoza29a3e902014-06-20 13:13:57 -07001002 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001003 uint32_t width = data.readUint32();
1004 uint32_t height = data.readUint32();
1005 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
Mathias Agopiancb496ac2017-05-22 14:21:00 -07001006 uint64_t usage = data.readUint64();
Pablo Ceballos567dbbb2015-08-26 18:59:08 -07001007 allocateBuffers(width, height, format, usage);
Dan Stoza29a3e902014-06-20 13:13:57 -07001008 return NO_ERROR;
Dan Stoza9de72932015-04-16 17:28:43 -07001009 }
1010 case ALLOW_ALLOCATION: {
1011 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1012 bool allow = static_cast<bool>(data.readInt32());
1013 status_t result = allowAllocation(allow);
1014 reply->writeInt32(result);
1015 return NO_ERROR;
1016 }
Dan Stoza812ed062015-06-02 15:45:22 -07001017 case SET_GENERATION_NUMBER: {
1018 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1019 uint32_t generationNumber = data.readUint32();
1020 status_t result = setGenerationNumber(generationNumber);
1021 reply->writeInt32(result);
1022 return NO_ERROR;
1023 }
Dan Stozac6f30bd2015-06-08 09:32:50 -07001024 case GET_CONSUMER_NAME: {
1025 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1026 reply->writeString8(getConsumerName());
1027 return NO_ERROR;
1028 }
Pablo Ceballos3559fbf2016-03-17 15:50:23 -07001029 case SET_SHARED_BUFFER_MODE: {
Pablo Ceballosccdfd602015-10-07 15:05:45 -07001030 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Pablo Ceballos3559fbf2016-03-17 15:50:23 -07001031 bool sharedBufferMode = data.readInt32();
1032 status_t result = setSharedBufferMode(sharedBufferMode);
Pablo Ceballosccdfd602015-10-07 15:05:45 -07001033 reply->writeInt32(result);
1034 return NO_ERROR;
1035 }
Pablo Ceballosff95aab2016-01-13 17:09:58 -08001036 case SET_AUTO_REFRESH: {
1037 CHECK_INTERFACE(IGraphicBuffer, data, reply);
1038 bool autoRefresh = data.readInt32();
1039 status_t result = setAutoRefresh(autoRefresh);
1040 reply->writeInt32(result);
1041 return NO_ERROR;
1042 }
Dan Stoza127fc632015-06-30 13:43:32 -07001043 case SET_DEQUEUE_TIMEOUT: {
1044 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1045 nsecs_t timeout = data.readInt64();
1046 status_t result = setDequeueTimeout(timeout);
1047 reply->writeInt32(result);
1048 return NO_ERROR;
1049 }
Dan Stoza50101d02016-04-07 16:53:23 -07001050 case GET_LAST_QUEUED_BUFFER: {
1051 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1052 sp<GraphicBuffer> buffer(nullptr);
1053 sp<Fence> fence(Fence::NO_FENCE);
John Reck1a61da52016-04-28 13:18:15 -07001054 float transform[16] = {};
1055 status_t result = getLastQueuedBuffer(&buffer, &fence, transform);
Dan Stoza50101d02016-04-07 16:53:23 -07001056 reply->writeInt32(result);
1057 if (result != NO_ERROR) {
1058 return result;
1059 }
John Reckce8e5df2016-04-28 10:12:47 -07001060 if (!buffer.get()) {
1061 reply->writeBool(false);
1062 } else {
1063 reply->writeBool(true);
1064 result = reply->write(*buffer);
John Reck1a61da52016-04-28 13:18:15 -07001065 if (result == NO_ERROR) {
1066 reply->write(transform, sizeof(float) * 16);
1067 }
John Reckce8e5df2016-04-28 10:12:47 -07001068 }
Dan Stoza50101d02016-04-07 16:53:23 -07001069 if (result != NO_ERROR) {
1070 ALOGE("getLastQueuedBuffer failed to write buffer: %d", result);
1071 return result;
1072 }
Tobin Ehlis209e5fb2019-03-26 14:06:29 -06001073 if (fence == nullptr) {
1074 ALOGE("getLastQueuedBuffer returned a NULL fence, setting to Fence::NO_FENCE");
1075 fence = Fence::NO_FENCE;
1076 }
Dan Stoza50101d02016-04-07 16:53:23 -07001077 result = reply->write(*fence);
1078 if (result != NO_ERROR) {
1079 ALOGE("getLastQueuedBuffer failed to write fence: %d", result);
1080 return result;
1081 }
1082 return NO_ERROR;
1083 }
John Reckf0f13e82021-05-18 00:42:56 -04001084 case GET_LAST_QUEUED_BUFFER2: {
1085 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1086 sp<GraphicBuffer> buffer(nullptr);
1087 sp<Fence> fence(Fence::NO_FENCE);
1088 Rect crop;
1089 uint32_t transform;
1090 status_t result = getLastQueuedBuffer(&buffer, &fence, &crop, &transform);
1091 reply->writeInt32(result);
1092 if (result != NO_ERROR) {
1093 return result;
1094 }
1095 if (!buffer.get()) {
1096 reply->writeBool(false);
1097 } else {
1098 reply->writeBool(true);
1099 result = reply->write(*buffer);
1100 if (result == NO_ERROR) {
1101 result = reply->write(crop);
1102 }
1103 if (result == NO_ERROR) {
1104 result = reply->writeUint32(transform);
1105 }
1106 }
1107 if (result != NO_ERROR) {
1108 ALOGE("getLastQueuedBuffer failed to write buffer: %d", result);
1109 return result;
1110 }
1111 if (fence == nullptr) {
1112 ALOGE("getLastQueuedBuffer returned a NULL fence, setting to Fence::NO_FENCE");
1113 fence = Fence::NO_FENCE;
1114 }
1115 result = reply->write(*fence);
1116 if (result != NO_ERROR) {
1117 ALOGE("getLastQueuedBuffer failed to write fence: %d", result);
1118 return result;
1119 }
1120 return NO_ERROR;
1121 }
1122
Pablo Ceballosce796e72016-02-04 19:10:51 -08001123 case GET_FRAME_TIMESTAMPS: {
1124 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson3890c392016-07-25 12:48:08 -07001125 FrameEventHistoryDelta frameTimestamps;
1126 getFrameTimestamps(&frameTimestamps);
1127 status_t result = reply->write(frameTimestamps);
Pablo Ceballosce796e72016-02-04 19:10:51 -08001128 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -07001129 ALOGE("BnGBP::GET_FRAME_TIMESTAMPS failed to write buffer: %d",
1130 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -08001131 return result;
1132 }
Pablo Ceballosce796e72016-02-04 19:10:51 -08001133 return NO_ERROR;
1134 }
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -07001135 case GET_UNIQUE_ID: {
1136 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1137 uint64_t outId = 0;
1138 status_t actualResult = getUniqueId(&outId);
1139 status_t result = reply->writeInt32(actualResult);
1140 if (result != NO_ERROR) {
1141 return result;
1142 }
1143 result = reply->writeUint64(outId);
1144 if (result != NO_ERROR) {
1145 return result;
1146 }
1147 return NO_ERROR;
1148 }
Chia-I Wue2786ea2017-08-07 10:36:08 -07001149 case GET_CONSUMER_USAGE: {
1150 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1151 uint64_t outUsage = 0;
1152 status_t actualResult = getConsumerUsage(&outUsage);
1153 status_t result = reply->writeInt32(actualResult);
1154 if (result != NO_ERROR) {
1155 return result;
1156 }
1157 result = reply->writeUint64(outUsage);
1158 if (result != NO_ERROR) {
1159 return result;
1160 }
1161 return NO_ERROR;
1162 }
Sungtak Lee3249fb62019-03-02 16:40:47 -08001163 case SET_LEGACY_BUFFER_DROP: {
1164 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1165 bool drop = data.readInt32();
1166 int result = setLegacyBufferDrop(drop);
1167 reply->writeInt32(result);
1168 return NO_ERROR;
1169 }
Yiwei Zhang538cedc2019-06-24 19:35:03 -07001170 case SET_AUTO_PREROTATION: {
1171 CHECK_INTERFACE(IGraphicBuffer, data, reply);
1172 bool autoPrerotation = data.readBool();
1173 status_t result = setAutoPrerotation(autoPrerotation);
1174 reply->writeInt32(result);
1175 return NO_ERROR;
1176 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001177 }
1178 return BBinder::onTransact(code, data, reply, flags);
1179}
1180
1181// ----------------------------------------------------------------------------
1182
Andy McFadden2adaf042012-12-18 09:49:45 -08001183IGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) {
Jesse Hallc777b0b2012-06-28 12:52:05 -07001184 parcel.read(*this);
1185}
1186
Brian Andersonbaaad322016-07-22 15:55:13 -07001187
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001188}; // namespace android