blob: c1f9b8522978a2cde8be64e42805bb2cde2a4b57 [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,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080084};
85
Andy McFadden2adaf042012-12-18 09:49:45 -080086class BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080087{
88public:
Chih-Hung Hsiehe2347b72016-04-25 15:41:05 -070089 explicit BpGraphicBufferProducer(const sp<IBinder>& impl)
Andy McFadden2adaf042012-12-18 09:49:45 -080090 : BpInterface<IGraphicBufferProducer>(impl)
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080091 {
92 }
93
Yi Kongca038512017-05-02 16:55:24 -070094 ~BpGraphicBufferProducer() override;
Dan Stoza3be1c6b2014-11-18 10:24:03 -080095
Jamie Gennis7b305ff2011-07-19 12:08:33 -070096 virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080097 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -080098 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080099 data.writeInt32(bufferIdx);
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700100 status_t result = remote()->transact(REQUEST_BUFFER, data, &reply);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700101 if (result != NO_ERROR) {
102 return result;
103 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800104 bool nonNull = reply.readInt32();
105 if (nonNull) {
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700106 *buf = new GraphicBuffer();
Lingyun Zhu2aff7022012-11-20 19:24:35 +0800107 result = reply.read(**buf);
108 if(result != NO_ERROR) {
109 (*buf).clear();
110 return result;
111 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800112 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700113 result = reply.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700114 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800115 }
116
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700117 virtual status_t requestBuffers(
118 const std::vector<int32_t>& slots,
119 std::vector<RequestBufferOutput>* outputs) override {
120 Parcel data, reply;
121 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
122 data.writeInt32Vector(slots);
123 status_t result = remote()->transact(REQUEST_BUFFERS, data, &reply);
124 if (result != NO_ERROR) {
125 return result;
126 }
127 result = reply.resizeOutVector(outputs);
128 for (RequestBufferOutput& output : *outputs) {
129 if (result != NO_ERROR) {
130 return result;
131 }
132 result = reply.read(output);
133 }
134
135 return result;
136 }
137
Pablo Ceballosfa455352015-08-12 17:47:47 -0700138 virtual status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) {
139 Parcel data, reply;
140 data.writeInterfaceToken(
141 IGraphicBufferProducer::getInterfaceDescriptor());
142 data.writeInt32(maxDequeuedBuffers);
143 status_t result = remote()->transact(SET_MAX_DEQUEUED_BUFFER_COUNT,
144 data, &reply);
145 if (result != NO_ERROR) {
146 return result;
147 }
148 result = reply.readInt32();
149 return result;
150 }
151
152 virtual status_t setAsyncMode(bool async) {
153 Parcel data, reply;
154 data.writeInterfaceToken(
155 IGraphicBufferProducer::getInterfaceDescriptor());
156 data.writeInt32(async);
157 status_t result = remote()->transact(SET_ASYNC_MODE,
158 data, &reply);
159 if (result != NO_ERROR) {
160 return result;
161 }
162 result = reply.readInt32();
163 return result;
164 }
165
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600166 virtual status_t dequeueBuffer(int* buf, sp<Fence>* fence, uint32_t width, uint32_t height,
167 PixelFormat format, uint64_t usage, uint64_t* outBufferAge,
168 FrameEventHistoryDelta* outTimestamps) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800169 Parcel data, reply;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700170 bool getFrameTimestamps = (outTimestamps != nullptr);
Brian Andersonbaaad322016-07-22 15:55:13 -0700171
Andy McFadden2adaf042012-12-18 09:49:45 -0800172 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800173 data.writeUint32(width);
174 data.writeUint32(height);
175 data.writeInt32(static_cast<int32_t>(format));
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700176 data.writeUint64(usage);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700177 data.writeBool(getFrameTimestamps);
Brian Andersonbaaad322016-07-22 15:55:13 -0700178
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700179 status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply);
180 if (result != NO_ERROR) {
181 return result;
182 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700183
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800184 *buf = reply.readInt32();
Brian Andersonbaaad322016-07-22 15:55:13 -0700185 *fence = new Fence();
186 result = reply.read(**fence);
187 if (result != NO_ERROR) {
188 fence->clear();
189 return result;
Jesse Hallf7857542012-06-14 15:26:33 -0700190 }
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600191 if (outBufferAge) {
192 result = reply.readUint64(outBufferAge);
193 } else {
194 // Read the value even if outBufferAge is nullptr:
195 uint64_t bufferAge;
196 result = reply.readUint64(&bufferAge);
197 }
198 if (result != NO_ERROR) {
199 ALOGE("IGBP::dequeueBuffer failed to read buffer age: %d", result);
200 return result;
201 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700202 if (getFrameTimestamps) {
203 result = reply.read(*outTimestamps);
204 if (result != NO_ERROR) {
205 ALOGE("IGBP::dequeueBuffer failed to read timestamps: %d",
206 result);
207 return result;
208 }
209 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700210 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800211 return result;
212 }
213
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700214 virtual status_t dequeueBuffers(
215 const std::vector<DequeueBufferInput>& inputs,
216 std::vector<DequeueBufferOutput>* outputs) {
217 Parcel data, reply;
218 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
219 data.writeVectorSize(inputs);
220 for (const auto& input : inputs) {
221 data.write(input);
222 }
223 status_t result = remote()->transact(DEQUEUE_BUFFERS, data, &reply);
224 if (result != NO_ERROR) {
225 return result;
226 }
227 result = reply.resizeOutVector(outputs);
228 for (auto& output : *outputs) {
229 if (result != NO_ERROR) {
230 return result;
231 }
232 result = reply.read(output);
233 }
234 return result;
235 }
236
Dan Stoza9f3053d2014-03-06 15:14:33 -0800237 virtual status_t detachBuffer(int slot) {
238 Parcel data, reply;
239 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
240 data.writeInt32(slot);
241 status_t result = remote()->transact(DETACH_BUFFER, data, &reply);
242 if (result != NO_ERROR) {
243 return result;
244 }
245 result = reply.readInt32();
246 return result;
247 }
248
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700249 virtual status_t detachBuffers(const std::vector<int32_t>& slots,
250 std::vector<status_t>* results) {
251 Parcel data, reply;
252 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
253 data.writeInt32Vector(slots);
254 status_t result = remote()->transact(DETACH_BUFFERS, data, &reply);
255 if (result != NO_ERROR) {
256 return result;
257 }
258 result = reply.readInt32Vector(results);
259 return result;
260 }
261
Dan Stozad9822a32014-03-28 15:25:31 -0700262 virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer,
263 sp<Fence>* outFence) {
Yi Kong48a619f2018-06-05 16:34:59 -0700264 if (outBuffer == nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -0700265 ALOGE("detachNextBuffer: outBuffer must not be NULL");
266 return BAD_VALUE;
Yi Kong48a619f2018-06-05 16:34:59 -0700267 } else if (outFence == nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -0700268 ALOGE("detachNextBuffer: outFence must not be NULL");
269 return BAD_VALUE;
270 }
271 Parcel data, reply;
272 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
273 status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply);
274 if (result != NO_ERROR) {
275 return result;
276 }
277 result = reply.readInt32();
278 if (result == NO_ERROR) {
279 bool nonNull = reply.readInt32();
280 if (nonNull) {
281 *outBuffer = new GraphicBuffer;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700282 result = reply.read(**outBuffer);
283 if (result != NO_ERROR) {
284 outBuffer->clear();
285 return result;
286 }
Dan Stozad9822a32014-03-28 15:25:31 -0700287 }
288 nonNull = reply.readInt32();
289 if (nonNull) {
290 *outFence = new Fence;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700291 result = reply.read(**outFence);
292 if (result != NO_ERROR) {
293 outBuffer->clear();
294 outFence->clear();
295 return result;
296 }
Dan Stozad9822a32014-03-28 15:25:31 -0700297 }
298 }
299 return result;
300 }
301
Dan Stoza9f3053d2014-03-06 15:14:33 -0800302 virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) {
303 Parcel data, reply;
304 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
305 data.write(*buffer.get());
306 status_t result = remote()->transact(ATTACH_BUFFER, data, &reply);
307 if (result != NO_ERROR) {
308 return result;
309 }
Chia-I Wuc79a2962017-05-15 10:32:27 -0700310
Dan Stoza9f3053d2014-03-06 15:14:33 -0800311 *slot = reply.readInt32();
312 result = reply.readInt32();
Chia-I Wuc79a2962017-05-15 10:32:27 -0700313 if (result == NO_ERROR &&
314 (*slot < 0 || *slot >= BufferQueueDefs::NUM_BUFFER_SLOTS)) {
315 ALOGE("attachBuffer returned invalid slot %d", *slot);
316 android_errorWriteLog(0x534e4554, "37478824");
317 return UNKNOWN_ERROR;
318 }
319
Dan Stoza9f3053d2014-03-06 15:14:33 -0800320 return result;
321 }
322
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700323 virtual status_t attachBuffers(
324 const std::vector<sp<GraphicBuffer>>& buffers,
325 std::vector<AttachBufferOutput>* outputs) {
326 Parcel data, reply;
327 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
328 data.writeVectorSize(buffers);
329 for (const sp<GraphicBuffer>& buffer : buffers) {
330 data.write(*buffer.get());
331 }
332 status_t result = remote()->transact(ATTACH_BUFFERS, data, &reply);
333 if (result != NO_ERROR) {
334 return result;
335 }
336 result = reply.resizeOutVector(outputs);
337 for (AttachBufferOutput& output : *outputs) {
338 if (result != NO_ERROR) {
339 return result;
340 }
341 result = reply.read(output);
342 }
343 if (result == NO_ERROR) {
344 for (AttachBufferOutput& output : *outputs) {
345 if (output.result == NO_ERROR && output.slot < 0) {
346 ALOGE("attachBuffers returned invalid slot %d",
347 output.slot);
348 android_errorWriteLog(0x534e4554, "37478824");
349 output.result = UNKNOWN_ERROR;
350 }
351 }
352 }
353 return result;
354 }
355
Mathias Agopianf0bc2f12012-04-09 16:14:01 -0700356 virtual status_t queueBuffer(int buf,
357 const QueueBufferInput& input, QueueBufferOutput* output) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800358 Parcel data, reply;
Brian Andersonbaaad322016-07-22 15:55:13 -0700359
Andy McFadden2adaf042012-12-18 09:49:45 -0800360 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800361 data.writeInt32(buf);
Jesse Hallc777b0b2012-06-28 12:52:05 -0700362 data.write(input);
Brian Andersonbaaad322016-07-22 15:55:13 -0700363
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700364 status_t result = remote()->transact(QUEUE_BUFFER, data, &reply);
365 if (result != NO_ERROR) {
366 return result;
367 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700368
369 result = reply.read(*output);
370 if (result != NO_ERROR) {
371 return result;
372 }
373
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700374 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800375 return result;
376 }
377
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700378 virtual status_t queueBuffers(const std::vector<QueueBufferInput>& inputs,
379 std::vector<QueueBufferOutput>* outputs) {
380 Parcel data, reply;
381 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
382 data.writeVectorSize(inputs);
383 for (const QueueBufferInput& input : inputs) {
384 data.write(input);
385 }
386 status_t result = remote()->transact(QUEUE_BUFFERS, data, &reply);
387 if (result != NO_ERROR) {
388 return result;
389 }
390 result = reply.resizeOutVector(outputs);
391 for (QueueBufferOutput& output : *outputs) {
392 if (result != NO_ERROR) {
393 return result;
394 }
395 result = reply.read(output);
396 }
397 return result;
398 }
399
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700400 virtual status_t cancelBuffer(int buf, const sp<Fence>& fence) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800401 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800402 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800403 data.writeInt32(buf);
Jamie Gennis1df8c342012-12-20 14:05:45 -0800404 data.write(*fence.get());
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700405 status_t result = remote()->transact(CANCEL_BUFFER, data, &reply);
406 if (result != NO_ERROR) {
407 return result;
408 }
409 result = reply.readInt32();
410 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800411 }
412
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700413 virtual status_t cancelBuffers(
414 const std::vector<CancelBufferInput>& inputs,
415 std::vector<status_t>* results) {
416 Parcel data, reply;
417 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
418 data.writeVectorSize(inputs);
419 for (const CancelBufferInput& input : inputs) {
420 data.write(input);
421 }
422 status_t result = remote()->transact(CANCEL_BUFFERS, data, &reply);
423 if (result != NO_ERROR) {
424 return result;
425 }
426 result = reply.readInt32Vector(results);
427 return result;
428 }
429
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700430 virtual int query(int what, int* value) {
431 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800432 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700433 data.writeInt32(what);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700434 status_t result = remote()->transact(QUERY, data, &reply);
435 if (result != NO_ERROR) {
436 return result;
437 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700438 value[0] = reply.readInt32();
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700439 result = reply.readInt32();
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700440 return result;
441 }
442
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700443 virtual status_t query(const std::vector<int32_t> inputs,
444 std::vector<QueryOutput>* outputs) {
445 Parcel data, reply;
446 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
447 data.writeInt32Vector(inputs);
448 status_t result = remote()->transact(QUERY_MULTIPLE, data, &reply);
449 if (result != NO_ERROR) {
450 return result;
451 }
452 result = reply.resizeOutVector(outputs);
453 for (QueryOutput& output : *outputs) {
454 if (result != NO_ERROR) {
455 return result;
456 }
457 result = reply.read(output);
458 }
459 return result;
460 }
461
Dan Stozaf0eaf252014-03-21 13:05:51 -0700462 virtual status_t connect(const sp<IProducerListener>& listener,
Mathias Agopian365857d2013-09-11 19:35:45 -0700463 int api, bool producerControlledByApp, QueueBufferOutput* output) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700464 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800465 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Yi Kong48a619f2018-06-05 16:34:59 -0700466 if (listener != nullptr) {
Dan Stozaf0eaf252014-03-21 13:05:51 -0700467 data.writeInt32(1);
Marco Nelissen097ca272014-11-14 08:01:01 -0800468 data.writeStrongBinder(IInterface::asBinder(listener));
Dan Stozaf0eaf252014-03-21 13:05:51 -0700469 } else {
470 data.writeInt32(0);
471 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700472 data.writeInt32(api);
Mathias Agopian595264f2013-07-16 22:56:09 -0700473 data.writeInt32(producerControlledByApp);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700474 status_t result = remote()->transact(CONNECT, data, &reply);
475 if (result != NO_ERROR) {
476 return result;
477 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700478 reply.read(*output);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700479 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700480 return result;
481 }
Mathias Agopian80727112011-05-02 19:51:12 -0700482
Robert Carr97b9c862016-09-08 13:54:35 -0700483 virtual status_t disconnect(int api, DisconnectMode mode) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700484 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800485 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700486 data.writeInt32(api);
Robert Carr97b9c862016-09-08 13:54:35 -0700487 data.writeInt32(static_cast<int32_t>(mode));
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700488 status_t result =remote()->transact(DISCONNECT, data, &reply);
489 if (result != NO_ERROR) {
490 return result;
491 }
492 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700493 return result;
494 }
Jesse Hall399184a2014-03-03 15:42:54 -0800495
496 virtual status_t setSidebandStream(const sp<NativeHandle>& stream) {
497 Parcel data, reply;
498 status_t result;
499 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
500 if (stream.get()) {
501 data.writeInt32(true);
502 data.writeNativeHandle(stream->handle());
503 } else {
504 data.writeInt32(false);
505 }
506 if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) {
507 result = reply.readInt32();
508 }
509 return result;
510 }
Dan Stoza29a3e902014-06-20 13:13:57 -0700511
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700512 virtual void allocateBuffers(uint32_t width, uint32_t height,
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700513 PixelFormat format, uint64_t usage) {
Dan Stoza29a3e902014-06-20 13:13:57 -0700514 Parcel data, reply;
515 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800516 data.writeUint32(width);
517 data.writeUint32(height);
Dan Stoza29a3e902014-06-20 13:13:57 -0700518 data.writeInt32(static_cast<int32_t>(format));
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700519 data.writeUint64(usage);
Steven Moreland366eb422019-04-01 19:22:32 -0700520 status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply, IBinder::FLAG_ONEWAY);
Dan Stoza29a3e902014-06-20 13:13:57 -0700521 if (result != NO_ERROR) {
522 ALOGE("allocateBuffers failed to transact: %d", result);
523 }
524 }
Dan Stoza9de72932015-04-16 17:28:43 -0700525
526 virtual status_t allowAllocation(bool allow) {
527 Parcel data, reply;
528 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
529 data.writeInt32(static_cast<int32_t>(allow));
530 status_t result = remote()->transact(ALLOW_ALLOCATION, data, &reply);
531 if (result != NO_ERROR) {
532 return result;
533 }
534 result = reply.readInt32();
535 return result;
536 }
Dan Stoza812ed062015-06-02 15:45:22 -0700537
538 virtual status_t setGenerationNumber(uint32_t generationNumber) {
539 Parcel data, reply;
540 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
541 data.writeUint32(generationNumber);
542 status_t result = remote()->transact(SET_GENERATION_NUMBER, data, &reply);
543 if (result == NO_ERROR) {
544 result = reply.readInt32();
545 }
546 return result;
547 }
Dan Stozac6f30bd2015-06-08 09:32:50 -0700548
549 virtual String8 getConsumerName() const {
550 Parcel data, reply;
551 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
552 status_t result = remote()->transact(GET_CONSUMER_NAME, data, &reply);
553 if (result != NO_ERROR) {
554 ALOGE("getConsumerName failed to transact: %d", result);
555 return String8("TransactFailed");
556 }
557 return reply.readString8();
558 }
Dan Stoza7dde5992015-05-22 09:51:44 -0700559
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700560 virtual status_t setSharedBufferMode(bool sharedBufferMode) {
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700561 Parcel data, reply;
562 data.writeInterfaceToken(
563 IGraphicBufferProducer::getInterfaceDescriptor());
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700564 data.writeInt32(sharedBufferMode);
565 status_t result = remote()->transact(SET_SHARED_BUFFER_MODE, data,
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700566 &reply);
567 if (result == NO_ERROR) {
568 result = reply.readInt32();
569 }
570 return result;
571 }
Dan Stoza127fc632015-06-30 13:43:32 -0700572
Pablo Ceballosff95aab2016-01-13 17:09:58 -0800573 virtual status_t setAutoRefresh(bool autoRefresh) {
574 Parcel data, reply;
575 data.writeInterfaceToken(
576 IGraphicBufferProducer::getInterfaceDescriptor());
577 data.writeInt32(autoRefresh);
578 status_t result = remote()->transact(SET_AUTO_REFRESH, data, &reply);
579 if (result == NO_ERROR) {
580 result = reply.readInt32();
581 }
582 return result;
583 }
584
Dan Stoza127fc632015-06-30 13:43:32 -0700585 virtual status_t setDequeueTimeout(nsecs_t timeout) {
586 Parcel data, reply;
587 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
588 data.writeInt64(timeout);
589 status_t result = remote()->transact(SET_DEQUEUE_TIMEOUT, data, &reply);
590 if (result != NO_ERROR) {
591 ALOGE("setDequeueTimeout failed to transact: %d", result);
592 return result;
593 }
594 return reply.readInt32();
595 }
Dan Stoza50101d02016-04-07 16:53:23 -0700596
Sungtak Lee3249fb62019-03-02 16:40:47 -0800597 virtual status_t setLegacyBufferDrop(bool drop) {
598 Parcel data, reply;
599 data.writeInterfaceToken(
600 IGraphicBufferProducer::getInterfaceDescriptor());
601 data.writeInt32(drop);
602 status_t result = remote()->transact(SET_LEGACY_BUFFER_DROP,
603 data, &reply);
604 if (result != NO_ERROR) {
605 return result;
606 }
607 result = reply.readInt32();
608 return result;
609 }
610
Dan Stoza50101d02016-04-07 16:53:23 -0700611 virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer,
John Reck1a61da52016-04-28 13:18:15 -0700612 sp<Fence>* outFence, float outTransformMatrix[16]) override {
Dan Stoza50101d02016-04-07 16:53:23 -0700613 Parcel data, reply;
614 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
615 status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER, data,
616 &reply);
617 if (result != NO_ERROR) {
618 ALOGE("getLastQueuedBuffer failed to transact: %d", result);
619 return result;
620 }
621 result = reply.readInt32();
622 if (result != NO_ERROR) {
623 return result;
624 }
John Reckce8e5df2016-04-28 10:12:47 -0700625 bool hasBuffer = reply.readBool();
626 sp<GraphicBuffer> buffer;
627 if (hasBuffer) {
628 buffer = new GraphicBuffer();
629 result = reply.read(*buffer);
John Reck1a61da52016-04-28 13:18:15 -0700630 if (result == NO_ERROR) {
631 result = reply.read(outTransformMatrix, sizeof(float) * 16);
632 }
John Reckce8e5df2016-04-28 10:12:47 -0700633 }
Dan Stoza50101d02016-04-07 16:53:23 -0700634 if (result != NO_ERROR) {
635 ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
636 return result;
637 }
638 sp<Fence> fence(new Fence);
639 result = reply.read(*fence);
640 if (result != NO_ERROR) {
641 ALOGE("getLastQueuedBuffer failed to read fence: %d", result);
642 return result;
643 }
644 *outBuffer = buffer;
645 *outFence = fence;
646 return result;
647 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800648
Brian Anderson3890c392016-07-25 12:48:08 -0700649 virtual void getFrameTimestamps(FrameEventHistoryDelta* outDelta) {
Pablo Ceballosce796e72016-02-04 19:10:51 -0800650 Parcel data, reply;
651 status_t result = data.writeInterfaceToken(
652 IGraphicBufferProducer::getInterfaceDescriptor());
653 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700654 ALOGE("IGBP::getFrameTimestamps failed to write token: %d", result);
655 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800656 }
657 result = remote()->transact(GET_FRAME_TIMESTAMPS, data, &reply);
658 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700659 ALOGE("IGBP::getFrameTimestamps failed to transact: %d", result);
660 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800661 }
Brian Anderson3890c392016-07-25 12:48:08 -0700662 result = reply.read(*outDelta);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800663 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700664 ALOGE("IGBP::getFrameTimestamps failed to read timestamps: %d",
665 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800666 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800667 }
Pablo Ceballos6155b402016-06-30 17:01:49 -0700668
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -0700669 virtual status_t getUniqueId(uint64_t* outId) const {
670 Parcel data, reply;
671 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
672 status_t result = remote()->transact(GET_UNIQUE_ID, data, &reply);
673 if (result != NO_ERROR) {
674 ALOGE("getUniqueId failed to transact: %d", result);
675 }
676 status_t actualResult = NO_ERROR;
677 result = reply.readInt32(&actualResult);
678 if (result != NO_ERROR) {
679 return result;
680 }
681 result = reply.readUint64(outId);
682 if (result != NO_ERROR) {
683 return result;
684 }
685 return actualResult;
686 }
Chia-I Wue2786ea2017-08-07 10:36:08 -0700687
688 virtual status_t getConsumerUsage(uint64_t* outUsage) const {
689 Parcel data, reply;
690 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
691 status_t result = remote()->transact(GET_CONSUMER_USAGE, data, &reply);
692 if (result != NO_ERROR) {
693 ALOGE("getConsumerUsage failed to transact: %d", result);
694 }
695 status_t actualResult = NO_ERROR;
696 result = reply.readInt32(&actualResult);
697 if (result != NO_ERROR) {
698 return result;
699 }
700 result = reply.readUint64(outUsage);
701 if (result != NO_ERROR) {
702 return result;
703 }
704 return actualResult;
705 }
Yiwei Zhang538cedc2019-06-24 19:35:03 -0700706
707 virtual status_t setAutoPrerotation(bool autoPrerotation) {
708 Parcel data, reply;
709 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
710 data.writeBool(autoPrerotation);
711 status_t result = remote()->transact(SET_AUTO_PREROTATION, data, &reply);
712 if (result == NO_ERROR) {
713 result = reply.readInt32();
714 }
715 return result;
716 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800717};
718
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800719// Out-of-line virtual method definition to trigger vtable emission in this
720// translation unit (see clang warning -Wweak-vtables)
721BpGraphicBufferProducer::~BpGraphicBufferProducer() {}
722
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800723class HpGraphicBufferProducer : public HpInterface<
Pawin Vongmasae672cd02019-02-14 16:01:29 -0800724 BpGraphicBufferProducer,
725 H2BGraphicBufferProducerV1_0,
726 H2BGraphicBufferProducerV2_0> {
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800727public:
Chih-Hung Hsiehaaf62162018-12-20 15:45:04 -0800728 explicit HpGraphicBufferProducer(const sp<IBinder>& base) : PBase(base) {}
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800729
730 status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) override {
731 return mBase->requestBuffer(slot, buf);
732 }
733
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700734 status_t requestBuffers(
735 const std::vector<int32_t>& slots,
736 std::vector<RequestBufferOutput>* outputs) override {
737 return mBase->requestBuffers(slots, outputs);
738 }
739
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800740 status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) override {
741 return mBase->setMaxDequeuedBufferCount(maxDequeuedBuffers);
742 }
743
744 status_t setAsyncMode(bool async) override {
745 return mBase->setAsyncMode(async);
746 }
747
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600748 status_t dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w, uint32_t h, PixelFormat format,
749 uint64_t usage, uint64_t* outBufferAge,
750 FrameEventHistoryDelta* outTimestamps) override {
751 return mBase->dequeueBuffer(slot, fence, w, h, format, usage, outBufferAge, outTimestamps);
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800752 }
753
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700754 status_t dequeueBuffers(
755 const std::vector<DequeueBufferInput>& inputs,
756 std::vector<DequeueBufferOutput>* outputs) override {
757 return mBase->dequeueBuffers(inputs, outputs);
758 }
759
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800760 status_t detachBuffer(int slot) override {
761 return mBase->detachBuffer(slot);
762 }
763
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700764 status_t detachBuffers(const std::vector<int32_t>& slots,
765 std::vector<status_t>* results) override {
766 return mBase->detachBuffers(slots, results);
767 }
768
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800769 status_t detachNextBuffer(
770 sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) override {
771 return mBase->detachNextBuffer(outBuffer, outFence);
772 }
773
774 status_t attachBuffer(
775 int* outSlot, const sp<GraphicBuffer>& buffer) override {
776 return mBase->attachBuffer(outSlot, buffer);
777 }
778
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700779 status_t attachBuffers(
780 const std::vector<sp<GraphicBuffer>>& buffers,
781 std::vector<AttachBufferOutput>* outputs) override {
782 return mBase->attachBuffers(buffers, outputs);
783 }
784
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800785 status_t queueBuffer(
786 int slot,
787 const QueueBufferInput& input,
788 QueueBufferOutput* output) override {
789 return mBase->queueBuffer(slot, input, output);
790 }
791
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700792 status_t queueBuffers(const std::vector<QueueBufferInput>& inputs,
793 std::vector<QueueBufferOutput>* outputs) override {
794 return mBase->queueBuffers(inputs, outputs);
795 }
796
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800797 status_t cancelBuffer(int slot, const sp<Fence>& fence) override {
798 return mBase->cancelBuffer(slot, fence);
799 }
800
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700801 status_t cancelBuffers(
802 const std::vector<CancelBufferInput>& inputs,
803 std::vector<status_t>* results) override {
804 return mBase->cancelBuffers(inputs, results);
805 }
806
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800807 int query(int what, int* value) override {
808 return mBase->query(what, value);
809 }
810
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700811 status_t query(const std::vector<int32_t> inputs,
812 std::vector<QueryOutput>* outputs) override {
813 return mBase->query(inputs, outputs);
814 }
815
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800816 status_t connect(
817 const sp<IProducerListener>& listener,
818 int api, bool producerControlledByApp,
819 QueueBufferOutput* output) override {
820 return mBase->connect(listener, api, producerControlledByApp, output);
821 }
822
823 status_t disconnect(
824 int api, DisconnectMode mode = DisconnectMode::Api) override {
825 return mBase->disconnect(api, mode);
826 }
827
828 status_t setSidebandStream(const sp<NativeHandle>& stream) override {
829 return mBase->setSidebandStream(stream);
830 }
831
832 void allocateBuffers(uint32_t width, uint32_t height,
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700833 PixelFormat format, uint64_t usage) override {
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800834 return mBase->allocateBuffers(width, height, format, usage);
835 }
836
837 status_t allowAllocation(bool allow) override {
838 return mBase->allowAllocation(allow);
839 }
840
841 status_t setGenerationNumber(uint32_t generationNumber) override {
842 return mBase->setGenerationNumber(generationNumber);
843 }
844
845 String8 getConsumerName() const override {
846 return mBase->getConsumerName();
847 }
848
849 status_t setSharedBufferMode(bool sharedBufferMode) override {
850 return mBase->setSharedBufferMode(sharedBufferMode);
851 }
852
853 status_t setAutoRefresh(bool autoRefresh) override {
854 return mBase->setAutoRefresh(autoRefresh);
855 }
856
857 status_t setDequeueTimeout(nsecs_t timeout) override {
858 return mBase->setDequeueTimeout(timeout);
859 }
860
Sungtak Lee3249fb62019-03-02 16:40:47 -0800861 status_t setLegacyBufferDrop(bool drop) override {
862 return mBase->setLegacyBufferDrop(drop);
863 }
864
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800865 status_t getLastQueuedBuffer(
866 sp<GraphicBuffer>* outBuffer,
867 sp<Fence>* outFence,
868 float outTransformMatrix[16]) override {
869 return mBase->getLastQueuedBuffer(
870 outBuffer, outFence, outTransformMatrix);
871 }
872
873 void getFrameTimestamps(FrameEventHistoryDelta* outDelta) override {
874 return mBase->getFrameTimestamps(outDelta);
875 }
876
877 status_t getUniqueId(uint64_t* outId) const override {
878 return mBase->getUniqueId(outId);
879 }
Chia-I Wue2786ea2017-08-07 10:36:08 -0700880
881 status_t getConsumerUsage(uint64_t* outUsage) const override {
882 return mBase->getConsumerUsage(outUsage);
883 }
Yiwei Zhang538cedc2019-06-24 19:35:03 -0700884
885 status_t setAutoPrerotation(bool autoPrerotation) override {
886 return mBase->setAutoPrerotation(autoPrerotation);
887 }
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800888};
889
Pawin Vongmasa338b81d2019-01-31 05:20:07 -0800890IMPLEMENT_HYBRID_META_INTERFACE(GraphicBufferProducer,
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800891 "android.gui.IGraphicBufferProducer");
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800892
893// ----------------------------------------------------------------------
894
Sungtak Lee3249fb62019-03-02 16:40:47 -0800895status_t IGraphicBufferProducer::setLegacyBufferDrop(bool drop) {
896 // No-op for IGBP other than BufferQueue.
897 (void) drop;
898 return INVALID_OPERATION;
899}
900
Yiwei Zhang538cedc2019-06-24 19:35:03 -0700901status_t IGraphicBufferProducer::setAutoPrerotation(bool autoPrerotation) {
902 // No-op for IGBP other than BufferQueue.
903 (void)autoPrerotation;
904 return INVALID_OPERATION;
905}
906
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -0800907status_t IGraphicBufferProducer::exportToParcel(Parcel* parcel) {
908 status_t res = OK;
909 res = parcel->writeUint32(USE_BUFFER_QUEUE);
910 if (res != NO_ERROR) {
911 ALOGE("exportToParcel: Cannot write magic, res=%d.", res);
912 return res;
913 }
914
915 return parcel->writeStrongBinder(IInterface::asBinder(this));
916}
917
918/* static */
919status_t IGraphicBufferProducer::exportToParcel(const sp<IGraphicBufferProducer>& producer,
920 Parcel* parcel) {
921 if (parcel == nullptr) {
922 ALOGE("exportToParcel: Invalid parcel object.");
923 return BAD_VALUE;
924 }
925
926 if (producer == nullptr) {
927 status_t res = OK;
928 res = parcel->writeUint32(IGraphicBufferProducer::USE_BUFFER_QUEUE);
929 if (res != NO_ERROR) return res;
930 return parcel->writeStrongBinder(nullptr);
931 } else {
932 return producer->exportToParcel(parcel);
933 }
934}
935
936/* static */
937sp<IGraphicBufferProducer> IGraphicBufferProducer::createFromParcel(const Parcel* parcel) {
938 uint32_t outMagic = 0;
939 status_t res = NO_ERROR;
940
941 res = parcel->readUint32(&outMagic);
942 if (res != NO_ERROR) {
943 ALOGE("createFromParcel: Failed to read magic, error=%d.", res);
944 return nullptr;
945 }
946
947 switch (outMagic) {
948 case USE_BUFFER_QUEUE: {
949 sp<IBinder> binder;
950 res = parcel->readNullableStrongBinder(&binder);
951 if (res != NO_ERROR) {
952 ALOGE("createFromParcel: Can't read strong binder.");
953 return nullptr;
954 }
955 return interface_cast<IGraphicBufferProducer>(binder);
956 }
957 case USE_BUFFER_HUB: {
958 ALOGE("createFromParcel: BufferHub not implemented.");
Jiyong Parka75d3d62018-04-09 12:16:30 +0900959#ifndef NO_BUFFERHUB
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -0800960 dvr::ProducerQueueParcelable producerParcelable;
961 res = producerParcelable.readFromParcel(parcel);
962 if (res != NO_ERROR) {
963 ALOGE("createFromParcel: Failed to read from parcel, error=%d", res);
964 return nullptr;
965 }
966 return BufferHubProducer::Create(std::move(producerParcelable));
Jiyong Parka75d3d62018-04-09 12:16:30 +0900967#else
968 return nullptr;
969#endif
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -0800970 }
971 default: {
972 ALOGE("createFromParcel: Unexpected mgaic: 0x%x.", outMagic);
973 return nullptr;
974 }
975 }
976}
977
978// ----------------------------------------------------------------------------
979
Andy McFadden2adaf042012-12-18 09:49:45 -0800980status_t BnGraphicBufferProducer::onTransact(
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800981 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
982{
983 switch(code) {
984 case REQUEST_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800985 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700986 int bufferIdx = data.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700987 sp<GraphicBuffer> buffer;
988 int result = requestBuffer(bufferIdx, &buffer);
Yi Kong48a619f2018-06-05 16:34:59 -0700989 reply->writeInt32(buffer != nullptr);
990 if (buffer != nullptr) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800991 reply->write(*buffer);
992 }
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700993 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800994 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800995 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +0700996 case REQUEST_BUFFERS: {
997 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
998 std::vector<int32_t> slots;
999 std::vector<RequestBufferOutput> outputs;
1000 status_t result = data.readInt32Vector(&slots);
1001 if (result != NO_ERROR) {
1002 return result;
1003 }
1004 (void)requestBuffers(slots, &outputs);
1005 result = reply->writeVectorSize(outputs);
1006 for (const RequestBufferOutput& output : outputs) {
1007 if (result != NO_ERROR) {
1008 return result;
1009 }
1010 result = reply->write(output);
1011 }
1012 return result;
1013 }
Pablo Ceballosfa455352015-08-12 17:47:47 -07001014 case SET_MAX_DEQUEUED_BUFFER_COUNT: {
1015 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1016 int maxDequeuedBuffers = data.readInt32();
1017 int result = setMaxDequeuedBufferCount(maxDequeuedBuffers);
1018 reply->writeInt32(result);
1019 return NO_ERROR;
1020 }
1021 case SET_ASYNC_MODE: {
1022 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1023 bool async = data.readInt32();
1024 int result = setAsyncMode(async);
1025 reply->writeInt32(result);
1026 return NO_ERROR;
1027 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001028 case DEQUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001029 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001030 uint32_t width = data.readUint32();
1031 uint32_t height = data.readUint32();
1032 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
Mathias Agopiancb496ac2017-05-22 14:21:00 -07001033 uint64_t usage = data.readUint64();
Ian Elliotta2eb34c2017-07-18 11:05:49 -06001034 uint64_t bufferAge = 0;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001035 bool getTimestamps = data.readBool();
Brian Andersonbaaad322016-07-22 15:55:13 -07001036
Naveen Leekha12ba0f52015-09-21 17:28:04 -07001037 int buf = 0;
Brian Andersonbaaad322016-07-22 15:55:13 -07001038 sp<Fence> fence = Fence::NO_FENCE;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001039 FrameEventHistoryDelta frameTimestamps;
Ian Elliotta2eb34c2017-07-18 11:05:49 -06001040 int result = dequeueBuffer(&buf, &fence, width, height, format, usage, &bufferAge,
1041 getTimestamps ? &frameTimestamps : nullptr);
Brian Andersonbaaad322016-07-22 15:55:13 -07001042
Tobin Ehlis209e5fb2019-03-26 14:06:29 -06001043 if (fence == nullptr) {
1044 ALOGE("dequeueBuffer returned a NULL fence, setting to Fence::NO_FENCE");
1045 fence = Fence::NO_FENCE;
1046 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001047 reply->writeInt32(buf);
Brian Andersonbaaad322016-07-22 15:55:13 -07001048 reply->write(*fence);
Ian Elliotta2eb34c2017-07-18 11:05:49 -06001049 reply->writeUint64(bufferAge);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001050 if (getTimestamps) {
1051 reply->write(frameTimestamps);
1052 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001053 reply->writeInt32(result);
1054 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001055 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001056 case DEQUEUE_BUFFERS: {
1057 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1058 std::vector<DequeueBufferInput> inputs;
1059 std::vector<DequeueBufferOutput> outputs;
1060 status_t result = data.resizeOutVector(&inputs);
1061 if (result != NO_ERROR) {
1062 return result;
1063 }
1064 for (DequeueBufferInput& input : inputs) {
1065 result = data.read(input);
1066 if (result != NO_ERROR) {
1067 return result;
1068 }
1069 }
1070 (void)dequeueBuffers(inputs, &outputs);
1071 result = reply->writeVectorSize(outputs);
1072 for (const DequeueBufferOutput& output : outputs) {
1073 if (result != NO_ERROR) {
1074 return result;
1075 }
1076 result = reply->write(output);
1077 }
1078 return result;
1079 }
Dan Stoza9f3053d2014-03-06 15:14:33 -08001080 case DETACH_BUFFER: {
1081 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1082 int slot = data.readInt32();
1083 int result = detachBuffer(slot);
1084 reply->writeInt32(result);
1085 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001086 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001087 case DETACH_BUFFERS: {
1088 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1089 std::vector<int32_t> slots;
1090 std::vector<status_t> results;
1091 status_t result = data.readInt32Vector(&slots);
1092 if (result != NO_ERROR) {
1093 return result;
1094 }
1095 (void)detachBuffers(slots, &results);
1096 return reply->writeInt32Vector(results);
1097 }
Dan Stozad9822a32014-03-28 15:25:31 -07001098 case DETACH_NEXT_BUFFER: {
1099 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1100 sp<GraphicBuffer> buffer;
1101 sp<Fence> fence;
1102 int32_t result = detachNextBuffer(&buffer, &fence);
1103 reply->writeInt32(result);
1104 if (result == NO_ERROR) {
Yi Kong48a619f2018-06-05 16:34:59 -07001105 reply->writeInt32(buffer != nullptr);
1106 if (buffer != nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -07001107 reply->write(*buffer);
1108 }
Yi Kong48a619f2018-06-05 16:34:59 -07001109 reply->writeInt32(fence != nullptr);
1110 if (fence != nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -07001111 reply->write(*fence);
1112 }
1113 }
1114 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001115 }
Dan Stoza9f3053d2014-03-06 15:14:33 -08001116 case ATTACH_BUFFER: {
1117 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1118 sp<GraphicBuffer> buffer = new GraphicBuffer();
Pablo Ceballos70636b32016-07-06 15:24:54 -07001119 status_t result = data.read(*buffer.get());
Naveen Leekha12ba0f52015-09-21 17:28:04 -07001120 int slot = 0;
Pablo Ceballos70636b32016-07-06 15:24:54 -07001121 if (result == NO_ERROR) {
1122 result = attachBuffer(&slot, buffer);
1123 }
Dan Stoza9f3053d2014-03-06 15:14:33 -08001124 reply->writeInt32(slot);
1125 reply->writeInt32(result);
1126 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001127 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001128 case ATTACH_BUFFERS: {
1129 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1130 std::vector<sp<GraphicBuffer>> buffers;
1131 status_t result = data.resizeOutVector(&buffers);
1132 if (result != NO_ERROR) {
1133 return result;
1134 }
1135 for (sp<GraphicBuffer>& buffer : buffers) {
1136 buffer = new GraphicBuffer();
1137 result = data.read(*buffer.get());
1138 if (result != NO_ERROR) {
1139 return result;
1140 }
1141 }
1142 std::vector<AttachBufferOutput> outputs;
1143 (void)attachBuffers(buffers, &outputs);
1144 result = reply->writeVectorSize(outputs);
1145 for (const AttachBufferOutput& output : outputs) {
1146 if (result != NO_ERROR) {
1147 return result;
1148 }
1149 result = reply->write(output);
1150 }
1151 return result;
1152 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001153 case QUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001154 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001155
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001156 int buf = data.readInt32();
Jesse Hallc777b0b2012-06-28 12:52:05 -07001157 QueueBufferInput input(data);
Brian Andersonbaaad322016-07-22 15:55:13 -07001158 QueueBufferOutput output;
1159 status_t result = queueBuffer(buf, input, &output);
Brian Andersonbaaad322016-07-22 15:55:13 -07001160 reply->write(output);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001161 reply->writeInt32(result);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001162
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001163 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001164 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001165 case QUEUE_BUFFERS: {
1166 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1167 std::vector<QueueBufferInput> inputs;
1168 status_t result = data.resizeOutVector(&inputs);
1169 if (result != NO_ERROR) {
1170 return result;
1171 }
1172 for (QueueBufferInput& input : inputs) {
1173 result = data.read(input);
1174 if (result != NO_ERROR) {
1175 return result;
1176 }
1177 }
1178 std::vector<QueueBufferOutput> outputs;
1179 (void)queueBuffers(inputs, &outputs);
1180 result = reply->writeVectorSize(outputs);
1181 for (const QueueBufferOutput& output : outputs) {
1182 if (result != NO_ERROR) {
1183 return result;
1184 }
1185 result = reply->write(output);
1186 }
1187 return result;
1188 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001189 case CANCEL_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001190 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001191 int buf = data.readInt32();
Jamie Gennis1df8c342012-12-20 14:05:45 -08001192 sp<Fence> fence = new Fence();
Pablo Ceballos70636b32016-07-06 15:24:54 -07001193 status_t result = data.read(*fence.get());
1194 if (result == NO_ERROR) {
1195 result = cancelBuffer(buf, fence);
1196 }
Pablo Ceballos583b1b32015-09-03 18:23:52 -07001197 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001198 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001199 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001200 case CANCEL_BUFFERS: {
1201 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1202 std::vector<CancelBufferInput> inputs;
1203 status_t result = data.resizeOutVector(&inputs);
1204 for (CancelBufferInput& input : inputs) {
1205 if (result != NO_ERROR) {
1206 return result;
1207 }
1208 result = data.read(input);
1209 }
1210 if (result != NO_ERROR) {
1211 return result;
1212 }
1213 std::vector<status_t> results;
1214 result = cancelBuffers(inputs, &results);
1215 if (result != NO_ERROR) {
1216 return result;
1217 }
1218 return reply->writeInt32Vector(results);
1219 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -07001220 case QUERY: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001221 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Naveen Leekha12ba0f52015-09-21 17:28:04 -07001222 int value = 0;
Mathias Agopianeafabcd2011-04-20 14:20:59 -07001223 int what = data.readInt32();
1224 int res = query(what, &value);
1225 reply->writeInt32(value);
1226 reply->writeInt32(res);
1227 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001228 }
Yin-Chia Yeh64ee5f52020-01-02 17:53:18 +07001229 case QUERY_MULTIPLE: {
1230 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1231 std::vector<int32_t> inputs;
1232 status_t result = data.readInt32Vector(&inputs);
1233 if (result != NO_ERROR) {
1234 return result;
1235 }
1236 std::vector<QueryOutput> outputs;
1237 result = query(inputs, &outputs);
1238 if (result != NO_ERROR) {
1239 return result;
1240 }
1241 result = reply->writeVectorSize(outputs);
1242 for (const QueryOutput& output : outputs) {
1243 if (result != NO_ERROR) {
1244 return result;
1245 }
1246 result = reply->write(output);
1247 }
1248 return result;
1249 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001250 case CONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001251 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stozaf0eaf252014-03-21 13:05:51 -07001252 sp<IProducerListener> listener;
1253 if (data.readInt32() == 1) {
1254 listener = IProducerListener::asInterface(data.readStrongBinder());
1255 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001256 int api = data.readInt32();
Mathias Agopian595264f2013-07-16 22:56:09 -07001257 bool producerControlledByApp = data.readInt32();
Brian Andersonbaaad322016-07-22 15:55:13 -07001258 QueueBufferOutput output;
1259 status_t res = connect(listener, api, producerControlledByApp, &output);
1260 reply->write(output);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001261 reply->writeInt32(res);
1262 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001263 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001264 case DISCONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -08001265 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001266 int api = data.readInt32();
Robert Carr97b9c862016-09-08 13:54:35 -07001267 DisconnectMode mode = static_cast<DisconnectMode>(data.readInt32());
1268 status_t res = disconnect(api, mode);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -07001269 reply->writeInt32(res);
1270 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001271 }
Jesse Hall399184a2014-03-03 15:42:54 -08001272 case SET_SIDEBAND_STREAM: {
1273 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1274 sp<NativeHandle> stream;
1275 if (data.readInt32()) {
Wonsik Kim0ec54e12014-03-21 10:46:24 +09001276 stream = NativeHandle::create(data.readNativeHandle(), true);
Jesse Hall399184a2014-03-03 15:42:54 -08001277 }
1278 status_t result = setSidebandStream(stream);
1279 reply->writeInt32(result);
1280 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001281 }
Dan Stoza9de72932015-04-16 17:28:43 -07001282 case ALLOCATE_BUFFERS: {
Dan Stoza29a3e902014-06-20 13:13:57 -07001283 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -08001284 uint32_t width = data.readUint32();
1285 uint32_t height = data.readUint32();
1286 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
Mathias Agopiancb496ac2017-05-22 14:21:00 -07001287 uint64_t usage = data.readUint64();
Pablo Ceballos567dbbb2015-08-26 18:59:08 -07001288 allocateBuffers(width, height, format, usage);
Dan Stoza29a3e902014-06-20 13:13:57 -07001289 return NO_ERROR;
Dan Stoza9de72932015-04-16 17:28:43 -07001290 }
1291 case ALLOW_ALLOCATION: {
1292 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1293 bool allow = static_cast<bool>(data.readInt32());
1294 status_t result = allowAllocation(allow);
1295 reply->writeInt32(result);
1296 return NO_ERROR;
1297 }
Dan Stoza812ed062015-06-02 15:45:22 -07001298 case SET_GENERATION_NUMBER: {
1299 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1300 uint32_t generationNumber = data.readUint32();
1301 status_t result = setGenerationNumber(generationNumber);
1302 reply->writeInt32(result);
1303 return NO_ERROR;
1304 }
Dan Stozac6f30bd2015-06-08 09:32:50 -07001305 case GET_CONSUMER_NAME: {
1306 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1307 reply->writeString8(getConsumerName());
1308 return NO_ERROR;
1309 }
Pablo Ceballos3559fbf2016-03-17 15:50:23 -07001310 case SET_SHARED_BUFFER_MODE: {
Pablo Ceballosccdfd602015-10-07 15:05:45 -07001311 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Pablo Ceballos3559fbf2016-03-17 15:50:23 -07001312 bool sharedBufferMode = data.readInt32();
1313 status_t result = setSharedBufferMode(sharedBufferMode);
Pablo Ceballosccdfd602015-10-07 15:05:45 -07001314 reply->writeInt32(result);
1315 return NO_ERROR;
1316 }
Pablo Ceballosff95aab2016-01-13 17:09:58 -08001317 case SET_AUTO_REFRESH: {
1318 CHECK_INTERFACE(IGraphicBuffer, data, reply);
1319 bool autoRefresh = data.readInt32();
1320 status_t result = setAutoRefresh(autoRefresh);
1321 reply->writeInt32(result);
1322 return NO_ERROR;
1323 }
Dan Stoza127fc632015-06-30 13:43:32 -07001324 case SET_DEQUEUE_TIMEOUT: {
1325 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1326 nsecs_t timeout = data.readInt64();
1327 status_t result = setDequeueTimeout(timeout);
1328 reply->writeInt32(result);
1329 return NO_ERROR;
1330 }
Dan Stoza50101d02016-04-07 16:53:23 -07001331 case GET_LAST_QUEUED_BUFFER: {
1332 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1333 sp<GraphicBuffer> buffer(nullptr);
1334 sp<Fence> fence(Fence::NO_FENCE);
John Reck1a61da52016-04-28 13:18:15 -07001335 float transform[16] = {};
1336 status_t result = getLastQueuedBuffer(&buffer, &fence, transform);
Dan Stoza50101d02016-04-07 16:53:23 -07001337 reply->writeInt32(result);
1338 if (result != NO_ERROR) {
1339 return result;
1340 }
John Reckce8e5df2016-04-28 10:12:47 -07001341 if (!buffer.get()) {
1342 reply->writeBool(false);
1343 } else {
1344 reply->writeBool(true);
1345 result = reply->write(*buffer);
John Reck1a61da52016-04-28 13:18:15 -07001346 if (result == NO_ERROR) {
1347 reply->write(transform, sizeof(float) * 16);
1348 }
John Reckce8e5df2016-04-28 10:12:47 -07001349 }
Dan Stoza50101d02016-04-07 16:53:23 -07001350 if (result != NO_ERROR) {
1351 ALOGE("getLastQueuedBuffer failed to write buffer: %d", result);
1352 return result;
1353 }
Tobin Ehlis209e5fb2019-03-26 14:06:29 -06001354 if (fence == nullptr) {
1355 ALOGE("getLastQueuedBuffer returned a NULL fence, setting to Fence::NO_FENCE");
1356 fence = Fence::NO_FENCE;
1357 }
Dan Stoza50101d02016-04-07 16:53:23 -07001358 result = reply->write(*fence);
1359 if (result != NO_ERROR) {
1360 ALOGE("getLastQueuedBuffer failed to write fence: %d", result);
1361 return result;
1362 }
1363 return NO_ERROR;
1364 }
Pablo Ceballosce796e72016-02-04 19:10:51 -08001365 case GET_FRAME_TIMESTAMPS: {
1366 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson3890c392016-07-25 12:48:08 -07001367 FrameEventHistoryDelta frameTimestamps;
1368 getFrameTimestamps(&frameTimestamps);
1369 status_t result = reply->write(frameTimestamps);
Pablo Ceballosce796e72016-02-04 19:10:51 -08001370 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -07001371 ALOGE("BnGBP::GET_FRAME_TIMESTAMPS failed to write buffer: %d",
1372 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -08001373 return result;
1374 }
Pablo Ceballosce796e72016-02-04 19:10:51 -08001375 return NO_ERROR;
1376 }
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -07001377 case GET_UNIQUE_ID: {
1378 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1379 uint64_t outId = 0;
1380 status_t actualResult = getUniqueId(&outId);
1381 status_t result = reply->writeInt32(actualResult);
1382 if (result != NO_ERROR) {
1383 return result;
1384 }
1385 result = reply->writeUint64(outId);
1386 if (result != NO_ERROR) {
1387 return result;
1388 }
1389 return NO_ERROR;
1390 }
Chia-I Wue2786ea2017-08-07 10:36:08 -07001391 case GET_CONSUMER_USAGE: {
1392 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1393 uint64_t outUsage = 0;
1394 status_t actualResult = getConsumerUsage(&outUsage);
1395 status_t result = reply->writeInt32(actualResult);
1396 if (result != NO_ERROR) {
1397 return result;
1398 }
1399 result = reply->writeUint64(outUsage);
1400 if (result != NO_ERROR) {
1401 return result;
1402 }
1403 return NO_ERROR;
1404 }
Sungtak Lee3249fb62019-03-02 16:40:47 -08001405 case SET_LEGACY_BUFFER_DROP: {
1406 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1407 bool drop = data.readInt32();
1408 int result = setLegacyBufferDrop(drop);
1409 reply->writeInt32(result);
1410 return NO_ERROR;
1411 }
Yiwei Zhang538cedc2019-06-24 19:35:03 -07001412 case SET_AUTO_PREROTATION: {
1413 CHECK_INTERFACE(IGraphicBuffer, data, reply);
1414 bool autoPrerotation = data.readBool();
1415 status_t result = setAutoPrerotation(autoPrerotation);
1416 reply->writeInt32(result);
1417 return NO_ERROR;
1418 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001419 }
1420 return BBinder::onTransact(code, data, reply, flags);
1421}
1422
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001423}; // namespace android