blob: 0e03b7d393ddcb17f97208729cd643306a5ca9d6 [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,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080076};
77
Andy McFadden2adaf042012-12-18 09:49:45 -080078class BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080079{
80public:
Chih-Hung Hsiehe2347b72016-04-25 15:41:05 -070081 explicit BpGraphicBufferProducer(const sp<IBinder>& impl)
Andy McFadden2adaf042012-12-18 09:49:45 -080082 : BpInterface<IGraphicBufferProducer>(impl)
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080083 {
84 }
85
Yi Kongca038512017-05-02 16:55:24 -070086 ~BpGraphicBufferProducer() override;
Dan Stoza3be1c6b2014-11-18 10:24:03 -080087
Jamie Gennis7b305ff2011-07-19 12:08:33 -070088 virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080089 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -080090 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080091 data.writeInt32(bufferIdx);
Jamie Gennis8a29ff22011-10-14 15:03:17 -070092 status_t result =remote()->transact(REQUEST_BUFFER, data, &reply);
93 if (result != NO_ERROR) {
94 return result;
95 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080096 bool nonNull = reply.readInt32();
97 if (nonNull) {
Jamie Gennis7b305ff2011-07-19 12:08:33 -070098 *buf = new GraphicBuffer();
Lingyun Zhu2aff7022012-11-20 19:24:35 +080099 result = reply.read(**buf);
100 if(result != NO_ERROR) {
101 (*buf).clear();
102 return result;
103 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800104 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700105 result = reply.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700106 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800107 }
108
Pablo Ceballosfa455352015-08-12 17:47:47 -0700109 virtual status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) {
110 Parcel data, reply;
111 data.writeInterfaceToken(
112 IGraphicBufferProducer::getInterfaceDescriptor());
113 data.writeInt32(maxDequeuedBuffers);
114 status_t result = remote()->transact(SET_MAX_DEQUEUED_BUFFER_COUNT,
115 data, &reply);
116 if (result != NO_ERROR) {
117 return result;
118 }
119 result = reply.readInt32();
120 return result;
121 }
122
123 virtual status_t setAsyncMode(bool async) {
124 Parcel data, reply;
125 data.writeInterfaceToken(
126 IGraphicBufferProducer::getInterfaceDescriptor());
127 data.writeInt32(async);
128 status_t result = remote()->transact(SET_ASYNC_MODE,
129 data, &reply);
130 if (result != NO_ERROR) {
131 return result;
132 }
133 result = reply.readInt32();
134 return result;
135 }
136
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600137 virtual status_t dequeueBuffer(int* buf, sp<Fence>* fence, uint32_t width, uint32_t height,
138 PixelFormat format, uint64_t usage, uint64_t* outBufferAge,
139 FrameEventHistoryDelta* outTimestamps) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800140 Parcel data, reply;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700141 bool getFrameTimestamps = (outTimestamps != nullptr);
Brian Andersonbaaad322016-07-22 15:55:13 -0700142
Andy McFadden2adaf042012-12-18 09:49:45 -0800143 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800144 data.writeUint32(width);
145 data.writeUint32(height);
146 data.writeInt32(static_cast<int32_t>(format));
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700147 data.writeUint64(usage);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700148 data.writeBool(getFrameTimestamps);
Brian Andersonbaaad322016-07-22 15:55:13 -0700149
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700150 status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply);
151 if (result != NO_ERROR) {
152 return result;
153 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700154
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800155 *buf = reply.readInt32();
Brian Andersonbaaad322016-07-22 15:55:13 -0700156 *fence = new Fence();
157 result = reply.read(**fence);
158 if (result != NO_ERROR) {
159 fence->clear();
160 return result;
Jesse Hallf7857542012-06-14 15:26:33 -0700161 }
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600162 if (outBufferAge) {
163 result = reply.readUint64(outBufferAge);
164 } else {
165 // Read the value even if outBufferAge is nullptr:
166 uint64_t bufferAge;
167 result = reply.readUint64(&bufferAge);
168 }
169 if (result != NO_ERROR) {
170 ALOGE("IGBP::dequeueBuffer failed to read buffer age: %d", result);
171 return result;
172 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700173 if (getFrameTimestamps) {
174 result = reply.read(*outTimestamps);
175 if (result != NO_ERROR) {
176 ALOGE("IGBP::dequeueBuffer failed to read timestamps: %d",
177 result);
178 return result;
179 }
180 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700181 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800182 return result;
183 }
184
Dan Stoza9f3053d2014-03-06 15:14:33 -0800185 virtual status_t detachBuffer(int slot) {
186 Parcel data, reply;
187 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
188 data.writeInt32(slot);
189 status_t result = remote()->transact(DETACH_BUFFER, data, &reply);
190 if (result != NO_ERROR) {
191 return result;
192 }
193 result = reply.readInt32();
194 return result;
195 }
196
Dan Stozad9822a32014-03-28 15:25:31 -0700197 virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer,
198 sp<Fence>* outFence) {
Yi Kong48a619f2018-06-05 16:34:59 -0700199 if (outBuffer == nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -0700200 ALOGE("detachNextBuffer: outBuffer must not be NULL");
201 return BAD_VALUE;
Yi Kong48a619f2018-06-05 16:34:59 -0700202 } else if (outFence == nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -0700203 ALOGE("detachNextBuffer: outFence must not be NULL");
204 return BAD_VALUE;
205 }
206 Parcel data, reply;
207 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
208 status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply);
209 if (result != NO_ERROR) {
210 return result;
211 }
212 result = reply.readInt32();
213 if (result == NO_ERROR) {
214 bool nonNull = reply.readInt32();
215 if (nonNull) {
216 *outBuffer = new GraphicBuffer;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700217 result = reply.read(**outBuffer);
218 if (result != NO_ERROR) {
219 outBuffer->clear();
220 return result;
221 }
Dan Stozad9822a32014-03-28 15:25:31 -0700222 }
223 nonNull = reply.readInt32();
224 if (nonNull) {
225 *outFence = new Fence;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700226 result = reply.read(**outFence);
227 if (result != NO_ERROR) {
228 outBuffer->clear();
229 outFence->clear();
230 return result;
231 }
Dan Stozad9822a32014-03-28 15:25:31 -0700232 }
233 }
234 return result;
235 }
236
Dan Stoza9f3053d2014-03-06 15:14:33 -0800237 virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) {
238 Parcel data, reply;
239 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
240 data.write(*buffer.get());
241 status_t result = remote()->transact(ATTACH_BUFFER, data, &reply);
242 if (result != NO_ERROR) {
243 return result;
244 }
Chia-I Wuc79a2962017-05-15 10:32:27 -0700245
Dan Stoza9f3053d2014-03-06 15:14:33 -0800246 *slot = reply.readInt32();
247 result = reply.readInt32();
Chia-I Wuc79a2962017-05-15 10:32:27 -0700248 if (result == NO_ERROR &&
249 (*slot < 0 || *slot >= BufferQueueDefs::NUM_BUFFER_SLOTS)) {
250 ALOGE("attachBuffer returned invalid slot %d", *slot);
251 android_errorWriteLog(0x534e4554, "37478824");
252 return UNKNOWN_ERROR;
253 }
254
Dan Stoza9f3053d2014-03-06 15:14:33 -0800255 return result;
256 }
257
Mathias Agopianf0bc2f12012-04-09 16:14:01 -0700258 virtual status_t queueBuffer(int buf,
259 const QueueBufferInput& input, QueueBufferOutput* output) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800260 Parcel data, reply;
Brian Andersonbaaad322016-07-22 15:55:13 -0700261
Andy McFadden2adaf042012-12-18 09:49:45 -0800262 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800263 data.writeInt32(buf);
Jesse Hallc777b0b2012-06-28 12:52:05 -0700264 data.write(input);
Brian Andersonbaaad322016-07-22 15:55:13 -0700265
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700266 status_t result = remote()->transact(QUEUE_BUFFER, data, &reply);
267 if (result != NO_ERROR) {
268 return result;
269 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700270
271 result = reply.read(*output);
272 if (result != NO_ERROR) {
273 return result;
274 }
275
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700276 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800277 return result;
278 }
279
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700280 virtual status_t cancelBuffer(int buf, const sp<Fence>& fence) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800281 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800282 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800283 data.writeInt32(buf);
Jamie Gennis1df8c342012-12-20 14:05:45 -0800284 data.write(*fence.get());
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700285 status_t result = remote()->transact(CANCEL_BUFFER, data, &reply);
286 if (result != NO_ERROR) {
287 return result;
288 }
289 result = reply.readInt32();
290 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800291 }
292
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700293 virtual int query(int what, int* value) {
294 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800295 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700296 data.writeInt32(what);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700297 status_t result = remote()->transact(QUERY, data, &reply);
298 if (result != NO_ERROR) {
299 return result;
300 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700301 value[0] = reply.readInt32();
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700302 result = reply.readInt32();
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700303 return result;
304 }
305
Dan Stozaf0eaf252014-03-21 13:05:51 -0700306 virtual status_t connect(const sp<IProducerListener>& listener,
Mathias Agopian365857d2013-09-11 19:35:45 -0700307 int api, bool producerControlledByApp, QueueBufferOutput* output) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700308 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800309 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Yi Kong48a619f2018-06-05 16:34:59 -0700310 if (listener != nullptr) {
Dan Stozaf0eaf252014-03-21 13:05:51 -0700311 data.writeInt32(1);
Marco Nelissen097ca272014-11-14 08:01:01 -0800312 data.writeStrongBinder(IInterface::asBinder(listener));
Dan Stozaf0eaf252014-03-21 13:05:51 -0700313 } else {
314 data.writeInt32(0);
315 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700316 data.writeInt32(api);
Mathias Agopian595264f2013-07-16 22:56:09 -0700317 data.writeInt32(producerControlledByApp);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700318 status_t result = remote()->transact(CONNECT, data, &reply);
319 if (result != NO_ERROR) {
320 return result;
321 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700322 reply.read(*output);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700323 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700324 return result;
325 }
Mathias Agopian80727112011-05-02 19:51:12 -0700326
Robert Carr97b9c862016-09-08 13:54:35 -0700327 virtual status_t disconnect(int api, DisconnectMode mode) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700328 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800329 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700330 data.writeInt32(api);
Robert Carr97b9c862016-09-08 13:54:35 -0700331 data.writeInt32(static_cast<int32_t>(mode));
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700332 status_t result =remote()->transact(DISCONNECT, data, &reply);
333 if (result != NO_ERROR) {
334 return result;
335 }
336 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700337 return result;
338 }
Jesse Hall399184a2014-03-03 15:42:54 -0800339
340 virtual status_t setSidebandStream(const sp<NativeHandle>& stream) {
341 Parcel data, reply;
342 status_t result;
343 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
344 if (stream.get()) {
345 data.writeInt32(true);
346 data.writeNativeHandle(stream->handle());
347 } else {
348 data.writeInt32(false);
349 }
350 if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) {
351 result = reply.readInt32();
352 }
353 return result;
354 }
Dan Stoza29a3e902014-06-20 13:13:57 -0700355
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700356 virtual void allocateBuffers(uint32_t width, uint32_t height,
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700357 PixelFormat format, uint64_t usage) {
Dan Stoza29a3e902014-06-20 13:13:57 -0700358 Parcel data, reply;
359 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800360 data.writeUint32(width);
361 data.writeUint32(height);
Dan Stoza29a3e902014-06-20 13:13:57 -0700362 data.writeInt32(static_cast<int32_t>(format));
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700363 data.writeUint64(usage);
Steven Moreland366eb422019-04-01 19:22:32 -0700364 status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply, IBinder::FLAG_ONEWAY);
Dan Stoza29a3e902014-06-20 13:13:57 -0700365 if (result != NO_ERROR) {
366 ALOGE("allocateBuffers failed to transact: %d", result);
367 }
368 }
Dan Stoza9de72932015-04-16 17:28:43 -0700369
370 virtual status_t allowAllocation(bool allow) {
371 Parcel data, reply;
372 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
373 data.writeInt32(static_cast<int32_t>(allow));
374 status_t result = remote()->transact(ALLOW_ALLOCATION, data, &reply);
375 if (result != NO_ERROR) {
376 return result;
377 }
378 result = reply.readInt32();
379 return result;
380 }
Dan Stoza812ed062015-06-02 15:45:22 -0700381
382 virtual status_t setGenerationNumber(uint32_t generationNumber) {
383 Parcel data, reply;
384 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
385 data.writeUint32(generationNumber);
386 status_t result = remote()->transact(SET_GENERATION_NUMBER, data, &reply);
387 if (result == NO_ERROR) {
388 result = reply.readInt32();
389 }
390 return result;
391 }
Dan Stozac6f30bd2015-06-08 09:32:50 -0700392
393 virtual String8 getConsumerName() const {
394 Parcel data, reply;
395 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
396 status_t result = remote()->transact(GET_CONSUMER_NAME, data, &reply);
397 if (result != NO_ERROR) {
398 ALOGE("getConsumerName failed to transact: %d", result);
399 return String8("TransactFailed");
400 }
401 return reply.readString8();
402 }
Dan Stoza7dde5992015-05-22 09:51:44 -0700403
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700404 virtual status_t setSharedBufferMode(bool sharedBufferMode) {
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700405 Parcel data, reply;
406 data.writeInterfaceToken(
407 IGraphicBufferProducer::getInterfaceDescriptor());
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700408 data.writeInt32(sharedBufferMode);
409 status_t result = remote()->transact(SET_SHARED_BUFFER_MODE, data,
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700410 &reply);
411 if (result == NO_ERROR) {
412 result = reply.readInt32();
413 }
414 return result;
415 }
Dan Stoza127fc632015-06-30 13:43:32 -0700416
Pablo Ceballosff95aab2016-01-13 17:09:58 -0800417 virtual status_t setAutoRefresh(bool autoRefresh) {
418 Parcel data, reply;
419 data.writeInterfaceToken(
420 IGraphicBufferProducer::getInterfaceDescriptor());
421 data.writeInt32(autoRefresh);
422 status_t result = remote()->transact(SET_AUTO_REFRESH, data, &reply);
423 if (result == NO_ERROR) {
424 result = reply.readInt32();
425 }
426 return result;
427 }
428
Dan Stoza127fc632015-06-30 13:43:32 -0700429 virtual status_t setDequeueTimeout(nsecs_t timeout) {
430 Parcel data, reply;
431 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
432 data.writeInt64(timeout);
433 status_t result = remote()->transact(SET_DEQUEUE_TIMEOUT, data, &reply);
434 if (result != NO_ERROR) {
435 ALOGE("setDequeueTimeout failed to transact: %d", result);
436 return result;
437 }
438 return reply.readInt32();
439 }
Dan Stoza50101d02016-04-07 16:53:23 -0700440
Sungtak Lee3249fb62019-03-02 16:40:47 -0800441 virtual status_t setLegacyBufferDrop(bool drop) {
442 Parcel data, reply;
443 data.writeInterfaceToken(
444 IGraphicBufferProducer::getInterfaceDescriptor());
445 data.writeInt32(drop);
446 status_t result = remote()->transact(SET_LEGACY_BUFFER_DROP,
447 data, &reply);
448 if (result != NO_ERROR) {
449 return result;
450 }
451 result = reply.readInt32();
452 return result;
453 }
454
Dan Stoza50101d02016-04-07 16:53:23 -0700455 virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer,
John Reck1a61da52016-04-28 13:18:15 -0700456 sp<Fence>* outFence, float outTransformMatrix[16]) override {
Dan Stoza50101d02016-04-07 16:53:23 -0700457 Parcel data, reply;
458 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
459 status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER, data,
460 &reply);
461 if (result != NO_ERROR) {
462 ALOGE("getLastQueuedBuffer failed to transact: %d", result);
463 return result;
464 }
465 result = reply.readInt32();
466 if (result != NO_ERROR) {
467 return result;
468 }
John Reckce8e5df2016-04-28 10:12:47 -0700469 bool hasBuffer = reply.readBool();
470 sp<GraphicBuffer> buffer;
471 if (hasBuffer) {
472 buffer = new GraphicBuffer();
473 result = reply.read(*buffer);
John Reck1a61da52016-04-28 13:18:15 -0700474 if (result == NO_ERROR) {
475 result = reply.read(outTransformMatrix, sizeof(float) * 16);
476 }
John Reckce8e5df2016-04-28 10:12:47 -0700477 }
Dan Stoza50101d02016-04-07 16:53:23 -0700478 if (result != NO_ERROR) {
479 ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
480 return result;
481 }
482 sp<Fence> fence(new Fence);
483 result = reply.read(*fence);
484 if (result != NO_ERROR) {
485 ALOGE("getLastQueuedBuffer failed to read fence: %d", result);
486 return result;
487 }
488 *outBuffer = buffer;
489 *outFence = fence;
490 return result;
491 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800492
Brian Anderson3890c392016-07-25 12:48:08 -0700493 virtual void getFrameTimestamps(FrameEventHistoryDelta* outDelta) {
Pablo Ceballosce796e72016-02-04 19:10:51 -0800494 Parcel data, reply;
495 status_t result = data.writeInterfaceToken(
496 IGraphicBufferProducer::getInterfaceDescriptor());
497 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700498 ALOGE("IGBP::getFrameTimestamps failed to write token: %d", result);
499 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800500 }
501 result = remote()->transact(GET_FRAME_TIMESTAMPS, data, &reply);
502 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700503 ALOGE("IGBP::getFrameTimestamps failed to transact: %d", result);
504 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800505 }
Brian Anderson3890c392016-07-25 12:48:08 -0700506 result = reply.read(*outDelta);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800507 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700508 ALOGE("IGBP::getFrameTimestamps failed to read timestamps: %d",
509 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800510 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800511 }
Pablo Ceballos6155b402016-06-30 17:01:49 -0700512
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -0700513 virtual status_t getUniqueId(uint64_t* outId) const {
514 Parcel data, reply;
515 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
516 status_t result = remote()->transact(GET_UNIQUE_ID, data, &reply);
517 if (result != NO_ERROR) {
518 ALOGE("getUniqueId failed to transact: %d", result);
519 }
520 status_t actualResult = NO_ERROR;
521 result = reply.readInt32(&actualResult);
522 if (result != NO_ERROR) {
523 return result;
524 }
525 result = reply.readUint64(outId);
526 if (result != NO_ERROR) {
527 return result;
528 }
529 return actualResult;
530 }
Chia-I Wue2786ea2017-08-07 10:36:08 -0700531
532 virtual status_t getConsumerUsage(uint64_t* outUsage) const {
533 Parcel data, reply;
534 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
535 status_t result = remote()->transact(GET_CONSUMER_USAGE, data, &reply);
536 if (result != NO_ERROR) {
537 ALOGE("getConsumerUsage failed to transact: %d", result);
538 }
539 status_t actualResult = NO_ERROR;
540 result = reply.readInt32(&actualResult);
541 if (result != NO_ERROR) {
542 return result;
543 }
544 result = reply.readUint64(outUsage);
545 if (result != NO_ERROR) {
546 return result;
547 }
548 return actualResult;
549 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800550};
551
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800552// Out-of-line virtual method definition to trigger vtable emission in this
553// translation unit (see clang warning -Wweak-vtables)
554BpGraphicBufferProducer::~BpGraphicBufferProducer() {}
555
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800556class HpGraphicBufferProducer : public HpInterface<
Pawin Vongmasae672cd02019-02-14 16:01:29 -0800557 BpGraphicBufferProducer,
558 H2BGraphicBufferProducerV1_0,
559 H2BGraphicBufferProducerV2_0> {
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800560public:
Chih-Hung Hsiehaaf62162018-12-20 15:45:04 -0800561 explicit HpGraphicBufferProducer(const sp<IBinder>& base) : PBase(base) {}
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800562
563 status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) override {
564 return mBase->requestBuffer(slot, buf);
565 }
566
567 status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) override {
568 return mBase->setMaxDequeuedBufferCount(maxDequeuedBuffers);
569 }
570
571 status_t setAsyncMode(bool async) override {
572 return mBase->setAsyncMode(async);
573 }
574
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600575 status_t dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w, uint32_t h, PixelFormat format,
576 uint64_t usage, uint64_t* outBufferAge,
577 FrameEventHistoryDelta* outTimestamps) override {
578 return mBase->dequeueBuffer(slot, fence, w, h, format, usage, outBufferAge, outTimestamps);
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800579 }
580
581 status_t detachBuffer(int slot) override {
582 return mBase->detachBuffer(slot);
583 }
584
585 status_t detachNextBuffer(
586 sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) override {
587 return mBase->detachNextBuffer(outBuffer, outFence);
588 }
589
590 status_t attachBuffer(
591 int* outSlot, const sp<GraphicBuffer>& buffer) override {
592 return mBase->attachBuffer(outSlot, buffer);
593 }
594
595 status_t queueBuffer(
596 int slot,
597 const QueueBufferInput& input,
598 QueueBufferOutput* output) override {
599 return mBase->queueBuffer(slot, input, output);
600 }
601
602 status_t cancelBuffer(int slot, const sp<Fence>& fence) override {
603 return mBase->cancelBuffer(slot, fence);
604 }
605
606 int query(int what, int* value) override {
607 return mBase->query(what, value);
608 }
609
610 status_t connect(
611 const sp<IProducerListener>& listener,
612 int api, bool producerControlledByApp,
613 QueueBufferOutput* output) override {
614 return mBase->connect(listener, api, producerControlledByApp, output);
615 }
616
617 status_t disconnect(
618 int api, DisconnectMode mode = DisconnectMode::Api) override {
619 return mBase->disconnect(api, mode);
620 }
621
622 status_t setSidebandStream(const sp<NativeHandle>& stream) override {
623 return mBase->setSidebandStream(stream);
624 }
625
626 void allocateBuffers(uint32_t width, uint32_t height,
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700627 PixelFormat format, uint64_t usage) override {
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800628 return mBase->allocateBuffers(width, height, format, usage);
629 }
630
631 status_t allowAllocation(bool allow) override {
632 return mBase->allowAllocation(allow);
633 }
634
635 status_t setGenerationNumber(uint32_t generationNumber) override {
636 return mBase->setGenerationNumber(generationNumber);
637 }
638
639 String8 getConsumerName() const override {
640 return mBase->getConsumerName();
641 }
642
643 status_t setSharedBufferMode(bool sharedBufferMode) override {
644 return mBase->setSharedBufferMode(sharedBufferMode);
645 }
646
647 status_t setAutoRefresh(bool autoRefresh) override {
648 return mBase->setAutoRefresh(autoRefresh);
649 }
650
651 status_t setDequeueTimeout(nsecs_t timeout) override {
652 return mBase->setDequeueTimeout(timeout);
653 }
654
Sungtak Lee3249fb62019-03-02 16:40:47 -0800655 status_t setLegacyBufferDrop(bool drop) override {
656 return mBase->setLegacyBufferDrop(drop);
657 }
658
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800659 status_t getLastQueuedBuffer(
660 sp<GraphicBuffer>* outBuffer,
661 sp<Fence>* outFence,
662 float outTransformMatrix[16]) override {
663 return mBase->getLastQueuedBuffer(
664 outBuffer, outFence, outTransformMatrix);
665 }
666
667 void getFrameTimestamps(FrameEventHistoryDelta* outDelta) override {
668 return mBase->getFrameTimestamps(outDelta);
669 }
670
671 status_t getUniqueId(uint64_t* outId) const override {
672 return mBase->getUniqueId(outId);
673 }
Chia-I Wue2786ea2017-08-07 10:36:08 -0700674
675 status_t getConsumerUsage(uint64_t* outUsage) const override {
676 return mBase->getConsumerUsage(outUsage);
677 }
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800678};
679
Pawin Vongmasa338b81d2019-01-31 05:20:07 -0800680IMPLEMENT_HYBRID_META_INTERFACE(GraphicBufferProducer,
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800681 "android.gui.IGraphicBufferProducer");
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800682
683// ----------------------------------------------------------------------
684
Sungtak Lee3249fb62019-03-02 16:40:47 -0800685status_t IGraphicBufferProducer::setLegacyBufferDrop(bool drop) {
686 // No-op for IGBP other than BufferQueue.
687 (void) drop;
688 return INVALID_OPERATION;
689}
690
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -0800691status_t IGraphicBufferProducer::exportToParcel(Parcel* parcel) {
692 status_t res = OK;
693 res = parcel->writeUint32(USE_BUFFER_QUEUE);
694 if (res != NO_ERROR) {
695 ALOGE("exportToParcel: Cannot write magic, res=%d.", res);
696 return res;
697 }
698
699 return parcel->writeStrongBinder(IInterface::asBinder(this));
700}
701
702/* static */
703status_t IGraphicBufferProducer::exportToParcel(const sp<IGraphicBufferProducer>& producer,
704 Parcel* parcel) {
705 if (parcel == nullptr) {
706 ALOGE("exportToParcel: Invalid parcel object.");
707 return BAD_VALUE;
708 }
709
710 if (producer == nullptr) {
711 status_t res = OK;
712 res = parcel->writeUint32(IGraphicBufferProducer::USE_BUFFER_QUEUE);
713 if (res != NO_ERROR) return res;
714 return parcel->writeStrongBinder(nullptr);
715 } else {
716 return producer->exportToParcel(parcel);
717 }
718}
719
720/* static */
721sp<IGraphicBufferProducer> IGraphicBufferProducer::createFromParcel(const Parcel* parcel) {
722 uint32_t outMagic = 0;
723 status_t res = NO_ERROR;
724
725 res = parcel->readUint32(&outMagic);
726 if (res != NO_ERROR) {
727 ALOGE("createFromParcel: Failed to read magic, error=%d.", res);
728 return nullptr;
729 }
730
731 switch (outMagic) {
732 case USE_BUFFER_QUEUE: {
733 sp<IBinder> binder;
734 res = parcel->readNullableStrongBinder(&binder);
735 if (res != NO_ERROR) {
736 ALOGE("createFromParcel: Can't read strong binder.");
737 return nullptr;
738 }
739 return interface_cast<IGraphicBufferProducer>(binder);
740 }
741 case USE_BUFFER_HUB: {
742 ALOGE("createFromParcel: BufferHub not implemented.");
Jiyong Parka75d3d62018-04-09 12:16:30 +0900743#ifndef NO_BUFFERHUB
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -0800744 dvr::ProducerQueueParcelable producerParcelable;
745 res = producerParcelable.readFromParcel(parcel);
746 if (res != NO_ERROR) {
747 ALOGE("createFromParcel: Failed to read from parcel, error=%d", res);
748 return nullptr;
749 }
750 return BufferHubProducer::Create(std::move(producerParcelable));
Jiyong Parka75d3d62018-04-09 12:16:30 +0900751#else
752 return nullptr;
753#endif
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -0800754 }
755 default: {
756 ALOGE("createFromParcel: Unexpected mgaic: 0x%x.", outMagic);
757 return nullptr;
758 }
759 }
760}
761
762// ----------------------------------------------------------------------------
763
Andy McFadden2adaf042012-12-18 09:49:45 -0800764status_t BnGraphicBufferProducer::onTransact(
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800765 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
766{
767 switch(code) {
768 case REQUEST_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800769 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800770 int bufferIdx = data.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700771 sp<GraphicBuffer> buffer;
772 int result = requestBuffer(bufferIdx, &buffer);
Yi Kong48a619f2018-06-05 16:34:59 -0700773 reply->writeInt32(buffer != nullptr);
774 if (buffer != nullptr) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800775 reply->write(*buffer);
776 }
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700777 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800778 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800779 }
Pablo Ceballosfa455352015-08-12 17:47:47 -0700780 case SET_MAX_DEQUEUED_BUFFER_COUNT: {
781 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
782 int maxDequeuedBuffers = data.readInt32();
783 int result = setMaxDequeuedBufferCount(maxDequeuedBuffers);
784 reply->writeInt32(result);
785 return NO_ERROR;
786 }
787 case SET_ASYNC_MODE: {
788 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
789 bool async = data.readInt32();
790 int result = setAsyncMode(async);
791 reply->writeInt32(result);
792 return NO_ERROR;
793 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800794 case DEQUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800795 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800796 uint32_t width = data.readUint32();
797 uint32_t height = data.readUint32();
798 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700799 uint64_t usage = data.readUint64();
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600800 uint64_t bufferAge = 0;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700801 bool getTimestamps = data.readBool();
Brian Andersonbaaad322016-07-22 15:55:13 -0700802
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700803 int buf = 0;
Brian Andersonbaaad322016-07-22 15:55:13 -0700804 sp<Fence> fence = Fence::NO_FENCE;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700805 FrameEventHistoryDelta frameTimestamps;
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600806 int result = dequeueBuffer(&buf, &fence, width, height, format, usage, &bufferAge,
807 getTimestamps ? &frameTimestamps : nullptr);
Brian Andersonbaaad322016-07-22 15:55:13 -0700808
Tobin Ehlis209e5fb2019-03-26 14:06:29 -0600809 if (fence == nullptr) {
810 ALOGE("dequeueBuffer returned a NULL fence, setting to Fence::NO_FENCE");
811 fence = Fence::NO_FENCE;
812 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800813 reply->writeInt32(buf);
Brian Andersonbaaad322016-07-22 15:55:13 -0700814 reply->write(*fence);
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600815 reply->writeUint64(bufferAge);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700816 if (getTimestamps) {
817 reply->write(frameTimestamps);
818 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800819 reply->writeInt32(result);
820 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800821 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800822 case DETACH_BUFFER: {
823 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
824 int slot = data.readInt32();
825 int result = detachBuffer(slot);
826 reply->writeInt32(result);
827 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800828 }
Dan Stozad9822a32014-03-28 15:25:31 -0700829 case DETACH_NEXT_BUFFER: {
830 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
831 sp<GraphicBuffer> buffer;
832 sp<Fence> fence;
833 int32_t result = detachNextBuffer(&buffer, &fence);
834 reply->writeInt32(result);
835 if (result == NO_ERROR) {
Yi Kong48a619f2018-06-05 16:34:59 -0700836 reply->writeInt32(buffer != nullptr);
837 if (buffer != nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -0700838 reply->write(*buffer);
839 }
Yi Kong48a619f2018-06-05 16:34:59 -0700840 reply->writeInt32(fence != nullptr);
841 if (fence != nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -0700842 reply->write(*fence);
843 }
844 }
845 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800846 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800847 case ATTACH_BUFFER: {
848 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
849 sp<GraphicBuffer> buffer = new GraphicBuffer();
Pablo Ceballos70636b32016-07-06 15:24:54 -0700850 status_t result = data.read(*buffer.get());
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700851 int slot = 0;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700852 if (result == NO_ERROR) {
853 result = attachBuffer(&slot, buffer);
854 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800855 reply->writeInt32(slot);
856 reply->writeInt32(result);
857 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800858 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800859 case QUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800860 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700861
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800862 int buf = data.readInt32();
Jesse Hallc777b0b2012-06-28 12:52:05 -0700863 QueueBufferInput input(data);
Brian Andersonbaaad322016-07-22 15:55:13 -0700864 QueueBufferOutput output;
865 status_t result = queueBuffer(buf, input, &output);
Brian Andersonbaaad322016-07-22 15:55:13 -0700866 reply->write(output);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800867 reply->writeInt32(result);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700868
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800869 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800870 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800871 case CANCEL_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800872 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800873 int buf = data.readInt32();
Jamie Gennis1df8c342012-12-20 14:05:45 -0800874 sp<Fence> fence = new Fence();
Pablo Ceballos70636b32016-07-06 15:24:54 -0700875 status_t result = data.read(*fence.get());
876 if (result == NO_ERROR) {
877 result = cancelBuffer(buf, fence);
878 }
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700879 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800880 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800881 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700882 case QUERY: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800883 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700884 int value = 0;
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700885 int what = data.readInt32();
886 int res = query(what, &value);
887 reply->writeInt32(value);
888 reply->writeInt32(res);
889 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800890 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700891 case CONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800892 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stozaf0eaf252014-03-21 13:05:51 -0700893 sp<IProducerListener> listener;
894 if (data.readInt32() == 1) {
895 listener = IProducerListener::asInterface(data.readStrongBinder());
896 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700897 int api = data.readInt32();
Mathias Agopian595264f2013-07-16 22:56:09 -0700898 bool producerControlledByApp = data.readInt32();
Brian Andersonbaaad322016-07-22 15:55:13 -0700899 QueueBufferOutput output;
900 status_t res = connect(listener, api, producerControlledByApp, &output);
901 reply->write(output);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700902 reply->writeInt32(res);
903 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800904 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700905 case DISCONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800906 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700907 int api = data.readInt32();
Robert Carr97b9c862016-09-08 13:54:35 -0700908 DisconnectMode mode = static_cast<DisconnectMode>(data.readInt32());
909 status_t res = disconnect(api, mode);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700910 reply->writeInt32(res);
911 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800912 }
Jesse Hall399184a2014-03-03 15:42:54 -0800913 case SET_SIDEBAND_STREAM: {
914 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
915 sp<NativeHandle> stream;
916 if (data.readInt32()) {
Wonsik Kim0ec54e12014-03-21 10:46:24 +0900917 stream = NativeHandle::create(data.readNativeHandle(), true);
Jesse Hall399184a2014-03-03 15:42:54 -0800918 }
919 status_t result = setSidebandStream(stream);
920 reply->writeInt32(result);
921 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800922 }
Dan Stoza9de72932015-04-16 17:28:43 -0700923 case ALLOCATE_BUFFERS: {
Dan Stoza29a3e902014-06-20 13:13:57 -0700924 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800925 uint32_t width = data.readUint32();
926 uint32_t height = data.readUint32();
927 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700928 uint64_t usage = data.readUint64();
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700929 allocateBuffers(width, height, format, usage);
Dan Stoza29a3e902014-06-20 13:13:57 -0700930 return NO_ERROR;
Dan Stoza9de72932015-04-16 17:28:43 -0700931 }
932 case ALLOW_ALLOCATION: {
933 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
934 bool allow = static_cast<bool>(data.readInt32());
935 status_t result = allowAllocation(allow);
936 reply->writeInt32(result);
937 return NO_ERROR;
938 }
Dan Stoza812ed062015-06-02 15:45:22 -0700939 case SET_GENERATION_NUMBER: {
940 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
941 uint32_t generationNumber = data.readUint32();
942 status_t result = setGenerationNumber(generationNumber);
943 reply->writeInt32(result);
944 return NO_ERROR;
945 }
Dan Stozac6f30bd2015-06-08 09:32:50 -0700946 case GET_CONSUMER_NAME: {
947 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
948 reply->writeString8(getConsumerName());
949 return NO_ERROR;
950 }
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700951 case SET_SHARED_BUFFER_MODE: {
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700952 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700953 bool sharedBufferMode = data.readInt32();
954 status_t result = setSharedBufferMode(sharedBufferMode);
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700955 reply->writeInt32(result);
956 return NO_ERROR;
957 }
Pablo Ceballosff95aab2016-01-13 17:09:58 -0800958 case SET_AUTO_REFRESH: {
959 CHECK_INTERFACE(IGraphicBuffer, data, reply);
960 bool autoRefresh = data.readInt32();
961 status_t result = setAutoRefresh(autoRefresh);
962 reply->writeInt32(result);
963 return NO_ERROR;
964 }
Dan Stoza127fc632015-06-30 13:43:32 -0700965 case SET_DEQUEUE_TIMEOUT: {
966 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
967 nsecs_t timeout = data.readInt64();
968 status_t result = setDequeueTimeout(timeout);
969 reply->writeInt32(result);
970 return NO_ERROR;
971 }
Dan Stoza50101d02016-04-07 16:53:23 -0700972 case GET_LAST_QUEUED_BUFFER: {
973 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
974 sp<GraphicBuffer> buffer(nullptr);
975 sp<Fence> fence(Fence::NO_FENCE);
John Reck1a61da52016-04-28 13:18:15 -0700976 float transform[16] = {};
977 status_t result = getLastQueuedBuffer(&buffer, &fence, transform);
Dan Stoza50101d02016-04-07 16:53:23 -0700978 reply->writeInt32(result);
979 if (result != NO_ERROR) {
980 return result;
981 }
John Reckce8e5df2016-04-28 10:12:47 -0700982 if (!buffer.get()) {
983 reply->writeBool(false);
984 } else {
985 reply->writeBool(true);
986 result = reply->write(*buffer);
John Reck1a61da52016-04-28 13:18:15 -0700987 if (result == NO_ERROR) {
988 reply->write(transform, sizeof(float) * 16);
989 }
John Reckce8e5df2016-04-28 10:12:47 -0700990 }
Dan Stoza50101d02016-04-07 16:53:23 -0700991 if (result != NO_ERROR) {
992 ALOGE("getLastQueuedBuffer failed to write buffer: %d", result);
993 return result;
994 }
Tobin Ehlis209e5fb2019-03-26 14:06:29 -0600995 if (fence == nullptr) {
996 ALOGE("getLastQueuedBuffer returned a NULL fence, setting to Fence::NO_FENCE");
997 fence = Fence::NO_FENCE;
998 }
Dan Stoza50101d02016-04-07 16:53:23 -0700999 result = reply->write(*fence);
1000 if (result != NO_ERROR) {
1001 ALOGE("getLastQueuedBuffer failed to write fence: %d", result);
1002 return result;
1003 }
1004 return NO_ERROR;
1005 }
Pablo Ceballosce796e72016-02-04 19:10:51 -08001006 case GET_FRAME_TIMESTAMPS: {
1007 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson3890c392016-07-25 12:48:08 -07001008 FrameEventHistoryDelta frameTimestamps;
1009 getFrameTimestamps(&frameTimestamps);
1010 status_t result = reply->write(frameTimestamps);
Pablo Ceballosce796e72016-02-04 19:10:51 -08001011 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -07001012 ALOGE("BnGBP::GET_FRAME_TIMESTAMPS failed to write buffer: %d",
1013 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -08001014 return result;
1015 }
Pablo Ceballosce796e72016-02-04 19:10:51 -08001016 return NO_ERROR;
1017 }
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -07001018 case GET_UNIQUE_ID: {
1019 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1020 uint64_t outId = 0;
1021 status_t actualResult = getUniqueId(&outId);
1022 status_t result = reply->writeInt32(actualResult);
1023 if (result != NO_ERROR) {
1024 return result;
1025 }
1026 result = reply->writeUint64(outId);
1027 if (result != NO_ERROR) {
1028 return result;
1029 }
1030 return NO_ERROR;
1031 }
Chia-I Wue2786ea2017-08-07 10:36:08 -07001032 case GET_CONSUMER_USAGE: {
1033 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1034 uint64_t outUsage = 0;
1035 status_t actualResult = getConsumerUsage(&outUsage);
1036 status_t result = reply->writeInt32(actualResult);
1037 if (result != NO_ERROR) {
1038 return result;
1039 }
1040 result = reply->writeUint64(outUsage);
1041 if (result != NO_ERROR) {
1042 return result;
1043 }
1044 return NO_ERROR;
1045 }
Sungtak Lee3249fb62019-03-02 16:40:47 -08001046 case SET_LEGACY_BUFFER_DROP: {
1047 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1048 bool drop = data.readInt32();
1049 int result = setLegacyBufferDrop(drop);
1050 reply->writeInt32(result);
1051 return NO_ERROR;
1052 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001053 }
1054 return BBinder::onTransact(code, data, reply, flags);
1055}
1056
1057// ----------------------------------------------------------------------------
1058
Andy McFadden2adaf042012-12-18 09:49:45 -08001059IGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) {
Jesse Hallc777b0b2012-06-28 12:52:05 -07001060 parcel.read(*this);
1061}
1062
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001063constexpr size_t IGraphicBufferProducer::QueueBufferInput::minFlattenedSize() {
1064 return sizeof(timestamp) +
1065 sizeof(isAutoTimestamp) +
1066 sizeof(dataSpace) +
1067 sizeof(crop) +
1068 sizeof(scalingMode) +
1069 sizeof(transform) +
1070 sizeof(stickyTransform) +
1071 sizeof(getFrameTimestamps);
1072}
1073
Mathias Agopiane1424282013-07-29 21:24:40 -07001074size_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const {
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001075 return minFlattenedSize() +
1076 fence->getFlattenedSize() +
Courtney Goeltzenleuchter9bad0d72017-12-19 12:34:34 -07001077 surfaceDamage.getFlattenedSize() +
1078 hdrMetadata.getFlattenedSize();
Jesse Hallc777b0b2012-06-28 12:52:05 -07001079}
1080
Mathias Agopiane1424282013-07-29 21:24:40 -07001081size_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const {
Jamie Gennis1df8c342012-12-20 14:05:45 -08001082 return fence->getFdCount();
Jesse Hallc777b0b2012-06-28 12:52:05 -07001083}
1084
Mathias Agopiane1424282013-07-29 21:24:40 -07001085status_t IGraphicBufferProducer::QueueBufferInput::flatten(
1086 void*& buffer, size_t& size, int*& fds, size_t& count) const
Jesse Hallc777b0b2012-06-28 12:52:05 -07001087{
Mathias Agopiane1424282013-07-29 21:24:40 -07001088 if (size < getFlattenedSize()) {
1089 return NO_MEMORY;
1090 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001091
Mathias Agopiane1424282013-07-29 21:24:40 -07001092 FlattenableUtils::write(buffer, size, timestamp);
Andy McFadden3c256212013-08-16 14:55:39 -07001093 FlattenableUtils::write(buffer, size, isAutoTimestamp);
Eino-Ville Talvala82c6bcc2015-02-19 16:10:43 -08001094 FlattenableUtils::write(buffer, size, dataSpace);
Mathias Agopiane1424282013-07-29 21:24:40 -07001095 FlattenableUtils::write(buffer, size, crop);
1096 FlattenableUtils::write(buffer, size, scalingMode);
1097 FlattenableUtils::write(buffer, size, transform);
Ruben Brunk1681d952014-06-27 15:51:55 -07001098 FlattenableUtils::write(buffer, size, stickyTransform);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001099 FlattenableUtils::write(buffer, size, getFrameTimestamps);
1100
Dan Stoza5065a552015-03-17 16:23:42 -07001101 status_t result = fence->flatten(buffer, size, fds, count);
1102 if (result != NO_ERROR) {
1103 return result;
1104 }
Courtney Goeltzenleuchter9bad0d72017-12-19 12:34:34 -07001105 result = surfaceDamage.flatten(buffer, size);
1106 if (result != NO_ERROR) {
1107 return result;
1108 }
1109 FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize());
1110 return hdrMetadata.flatten(buffer, size);
Jesse Hallc777b0b2012-06-28 12:52:05 -07001111}
1112
Mathias Agopiane1424282013-07-29 21:24:40 -07001113status_t IGraphicBufferProducer::QueueBufferInput::unflatten(
1114 void const*& buffer, size_t& size, int const*& fds, size_t& count)
Jesse Hallc777b0b2012-06-28 12:52:05 -07001115{
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001116 if (size < minFlattenedSize()) {
Mathias Agopiane1424282013-07-29 21:24:40 -07001117 return NO_MEMORY;
1118 }
1119
1120 FlattenableUtils::read(buffer, size, timestamp);
Andy McFadden3c256212013-08-16 14:55:39 -07001121 FlattenableUtils::read(buffer, size, isAutoTimestamp);
Eino-Ville Talvala82c6bcc2015-02-19 16:10:43 -08001122 FlattenableUtils::read(buffer, size, dataSpace);
Mathias Agopiane1424282013-07-29 21:24:40 -07001123 FlattenableUtils::read(buffer, size, crop);
1124 FlattenableUtils::read(buffer, size, scalingMode);
1125 FlattenableUtils::read(buffer, size, transform);
Ruben Brunk1681d952014-06-27 15:51:55 -07001126 FlattenableUtils::read(buffer, size, stickyTransform);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001127 FlattenableUtils::read(buffer, size, getFrameTimestamps);
Mathias Agopiane1424282013-07-29 21:24:40 -07001128
Jamie Gennis1df8c342012-12-20 14:05:45 -08001129 fence = new Fence();
Dan Stoza5065a552015-03-17 16:23:42 -07001130 status_t result = fence->unflatten(buffer, size, fds, count);
1131 if (result != NO_ERROR) {
1132 return result;
1133 }
Courtney Goeltzenleuchter9bad0d72017-12-19 12:34:34 -07001134 result = surfaceDamage.unflatten(buffer, size);
1135 if (result != NO_ERROR) {
1136 return result;
1137 }
1138 FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize());
1139 return hdrMetadata.unflatten(buffer, size);
Jesse Hallc777b0b2012-06-28 12:52:05 -07001140}
1141
Brian Andersonbaaad322016-07-22 15:55:13 -07001142// ----------------------------------------------------------------------------
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001143constexpr size_t IGraphicBufferProducer::QueueBufferOutput::minFlattenedSize() {
1144 return sizeof(width) +
1145 sizeof(height) +
1146 sizeof(transformHint) +
1147 sizeof(numPendingBuffers) +
Shuzhen Wang22f842b2017-01-18 23:02:36 -08001148 sizeof(nextFrameNumber) +
1149 sizeof(bufferReplaced);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001150}
Brian Andersonbaaad322016-07-22 15:55:13 -07001151
1152size_t IGraphicBufferProducer::QueueBufferOutput::getFlattenedSize() const {
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001153 return minFlattenedSize() + frameTimestamps.getFlattenedSize();
Brian Andersonbaaad322016-07-22 15:55:13 -07001154}
1155
1156size_t IGraphicBufferProducer::QueueBufferOutput::getFdCount() const {
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001157 return frameTimestamps.getFdCount();
Brian Andersonbaaad322016-07-22 15:55:13 -07001158}
1159
1160status_t IGraphicBufferProducer::QueueBufferOutput::flatten(
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001161 void*& buffer, size_t& size, int*& fds, size_t& count) const
Brian Andersonbaaad322016-07-22 15:55:13 -07001162{
1163 if (size < getFlattenedSize()) {
1164 return NO_MEMORY;
1165 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001166
Brian Andersonbaaad322016-07-22 15:55:13 -07001167 FlattenableUtils::write(buffer, size, width);
1168 FlattenableUtils::write(buffer, size, height);
1169 FlattenableUtils::write(buffer, size, transformHint);
1170 FlattenableUtils::write(buffer, size, numPendingBuffers);
1171 FlattenableUtils::write(buffer, size, nextFrameNumber);
Shuzhen Wang22f842b2017-01-18 23:02:36 -08001172 FlattenableUtils::write(buffer, size, bufferReplaced);
Brian Andersonbaaad322016-07-22 15:55:13 -07001173
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001174 return frameTimestamps.flatten(buffer, size, fds, count);
Brian Andersonbaaad322016-07-22 15:55:13 -07001175}
1176
1177status_t IGraphicBufferProducer::QueueBufferOutput::unflatten(
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001178 void const*& buffer, size_t& size, int const*& fds, size_t& count)
Brian Andersonbaaad322016-07-22 15:55:13 -07001179{
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001180 if (size < minFlattenedSize()) {
Brian Andersonbaaad322016-07-22 15:55:13 -07001181 return NO_MEMORY;
1182 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001183
Brian Andersonbaaad322016-07-22 15:55:13 -07001184 FlattenableUtils::read(buffer, size, width);
1185 FlattenableUtils::read(buffer, size, height);
1186 FlattenableUtils::read(buffer, size, transformHint);
1187 FlattenableUtils::read(buffer, size, numPendingBuffers);
1188 FlattenableUtils::read(buffer, size, nextFrameNumber);
Shuzhen Wang22f842b2017-01-18 23:02:36 -08001189 FlattenableUtils::read(buffer, size, bufferReplaced);
Brian Andersonbaaad322016-07-22 15:55:13 -07001190
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001191 return frameTimestamps.unflatten(buffer, size, fds, count);
Brian Andersonbaaad322016-07-22 15:55:13 -07001192}
1193
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001194}; // namespace android