1 /*
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>
21 #include <utils/NativeHandle.h>
22 #include <utils/RefBase.h>
23 #include <utils/String8.h>
24 #include <utils/Timers.h>
25 #include <utils/Vector.h>
26
27 #include <binder/Parcel.h>
28 #include <binder/IInterface.h>
29
30 #ifndef NO_BUFFERHUB
31 #include <gui/BufferHubProducer.h>
32 #endif
33
34 #include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h>
35 #include <gui/bufferqueue/2.0/H2BGraphicBufferProducer.h>
36 #include <gui/BufferQueueDefs.h>
37 #include <gui/IGraphicBufferProducer.h>
38 #include <gui/IProducerListener.h>
39
40 namespace android {
41 // ----------------------------------------------------------------------------
42
43 using H2BGraphicBufferProducerV1_0 =
44 ::android::hardware::graphics::bufferqueue::V1_0::utils::
45 H2BGraphicBufferProducer;
46 using H2BGraphicBufferProducerV2_0 =
47 ::android::hardware::graphics::bufferqueue::V2_0::utils::
48 H2BGraphicBufferProducer;
49
50 enum {
51 REQUEST_BUFFER = IBinder::FIRST_CALL_TRANSACTION,
52 DEQUEUE_BUFFER,
53 DETACH_BUFFER,
54 DETACH_NEXT_BUFFER,
55 ATTACH_BUFFER,
56 QUEUE_BUFFER,
57 CANCEL_BUFFER,
58 QUERY,
59 CONNECT,
60 DISCONNECT,
61 SET_SIDEBAND_STREAM,
62 ALLOCATE_BUFFERS,
63 ALLOW_ALLOCATION,
64 SET_GENERATION_NUMBER,
65 GET_CONSUMER_NAME,
66 SET_MAX_DEQUEUED_BUFFER_COUNT,
67 SET_ASYNC_MODE,
68 SET_SHARED_BUFFER_MODE,
69 SET_AUTO_REFRESH,
70 SET_DEQUEUE_TIMEOUT,
71 GET_LAST_QUEUED_BUFFER,
72 GET_FRAME_TIMESTAMPS,
73 GET_UNIQUE_ID,
74 GET_CONSUMER_USAGE,
75 SET_LEGACY_BUFFER_DROP,
76 SET_AUTO_PREROTATION,
77 REQUEST_BUFFERS,
78 DEQUEUE_BUFFERS,
79 DETACH_BUFFERS,
80 ATTACH_BUFFERS,
81 QUEUE_BUFFERS,
82 CANCEL_BUFFERS,
83 QUERY_MULTIPLE,
84 GET_LAST_QUEUED_BUFFER2,
85 };
86
87 class BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer>
88 {
89 public:
BpGraphicBufferProducer(const sp<IBinder> & impl)90 explicit BpGraphicBufferProducer(const sp<IBinder>& impl)
91 : BpInterface<IGraphicBufferProducer>(impl)
92 {
93 }
94
95 ~BpGraphicBufferProducer() override;
96
requestBuffer(int bufferIdx,sp<GraphicBuffer> * buf)97 virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) {
98 Parcel data, reply;
99 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
100 data.writeInt32(bufferIdx);
101 status_t result = remote()->transact(REQUEST_BUFFER, data, &reply);
102 if (result != NO_ERROR) {
103 return result;
104 }
105 bool nonNull = reply.readInt32();
106 if (nonNull) {
107 *buf = new GraphicBuffer();
108 result = reply.read(**buf);
109 if(result != NO_ERROR) {
110 (*buf).clear();
111 return result;
112 }
113 }
114 result = reply.readInt32();
115 return result;
116 }
117
requestBuffers(const std::vector<int32_t> & slots,std::vector<RequestBufferOutput> * outputs)118 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
setMaxDequeuedBufferCount(int maxDequeuedBuffers)139 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
setAsyncMode(bool async)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
dequeueBuffer(int * buf,sp<Fence> * fence,uint32_t width,uint32_t height,PixelFormat format,uint64_t usage,uint64_t * outBufferAge,FrameEventHistoryDelta * outTimestamps)167 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) {
170 Parcel data, reply;
171 bool getFrameTimestamps = (outTimestamps != nullptr);
172
173 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
174 data.writeUint32(width);
175 data.writeUint32(height);
176 data.writeInt32(static_cast<int32_t>(format));
177 data.writeUint64(usage);
178 data.writeBool(getFrameTimestamps);
179
180 status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply);
181 if (result != NO_ERROR) {
182 return result;
183 }
184
185 *buf = reply.readInt32();
186 *fence = new Fence();
187 result = reply.read(**fence);
188 if (result != NO_ERROR) {
189 fence->clear();
190 return result;
191 }
192 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 }
203 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 }
211 result = reply.readInt32();
212 return result;
213 }
214
dequeueBuffers(const std::vector<DequeueBufferInput> & inputs,std::vector<DequeueBufferOutput> * outputs)215 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
detachBuffer(int slot)238 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
detachBuffers(const std::vector<int32_t> & slots,std::vector<status_t> * results)250 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
detachNextBuffer(sp<GraphicBuffer> * outBuffer,sp<Fence> * outFence)263 virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer,
264 sp<Fence>* outFence) {
265 if (outBuffer == nullptr) {
266 ALOGE("detachNextBuffer: outBuffer must not be NULL");
267 return BAD_VALUE;
268 } else if (outFence == nullptr) {
269 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;
283 result = reply.read(**outBuffer);
284 if (result != NO_ERROR) {
285 outBuffer->clear();
286 return result;
287 }
288 }
289 nonNull = reply.readInt32();
290 if (nonNull) {
291 *outFence = new Fence;
292 result = reply.read(**outFence);
293 if (result != NO_ERROR) {
294 outBuffer->clear();
295 outFence->clear();
296 return result;
297 }
298 }
299 }
300 return result;
301 }
302
attachBuffer(int * slot,const sp<GraphicBuffer> & buffer)303 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 }
311
312 *slot = reply.readInt32();
313 result = reply.readInt32();
314 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
321 return result;
322 }
323
attachBuffers(const std::vector<sp<GraphicBuffer>> & buffers,std::vector<AttachBufferOutput> * outputs)324 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
queueBuffer(int buf,const QueueBufferInput & input,QueueBufferOutput * output)357 virtual status_t queueBuffer(int buf,
358 const QueueBufferInput& input, QueueBufferOutput* output) {
359 Parcel data, reply;
360
361 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
362 data.writeInt32(buf);
363 data.write(input);
364
365 status_t result = remote()->transact(QUEUE_BUFFER, data, &reply);
366 if (result != NO_ERROR) {
367 return result;
368 }
369
370 result = reply.read(*output);
371 if (result != NO_ERROR) {
372 return result;
373 }
374
375 result = reply.readInt32();
376 return result;
377 }
378
queueBuffers(const std::vector<QueueBufferInput> & inputs,std::vector<QueueBufferOutput> * outputs)379 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
cancelBuffer(int buf,const sp<Fence> & fence)401 virtual status_t cancelBuffer(int buf, const sp<Fence>& fence) {
402 Parcel data, reply;
403 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
404 data.writeInt32(buf);
405 data.write(*fence.get());
406 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;
412 }
413
cancelBuffers(const std::vector<CancelBufferInput> & inputs,std::vector<status_t> * results)414 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
query(int what,int * value)431 virtual int query(int what, int* value) {
432 Parcel data, reply;
433 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
434 data.writeInt32(what);
435 status_t result = remote()->transact(QUERY, data, &reply);
436 if (result != NO_ERROR) {
437 return result;
438 }
439 value[0] = reply.readInt32();
440 result = reply.readInt32();
441 return result;
442 }
443
query(const std::vector<int32_t> inputs,std::vector<QueryOutput> * outputs)444 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
connect(const sp<IProducerListener> & listener,int api,bool producerControlledByApp,QueueBufferOutput * output)463 virtual status_t connect(const sp<IProducerListener>& listener,
464 int api, bool producerControlledByApp, QueueBufferOutput* output) {
465 Parcel data, reply;
466 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
467 if (listener != nullptr) {
468 data.writeInt32(1);
469 data.writeStrongBinder(IInterface::asBinder(listener));
470 } else {
471 data.writeInt32(0);
472 }
473 data.writeInt32(api);
474 data.writeInt32(producerControlledByApp);
475 status_t result = remote()->transact(CONNECT, data, &reply);
476 if (result != NO_ERROR) {
477 return result;
478 }
479 reply.read(*output);
480 result = reply.readInt32();
481 return result;
482 }
483
disconnect(int api,DisconnectMode mode)484 virtual status_t disconnect(int api, DisconnectMode mode) {
485 Parcel data, reply;
486 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
487 data.writeInt32(api);
488 data.writeInt32(static_cast<int32_t>(mode));
489 status_t result =remote()->transact(DISCONNECT, data, &reply);
490 if (result != NO_ERROR) {
491 return result;
492 }
493 result = reply.readInt32();
494 return result;
495 }
496
setSidebandStream(const sp<NativeHandle> & stream)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 }
512
allocateBuffers(uint32_t width,uint32_t height,PixelFormat format,uint64_t usage)513 virtual void allocateBuffers(uint32_t width, uint32_t height,
514 PixelFormat format, uint64_t usage) {
515 Parcel data, reply;
516 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
517 data.writeUint32(width);
518 data.writeUint32(height);
519 data.writeInt32(static_cast<int32_t>(format));
520 data.writeUint64(usage);
521 status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply, IBinder::FLAG_ONEWAY);
522 if (result != NO_ERROR) {
523 ALOGE("allocateBuffers failed to transact: %d", result);
524 }
525 }
526
allowAllocation(bool allow)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 }
538
setGenerationNumber(uint32_t generationNumber)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 }
549
getConsumerName() const550 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 }
560
setSharedBufferMode(bool sharedBufferMode)561 virtual status_t setSharedBufferMode(bool sharedBufferMode) {
562 Parcel data, reply;
563 data.writeInterfaceToken(
564 IGraphicBufferProducer::getInterfaceDescriptor());
565 data.writeInt32(sharedBufferMode);
566 status_t result = remote()->transact(SET_SHARED_BUFFER_MODE, data,
567 &reply);
568 if (result == NO_ERROR) {
569 result = reply.readInt32();
570 }
571 return result;
572 }
573
setAutoRefresh(bool autoRefresh)574 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
setDequeueTimeout(nsecs_t timeout)586 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 }
597
setLegacyBufferDrop(bool drop)598 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
getLastQueuedBuffer(sp<GraphicBuffer> * outBuffer,sp<Fence> * outFence,float outTransformMatrix[16])612 virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer,
613 sp<Fence>* outFence, float outTransformMatrix[16]) override {
614 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 }
626 bool hasBuffer = reply.readBool();
627 sp<GraphicBuffer> buffer;
628 if (hasBuffer) {
629 buffer = new GraphicBuffer();
630 result = reply.read(*buffer);
631 if (result == NO_ERROR) {
632 result = reply.read(outTransformMatrix, sizeof(float) * 16);
633 }
634 }
635 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 }
649
getLastQueuedBuffer(sp<GraphicBuffer> * outBuffer,sp<Fence> * outFence,Rect * outRect,uint32_t * outTransform)650 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
getFrameTimestamps(FrameEventHistoryDelta * outDelta)700 virtual void getFrameTimestamps(FrameEventHistoryDelta* outDelta) {
701 Parcel data, reply;
702 status_t result = data.writeInterfaceToken(
703 IGraphicBufferProducer::getInterfaceDescriptor());
704 if (result != NO_ERROR) {
705 ALOGE("IGBP::getFrameTimestamps failed to write token: %d", result);
706 return;
707 }
708 result = remote()->transact(GET_FRAME_TIMESTAMPS, data, &reply);
709 if (result != NO_ERROR) {
710 ALOGE("IGBP::getFrameTimestamps failed to transact: %d", result);
711 return;
712 }
713 result = reply.read(*outDelta);
714 if (result != NO_ERROR) {
715 ALOGE("IGBP::getFrameTimestamps failed to read timestamps: %d",
716 result);
717 }
718 }
719
getUniqueId(uint64_t * outId) const720 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 }
738
getConsumerUsage(uint64_t * outUsage) const739 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 }
757
setAutoPrerotation(bool autoPrerotation)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 }
768 };
769
770 // Out-of-line virtual method definition to trigger vtable emission in this
771 // translation unit (see clang warning -Wweak-vtables)
~BpGraphicBufferProducer()772 BpGraphicBufferProducer::~BpGraphicBufferProducer() {}
773
774 class HpGraphicBufferProducer : public HpInterface<
775 BpGraphicBufferProducer,
776 H2BGraphicBufferProducerV1_0,
777 H2BGraphicBufferProducerV2_0> {
778 public:
HpGraphicBufferProducer(const sp<IBinder> & base)779 explicit HpGraphicBufferProducer(const sp<IBinder>& base) : PBase(base) {}
780
requestBuffer(int slot,sp<GraphicBuffer> * buf)781 status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) override {
782 return mBase->requestBuffer(slot, buf);
783 }
784
requestBuffers(const std::vector<int32_t> & slots,std::vector<RequestBufferOutput> * outputs)785 status_t requestBuffers(
786 const std::vector<int32_t>& slots,
787 std::vector<RequestBufferOutput>* outputs) override {
788 return mBase->requestBuffers(slots, outputs);
789 }
790
setMaxDequeuedBufferCount(int maxDequeuedBuffers)791 status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) override {
792 return mBase->setMaxDequeuedBufferCount(maxDequeuedBuffers);
793 }
794
setAsyncMode(bool async)795 status_t setAsyncMode(bool async) override {
796 return mBase->setAsyncMode(async);
797 }
798
dequeueBuffer(int * slot,sp<Fence> * fence,uint32_t w,uint32_t h,PixelFormat format,uint64_t usage,uint64_t * outBufferAge,FrameEventHistoryDelta * outTimestamps)799 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);
803 }
804
dequeueBuffers(const std::vector<DequeueBufferInput> & inputs,std::vector<DequeueBufferOutput> * outputs)805 status_t dequeueBuffers(
806 const std::vector<DequeueBufferInput>& inputs,
807 std::vector<DequeueBufferOutput>* outputs) override {
808 return mBase->dequeueBuffers(inputs, outputs);
809 }
810
detachBuffer(int slot)811 status_t detachBuffer(int slot) override {
812 return mBase->detachBuffer(slot);
813 }
814
detachBuffers(const std::vector<int32_t> & slots,std::vector<status_t> * results)815 status_t detachBuffers(const std::vector<int32_t>& slots,
816 std::vector<status_t>* results) override {
817 return mBase->detachBuffers(slots, results);
818 }
819
detachNextBuffer(sp<GraphicBuffer> * outBuffer,sp<Fence> * outFence)820 status_t detachNextBuffer(
821 sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) override {
822 return mBase->detachNextBuffer(outBuffer, outFence);
823 }
824
attachBuffer(int * outSlot,const sp<GraphicBuffer> & buffer)825 status_t attachBuffer(
826 int* outSlot, const sp<GraphicBuffer>& buffer) override {
827 return mBase->attachBuffer(outSlot, buffer);
828 }
829
attachBuffers(const std::vector<sp<GraphicBuffer>> & buffers,std::vector<AttachBufferOutput> * outputs)830 status_t attachBuffers(
831 const std::vector<sp<GraphicBuffer>>& buffers,
832 std::vector<AttachBufferOutput>* outputs) override {
833 return mBase->attachBuffers(buffers, outputs);
834 }
835
queueBuffer(int slot,const QueueBufferInput & input,QueueBufferOutput * output)836 status_t queueBuffer(
837 int slot,
838 const QueueBufferInput& input,
839 QueueBufferOutput* output) override {
840 return mBase->queueBuffer(slot, input, output);
841 }
842
queueBuffers(const std::vector<QueueBufferInput> & inputs,std::vector<QueueBufferOutput> * outputs)843 status_t queueBuffers(const std::vector<QueueBufferInput>& inputs,
844 std::vector<QueueBufferOutput>* outputs) override {
845 return mBase->queueBuffers(inputs, outputs);
846 }
847
cancelBuffer(int slot,const sp<Fence> & fence)848 status_t cancelBuffer(int slot, const sp<Fence>& fence) override {
849 return mBase->cancelBuffer(slot, fence);
850 }
851
cancelBuffers(const std::vector<CancelBufferInput> & inputs,std::vector<status_t> * results)852 status_t cancelBuffers(
853 const std::vector<CancelBufferInput>& inputs,
854 std::vector<status_t>* results) override {
855 return mBase->cancelBuffers(inputs, results);
856 }
857
query(int what,int * value)858 int query(int what, int* value) override {
859 return mBase->query(what, value);
860 }
861
query(const std::vector<int32_t> inputs,std::vector<QueryOutput> * outputs)862 status_t query(const std::vector<int32_t> inputs,
863 std::vector<QueryOutput>* outputs) override {
864 return mBase->query(inputs, outputs);
865 }
866
connect(const sp<IProducerListener> & listener,int api,bool producerControlledByApp,QueueBufferOutput * output)867 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
disconnect(int api,DisconnectMode mode=DisconnectMode::Api)874 status_t disconnect(
875 int api, DisconnectMode mode = DisconnectMode::Api) override {
876 return mBase->disconnect(api, mode);
877 }
878
setSidebandStream(const sp<NativeHandle> & stream)879 status_t setSidebandStream(const sp<NativeHandle>& stream) override {
880 return mBase->setSidebandStream(stream);
881 }
882
allocateBuffers(uint32_t width,uint32_t height,PixelFormat format,uint64_t usage)883 void allocateBuffers(uint32_t width, uint32_t height,
884 PixelFormat format, uint64_t usage) override {
885 return mBase->allocateBuffers(width, height, format, usage);
886 }
887
allowAllocation(bool allow)888 status_t allowAllocation(bool allow) override {
889 return mBase->allowAllocation(allow);
890 }
891
setGenerationNumber(uint32_t generationNumber)892 status_t setGenerationNumber(uint32_t generationNumber) override {
893 return mBase->setGenerationNumber(generationNumber);
894 }
895
getConsumerName() const896 String8 getConsumerName() const override {
897 return mBase->getConsumerName();
898 }
899
setSharedBufferMode(bool sharedBufferMode)900 status_t setSharedBufferMode(bool sharedBufferMode) override {
901 return mBase->setSharedBufferMode(sharedBufferMode);
902 }
903
setAutoRefresh(bool autoRefresh)904 status_t setAutoRefresh(bool autoRefresh) override {
905 return mBase->setAutoRefresh(autoRefresh);
906 }
907
setDequeueTimeout(nsecs_t timeout)908 status_t setDequeueTimeout(nsecs_t timeout) override {
909 return mBase->setDequeueTimeout(timeout);
910 }
911
setLegacyBufferDrop(bool drop)912 status_t setLegacyBufferDrop(bool drop) override {
913 return mBase->setLegacyBufferDrop(drop);
914 }
915
getLastQueuedBuffer(sp<GraphicBuffer> * outBuffer,sp<Fence> * outFence,float outTransformMatrix[16])916 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
getLastQueuedBuffer(sp<GraphicBuffer> * outBuffer,sp<Fence> * outFence,Rect * outRect,uint32_t * outTransform)924 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
getFrameTimestamps(FrameEventHistoryDelta * outDelta)929 void getFrameTimestamps(FrameEventHistoryDelta* outDelta) override {
930 return mBase->getFrameTimestamps(outDelta);
931 }
932
getUniqueId(uint64_t * outId) const933 status_t getUniqueId(uint64_t* outId) const override {
934 return mBase->getUniqueId(outId);
935 }
936
getConsumerUsage(uint64_t * outUsage) const937 status_t getConsumerUsage(uint64_t* outUsage) const override {
938 return mBase->getConsumerUsage(outUsage);
939 }
940
setAutoPrerotation(bool autoPrerotation)941 status_t setAutoPrerotation(bool autoPrerotation) override {
942 return mBase->setAutoPrerotation(autoPrerotation);
943 }
944 };
945
946 IMPLEMENT_HYBRID_META_INTERFACE(GraphicBufferProducer,
947 "android.gui.IGraphicBufferProducer");
948
949 // ----------------------------------------------------------------------
950
setLegacyBufferDrop(bool drop)951 status_t IGraphicBufferProducer::setLegacyBufferDrop(bool drop) {
952 // No-op for IGBP other than BufferQueue.
953 (void) drop;
954 return INVALID_OPERATION;
955 }
956
setAutoPrerotation(bool autoPrerotation)957 status_t IGraphicBufferProducer::setAutoPrerotation(bool autoPrerotation) {
958 // No-op for IGBP other than BufferQueue.
959 (void)autoPrerotation;
960 return INVALID_OPERATION;
961 }
962
exportToParcel(Parcel * parcel)963 status_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 */
exportToParcel(const sp<IGraphicBufferProducer> & producer,Parcel * parcel)975 status_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 */
createFromParcel(const Parcel * parcel)993 sp<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.");
1015 #ifndef NO_BUFFERHUB
1016 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));
1023 #else
1024 return nullptr;
1025 #endif
1026 }
1027 default: {
1028 ALOGE("createFromParcel: Unexpected mgaic: 0x%x.", outMagic);
1029 return nullptr;
1030 }
1031 }
1032 }
1033
1034 // ----------------------------------------------------------------------------
1035
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)1036 status_t BnGraphicBufferProducer::onTransact(
1037 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
1038 {
1039 switch(code) {
1040 case REQUEST_BUFFER: {
1041 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1042 int bufferIdx = data.readInt32();
1043 sp<GraphicBuffer> buffer;
1044 int result = requestBuffer(bufferIdx, &buffer);
1045 reply->writeInt32(buffer != nullptr);
1046 if (buffer != nullptr) {
1047 reply->write(*buffer);
1048 }
1049 reply->writeInt32(result);
1050 return NO_ERROR;
1051 }
1052 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 }
1070 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 }
1084 case DEQUEUE_BUFFER: {
1085 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1086 uint32_t width = data.readUint32();
1087 uint32_t height = data.readUint32();
1088 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
1089 uint64_t usage = data.readUint64();
1090 uint64_t bufferAge = 0;
1091 bool getTimestamps = data.readBool();
1092
1093 int buf = 0;
1094 sp<Fence> fence = Fence::NO_FENCE;
1095 FrameEventHistoryDelta frameTimestamps;
1096 int result = dequeueBuffer(&buf, &fence, width, height, format, usage, &bufferAge,
1097 getTimestamps ? &frameTimestamps : nullptr);
1098
1099 if (fence == nullptr) {
1100 ALOGE("dequeueBuffer returned a NULL fence, setting to Fence::NO_FENCE");
1101 fence = Fence::NO_FENCE;
1102 }
1103 reply->writeInt32(buf);
1104 reply->write(*fence);
1105 reply->writeUint64(bufferAge);
1106 if (getTimestamps) {
1107 reply->write(frameTimestamps);
1108 }
1109 reply->writeInt32(result);
1110 return NO_ERROR;
1111 }
1112 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 }
1136 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;
1142 }
1143 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 }
1154 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) {
1161 reply->writeInt32(buffer != nullptr);
1162 if (buffer != nullptr) {
1163 reply->write(*buffer);
1164 }
1165 reply->writeInt32(fence != nullptr);
1166 if (fence != nullptr) {
1167 reply->write(*fence);
1168 }
1169 }
1170 return NO_ERROR;
1171 }
1172 case ATTACH_BUFFER: {
1173 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1174 sp<GraphicBuffer> buffer = new GraphicBuffer();
1175 status_t result = data.read(*buffer.get());
1176 int slot = 0;
1177 if (result == NO_ERROR) {
1178 result = attachBuffer(&slot, buffer);
1179 }
1180 reply->writeInt32(slot);
1181 reply->writeInt32(result);
1182 return NO_ERROR;
1183 }
1184 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 }
1209 case QUEUE_BUFFER: {
1210 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1211
1212 int buf = data.readInt32();
1213 QueueBufferInput input(data);
1214 QueueBufferOutput output;
1215 status_t result = queueBuffer(buf, input, &output);
1216 reply->write(output);
1217 reply->writeInt32(result);
1218
1219 return NO_ERROR;
1220 }
1221 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 }
1245 case CANCEL_BUFFER: {
1246 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1247 int buf = data.readInt32();
1248 sp<Fence> fence = new Fence();
1249 status_t result = data.read(*fence.get());
1250 if (result == NO_ERROR) {
1251 result = cancelBuffer(buf, fence);
1252 }
1253 reply->writeInt32(result);
1254 return NO_ERROR;
1255 }
1256 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 }
1276 case QUERY: {
1277 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1278 int value = 0;
1279 int what = data.readInt32();
1280 int res = query(what, &value);
1281 reply->writeInt32(value);
1282 reply->writeInt32(res);
1283 return NO_ERROR;
1284 }
1285 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 }
1306 case CONNECT: {
1307 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1308 sp<IProducerListener> listener;
1309 if (data.readInt32() == 1) {
1310 listener = IProducerListener::asInterface(data.readStrongBinder());
1311 }
1312 int api = data.readInt32();
1313 bool producerControlledByApp = data.readInt32();
1314 QueueBufferOutput output;
1315 status_t res = connect(listener, api, producerControlledByApp, &output);
1316 reply->write(output);
1317 reply->writeInt32(res);
1318 return NO_ERROR;
1319 }
1320 case DISCONNECT: {
1321 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1322 int api = data.readInt32();
1323 DisconnectMode mode = static_cast<DisconnectMode>(data.readInt32());
1324 status_t res = disconnect(api, mode);
1325 reply->writeInt32(res);
1326 return NO_ERROR;
1327 }
1328 case SET_SIDEBAND_STREAM: {
1329 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1330 sp<NativeHandle> stream;
1331 if (data.readInt32()) {
1332 stream = NativeHandle::create(data.readNativeHandle(), true);
1333 }
1334 status_t result = setSidebandStream(stream);
1335 reply->writeInt32(result);
1336 return NO_ERROR;
1337 }
1338 case ALLOCATE_BUFFERS: {
1339 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1340 uint32_t width = data.readUint32();
1341 uint32_t height = data.readUint32();
1342 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
1343 uint64_t usage = data.readUint64();
1344 allocateBuffers(width, height, format, usage);
1345 return NO_ERROR;
1346 }
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 }
1354 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 }
1361 case GET_CONSUMER_NAME: {
1362 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1363 reply->writeString8(getConsumerName());
1364 return NO_ERROR;
1365 }
1366 case SET_SHARED_BUFFER_MODE: {
1367 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1368 bool sharedBufferMode = data.readInt32();
1369 status_t result = setSharedBufferMode(sharedBufferMode);
1370 reply->writeInt32(result);
1371 return NO_ERROR;
1372 }
1373 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 }
1380 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 }
1387 case GET_LAST_QUEUED_BUFFER: {
1388 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1389 sp<GraphicBuffer> buffer(nullptr);
1390 sp<Fence> fence(Fence::NO_FENCE);
1391 float transform[16] = {};
1392 status_t result = getLastQueuedBuffer(&buffer, &fence, transform);
1393 reply->writeInt32(result);
1394 if (result != NO_ERROR) {
1395 return result;
1396 }
1397 if (!buffer.get()) {
1398 reply->writeBool(false);
1399 } else {
1400 reply->writeBool(true);
1401 result = reply->write(*buffer);
1402 if (result == NO_ERROR) {
1403 reply->write(transform, sizeof(float) * 16);
1404 }
1405 }
1406 if (result != NO_ERROR) {
1407 ALOGE("getLastQueuedBuffer failed to write buffer: %d", result);
1408 return result;
1409 }
1410 if (fence == nullptr) {
1411 ALOGE("getLastQueuedBuffer returned a NULL fence, setting to Fence::NO_FENCE");
1412 fence = Fence::NO_FENCE;
1413 }
1414 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 }
1421 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
1460 case GET_FRAME_TIMESTAMPS: {
1461 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1462 FrameEventHistoryDelta frameTimestamps;
1463 getFrameTimestamps(&frameTimestamps);
1464 status_t result = reply->write(frameTimestamps);
1465 if (result != NO_ERROR) {
1466 ALOGE("BnGBP::GET_FRAME_TIMESTAMPS failed to write buffer: %d",
1467 result);
1468 return result;
1469 }
1470 return NO_ERROR;
1471 }
1472 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 }
1486 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 }
1500 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 }
1507 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 }
1514 }
1515 return BBinder::onTransact(code, data, reply, flags);
1516 }
1517
1518 }; // namespace android
1519