blob: 918ff2dd2579f92a17b3beddbb6d5a574f79d78d [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
Pawin Vongmasae672cd02019-02-14 16:01:29 -080030#include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h>
31#include <gui/bufferqueue/2.0/H2BGraphicBufferProducer.h>
Chia-I Wuc79a2962017-05-15 10:32:27 -070032#include <gui/BufferQueueDefs.h>
Andy McFadden2adaf042012-12-18 09:49:45 -080033#include <gui/IGraphicBufferProducer.h>
Dan Stozaf0eaf252014-03-21 13:05:51 -070034#include <gui/IProducerListener.h>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080035
36namespace android {
37// ----------------------------------------------------------------------------
38
Pawin Vongmasae672cd02019-02-14 16:01:29 -080039using H2BGraphicBufferProducerV1_0 =
40 ::android::hardware::graphics::bufferqueue::V1_0::utils::
41 H2BGraphicBufferProducer;
42using H2BGraphicBufferProducerV2_0 =
43 ::android::hardware::graphics::bufferqueue::V2_0::utils::
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -080044 H2BGraphicBufferProducer;
45
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080046enum {
47 REQUEST_BUFFER = IBinder::FIRST_CALL_TRANSACTION,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080048 DEQUEUE_BUFFER,
Dan Stoza9f3053d2014-03-06 15:14:33 -080049 DETACH_BUFFER,
Dan Stozad9822a32014-03-28 15:25:31 -070050 DETACH_NEXT_BUFFER,
Dan Stoza9f3053d2014-03-06 15:14:33 -080051 ATTACH_BUFFER,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080052 QUEUE_BUFFER,
53 CANCEL_BUFFER,
Mathias Agopianeafabcd2011-04-20 14:20:59 -070054 QUERY,
Jamie Gennisfe0a87b2011-07-13 19:12:20 -070055 CONNECT,
56 DISCONNECT,
Jesse Hall399184a2014-03-03 15:42:54 -080057 SET_SIDEBAND_STREAM,
Dan Stoza29a3e902014-06-20 13:13:57 -070058 ALLOCATE_BUFFERS,
Dan Stoza9de72932015-04-16 17:28:43 -070059 ALLOW_ALLOCATION,
Dan Stoza812ed062015-06-02 15:45:22 -070060 SET_GENERATION_NUMBER,
Dan Stozac6f30bd2015-06-08 09:32:50 -070061 GET_CONSUMER_NAME,
Pablo Ceballosfa455352015-08-12 17:47:47 -070062 SET_MAX_DEQUEUED_BUFFER_COUNT,
Dan Stoza7dde5992015-05-22 09:51:44 -070063 SET_ASYNC_MODE,
Pablo Ceballos3559fbf2016-03-17 15:50:23 -070064 SET_SHARED_BUFFER_MODE,
Pablo Ceballosff95aab2016-01-13 17:09:58 -080065 SET_AUTO_REFRESH,
Dan Stoza127fc632015-06-30 13:43:32 -070066 SET_DEQUEUE_TIMEOUT,
Dan Stoza50101d02016-04-07 16:53:23 -070067 GET_LAST_QUEUED_BUFFER,
Pablo Ceballosfc352582016-06-30 17:22:20 -070068 GET_FRAME_TIMESTAMPS,
Chia-I Wue2786ea2017-08-07 10:36:08 -070069 GET_UNIQUE_ID,
70 GET_CONSUMER_USAGE,
Sungtak Lee3249fb62019-03-02 16:40:47 -080071 SET_LEGACY_BUFFER_DROP,
Yiwei Zhang538cedc2019-06-24 19:35:03 -070072 SET_AUTO_PREROTATION,
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +070073 REQUEST_BUFFERS,
74 DEQUEUE_BUFFERS,
75 DETACH_BUFFERS,
76 ATTACH_BUFFERS,
77 QUEUE_BUFFERS,
78 CANCEL_BUFFERS,
79 QUERY_MULTIPLE,
John Reckaa5a0b22021-05-18 00:42:56 -040080 GET_LAST_QUEUED_BUFFER2,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080081};
82
Andy McFadden2adaf042012-12-18 09:49:45 -080083class BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080084{
85public:
Chih-Hung Hsiehe2347b72016-04-25 15:41:05 -070086 explicit BpGraphicBufferProducer(const sp<IBinder>& impl)
Andy McFadden2adaf042012-12-18 09:49:45 -080087 : BpInterface<IGraphicBufferProducer>(impl)
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080088 {
89 }
90
Yi Kongca038512017-05-02 16:55:24 -070091 ~BpGraphicBufferProducer() override;
Dan Stoza3be1c6b2014-11-18 10:24:03 -080092
Jamie Gennis7b305ff2011-07-19 12:08:33 -070093 virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080094 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -080095 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080096 data.writeInt32(bufferIdx);
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +070097 status_t result = remote()->transact(REQUEST_BUFFER, data, &reply);
Jamie Gennis8a29ff22011-10-14 15:03:17 -070098 if (result != NO_ERROR) {
99 return result;
100 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800101 bool nonNull = reply.readInt32();
102 if (nonNull) {
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700103 *buf = new GraphicBuffer();
Lingyun Zhu2aff7022012-11-20 19:24:35 +0800104 result = reply.read(**buf);
105 if(result != NO_ERROR) {
106 (*buf).clear();
107 return result;
108 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800109 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700110 result = reply.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700111 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800112 }
113
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700114 virtual status_t requestBuffers(
115 const std::vector<int32_t>& slots,
116 std::vector<RequestBufferOutput>* outputs) override {
117 Parcel data, reply;
118 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
119 data.writeInt32Vector(slots);
120 status_t result = remote()->transact(REQUEST_BUFFERS, data, &reply);
121 if (result != NO_ERROR) {
122 return result;
123 }
124 result = reply.resizeOutVector(outputs);
125 for (RequestBufferOutput& output : *outputs) {
126 if (result != NO_ERROR) {
127 return result;
128 }
129 result = reply.read(output);
130 }
131
132 return result;
133 }
134
Pablo Ceballosfa455352015-08-12 17:47:47 -0700135 virtual status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) {
136 Parcel data, reply;
137 data.writeInterfaceToken(
138 IGraphicBufferProducer::getInterfaceDescriptor());
139 data.writeInt32(maxDequeuedBuffers);
140 status_t result = remote()->transact(SET_MAX_DEQUEUED_BUFFER_COUNT,
141 data, &reply);
142 if (result != NO_ERROR) {
143 return result;
144 }
145 result = reply.readInt32();
146 return result;
147 }
148
149 virtual status_t setAsyncMode(bool async) {
150 Parcel data, reply;
151 data.writeInterfaceToken(
152 IGraphicBufferProducer::getInterfaceDescriptor());
153 data.writeInt32(async);
154 status_t result = remote()->transact(SET_ASYNC_MODE,
155 data, &reply);
156 if (result != NO_ERROR) {
157 return result;
158 }
159 result = reply.readInt32();
160 return result;
161 }
162
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600163 virtual status_t dequeueBuffer(int* buf, sp<Fence>* fence, uint32_t width, uint32_t height,
164 PixelFormat format, uint64_t usage, uint64_t* outBufferAge,
165 FrameEventHistoryDelta* outTimestamps) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800166 Parcel data, reply;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700167 bool getFrameTimestamps = (outTimestamps != nullptr);
Brian Andersonbaaad322016-07-22 15:55:13 -0700168
Andy McFadden2adaf042012-12-18 09:49:45 -0800169 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800170 data.writeUint32(width);
171 data.writeUint32(height);
172 data.writeInt32(static_cast<int32_t>(format));
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700173 data.writeUint64(usage);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700174 data.writeBool(getFrameTimestamps);
Brian Andersonbaaad322016-07-22 15:55:13 -0700175
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700176 status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply);
177 if (result != NO_ERROR) {
178 return result;
179 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700180
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800181 *buf = reply.readInt32();
Brian Andersonbaaad322016-07-22 15:55:13 -0700182 *fence = new Fence();
183 result = reply.read(**fence);
184 if (result != NO_ERROR) {
185 fence->clear();
186 return result;
Jesse Hallf7857542012-06-14 15:26:33 -0700187 }
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600188 if (outBufferAge) {
189 result = reply.readUint64(outBufferAge);
190 } else {
191 // Read the value even if outBufferAge is nullptr:
192 uint64_t bufferAge;
193 result = reply.readUint64(&bufferAge);
194 }
195 if (result != NO_ERROR) {
196 ALOGE("IGBP::dequeueBuffer failed to read buffer age: %d", result);
197 return result;
198 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700199 if (getFrameTimestamps) {
200 result = reply.read(*outTimestamps);
201 if (result != NO_ERROR) {
202 ALOGE("IGBP::dequeueBuffer failed to read timestamps: %d",
203 result);
204 return result;
205 }
206 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700207 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800208 return result;
209 }
210
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700211 virtual status_t dequeueBuffers(
212 const std::vector<DequeueBufferInput>& inputs,
213 std::vector<DequeueBufferOutput>* outputs) {
214 Parcel data, reply;
215 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
216 data.writeVectorSize(inputs);
217 for (const auto& input : inputs) {
218 data.write(input);
219 }
220 status_t result = remote()->transact(DEQUEUE_BUFFERS, data, &reply);
221 if (result != NO_ERROR) {
222 return result;
223 }
224 result = reply.resizeOutVector(outputs);
225 for (auto& output : *outputs) {
226 if (result != NO_ERROR) {
227 return result;
228 }
229 result = reply.read(output);
230 }
231 return result;
232 }
233
Dan Stoza9f3053d2014-03-06 15:14:33 -0800234 virtual status_t detachBuffer(int slot) {
235 Parcel data, reply;
236 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
237 data.writeInt32(slot);
238 status_t result = remote()->transact(DETACH_BUFFER, data, &reply);
239 if (result != NO_ERROR) {
240 return result;
241 }
242 result = reply.readInt32();
243 return result;
244 }
245
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700246 virtual status_t detachBuffers(const std::vector<int32_t>& slots,
247 std::vector<status_t>* results) {
248 Parcel data, reply;
249 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
250 data.writeInt32Vector(slots);
251 status_t result = remote()->transact(DETACH_BUFFERS, data, &reply);
252 if (result != NO_ERROR) {
253 return result;
254 }
255 result = reply.readInt32Vector(results);
256 return result;
257 }
258
Dan Stozad9822a32014-03-28 15:25:31 -0700259 virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer,
260 sp<Fence>* outFence) {
Yi Kong48a619f2018-06-05 16:34:59 -0700261 if (outBuffer == nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -0700262 ALOGE("detachNextBuffer: outBuffer must not be NULL");
263 return BAD_VALUE;
Yi Kong48a619f2018-06-05 16:34:59 -0700264 } else if (outFence == nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -0700265 ALOGE("detachNextBuffer: outFence must not be NULL");
266 return BAD_VALUE;
267 }
268 Parcel data, reply;
269 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
270 status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply);
271 if (result != NO_ERROR) {
272 return result;
273 }
274 result = reply.readInt32();
275 if (result == NO_ERROR) {
276 bool nonNull = reply.readInt32();
277 if (nonNull) {
278 *outBuffer = new GraphicBuffer;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700279 result = reply.read(**outBuffer);
280 if (result != NO_ERROR) {
281 outBuffer->clear();
282 return result;
283 }
Dan Stozad9822a32014-03-28 15:25:31 -0700284 }
285 nonNull = reply.readInt32();
286 if (nonNull) {
287 *outFence = new Fence;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700288 result = reply.read(**outFence);
289 if (result != NO_ERROR) {
290 outBuffer->clear();
291 outFence->clear();
292 return result;
293 }
Dan Stozad9822a32014-03-28 15:25:31 -0700294 }
295 }
296 return result;
297 }
298
Dan Stoza9f3053d2014-03-06 15:14:33 -0800299 virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) {
300 Parcel data, reply;
301 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
302 data.write(*buffer.get());
303 status_t result = remote()->transact(ATTACH_BUFFER, data, &reply);
304 if (result != NO_ERROR) {
305 return result;
306 }
Chia-I Wuc79a2962017-05-15 10:32:27 -0700307
Dan Stoza9f3053d2014-03-06 15:14:33 -0800308 *slot = reply.readInt32();
309 result = reply.readInt32();
Chia-I Wuc79a2962017-05-15 10:32:27 -0700310 if (result == NO_ERROR &&
311 (*slot < 0 || *slot >= BufferQueueDefs::NUM_BUFFER_SLOTS)) {
312 ALOGE("attachBuffer returned invalid slot %d", *slot);
313 android_errorWriteLog(0x534e4554, "37478824");
314 return UNKNOWN_ERROR;
315 }
316
Dan Stoza9f3053d2014-03-06 15:14:33 -0800317 return result;
318 }
319
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700320 virtual status_t attachBuffers(
321 const std::vector<sp<GraphicBuffer>>& buffers,
322 std::vector<AttachBufferOutput>* outputs) {
323 Parcel data, reply;
324 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
325 data.writeVectorSize(buffers);
326 for (const sp<GraphicBuffer>& buffer : buffers) {
327 data.write(*buffer.get());
328 }
329 status_t result = remote()->transact(ATTACH_BUFFERS, data, &reply);
330 if (result != NO_ERROR) {
331 return result;
332 }
333 result = reply.resizeOutVector(outputs);
334 for (AttachBufferOutput& output : *outputs) {
335 if (result != NO_ERROR) {
336 return result;
337 }
338 result = reply.read(output);
339 }
340 if (result == NO_ERROR) {
341 for (AttachBufferOutput& output : *outputs) {
342 if (output.result == NO_ERROR && output.slot < 0) {
343 ALOGE("attachBuffers returned invalid slot %d",
344 output.slot);
345 android_errorWriteLog(0x534e4554, "37478824");
346 output.result = UNKNOWN_ERROR;
347 }
348 }
349 }
350 return result;
351 }
352
Mathias Agopianf0bc2f12012-04-09 16:14:01 -0700353 virtual status_t queueBuffer(int buf,
354 const QueueBufferInput& input, QueueBufferOutput* output) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800355 Parcel data, reply;
Brian Andersonbaaad322016-07-22 15:55:13 -0700356
Andy McFadden2adaf042012-12-18 09:49:45 -0800357 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800358 data.writeInt32(buf);
Jesse Hallc777b0b2012-06-28 12:52:05 -0700359 data.write(input);
Brian Andersonbaaad322016-07-22 15:55:13 -0700360
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700361 status_t result = remote()->transact(QUEUE_BUFFER, data, &reply);
362 if (result != NO_ERROR) {
363 return result;
364 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700365
366 result = reply.read(*output);
367 if (result != NO_ERROR) {
368 return result;
369 }
370
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700371 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800372 return result;
373 }
374
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700375 virtual status_t queueBuffers(const std::vector<QueueBufferInput>& inputs,
376 std::vector<QueueBufferOutput>* outputs) {
377 Parcel data, reply;
378 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
379 data.writeVectorSize(inputs);
380 for (const QueueBufferInput& input : inputs) {
381 data.write(input);
382 }
383 status_t result = remote()->transact(QUEUE_BUFFERS, data, &reply);
384 if (result != NO_ERROR) {
385 return result;
386 }
387 result = reply.resizeOutVector(outputs);
388 for (QueueBufferOutput& output : *outputs) {
389 if (result != NO_ERROR) {
390 return result;
391 }
392 result = reply.read(output);
393 }
394 return result;
395 }
396
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700397 virtual status_t cancelBuffer(int buf, const sp<Fence>& fence) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800398 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800399 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800400 data.writeInt32(buf);
Jamie Gennis1df8c342012-12-20 14:05:45 -0800401 data.write(*fence.get());
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700402 status_t result = remote()->transact(CANCEL_BUFFER, data, &reply);
403 if (result != NO_ERROR) {
404 return result;
405 }
406 result = reply.readInt32();
407 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800408 }
409
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700410 virtual status_t cancelBuffers(
411 const std::vector<CancelBufferInput>& inputs,
412 std::vector<status_t>* results) {
413 Parcel data, reply;
414 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
415 data.writeVectorSize(inputs);
416 for (const CancelBufferInput& input : inputs) {
417 data.write(input);
418 }
419 status_t result = remote()->transact(CANCEL_BUFFERS, data, &reply);
420 if (result != NO_ERROR) {
421 return result;
422 }
423 result = reply.readInt32Vector(results);
424 return result;
425 }
426
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700427 virtual int query(int what, int* value) {
428 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800429 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700430 data.writeInt32(what);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700431 status_t result = remote()->transact(QUERY, data, &reply);
432 if (result != NO_ERROR) {
433 return result;
434 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700435 value[0] = reply.readInt32();
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700436 result = reply.readInt32();
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700437 return result;
438 }
439
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700440 virtual status_t query(const std::vector<int32_t> inputs,
441 std::vector<QueryOutput>* outputs) {
442 Parcel data, reply;
443 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
444 data.writeInt32Vector(inputs);
445 status_t result = remote()->transact(QUERY_MULTIPLE, data, &reply);
446 if (result != NO_ERROR) {
447 return result;
448 }
449 result = reply.resizeOutVector(outputs);
450 for (QueryOutput& output : *outputs) {
451 if (result != NO_ERROR) {
452 return result;
453 }
454 result = reply.read(output);
455 }
456 return result;
457 }
458
Dan Stozaf0eaf252014-03-21 13:05:51 -0700459 virtual status_t connect(const sp<IProducerListener>& listener,
Mathias Agopian365857d2013-09-11 19:35:45 -0700460 int api, bool producerControlledByApp, QueueBufferOutput* output) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700461 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800462 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Yi Kong48a619f2018-06-05 16:34:59 -0700463 if (listener != nullptr) {
Dan Stozaf0eaf252014-03-21 13:05:51 -0700464 data.writeInt32(1);
Marco Nelissen097ca272014-11-14 08:01:01 -0800465 data.writeStrongBinder(IInterface::asBinder(listener));
Dan Stozaf0eaf252014-03-21 13:05:51 -0700466 } else {
467 data.writeInt32(0);
468 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700469 data.writeInt32(api);
Mathias Agopian595264f2013-07-16 22:56:09 -0700470 data.writeInt32(producerControlledByApp);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700471 status_t result = remote()->transact(CONNECT, data, &reply);
472 if (result != NO_ERROR) {
473 return result;
474 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700475 reply.read(*output);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700476 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700477 return result;
478 }
Mathias Agopian80727112011-05-02 19:51:12 -0700479
Robert Carr97b9c862016-09-08 13:54:35 -0700480 virtual status_t disconnect(int api, DisconnectMode mode) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700481 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800482 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700483 data.writeInt32(api);
Robert Carr97b9c862016-09-08 13:54:35 -0700484 data.writeInt32(static_cast<int32_t>(mode));
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700485 status_t result =remote()->transact(DISCONNECT, data, &reply);
486 if (result != NO_ERROR) {
487 return result;
488 }
489 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700490 return result;
491 }
Jesse Hall399184a2014-03-03 15:42:54 -0800492
493 virtual status_t setSidebandStream(const sp<NativeHandle>& stream) {
494 Parcel data, reply;
495 status_t result;
496 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
497 if (stream.get()) {
498 data.writeInt32(true);
499 data.writeNativeHandle(stream->handle());
500 } else {
501 data.writeInt32(false);
502 }
503 if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) {
504 result = reply.readInt32();
505 }
506 return result;
507 }
Dan Stoza29a3e902014-06-20 13:13:57 -0700508
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700509 virtual void allocateBuffers(uint32_t width, uint32_t height,
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700510 PixelFormat format, uint64_t usage) {
Dan Stoza29a3e902014-06-20 13:13:57 -0700511 Parcel data, reply;
512 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800513 data.writeUint32(width);
514 data.writeUint32(height);
Dan Stoza29a3e902014-06-20 13:13:57 -0700515 data.writeInt32(static_cast<int32_t>(format));
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700516 data.writeUint64(usage);
Steven Moreland366eb422019-04-01 19:22:32 -0700517 status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply, IBinder::FLAG_ONEWAY);
Dan Stoza29a3e902014-06-20 13:13:57 -0700518 if (result != NO_ERROR) {
519 ALOGE("allocateBuffers failed to transact: %d", result);
520 }
521 }
Dan Stoza9de72932015-04-16 17:28:43 -0700522
523 virtual status_t allowAllocation(bool allow) {
524 Parcel data, reply;
525 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
526 data.writeInt32(static_cast<int32_t>(allow));
527 status_t result = remote()->transact(ALLOW_ALLOCATION, data, &reply);
528 if (result != NO_ERROR) {
529 return result;
530 }
531 result = reply.readInt32();
532 return result;
533 }
Dan Stoza812ed062015-06-02 15:45:22 -0700534
535 virtual status_t setGenerationNumber(uint32_t generationNumber) {
536 Parcel data, reply;
537 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
538 data.writeUint32(generationNumber);
539 status_t result = remote()->transact(SET_GENERATION_NUMBER, data, &reply);
540 if (result == NO_ERROR) {
541 result = reply.readInt32();
542 }
543 return result;
544 }
Dan Stozac6f30bd2015-06-08 09:32:50 -0700545
546 virtual String8 getConsumerName() const {
547 Parcel data, reply;
548 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
549 status_t result = remote()->transact(GET_CONSUMER_NAME, data, &reply);
550 if (result != NO_ERROR) {
551 ALOGE("getConsumerName failed to transact: %d", result);
552 return String8("TransactFailed");
553 }
554 return reply.readString8();
555 }
Dan Stoza7dde5992015-05-22 09:51:44 -0700556
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700557 virtual status_t setSharedBufferMode(bool sharedBufferMode) {
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700558 Parcel data, reply;
559 data.writeInterfaceToken(
560 IGraphicBufferProducer::getInterfaceDescriptor());
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700561 data.writeInt32(sharedBufferMode);
562 status_t result = remote()->transact(SET_SHARED_BUFFER_MODE, data,
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700563 &reply);
564 if (result == NO_ERROR) {
565 result = reply.readInt32();
566 }
567 return result;
568 }
Dan Stoza127fc632015-06-30 13:43:32 -0700569
Pablo Ceballosff95aab2016-01-13 17:09:58 -0800570 virtual status_t setAutoRefresh(bool autoRefresh) {
571 Parcel data, reply;
572 data.writeInterfaceToken(
573 IGraphicBufferProducer::getInterfaceDescriptor());
574 data.writeInt32(autoRefresh);
575 status_t result = remote()->transact(SET_AUTO_REFRESH, data, &reply);
576 if (result == NO_ERROR) {
577 result = reply.readInt32();
578 }
579 return result;
580 }
581
Dan Stoza127fc632015-06-30 13:43:32 -0700582 virtual status_t setDequeueTimeout(nsecs_t timeout) {
583 Parcel data, reply;
584 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
585 data.writeInt64(timeout);
586 status_t result = remote()->transact(SET_DEQUEUE_TIMEOUT, data, &reply);
587 if (result != NO_ERROR) {
588 ALOGE("setDequeueTimeout failed to transact: %d", result);
589 return result;
590 }
591 return reply.readInt32();
592 }
Dan Stoza50101d02016-04-07 16:53:23 -0700593
Sungtak Lee3249fb62019-03-02 16:40:47 -0800594 virtual status_t setLegacyBufferDrop(bool drop) {
595 Parcel data, reply;
596 data.writeInterfaceToken(
597 IGraphicBufferProducer::getInterfaceDescriptor());
598 data.writeInt32(drop);
599 status_t result = remote()->transact(SET_LEGACY_BUFFER_DROP,
600 data, &reply);
601 if (result != NO_ERROR) {
602 return result;
603 }
604 result = reply.readInt32();
605 return result;
606 }
607
Dan Stoza50101d02016-04-07 16:53:23 -0700608 virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer,
John Reck1a61da52016-04-28 13:18:15 -0700609 sp<Fence>* outFence, float outTransformMatrix[16]) override {
Dan Stoza50101d02016-04-07 16:53:23 -0700610 Parcel data, reply;
611 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
612 status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER, data,
613 &reply);
614 if (result != NO_ERROR) {
615 ALOGE("getLastQueuedBuffer failed to transact: %d", result);
616 return result;
617 }
618 result = reply.readInt32();
619 if (result != NO_ERROR) {
620 return result;
621 }
John Reckce8e5df2016-04-28 10:12:47 -0700622 bool hasBuffer = reply.readBool();
623 sp<GraphicBuffer> buffer;
624 if (hasBuffer) {
625 buffer = new GraphicBuffer();
626 result = reply.read(*buffer);
John Reck1a61da52016-04-28 13:18:15 -0700627 if (result == NO_ERROR) {
628 result = reply.read(outTransformMatrix, sizeof(float) * 16);
629 }
John Reckce8e5df2016-04-28 10:12:47 -0700630 }
Dan Stoza50101d02016-04-07 16:53:23 -0700631 if (result != NO_ERROR) {
632 ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
633 return result;
634 }
635 sp<Fence> fence(new Fence);
636 result = reply.read(*fence);
637 if (result != NO_ERROR) {
638 ALOGE("getLastQueuedBuffer failed to read fence: %d", result);
639 return result;
640 }
641 *outBuffer = buffer;
642 *outFence = fence;
643 return result;
644 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800645
John Reckaa5a0b22021-05-18 00:42:56 -0400646 virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence,
647 Rect* outRect, uint32_t* outTransform) override {
648 Parcel data, reply;
649 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
650 status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER2, data, &reply);
651 if (result != NO_ERROR) {
652 ALOGE("getLastQueuedBuffer failed to transact: %d", result);
653 return result;
654 }
655 status_t remoteError = NO_ERROR;
656 result = reply.readInt32(&remoteError);
657 if (result != NO_ERROR) {
658 ALOGE("getLastQueuedBuffer failed to read status: %d", result);
659 return result;
660 }
661 if (remoteError != NO_ERROR) {
662 return remoteError;
663 }
664 bool hasBuffer = false;
665 result = reply.readBool(&hasBuffer);
666 if (result != NO_ERROR) {
667 ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
668 return result;
669 }
670 sp<GraphicBuffer> buffer;
671 if (hasBuffer) {
672 buffer = new GraphicBuffer();
673 result = reply.read(*buffer);
674 if (result == NO_ERROR) {
675 result = reply.read(*outRect);
676 }
677 if (result == NO_ERROR) {
678 result = reply.readUint32(outTransform);
679 }
680 }
681 if (result != NO_ERROR) {
682 ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
683 return result;
684 }
685 sp<Fence> fence(new Fence);
686 result = reply.read(*fence);
687 if (result != NO_ERROR) {
688 ALOGE("getLastQueuedBuffer failed to read fence: %d", result);
689 return result;
690 }
691 *outBuffer = buffer;
692 *outFence = fence;
693 return result;
694 }
695
Brian Anderson3890c392016-07-25 12:48:08 -0700696 virtual void getFrameTimestamps(FrameEventHistoryDelta* outDelta) {
Pablo Ceballosce796e72016-02-04 19:10:51 -0800697 Parcel data, reply;
698 status_t result = data.writeInterfaceToken(
699 IGraphicBufferProducer::getInterfaceDescriptor());
700 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700701 ALOGE("IGBP::getFrameTimestamps failed to write token: %d", result);
702 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800703 }
704 result = remote()->transact(GET_FRAME_TIMESTAMPS, data, &reply);
705 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700706 ALOGE("IGBP::getFrameTimestamps failed to transact: %d", result);
707 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800708 }
Brian Anderson3890c392016-07-25 12:48:08 -0700709 result = reply.read(*outDelta);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800710 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700711 ALOGE("IGBP::getFrameTimestamps failed to read timestamps: %d",
712 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800713 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800714 }
Pablo Ceballos6155b402016-06-30 17:01:49 -0700715
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -0700716 virtual status_t getUniqueId(uint64_t* outId) const {
717 Parcel data, reply;
718 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
719 status_t result = remote()->transact(GET_UNIQUE_ID, data, &reply);
720 if (result != NO_ERROR) {
721 ALOGE("getUniqueId failed to transact: %d", result);
722 }
723 status_t actualResult = NO_ERROR;
724 result = reply.readInt32(&actualResult);
725 if (result != NO_ERROR) {
726 return result;
727 }
728 result = reply.readUint64(outId);
729 if (result != NO_ERROR) {
730 return result;
731 }
732 return actualResult;
733 }
Chia-I Wue2786ea2017-08-07 10:36:08 -0700734
735 virtual status_t getConsumerUsage(uint64_t* outUsage) const {
736 Parcel data, reply;
737 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
738 status_t result = remote()->transact(GET_CONSUMER_USAGE, data, &reply);
739 if (result != NO_ERROR) {
740 ALOGE("getConsumerUsage failed to transact: %d", result);
741 }
742 status_t actualResult = NO_ERROR;
743 result = reply.readInt32(&actualResult);
744 if (result != NO_ERROR) {
745 return result;
746 }
747 result = reply.readUint64(outUsage);
748 if (result != NO_ERROR) {
749 return result;
750 }
751 return actualResult;
752 }
Yiwei Zhang538cedc2019-06-24 19:35:03 -0700753
754 virtual status_t setAutoPrerotation(bool autoPrerotation) {
755 Parcel data, reply;
756 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
757 data.writeBool(autoPrerotation);
758 status_t result = remote()->transact(SET_AUTO_PREROTATION, data, &reply);
759 if (result == NO_ERROR) {
760 result = reply.readInt32();
761 }
762 return result;
763 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800764};
765
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800766// Out-of-line virtual method definition to trigger vtable emission in this
767// translation unit (see clang warning -Wweak-vtables)
768BpGraphicBufferProducer::~BpGraphicBufferProducer() {}
769
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800770class HpGraphicBufferProducer : public HpInterface<
Pawin Vongmasae672cd02019-02-14 16:01:29 -0800771 BpGraphicBufferProducer,
772 H2BGraphicBufferProducerV1_0,
773 H2BGraphicBufferProducerV2_0> {
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800774public:
Chih-Hung Hsiehaaf62162018-12-20 15:45:04 -0800775 explicit HpGraphicBufferProducer(const sp<IBinder>& base) : PBase(base) {}
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800776
777 status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) override {
778 return mBase->requestBuffer(slot, buf);
779 }
780
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700781 status_t requestBuffers(
782 const std::vector<int32_t>& slots,
783 std::vector<RequestBufferOutput>* outputs) override {
784 return mBase->requestBuffers(slots, outputs);
785 }
786
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800787 status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) override {
788 return mBase->setMaxDequeuedBufferCount(maxDequeuedBuffers);
789 }
790
791 status_t setAsyncMode(bool async) override {
792 return mBase->setAsyncMode(async);
793 }
794
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600795 status_t dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w, uint32_t h, PixelFormat format,
796 uint64_t usage, uint64_t* outBufferAge,
797 FrameEventHistoryDelta* outTimestamps) override {
798 return mBase->dequeueBuffer(slot, fence, w, h, format, usage, outBufferAge, outTimestamps);
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800799 }
800
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700801 status_t dequeueBuffers(
802 const std::vector<DequeueBufferInput>& inputs,
803 std::vector<DequeueBufferOutput>* outputs) override {
804 return mBase->dequeueBuffers(inputs, outputs);
805 }
806
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800807 status_t detachBuffer(int slot) override {
808 return mBase->detachBuffer(slot);
809 }
810
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700811 status_t detachBuffers(const std::vector<int32_t>& slots,
812 std::vector<status_t>* results) override {
813 return mBase->detachBuffers(slots, results);
814 }
815
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800816 status_t detachNextBuffer(
817 sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) override {
818 return mBase->detachNextBuffer(outBuffer, outFence);
819 }
820
821 status_t attachBuffer(
822 int* outSlot, const sp<GraphicBuffer>& buffer) override {
823 return mBase->attachBuffer(outSlot, buffer);
824 }
825
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700826 status_t attachBuffers(
827 const std::vector<sp<GraphicBuffer>>& buffers,
828 std::vector<AttachBufferOutput>* outputs) override {
829 return mBase->attachBuffers(buffers, outputs);
830 }
831
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800832 status_t queueBuffer(
833 int slot,
834 const QueueBufferInput& input,
835 QueueBufferOutput* output) override {
836 return mBase->queueBuffer(slot, input, output);
837 }
838
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700839 status_t queueBuffers(const std::vector<QueueBufferInput>& inputs,
840 std::vector<QueueBufferOutput>* outputs) override {
841 return mBase->queueBuffers(inputs, outputs);
842 }
843
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800844 status_t cancelBuffer(int slot, const sp<Fence>& fence) override {
845 return mBase->cancelBuffer(slot, fence);
846 }
847
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700848 status_t cancelBuffers(
849 const std::vector<CancelBufferInput>& inputs,
850 std::vector<status_t>* results) override {
851 return mBase->cancelBuffers(inputs, results);
852 }
853
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800854 int query(int what, int* value) override {
855 return mBase->query(what, value);
856 }
857
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700858 status_t query(const std::vector<int32_t> inputs,
859 std::vector<QueryOutput>* outputs) override {
860 return mBase->query(inputs, outputs);
861 }
862
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800863 status_t connect(
864 const sp<IProducerListener>& listener,
865 int api, bool producerControlledByApp,
866 QueueBufferOutput* output) override {
867 return mBase->connect(listener, api, producerControlledByApp, output);
868 }
869
870 status_t disconnect(
871 int api, DisconnectMode mode = DisconnectMode::Api) override {
872 return mBase->disconnect(api, mode);
873 }
874
875 status_t setSidebandStream(const sp<NativeHandle>& stream) override {
876 return mBase->setSidebandStream(stream);
877 }
878
879 void allocateBuffers(uint32_t width, uint32_t height,
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700880 PixelFormat format, uint64_t usage) override {
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800881 return mBase->allocateBuffers(width, height, format, usage);
882 }
883
884 status_t allowAllocation(bool allow) override {
885 return mBase->allowAllocation(allow);
886 }
887
888 status_t setGenerationNumber(uint32_t generationNumber) override {
889 return mBase->setGenerationNumber(generationNumber);
890 }
891
892 String8 getConsumerName() const override {
893 return mBase->getConsumerName();
894 }
895
896 status_t setSharedBufferMode(bool sharedBufferMode) override {
897 return mBase->setSharedBufferMode(sharedBufferMode);
898 }
899
900 status_t setAutoRefresh(bool autoRefresh) override {
901 return mBase->setAutoRefresh(autoRefresh);
902 }
903
904 status_t setDequeueTimeout(nsecs_t timeout) override {
905 return mBase->setDequeueTimeout(timeout);
906 }
907
Sungtak Lee3249fb62019-03-02 16:40:47 -0800908 status_t setLegacyBufferDrop(bool drop) override {
909 return mBase->setLegacyBufferDrop(drop);
910 }
911
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800912 status_t getLastQueuedBuffer(
913 sp<GraphicBuffer>* outBuffer,
914 sp<Fence>* outFence,
915 float outTransformMatrix[16]) override {
916 return mBase->getLastQueuedBuffer(
917 outBuffer, outFence, outTransformMatrix);
918 }
919
John Reckaa5a0b22021-05-18 00:42:56 -0400920 status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence, Rect* outRect,
921 uint32_t* outTransform) override {
922 return mBase->getLastQueuedBuffer(outBuffer, outFence, outRect, outTransform);
923 }
924
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800925 void getFrameTimestamps(FrameEventHistoryDelta* outDelta) override {
926 return mBase->getFrameTimestamps(outDelta);
927 }
928
929 status_t getUniqueId(uint64_t* outId) const override {
930 return mBase->getUniqueId(outId);
931 }
Chia-I Wue2786ea2017-08-07 10:36:08 -0700932
933 status_t getConsumerUsage(uint64_t* outUsage) const override {
934 return mBase->getConsumerUsage(outUsage);
935 }
Yiwei Zhang538cedc2019-06-24 19:35:03 -0700936
937 status_t setAutoPrerotation(bool autoPrerotation) override {
938 return mBase->setAutoPrerotation(autoPrerotation);
939 }
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800940};
941
Pawin Vongmasa338b81d2019-01-31 05:20:07 -0800942IMPLEMENT_HYBRID_META_INTERFACE(GraphicBufferProducer,
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800943 "android.gui.IGraphicBufferProducer");
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800944
945// ----------------------------------------------------------------------
946
Sungtak Lee3249fb62019-03-02 16:40:47 -0800947status_t IGraphicBufferProducer::setLegacyBufferDrop(bool drop) {
948 // No-op for IGBP other than BufferQueue.
949 (void) drop;
950 return INVALID_OPERATION;
951}
952
Yiwei Zhang538cedc2019-06-24 19:35:03 -0700953status_t IGraphicBufferProducer::setAutoPrerotation(bool autoPrerotation) {
954 // No-op for IGBP other than BufferQueue.
955 (void)autoPrerotation;
956 return INVALID_OPERATION;
957}
958
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -0800959status_t IGraphicBufferProducer::exportToParcel(Parcel* parcel) {
960 status_t res = OK;
961 res = parcel->writeUint32(USE_BUFFER_QUEUE);
962 if (res != NO_ERROR) {
963 ALOGE("exportToParcel: Cannot write magic, res=%d.", res);
964 return res;
965 }
966
967 return parcel->writeStrongBinder(IInterface::asBinder(this));
968}
969
970/* static */
971status_t IGraphicBufferProducer::exportToParcel(const sp<IGraphicBufferProducer>& producer,
972 Parcel* parcel) {
973 if (parcel == nullptr) {
974 ALOGE("exportToParcel: Invalid parcel object.");
975 return BAD_VALUE;
976 }
977
978 if (producer == nullptr) {
979 status_t res = OK;
980 res = parcel->writeUint32(IGraphicBufferProducer::USE_BUFFER_QUEUE);
981 if (res != NO_ERROR) return res;
982 return parcel->writeStrongBinder(nullptr);
983 } else {
984 return producer->exportToParcel(parcel);
985 }
986}
987
988/* static */
989sp<IGraphicBufferProducer> IGraphicBufferProducer::createFromParcel(const Parcel* parcel) {
990 uint32_t outMagic = 0;
991 status_t res = NO_ERROR;
992
993 res = parcel->readUint32(&outMagic);
994 if (res != NO_ERROR) {
995 ALOGE("createFromParcel: Failed to read magic, error=%d.", res);
996 return nullptr;
997 }
998
999 switch (outMagic) {
1000 case USE_BUFFER_QUEUE: {
1001 sp<IBinder> binder;
1002 res = parcel->readNullableStrongBinder(&binder);
1003 if (res != NO_ERROR) {
1004 ALOGE("createFromParcel: Can't read strong binder.");
1005 return nullptr;
1006 }
1007 return interface_cast<IGraphicBufferProducer>(binder);
1008 }
1009 case USE_BUFFER_HUB: {
1010 ALOGE("createFromParcel: BufferHub not implemented.");
Jiyong Parka75d3d62018-04-09 12:16:30 +09001011 return nullptr;
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -08001012 }
1013 default: {
1014 ALOGE("createFromParcel: Unexpected mgaic: 0x%x.", outMagic);
1015 return nullptr;
1016 }
1017 }
1018}
1019
1020// ----------------------------------------------------------------------------
1021
Andy McFadden2adaf042012-12-18 09:49:45 -08001022status_t BnGraphicBufferProducer::onTransact(
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001023 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
1024{
1025 switch(code) {
1026 case REQUEST_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001027 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001028 int bufferIdx = data.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -07001029 sp<GraphicBuffer> buffer;
1030 int result = requestBuffer(bufferIdx, &buffer);
Yi Kong48a619f2018-06-05 16:34:59 -07001031 reply->writeInt32(buffer != nullptr);
1032 if (buffer != nullptr) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001033 reply->write(*buffer);
1034 }
Jamie Gennis7b305ff2011-07-19 12:08:33 -07001035 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001036 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001037 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001038 case REQUEST_BUFFERS: {
1039 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1040 std::vector<int32_t> slots;
1041 std::vector<RequestBufferOutput> outputs;
1042 status_t result = data.readInt32Vector(&slots);
1043 if (result != NO_ERROR) {
1044 return result;
1045 }
1046 (void)requestBuffers(slots, &outputs);
1047 result = reply->writeVectorSize(outputs);
1048 for (const RequestBufferOutput& output : outputs) {
1049 if (result != NO_ERROR) {
1050 return result;
1051 }
1052 result = reply->write(output);
1053 }
1054 return result;
1055 }
Pablo Ceballosfa455352015-08-12 17:47:47 -07001056 case SET_MAX_DEQUEUED_BUFFER_COUNT: {
1057 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1058 int maxDequeuedBuffers = data.readInt32();
1059 int result = setMaxDequeuedBufferCount(maxDequeuedBuffers);
1060 reply->writeInt32(result);
1061 return NO_ERROR;
1062 }
1063 case SET_ASYNC_MODE: {
1064 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1065 bool async = data.readInt32();
1066 int result = setAsyncMode(async);
1067 reply->writeInt32(result);
1068 return NO_ERROR;
1069 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001070 case DEQUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001071 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001072 uint32_t width = data.readUint32();
1073 uint32_t height = data.readUint32();
1074 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
Mathias Agopiancb496ac2017-05-22 14:21:00 -07001075 uint64_t usage = data.readUint64();
Ian Elliotta2eb34c2017-07-18 11:05:49 -06001076 uint64_t bufferAge = 0;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001077 bool getTimestamps = data.readBool();
Brian Andersonbaaad322016-07-22 15:55:13 -07001078
Naveen Leekha12ba0f52015-09-21 17:28:04 -07001079 int buf = 0;
Brian Andersonbaaad322016-07-22 15:55:13 -07001080 sp<Fence> fence = Fence::NO_FENCE;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001081 FrameEventHistoryDelta frameTimestamps;
Ian Elliotta2eb34c2017-07-18 11:05:49 -06001082 int result = dequeueBuffer(&buf, &fence, width, height, format, usage, &bufferAge,
1083 getTimestamps ? &frameTimestamps : nullptr);
Brian Andersonbaaad322016-07-22 15:55:13 -07001084
Tobin Ehlis209e5fb2019-03-26 14:06:29 -06001085 if (fence == nullptr) {
1086 ALOGE("dequeueBuffer returned a NULL fence, setting to Fence::NO_FENCE");
1087 fence = Fence::NO_FENCE;
1088 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001089 reply->writeInt32(buf);
Brian Andersonbaaad322016-07-22 15:55:13 -07001090 reply->write(*fence);
Ian Elliotta2eb34c2017-07-18 11:05:49 -06001091 reply->writeUint64(bufferAge);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001092 if (getTimestamps) {
1093 reply->write(frameTimestamps);
1094 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001095 reply->writeInt32(result);
1096 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001097 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001098 case DEQUEUE_BUFFERS: {
1099 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1100 std::vector<DequeueBufferInput> inputs;
1101 std::vector<DequeueBufferOutput> outputs;
1102 status_t result = data.resizeOutVector(&inputs);
1103 if (result != NO_ERROR) {
1104 return result;
1105 }
1106 for (DequeueBufferInput& input : inputs) {
1107 result = data.read(input);
1108 if (result != NO_ERROR) {
1109 return result;
1110 }
1111 }
1112 (void)dequeueBuffers(inputs, &outputs);
1113 result = reply->writeVectorSize(outputs);
1114 for (const DequeueBufferOutput& output : outputs) {
1115 if (result != NO_ERROR) {
1116 return result;
1117 }
1118 result = reply->write(output);
1119 }
1120 return result;
1121 }
Dan Stoza9f3053d2014-03-06 15:14:33 -08001122 case DETACH_BUFFER: {
1123 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1124 int slot = data.readInt32();
1125 int result = detachBuffer(slot);
1126 reply->writeInt32(result);
1127 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001128 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001129 case DETACH_BUFFERS: {
1130 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1131 std::vector<int32_t> slots;
1132 std::vector<status_t> results;
1133 status_t result = data.readInt32Vector(&slots);
1134 if (result != NO_ERROR) {
1135 return result;
1136 }
1137 (void)detachBuffers(slots, &results);
1138 return reply->writeInt32Vector(results);
1139 }
Dan Stozad9822a32014-03-28 15:25:31 -07001140 case DETACH_NEXT_BUFFER: {
1141 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1142 sp<GraphicBuffer> buffer;
1143 sp<Fence> fence;
1144 int32_t result = detachNextBuffer(&buffer, &fence);
1145 reply->writeInt32(result);
1146 if (result == NO_ERROR) {
Yi Kong48a619f2018-06-05 16:34:59 -07001147 reply->writeInt32(buffer != nullptr);
1148 if (buffer != nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -07001149 reply->write(*buffer);
1150 }
Yi Kong48a619f2018-06-05 16:34:59 -07001151 reply->writeInt32(fence != nullptr);
1152 if (fence != nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -07001153 reply->write(*fence);
1154 }
1155 }
1156 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001157 }
Dan Stoza9f3053d2014-03-06 15:14:33 -08001158 case ATTACH_BUFFER: {
1159 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1160 sp<GraphicBuffer> buffer = new GraphicBuffer();
Pablo Ceballos70636b32016-07-06 15:24:54 -07001161 status_t result = data.read(*buffer.get());
Naveen Leekha12ba0f52015-09-21 17:28:04 -07001162 int slot = 0;
Pablo Ceballos70636b32016-07-06 15:24:54 -07001163 if (result == NO_ERROR) {
1164 result = attachBuffer(&slot, buffer);
1165 }
Dan Stoza9f3053d2014-03-06 15:14:33 -08001166 reply->writeInt32(slot);
1167 reply->writeInt32(result);
1168 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001169 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001170 case ATTACH_BUFFERS: {
1171 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1172 std::vector<sp<GraphicBuffer>> buffers;
1173 status_t result = data.resizeOutVector(&buffers);
1174 if (result != NO_ERROR) {
1175 return result;
1176 }
1177 for (sp<GraphicBuffer>& buffer : buffers) {
1178 buffer = new GraphicBuffer();
1179 result = data.read(*buffer.get());
1180 if (result != NO_ERROR) {
1181 return result;
1182 }
1183 }
1184 std::vector<AttachBufferOutput> outputs;
1185 (void)attachBuffers(buffers, &outputs);
1186 result = reply->writeVectorSize(outputs);
1187 for (const AttachBufferOutput& output : outputs) {
1188 if (result != NO_ERROR) {
1189 return result;
1190 }
1191 result = reply->write(output);
1192 }
1193 return result;
1194 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001195 case QUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001196 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001197
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001198 int buf = data.readInt32();
Jesse Hallc777b0b2012-06-28 12:52:05 -07001199 QueueBufferInput input(data);
Brian Andersonbaaad322016-07-22 15:55:13 -07001200 QueueBufferOutput output;
1201 status_t result = queueBuffer(buf, input, &output);
Brian Andersonbaaad322016-07-22 15:55:13 -07001202 reply->write(output);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001203 reply->writeInt32(result);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001204
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001205 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001206 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001207 case QUEUE_BUFFERS: {
1208 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1209 std::vector<QueueBufferInput> inputs;
1210 status_t result = data.resizeOutVector(&inputs);
1211 if (result != NO_ERROR) {
1212 return result;
1213 }
1214 for (QueueBufferInput& input : inputs) {
1215 result = data.read(input);
1216 if (result != NO_ERROR) {
1217 return result;
1218 }
1219 }
1220 std::vector<QueueBufferOutput> outputs;
1221 (void)queueBuffers(inputs, &outputs);
1222 result = reply->writeVectorSize(outputs);
1223 for (const QueueBufferOutput& output : outputs) {
1224 if (result != NO_ERROR) {
1225 return result;
1226 }
1227 result = reply->write(output);
1228 }
1229 return result;
1230 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001231 case CANCEL_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001232 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001233 int buf = data.readInt32();
Jamie Gennis1df8c342012-12-20 14:05:45 -08001234 sp<Fence> fence = new Fence();
Pablo Ceballos70636b32016-07-06 15:24:54 -07001235 status_t result = data.read(*fence.get());
1236 if (result == NO_ERROR) {
1237 result = cancelBuffer(buf, fence);
1238 }
Pablo Ceballos583b1b32015-09-03 18:23:52 -07001239 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001240 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001241 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001242 case CANCEL_BUFFERS: {
1243 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1244 std::vector<CancelBufferInput> inputs;
1245 status_t result = data.resizeOutVector(&inputs);
1246 for (CancelBufferInput& input : inputs) {
1247 if (result != NO_ERROR) {
1248 return result;
1249 }
1250 result = data.read(input);
1251 }
1252 if (result != NO_ERROR) {
1253 return result;
1254 }
1255 std::vector<status_t> results;
1256 result = cancelBuffers(inputs, &results);
1257 if (result != NO_ERROR) {
1258 return result;
1259 }
1260 return reply->writeInt32Vector(results);
1261 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -07001262 case QUERY: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001263 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Naveen Leekha12ba0f52015-09-21 17:28:04 -07001264 int value = 0;
Mathias Agopianeafabcd2011-04-20 14:20:59 -07001265 int what = data.readInt32();
1266 int res = query(what, &value);
1267 reply->writeInt32(value);
1268 reply->writeInt32(res);
1269 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001270 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001271 case QUERY_MULTIPLE: {
1272 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1273 std::vector<int32_t> inputs;
1274 status_t result = data.readInt32Vector(&inputs);
1275 if (result != NO_ERROR) {
1276 return result;
1277 }
1278 std::vector<QueryOutput> outputs;
1279 result = query(inputs, &outputs);
1280 if (result != NO_ERROR) {
1281 return result;
1282 }
1283 result = reply->writeVectorSize(outputs);
1284 for (const QueryOutput& output : outputs) {
1285 if (result != NO_ERROR) {
1286 return result;
1287 }
1288 result = reply->write(output);
1289 }
1290 return result;
1291 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001292 case CONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001293 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stozaf0eaf252014-03-21 13:05:51 -07001294 sp<IProducerListener> listener;
1295 if (data.readInt32() == 1) {
1296 listener = IProducerListener::asInterface(data.readStrongBinder());
1297 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001298 int api = data.readInt32();
Mathias Agopian595264f2013-07-16 22:56:09 -07001299 bool producerControlledByApp = data.readInt32();
Brian Andersonbaaad322016-07-22 15:55:13 -07001300 QueueBufferOutput output;
1301 status_t res = connect(listener, api, producerControlledByApp, &output);
1302 reply->write(output);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001303 reply->writeInt32(res);
1304 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001305 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001306 case DISCONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001307 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001308 int api = data.readInt32();
Robert Carr97b9c862016-09-08 13:54:35 -07001309 DisconnectMode mode = static_cast<DisconnectMode>(data.readInt32());
1310 status_t res = disconnect(api, mode);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001311 reply->writeInt32(res);
1312 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001313 }
Jesse Hall399184a2014-03-03 15:42:54 -08001314 case SET_SIDEBAND_STREAM: {
1315 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1316 sp<NativeHandle> stream;
1317 if (data.readInt32()) {
Wonsik Kim0ec54e12014-03-21 10:46:24 +09001318 stream = NativeHandle::create(data.readNativeHandle(), true);
Jesse Hall399184a2014-03-03 15:42:54 -08001319 }
1320 status_t result = setSidebandStream(stream);
1321 reply->writeInt32(result);
1322 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001323 }
Dan Stoza9de72932015-04-16 17:28:43 -07001324 case ALLOCATE_BUFFERS: {
Dan Stoza29a3e902014-06-20 13:13:57 -07001325 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001326 uint32_t width = data.readUint32();
1327 uint32_t height = data.readUint32();
1328 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
Mathias Agopiancb496ac2017-05-22 14:21:00 -07001329 uint64_t usage = data.readUint64();
Pablo Ceballos567dbbb2015-08-26 18:59:08 -07001330 allocateBuffers(width, height, format, usage);
Dan Stoza29a3e902014-06-20 13:13:57 -07001331 return NO_ERROR;
Dan Stoza9de72932015-04-16 17:28:43 -07001332 }
1333 case ALLOW_ALLOCATION: {
1334 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1335 bool allow = static_cast<bool>(data.readInt32());
1336 status_t result = allowAllocation(allow);
1337 reply->writeInt32(result);
1338 return NO_ERROR;
1339 }
Dan Stoza812ed062015-06-02 15:45:22 -07001340 case SET_GENERATION_NUMBER: {
1341 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1342 uint32_t generationNumber = data.readUint32();
1343 status_t result = setGenerationNumber(generationNumber);
1344 reply->writeInt32(result);
1345 return NO_ERROR;
1346 }
Dan Stozac6f30bd2015-06-08 09:32:50 -07001347 case GET_CONSUMER_NAME: {
1348 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1349 reply->writeString8(getConsumerName());
1350 return NO_ERROR;
1351 }
Pablo Ceballos3559fbf2016-03-17 15:50:23 -07001352 case SET_SHARED_BUFFER_MODE: {
Pablo Ceballosccdfd602015-10-07 15:05:45 -07001353 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Pablo Ceballos3559fbf2016-03-17 15:50:23 -07001354 bool sharedBufferMode = data.readInt32();
1355 status_t result = setSharedBufferMode(sharedBufferMode);
Pablo Ceballosccdfd602015-10-07 15:05:45 -07001356 reply->writeInt32(result);
1357 return NO_ERROR;
1358 }
Pablo Ceballosff95aab2016-01-13 17:09:58 -08001359 case SET_AUTO_REFRESH: {
1360 CHECK_INTERFACE(IGraphicBuffer, data, reply);
1361 bool autoRefresh = data.readInt32();
1362 status_t result = setAutoRefresh(autoRefresh);
1363 reply->writeInt32(result);
1364 return NO_ERROR;
1365 }
Dan Stoza127fc632015-06-30 13:43:32 -07001366 case SET_DEQUEUE_TIMEOUT: {
1367 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1368 nsecs_t timeout = data.readInt64();
1369 status_t result = setDequeueTimeout(timeout);
1370 reply->writeInt32(result);
1371 return NO_ERROR;
1372 }
Dan Stoza50101d02016-04-07 16:53:23 -07001373 case GET_LAST_QUEUED_BUFFER: {
1374 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1375 sp<GraphicBuffer> buffer(nullptr);
1376 sp<Fence> fence(Fence::NO_FENCE);
John Reck1a61da52016-04-28 13:18:15 -07001377 float transform[16] = {};
1378 status_t result = getLastQueuedBuffer(&buffer, &fence, transform);
Dan Stoza50101d02016-04-07 16:53:23 -07001379 reply->writeInt32(result);
1380 if (result != NO_ERROR) {
1381 return result;
1382 }
John Reckce8e5df2016-04-28 10:12:47 -07001383 if (!buffer.get()) {
1384 reply->writeBool(false);
1385 } else {
1386 reply->writeBool(true);
1387 result = reply->write(*buffer);
John Reck1a61da52016-04-28 13:18:15 -07001388 if (result == NO_ERROR) {
1389 reply->write(transform, sizeof(float) * 16);
1390 }
John Reckce8e5df2016-04-28 10:12:47 -07001391 }
Dan Stoza50101d02016-04-07 16:53:23 -07001392 if (result != NO_ERROR) {
1393 ALOGE("getLastQueuedBuffer failed to write buffer: %d", result);
1394 return result;
1395 }
Tobin Ehlis209e5fb2019-03-26 14:06:29 -06001396 if (fence == nullptr) {
1397 ALOGE("getLastQueuedBuffer returned a NULL fence, setting to Fence::NO_FENCE");
1398 fence = Fence::NO_FENCE;
1399 }
Dan Stoza50101d02016-04-07 16:53:23 -07001400 result = reply->write(*fence);
1401 if (result != NO_ERROR) {
1402 ALOGE("getLastQueuedBuffer failed to write fence: %d", result);
1403 return result;
1404 }
1405 return NO_ERROR;
1406 }
John Reckaa5a0b22021-05-18 00:42:56 -04001407 case GET_LAST_QUEUED_BUFFER2: {
1408 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1409 sp<GraphicBuffer> buffer(nullptr);
1410 sp<Fence> fence(Fence::NO_FENCE);
1411 Rect crop;
1412 uint32_t transform;
1413 status_t result = getLastQueuedBuffer(&buffer, &fence, &crop, &transform);
1414 reply->writeInt32(result);
1415 if (result != NO_ERROR) {
1416 return result;
1417 }
1418 if (!buffer.get()) {
1419 reply->writeBool(false);
1420 } else {
1421 reply->writeBool(true);
1422 result = reply->write(*buffer);
1423 if (result == NO_ERROR) {
1424 result = reply->write(crop);
1425 }
1426 if (result == NO_ERROR) {
1427 result = reply->writeUint32(transform);
1428 }
1429 }
1430 if (result != NO_ERROR) {
1431 ALOGE("getLastQueuedBuffer failed to write buffer: %d", result);
1432 return result;
1433 }
1434 if (fence == nullptr) {
1435 ALOGE("getLastQueuedBuffer returned a NULL fence, setting to Fence::NO_FENCE");
1436 fence = Fence::NO_FENCE;
1437 }
1438 result = reply->write(*fence);
1439 if (result != NO_ERROR) {
1440 ALOGE("getLastQueuedBuffer failed to write fence: %d", result);
1441 return result;
1442 }
1443 return NO_ERROR;
1444 }
1445
Pablo Ceballosce796e72016-02-04 19:10:51 -08001446 case GET_FRAME_TIMESTAMPS: {
1447 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson3890c392016-07-25 12:48:08 -07001448 FrameEventHistoryDelta frameTimestamps;
1449 getFrameTimestamps(&frameTimestamps);
1450 status_t result = reply->write(frameTimestamps);
Pablo Ceballosce796e72016-02-04 19:10:51 -08001451 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -07001452 ALOGE("BnGBP::GET_FRAME_TIMESTAMPS failed to write buffer: %d",
1453 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -08001454 return result;
1455 }
Pablo Ceballosce796e72016-02-04 19:10:51 -08001456 return NO_ERROR;
1457 }
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -07001458 case GET_UNIQUE_ID: {
1459 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1460 uint64_t outId = 0;
1461 status_t actualResult = getUniqueId(&outId);
1462 status_t result = reply->writeInt32(actualResult);
1463 if (result != NO_ERROR) {
1464 return result;
1465 }
1466 result = reply->writeUint64(outId);
1467 if (result != NO_ERROR) {
1468 return result;
1469 }
1470 return NO_ERROR;
1471 }
Chia-I Wue2786ea2017-08-07 10:36:08 -07001472 case GET_CONSUMER_USAGE: {
1473 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1474 uint64_t outUsage = 0;
1475 status_t actualResult = getConsumerUsage(&outUsage);
1476 status_t result = reply->writeInt32(actualResult);
1477 if (result != NO_ERROR) {
1478 return result;
1479 }
1480 result = reply->writeUint64(outUsage);
1481 if (result != NO_ERROR) {
1482 return result;
1483 }
1484 return NO_ERROR;
1485 }
Sungtak Lee3249fb62019-03-02 16:40:47 -08001486 case SET_LEGACY_BUFFER_DROP: {
1487 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1488 bool drop = data.readInt32();
1489 int result = setLegacyBufferDrop(drop);
1490 reply->writeInt32(result);
1491 return NO_ERROR;
1492 }
Yiwei Zhang538cedc2019-06-24 19:35:03 -07001493 case SET_AUTO_PREROTATION: {
1494 CHECK_INTERFACE(IGraphicBuffer, data, reply);
1495 bool autoPrerotation = data.readBool();
1496 status_t result = setAutoPrerotation(autoPrerotation);
1497 reply->writeInt32(result);
1498 return NO_ERROR;
1499 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001500 }
1501 return BBinder::onTransact(code, data, reply, flags);
1502}
1503
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001504}; // namespace android