blob: 7b5596e43ce5faca7dea235ee276949c48c0bb3a [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,
Steven Thomas3172e202020-01-06 19:25:30 -080077 SET_FRAME_RATE,
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
Brian Anderson3890c392016-07-25 12:48:08 -0700495 virtual void getFrameTimestamps(FrameEventHistoryDelta* outDelta) {
Pablo Ceballosce796e72016-02-04 19:10:51 -0800496 Parcel data, reply;
497 status_t result = data.writeInterfaceToken(
498 IGraphicBufferProducer::getInterfaceDescriptor());
499 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700500 ALOGE("IGBP::getFrameTimestamps failed to write token: %d", result);
501 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800502 }
503 result = remote()->transact(GET_FRAME_TIMESTAMPS, data, &reply);
504 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700505 ALOGE("IGBP::getFrameTimestamps failed to transact: %d", result);
506 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800507 }
Brian Anderson3890c392016-07-25 12:48:08 -0700508 result = reply.read(*outDelta);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800509 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700510 ALOGE("IGBP::getFrameTimestamps failed to read timestamps: %d",
511 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800512 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800513 }
Pablo Ceballos6155b402016-06-30 17:01:49 -0700514
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -0700515 virtual status_t getUniqueId(uint64_t* outId) const {
516 Parcel data, reply;
517 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
518 status_t result = remote()->transact(GET_UNIQUE_ID, data, &reply);
519 if (result != NO_ERROR) {
520 ALOGE("getUniqueId failed to transact: %d", result);
521 }
522 status_t actualResult = NO_ERROR;
523 result = reply.readInt32(&actualResult);
524 if (result != NO_ERROR) {
525 return result;
526 }
527 result = reply.readUint64(outId);
528 if (result != NO_ERROR) {
529 return result;
530 }
531 return actualResult;
532 }
Chia-I Wue2786ea2017-08-07 10:36:08 -0700533
534 virtual status_t getConsumerUsage(uint64_t* outUsage) const {
535 Parcel data, reply;
536 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
537 status_t result = remote()->transact(GET_CONSUMER_USAGE, data, &reply);
538 if (result != NO_ERROR) {
539 ALOGE("getConsumerUsage failed to transact: %d", result);
540 }
541 status_t actualResult = NO_ERROR;
542 result = reply.readInt32(&actualResult);
543 if (result != NO_ERROR) {
544 return result;
545 }
546 result = reply.readUint64(outUsage);
547 if (result != NO_ERROR) {
548 return result;
549 }
550 return actualResult;
551 }
Yiwei Zhang538cedc2019-06-24 19:35:03 -0700552
553 virtual status_t setAutoPrerotation(bool autoPrerotation) {
554 Parcel data, reply;
555 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
556 data.writeBool(autoPrerotation);
557 status_t result = remote()->transact(SET_AUTO_PREROTATION, data, &reply);
558 if (result == NO_ERROR) {
559 result = reply.readInt32();
560 }
561 return result;
562 }
Steven Thomas3172e202020-01-06 19:25:30 -0800563
564 virtual status_t setFrameRate(float frameRate) {
565 Parcel data, reply;
566 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
567 data.writeFloat(frameRate);
568 status_t result = remote()->transact(SET_FRAME_RATE, data, &reply, IBinder::FLAG_ONEWAY);
569 return result;
570 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800571};
572
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800573// Out-of-line virtual method definition to trigger vtable emission in this
574// translation unit (see clang warning -Wweak-vtables)
575BpGraphicBufferProducer::~BpGraphicBufferProducer() {}
576
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800577class HpGraphicBufferProducer : public HpInterface<
Pawin Vongmasae672cd02019-02-14 16:01:29 -0800578 BpGraphicBufferProducer,
579 H2BGraphicBufferProducerV1_0,
580 H2BGraphicBufferProducerV2_0> {
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800581public:
Chih-Hung Hsiehaaf62162018-12-20 15:45:04 -0800582 explicit HpGraphicBufferProducer(const sp<IBinder>& base) : PBase(base) {}
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800583
584 status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) override {
585 return mBase->requestBuffer(slot, buf);
586 }
587
588 status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) override {
589 return mBase->setMaxDequeuedBufferCount(maxDequeuedBuffers);
590 }
591
592 status_t setAsyncMode(bool async) override {
593 return mBase->setAsyncMode(async);
594 }
595
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600596 status_t dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w, uint32_t h, PixelFormat format,
597 uint64_t usage, uint64_t* outBufferAge,
598 FrameEventHistoryDelta* outTimestamps) override {
599 return mBase->dequeueBuffer(slot, fence, w, h, format, usage, outBufferAge, outTimestamps);
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800600 }
601
602 status_t detachBuffer(int slot) override {
603 return mBase->detachBuffer(slot);
604 }
605
606 status_t detachNextBuffer(
607 sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) override {
608 return mBase->detachNextBuffer(outBuffer, outFence);
609 }
610
611 status_t attachBuffer(
612 int* outSlot, const sp<GraphicBuffer>& buffer) override {
613 return mBase->attachBuffer(outSlot, buffer);
614 }
615
616 status_t queueBuffer(
617 int slot,
618 const QueueBufferInput& input,
619 QueueBufferOutput* output) override {
620 return mBase->queueBuffer(slot, input, output);
621 }
622
623 status_t cancelBuffer(int slot, const sp<Fence>& fence) override {
624 return mBase->cancelBuffer(slot, fence);
625 }
626
627 int query(int what, int* value) override {
628 return mBase->query(what, value);
629 }
630
631 status_t connect(
632 const sp<IProducerListener>& listener,
633 int api, bool producerControlledByApp,
634 QueueBufferOutput* output) override {
635 return mBase->connect(listener, api, producerControlledByApp, output);
636 }
637
638 status_t disconnect(
639 int api, DisconnectMode mode = DisconnectMode::Api) override {
640 return mBase->disconnect(api, mode);
641 }
642
643 status_t setSidebandStream(const sp<NativeHandle>& stream) override {
644 return mBase->setSidebandStream(stream);
645 }
646
647 void allocateBuffers(uint32_t width, uint32_t height,
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700648 PixelFormat format, uint64_t usage) override {
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800649 return mBase->allocateBuffers(width, height, format, usage);
650 }
651
652 status_t allowAllocation(bool allow) override {
653 return mBase->allowAllocation(allow);
654 }
655
656 status_t setGenerationNumber(uint32_t generationNumber) override {
657 return mBase->setGenerationNumber(generationNumber);
658 }
659
660 String8 getConsumerName() const override {
661 return mBase->getConsumerName();
662 }
663
664 status_t setSharedBufferMode(bool sharedBufferMode) override {
665 return mBase->setSharedBufferMode(sharedBufferMode);
666 }
667
668 status_t setAutoRefresh(bool autoRefresh) override {
669 return mBase->setAutoRefresh(autoRefresh);
670 }
671
672 status_t setDequeueTimeout(nsecs_t timeout) override {
673 return mBase->setDequeueTimeout(timeout);
674 }
675
Sungtak Lee3249fb62019-03-02 16:40:47 -0800676 status_t setLegacyBufferDrop(bool drop) override {
677 return mBase->setLegacyBufferDrop(drop);
678 }
679
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800680 status_t getLastQueuedBuffer(
681 sp<GraphicBuffer>* outBuffer,
682 sp<Fence>* outFence,
683 float outTransformMatrix[16]) override {
684 return mBase->getLastQueuedBuffer(
685 outBuffer, outFence, outTransformMatrix);
686 }
687
688 void getFrameTimestamps(FrameEventHistoryDelta* outDelta) override {
689 return mBase->getFrameTimestamps(outDelta);
690 }
691
692 status_t getUniqueId(uint64_t* outId) const override {
693 return mBase->getUniqueId(outId);
694 }
Chia-I Wue2786ea2017-08-07 10:36:08 -0700695
696 status_t getConsumerUsage(uint64_t* outUsage) const override {
697 return mBase->getConsumerUsage(outUsage);
698 }
Yiwei Zhang538cedc2019-06-24 19:35:03 -0700699
700 status_t setAutoPrerotation(bool autoPrerotation) override {
701 return mBase->setAutoPrerotation(autoPrerotation);
702 }
Steven Thomas3172e202020-01-06 19:25:30 -0800703
704 status_t setFrameRate(float frameRate) override { return mBase->setFrameRate(frameRate); }
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800705};
706
Pawin Vongmasa338b81d2019-01-31 05:20:07 -0800707IMPLEMENT_HYBRID_META_INTERFACE(GraphicBufferProducer,
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800708 "android.gui.IGraphicBufferProducer");
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800709
710// ----------------------------------------------------------------------
711
Sungtak Lee3249fb62019-03-02 16:40:47 -0800712status_t IGraphicBufferProducer::setLegacyBufferDrop(bool drop) {
713 // No-op for IGBP other than BufferQueue.
714 (void) drop;
715 return INVALID_OPERATION;
716}
717
Yiwei Zhang538cedc2019-06-24 19:35:03 -0700718status_t IGraphicBufferProducer::setAutoPrerotation(bool autoPrerotation) {
719 // No-op for IGBP other than BufferQueue.
720 (void)autoPrerotation;
721 return INVALID_OPERATION;
722}
723
Steven Thomas3172e202020-01-06 19:25:30 -0800724status_t IGraphicBufferProducer::setFrameRate(float frameRate) {
725 // No-op for IGBP other than BufferQueue.
726 (void)frameRate;
727 return INVALID_OPERATION;
728}
729
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -0800730status_t IGraphicBufferProducer::exportToParcel(Parcel* parcel) {
731 status_t res = OK;
732 res = parcel->writeUint32(USE_BUFFER_QUEUE);
733 if (res != NO_ERROR) {
734 ALOGE("exportToParcel: Cannot write magic, res=%d.", res);
735 return res;
736 }
737
738 return parcel->writeStrongBinder(IInterface::asBinder(this));
739}
740
741/* static */
742status_t IGraphicBufferProducer::exportToParcel(const sp<IGraphicBufferProducer>& producer,
743 Parcel* parcel) {
744 if (parcel == nullptr) {
745 ALOGE("exportToParcel: Invalid parcel object.");
746 return BAD_VALUE;
747 }
748
749 if (producer == nullptr) {
750 status_t res = OK;
751 res = parcel->writeUint32(IGraphicBufferProducer::USE_BUFFER_QUEUE);
752 if (res != NO_ERROR) return res;
753 return parcel->writeStrongBinder(nullptr);
754 } else {
755 return producer->exportToParcel(parcel);
756 }
757}
758
759/* static */
760sp<IGraphicBufferProducer> IGraphicBufferProducer::createFromParcel(const Parcel* parcel) {
761 uint32_t outMagic = 0;
762 status_t res = NO_ERROR;
763
764 res = parcel->readUint32(&outMagic);
765 if (res != NO_ERROR) {
766 ALOGE("createFromParcel: Failed to read magic, error=%d.", res);
767 return nullptr;
768 }
769
770 switch (outMagic) {
771 case USE_BUFFER_QUEUE: {
772 sp<IBinder> binder;
773 res = parcel->readNullableStrongBinder(&binder);
774 if (res != NO_ERROR) {
775 ALOGE("createFromParcel: Can't read strong binder.");
776 return nullptr;
777 }
778 return interface_cast<IGraphicBufferProducer>(binder);
779 }
780 case USE_BUFFER_HUB: {
781 ALOGE("createFromParcel: BufferHub not implemented.");
Jiyong Parka75d3d62018-04-09 12:16:30 +0900782#ifndef NO_BUFFERHUB
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -0800783 dvr::ProducerQueueParcelable producerParcelable;
784 res = producerParcelable.readFromParcel(parcel);
785 if (res != NO_ERROR) {
786 ALOGE("createFromParcel: Failed to read from parcel, error=%d", res);
787 return nullptr;
788 }
789 return BufferHubProducer::Create(std::move(producerParcelable));
Jiyong Parka75d3d62018-04-09 12:16:30 +0900790#else
791 return nullptr;
792#endif
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -0800793 }
794 default: {
795 ALOGE("createFromParcel: Unexpected mgaic: 0x%x.", outMagic);
796 return nullptr;
797 }
798 }
799}
800
801// ----------------------------------------------------------------------------
802
Andy McFadden2adaf042012-12-18 09:49:45 -0800803status_t BnGraphicBufferProducer::onTransact(
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800804 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
805{
806 switch(code) {
807 case REQUEST_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800808 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800809 int bufferIdx = data.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700810 sp<GraphicBuffer> buffer;
811 int result = requestBuffer(bufferIdx, &buffer);
Yi Kong48a619f2018-06-05 16:34:59 -0700812 reply->writeInt32(buffer != nullptr);
813 if (buffer != nullptr) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800814 reply->write(*buffer);
815 }
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700816 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800817 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800818 }
Pablo Ceballosfa455352015-08-12 17:47:47 -0700819 case SET_MAX_DEQUEUED_BUFFER_COUNT: {
820 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
821 int maxDequeuedBuffers = data.readInt32();
822 int result = setMaxDequeuedBufferCount(maxDequeuedBuffers);
823 reply->writeInt32(result);
824 return NO_ERROR;
825 }
826 case SET_ASYNC_MODE: {
827 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
828 bool async = data.readInt32();
829 int result = setAsyncMode(async);
830 reply->writeInt32(result);
831 return NO_ERROR;
832 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800833 case DEQUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800834 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800835 uint32_t width = data.readUint32();
836 uint32_t height = data.readUint32();
837 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700838 uint64_t usage = data.readUint64();
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600839 uint64_t bufferAge = 0;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700840 bool getTimestamps = data.readBool();
Brian Andersonbaaad322016-07-22 15:55:13 -0700841
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700842 int buf = 0;
Brian Andersonbaaad322016-07-22 15:55:13 -0700843 sp<Fence> fence = Fence::NO_FENCE;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700844 FrameEventHistoryDelta frameTimestamps;
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600845 int result = dequeueBuffer(&buf, &fence, width, height, format, usage, &bufferAge,
846 getTimestamps ? &frameTimestamps : nullptr);
Brian Andersonbaaad322016-07-22 15:55:13 -0700847
Tobin Ehlis209e5fb2019-03-26 14:06:29 -0600848 if (fence == nullptr) {
849 ALOGE("dequeueBuffer returned a NULL fence, setting to Fence::NO_FENCE");
850 fence = Fence::NO_FENCE;
851 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800852 reply->writeInt32(buf);
Brian Andersonbaaad322016-07-22 15:55:13 -0700853 reply->write(*fence);
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600854 reply->writeUint64(bufferAge);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700855 if (getTimestamps) {
856 reply->write(frameTimestamps);
857 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800858 reply->writeInt32(result);
859 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800860 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800861 case DETACH_BUFFER: {
862 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
863 int slot = data.readInt32();
864 int result = detachBuffer(slot);
865 reply->writeInt32(result);
866 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800867 }
Dan Stozad9822a32014-03-28 15:25:31 -0700868 case DETACH_NEXT_BUFFER: {
869 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
870 sp<GraphicBuffer> buffer;
871 sp<Fence> fence;
872 int32_t result = detachNextBuffer(&buffer, &fence);
873 reply->writeInt32(result);
874 if (result == NO_ERROR) {
Yi Kong48a619f2018-06-05 16:34:59 -0700875 reply->writeInt32(buffer != nullptr);
876 if (buffer != nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -0700877 reply->write(*buffer);
878 }
Yi Kong48a619f2018-06-05 16:34:59 -0700879 reply->writeInt32(fence != nullptr);
880 if (fence != nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -0700881 reply->write(*fence);
882 }
883 }
884 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800885 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800886 case ATTACH_BUFFER: {
887 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
888 sp<GraphicBuffer> buffer = new GraphicBuffer();
Pablo Ceballos70636b32016-07-06 15:24:54 -0700889 status_t result = data.read(*buffer.get());
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700890 int slot = 0;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700891 if (result == NO_ERROR) {
892 result = attachBuffer(&slot, buffer);
893 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800894 reply->writeInt32(slot);
895 reply->writeInt32(result);
896 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800897 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800898 case QUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800899 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700900
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800901 int buf = data.readInt32();
Jesse Hallc777b0b2012-06-28 12:52:05 -0700902 QueueBufferInput input(data);
Brian Andersonbaaad322016-07-22 15:55:13 -0700903 QueueBufferOutput output;
904 status_t result = queueBuffer(buf, input, &output);
Brian Andersonbaaad322016-07-22 15:55:13 -0700905 reply->write(output);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800906 reply->writeInt32(result);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700907
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800908 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800909 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800910 case CANCEL_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800911 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800912 int buf = data.readInt32();
Jamie Gennis1df8c342012-12-20 14:05:45 -0800913 sp<Fence> fence = new Fence();
Pablo Ceballos70636b32016-07-06 15:24:54 -0700914 status_t result = data.read(*fence.get());
915 if (result == NO_ERROR) {
916 result = cancelBuffer(buf, fence);
917 }
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700918 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800919 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800920 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700921 case QUERY: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800922 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700923 int value = 0;
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700924 int what = data.readInt32();
925 int res = query(what, &value);
926 reply->writeInt32(value);
927 reply->writeInt32(res);
928 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800929 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700930 case CONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800931 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stozaf0eaf252014-03-21 13:05:51 -0700932 sp<IProducerListener> listener;
933 if (data.readInt32() == 1) {
934 listener = IProducerListener::asInterface(data.readStrongBinder());
935 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700936 int api = data.readInt32();
Mathias Agopian595264f2013-07-16 22:56:09 -0700937 bool producerControlledByApp = data.readInt32();
Brian Andersonbaaad322016-07-22 15:55:13 -0700938 QueueBufferOutput output;
939 status_t res = connect(listener, api, producerControlledByApp, &output);
940 reply->write(output);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700941 reply->writeInt32(res);
942 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800943 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700944 case DISCONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800945 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700946 int api = data.readInt32();
Robert Carr97b9c862016-09-08 13:54:35 -0700947 DisconnectMode mode = static_cast<DisconnectMode>(data.readInt32());
948 status_t res = disconnect(api, mode);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700949 reply->writeInt32(res);
950 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800951 }
Jesse Hall399184a2014-03-03 15:42:54 -0800952 case SET_SIDEBAND_STREAM: {
953 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
954 sp<NativeHandle> stream;
955 if (data.readInt32()) {
Wonsik Kim0ec54e12014-03-21 10:46:24 +0900956 stream = NativeHandle::create(data.readNativeHandle(), true);
Jesse Hall399184a2014-03-03 15:42:54 -0800957 }
958 status_t result = setSidebandStream(stream);
959 reply->writeInt32(result);
960 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800961 }
Dan Stoza9de72932015-04-16 17:28:43 -0700962 case ALLOCATE_BUFFERS: {
Dan Stoza29a3e902014-06-20 13:13:57 -0700963 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800964 uint32_t width = data.readUint32();
965 uint32_t height = data.readUint32();
966 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700967 uint64_t usage = data.readUint64();
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700968 allocateBuffers(width, height, format, usage);
Dan Stoza29a3e902014-06-20 13:13:57 -0700969 return NO_ERROR;
Dan Stoza9de72932015-04-16 17:28:43 -0700970 }
971 case ALLOW_ALLOCATION: {
972 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
973 bool allow = static_cast<bool>(data.readInt32());
974 status_t result = allowAllocation(allow);
975 reply->writeInt32(result);
976 return NO_ERROR;
977 }
Dan Stoza812ed062015-06-02 15:45:22 -0700978 case SET_GENERATION_NUMBER: {
979 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
980 uint32_t generationNumber = data.readUint32();
981 status_t result = setGenerationNumber(generationNumber);
982 reply->writeInt32(result);
983 return NO_ERROR;
984 }
Dan Stozac6f30bd2015-06-08 09:32:50 -0700985 case GET_CONSUMER_NAME: {
986 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
987 reply->writeString8(getConsumerName());
988 return NO_ERROR;
989 }
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700990 case SET_SHARED_BUFFER_MODE: {
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700991 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700992 bool sharedBufferMode = data.readInt32();
993 status_t result = setSharedBufferMode(sharedBufferMode);
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700994 reply->writeInt32(result);
995 return NO_ERROR;
996 }
Pablo Ceballosff95aab2016-01-13 17:09:58 -0800997 case SET_AUTO_REFRESH: {
998 CHECK_INTERFACE(IGraphicBuffer, data, reply);
999 bool autoRefresh = data.readInt32();
1000 status_t result = setAutoRefresh(autoRefresh);
1001 reply->writeInt32(result);
1002 return NO_ERROR;
1003 }
Dan Stoza127fc632015-06-30 13:43:32 -07001004 case SET_DEQUEUE_TIMEOUT: {
1005 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1006 nsecs_t timeout = data.readInt64();
1007 status_t result = setDequeueTimeout(timeout);
1008 reply->writeInt32(result);
1009 return NO_ERROR;
1010 }
Dan Stoza50101d02016-04-07 16:53:23 -07001011 case GET_LAST_QUEUED_BUFFER: {
1012 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1013 sp<GraphicBuffer> buffer(nullptr);
1014 sp<Fence> fence(Fence::NO_FENCE);
John Reck1a61da52016-04-28 13:18:15 -07001015 float transform[16] = {};
1016 status_t result = getLastQueuedBuffer(&buffer, &fence, transform);
Dan Stoza50101d02016-04-07 16:53:23 -07001017 reply->writeInt32(result);
1018 if (result != NO_ERROR) {
1019 return result;
1020 }
John Reckce8e5df2016-04-28 10:12:47 -07001021 if (!buffer.get()) {
1022 reply->writeBool(false);
1023 } else {
1024 reply->writeBool(true);
1025 result = reply->write(*buffer);
John Reck1a61da52016-04-28 13:18:15 -07001026 if (result == NO_ERROR) {
1027 reply->write(transform, sizeof(float) * 16);
1028 }
John Reckce8e5df2016-04-28 10:12:47 -07001029 }
Dan Stoza50101d02016-04-07 16:53:23 -07001030 if (result != NO_ERROR) {
1031 ALOGE("getLastQueuedBuffer failed to write buffer: %d", result);
1032 return result;
1033 }
Tobin Ehlis209e5fb2019-03-26 14:06:29 -06001034 if (fence == nullptr) {
1035 ALOGE("getLastQueuedBuffer returned a NULL fence, setting to Fence::NO_FENCE");
1036 fence = Fence::NO_FENCE;
1037 }
Dan Stoza50101d02016-04-07 16:53:23 -07001038 result = reply->write(*fence);
1039 if (result != NO_ERROR) {
1040 ALOGE("getLastQueuedBuffer failed to write fence: %d", result);
1041 return result;
1042 }
1043 return NO_ERROR;
1044 }
Pablo Ceballosce796e72016-02-04 19:10:51 -08001045 case GET_FRAME_TIMESTAMPS: {
1046 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson3890c392016-07-25 12:48:08 -07001047 FrameEventHistoryDelta frameTimestamps;
1048 getFrameTimestamps(&frameTimestamps);
1049 status_t result = reply->write(frameTimestamps);
Pablo Ceballosce796e72016-02-04 19:10:51 -08001050 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -07001051 ALOGE("BnGBP::GET_FRAME_TIMESTAMPS failed to write buffer: %d",
1052 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -08001053 return result;
1054 }
Pablo Ceballosce796e72016-02-04 19:10:51 -08001055 return NO_ERROR;
1056 }
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -07001057 case GET_UNIQUE_ID: {
1058 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1059 uint64_t outId = 0;
1060 status_t actualResult = getUniqueId(&outId);
1061 status_t result = reply->writeInt32(actualResult);
1062 if (result != NO_ERROR) {
1063 return result;
1064 }
1065 result = reply->writeUint64(outId);
1066 if (result != NO_ERROR) {
1067 return result;
1068 }
1069 return NO_ERROR;
1070 }
Chia-I Wue2786ea2017-08-07 10:36:08 -07001071 case GET_CONSUMER_USAGE: {
1072 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1073 uint64_t outUsage = 0;
1074 status_t actualResult = getConsumerUsage(&outUsage);
1075 status_t result = reply->writeInt32(actualResult);
1076 if (result != NO_ERROR) {
1077 return result;
1078 }
1079 result = reply->writeUint64(outUsage);
1080 if (result != NO_ERROR) {
1081 return result;
1082 }
1083 return NO_ERROR;
1084 }
Sungtak Lee3249fb62019-03-02 16:40:47 -08001085 case SET_LEGACY_BUFFER_DROP: {
1086 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1087 bool drop = data.readInt32();
1088 int result = setLegacyBufferDrop(drop);
1089 reply->writeInt32(result);
1090 return NO_ERROR;
1091 }
Yiwei Zhang538cedc2019-06-24 19:35:03 -07001092 case SET_AUTO_PREROTATION: {
1093 CHECK_INTERFACE(IGraphicBuffer, data, reply);
1094 bool autoPrerotation = data.readBool();
1095 status_t result = setAutoPrerotation(autoPrerotation);
1096 reply->writeInt32(result);
1097 return NO_ERROR;
1098 }
Steven Thomas3172e202020-01-06 19:25:30 -08001099 case SET_FRAME_RATE: {
1100 CHECK_INTERFACE(IGraphicBuffer, data, reply);
1101 float frameRate = data.readFloat();
1102 status_t result = setFrameRate(frameRate);
1103 reply->writeInt32(result);
1104 return NO_ERROR;
1105 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001106 }
1107 return BBinder::onTransact(code, data, reply, flags);
1108}
1109
1110// ----------------------------------------------------------------------------
1111
Andy McFadden2adaf042012-12-18 09:49:45 -08001112IGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) {
Jesse Hallc777b0b2012-06-28 12:52:05 -07001113 parcel.read(*this);
1114}
1115
Brian Andersonbaaad322016-07-22 15:55:13 -07001116
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001117}; // namespace android