18ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis/* 28ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * Copyright (C) 2010 The Android Open Source Project 38ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * 48ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * Licensed under the Apache License, Version 2.0 (the "License"); 58ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * you may not use this file except in compliance with the License. 68ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * You may obtain a copy of the License at 78ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * 88ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * http://www.apache.org/licenses/LICENSE-2.0 98ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * 108ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * Unless required by applicable law or agreed to in writing, software 118ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * distributed under the License is distributed on an "AS IS" BASIS, 128ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * See the License for the specific language governing permissions and 148ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis * limitations under the License. 158ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis */ 168ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 178ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <stdint.h> 188ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <sys/types.h> 198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 208ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <utils/Errors.h> 21399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/NativeHandle.h> 228ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <utils/RefBase.h> 23175a7206c5aea70236b916d7707ab25025eb9cd6Brian Anderson#include <utils/String8.h> 248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <utils/Timers.h> 25399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/Vector.h> 268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <binder/Parcel.h> 288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <binder/IInterface.h> 298ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 30f5f36c75527b1924ef8cb5cb66eb745dd27a0fc6Jiwen 'Steve' Cai#ifndef NO_BUFFERHUB 31c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai#include <gui/BufferHubProducer.h> 32f5f36c75527b1924ef8cb5cb66eb745dd27a0fc6Jiwen 'Steve' Cai#endif 33c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu#include <gui/BufferQueueDefs.h> 342adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden#include <gui/IGraphicBufferProducer.h> 35f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza#include <gui/IProducerListener.h> 368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 376e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa#include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h> 386e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 398ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisnamespace android { 408ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------------- 418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 426e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasausing ::android::hardware::graphics::bufferqueue::V1_0::utils:: 436e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa H2BGraphicBufferProducer; 446e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 458ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisenum { 468ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis REQUEST_BUFFER = IBinder::FIRST_CALL_TRANSACTION, 478ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis DEQUEUE_BUFFER, 489f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza DETACH_BUFFER, 49d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza DETACH_NEXT_BUFFER, 509f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza ATTACH_BUFFER, 518ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis QUEUE_BUFFER, 528ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis CANCEL_BUFFER, 53eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian QUERY, 54fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis CONNECT, 55fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis DISCONNECT, 56399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall SET_SIDEBAND_STREAM, 5729a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza ALLOCATE_BUFFERS, 589de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza ALLOW_ALLOCATION, 59812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza SET_GENERATION_NUMBER, 60c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza GET_CONSUMER_NAME, 61fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos SET_MAX_DEQUEUED_BUFFER_COUNT, 627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza SET_ASYNC_MODE, 633559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos SET_SHARED_BUFFER_MODE, 64ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos SET_AUTO_REFRESH, 65127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza SET_DEQUEUE_TIMEOUT, 6650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza GET_LAST_QUEUED_BUFFER, 67fc35258c9dd71b68dc278fa0c9220d74fd643f31Pablo Ceballos GET_FRAME_TIMESTAMPS, 68e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu GET_UNIQUE_ID, 69e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu GET_CONSUMER_USAGE, 708ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; 718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 722adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenclass BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer> 738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennispublic: 75e2347b7953f70232541bdc1b392230d6231aaeb9Chih-Hung Hsieh explicit BpGraphicBufferProducer(const sp<IBinder>& impl) 762adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden : BpInterface<IGraphicBufferProducer>(impl) 778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis { 788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 798ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 80ca0385170e75244f0c4f7cfec4f47ba1c0307176Yi Kong ~BpGraphicBufferProducer() override; 813be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza 827b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) { 838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 842adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(bufferIdx); 868a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result =remote()->transact(REQUEST_BUFFER, data, &reply); 878a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 888a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 898a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 908ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis bool nonNull = reply.readInt32(); 918ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis if (nonNull) { 927b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis *buf = new GraphicBuffer(); 932aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu result = reply.read(**buf); 942aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu if(result != NO_ERROR) { 952aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu (*buf).clear(); 962aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu return result; 972aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu } 988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 998a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 1007b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis return result; 1018ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 1028ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 103fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos virtual status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) { 104fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos Parcel data, reply; 105fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data.writeInterfaceToken( 106fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 107fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data.writeInt32(maxDequeuedBuffers); 108fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos status_t result = remote()->transact(SET_MAX_DEQUEUED_BUFFER_COUNT, 109fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data, &reply); 110fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos if (result != NO_ERROR) { 111fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return result; 112fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 113fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos result = reply.readInt32(); 114fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return result; 115fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 116fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos 117fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos virtual status_t setAsyncMode(bool async) { 118fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos Parcel data, reply; 119fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data.writeInterfaceToken( 120fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 121fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data.writeInt32(async); 122fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos status_t result = remote()->transact(SET_ASYNC_MODE, 123fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data, &reply); 124fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos if (result != NO_ERROR) { 125fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return result; 126fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 127fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos result = reply.readInt32(); 128fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return result; 129fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 130fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos 131a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott virtual status_t dequeueBuffer(int* buf, sp<Fence>* fence, uint32_t width, uint32_t height, 132a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott PixelFormat format, uint64_t usage, uint64_t* outBufferAge, 133a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott FrameEventHistoryDelta* outTimestamps) { 1348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 1357c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson bool getFrameTimestamps = (outTimestamps != nullptr); 136baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 1372adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1383be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(width); 1393be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(height); 1403be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeInt32(static_cast<int32_t>(format)); 141cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian data.writeUint64(usage); 1427c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson data.writeBool(getFrameTimestamps); 143baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 1448a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply); 1458a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 1468a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 1478a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 148baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 1498ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis *buf = reply.readInt32(); 150baaad32cd582bcc09db89135715717234ea398eaBrian Anderson *fence = new Fence(); 151baaad32cd582bcc09db89135715717234ea398eaBrian Anderson result = reply.read(**fence); 152baaad32cd582bcc09db89135715717234ea398eaBrian Anderson if (result != NO_ERROR) { 153baaad32cd582bcc09db89135715717234ea398eaBrian Anderson fence->clear(); 154baaad32cd582bcc09db89135715717234ea398eaBrian Anderson return result; 155f78575400977f644cf0b12beb2fa5fc278b6ed4cJesse Hall } 156a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott if (outBufferAge) { 157a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott result = reply.readUint64(outBufferAge); 158a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott } else { 159a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott // Read the value even if outBufferAge is nullptr: 160a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott uint64_t bufferAge; 161a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott result = reply.readUint64(&bufferAge); 162a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott } 163a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott if (result != NO_ERROR) { 164a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott ALOGE("IGBP::dequeueBuffer failed to read buffer age: %d", result); 165a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott return result; 166a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott } 1677c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson if (getFrameTimestamps) { 1687c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson result = reply.read(*outTimestamps); 1697c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson if (result != NO_ERROR) { 1707c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson ALOGE("IGBP::dequeueBuffer failed to read timestamps: %d", 1717c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson result); 1727c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return result; 1737c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson } 1747c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson } 1758a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 1768ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return result; 1778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 1788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1799f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza virtual status_t detachBuffer(int slot) { 1809f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza Parcel data, reply; 1819f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1829f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInt32(slot); 1839f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza status_t result = remote()->transact(DETACH_BUFFER, data, &reply); 1849f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza if (result != NO_ERROR) { 1859f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1869f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 1879f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza result = reply.readInt32(); 1889f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1899f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 1909f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 191d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer, 192d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<Fence>* outFence) { 193d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (outBuffer == NULL) { 194d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza ALOGE("detachNextBuffer: outBuffer must not be NULL"); 195d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return BAD_VALUE; 196d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } else if (outFence == NULL) { 197d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza ALOGE("detachNextBuffer: outFence must not be NULL"); 198d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return BAD_VALUE; 199d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 200d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza Parcel data, reply; 201d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 202d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply); 203d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result != NO_ERROR) { 204d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return result; 205d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 206d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza result = reply.readInt32(); 207d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result == NO_ERROR) { 208d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza bool nonNull = reply.readInt32(); 209d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (nonNull) { 210d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza *outBuffer = new GraphicBuffer; 21170636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos result = reply.read(**outBuffer); 21270636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos if (result != NO_ERROR) { 21370636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos outBuffer->clear(); 21470636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos return result; 21570636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos } 216d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 217d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza nonNull = reply.readInt32(); 218d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (nonNull) { 219d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza *outFence = new Fence; 22070636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos result = reply.read(**outFence); 22170636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos if (result != NO_ERROR) { 22270636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos outBuffer->clear(); 22370636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos outFence->clear(); 22470636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos return result; 22570636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos } 226d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 227d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 228d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return result; 229d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 230d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza 2319f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) { 2329f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza Parcel data, reply; 2339f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 2349f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.write(*buffer.get()); 2359f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza status_t result = remote()->transact(ATTACH_BUFFER, data, &reply); 2369f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza if (result != NO_ERROR) { 2379f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 2389f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 239c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu 2409f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza *slot = reply.readInt32(); 2419f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza result = reply.readInt32(); 242c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu if (result == NO_ERROR && 243c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu (*slot < 0 || *slot >= BufferQueueDefs::NUM_BUFFER_SLOTS)) { 244c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu ALOGE("attachBuffer returned invalid slot %d", *slot); 245c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu android_errorWriteLog(0x534e4554, "37478824"); 246c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu return UNKNOWN_ERROR; 247c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu } 248c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu 2499f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 2509f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 2519f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 252f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian virtual status_t queueBuffer(int buf, 253f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian const QueueBufferInput& input, QueueBufferOutput* output) { 2548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 255baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 2562adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 2578ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(buf); 258c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall data.write(input); 259baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 2608a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(QUEUE_BUFFER, data, &reply); 2618a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2628a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2638a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 264baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 265baaad32cd582bcc09db89135715717234ea398eaBrian Anderson result = reply.read(*output); 266baaad32cd582bcc09db89135715717234ea398eaBrian Anderson if (result != NO_ERROR) { 267baaad32cd582bcc09db89135715717234ea398eaBrian Anderson return result; 268baaad32cd582bcc09db89135715717234ea398eaBrian Anderson } 269baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 2708a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 2718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return result; 2728ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 2738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 274583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos virtual status_t cancelBuffer(int buf, const sp<Fence>& fence) { 2758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 2762adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 2778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(buf); 2781df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis data.write(*fence.get()); 279583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos status_t result = remote()->transact(CANCEL_BUFFER, data, &reply); 280583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos if (result != NO_ERROR) { 281583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos return result; 282583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos } 283583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos result = reply.readInt32(); 284583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos return result; 2858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 2868ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 287eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian virtual int query(int what, int* value) { 288eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian Parcel data, reply; 2892adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 290eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian data.writeInt32(what); 2918a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(QUERY, data, &reply); 2928a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2938a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2948a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 295eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian value[0] = reply.readInt32(); 2968a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 297eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian return result; 298eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian } 299eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian 300f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza virtual status_t connect(const sp<IProducerListener>& listener, 301365857df8b94c959dea984a63013f6e7730ef976Mathias Agopian int api, bool producerControlledByApp, QueueBufferOutput* output) { 302fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis Parcel data, reply; 3032adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 304f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza if (listener != NULL) { 305f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza data.writeInt32(1); 306097ca275f4717a2c47a5d49f302ed2b72c8a1370Marco Nelissen data.writeStrongBinder(IInterface::asBinder(listener)); 307f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } else { 308f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza data.writeInt32(0); 309f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } 310fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis data.writeInt32(api); 311595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian data.writeInt32(producerControlledByApp); 3128a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(CONNECT, data, &reply); 3138a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 3148a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 3158a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 316baaad32cd582bcc09db89135715717234ea398eaBrian Anderson reply.read(*output); 3178a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 318fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return result; 319fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis } 3208072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian 32197b9c86338e2d364d47ea7522c2d81a8014f0e07Robert Carr virtual status_t disconnect(int api, DisconnectMode mode) { 322fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis Parcel data, reply; 3232adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 324fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis data.writeInt32(api); 32597b9c86338e2d364d47ea7522c2d81a8014f0e07Robert Carr data.writeInt32(static_cast<int32_t>(mode)); 3268a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result =remote()->transact(DISCONNECT, data, &reply); 3278a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 3288a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 3298a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 3308a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 331fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return result; 332fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis } 333399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 334399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall virtual status_t setSidebandStream(const sp<NativeHandle>& stream) { 335399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall Parcel data, reply; 336399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall status_t result; 337399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 338399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (stream.get()) { 339399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInt32(true); 340399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeNativeHandle(stream->handle()); 341399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } else { 342399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInt32(false); 343399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 344399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) { 345399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall result = reply.readInt32(); 346399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 347399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall return result; 348399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 34929a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza 350567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos virtual void allocateBuffers(uint32_t width, uint32_t height, 351cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian PixelFormat format, uint64_t usage) { 35229a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza Parcel data, reply; 35329a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 3543be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(width); 3553be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(height); 35629a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza data.writeInt32(static_cast<int32_t>(format)); 357cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian data.writeUint64(usage); 35829a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply); 35929a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza if (result != NO_ERROR) { 36029a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza ALOGE("allocateBuffers failed to transact: %d", result); 36129a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza } 36229a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza } 3639de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza 3649de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza virtual status_t allowAllocation(bool allow) { 3659de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza Parcel data, reply; 3669de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 3679de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza data.writeInt32(static_cast<int32_t>(allow)); 3689de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza status_t result = remote()->transact(ALLOW_ALLOCATION, data, &reply); 3699de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza if (result != NO_ERROR) { 3709de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza return result; 3719de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 3729de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza result = reply.readInt32(); 3739de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza return result; 3749de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 375812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza 376812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza virtual status_t setGenerationNumber(uint32_t generationNumber) { 377812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza Parcel data, reply; 378812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 379812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza data.writeUint32(generationNumber); 380812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza status_t result = remote()->transact(SET_GENERATION_NUMBER, data, &reply); 381812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza if (result == NO_ERROR) { 382812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza result = reply.readInt32(); 383812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza } 384812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza return result; 385812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza } 386c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza 387c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza virtual String8 getConsumerName() const { 388c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza Parcel data, reply; 389c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 390c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza status_t result = remote()->transact(GET_CONSUMER_NAME, data, &reply); 391c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza if (result != NO_ERROR) { 392c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza ALOGE("getConsumerName failed to transact: %d", result); 393c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza return String8("TransactFailed"); 394c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza } 395c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza return reply.readString8(); 396c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza } 3977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 3983559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos virtual status_t setSharedBufferMode(bool sharedBufferMode) { 399ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos Parcel data, reply; 400ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos data.writeInterfaceToken( 401ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 4023559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos data.writeInt32(sharedBufferMode); 4033559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos status_t result = remote()->transact(SET_SHARED_BUFFER_MODE, data, 404ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos &reply); 405ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos if (result == NO_ERROR) { 406ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos result = reply.readInt32(); 407ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos } 408ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos return result; 409ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos } 410127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza 411ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos virtual status_t setAutoRefresh(bool autoRefresh) { 412ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos Parcel data, reply; 413ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos data.writeInterfaceToken( 414ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 415ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos data.writeInt32(autoRefresh); 416ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos status_t result = remote()->transact(SET_AUTO_REFRESH, data, &reply); 417ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos if (result == NO_ERROR) { 418ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos result = reply.readInt32(); 419ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos } 420ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos return result; 421ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos } 422ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos 423127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza virtual status_t setDequeueTimeout(nsecs_t timeout) { 424127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza Parcel data, reply; 425127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 426127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza data.writeInt64(timeout); 427127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza status_t result = remote()->transact(SET_DEQUEUE_TIMEOUT, data, &reply); 428127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza if (result != NO_ERROR) { 429127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza ALOGE("setDequeueTimeout failed to transact: %d", result); 430127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza return result; 431127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza } 432127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza return reply.readInt32(); 433127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza } 43450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza 43550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, 4361a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck sp<Fence>* outFence, float outTransformMatrix[16]) override { 43750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza Parcel data, reply; 43850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 43950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER, data, 44050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza &reply); 44150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 44250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to transact: %d", result); 44350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 44450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 44550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza result = reply.readInt32(); 44650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 44750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 44850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 449ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck bool hasBuffer = reply.readBool(); 450ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck sp<GraphicBuffer> buffer; 451ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck if (hasBuffer) { 452ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck buffer = new GraphicBuffer(); 453ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck result = reply.read(*buffer); 4541a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck if (result == NO_ERROR) { 4551a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck result = reply.read(outTransformMatrix, sizeof(float) * 16); 4561a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck } 457ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck } 45850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 45950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to read buffer: %d", result); 46050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 46150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 46250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza sp<Fence> fence(new Fence); 46350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza result = reply.read(*fence); 46450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 46550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to read fence: %d", result); 46650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 46750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 46850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza *outBuffer = buffer; 46950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza *outFence = fence; 47050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 47150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 472ce796e78a57018f186b062199c75d94545318acaPablo Ceballos 4733890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson virtual void getFrameTimestamps(FrameEventHistoryDelta* outDelta) { 474ce796e78a57018f186b062199c75d94545318acaPablo Ceballos Parcel data, reply; 475ce796e78a57018f186b062199c75d94545318acaPablo Ceballos status_t result = data.writeInterfaceToken( 476ce796e78a57018f186b062199c75d94545318acaPablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 477ce796e78a57018f186b062199c75d94545318acaPablo Ceballos if (result != NO_ERROR) { 4783890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson ALOGE("IGBP::getFrameTimestamps failed to write token: %d", result); 4793890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson return; 480ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 481ce796e78a57018f186b062199c75d94545318acaPablo Ceballos result = remote()->transact(GET_FRAME_TIMESTAMPS, data, &reply); 482ce796e78a57018f186b062199c75d94545318acaPablo Ceballos if (result != NO_ERROR) { 4833890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson ALOGE("IGBP::getFrameTimestamps failed to transact: %d", result); 4843890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson return; 485ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 4863890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson result = reply.read(*outDelta); 487ce796e78a57018f186b062199c75d94545318acaPablo Ceballos if (result != NO_ERROR) { 4883890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson ALOGE("IGBP::getFrameTimestamps failed to read timestamps: %d", 4893890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson result); 490ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 491ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 4926155b40830e7945e9d4a76fe89af9a6322d4977fPablo Ceballos 4938e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos virtual status_t getUniqueId(uint64_t* outId) const { 4948e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos Parcel data, reply; 4958e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 4968e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos status_t result = remote()->transact(GET_UNIQUE_ID, data, &reply); 4978e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos if (result != NO_ERROR) { 4988e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos ALOGE("getUniqueId failed to transact: %d", result); 4998e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 5008e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos status_t actualResult = NO_ERROR; 5018e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos result = reply.readInt32(&actualResult); 5028e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos if (result != NO_ERROR) { 5038e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return result; 5048e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 5058e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos result = reply.readUint64(outId); 5068e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos if (result != NO_ERROR) { 5078e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return result; 5088e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 5098e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return actualResult; 5108e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 511e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu 512e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu virtual status_t getConsumerUsage(uint64_t* outUsage) const { 513e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu Parcel data, reply; 514e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 515e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu status_t result = remote()->transact(GET_CONSUMER_USAGE, data, &reply); 516e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu if (result != NO_ERROR) { 517e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu ALOGE("getConsumerUsage failed to transact: %d", result); 518e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu } 519e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu status_t actualResult = NO_ERROR; 520e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu result = reply.readInt32(&actualResult); 521e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu if (result != NO_ERROR) { 522e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu return result; 523e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu } 524e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu result = reply.readUint64(outUsage); 525e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu if (result != NO_ERROR) { 526e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu return result; 527e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu } 528e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu return actualResult; 529e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu } 5308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; 5318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 5323be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza// Out-of-line virtual method definition to trigger vtable emission in this 5333be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza// translation unit (see clang warning -Wweak-vtables) 5343be1c6b60a188dc10025e2ce156c11fac050625dDan StozaBpGraphicBufferProducer::~BpGraphicBufferProducer() {} 5353be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza 5366e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasaclass HpGraphicBufferProducer : public HpInterface< 5376e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa BpGraphicBufferProducer, H2BGraphicBufferProducer> { 5386e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasapublic: 5396e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa HpGraphicBufferProducer(const sp<IBinder>& base) : PBase(base) {} 5406e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5416e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) override { 5426e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->requestBuffer(slot, buf); 5436e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5446e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5456e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) override { 5466e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->setMaxDequeuedBufferCount(maxDequeuedBuffers); 5476e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5486e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5496e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t setAsyncMode(bool async) override { 5506e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->setAsyncMode(async); 5516e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5526e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 553a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott status_t dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w, uint32_t h, PixelFormat format, 554a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott uint64_t usage, uint64_t* outBufferAge, 555a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott FrameEventHistoryDelta* outTimestamps) override { 556a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott return mBase->dequeueBuffer(slot, fence, w, h, format, usage, outBufferAge, outTimestamps); 5576e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5586e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5596e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t detachBuffer(int slot) override { 5606e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->detachBuffer(slot); 5616e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5626e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5636e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t detachNextBuffer( 5646e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) override { 5656e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->detachNextBuffer(outBuffer, outFence); 5666e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5676e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5686e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t attachBuffer( 5696e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa int* outSlot, const sp<GraphicBuffer>& buffer) override { 5706e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->attachBuffer(outSlot, buffer); 5716e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5726e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5736e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t queueBuffer( 5746e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa int slot, 5756e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa const QueueBufferInput& input, 5766e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa QueueBufferOutput* output) override { 5776e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->queueBuffer(slot, input, output); 5786e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5796e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5806e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t cancelBuffer(int slot, const sp<Fence>& fence) override { 5816e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->cancelBuffer(slot, fence); 5826e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5836e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5846e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa int query(int what, int* value) override { 5856e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->query(what, value); 5866e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5876e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5886e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t connect( 5896e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa const sp<IProducerListener>& listener, 5906e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa int api, bool producerControlledByApp, 5916e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa QueueBufferOutput* output) override { 5926e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->connect(listener, api, producerControlledByApp, output); 5936e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5946e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5956e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t disconnect( 5966e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa int api, DisconnectMode mode = DisconnectMode::Api) override { 5976e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->disconnect(api, mode); 5986e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5996e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6006e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t setSidebandStream(const sp<NativeHandle>& stream) override { 6016e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->setSidebandStream(stream); 6026e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6036e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6046e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa void allocateBuffers(uint32_t width, uint32_t height, 605cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian PixelFormat format, uint64_t usage) override { 6066e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->allocateBuffers(width, height, format, usage); 6076e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6086e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6096e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t allowAllocation(bool allow) override { 6106e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->allowAllocation(allow); 6116e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6126e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6136e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t setGenerationNumber(uint32_t generationNumber) override { 6146e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->setGenerationNumber(generationNumber); 6156e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6166e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6176e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa String8 getConsumerName() const override { 6186e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->getConsumerName(); 6196e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6206e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6216e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t setSharedBufferMode(bool sharedBufferMode) override { 6226e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->setSharedBufferMode(sharedBufferMode); 6236e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6246e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6256e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t setAutoRefresh(bool autoRefresh) override { 6266e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->setAutoRefresh(autoRefresh); 6276e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6286e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6296e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t setDequeueTimeout(nsecs_t timeout) override { 6306e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->setDequeueTimeout(timeout); 6316e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6326e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6336e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t getLastQueuedBuffer( 6346e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa sp<GraphicBuffer>* outBuffer, 6356e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa sp<Fence>* outFence, 6366e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa float outTransformMatrix[16]) override { 6376e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->getLastQueuedBuffer( 6386e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa outBuffer, outFence, outTransformMatrix); 6396e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6406e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6416e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa void getFrameTimestamps(FrameEventHistoryDelta* outDelta) override { 6426e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->getFrameTimestamps(outDelta); 6436e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6446e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6456e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t getUniqueId(uint64_t* outId) const override { 6466e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->getUniqueId(outId); 6476e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 648e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu 649e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu status_t getConsumerUsage(uint64_t* outUsage) const override { 650e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu return mBase->getConsumerUsage(outUsage); 651e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu } 6526e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa}; 6536e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6546e1193af40c870c50013affec37c8429986b3c7bPawin VongmasaIMPLEMENT_HYBRID_META_INTERFACE(GraphicBufferProducer, HGraphicBufferProducer, 6556e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa "android.gui.IGraphicBufferProducer"); 6568ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 6578ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------- 6588ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 659c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caistatus_t IGraphicBufferProducer::exportToParcel(Parcel* parcel) { 660c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai status_t res = OK; 661c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai res = parcel->writeUint32(USE_BUFFER_QUEUE); 662c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai if (res != NO_ERROR) { 663c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai ALOGE("exportToParcel: Cannot write magic, res=%d.", res); 664c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai return res; 665c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai } 666c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai 667c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai return parcel->writeStrongBinder(IInterface::asBinder(this)); 668c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai} 669c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai 670c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai/* static */ 671c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caistatus_t IGraphicBufferProducer::exportToParcel(const sp<IGraphicBufferProducer>& producer, 672c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai Parcel* parcel) { 673c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai if (parcel == nullptr) { 674c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai ALOGE("exportToParcel: Invalid parcel object."); 675c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai return BAD_VALUE; 676c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai } 677c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai 678c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai if (producer == nullptr) { 679c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai status_t res = OK; 680c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai res = parcel->writeUint32(IGraphicBufferProducer::USE_BUFFER_QUEUE); 681c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai if (res != NO_ERROR) return res; 682c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai return parcel->writeStrongBinder(nullptr); 683c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai } else { 684c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai return producer->exportToParcel(parcel); 685c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai } 686c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai} 687c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai 688c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai/* static */ 689c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caisp<IGraphicBufferProducer> IGraphicBufferProducer::createFromParcel(const Parcel* parcel) { 690c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai uint32_t outMagic = 0; 691c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai status_t res = NO_ERROR; 692c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai 693c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai res = parcel->readUint32(&outMagic); 694c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai if (res != NO_ERROR) { 695c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai ALOGE("createFromParcel: Failed to read magic, error=%d.", res); 696c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai return nullptr; 697c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai } 698c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai 699c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai switch (outMagic) { 700c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai case USE_BUFFER_QUEUE: { 701c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai sp<IBinder> binder; 702c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai res = parcel->readNullableStrongBinder(&binder); 703c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai if (res != NO_ERROR) { 704c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai ALOGE("createFromParcel: Can't read strong binder."); 705c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai return nullptr; 706c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai } 707c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai return interface_cast<IGraphicBufferProducer>(binder); 708c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai } 709c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai case USE_BUFFER_HUB: { 710c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai ALOGE("createFromParcel: BufferHub not implemented."); 711f5f36c75527b1924ef8cb5cb66eb745dd27a0fc6Jiwen 'Steve' Cai#ifndef NO_BUFFERHUB 712c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai dvr::ProducerQueueParcelable producerParcelable; 713c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai res = producerParcelable.readFromParcel(parcel); 714c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai if (res != NO_ERROR) { 715c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai ALOGE("createFromParcel: Failed to read from parcel, error=%d", res); 716c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai return nullptr; 717c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai } 718c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai return BufferHubProducer::Create(std::move(producerParcelable)); 719f5f36c75527b1924ef8cb5cb66eb745dd27a0fc6Jiwen 'Steve' Cai#else 720f5f36c75527b1924ef8cb5cb66eb745dd27a0fc6Jiwen 'Steve' Cai return nullptr; 721f5f36c75527b1924ef8cb5cb66eb745dd27a0fc6Jiwen 'Steve' Cai#endif 722c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai } 723c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai default: { 724c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai ALOGE("createFromParcel: Unexpected mgaic: 0x%x.", outMagic); 725c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai return nullptr; 726c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai } 727c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai } 728c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai} 729c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai 730c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai// ---------------------------------------------------------------------------- 731c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai 7322adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenstatus_t BnGraphicBufferProducer::onTransact( 7338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 7348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 7358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis switch(code) { 7368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case REQUEST_BUFFER: { 7372adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 7388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int bufferIdx = data.readInt32(); 7397b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis sp<GraphicBuffer> buffer; 7407b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis int result = requestBuffer(bufferIdx, &buffer); 7418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(buffer != 0); 7428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis if (buffer != 0) { 7438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->write(*buffer); 7448ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 7457b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis reply->writeInt32(result); 7468ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 7473be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 748fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos case SET_MAX_DEQUEUED_BUFFER_COUNT: { 749fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 750fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos int maxDequeuedBuffers = data.readInt32(); 751fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos int result = setMaxDequeuedBufferCount(maxDequeuedBuffers); 752fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos reply->writeInt32(result); 753fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return NO_ERROR; 754fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 755fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos case SET_ASYNC_MODE: { 756fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 757fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos bool async = data.readInt32(); 758fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos int result = setAsyncMode(async); 759fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos reply->writeInt32(result); 760fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return NO_ERROR; 761fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 7628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case DEQUEUE_BUFFER: { 7632adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 7643be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t width = data.readUint32(); 7653be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t height = data.readUint32(); 7663be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza PixelFormat format = static_cast<PixelFormat>(data.readInt32()); 767cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian uint64_t usage = data.readUint64(); 768a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott uint64_t bufferAge = 0; 7697c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson bool getTimestamps = data.readBool(); 770baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 77112ba0f57d028a9c8f4eb3afddc326b70677d1e0cNaveen Leekha int buf = 0; 772baaad32cd582bcc09db89135715717234ea398eaBrian Anderson sp<Fence> fence = Fence::NO_FENCE; 7737c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson FrameEventHistoryDelta frameTimestamps; 774a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott int result = dequeueBuffer(&buf, &fence, width, height, format, usage, &bufferAge, 775a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott getTimestamps ? &frameTimestamps : nullptr); 776baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 7778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(buf); 778baaad32cd582bcc09db89135715717234ea398eaBrian Anderson reply->write(*fence); 779a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott reply->writeUint64(bufferAge); 7807c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson if (getTimestamps) { 7817c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson reply->write(frameTimestamps); 7827c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson } 7838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(result); 7849f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return NO_ERROR; 7853be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 7869f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza case DETACH_BUFFER: { 7879f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 7889f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int slot = data.readInt32(); 7899f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int result = detachBuffer(slot); 7909f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(result); 7919f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return NO_ERROR; 7923be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 793d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza case DETACH_NEXT_BUFFER: { 794d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 795d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<GraphicBuffer> buffer; 796d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<Fence> fence; 797d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza int32_t result = detachNextBuffer(&buffer, &fence); 798d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(result); 799d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result == NO_ERROR) { 800d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(buffer != NULL); 801d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (buffer != NULL) { 802d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->write(*buffer); 803d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 804d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(fence != NULL); 805d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (fence != NULL) { 806d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->write(*fence); 807d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 808d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 809d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return NO_ERROR; 8103be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 8119f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza case ATTACH_BUFFER: { 8129f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 8139f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza sp<GraphicBuffer> buffer = new GraphicBuffer(); 81470636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos status_t result = data.read(*buffer.get()); 81512ba0f57d028a9c8f4eb3afddc326b70677d1e0cNaveen Leekha int slot = 0; 81670636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos if (result == NO_ERROR) { 81770636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos result = attachBuffer(&slot, buffer); 81870636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos } 8199f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(slot); 8209f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(result); 8218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 8223be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 8238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case QUEUE_BUFFER: { 8242adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 8257c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 8268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int buf = data.readInt32(); 827c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall QueueBufferInput input(data); 828baaad32cd582bcc09db89135715717234ea398eaBrian Anderson QueueBufferOutput output; 829baaad32cd582bcc09db89135715717234ea398eaBrian Anderson status_t result = queueBuffer(buf, input, &output); 830baaad32cd582bcc09db89135715717234ea398eaBrian Anderson reply->write(output); 8318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(result); 8327c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 8338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 8343be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 8358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case CANCEL_BUFFER: { 8362adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 8378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int buf = data.readInt32(); 8381df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis sp<Fence> fence = new Fence(); 83970636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos status_t result = data.read(*fence.get()); 84070636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos if (result == NO_ERROR) { 84170636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos result = cancelBuffer(buf, fence); 84270636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos } 843583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos reply->writeInt32(result); 8448ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 8453be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 846eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian case QUERY: { 8472adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 84812ba0f57d028a9c8f4eb3afddc326b70677d1e0cNaveen Leekha int value = 0; 849eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian int what = data.readInt32(); 850eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian int res = query(what, &value); 851eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian reply->writeInt32(value); 852eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian reply->writeInt32(res); 853eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian return NO_ERROR; 8543be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 855fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis case CONNECT: { 8562adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 857f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza sp<IProducerListener> listener; 858f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza if (data.readInt32() == 1) { 859f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza listener = IProducerListener::asInterface(data.readStrongBinder()); 860f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } 861fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis int api = data.readInt32(); 862595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian bool producerControlledByApp = data.readInt32(); 863baaad32cd582bcc09db89135715717234ea398eaBrian Anderson QueueBufferOutput output; 864baaad32cd582bcc09db89135715717234ea398eaBrian Anderson status_t res = connect(listener, api, producerControlledByApp, &output); 865baaad32cd582bcc09db89135715717234ea398eaBrian Anderson reply->write(output); 866fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis reply->writeInt32(res); 867fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return NO_ERROR; 8683be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 869fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis case DISCONNECT: { 8702adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 871fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis int api = data.readInt32(); 87297b9c86338e2d364d47ea7522c2d81a8014f0e07Robert Carr DisconnectMode mode = static_cast<DisconnectMode>(data.readInt32()); 87397b9c86338e2d364d47ea7522c2d81a8014f0e07Robert Carr status_t res = disconnect(api, mode); 874fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis reply->writeInt32(res); 875fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return NO_ERROR; 8763be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 877399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall case SET_SIDEBAND_STREAM: { 878399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 879399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall sp<NativeHandle> stream; 880399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (data.readInt32()) { 8810ec54e156bed93d59900b742c8e9adcfaee90612Wonsik Kim stream = NativeHandle::create(data.readNativeHandle(), true); 882399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 883399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall status_t result = setSidebandStream(stream); 884399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall reply->writeInt32(result); 885399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall return NO_ERROR; 8863be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 8879de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza case ALLOCATE_BUFFERS: { 88829a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 8893be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t width = data.readUint32(); 8903be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t height = data.readUint32(); 8913be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza PixelFormat format = static_cast<PixelFormat>(data.readInt32()); 892cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian uint64_t usage = data.readUint64(); 893567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos allocateBuffers(width, height, format, usage); 89429a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza return NO_ERROR; 8959de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 8969de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza case ALLOW_ALLOCATION: { 8979de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 8989de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza bool allow = static_cast<bool>(data.readInt32()); 8999de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza status_t result = allowAllocation(allow); 9009de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza reply->writeInt32(result); 9019de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza return NO_ERROR; 9029de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 903812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza case SET_GENERATION_NUMBER: { 904812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 905812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza uint32_t generationNumber = data.readUint32(); 906812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza status_t result = setGenerationNumber(generationNumber); 907812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza reply->writeInt32(result); 908812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza return NO_ERROR; 909812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza } 910c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza case GET_CONSUMER_NAME: { 911c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 912c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza reply->writeString8(getConsumerName()); 913c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza return NO_ERROR; 914c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza } 9153559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos case SET_SHARED_BUFFER_MODE: { 916ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 9173559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos bool sharedBufferMode = data.readInt32(); 9183559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos status_t result = setSharedBufferMode(sharedBufferMode); 919ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos reply->writeInt32(result); 920ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos return NO_ERROR; 921ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos } 922ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos case SET_AUTO_REFRESH: { 923ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos CHECK_INTERFACE(IGraphicBuffer, data, reply); 924ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos bool autoRefresh = data.readInt32(); 925ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos status_t result = setAutoRefresh(autoRefresh); 926ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos reply->writeInt32(result); 927ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos return NO_ERROR; 928ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos } 929127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza case SET_DEQUEUE_TIMEOUT: { 930127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 931127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza nsecs_t timeout = data.readInt64(); 932127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza status_t result = setDequeueTimeout(timeout); 933127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza reply->writeInt32(result); 934127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza return NO_ERROR; 935127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza } 93650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza case GET_LAST_QUEUED_BUFFER: { 93750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 93850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza sp<GraphicBuffer> buffer(nullptr); 93950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza sp<Fence> fence(Fence::NO_FENCE); 9401a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck float transform[16] = {}; 9411a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck status_t result = getLastQueuedBuffer(&buffer, &fence, transform); 94250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza reply->writeInt32(result); 94350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 94450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 94550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 946ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck if (!buffer.get()) { 947ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck reply->writeBool(false); 948ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck } else { 949ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck reply->writeBool(true); 950ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck result = reply->write(*buffer); 9511a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck if (result == NO_ERROR) { 9521a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck reply->write(transform, sizeof(float) * 16); 9531a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck } 954ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck } 95550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 95650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to write buffer: %d", result); 95750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 95850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 95950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza result = reply->write(*fence); 96050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 96150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to write fence: %d", result); 96250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 96350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 96450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return NO_ERROR; 96550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 966ce796e78a57018f186b062199c75d94545318acaPablo Ceballos case GET_FRAME_TIMESTAMPS: { 967ce796e78a57018f186b062199c75d94545318acaPablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 9683890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson FrameEventHistoryDelta frameTimestamps; 9693890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson getFrameTimestamps(&frameTimestamps); 9703890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson status_t result = reply->write(frameTimestamps); 971ce796e78a57018f186b062199c75d94545318acaPablo Ceballos if (result != NO_ERROR) { 9723890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson ALOGE("BnGBP::GET_FRAME_TIMESTAMPS failed to write buffer: %d", 9733890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson result); 974ce796e78a57018f186b062199c75d94545318acaPablo Ceballos return result; 975ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 976ce796e78a57018f186b062199c75d94545318acaPablo Ceballos return NO_ERROR; 977ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 9788e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos case GET_UNIQUE_ID: { 9798e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 9808e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos uint64_t outId = 0; 9818e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos status_t actualResult = getUniqueId(&outId); 9828e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos status_t result = reply->writeInt32(actualResult); 9838e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos if (result != NO_ERROR) { 9848e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return result; 9858e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 9868e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos result = reply->writeUint64(outId); 9878e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos if (result != NO_ERROR) { 9888e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return result; 9898e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 9908e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return NO_ERROR; 9918e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 992e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu case GET_CONSUMER_USAGE: { 993e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 994e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu uint64_t outUsage = 0; 995e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu status_t actualResult = getConsumerUsage(&outUsage); 996e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu status_t result = reply->writeInt32(actualResult); 997e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu if (result != NO_ERROR) { 998e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu return result; 999e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu } 1000e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu result = reply->writeUint64(outUsage); 1001e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu if (result != NO_ERROR) { 1002e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu return result; 1003e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu } 1004e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu return NO_ERROR; 1005e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu } 10068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 10078ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return BBinder::onTransact(code, data, reply, flags); 10088ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 10098ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 10108ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------------- 10118ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 10122adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenIGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) { 1013c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall parcel.read(*this); 1014c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 1015c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 10167c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Andersonconstexpr size_t IGraphicBufferProducer::QueueBufferInput::minFlattenedSize() { 10177c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return sizeof(timestamp) + 10187c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(isAutoTimestamp) + 10197c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(dataSpace) + 10207c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(crop) + 10217c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(scalingMode) + 10227c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(transform) + 10237c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(stickyTransform) + 10247c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(getFrameTimestamps); 10257c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson} 10267c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 1027e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const { 10287c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return minFlattenedSize() + 10297c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson fence->getFlattenedSize() + 10309bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter surfaceDamage.getFlattenedSize() + 10319bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter hdrMetadata.getFlattenedSize(); 1032c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 1033c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 1034e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const { 10351df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis return fence->getFdCount(); 1036c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 1037c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 1038e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t IGraphicBufferProducer::QueueBufferInput::flatten( 1039e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian void*& buffer, size_t& size, int*& fds, size_t& count) const 1040c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall{ 1041e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < getFlattenedSize()) { 1042e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 1043e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 10447c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 1045e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, timestamp); 10463c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden FlattenableUtils::write(buffer, size, isAutoTimestamp); 104782c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala FlattenableUtils::write(buffer, size, dataSpace); 1048e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, crop); 1049e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, scalingMode); 1050e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, transform); 10511681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk FlattenableUtils::write(buffer, size, stickyTransform); 10527c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson FlattenableUtils::write(buffer, size, getFrameTimestamps); 10537c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 10545065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza status_t result = fence->flatten(buffer, size, fds, count); 10555065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza if (result != NO_ERROR) { 10565065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return result; 10575065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza } 10589bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter result = surfaceDamage.flatten(buffer, size); 10599bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter if (result != NO_ERROR) { 10609bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter return result; 10619bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter } 10629bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize()); 10639bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter return hdrMetadata.flatten(buffer, size); 1064c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 1065c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 1066e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t IGraphicBufferProducer::QueueBufferInput::unflatten( 1067e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian void const*& buffer, size_t& size, int const*& fds, size_t& count) 1068c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall{ 10697c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson if (size < minFlattenedSize()) { 1070e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 1071e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 1072e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 1073e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, timestamp); 10743c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden FlattenableUtils::read(buffer, size, isAutoTimestamp); 107582c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala FlattenableUtils::read(buffer, size, dataSpace); 1076e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, crop); 1077e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, scalingMode); 1078e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, transform); 10791681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk FlattenableUtils::read(buffer, size, stickyTransform); 10807c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson FlattenableUtils::read(buffer, size, getFrameTimestamps); 1081e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 10821df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis fence = new Fence(); 10835065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza status_t result = fence->unflatten(buffer, size, fds, count); 10845065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza if (result != NO_ERROR) { 10855065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return result; 10865065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza } 10879bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter result = surfaceDamage.unflatten(buffer, size); 10889bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter if (result != NO_ERROR) { 10899bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter return result; 10909bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter } 10919bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize()); 10929bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter return hdrMetadata.unflatten(buffer, size); 1093c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 1094c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 1095baaad32cd582bcc09db89135715717234ea398eaBrian Anderson// ---------------------------------------------------------------------------- 10967c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Andersonconstexpr size_t IGraphicBufferProducer::QueueBufferOutput::minFlattenedSize() { 10977c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return sizeof(width) + 10987c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(height) + 10997c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(transformHint) + 11007c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(numPendingBuffers) + 110122f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang sizeof(nextFrameNumber) + 110222f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang sizeof(bufferReplaced); 11037c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson} 1104baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 1105baaad32cd582bcc09db89135715717234ea398eaBrian Andersonsize_t IGraphicBufferProducer::QueueBufferOutput::getFlattenedSize() const { 11067c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return minFlattenedSize() + frameTimestamps.getFlattenedSize(); 1107baaad32cd582bcc09db89135715717234ea398eaBrian Anderson} 1108baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 1109baaad32cd582bcc09db89135715717234ea398eaBrian Andersonsize_t IGraphicBufferProducer::QueueBufferOutput::getFdCount() const { 11107c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return frameTimestamps.getFdCount(); 1111baaad32cd582bcc09db89135715717234ea398eaBrian Anderson} 1112baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 1113baaad32cd582bcc09db89135715717234ea398eaBrian Andersonstatus_t IGraphicBufferProducer::QueueBufferOutput::flatten( 11147c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson void*& buffer, size_t& size, int*& fds, size_t& count) const 1115baaad32cd582bcc09db89135715717234ea398eaBrian Anderson{ 1116baaad32cd582bcc09db89135715717234ea398eaBrian Anderson if (size < getFlattenedSize()) { 1117baaad32cd582bcc09db89135715717234ea398eaBrian Anderson return NO_MEMORY; 1118baaad32cd582bcc09db89135715717234ea398eaBrian Anderson } 11197c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 1120baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::write(buffer, size, width); 1121baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::write(buffer, size, height); 1122baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::write(buffer, size, transformHint); 1123baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::write(buffer, size, numPendingBuffers); 1124baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::write(buffer, size, nextFrameNumber); 112522f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang FlattenableUtils::write(buffer, size, bufferReplaced); 1126baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 11277c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return frameTimestamps.flatten(buffer, size, fds, count); 1128baaad32cd582bcc09db89135715717234ea398eaBrian Anderson} 1129baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 1130baaad32cd582bcc09db89135715717234ea398eaBrian Andersonstatus_t IGraphicBufferProducer::QueueBufferOutput::unflatten( 11317c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson void const*& buffer, size_t& size, int const*& fds, size_t& count) 1132baaad32cd582bcc09db89135715717234ea398eaBrian Anderson{ 11337c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson if (size < minFlattenedSize()) { 1134baaad32cd582bcc09db89135715717234ea398eaBrian Anderson return NO_MEMORY; 1135baaad32cd582bcc09db89135715717234ea398eaBrian Anderson } 11367c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 1137baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::read(buffer, size, width); 1138baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::read(buffer, size, height); 1139baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::read(buffer, size, transformHint); 1140baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::read(buffer, size, numPendingBuffers); 1141baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::read(buffer, size, nextFrameNumber); 114222f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang FlattenableUtils::read(buffer, size, bufferReplaced); 1143baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 11447c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return frameTimestamps.unflatten(buffer, size, fds, count); 1145baaad32cd582bcc09db89135715717234ea398eaBrian Anderson} 1146baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 11478ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; // namespace android 1148