2 * Copyright (C) 2010 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 #include <sys/types.h>
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>
27 #include <binder/Parcel.h>
28 #include <binder/IInterface.h>
30 #include <gui/BufferQueueDefs.h>
31 #include <gui/IGraphicBufferProducer.h>
32 #include <gui/IProducerListener.h>
34 #include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h>
37 // ----------------------------------------------------------------------------
39 using ::android::hardware::graphics::bufferqueue::V1_0::utils::
40 H2BGraphicBufferProducer;
43 REQUEST_BUFFER = IBinder::FIRST_CALL_TRANSACTION,
56 SET_GENERATION_NUMBER,
58 SET_MAX_DEQUEUED_BUFFER_COUNT,
60 SET_SHARED_BUFFER_MODE,
63 GET_LAST_QUEUED_BUFFER,
69 class BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer>
72 explicit BpGraphicBufferProducer(const sp<IBinder>& impl)
73 : BpInterface<IGraphicBufferProducer>(impl)
77 ~BpGraphicBufferProducer() override;
79 virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) {
81 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
82 data.writeInt32(bufferIdx);
83 status_t result =remote()->transact(REQUEST_BUFFER, data, &reply);
84 if (result != NO_ERROR) {
87 bool nonNull = reply.readInt32();
89 *buf = new GraphicBuffer();
90 result = reply.read(**buf);
91 if(result != NO_ERROR) {
96 result = reply.readInt32();
100 virtual status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) {
102 data.writeInterfaceToken(
103 IGraphicBufferProducer::getInterfaceDescriptor());
104 data.writeInt32(maxDequeuedBuffers);
105 status_t result = remote()->transact(SET_MAX_DEQUEUED_BUFFER_COUNT,
107 if (result != NO_ERROR) {
110 result = reply.readInt32();
114 virtual status_t setAsyncMode(bool async) {
116 data.writeInterfaceToken(
117 IGraphicBufferProducer::getInterfaceDescriptor());
118 data.writeInt32(async);
119 status_t result = remote()->transact(SET_ASYNC_MODE,
121 if (result != NO_ERROR) {
124 result = reply.readInt32();
128 virtual status_t dequeueBuffer(int* buf, sp<Fence>* fence, uint32_t width, uint32_t height,
129 PixelFormat format, uint64_t usage, uint64_t* outBufferAge,
130 FrameEventHistoryDelta* outTimestamps) {
132 bool getFrameTimestamps = (outTimestamps != nullptr);
134 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
135 data.writeUint32(width);
136 data.writeUint32(height);
137 data.writeInt32(static_cast<int32_t>(format));
138 data.writeUint64(usage);
139 data.writeBool(getFrameTimestamps);
141 status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply);
142 if (result != NO_ERROR) {
146 *buf = reply.readInt32();
147 *fence = new Fence();
148 result = reply.read(**fence);
149 if (result != NO_ERROR) {
154 result = reply.readUint64(outBufferAge);
156 // Read the value even if outBufferAge is nullptr:
158 result = reply.readUint64(&bufferAge);
160 if (result != NO_ERROR) {
161 ALOGE("IGBP::dequeueBuffer failed to read buffer age: %d", result);
164 if (getFrameTimestamps) {
165 result = reply.read(*outTimestamps);
166 if (result != NO_ERROR) {
167 ALOGE("IGBP::dequeueBuffer failed to read timestamps: %d",
172 result = reply.readInt32();
176 virtual status_t detachBuffer(int slot) {
178 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
179 data.writeInt32(slot);
180 status_t result = remote()->transact(DETACH_BUFFER, data, &reply);
181 if (result != NO_ERROR) {
184 result = reply.readInt32();
188 virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer,
189 sp<Fence>* outFence) {
190 if (outBuffer == NULL) {
191 ALOGE("detachNextBuffer: outBuffer must not be NULL");
193 } else if (outFence == NULL) {
194 ALOGE("detachNextBuffer: outFence must not be NULL");
198 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
199 status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply);
200 if (result != NO_ERROR) {
203 result = reply.readInt32();
204 if (result == NO_ERROR) {
205 bool nonNull = reply.readInt32();
207 *outBuffer = new GraphicBuffer;
208 result = reply.read(**outBuffer);
209 if (result != NO_ERROR) {
214 nonNull = reply.readInt32();
216 *outFence = new Fence;
217 result = reply.read(**outFence);
218 if (result != NO_ERROR) {
228 virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) {
230 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
231 data.write(*buffer.get());
232 status_t result = remote()->transact(ATTACH_BUFFER, data, &reply);
233 if (result != NO_ERROR) {
237 *slot = reply.readInt32();
238 result = reply.readInt32();
239 if (result == NO_ERROR &&
240 (*slot < 0 || *slot >= BufferQueueDefs::NUM_BUFFER_SLOTS)) {
241 ALOGE("attachBuffer returned invalid slot %d", *slot);
242 android_errorWriteLog(0x534e4554, "37478824");
243 return UNKNOWN_ERROR;
249 virtual status_t queueBuffer(int buf,
250 const QueueBufferInput& input, QueueBufferOutput* output) {
253 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
254 data.writeInt32(buf);
257 status_t result = remote()->transact(QUEUE_BUFFER, data, &reply);
258 if (result != NO_ERROR) {
262 result = reply.read(*output);
263 if (result != NO_ERROR) {
267 result = reply.readInt32();
271 virtual status_t cancelBuffer(int buf, const sp<Fence>& fence) {
273 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
274 data.writeInt32(buf);
275 data.write(*fence.get());
276 status_t result = remote()->transact(CANCEL_BUFFER, data, &reply);
277 if (result != NO_ERROR) {
280 result = reply.readInt32();
284 virtual int query(int what, int* value) {
286 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
287 data.writeInt32(what);
288 status_t result = remote()->transact(QUERY, data, &reply);
289 if (result != NO_ERROR) {
292 value[0] = reply.readInt32();
293 result = reply.readInt32();
297 virtual status_t connect(const sp<IProducerListener>& listener,
298 int api, bool producerControlledByApp, QueueBufferOutput* output) {
300 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
301 if (listener != NULL) {
303 data.writeStrongBinder(IInterface::asBinder(listener));
307 data.writeInt32(api);
308 data.writeInt32(producerControlledByApp);
309 status_t result = remote()->transact(CONNECT, data, &reply);
310 if (result != NO_ERROR) {
314 result = reply.readInt32();
318 virtual status_t disconnect(int api, DisconnectMode mode) {
320 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
321 data.writeInt32(api);
322 data.writeInt32(static_cast<int32_t>(mode));
323 status_t result =remote()->transact(DISCONNECT, data, &reply);
324 if (result != NO_ERROR) {
327 result = reply.readInt32();
331 virtual status_t setSidebandStream(const sp<NativeHandle>& stream) {
334 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
336 data.writeInt32(true);
337 data.writeNativeHandle(stream->handle());
339 data.writeInt32(false);
341 if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) {
342 result = reply.readInt32();
347 virtual void allocateBuffers(uint32_t width, uint32_t height,
348 PixelFormat format, uint64_t usage) {
350 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
351 data.writeUint32(width);
352 data.writeUint32(height);
353 data.writeInt32(static_cast<int32_t>(format));
354 data.writeUint64(usage);
355 status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply);
356 if (result != NO_ERROR) {
357 ALOGE("allocateBuffers failed to transact: %d", result);
361 virtual status_t allowAllocation(bool allow) {
363 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
364 data.writeInt32(static_cast<int32_t>(allow));
365 status_t result = remote()->transact(ALLOW_ALLOCATION, data, &reply);
366 if (result != NO_ERROR) {
369 result = reply.readInt32();
373 virtual status_t setGenerationNumber(uint32_t generationNumber) {
375 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
376 data.writeUint32(generationNumber);
377 status_t result = remote()->transact(SET_GENERATION_NUMBER, data, &reply);
378 if (result == NO_ERROR) {
379 result = reply.readInt32();
384 virtual String8 getConsumerName() const {
386 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
387 status_t result = remote()->transact(GET_CONSUMER_NAME, data, &reply);
388 if (result != NO_ERROR) {
389 ALOGE("getConsumerName failed to transact: %d", result);
390 return String8("TransactFailed");
392 return reply.readString8();
395 virtual status_t setSharedBufferMode(bool sharedBufferMode) {
397 data.writeInterfaceToken(
398 IGraphicBufferProducer::getInterfaceDescriptor());
399 data.writeInt32(sharedBufferMode);
400 status_t result = remote()->transact(SET_SHARED_BUFFER_MODE, data,
402 if (result == NO_ERROR) {
403 result = reply.readInt32();
408 virtual status_t setAutoRefresh(bool autoRefresh) {
410 data.writeInterfaceToken(
411 IGraphicBufferProducer::getInterfaceDescriptor());
412 data.writeInt32(autoRefresh);
413 status_t result = remote()->transact(SET_AUTO_REFRESH, data, &reply);
414 if (result == NO_ERROR) {
415 result = reply.readInt32();
420 virtual status_t setDequeueTimeout(nsecs_t timeout) {
422 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
423 data.writeInt64(timeout);
424 status_t result = remote()->transact(SET_DEQUEUE_TIMEOUT, data, &reply);
425 if (result != NO_ERROR) {
426 ALOGE("setDequeueTimeout failed to transact: %d", result);
429 return reply.readInt32();
432 virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer,
433 sp<Fence>* outFence, float outTransformMatrix[16]) override {
435 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
436 status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER, data,
438 if (result != NO_ERROR) {
439 ALOGE("getLastQueuedBuffer failed to transact: %d", result);
442 result = reply.readInt32();
443 if (result != NO_ERROR) {
446 bool hasBuffer = reply.readBool();
447 sp<GraphicBuffer> buffer;
449 buffer = new GraphicBuffer();
450 result = reply.read(*buffer);
451 if (result == NO_ERROR) {
452 result = reply.read(outTransformMatrix, sizeof(float) * 16);
455 if (result != NO_ERROR) {
456 ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
459 sp<Fence> fence(new Fence);
460 result = reply.read(*fence);
461 if (result != NO_ERROR) {
462 ALOGE("getLastQueuedBuffer failed to read fence: %d", result);
470 virtual void getFrameTimestamps(FrameEventHistoryDelta* outDelta) {
472 status_t result = data.writeInterfaceToken(
473 IGraphicBufferProducer::getInterfaceDescriptor());
474 if (result != NO_ERROR) {
475 ALOGE("IGBP::getFrameTimestamps failed to write token: %d", result);
478 result = remote()->transact(GET_FRAME_TIMESTAMPS, data, &reply);
479 if (result != NO_ERROR) {
480 ALOGE("IGBP::getFrameTimestamps failed to transact: %d", result);
483 result = reply.read(*outDelta);
484 if (result != NO_ERROR) {
485 ALOGE("IGBP::getFrameTimestamps failed to read timestamps: %d",
490 virtual status_t getUniqueId(uint64_t* outId) const {
492 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
493 status_t result = remote()->transact(GET_UNIQUE_ID, data, &reply);
494 if (result != NO_ERROR) {
495 ALOGE("getUniqueId failed to transact: %d", result);
497 status_t actualResult = NO_ERROR;
498 result = reply.readInt32(&actualResult);
499 if (result != NO_ERROR) {
502 result = reply.readUint64(outId);
503 if (result != NO_ERROR) {
509 virtual status_t getConsumerUsage(uint64_t* outUsage) const {
511 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
512 status_t result = remote()->transact(GET_CONSUMER_USAGE, data, &reply);
513 if (result != NO_ERROR) {
514 ALOGE("getConsumerUsage failed to transact: %d", result);
516 status_t actualResult = NO_ERROR;
517 result = reply.readInt32(&actualResult);
518 if (result != NO_ERROR) {
521 result = reply.readUint64(outUsage);
522 if (result != NO_ERROR) {
529 // Out-of-line virtual method definition to trigger vtable emission in this
530 // translation unit (see clang warning -Wweak-vtables)
531 BpGraphicBufferProducer::~BpGraphicBufferProducer() {}
533 class HpGraphicBufferProducer : public HpInterface<
534 BpGraphicBufferProducer, H2BGraphicBufferProducer> {
536 HpGraphicBufferProducer(const sp<IBinder>& base) : PBase(base) {}
538 status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) override {
539 return mBase->requestBuffer(slot, buf);
542 status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) override {
543 return mBase->setMaxDequeuedBufferCount(maxDequeuedBuffers);
546 status_t setAsyncMode(bool async) override {
547 return mBase->setAsyncMode(async);
550 status_t dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w, uint32_t h, PixelFormat format,
551 uint64_t usage, uint64_t* outBufferAge,
552 FrameEventHistoryDelta* outTimestamps) override {
553 return mBase->dequeueBuffer(slot, fence, w, h, format, usage, outBufferAge, outTimestamps);
556 status_t detachBuffer(int slot) override {
557 return mBase->detachBuffer(slot);
560 status_t detachNextBuffer(
561 sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) override {
562 return mBase->detachNextBuffer(outBuffer, outFence);
565 status_t attachBuffer(
566 int* outSlot, const sp<GraphicBuffer>& buffer) override {
567 return mBase->attachBuffer(outSlot, buffer);
570 status_t queueBuffer(
572 const QueueBufferInput& input,
573 QueueBufferOutput* output) override {
574 return mBase->queueBuffer(slot, input, output);
577 status_t cancelBuffer(int slot, const sp<Fence>& fence) override {
578 return mBase->cancelBuffer(slot, fence);
581 int query(int what, int* value) override {
582 return mBase->query(what, value);
586 const sp<IProducerListener>& listener,
587 int api, bool producerControlledByApp,
588 QueueBufferOutput* output) override {
589 return mBase->connect(listener, api, producerControlledByApp, output);
593 int api, DisconnectMode mode = DisconnectMode::Api) override {
594 return mBase->disconnect(api, mode);
597 status_t setSidebandStream(const sp<NativeHandle>& stream) override {
598 return mBase->setSidebandStream(stream);
601 void allocateBuffers(uint32_t width, uint32_t height,
602 PixelFormat format, uint64_t usage) override {
603 return mBase->allocateBuffers(width, height, format, usage);
606 status_t allowAllocation(bool allow) override {
607 return mBase->allowAllocation(allow);
610 status_t setGenerationNumber(uint32_t generationNumber) override {
611 return mBase->setGenerationNumber(generationNumber);
614 String8 getConsumerName() const override {
615 return mBase->getConsumerName();
618 status_t setSharedBufferMode(bool sharedBufferMode) override {
619 return mBase->setSharedBufferMode(sharedBufferMode);
622 status_t setAutoRefresh(bool autoRefresh) override {
623 return mBase->setAutoRefresh(autoRefresh);
626 status_t setDequeueTimeout(nsecs_t timeout) override {
627 return mBase->setDequeueTimeout(timeout);
630 status_t getLastQueuedBuffer(
631 sp<GraphicBuffer>* outBuffer,
633 float outTransformMatrix[16]) override {
634 return mBase->getLastQueuedBuffer(
635 outBuffer, outFence, outTransformMatrix);
638 void getFrameTimestamps(FrameEventHistoryDelta* outDelta) override {
639 return mBase->getFrameTimestamps(outDelta);
642 status_t getUniqueId(uint64_t* outId) const override {
643 return mBase->getUniqueId(outId);
646 status_t getConsumerUsage(uint64_t* outUsage) const override {
647 return mBase->getConsumerUsage(outUsage);
651 IMPLEMENT_HYBRID_META_INTERFACE(GraphicBufferProducer, HGraphicBufferProducer,
652 "android.gui.IGraphicBufferProducer");
654 // ----------------------------------------------------------------------
656 status_t BnGraphicBufferProducer::onTransact(
657 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
660 case REQUEST_BUFFER: {
661 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
662 int bufferIdx = data.readInt32();
663 sp<GraphicBuffer> buffer;
664 int result = requestBuffer(bufferIdx, &buffer);
665 reply->writeInt32(buffer != 0);
667 reply->write(*buffer);
669 reply->writeInt32(result);
672 case SET_MAX_DEQUEUED_BUFFER_COUNT: {
673 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
674 int maxDequeuedBuffers = data.readInt32();
675 int result = setMaxDequeuedBufferCount(maxDequeuedBuffers);
676 reply->writeInt32(result);
679 case SET_ASYNC_MODE: {
680 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
681 bool async = data.readInt32();
682 int result = setAsyncMode(async);
683 reply->writeInt32(result);
686 case DEQUEUE_BUFFER: {
687 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
688 uint32_t width = data.readUint32();
689 uint32_t height = data.readUint32();
690 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
691 uint64_t usage = data.readUint64();
692 uint64_t bufferAge = 0;
693 bool getTimestamps = data.readBool();
696 sp<Fence> fence = Fence::NO_FENCE;
697 FrameEventHistoryDelta frameTimestamps;
698 int result = dequeueBuffer(&buf, &fence, width, height, format, usage, &bufferAge,
699 getTimestamps ? &frameTimestamps : nullptr);
701 reply->writeInt32(buf);
702 reply->write(*fence);
703 reply->writeUint64(bufferAge);
705 reply->write(frameTimestamps);
707 reply->writeInt32(result);
710 case DETACH_BUFFER: {
711 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
712 int slot = data.readInt32();
713 int result = detachBuffer(slot);
714 reply->writeInt32(result);
717 case DETACH_NEXT_BUFFER: {
718 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
719 sp<GraphicBuffer> buffer;
721 int32_t result = detachNextBuffer(&buffer, &fence);
722 reply->writeInt32(result);
723 if (result == NO_ERROR) {
724 reply->writeInt32(buffer != NULL);
725 if (buffer != NULL) {
726 reply->write(*buffer);
728 reply->writeInt32(fence != NULL);
730 reply->write(*fence);
735 case ATTACH_BUFFER: {
736 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
737 sp<GraphicBuffer> buffer = new GraphicBuffer();
738 status_t result = data.read(*buffer.get());
740 if (result == NO_ERROR) {
741 result = attachBuffer(&slot, buffer);
743 reply->writeInt32(slot);
744 reply->writeInt32(result);
748 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
750 int buf = data.readInt32();
751 QueueBufferInput input(data);
752 QueueBufferOutput output;
753 status_t result = queueBuffer(buf, input, &output);
754 reply->write(output);
755 reply->writeInt32(result);
759 case CANCEL_BUFFER: {
760 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
761 int buf = data.readInt32();
762 sp<Fence> fence = new Fence();
763 status_t result = data.read(*fence.get());
764 if (result == NO_ERROR) {
765 result = cancelBuffer(buf, fence);
767 reply->writeInt32(result);
771 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
773 int what = data.readInt32();
774 int res = query(what, &value);
775 reply->writeInt32(value);
776 reply->writeInt32(res);
780 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
781 sp<IProducerListener> listener;
782 if (data.readInt32() == 1) {
783 listener = IProducerListener::asInterface(data.readStrongBinder());
785 int api = data.readInt32();
786 bool producerControlledByApp = data.readInt32();
787 QueueBufferOutput output;
788 status_t res = connect(listener, api, producerControlledByApp, &output);
789 reply->write(output);
790 reply->writeInt32(res);
794 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
795 int api = data.readInt32();
796 DisconnectMode mode = static_cast<DisconnectMode>(data.readInt32());
797 status_t res = disconnect(api, mode);
798 reply->writeInt32(res);
801 case SET_SIDEBAND_STREAM: {
802 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
803 sp<NativeHandle> stream;
804 if (data.readInt32()) {
805 stream = NativeHandle::create(data.readNativeHandle(), true);
807 status_t result = setSidebandStream(stream);
808 reply->writeInt32(result);
811 case ALLOCATE_BUFFERS: {
812 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
813 uint32_t width = data.readUint32();
814 uint32_t height = data.readUint32();
815 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
816 uint64_t usage = data.readUint64();
817 allocateBuffers(width, height, format, usage);
820 case ALLOW_ALLOCATION: {
821 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
822 bool allow = static_cast<bool>(data.readInt32());
823 status_t result = allowAllocation(allow);
824 reply->writeInt32(result);
827 case SET_GENERATION_NUMBER: {
828 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
829 uint32_t generationNumber = data.readUint32();
830 status_t result = setGenerationNumber(generationNumber);
831 reply->writeInt32(result);
834 case GET_CONSUMER_NAME: {
835 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
836 reply->writeString8(getConsumerName());
839 case SET_SHARED_BUFFER_MODE: {
840 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
841 bool sharedBufferMode = data.readInt32();
842 status_t result = setSharedBufferMode(sharedBufferMode);
843 reply->writeInt32(result);
846 case SET_AUTO_REFRESH: {
847 CHECK_INTERFACE(IGraphicBuffer, data, reply);
848 bool autoRefresh = data.readInt32();
849 status_t result = setAutoRefresh(autoRefresh);
850 reply->writeInt32(result);
853 case SET_DEQUEUE_TIMEOUT: {
854 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
855 nsecs_t timeout = data.readInt64();
856 status_t result = setDequeueTimeout(timeout);
857 reply->writeInt32(result);
860 case GET_LAST_QUEUED_BUFFER: {
861 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
862 sp<GraphicBuffer> buffer(nullptr);
863 sp<Fence> fence(Fence::NO_FENCE);
864 float transform[16] = {};
865 status_t result = getLastQueuedBuffer(&buffer, &fence, transform);
866 reply->writeInt32(result);
867 if (result != NO_ERROR) {
871 reply->writeBool(false);
873 reply->writeBool(true);
874 result = reply->write(*buffer);
875 if (result == NO_ERROR) {
876 reply->write(transform, sizeof(float) * 16);
879 if (result != NO_ERROR) {
880 ALOGE("getLastQueuedBuffer failed to write buffer: %d", result);
883 result = reply->write(*fence);
884 if (result != NO_ERROR) {
885 ALOGE("getLastQueuedBuffer failed to write fence: %d", result);
890 case GET_FRAME_TIMESTAMPS: {
891 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
892 FrameEventHistoryDelta frameTimestamps;
893 getFrameTimestamps(&frameTimestamps);
894 status_t result = reply->write(frameTimestamps);
895 if (result != NO_ERROR) {
896 ALOGE("BnGBP::GET_FRAME_TIMESTAMPS failed to write buffer: %d",
902 case GET_UNIQUE_ID: {
903 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
905 status_t actualResult = getUniqueId(&outId);
906 status_t result = reply->writeInt32(actualResult);
907 if (result != NO_ERROR) {
910 result = reply->writeUint64(outId);
911 if (result != NO_ERROR) {
916 case GET_CONSUMER_USAGE: {
917 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
918 uint64_t outUsage = 0;
919 status_t actualResult = getConsumerUsage(&outUsage);
920 status_t result = reply->writeInt32(actualResult);
921 if (result != NO_ERROR) {
924 result = reply->writeUint64(outUsage);
925 if (result != NO_ERROR) {
931 return BBinder::onTransact(code, data, reply, flags);
934 // ----------------------------------------------------------------------------
936 IGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) {
940 constexpr size_t IGraphicBufferProducer::QueueBufferInput::minFlattenedSize() {
941 return sizeof(timestamp) +
942 sizeof(isAutoTimestamp) +
945 sizeof(scalingMode) +
947 sizeof(stickyTransform) +
948 sizeof(getFrameTimestamps);
951 size_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const {
952 return minFlattenedSize() +
953 fence->getFlattenedSize() +
954 surfaceDamage.getFlattenedSize();
957 size_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const {
958 return fence->getFdCount();
961 status_t IGraphicBufferProducer::QueueBufferInput::flatten(
962 void*& buffer, size_t& size, int*& fds, size_t& count) const
964 if (size < getFlattenedSize()) {
968 FlattenableUtils::write(buffer, size, timestamp);
969 FlattenableUtils::write(buffer, size, isAutoTimestamp);
970 FlattenableUtils::write(buffer, size, dataSpace);
971 FlattenableUtils::write(buffer, size, crop);
972 FlattenableUtils::write(buffer, size, scalingMode);
973 FlattenableUtils::write(buffer, size, transform);
974 FlattenableUtils::write(buffer, size, stickyTransform);
975 FlattenableUtils::write(buffer, size, getFrameTimestamps);
977 status_t result = fence->flatten(buffer, size, fds, count);
978 if (result != NO_ERROR) {
981 return surfaceDamage.flatten(buffer, size);
984 status_t IGraphicBufferProducer::QueueBufferInput::unflatten(
985 void const*& buffer, size_t& size, int const*& fds, size_t& count)
987 if (size < minFlattenedSize()) {
991 FlattenableUtils::read(buffer, size, timestamp);
992 FlattenableUtils::read(buffer, size, isAutoTimestamp);
993 FlattenableUtils::read(buffer, size, dataSpace);
994 FlattenableUtils::read(buffer, size, crop);
995 FlattenableUtils::read(buffer, size, scalingMode);
996 FlattenableUtils::read(buffer, size, transform);
997 FlattenableUtils::read(buffer, size, stickyTransform);
998 FlattenableUtils::read(buffer, size, getFrameTimestamps);
1000 fence = new Fence();
1001 status_t result = fence->unflatten(buffer, size, fds, count);
1002 if (result != NO_ERROR) {
1005 return surfaceDamage.unflatten(buffer, size);
1008 // ----------------------------------------------------------------------------
1009 constexpr size_t IGraphicBufferProducer::QueueBufferOutput::minFlattenedSize() {
1010 return sizeof(width) +
1012 sizeof(transformHint) +
1013 sizeof(numPendingBuffers) +
1014 sizeof(nextFrameNumber) +
1015 sizeof(bufferReplaced);
1018 size_t IGraphicBufferProducer::QueueBufferOutput::getFlattenedSize() const {
1019 return minFlattenedSize() + frameTimestamps.getFlattenedSize();
1022 size_t IGraphicBufferProducer::QueueBufferOutput::getFdCount() const {
1023 return frameTimestamps.getFdCount();
1026 status_t IGraphicBufferProducer::QueueBufferOutput::flatten(
1027 void*& buffer, size_t& size, int*& fds, size_t& count) const
1029 if (size < getFlattenedSize()) {
1033 FlattenableUtils::write(buffer, size, width);
1034 FlattenableUtils::write(buffer, size, height);
1035 FlattenableUtils::write(buffer, size, transformHint);
1036 FlattenableUtils::write(buffer, size, numPendingBuffers);
1037 FlattenableUtils::write(buffer, size, nextFrameNumber);
1038 FlattenableUtils::write(buffer, size, bufferReplaced);
1040 return frameTimestamps.flatten(buffer, size, fds, count);
1043 status_t IGraphicBufferProducer::QueueBufferOutput::unflatten(
1044 void const*& buffer, size_t& size, int const*& fds, size_t& count)
1046 if (size < minFlattenedSize()) {
1050 FlattenableUtils::read(buffer, size, width);
1051 FlattenableUtils::read(buffer, size, height);
1052 FlattenableUtils::read(buffer, size, transformHint);
1053 FlattenableUtils::read(buffer, size, numPendingBuffers);
1054 FlattenableUtils::read(buffer, size, nextFrameNumber);
1055 FlattenableUtils::read(buffer, size, bufferReplaced);
1057 return frameTimestamps.unflatten(buffer, size, fds, count);
1060 }; // namespace android