blob: 797069c7989dfac335c64272cbd0206287e92d37 [file] [log] [blame]
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <stdint.h>
18#include <sys/types.h>
19
20#include <utils/Errors.h>
Jesse Hall399184a2014-03-03 15:42:54 -080021#include <utils/NativeHandle.h>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080022#include <utils/RefBase.h>
Brian Anderson175a7202016-10-10 16:52:56 -070023#include <utils/String8.h>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080024#include <utils/Timers.h>
Jesse Hall399184a2014-03-03 15:42:54 -080025#include <utils/Vector.h>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080026
27#include <binder/Parcel.h>
28#include <binder/IInterface.h>
29
Jiyong Parka75d3d62018-04-09 12:16:30 +090030#ifndef NO_BUFFERHUB
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -080031#include <gui/BufferHubProducer.h>
Jiyong Parka75d3d62018-04-09 12:16:30 +090032#endif
Pawin Vongmasae672cd02019-02-14 16:01:29 -080033
34#include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h>
35#include <gui/bufferqueue/2.0/H2BGraphicBufferProducer.h>
Chia-I Wuc79a2962017-05-15 10:32:27 -070036#include <gui/BufferQueueDefs.h>
Andy McFadden2adaf042012-12-18 09:49:45 -080037#include <gui/IGraphicBufferProducer.h>
Dan Stozaf0eaf252014-03-21 13:05:51 -070038#include <gui/IProducerListener.h>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080039
40namespace android {
41// ----------------------------------------------------------------------------
42
Pawin Vongmasae672cd02019-02-14 16:01:29 -080043using H2BGraphicBufferProducerV1_0 =
44 ::android::hardware::graphics::bufferqueue::V1_0::utils::
45 H2BGraphicBufferProducer;
46using H2BGraphicBufferProducerV2_0 =
47 ::android::hardware::graphics::bufferqueue::V2_0::utils::
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -080048 H2BGraphicBufferProducer;
49
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080050enum {
51 REQUEST_BUFFER = IBinder::FIRST_CALL_TRANSACTION,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080052 DEQUEUE_BUFFER,
Dan Stoza9f3053d2014-03-06 15:14:33 -080053 DETACH_BUFFER,
Dan Stozad9822a32014-03-28 15:25:31 -070054 DETACH_NEXT_BUFFER,
Dan Stoza9f3053d2014-03-06 15:14:33 -080055 ATTACH_BUFFER,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080056 QUEUE_BUFFER,
57 CANCEL_BUFFER,
Mathias Agopianeafabcd2011-04-20 14:20:59 -070058 QUERY,
Jamie Gennisfe0a87b2011-07-13 19:12:20 -070059 CONNECT,
60 DISCONNECT,
Jesse Hall399184a2014-03-03 15:42:54 -080061 SET_SIDEBAND_STREAM,
Dan Stoza29a3e902014-06-20 13:13:57 -070062 ALLOCATE_BUFFERS,
Dan Stoza9de72932015-04-16 17:28:43 -070063 ALLOW_ALLOCATION,
Dan Stoza812ed062015-06-02 15:45:22 -070064 SET_GENERATION_NUMBER,
Dan Stozac6f30bd2015-06-08 09:32:50 -070065 GET_CONSUMER_NAME,
Pablo Ceballosfa455352015-08-12 17:47:47 -070066 SET_MAX_DEQUEUED_BUFFER_COUNT,
Dan Stoza7dde5992015-05-22 09:51:44 -070067 SET_ASYNC_MODE,
Pablo Ceballos3559fbf2016-03-17 15:50:23 -070068 SET_SHARED_BUFFER_MODE,
Pablo Ceballosff95aab2016-01-13 17:09:58 -080069 SET_AUTO_REFRESH,
Dan Stoza127fc632015-06-30 13:43:32 -070070 SET_DEQUEUE_TIMEOUT,
Dan Stoza50101d02016-04-07 16:53:23 -070071 GET_LAST_QUEUED_BUFFER,
Pablo Ceballosfc352582016-06-30 17:22:20 -070072 GET_FRAME_TIMESTAMPS,
Chia-I Wue2786ea2017-08-07 10:36:08 -070073 GET_UNIQUE_ID,
74 GET_CONSUMER_USAGE,
Sungtak Lee3249fb62019-03-02 16:40:47 -080075 SET_LEGACY_BUFFER_DROP,
Yiwei Zhang538cedc2019-06-24 19:35:03 -070076 SET_AUTO_PREROTATION,
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +070077 REQUEST_BUFFERS,
78 DEQUEUE_BUFFERS,
79 DETACH_BUFFERS,
80 ATTACH_BUFFERS,
81 QUEUE_BUFFERS,
82 CANCEL_BUFFERS,
83 QUERY_MULTIPLE,
John Reckaa5a0b22021-05-18 00:42:56 -040084 GET_LAST_QUEUED_BUFFER2,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080085};
86
Andy McFadden2adaf042012-12-18 09:49:45 -080087class BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080088{
89public:
Chih-Hung Hsiehe2347b72016-04-25 15:41:05 -070090 explicit BpGraphicBufferProducer(const sp<IBinder>& impl)
Andy McFadden2adaf042012-12-18 09:49:45 -080091 : BpInterface<IGraphicBufferProducer>(impl)
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080092 {
93 }
94
Yi Kongca038512017-05-02 16:55:24 -070095 ~BpGraphicBufferProducer() override;
Dan Stoza3be1c6b2014-11-18 10:24:03 -080096
Jamie Gennis7b305ff2011-07-19 12:08:33 -070097 virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080098 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -080099 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800100 data.writeInt32(bufferIdx);
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700101 status_t result = remote()->transact(REQUEST_BUFFER, data, &reply);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700102 if (result != NO_ERROR) {
103 return result;
104 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800105 bool nonNull = reply.readInt32();
106 if (nonNull) {
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700107 *buf = new GraphicBuffer();
Lingyun Zhu2aff7022012-11-20 19:24:35 +0800108 result = reply.read(**buf);
109 if(result != NO_ERROR) {
110 (*buf).clear();
111 return result;
112 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800113 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700114 result = reply.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700115 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800116 }
117
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700118 virtual status_t requestBuffers(
119 const std::vector<int32_t>& slots,
120 std::vector<RequestBufferOutput>* outputs) override {
121 Parcel data, reply;
122 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
123 data.writeInt32Vector(slots);
124 status_t result = remote()->transact(REQUEST_BUFFERS, data, &reply);
125 if (result != NO_ERROR) {
126 return result;
127 }
128 result = reply.resizeOutVector(outputs);
129 for (RequestBufferOutput& output : *outputs) {
130 if (result != NO_ERROR) {
131 return result;
132 }
133 result = reply.read(output);
134 }
135
136 return result;
137 }
138
Pablo Ceballosfa455352015-08-12 17:47:47 -0700139 virtual status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) {
140 Parcel data, reply;
141 data.writeInterfaceToken(
142 IGraphicBufferProducer::getInterfaceDescriptor());
143 data.writeInt32(maxDequeuedBuffers);
144 status_t result = remote()->transact(SET_MAX_DEQUEUED_BUFFER_COUNT,
145 data, &reply);
146 if (result != NO_ERROR) {
147 return result;
148 }
149 result = reply.readInt32();
150 return result;
151 }
152
153 virtual status_t setAsyncMode(bool async) {
154 Parcel data, reply;
155 data.writeInterfaceToken(
156 IGraphicBufferProducer::getInterfaceDescriptor());
157 data.writeInt32(async);
158 status_t result = remote()->transact(SET_ASYNC_MODE,
159 data, &reply);
160 if (result != NO_ERROR) {
161 return result;
162 }
163 result = reply.readInt32();
164 return result;
165 }
166
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600167 virtual status_t dequeueBuffer(int* buf, sp<Fence>* fence, uint32_t width, uint32_t height,
168 PixelFormat format, uint64_t usage, uint64_t* outBufferAge,
169 FrameEventHistoryDelta* outTimestamps) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800170 Parcel data, reply;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700171 bool getFrameTimestamps = (outTimestamps != nullptr);
Brian Andersonbaaad322016-07-22 15:55:13 -0700172
Andy McFadden2adaf042012-12-18 09:49:45 -0800173 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800174 data.writeUint32(width);
175 data.writeUint32(height);
176 data.writeInt32(static_cast<int32_t>(format));
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700177 data.writeUint64(usage);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700178 data.writeBool(getFrameTimestamps);
Brian Andersonbaaad322016-07-22 15:55:13 -0700179
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700180 status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply);
181 if (result != NO_ERROR) {
182 return result;
183 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700184
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800185 *buf = reply.readInt32();
Brian Andersonbaaad322016-07-22 15:55:13 -0700186 *fence = new Fence();
187 result = reply.read(**fence);
188 if (result != NO_ERROR) {
189 fence->clear();
190 return result;
Jesse Hallf7857542012-06-14 15:26:33 -0700191 }
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600192 if (outBufferAge) {
193 result = reply.readUint64(outBufferAge);
194 } else {
195 // Read the value even if outBufferAge is nullptr:
196 uint64_t bufferAge;
197 result = reply.readUint64(&bufferAge);
198 }
199 if (result != NO_ERROR) {
200 ALOGE("IGBP::dequeueBuffer failed to read buffer age: %d", result);
201 return result;
202 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700203 if (getFrameTimestamps) {
204 result = reply.read(*outTimestamps);
205 if (result != NO_ERROR) {
206 ALOGE("IGBP::dequeueBuffer failed to read timestamps: %d",
207 result);
208 return result;
209 }
210 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700211 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800212 return result;
213 }
214
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700215 virtual status_t dequeueBuffers(
216 const std::vector<DequeueBufferInput>& inputs,
217 std::vector<DequeueBufferOutput>* outputs) {
218 Parcel data, reply;
219 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
220 data.writeVectorSize(inputs);
221 for (const auto& input : inputs) {
222 data.write(input);
223 }
224 status_t result = remote()->transact(DEQUEUE_BUFFERS, data, &reply);
225 if (result != NO_ERROR) {
226 return result;
227 }
228 result = reply.resizeOutVector(outputs);
229 for (auto& output : *outputs) {
230 if (result != NO_ERROR) {
231 return result;
232 }
233 result = reply.read(output);
234 }
235 return result;
236 }
237
Dan Stoza9f3053d2014-03-06 15:14:33 -0800238 virtual status_t detachBuffer(int slot) {
239 Parcel data, reply;
240 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
241 data.writeInt32(slot);
242 status_t result = remote()->transact(DETACH_BUFFER, data, &reply);
243 if (result != NO_ERROR) {
244 return result;
245 }
246 result = reply.readInt32();
247 return result;
248 }
249
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700250 virtual status_t detachBuffers(const std::vector<int32_t>& slots,
251 std::vector<status_t>* results) {
252 Parcel data, reply;
253 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
254 data.writeInt32Vector(slots);
255 status_t result = remote()->transact(DETACH_BUFFERS, data, &reply);
256 if (result != NO_ERROR) {
257 return result;
258 }
259 result = reply.readInt32Vector(results);
260 return result;
261 }
262
Dan Stozad9822a32014-03-28 15:25:31 -0700263 virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer,
264 sp<Fence>* outFence) {
Yi Kong48a619f2018-06-05 16:34:59 -0700265 if (outBuffer == nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -0700266 ALOGE("detachNextBuffer: outBuffer must not be NULL");
267 return BAD_VALUE;
Yi Kong48a619f2018-06-05 16:34:59 -0700268 } else if (outFence == nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -0700269 ALOGE("detachNextBuffer: outFence must not be NULL");
270 return BAD_VALUE;
271 }
272 Parcel data, reply;
273 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
274 status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply);
275 if (result != NO_ERROR) {
276 return result;
277 }
278 result = reply.readInt32();
279 if (result == NO_ERROR) {
280 bool nonNull = reply.readInt32();
281 if (nonNull) {
282 *outBuffer = new GraphicBuffer;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700283 result = reply.read(**outBuffer);
284 if (result != NO_ERROR) {
285 outBuffer->clear();
286 return result;
287 }
Dan Stozad9822a32014-03-28 15:25:31 -0700288 }
289 nonNull = reply.readInt32();
290 if (nonNull) {
291 *outFence = new Fence;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700292 result = reply.read(**outFence);
293 if (result != NO_ERROR) {
294 outBuffer->clear();
295 outFence->clear();
296 return result;
297 }
Dan Stozad9822a32014-03-28 15:25:31 -0700298 }
299 }
300 return result;
301 }
302
Dan Stoza9f3053d2014-03-06 15:14:33 -0800303 virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) {
304 Parcel data, reply;
305 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
306 data.write(*buffer.get());
307 status_t result = remote()->transact(ATTACH_BUFFER, data, &reply);
308 if (result != NO_ERROR) {
309 return result;
310 }
Chia-I Wuc79a2962017-05-15 10:32:27 -0700311
Dan Stoza9f3053d2014-03-06 15:14:33 -0800312 *slot = reply.readInt32();
313 result = reply.readInt32();
Chia-I Wuc79a2962017-05-15 10:32:27 -0700314 if (result == NO_ERROR &&
315 (*slot < 0 || *slot >= BufferQueueDefs::NUM_BUFFER_SLOTS)) {
316 ALOGE("attachBuffer returned invalid slot %d", *slot);
317 android_errorWriteLog(0x534e4554, "37478824");
318 return UNKNOWN_ERROR;
319 }
320
Dan Stoza9f3053d2014-03-06 15:14:33 -0800321 return result;
322 }
323
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700324 virtual status_t attachBuffers(
325 const std::vector<sp<GraphicBuffer>>& buffers,
326 std::vector<AttachBufferOutput>* outputs) {
327 Parcel data, reply;
328 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
329 data.writeVectorSize(buffers);
330 for (const sp<GraphicBuffer>& buffer : buffers) {
331 data.write(*buffer.get());
332 }
333 status_t result = remote()->transact(ATTACH_BUFFERS, data, &reply);
334 if (result != NO_ERROR) {
335 return result;
336 }
337 result = reply.resizeOutVector(outputs);
338 for (AttachBufferOutput& output : *outputs) {
339 if (result != NO_ERROR) {
340 return result;
341 }
342 result = reply.read(output);
343 }
344 if (result == NO_ERROR) {
345 for (AttachBufferOutput& output : *outputs) {
346 if (output.result == NO_ERROR && output.slot < 0) {
347 ALOGE("attachBuffers returned invalid slot %d",
348 output.slot);
349 android_errorWriteLog(0x534e4554, "37478824");
350 output.result = UNKNOWN_ERROR;
351 }
352 }
353 }
354 return result;
355 }
356
Mathias Agopianf0bc2f12012-04-09 16:14:01 -0700357 virtual status_t queueBuffer(int buf,
358 const QueueBufferInput& input, QueueBufferOutput* output) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800359 Parcel data, reply;
Brian Andersonbaaad322016-07-22 15:55:13 -0700360
Andy McFadden2adaf042012-12-18 09:49:45 -0800361 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800362 data.writeInt32(buf);
Jesse Hallc777b0b2012-06-28 12:52:05 -0700363 data.write(input);
Brian Andersonbaaad322016-07-22 15:55:13 -0700364
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700365 status_t result = remote()->transact(QUEUE_BUFFER, data, &reply);
366 if (result != NO_ERROR) {
367 return result;
368 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700369
370 result = reply.read(*output);
371 if (result != NO_ERROR) {
372 return result;
373 }
374
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700375 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800376 return result;
377 }
378
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700379 virtual status_t queueBuffers(const std::vector<QueueBufferInput>& inputs,
380 std::vector<QueueBufferOutput>* outputs) {
381 Parcel data, reply;
382 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
383 data.writeVectorSize(inputs);
384 for (const QueueBufferInput& input : inputs) {
385 data.write(input);
386 }
387 status_t result = remote()->transact(QUEUE_BUFFERS, data, &reply);
388 if (result != NO_ERROR) {
389 return result;
390 }
391 result = reply.resizeOutVector(outputs);
392 for (QueueBufferOutput& output : *outputs) {
393 if (result != NO_ERROR) {
394 return result;
395 }
396 result = reply.read(output);
397 }
398 return result;
399 }
400
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700401 virtual status_t cancelBuffer(int buf, const sp<Fence>& fence) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800402 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800403 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800404 data.writeInt32(buf);
Jamie Gennis1df8c342012-12-20 14:05:45 -0800405 data.write(*fence.get());
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700406 status_t result = remote()->transact(CANCEL_BUFFER, data, &reply);
407 if (result != NO_ERROR) {
408 return result;
409 }
410 result = reply.readInt32();
411 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800412 }
413
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700414 virtual status_t cancelBuffers(
415 const std::vector<CancelBufferInput>& inputs,
416 std::vector<status_t>* results) {
417 Parcel data, reply;
418 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
419 data.writeVectorSize(inputs);
420 for (const CancelBufferInput& input : inputs) {
421 data.write(input);
422 }
423 status_t result = remote()->transact(CANCEL_BUFFERS, data, &reply);
424 if (result != NO_ERROR) {
425 return result;
426 }
427 result = reply.readInt32Vector(results);
428 return result;
429 }
430
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700431 virtual int query(int what, int* value) {
432 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800433 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700434 data.writeInt32(what);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700435 status_t result = remote()->transact(QUERY, data, &reply);
436 if (result != NO_ERROR) {
437 return result;
438 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700439 value[0] = reply.readInt32();
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700440 result = reply.readInt32();
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700441 return result;
442 }
443
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700444 virtual status_t query(const std::vector<int32_t> inputs,
445 std::vector<QueryOutput>* outputs) {
446 Parcel data, reply;
447 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
448 data.writeInt32Vector(inputs);
449 status_t result = remote()->transact(QUERY_MULTIPLE, data, &reply);
450 if (result != NO_ERROR) {
451 return result;
452 }
453 result = reply.resizeOutVector(outputs);
454 for (QueryOutput& output : *outputs) {
455 if (result != NO_ERROR) {
456 return result;
457 }
458 result = reply.read(output);
459 }
460 return result;
461 }
462
Dan Stozaf0eaf252014-03-21 13:05:51 -0700463 virtual status_t connect(const sp<IProducerListener>& listener,
Mathias Agopian365857d2013-09-11 19:35:45 -0700464 int api, bool producerControlledByApp, QueueBufferOutput* output) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700465 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800466 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Yi Kong48a619f2018-06-05 16:34:59 -0700467 if (listener != nullptr) {
Dan Stozaf0eaf252014-03-21 13:05:51 -0700468 data.writeInt32(1);
Marco Nelissen097ca272014-11-14 08:01:01 -0800469 data.writeStrongBinder(IInterface::asBinder(listener));
Dan Stozaf0eaf252014-03-21 13:05:51 -0700470 } else {
471 data.writeInt32(0);
472 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700473 data.writeInt32(api);
Mathias Agopian595264f2013-07-16 22:56:09 -0700474 data.writeInt32(producerControlledByApp);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700475 status_t result = remote()->transact(CONNECT, data, &reply);
476 if (result != NO_ERROR) {
477 return result;
478 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700479 reply.read(*output);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700480 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700481 return result;
482 }
Mathias Agopian80727112011-05-02 19:51:12 -0700483
Robert Carr97b9c862016-09-08 13:54:35 -0700484 virtual status_t disconnect(int api, DisconnectMode mode) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700485 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800486 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700487 data.writeInt32(api);
Robert Carr97b9c862016-09-08 13:54:35 -0700488 data.writeInt32(static_cast<int32_t>(mode));
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700489 status_t result =remote()->transact(DISCONNECT, data, &reply);
490 if (result != NO_ERROR) {
491 return result;
492 }
493 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700494 return result;
495 }
Jesse Hall399184a2014-03-03 15:42:54 -0800496
497 virtual status_t setSidebandStream(const sp<NativeHandle>& stream) {
498 Parcel data, reply;
499 status_t result;
500 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
501 if (stream.get()) {
502 data.writeInt32(true);
503 data.writeNativeHandle(stream->handle());
504 } else {
505 data.writeInt32(false);
506 }
507 if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) {
508 result = reply.readInt32();
509 }
510 return result;
511 }
Dan Stoza29a3e902014-06-20 13:13:57 -0700512
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700513 virtual void allocateBuffers(uint32_t width, uint32_t height,
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700514 PixelFormat format, uint64_t usage) {
Dan Stoza29a3e902014-06-20 13:13:57 -0700515 Parcel data, reply;
516 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800517 data.writeUint32(width);
518 data.writeUint32(height);
Dan Stoza29a3e902014-06-20 13:13:57 -0700519 data.writeInt32(static_cast<int32_t>(format));
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700520 data.writeUint64(usage);
Steven Moreland366eb422019-04-01 19:22:32 -0700521 status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply, IBinder::FLAG_ONEWAY);
Dan Stoza29a3e902014-06-20 13:13:57 -0700522 if (result != NO_ERROR) {
523 ALOGE("allocateBuffers failed to transact: %d", result);
524 }
525 }
Dan Stoza9de72932015-04-16 17:28:43 -0700526
527 virtual status_t allowAllocation(bool allow) {
528 Parcel data, reply;
529 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
530 data.writeInt32(static_cast<int32_t>(allow));
531 status_t result = remote()->transact(ALLOW_ALLOCATION, data, &reply);
532 if (result != NO_ERROR) {
533 return result;
534 }
535 result = reply.readInt32();
536 return result;
537 }
Dan Stoza812ed062015-06-02 15:45:22 -0700538
539 virtual status_t setGenerationNumber(uint32_t generationNumber) {
540 Parcel data, reply;
541 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
542 data.writeUint32(generationNumber);
543 status_t result = remote()->transact(SET_GENERATION_NUMBER, data, &reply);
544 if (result == NO_ERROR) {
545 result = reply.readInt32();
546 }
547 return result;
548 }
Dan Stozac6f30bd2015-06-08 09:32:50 -0700549
550 virtual String8 getConsumerName() const {
551 Parcel data, reply;
552 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
553 status_t result = remote()->transact(GET_CONSUMER_NAME, data, &reply);
554 if (result != NO_ERROR) {
555 ALOGE("getConsumerName failed to transact: %d", result);
556 return String8("TransactFailed");
557 }
558 return reply.readString8();
559 }
Dan Stoza7dde5992015-05-22 09:51:44 -0700560
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700561 virtual status_t setSharedBufferMode(bool sharedBufferMode) {
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700562 Parcel data, reply;
563 data.writeInterfaceToken(
564 IGraphicBufferProducer::getInterfaceDescriptor());
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700565 data.writeInt32(sharedBufferMode);
566 status_t result = remote()->transact(SET_SHARED_BUFFER_MODE, data,
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700567 &reply);
568 if (result == NO_ERROR) {
569 result = reply.readInt32();
570 }
571 return result;
572 }
Dan Stoza127fc632015-06-30 13:43:32 -0700573
Pablo Ceballosff95aab2016-01-13 17:09:58 -0800574 virtual status_t setAutoRefresh(bool autoRefresh) {
575 Parcel data, reply;
576 data.writeInterfaceToken(
577 IGraphicBufferProducer::getInterfaceDescriptor());
578 data.writeInt32(autoRefresh);
579 status_t result = remote()->transact(SET_AUTO_REFRESH, data, &reply);
580 if (result == NO_ERROR) {
581 result = reply.readInt32();
582 }
583 return result;
584 }
585
Dan Stoza127fc632015-06-30 13:43:32 -0700586 virtual status_t setDequeueTimeout(nsecs_t timeout) {
587 Parcel data, reply;
588 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
589 data.writeInt64(timeout);
590 status_t result = remote()->transact(SET_DEQUEUE_TIMEOUT, data, &reply);
591 if (result != NO_ERROR) {
592 ALOGE("setDequeueTimeout failed to transact: %d", result);
593 return result;
594 }
595 return reply.readInt32();
596 }
Dan Stoza50101d02016-04-07 16:53:23 -0700597
Sungtak Lee3249fb62019-03-02 16:40:47 -0800598 virtual status_t setLegacyBufferDrop(bool drop) {
599 Parcel data, reply;
600 data.writeInterfaceToken(
601 IGraphicBufferProducer::getInterfaceDescriptor());
602 data.writeInt32(drop);
603 status_t result = remote()->transact(SET_LEGACY_BUFFER_DROP,
604 data, &reply);
605 if (result != NO_ERROR) {
606 return result;
607 }
608 result = reply.readInt32();
609 return result;
610 }
611
Dan Stoza50101d02016-04-07 16:53:23 -0700612 virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer,
John Reck1a61da52016-04-28 13:18:15 -0700613 sp<Fence>* outFence, float outTransformMatrix[16]) override {
Dan Stoza50101d02016-04-07 16:53:23 -0700614 Parcel data, reply;
615 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
616 status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER, data,
617 &reply);
618 if (result != NO_ERROR) {
619 ALOGE("getLastQueuedBuffer failed to transact: %d", result);
620 return result;
621 }
622 result = reply.readInt32();
623 if (result != NO_ERROR) {
624 return result;
625 }
John Reckce8e5df2016-04-28 10:12:47 -0700626 bool hasBuffer = reply.readBool();
627 sp<GraphicBuffer> buffer;
628 if (hasBuffer) {
629 buffer = new GraphicBuffer();
630 result = reply.read(*buffer);
John Reck1a61da52016-04-28 13:18:15 -0700631 if (result == NO_ERROR) {
632 result = reply.read(outTransformMatrix, sizeof(float) * 16);
633 }
John Reckce8e5df2016-04-28 10:12:47 -0700634 }
Dan Stoza50101d02016-04-07 16:53:23 -0700635 if (result != NO_ERROR) {
636 ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
637 return result;
638 }
639 sp<Fence> fence(new Fence);
640 result = reply.read(*fence);
641 if (result != NO_ERROR) {
642 ALOGE("getLastQueuedBuffer failed to read fence: %d", result);
643 return result;
644 }
645 *outBuffer = buffer;
646 *outFence = fence;
647 return result;
648 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800649
John Reckaa5a0b22021-05-18 00:42:56 -0400650 virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence,
651 Rect* outRect, uint32_t* outTransform) override {
652 Parcel data, reply;
653 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
654 status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER2, data, &reply);
655 if (result != NO_ERROR) {
656 ALOGE("getLastQueuedBuffer failed to transact: %d", result);
657 return result;
658 }
659 status_t remoteError = NO_ERROR;
660 result = reply.readInt32(&remoteError);
661 if (result != NO_ERROR) {
662 ALOGE("getLastQueuedBuffer failed to read status: %d", result);
663 return result;
664 }
665 if (remoteError != NO_ERROR) {
666 return remoteError;
667 }
668 bool hasBuffer = false;
669 result = reply.readBool(&hasBuffer);
670 if (result != NO_ERROR) {
671 ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
672 return result;
673 }
674 sp<GraphicBuffer> buffer;
675 if (hasBuffer) {
676 buffer = new GraphicBuffer();
677 result = reply.read(*buffer);
678 if (result == NO_ERROR) {
679 result = reply.read(*outRect);
680 }
681 if (result == NO_ERROR) {
682 result = reply.readUint32(outTransform);
683 }
684 }
685 if (result != NO_ERROR) {
686 ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
687 return result;
688 }
689 sp<Fence> fence(new Fence);
690 result = reply.read(*fence);
691 if (result != NO_ERROR) {
692 ALOGE("getLastQueuedBuffer failed to read fence: %d", result);
693 return result;
694 }
695 *outBuffer = buffer;
696 *outFence = fence;
697 return result;
698 }
699
Brian Anderson3890c392016-07-25 12:48:08 -0700700 virtual void getFrameTimestamps(FrameEventHistoryDelta* outDelta) {
Pablo Ceballosce796e72016-02-04 19:10:51 -0800701 Parcel data, reply;
702 status_t result = data.writeInterfaceToken(
703 IGraphicBufferProducer::getInterfaceDescriptor());
704 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700705 ALOGE("IGBP::getFrameTimestamps failed to write token: %d", result);
706 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800707 }
708 result = remote()->transact(GET_FRAME_TIMESTAMPS, data, &reply);
709 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700710 ALOGE("IGBP::getFrameTimestamps failed to transact: %d", result);
711 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800712 }
Brian Anderson3890c392016-07-25 12:48:08 -0700713 result = reply.read(*outDelta);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800714 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700715 ALOGE("IGBP::getFrameTimestamps failed to read timestamps: %d",
716 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800717 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800718 }
Pablo Ceballos6155b402016-06-30 17:01:49 -0700719
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -0700720 virtual status_t getUniqueId(uint64_t* outId) const {
721 Parcel data, reply;
722 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
723 status_t result = remote()->transact(GET_UNIQUE_ID, data, &reply);
724 if (result != NO_ERROR) {
725 ALOGE("getUniqueId failed to transact: %d", result);
726 }
727 status_t actualResult = NO_ERROR;
728 result = reply.readInt32(&actualResult);
729 if (result != NO_ERROR) {
730 return result;
731 }
732 result = reply.readUint64(outId);
733 if (result != NO_ERROR) {
734 return result;
735 }
736 return actualResult;
737 }
Chia-I Wue2786ea2017-08-07 10:36:08 -0700738
739 virtual status_t getConsumerUsage(uint64_t* outUsage) const {
740 Parcel data, reply;
741 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
742 status_t result = remote()->transact(GET_CONSUMER_USAGE, data, &reply);
743 if (result != NO_ERROR) {
744 ALOGE("getConsumerUsage failed to transact: %d", result);
745 }
746 status_t actualResult = NO_ERROR;
747 result = reply.readInt32(&actualResult);
748 if (result != NO_ERROR) {
749 return result;
750 }
751 result = reply.readUint64(outUsage);
752 if (result != NO_ERROR) {
753 return result;
754 }
755 return actualResult;
756 }
Yiwei Zhang538cedc2019-06-24 19:35:03 -0700757
758 virtual status_t setAutoPrerotation(bool autoPrerotation) {
759 Parcel data, reply;
760 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
761 data.writeBool(autoPrerotation);
762 status_t result = remote()->transact(SET_AUTO_PREROTATION, data, &reply);
763 if (result == NO_ERROR) {
764 result = reply.readInt32();
765 }
766 return result;
767 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800768};
769
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800770// Out-of-line virtual method definition to trigger vtable emission in this
771// translation unit (see clang warning -Wweak-vtables)
772BpGraphicBufferProducer::~BpGraphicBufferProducer() {}
773
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800774class HpGraphicBufferProducer : public HpInterface<
Pawin Vongmasae672cd02019-02-14 16:01:29 -0800775 BpGraphicBufferProducer,
776 H2BGraphicBufferProducerV1_0,
777 H2BGraphicBufferProducerV2_0> {
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800778public:
Chih-Hung Hsiehaaf62162018-12-20 15:45:04 -0800779 explicit HpGraphicBufferProducer(const sp<IBinder>& base) : PBase(base) {}
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800780
781 status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) override {
782 return mBase->requestBuffer(slot, buf);
783 }
784
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700785 status_t requestBuffers(
786 const std::vector<int32_t>& slots,
787 std::vector<RequestBufferOutput>* outputs) override {
788 return mBase->requestBuffers(slots, outputs);
789 }
790
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800791 status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) override {
792 return mBase->setMaxDequeuedBufferCount(maxDequeuedBuffers);
793 }
794
795 status_t setAsyncMode(bool async) override {
796 return mBase->setAsyncMode(async);
797 }
798
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600799 status_t dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w, uint32_t h, PixelFormat format,
800 uint64_t usage, uint64_t* outBufferAge,
801 FrameEventHistoryDelta* outTimestamps) override {
802 return mBase->dequeueBuffer(slot, fence, w, h, format, usage, outBufferAge, outTimestamps);
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800803 }
804
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700805 status_t dequeueBuffers(
806 const std::vector<DequeueBufferInput>& inputs,
807 std::vector<DequeueBufferOutput>* outputs) override {
808 return mBase->dequeueBuffers(inputs, outputs);
809 }
810
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800811 status_t detachBuffer(int slot) override {
812 return mBase->detachBuffer(slot);
813 }
814
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700815 status_t detachBuffers(const std::vector<int32_t>& slots,
816 std::vector<status_t>* results) override {
817 return mBase->detachBuffers(slots, results);
818 }
819
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800820 status_t detachNextBuffer(
821 sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) override {
822 return mBase->detachNextBuffer(outBuffer, outFence);
823 }
824
825 status_t attachBuffer(
826 int* outSlot, const sp<GraphicBuffer>& buffer) override {
827 return mBase->attachBuffer(outSlot, buffer);
828 }
829
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700830 status_t attachBuffers(
831 const std::vector<sp<GraphicBuffer>>& buffers,
832 std::vector<AttachBufferOutput>* outputs) override {
833 return mBase->attachBuffers(buffers, outputs);
834 }
835
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800836 status_t queueBuffer(
837 int slot,
838 const QueueBufferInput& input,
839 QueueBufferOutput* output) override {
840 return mBase->queueBuffer(slot, input, output);
841 }
842
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700843 status_t queueBuffers(const std::vector<QueueBufferInput>& inputs,
844 std::vector<QueueBufferOutput>* outputs) override {
845 return mBase->queueBuffers(inputs, outputs);
846 }
847
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800848 status_t cancelBuffer(int slot, const sp<Fence>& fence) override {
849 return mBase->cancelBuffer(slot, fence);
850 }
851
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700852 status_t cancelBuffers(
853 const std::vector<CancelBufferInput>& inputs,
854 std::vector<status_t>* results) override {
855 return mBase->cancelBuffers(inputs, results);
856 }
857
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800858 int query(int what, int* value) override {
859 return mBase->query(what, value);
860 }
861
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700862 status_t query(const std::vector<int32_t> inputs,
863 std::vector<QueryOutput>* outputs) override {
864 return mBase->query(inputs, outputs);
865 }
866
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800867 status_t connect(
868 const sp<IProducerListener>& listener,
869 int api, bool producerControlledByApp,
870 QueueBufferOutput* output) override {
871 return mBase->connect(listener, api, producerControlledByApp, output);
872 }
873
874 status_t disconnect(
875 int api, DisconnectMode mode = DisconnectMode::Api) override {
876 return mBase->disconnect(api, mode);
877 }
878
879 status_t setSidebandStream(const sp<NativeHandle>& stream) override {
880 return mBase->setSidebandStream(stream);
881 }
882
883 void allocateBuffers(uint32_t width, uint32_t height,
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700884 PixelFormat format, uint64_t usage) override {
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800885 return mBase->allocateBuffers(width, height, format, usage);
886 }
887
888 status_t allowAllocation(bool allow) override {
889 return mBase->allowAllocation(allow);
890 }
891
892 status_t setGenerationNumber(uint32_t generationNumber) override {
893 return mBase->setGenerationNumber(generationNumber);
894 }
895
896 String8 getConsumerName() const override {
897 return mBase->getConsumerName();
898 }
899
900 status_t setSharedBufferMode(bool sharedBufferMode) override {
901 return mBase->setSharedBufferMode(sharedBufferMode);
902 }
903
904 status_t setAutoRefresh(bool autoRefresh) override {
905 return mBase->setAutoRefresh(autoRefresh);
906 }
907
908 status_t setDequeueTimeout(nsecs_t timeout) override {
909 return mBase->setDequeueTimeout(timeout);
910 }
911
Sungtak Lee3249fb62019-03-02 16:40:47 -0800912 status_t setLegacyBufferDrop(bool drop) override {
913 return mBase->setLegacyBufferDrop(drop);
914 }
915
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800916 status_t getLastQueuedBuffer(
917 sp<GraphicBuffer>* outBuffer,
918 sp<Fence>* outFence,
919 float outTransformMatrix[16]) override {
920 return mBase->getLastQueuedBuffer(
921 outBuffer, outFence, outTransformMatrix);
922 }
923
John Reckaa5a0b22021-05-18 00:42:56 -0400924 status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence, Rect* outRect,
925 uint32_t* outTransform) override {
926 return mBase->getLastQueuedBuffer(outBuffer, outFence, outRect, outTransform);
927 }
928
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800929 void getFrameTimestamps(FrameEventHistoryDelta* outDelta) override {
930 return mBase->getFrameTimestamps(outDelta);
931 }
932
933 status_t getUniqueId(uint64_t* outId) const override {
934 return mBase->getUniqueId(outId);
935 }
Chia-I Wue2786ea2017-08-07 10:36:08 -0700936
937 status_t getConsumerUsage(uint64_t* outUsage) const override {
938 return mBase->getConsumerUsage(outUsage);
939 }
Yiwei Zhang538cedc2019-06-24 19:35:03 -0700940
941 status_t setAutoPrerotation(bool autoPrerotation) override {
942 return mBase->setAutoPrerotation(autoPrerotation);
943 }
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800944};
945
Pawin Vongmasa338b81d2019-01-31 05:20:07 -0800946IMPLEMENT_HYBRID_META_INTERFACE(GraphicBufferProducer,
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800947 "android.gui.IGraphicBufferProducer");
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800948
949// ----------------------------------------------------------------------
950
Sungtak Lee3249fb62019-03-02 16:40:47 -0800951status_t IGraphicBufferProducer::setLegacyBufferDrop(bool drop) {
952 // No-op for IGBP other than BufferQueue.
953 (void) drop;
954 return INVALID_OPERATION;
955}
956
Yiwei Zhang538cedc2019-06-24 19:35:03 -0700957status_t IGraphicBufferProducer::setAutoPrerotation(bool autoPrerotation) {
958 // No-op for IGBP other than BufferQueue.
959 (void)autoPrerotation;
960 return INVALID_OPERATION;
961}
962
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -0800963status_t IGraphicBufferProducer::exportToParcel(Parcel* parcel) {
964 status_t res = OK;
965 res = parcel->writeUint32(USE_BUFFER_QUEUE);
966 if (res != NO_ERROR) {
967 ALOGE("exportToParcel: Cannot write magic, res=%d.", res);
968 return res;
969 }
970
971 return parcel->writeStrongBinder(IInterface::asBinder(this));
972}
973
974/* static */
975status_t IGraphicBufferProducer::exportToParcel(const sp<IGraphicBufferProducer>& producer,
976 Parcel* parcel) {
977 if (parcel == nullptr) {
978 ALOGE("exportToParcel: Invalid parcel object.");
979 return BAD_VALUE;
980 }
981
982 if (producer == nullptr) {
983 status_t res = OK;
984 res = parcel->writeUint32(IGraphicBufferProducer::USE_BUFFER_QUEUE);
985 if (res != NO_ERROR) return res;
986 return parcel->writeStrongBinder(nullptr);
987 } else {
988 return producer->exportToParcel(parcel);
989 }
990}
991
992/* static */
993sp<IGraphicBufferProducer> IGraphicBufferProducer::createFromParcel(const Parcel* parcel) {
994 uint32_t outMagic = 0;
995 status_t res = NO_ERROR;
996
997 res = parcel->readUint32(&outMagic);
998 if (res != NO_ERROR) {
999 ALOGE("createFromParcel: Failed to read magic, error=%d.", res);
1000 return nullptr;
1001 }
1002
1003 switch (outMagic) {
1004 case USE_BUFFER_QUEUE: {
1005 sp<IBinder> binder;
1006 res = parcel->readNullableStrongBinder(&binder);
1007 if (res != NO_ERROR) {
1008 ALOGE("createFromParcel: Can't read strong binder.");
1009 return nullptr;
1010 }
1011 return interface_cast<IGraphicBufferProducer>(binder);
1012 }
1013 case USE_BUFFER_HUB: {
1014 ALOGE("createFromParcel: BufferHub not implemented.");
Jiyong Parka75d3d62018-04-09 12:16:30 +09001015#ifndef NO_BUFFERHUB
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -08001016 dvr::ProducerQueueParcelable producerParcelable;
1017 res = producerParcelable.readFromParcel(parcel);
1018 if (res != NO_ERROR) {
1019 ALOGE("createFromParcel: Failed to read from parcel, error=%d", res);
1020 return nullptr;
1021 }
1022 return BufferHubProducer::Create(std::move(producerParcelable));
Jiyong Parka75d3d62018-04-09 12:16:30 +09001023#else
1024 return nullptr;
1025#endif
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -08001026 }
1027 default: {
1028 ALOGE("createFromParcel: Unexpected mgaic: 0x%x.", outMagic);
1029 return nullptr;
1030 }
1031 }
1032}
1033
1034// ----------------------------------------------------------------------------
1035
Andy McFadden2adaf042012-12-18 09:49:45 -08001036status_t BnGraphicBufferProducer::onTransact(
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001037 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
1038{
1039 switch(code) {
1040 case REQUEST_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001041 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001042 int bufferIdx = data.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -07001043 sp<GraphicBuffer> buffer;
1044 int result = requestBuffer(bufferIdx, &buffer);
Yi Kong48a619f2018-06-05 16:34:59 -07001045 reply->writeInt32(buffer != nullptr);
1046 if (buffer != nullptr) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001047 reply->write(*buffer);
1048 }
Jamie Gennis7b305ff2011-07-19 12:08:33 -07001049 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001050 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001051 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001052 case REQUEST_BUFFERS: {
1053 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1054 std::vector<int32_t> slots;
1055 std::vector<RequestBufferOutput> outputs;
1056 status_t result = data.readInt32Vector(&slots);
1057 if (result != NO_ERROR) {
1058 return result;
1059 }
1060 (void)requestBuffers(slots, &outputs);
1061 result = reply->writeVectorSize(outputs);
1062 for (const RequestBufferOutput& output : outputs) {
1063 if (result != NO_ERROR) {
1064 return result;
1065 }
1066 result = reply->write(output);
1067 }
1068 return result;
1069 }
Pablo Ceballosfa455352015-08-12 17:47:47 -07001070 case SET_MAX_DEQUEUED_BUFFER_COUNT: {
1071 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1072 int maxDequeuedBuffers = data.readInt32();
1073 int result = setMaxDequeuedBufferCount(maxDequeuedBuffers);
1074 reply->writeInt32(result);
1075 return NO_ERROR;
1076 }
1077 case SET_ASYNC_MODE: {
1078 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1079 bool async = data.readInt32();
1080 int result = setAsyncMode(async);
1081 reply->writeInt32(result);
1082 return NO_ERROR;
1083 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001084 case DEQUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001085 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001086 uint32_t width = data.readUint32();
1087 uint32_t height = data.readUint32();
1088 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
Mathias Agopiancb496ac2017-05-22 14:21:00 -07001089 uint64_t usage = data.readUint64();
Ian Elliotta2eb34c2017-07-18 11:05:49 -06001090 uint64_t bufferAge = 0;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001091 bool getTimestamps = data.readBool();
Brian Andersonbaaad322016-07-22 15:55:13 -07001092
Naveen Leekha12ba0f52015-09-21 17:28:04 -07001093 int buf = 0;
Brian Andersonbaaad322016-07-22 15:55:13 -07001094 sp<Fence> fence = Fence::NO_FENCE;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001095 FrameEventHistoryDelta frameTimestamps;
Ian Elliotta2eb34c2017-07-18 11:05:49 -06001096 int result = dequeueBuffer(&buf, &fence, width, height, format, usage, &bufferAge,
1097 getTimestamps ? &frameTimestamps : nullptr);
Brian Andersonbaaad322016-07-22 15:55:13 -07001098
Tobin Ehlis209e5fb2019-03-26 14:06:29 -06001099 if (fence == nullptr) {
1100 ALOGE("dequeueBuffer returned a NULL fence, setting to Fence::NO_FENCE");
1101 fence = Fence::NO_FENCE;
1102 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001103 reply->writeInt32(buf);
Brian Andersonbaaad322016-07-22 15:55:13 -07001104 reply->write(*fence);
Ian Elliotta2eb34c2017-07-18 11:05:49 -06001105 reply->writeUint64(bufferAge);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001106 if (getTimestamps) {
1107 reply->write(frameTimestamps);
1108 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001109 reply->writeInt32(result);
1110 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001111 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001112 case DEQUEUE_BUFFERS: {
1113 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1114 std::vector<DequeueBufferInput> inputs;
1115 std::vector<DequeueBufferOutput> outputs;
1116 status_t result = data.resizeOutVector(&inputs);
1117 if (result != NO_ERROR) {
1118 return result;
1119 }
1120 for (DequeueBufferInput& input : inputs) {
1121 result = data.read(input);
1122 if (result != NO_ERROR) {
1123 return result;
1124 }
1125 }
1126 (void)dequeueBuffers(inputs, &outputs);
1127 result = reply->writeVectorSize(outputs);
1128 for (const DequeueBufferOutput& output : outputs) {
1129 if (result != NO_ERROR) {
1130 return result;
1131 }
1132 result = reply->write(output);
1133 }
1134 return result;
1135 }
Dan Stoza9f3053d2014-03-06 15:14:33 -08001136 case DETACH_BUFFER: {
1137 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1138 int slot = data.readInt32();
1139 int result = detachBuffer(slot);
1140 reply->writeInt32(result);
1141 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001142 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001143 case DETACH_BUFFERS: {
1144 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1145 std::vector<int32_t> slots;
1146 std::vector<status_t> results;
1147 status_t result = data.readInt32Vector(&slots);
1148 if (result != NO_ERROR) {
1149 return result;
1150 }
1151 (void)detachBuffers(slots, &results);
1152 return reply->writeInt32Vector(results);
1153 }
Dan Stozad9822a32014-03-28 15:25:31 -07001154 case DETACH_NEXT_BUFFER: {
1155 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1156 sp<GraphicBuffer> buffer;
1157 sp<Fence> fence;
1158 int32_t result = detachNextBuffer(&buffer, &fence);
1159 reply->writeInt32(result);
1160 if (result == NO_ERROR) {
Yi Kong48a619f2018-06-05 16:34:59 -07001161 reply->writeInt32(buffer != nullptr);
1162 if (buffer != nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -07001163 reply->write(*buffer);
1164 }
Yi Kong48a619f2018-06-05 16:34:59 -07001165 reply->writeInt32(fence != nullptr);
1166 if (fence != nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -07001167 reply->write(*fence);
1168 }
1169 }
1170 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001171 }
Dan Stoza9f3053d2014-03-06 15:14:33 -08001172 case ATTACH_BUFFER: {
1173 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1174 sp<GraphicBuffer> buffer = new GraphicBuffer();
Pablo Ceballos70636b32016-07-06 15:24:54 -07001175 status_t result = data.read(*buffer.get());
Naveen Leekha12ba0f52015-09-21 17:28:04 -07001176 int slot = 0;
Pablo Ceballos70636b32016-07-06 15:24:54 -07001177 if (result == NO_ERROR) {
1178 result = attachBuffer(&slot, buffer);
1179 }
Dan Stoza9f3053d2014-03-06 15:14:33 -08001180 reply->writeInt32(slot);
1181 reply->writeInt32(result);
1182 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001183 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001184 case ATTACH_BUFFERS: {
1185 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1186 std::vector<sp<GraphicBuffer>> buffers;
1187 status_t result = data.resizeOutVector(&buffers);
1188 if (result != NO_ERROR) {
1189 return result;
1190 }
1191 for (sp<GraphicBuffer>& buffer : buffers) {
1192 buffer = new GraphicBuffer();
1193 result = data.read(*buffer.get());
1194 if (result != NO_ERROR) {
1195 return result;
1196 }
1197 }
1198 std::vector<AttachBufferOutput> outputs;
1199 (void)attachBuffers(buffers, &outputs);
1200 result = reply->writeVectorSize(outputs);
1201 for (const AttachBufferOutput& output : outputs) {
1202 if (result != NO_ERROR) {
1203 return result;
1204 }
1205 result = reply->write(output);
1206 }
1207 return result;
1208 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001209 case QUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001210 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001211
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001212 int buf = data.readInt32();
Jesse Hallc777b0b2012-06-28 12:52:05 -07001213 QueueBufferInput input(data);
Brian Andersonbaaad322016-07-22 15:55:13 -07001214 QueueBufferOutput output;
1215 status_t result = queueBuffer(buf, input, &output);
Brian Andersonbaaad322016-07-22 15:55:13 -07001216 reply->write(output);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001217 reply->writeInt32(result);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001218
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001219 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001220 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001221 case QUEUE_BUFFERS: {
1222 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1223 std::vector<QueueBufferInput> inputs;
1224 status_t result = data.resizeOutVector(&inputs);
1225 if (result != NO_ERROR) {
1226 return result;
1227 }
1228 for (QueueBufferInput& input : inputs) {
1229 result = data.read(input);
1230 if (result != NO_ERROR) {
1231 return result;
1232 }
1233 }
1234 std::vector<QueueBufferOutput> outputs;
1235 (void)queueBuffers(inputs, &outputs);
1236 result = reply->writeVectorSize(outputs);
1237 for (const QueueBufferOutput& output : outputs) {
1238 if (result != NO_ERROR) {
1239 return result;
1240 }
1241 result = reply->write(output);
1242 }
1243 return result;
1244 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001245 case CANCEL_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001246 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001247 int buf = data.readInt32();
Jamie Gennis1df8c342012-12-20 14:05:45 -08001248 sp<Fence> fence = new Fence();
Pablo Ceballos70636b32016-07-06 15:24:54 -07001249 status_t result = data.read(*fence.get());
1250 if (result == NO_ERROR) {
1251 result = cancelBuffer(buf, fence);
1252 }
Pablo Ceballos583b1b32015-09-03 18:23:52 -07001253 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001254 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001255 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001256 case CANCEL_BUFFERS: {
1257 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1258 std::vector<CancelBufferInput> inputs;
1259 status_t result = data.resizeOutVector(&inputs);
1260 for (CancelBufferInput& input : inputs) {
1261 if (result != NO_ERROR) {
1262 return result;
1263 }
1264 result = data.read(input);
1265 }
1266 if (result != NO_ERROR) {
1267 return result;
1268 }
1269 std::vector<status_t> results;
1270 result = cancelBuffers(inputs, &results);
1271 if (result != NO_ERROR) {
1272 return result;
1273 }
1274 return reply->writeInt32Vector(results);
1275 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -07001276 case QUERY: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001277 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Naveen Leekha12ba0f52015-09-21 17:28:04 -07001278 int value = 0;
Mathias Agopianeafabcd2011-04-20 14:20:59 -07001279 int what = data.readInt32();
1280 int res = query(what, &value);
1281 reply->writeInt32(value);
1282 reply->writeInt32(res);
1283 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001284 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001285 case QUERY_MULTIPLE: {
1286 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1287 std::vector<int32_t> inputs;
1288 status_t result = data.readInt32Vector(&inputs);
1289 if (result != NO_ERROR) {
1290 return result;
1291 }
1292 std::vector<QueryOutput> outputs;
1293 result = query(inputs, &outputs);
1294 if (result != NO_ERROR) {
1295 return result;
1296 }
1297 result = reply->writeVectorSize(outputs);
1298 for (const QueryOutput& output : outputs) {
1299 if (result != NO_ERROR) {
1300 return result;
1301 }
1302 result = reply->write(output);
1303 }
1304 return result;
1305 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001306 case CONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001307 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stozaf0eaf252014-03-21 13:05:51 -07001308 sp<IProducerListener> listener;
1309 if (data.readInt32() == 1) {
1310 listener = IProducerListener::asInterface(data.readStrongBinder());
1311 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001312 int api = data.readInt32();
Mathias Agopian595264f2013-07-16 22:56:09 -07001313 bool producerControlledByApp = data.readInt32();
Brian Andersonbaaad322016-07-22 15:55:13 -07001314 QueueBufferOutput output;
1315 status_t res = connect(listener, api, producerControlledByApp, &output);
1316 reply->write(output);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001317 reply->writeInt32(res);
1318 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001319 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001320 case DISCONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001321 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001322 int api = data.readInt32();
Robert Carr97b9c862016-09-08 13:54:35 -07001323 DisconnectMode mode = static_cast<DisconnectMode>(data.readInt32());
1324 status_t res = disconnect(api, mode);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001325 reply->writeInt32(res);
1326 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001327 }
Jesse Hall399184a2014-03-03 15:42:54 -08001328 case SET_SIDEBAND_STREAM: {
1329 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1330 sp<NativeHandle> stream;
1331 if (data.readInt32()) {
Wonsik Kim0ec54e12014-03-21 10:46:24 +09001332 stream = NativeHandle::create(data.readNativeHandle(), true);
Jesse Hall399184a2014-03-03 15:42:54 -08001333 }
1334 status_t result = setSidebandStream(stream);
1335 reply->writeInt32(result);
1336 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001337 }
Dan Stoza9de72932015-04-16 17:28:43 -07001338 case ALLOCATE_BUFFERS: {
Dan Stoza29a3e902014-06-20 13:13:57 -07001339 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001340 uint32_t width = data.readUint32();
1341 uint32_t height = data.readUint32();
1342 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
Mathias Agopiancb496ac2017-05-22 14:21:00 -07001343 uint64_t usage = data.readUint64();
Pablo Ceballos567dbbb2015-08-26 18:59:08 -07001344 allocateBuffers(width, height, format, usage);
Dan Stoza29a3e902014-06-20 13:13:57 -07001345 return NO_ERROR;
Dan Stoza9de72932015-04-16 17:28:43 -07001346 }
1347 case ALLOW_ALLOCATION: {
1348 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1349 bool allow = static_cast<bool>(data.readInt32());
1350 status_t result = allowAllocation(allow);
1351 reply->writeInt32(result);
1352 return NO_ERROR;
1353 }
Dan Stoza812ed062015-06-02 15:45:22 -07001354 case SET_GENERATION_NUMBER: {
1355 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1356 uint32_t generationNumber = data.readUint32();
1357 status_t result = setGenerationNumber(generationNumber);
1358 reply->writeInt32(result);
1359 return NO_ERROR;
1360 }
Dan Stozac6f30bd2015-06-08 09:32:50 -07001361 case GET_CONSUMER_NAME: {
1362 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1363 reply->writeString8(getConsumerName());
1364 return NO_ERROR;
1365 }
Pablo Ceballos3559fbf2016-03-17 15:50:23 -07001366 case SET_SHARED_BUFFER_MODE: {
Pablo Ceballosccdfd602015-10-07 15:05:45 -07001367 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Pablo Ceballos3559fbf2016-03-17 15:50:23 -07001368 bool sharedBufferMode = data.readInt32();
1369 status_t result = setSharedBufferMode(sharedBufferMode);
Pablo Ceballosccdfd602015-10-07 15:05:45 -07001370 reply->writeInt32(result);
1371 return NO_ERROR;
1372 }
Pablo Ceballosff95aab2016-01-13 17:09:58 -08001373 case SET_AUTO_REFRESH: {
1374 CHECK_INTERFACE(IGraphicBuffer, data, reply);
1375 bool autoRefresh = data.readInt32();
1376 status_t result = setAutoRefresh(autoRefresh);
1377 reply->writeInt32(result);
1378 return NO_ERROR;
1379 }
Dan Stoza127fc632015-06-30 13:43:32 -07001380 case SET_DEQUEUE_TIMEOUT: {
1381 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1382 nsecs_t timeout = data.readInt64();
1383 status_t result = setDequeueTimeout(timeout);
1384 reply->writeInt32(result);
1385 return NO_ERROR;
1386 }
Dan Stoza50101d02016-04-07 16:53:23 -07001387 case GET_LAST_QUEUED_BUFFER: {
1388 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1389 sp<GraphicBuffer> buffer(nullptr);
1390 sp<Fence> fence(Fence::NO_FENCE);
John Reck1a61da52016-04-28 13:18:15 -07001391 float transform[16] = {};
1392 status_t result = getLastQueuedBuffer(&buffer, &fence, transform);
Dan Stoza50101d02016-04-07 16:53:23 -07001393 reply->writeInt32(result);
1394 if (result != NO_ERROR) {
1395 return result;
1396 }
John Reckce8e5df2016-04-28 10:12:47 -07001397 if (!buffer.get()) {
1398 reply->writeBool(false);
1399 } else {
1400 reply->writeBool(true);
1401 result = reply->write(*buffer);
John Reck1a61da52016-04-28 13:18:15 -07001402 if (result == NO_ERROR) {
1403 reply->write(transform, sizeof(float) * 16);
1404 }
John Reckce8e5df2016-04-28 10:12:47 -07001405 }
Dan Stoza50101d02016-04-07 16:53:23 -07001406 if (result != NO_ERROR) {
1407 ALOGE("getLastQueuedBuffer failed to write buffer: %d", result);
1408 return result;
1409 }
Tobin Ehlis209e5fb2019-03-26 14:06:29 -06001410 if (fence == nullptr) {
1411 ALOGE("getLastQueuedBuffer returned a NULL fence, setting to Fence::NO_FENCE");
1412 fence = Fence::NO_FENCE;
1413 }
Dan Stoza50101d02016-04-07 16:53:23 -07001414 result = reply->write(*fence);
1415 if (result != NO_ERROR) {
1416 ALOGE("getLastQueuedBuffer failed to write fence: %d", result);
1417 return result;
1418 }
1419 return NO_ERROR;
1420 }
John Reckaa5a0b22021-05-18 00:42:56 -04001421 case GET_LAST_QUEUED_BUFFER2: {
1422 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1423 sp<GraphicBuffer> buffer(nullptr);
1424 sp<Fence> fence(Fence::NO_FENCE);
1425 Rect crop;
1426 uint32_t transform;
1427 status_t result = getLastQueuedBuffer(&buffer, &fence, &crop, &transform);
1428 reply->writeInt32(result);
1429 if (result != NO_ERROR) {
1430 return result;
1431 }
1432 if (!buffer.get()) {
1433 reply->writeBool(false);
1434 } else {
1435 reply->writeBool(true);
1436 result = reply->write(*buffer);
1437 if (result == NO_ERROR) {
1438 result = reply->write(crop);
1439 }
1440 if (result == NO_ERROR) {
1441 result = reply->writeUint32(transform);
1442 }
1443 }
1444 if (result != NO_ERROR) {
1445 ALOGE("getLastQueuedBuffer failed to write buffer: %d", result);
1446 return result;
1447 }
1448 if (fence == nullptr) {
1449 ALOGE("getLastQueuedBuffer returned a NULL fence, setting to Fence::NO_FENCE");
1450 fence = Fence::NO_FENCE;
1451 }
1452 result = reply->write(*fence);
1453 if (result != NO_ERROR) {
1454 ALOGE("getLastQueuedBuffer failed to write fence: %d", result);
1455 return result;
1456 }
1457 return NO_ERROR;
1458 }
1459
Pablo Ceballosce796e72016-02-04 19:10:51 -08001460 case GET_FRAME_TIMESTAMPS: {
1461 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson3890c392016-07-25 12:48:08 -07001462 FrameEventHistoryDelta frameTimestamps;
1463 getFrameTimestamps(&frameTimestamps);
1464 status_t result = reply->write(frameTimestamps);
Pablo Ceballosce796e72016-02-04 19:10:51 -08001465 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -07001466 ALOGE("BnGBP::GET_FRAME_TIMESTAMPS failed to write buffer: %d",
1467 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -08001468 return result;
1469 }
Pablo Ceballosce796e72016-02-04 19:10:51 -08001470 return NO_ERROR;
1471 }
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -07001472 case GET_UNIQUE_ID: {
1473 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1474 uint64_t outId = 0;
1475 status_t actualResult = getUniqueId(&outId);
1476 status_t result = reply->writeInt32(actualResult);
1477 if (result != NO_ERROR) {
1478 return result;
1479 }
1480 result = reply->writeUint64(outId);
1481 if (result != NO_ERROR) {
1482 return result;
1483 }
1484 return NO_ERROR;
1485 }
Chia-I Wue2786ea2017-08-07 10:36:08 -07001486 case GET_CONSUMER_USAGE: {
1487 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1488 uint64_t outUsage = 0;
1489 status_t actualResult = getConsumerUsage(&outUsage);
1490 status_t result = reply->writeInt32(actualResult);
1491 if (result != NO_ERROR) {
1492 return result;
1493 }
1494 result = reply->writeUint64(outUsage);
1495 if (result != NO_ERROR) {
1496 return result;
1497 }
1498 return NO_ERROR;
1499 }
Sungtak Lee3249fb62019-03-02 16:40:47 -08001500 case SET_LEGACY_BUFFER_DROP: {
1501 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1502 bool drop = data.readInt32();
1503 int result = setLegacyBufferDrop(drop);
1504 reply->writeInt32(result);
1505 return NO_ERROR;
1506 }
Yiwei Zhang538cedc2019-06-24 19:35:03 -07001507 case SET_AUTO_PREROTATION: {
1508 CHECK_INTERFACE(IGraphicBuffer, data, reply);
1509 bool autoPrerotation = data.readBool();
1510 status_t result = setAutoPrerotation(autoPrerotation);
1511 reply->writeInt32(result);
1512 return NO_ERROR;
1513 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001514 }
1515 return BBinder::onTransact(code, data, reply, flags);
1516}
1517
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001518}; // namespace android