IGraphicBufferProducer.cpp revision c90a77f1e5b42d8fcf336d2b9bd2259280814df2
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 30c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai#include <gui/BufferHubProducer.h> 31c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu#include <gui/BufferQueueDefs.h> 322adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden#include <gui/IGraphicBufferProducer.h> 33f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza#include <gui/IProducerListener.h> 348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 356e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa#include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h> 366e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisnamespace android { 388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------------- 398ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 406e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasausing ::android::hardware::graphics::bufferqueue::V1_0::utils:: 416e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa H2BGraphicBufferProducer; 426e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisenum { 448ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis REQUEST_BUFFER = IBinder::FIRST_CALL_TRANSACTION, 458ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis DEQUEUE_BUFFER, 469f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza DETACH_BUFFER, 47d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza DETACH_NEXT_BUFFER, 489f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza ATTACH_BUFFER, 498ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis QUEUE_BUFFER, 508ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis CANCEL_BUFFER, 51eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian QUERY, 52fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis CONNECT, 53fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis DISCONNECT, 54399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall SET_SIDEBAND_STREAM, 5529a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza ALLOCATE_BUFFERS, 569de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza ALLOW_ALLOCATION, 57812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza SET_GENERATION_NUMBER, 58c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza GET_CONSUMER_NAME, 59fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos SET_MAX_DEQUEUED_BUFFER_COUNT, 607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza SET_ASYNC_MODE, 613559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos SET_SHARED_BUFFER_MODE, 62ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos SET_AUTO_REFRESH, 63127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza SET_DEQUEUE_TIMEOUT, 6450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza GET_LAST_QUEUED_BUFFER, 65fc35258c9dd71b68dc278fa0c9220d74fd643f31Pablo Ceballos GET_FRAME_TIMESTAMPS, 66e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu GET_UNIQUE_ID, 67e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu GET_CONSUMER_USAGE, 688ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; 698ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 702adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenclass BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer> 718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 728ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennispublic: 73e2347b7953f70232541bdc1b392230d6231aaeb9Chih-Hung Hsieh explicit BpGraphicBufferProducer(const sp<IBinder>& impl) 742adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden : BpInterface<IGraphicBufferProducer>(impl) 758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis { 768ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 78ca0385170e75244f0c4f7cfec4f47ba1c0307176Yi Kong ~BpGraphicBufferProducer() override; 793be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza 807b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) { 818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 822adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(bufferIdx); 848a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result =remote()->transact(REQUEST_BUFFER, data, &reply); 858a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 868a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 878a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 888ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis bool nonNull = reply.readInt32(); 898ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis if (nonNull) { 907b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis *buf = new GraphicBuffer(); 912aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu result = reply.read(**buf); 922aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu if(result != NO_ERROR) { 932aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu (*buf).clear(); 942aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu return result; 952aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu } 968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 978a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 987b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis return result; 998ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 1008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 101fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos virtual status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) { 102fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos Parcel data, reply; 103fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data.writeInterfaceToken( 104fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 105fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data.writeInt32(maxDequeuedBuffers); 106fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos status_t result = remote()->transact(SET_MAX_DEQUEUED_BUFFER_COUNT, 107fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data, &reply); 108fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos if (result != NO_ERROR) { 109fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return result; 110fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 111fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos result = reply.readInt32(); 112fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return result; 113fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 114fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos 115fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos virtual status_t setAsyncMode(bool async) { 116fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos Parcel data, reply; 117fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data.writeInterfaceToken( 118fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 119fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data.writeInt32(async); 120fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos status_t result = remote()->transact(SET_ASYNC_MODE, 121fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data, &reply); 122fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos if (result != NO_ERROR) { 123fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return result; 124fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 125fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos result = reply.readInt32(); 126fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return result; 127fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 128fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos 129a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott virtual status_t dequeueBuffer(int* buf, sp<Fence>* fence, uint32_t width, uint32_t height, 130a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott PixelFormat format, uint64_t usage, uint64_t* outBufferAge, 131a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott FrameEventHistoryDelta* outTimestamps) { 1328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 1337c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson bool getFrameTimestamps = (outTimestamps != nullptr); 134baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 1352adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1363be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(width); 1373be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(height); 1383be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeInt32(static_cast<int32_t>(format)); 139cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian data.writeUint64(usage); 1407c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson data.writeBool(getFrameTimestamps); 141baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 1428a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply); 1438a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 1448a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 1458a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 146baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 1478ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis *buf = reply.readInt32(); 148baaad32cd582bcc09db89135715717234ea398eaBrian Anderson *fence = new Fence(); 149baaad32cd582bcc09db89135715717234ea398eaBrian Anderson result = reply.read(**fence); 150baaad32cd582bcc09db89135715717234ea398eaBrian Anderson if (result != NO_ERROR) { 151baaad32cd582bcc09db89135715717234ea398eaBrian Anderson fence->clear(); 152baaad32cd582bcc09db89135715717234ea398eaBrian Anderson return result; 153f78575400977f644cf0b12beb2fa5fc278b6ed4cJesse Hall } 154a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott if (outBufferAge) { 155a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott result = reply.readUint64(outBufferAge); 156a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott } else { 157a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott // Read the value even if outBufferAge is nullptr: 158a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott uint64_t bufferAge; 159a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott result = reply.readUint64(&bufferAge); 160a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott } 161a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott if (result != NO_ERROR) { 162a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott ALOGE("IGBP::dequeueBuffer failed to read buffer age: %d", result); 163a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott return result; 164a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott } 1657c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson if (getFrameTimestamps) { 1667c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson result = reply.read(*outTimestamps); 1677c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson if (result != NO_ERROR) { 1687c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson ALOGE("IGBP::dequeueBuffer failed to read timestamps: %d", 1697c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson result); 1707c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return result; 1717c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson } 1727c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson } 1738a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 1748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return result; 1758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 1768ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1779f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza virtual status_t detachBuffer(int slot) { 1789f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza Parcel data, reply; 1799f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1809f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInt32(slot); 1819f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza status_t result = remote()->transact(DETACH_BUFFER, data, &reply); 1829f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza if (result != NO_ERROR) { 1839f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1849f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 1859f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza result = reply.readInt32(); 1869f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1879f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 1889f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 189d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer, 190d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<Fence>* outFence) { 191d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (outBuffer == NULL) { 192d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza ALOGE("detachNextBuffer: outBuffer must not be NULL"); 193d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return BAD_VALUE; 194d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } else if (outFence == NULL) { 195d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza ALOGE("detachNextBuffer: outFence must not be NULL"); 196d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return BAD_VALUE; 197d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 198d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza Parcel data, reply; 199d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 200d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply); 201d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result != NO_ERROR) { 202d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return result; 203d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 204d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza result = reply.readInt32(); 205d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result == NO_ERROR) { 206d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza bool nonNull = reply.readInt32(); 207d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (nonNull) { 208d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza *outBuffer = new GraphicBuffer; 20970636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos result = reply.read(**outBuffer); 21070636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos if (result != NO_ERROR) { 21170636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos outBuffer->clear(); 21270636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos return result; 21370636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos } 214d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 215d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza nonNull = reply.readInt32(); 216d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (nonNull) { 217d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza *outFence = new Fence; 21870636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos result = reply.read(**outFence); 21970636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos if (result != NO_ERROR) { 22070636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos outBuffer->clear(); 22170636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos outFence->clear(); 22270636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos return result; 22370636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos } 224d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 225d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 226d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return result; 227d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 228d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza 2299f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) { 2309f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza Parcel data, reply; 2319f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 2329f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.write(*buffer.get()); 2339f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza status_t result = remote()->transact(ATTACH_BUFFER, data, &reply); 2349f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza if (result != NO_ERROR) { 2359f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 2369f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 237c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu 2389f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza *slot = reply.readInt32(); 2399f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza result = reply.readInt32(); 240c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu if (result == NO_ERROR && 241c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu (*slot < 0 || *slot >= BufferQueueDefs::NUM_BUFFER_SLOTS)) { 242c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu ALOGE("attachBuffer returned invalid slot %d", *slot); 243c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu android_errorWriteLog(0x534e4554, "37478824"); 244c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu return UNKNOWN_ERROR; 245c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu } 246c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu 2479f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 2489f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 2499f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 250f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian virtual status_t queueBuffer(int buf, 251f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian const QueueBufferInput& input, QueueBufferOutput* output) { 2528ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 253baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 2542adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 2558ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(buf); 256c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall data.write(input); 257baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 2588a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(QUEUE_BUFFER, data, &reply); 2598a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2608a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2618a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 262baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 263baaad32cd582bcc09db89135715717234ea398eaBrian Anderson result = reply.read(*output); 264baaad32cd582bcc09db89135715717234ea398eaBrian Anderson if (result != NO_ERROR) { 265baaad32cd582bcc09db89135715717234ea398eaBrian Anderson return result; 266baaad32cd582bcc09db89135715717234ea398eaBrian Anderson } 267baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 2688a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 2698ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return result; 2708ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 2718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 272583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos virtual status_t cancelBuffer(int buf, const sp<Fence>& fence) { 2738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 2742adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 2758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(buf); 2761df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis data.write(*fence.get()); 277583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos status_t result = remote()->transact(CANCEL_BUFFER, data, &reply); 278583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos if (result != NO_ERROR) { 279583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos return result; 280583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos } 281583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos result = reply.readInt32(); 282583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos return result; 2838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 2848ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 285eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian virtual int query(int what, int* value) { 286eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian Parcel data, reply; 2872adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 288eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian data.writeInt32(what); 2898a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(QUERY, data, &reply); 2908a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2918a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2928a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 293eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian value[0] = reply.readInt32(); 2948a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 295eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian return result; 296eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian } 297eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian 298f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza virtual status_t connect(const sp<IProducerListener>& listener, 299365857df8b94c959dea984a63013f6e7730ef976Mathias Agopian int api, bool producerControlledByApp, QueueBufferOutput* output) { 300fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis Parcel data, reply; 3012adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 302f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza if (listener != NULL) { 303f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza data.writeInt32(1); 304097ca275f4717a2c47a5d49f302ed2b72c8a1370Marco Nelissen data.writeStrongBinder(IInterface::asBinder(listener)); 305f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } else { 306f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza data.writeInt32(0); 307f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } 308fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis data.writeInt32(api); 309595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian data.writeInt32(producerControlledByApp); 3108a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(CONNECT, data, &reply); 3118a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 3128a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 3138a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 314baaad32cd582bcc09db89135715717234ea398eaBrian Anderson reply.read(*output); 3158a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 316fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return result; 317fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis } 3188072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian 31997b9c86338e2d364d47ea7522c2d81a8014f0e07Robert Carr virtual status_t disconnect(int api, DisconnectMode mode) { 320fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis Parcel data, reply; 3212adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 322fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis data.writeInt32(api); 32397b9c86338e2d364d47ea7522c2d81a8014f0e07Robert Carr data.writeInt32(static_cast<int32_t>(mode)); 3248a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result =remote()->transact(DISCONNECT, data, &reply); 3258a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 3268a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 3278a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 3288a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 329fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return result; 330fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis } 331399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 332399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall virtual status_t setSidebandStream(const sp<NativeHandle>& stream) { 333399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall Parcel data, reply; 334399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall status_t result; 335399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 336399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (stream.get()) { 337399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInt32(true); 338399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeNativeHandle(stream->handle()); 339399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } else { 340399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInt32(false); 341399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 342399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) { 343399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall result = reply.readInt32(); 344399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 345399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall return result; 346399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 34729a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza 348567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos virtual void allocateBuffers(uint32_t width, uint32_t height, 349cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian PixelFormat format, uint64_t usage) { 35029a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza Parcel data, reply; 35129a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 3523be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(width); 3533be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(height); 35429a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza data.writeInt32(static_cast<int32_t>(format)); 355cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian data.writeUint64(usage); 35629a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply); 35729a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza if (result != NO_ERROR) { 35829a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza ALOGE("allocateBuffers failed to transact: %d", result); 35929a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza } 36029a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza } 3619de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza 3629de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza virtual status_t allowAllocation(bool allow) { 3639de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza Parcel data, reply; 3649de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 3659de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza data.writeInt32(static_cast<int32_t>(allow)); 3669de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza status_t result = remote()->transact(ALLOW_ALLOCATION, data, &reply); 3679de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza if (result != NO_ERROR) { 3689de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza return result; 3699de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 3709de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza result = reply.readInt32(); 3719de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza return result; 3729de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 373812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza 374812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza virtual status_t setGenerationNumber(uint32_t generationNumber) { 375812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza Parcel data, reply; 376812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 377812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza data.writeUint32(generationNumber); 378812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza status_t result = remote()->transact(SET_GENERATION_NUMBER, data, &reply); 379812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza if (result == NO_ERROR) { 380812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza result = reply.readInt32(); 381812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza } 382812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza return result; 383812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza } 384c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza 385c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza virtual String8 getConsumerName() const { 386c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza Parcel data, reply; 387c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 388c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza status_t result = remote()->transact(GET_CONSUMER_NAME, data, &reply); 389c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza if (result != NO_ERROR) { 390c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza ALOGE("getConsumerName failed to transact: %d", result); 391c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza return String8("TransactFailed"); 392c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza } 393c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza return reply.readString8(); 394c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza } 3957dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 3963559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos virtual status_t setSharedBufferMode(bool sharedBufferMode) { 397ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos Parcel data, reply; 398ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos data.writeInterfaceToken( 399ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 4003559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos data.writeInt32(sharedBufferMode); 4013559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos status_t result = remote()->transact(SET_SHARED_BUFFER_MODE, data, 402ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos &reply); 403ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos if (result == NO_ERROR) { 404ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos result = reply.readInt32(); 405ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos } 406ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos return result; 407ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos } 408127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza 409ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos virtual status_t setAutoRefresh(bool autoRefresh) { 410ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos Parcel data, reply; 411ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos data.writeInterfaceToken( 412ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 413ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos data.writeInt32(autoRefresh); 414ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos status_t result = remote()->transact(SET_AUTO_REFRESH, data, &reply); 415ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos if (result == NO_ERROR) { 416ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos result = reply.readInt32(); 417ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos } 418ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos return result; 419ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos } 420ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos 421127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza virtual status_t setDequeueTimeout(nsecs_t timeout) { 422127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza Parcel data, reply; 423127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 424127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza data.writeInt64(timeout); 425127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza status_t result = remote()->transact(SET_DEQUEUE_TIMEOUT, data, &reply); 426127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza if (result != NO_ERROR) { 427127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza ALOGE("setDequeueTimeout failed to transact: %d", result); 428127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza return result; 429127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza } 430127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza return reply.readInt32(); 431127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza } 43250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza 43350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, 4341a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck sp<Fence>* outFence, float outTransformMatrix[16]) override { 43550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza Parcel data, reply; 43650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 43750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER, data, 43850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza &reply); 43950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 44050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to transact: %d", result); 44150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 44250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 44350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza result = reply.readInt32(); 44450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 44550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 44650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 447ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck bool hasBuffer = reply.readBool(); 448ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck sp<GraphicBuffer> buffer; 449ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck if (hasBuffer) { 450ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck buffer = new GraphicBuffer(); 451ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck result = reply.read(*buffer); 4521a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck if (result == NO_ERROR) { 4531a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck result = reply.read(outTransformMatrix, sizeof(float) * 16); 4541a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck } 455ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck } 45650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 45750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to read buffer: %d", result); 45850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 45950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 46050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza sp<Fence> fence(new Fence); 46150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza result = reply.read(*fence); 46250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 46350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to read fence: %d", result); 46450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 46550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 46650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza *outBuffer = buffer; 46750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza *outFence = fence; 46850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 46950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 470ce796e78a57018f186b062199c75d94545318acaPablo Ceballos 4713890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson virtual void getFrameTimestamps(FrameEventHistoryDelta* outDelta) { 472ce796e78a57018f186b062199c75d94545318acaPablo Ceballos Parcel data, reply; 473ce796e78a57018f186b062199c75d94545318acaPablo Ceballos status_t result = data.writeInterfaceToken( 474ce796e78a57018f186b062199c75d94545318acaPablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 475ce796e78a57018f186b062199c75d94545318acaPablo Ceballos if (result != NO_ERROR) { 4763890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson ALOGE("IGBP::getFrameTimestamps failed to write token: %d", result); 4773890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson return; 478ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 479ce796e78a57018f186b062199c75d94545318acaPablo Ceballos result = remote()->transact(GET_FRAME_TIMESTAMPS, data, &reply); 480ce796e78a57018f186b062199c75d94545318acaPablo Ceballos if (result != NO_ERROR) { 4813890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson ALOGE("IGBP::getFrameTimestamps failed to transact: %d", result); 4823890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson return; 483ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 4843890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson result = reply.read(*outDelta); 485ce796e78a57018f186b062199c75d94545318acaPablo Ceballos if (result != NO_ERROR) { 4863890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson ALOGE("IGBP::getFrameTimestamps failed to read timestamps: %d", 4873890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson result); 488ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 489ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 4906155b40830e7945e9d4a76fe89af9a6322d4977fPablo Ceballos 4918e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos virtual status_t getUniqueId(uint64_t* outId) const { 4928e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos Parcel data, reply; 4938e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 4948e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos status_t result = remote()->transact(GET_UNIQUE_ID, data, &reply); 4958e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos if (result != NO_ERROR) { 4968e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos ALOGE("getUniqueId failed to transact: %d", result); 4978e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 4988e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos status_t actualResult = NO_ERROR; 4998e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos result = reply.readInt32(&actualResult); 5008e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos if (result != NO_ERROR) { 5018e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return result; 5028e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 5038e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos result = reply.readUint64(outId); 5048e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos if (result != NO_ERROR) { 5058e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return result; 5068e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 5078e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return actualResult; 5088e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 509e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu 510e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu virtual status_t getConsumerUsage(uint64_t* outUsage) const { 511e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu Parcel data, reply; 512e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 513e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu status_t result = remote()->transact(GET_CONSUMER_USAGE, data, &reply); 514e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu if (result != NO_ERROR) { 515e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu ALOGE("getConsumerUsage failed to transact: %d", result); 516e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu } 517e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu status_t actualResult = NO_ERROR; 518e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu result = reply.readInt32(&actualResult); 519e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu if (result != NO_ERROR) { 520e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu return result; 521e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu } 522e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu result = reply.readUint64(outUsage); 523e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu if (result != NO_ERROR) { 524e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu return result; 525e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu } 526e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu return actualResult; 527e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu } 5288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; 5298ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 5303be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza// Out-of-line virtual method definition to trigger vtable emission in this 5313be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza// translation unit (see clang warning -Wweak-vtables) 5323be1c6b60a188dc10025e2ce156c11fac050625dDan StozaBpGraphicBufferProducer::~BpGraphicBufferProducer() {} 5333be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza 5346e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasaclass HpGraphicBufferProducer : public HpInterface< 5356e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa BpGraphicBufferProducer, H2BGraphicBufferProducer> { 5366e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasapublic: 5376e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa HpGraphicBufferProducer(const sp<IBinder>& base) : PBase(base) {} 5386e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5396e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) override { 5406e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->requestBuffer(slot, buf); 5416e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5426e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5436e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) override { 5446e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->setMaxDequeuedBufferCount(maxDequeuedBuffers); 5456e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5466e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5476e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t setAsyncMode(bool async) override { 5486e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->setAsyncMode(async); 5496e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5506e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 551a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott status_t dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w, uint32_t h, PixelFormat format, 552a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott uint64_t usage, uint64_t* outBufferAge, 553a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott FrameEventHistoryDelta* outTimestamps) override { 554a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott return mBase->dequeueBuffer(slot, fence, w, h, format, usage, outBufferAge, outTimestamps); 5556e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5566e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5576e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t detachBuffer(int slot) override { 5586e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->detachBuffer(slot); 5596e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5606e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5616e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t detachNextBuffer( 5626e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) override { 5636e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->detachNextBuffer(outBuffer, outFence); 5646e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5656e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5666e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t attachBuffer( 5676e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa int* outSlot, const sp<GraphicBuffer>& buffer) override { 5686e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->attachBuffer(outSlot, buffer); 5696e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5706e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5716e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t queueBuffer( 5726e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa int slot, 5736e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa const QueueBufferInput& input, 5746e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa QueueBufferOutput* output) override { 5756e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->queueBuffer(slot, input, output); 5766e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5776e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5786e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t cancelBuffer(int slot, const sp<Fence>& fence) override { 5796e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->cancelBuffer(slot, fence); 5806e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5816e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5826e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa int query(int what, int* value) override { 5836e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->query(what, value); 5846e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5856e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5866e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t connect( 5876e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa const sp<IProducerListener>& listener, 5886e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa int api, bool producerControlledByApp, 5896e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa QueueBufferOutput* output) override { 5906e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->connect(listener, api, producerControlledByApp, output); 5916e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5926e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5936e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t disconnect( 5946e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa int api, DisconnectMode mode = DisconnectMode::Api) override { 5956e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->disconnect(api, mode); 5966e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5976e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5986e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t setSidebandStream(const sp<NativeHandle>& stream) override { 5996e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->setSidebandStream(stream); 6006e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6016e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6026e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa void allocateBuffers(uint32_t width, uint32_t height, 603cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian PixelFormat format, uint64_t usage) override { 6046e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->allocateBuffers(width, height, format, usage); 6056e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6066e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6076e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t allowAllocation(bool allow) override { 6086e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->allowAllocation(allow); 6096e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6106e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6116e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t setGenerationNumber(uint32_t generationNumber) override { 6126e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->setGenerationNumber(generationNumber); 6136e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6146e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6156e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa String8 getConsumerName() const override { 6166e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->getConsumerName(); 6176e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6186e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6196e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t setSharedBufferMode(bool sharedBufferMode) override { 6206e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->setSharedBufferMode(sharedBufferMode); 6216e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6226e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6236e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t setAutoRefresh(bool autoRefresh) override { 6246e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->setAutoRefresh(autoRefresh); 6256e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6266e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6276e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t setDequeueTimeout(nsecs_t timeout) override { 6286e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->setDequeueTimeout(timeout); 6296e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6306e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6316e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t getLastQueuedBuffer( 6326e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa sp<GraphicBuffer>* outBuffer, 6336e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa sp<Fence>* outFence, 6346e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa float outTransformMatrix[16]) override { 6356e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->getLastQueuedBuffer( 6366e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa outBuffer, outFence, outTransformMatrix); 6376e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6386e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6396e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa void getFrameTimestamps(FrameEventHistoryDelta* outDelta) override { 6406e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->getFrameTimestamps(outDelta); 6416e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6426e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6436e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t getUniqueId(uint64_t* outId) const override { 6446e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->getUniqueId(outId); 6456e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 646e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu 647e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu status_t getConsumerUsage(uint64_t* outUsage) const override { 648e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu return mBase->getConsumerUsage(outUsage); 649e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu } 6506e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa}; 6516e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6526e1193af40c870c50013affec37c8429986b3c7bPawin VongmasaIMPLEMENT_HYBRID_META_INTERFACE(GraphicBufferProducer, HGraphicBufferProducer, 6536e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa "android.gui.IGraphicBufferProducer"); 6548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 6558ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------- 6568ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 657c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caistatus_t IGraphicBufferProducer::exportToParcel(Parcel* parcel) { 658c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai status_t res = OK; 659c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai res = parcel->writeUint32(USE_BUFFER_QUEUE); 660c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai if (res != NO_ERROR) { 661c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai ALOGE("exportToParcel: Cannot write magic, res=%d.", res); 662c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai return res; 663c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai } 664c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai 665c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai return parcel->writeStrongBinder(IInterface::asBinder(this)); 666c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai} 667c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai 668c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai/* static */ 669c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caistatus_t IGraphicBufferProducer::exportToParcel(const sp<IGraphicBufferProducer>& producer, 670c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai Parcel* parcel) { 671c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai if (parcel == nullptr) { 672c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai ALOGE("exportToParcel: Invalid parcel object."); 673c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai return BAD_VALUE; 674c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai } 675c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai 676c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai if (producer == nullptr) { 677c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai status_t res = OK; 678c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai res = parcel->writeUint32(IGraphicBufferProducer::USE_BUFFER_QUEUE); 679c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai if (res != NO_ERROR) return res; 680c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai return parcel->writeStrongBinder(nullptr); 681c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai } else { 682c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai return producer->exportToParcel(parcel); 683c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai } 684c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai} 685c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai 686c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai/* static */ 687c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caisp<IGraphicBufferProducer> IGraphicBufferProducer::createFromParcel(const Parcel* parcel) { 688c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai uint32_t outMagic = 0; 689c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai status_t res = NO_ERROR; 690c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai 691c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai res = parcel->readUint32(&outMagic); 692c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai if (res != NO_ERROR) { 693c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai ALOGE("createFromParcel: Failed to read magic, error=%d.", res); 694c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai return nullptr; 695c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai } 696c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai 697c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai switch (outMagic) { 698c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai case USE_BUFFER_QUEUE: { 699c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai sp<IBinder> binder; 700c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai res = parcel->readNullableStrongBinder(&binder); 701c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai if (res != NO_ERROR) { 702c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai ALOGE("createFromParcel: Can't read strong binder."); 703c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai return nullptr; 704c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai } 705c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai return interface_cast<IGraphicBufferProducer>(binder); 706c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai } 707c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai case USE_BUFFER_HUB: { 708c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai ALOGE("createFromParcel: BufferHub not implemented."); 709c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai dvr::ProducerQueueParcelable producerParcelable; 710c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai res = producerParcelable.readFromParcel(parcel); 711c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai if (res != NO_ERROR) { 712c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai ALOGE("createFromParcel: Failed to read from parcel, error=%d", res); 713c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai return nullptr; 714c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai } 715c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai return BufferHubProducer::Create(std::move(producerParcelable)); 716c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai } 717c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai default: { 718c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai ALOGE("createFromParcel: Unexpected mgaic: 0x%x.", outMagic); 719c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai return nullptr; 720c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai } 721c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai } 722c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai} 723c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai 724c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai// ---------------------------------------------------------------------------- 725c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai 7262adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenstatus_t BnGraphicBufferProducer::onTransact( 7278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 7288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 7298ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis switch(code) { 7308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case REQUEST_BUFFER: { 7312adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 7328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int bufferIdx = data.readInt32(); 7337b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis sp<GraphicBuffer> buffer; 7347b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis int result = requestBuffer(bufferIdx, &buffer); 7358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(buffer != 0); 7368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis if (buffer != 0) { 7378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->write(*buffer); 7388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 7397b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis reply->writeInt32(result); 7408ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 7413be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 742fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos case SET_MAX_DEQUEUED_BUFFER_COUNT: { 743fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 744fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos int maxDequeuedBuffers = data.readInt32(); 745fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos int result = setMaxDequeuedBufferCount(maxDequeuedBuffers); 746fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos reply->writeInt32(result); 747fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return NO_ERROR; 748fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 749fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos case SET_ASYNC_MODE: { 750fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 751fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos bool async = data.readInt32(); 752fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos int result = setAsyncMode(async); 753fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos reply->writeInt32(result); 754fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return NO_ERROR; 755fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 7568ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case DEQUEUE_BUFFER: { 7572adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 7583be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t width = data.readUint32(); 7593be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t height = data.readUint32(); 7603be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza PixelFormat format = static_cast<PixelFormat>(data.readInt32()); 761cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian uint64_t usage = data.readUint64(); 762a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott uint64_t bufferAge = 0; 7637c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson bool getTimestamps = data.readBool(); 764baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 76512ba0f57d028a9c8f4eb3afddc326b70677d1e0cNaveen Leekha int buf = 0; 766baaad32cd582bcc09db89135715717234ea398eaBrian Anderson sp<Fence> fence = Fence::NO_FENCE; 7677c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson FrameEventHistoryDelta frameTimestamps; 768a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott int result = dequeueBuffer(&buf, &fence, width, height, format, usage, &bufferAge, 769a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott getTimestamps ? &frameTimestamps : nullptr); 770baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 7718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(buf); 772baaad32cd582bcc09db89135715717234ea398eaBrian Anderson reply->write(*fence); 773a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott reply->writeUint64(bufferAge); 7747c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson if (getTimestamps) { 7757c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson reply->write(frameTimestamps); 7767c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson } 7778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(result); 7789f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return NO_ERROR; 7793be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 7809f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza case DETACH_BUFFER: { 7819f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 7829f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int slot = data.readInt32(); 7839f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int result = detachBuffer(slot); 7849f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(result); 7859f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return NO_ERROR; 7863be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 787d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza case DETACH_NEXT_BUFFER: { 788d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 789d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<GraphicBuffer> buffer; 790d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<Fence> fence; 791d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza int32_t result = detachNextBuffer(&buffer, &fence); 792d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(result); 793d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result == NO_ERROR) { 794d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(buffer != NULL); 795d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (buffer != NULL) { 796d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->write(*buffer); 797d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 798d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(fence != NULL); 799d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (fence != NULL) { 800d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->write(*fence); 801d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 802d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 803d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return NO_ERROR; 8043be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 8059f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza case ATTACH_BUFFER: { 8069f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 8079f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza sp<GraphicBuffer> buffer = new GraphicBuffer(); 80870636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos status_t result = data.read(*buffer.get()); 80912ba0f57d028a9c8f4eb3afddc326b70677d1e0cNaveen Leekha int slot = 0; 81070636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos if (result == NO_ERROR) { 81170636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos result = attachBuffer(&slot, buffer); 81270636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos } 8139f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(slot); 8149f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(result); 8158ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 8163be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 8178ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case QUEUE_BUFFER: { 8182adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 8197c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 8208ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int buf = data.readInt32(); 821c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall QueueBufferInput input(data); 822baaad32cd582bcc09db89135715717234ea398eaBrian Anderson QueueBufferOutput output; 823baaad32cd582bcc09db89135715717234ea398eaBrian Anderson status_t result = queueBuffer(buf, input, &output); 824baaad32cd582bcc09db89135715717234ea398eaBrian Anderson reply->write(output); 8258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(result); 8267c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 8278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 8283be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 8298ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case CANCEL_BUFFER: { 8302adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 8318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int buf = data.readInt32(); 8321df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis sp<Fence> fence = new Fence(); 83370636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos status_t result = data.read(*fence.get()); 83470636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos if (result == NO_ERROR) { 83570636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos result = cancelBuffer(buf, fence); 83670636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos } 837583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos reply->writeInt32(result); 8388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 8393be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 840eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian case QUERY: { 8412adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 84212ba0f57d028a9c8f4eb3afddc326b70677d1e0cNaveen Leekha int value = 0; 843eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian int what = data.readInt32(); 844eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian int res = query(what, &value); 845eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian reply->writeInt32(value); 846eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian reply->writeInt32(res); 847eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian return NO_ERROR; 8483be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 849fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis case CONNECT: { 8502adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 851f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza sp<IProducerListener> listener; 852f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza if (data.readInt32() == 1) { 853f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza listener = IProducerListener::asInterface(data.readStrongBinder()); 854f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } 855fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis int api = data.readInt32(); 856595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian bool producerControlledByApp = data.readInt32(); 857baaad32cd582bcc09db89135715717234ea398eaBrian Anderson QueueBufferOutput output; 858baaad32cd582bcc09db89135715717234ea398eaBrian Anderson status_t res = connect(listener, api, producerControlledByApp, &output); 859baaad32cd582bcc09db89135715717234ea398eaBrian Anderson reply->write(output); 860fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis reply->writeInt32(res); 861fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return NO_ERROR; 8623be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 863fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis case DISCONNECT: { 8642adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 865fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis int api = data.readInt32(); 86697b9c86338e2d364d47ea7522c2d81a8014f0e07Robert Carr DisconnectMode mode = static_cast<DisconnectMode>(data.readInt32()); 86797b9c86338e2d364d47ea7522c2d81a8014f0e07Robert Carr status_t res = disconnect(api, mode); 868fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis reply->writeInt32(res); 869fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return NO_ERROR; 8703be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 871399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall case SET_SIDEBAND_STREAM: { 872399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 873399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall sp<NativeHandle> stream; 874399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (data.readInt32()) { 8750ec54e156bed93d59900b742c8e9adcfaee90612Wonsik Kim stream = NativeHandle::create(data.readNativeHandle(), true); 876399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 877399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall status_t result = setSidebandStream(stream); 878399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall reply->writeInt32(result); 879399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall return NO_ERROR; 8803be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 8819de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza case ALLOCATE_BUFFERS: { 88229a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 8833be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t width = data.readUint32(); 8843be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t height = data.readUint32(); 8853be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza PixelFormat format = static_cast<PixelFormat>(data.readInt32()); 886cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian uint64_t usage = data.readUint64(); 887567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos allocateBuffers(width, height, format, usage); 88829a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza return NO_ERROR; 8899de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 8909de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza case ALLOW_ALLOCATION: { 8919de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 8929de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza bool allow = static_cast<bool>(data.readInt32()); 8939de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza status_t result = allowAllocation(allow); 8949de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza reply->writeInt32(result); 8959de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza return NO_ERROR; 8969de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 897812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza case SET_GENERATION_NUMBER: { 898812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 899812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza uint32_t generationNumber = data.readUint32(); 900812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza status_t result = setGenerationNumber(generationNumber); 901812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza reply->writeInt32(result); 902812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza return NO_ERROR; 903812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza } 904c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza case GET_CONSUMER_NAME: { 905c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 906c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza reply->writeString8(getConsumerName()); 907c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza return NO_ERROR; 908c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza } 9093559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos case SET_SHARED_BUFFER_MODE: { 910ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 9113559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos bool sharedBufferMode = data.readInt32(); 9123559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos status_t result = setSharedBufferMode(sharedBufferMode); 913ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos reply->writeInt32(result); 914ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos return NO_ERROR; 915ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos } 916ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos case SET_AUTO_REFRESH: { 917ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos CHECK_INTERFACE(IGraphicBuffer, data, reply); 918ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos bool autoRefresh = data.readInt32(); 919ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos status_t result = setAutoRefresh(autoRefresh); 920ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos reply->writeInt32(result); 921ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos return NO_ERROR; 922ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos } 923127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza case SET_DEQUEUE_TIMEOUT: { 924127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 925127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza nsecs_t timeout = data.readInt64(); 926127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza status_t result = setDequeueTimeout(timeout); 927127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza reply->writeInt32(result); 928127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza return NO_ERROR; 929127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza } 93050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza case GET_LAST_QUEUED_BUFFER: { 93150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 93250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza sp<GraphicBuffer> buffer(nullptr); 93350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza sp<Fence> fence(Fence::NO_FENCE); 9341a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck float transform[16] = {}; 9351a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck status_t result = getLastQueuedBuffer(&buffer, &fence, transform); 93650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza reply->writeInt32(result); 93750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 93850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 93950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 940ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck if (!buffer.get()) { 941ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck reply->writeBool(false); 942ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck } else { 943ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck reply->writeBool(true); 944ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck result = reply->write(*buffer); 9451a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck if (result == NO_ERROR) { 9461a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck reply->write(transform, sizeof(float) * 16); 9471a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck } 948ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck } 94950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 95050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to write buffer: %d", result); 95150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 95250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 95350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza result = reply->write(*fence); 95450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 95550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to write fence: %d", result); 95650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 95750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 95850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return NO_ERROR; 95950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 960ce796e78a57018f186b062199c75d94545318acaPablo Ceballos case GET_FRAME_TIMESTAMPS: { 961ce796e78a57018f186b062199c75d94545318acaPablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 9623890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson FrameEventHistoryDelta frameTimestamps; 9633890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson getFrameTimestamps(&frameTimestamps); 9643890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson status_t result = reply->write(frameTimestamps); 965ce796e78a57018f186b062199c75d94545318acaPablo Ceballos if (result != NO_ERROR) { 9663890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson ALOGE("BnGBP::GET_FRAME_TIMESTAMPS failed to write buffer: %d", 9673890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson result); 968ce796e78a57018f186b062199c75d94545318acaPablo Ceballos return result; 969ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 970ce796e78a57018f186b062199c75d94545318acaPablo Ceballos return NO_ERROR; 971ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 9728e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos case GET_UNIQUE_ID: { 9738e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 9748e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos uint64_t outId = 0; 9758e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos status_t actualResult = getUniqueId(&outId); 9768e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos status_t result = reply->writeInt32(actualResult); 9778e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos if (result != NO_ERROR) { 9788e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return result; 9798e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 9808e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos result = reply->writeUint64(outId); 9818e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos if (result != NO_ERROR) { 9828e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return result; 9838e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 9848e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return NO_ERROR; 9858e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 986e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu case GET_CONSUMER_USAGE: { 987e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 988e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu uint64_t outUsage = 0; 989e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu status_t actualResult = getConsumerUsage(&outUsage); 990e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu status_t result = reply->writeInt32(actualResult); 991e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu if (result != NO_ERROR) { 992e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu return result; 993e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu } 994e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu result = reply->writeUint64(outUsage); 995e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu if (result != NO_ERROR) { 996e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu return result; 997e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu } 998e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu return NO_ERROR; 999e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu } 10008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 10018ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return BBinder::onTransact(code, data, reply, flags); 10028ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 10038ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 10048ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------------- 10058ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 10062adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenIGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) { 1007c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall parcel.read(*this); 1008c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 1009c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 10107c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Andersonconstexpr size_t IGraphicBufferProducer::QueueBufferInput::minFlattenedSize() { 10117c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return sizeof(timestamp) + 10127c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(isAutoTimestamp) + 10137c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(dataSpace) + 10147c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(crop) + 10157c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(scalingMode) + 10167c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(transform) + 10177c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(stickyTransform) + 10187c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(getFrameTimestamps); 10197c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson} 10207c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 1021e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const { 10227c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return minFlattenedSize() + 10237c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson fence->getFlattenedSize() + 10249bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter surfaceDamage.getFlattenedSize() + 10259bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter hdrMetadata.getFlattenedSize(); 1026c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 1027c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 1028e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const { 10291df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis return fence->getFdCount(); 1030c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 1031c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 1032e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t IGraphicBufferProducer::QueueBufferInput::flatten( 1033e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian void*& buffer, size_t& size, int*& fds, size_t& count) const 1034c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall{ 1035e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < getFlattenedSize()) { 1036e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 1037e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 10387c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 1039e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, timestamp); 10403c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden FlattenableUtils::write(buffer, size, isAutoTimestamp); 104182c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala FlattenableUtils::write(buffer, size, dataSpace); 1042e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, crop); 1043e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, scalingMode); 1044e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, transform); 10451681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk FlattenableUtils::write(buffer, size, stickyTransform); 10467c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson FlattenableUtils::write(buffer, size, getFrameTimestamps); 10477c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 10485065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza status_t result = fence->flatten(buffer, size, fds, count); 10495065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza if (result != NO_ERROR) { 10505065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return result; 10515065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza } 10529bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter result = surfaceDamage.flatten(buffer, size); 10539bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter if (result != NO_ERROR) { 10549bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter return result; 10559bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter } 10569bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize()); 10579bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter return hdrMetadata.flatten(buffer, size); 1058c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 1059c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 1060e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t IGraphicBufferProducer::QueueBufferInput::unflatten( 1061e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian void const*& buffer, size_t& size, int const*& fds, size_t& count) 1062c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall{ 10637c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson if (size < minFlattenedSize()) { 1064e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 1065e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 1066e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 1067e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, timestamp); 10683c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden FlattenableUtils::read(buffer, size, isAutoTimestamp); 106982c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala FlattenableUtils::read(buffer, size, dataSpace); 1070e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, crop); 1071e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, scalingMode); 1072e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, transform); 10731681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk FlattenableUtils::read(buffer, size, stickyTransform); 10747c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson FlattenableUtils::read(buffer, size, getFrameTimestamps); 1075e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 10761df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis fence = new Fence(); 10775065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza status_t result = fence->unflatten(buffer, size, fds, count); 10785065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza if (result != NO_ERROR) { 10795065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return result; 10805065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza } 10819bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter result = surfaceDamage.unflatten(buffer, size); 10829bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter if (result != NO_ERROR) { 10839bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter return result; 10849bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter } 10859bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize()); 10869bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter return hdrMetadata.unflatten(buffer, size); 1087c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 1088c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 1089baaad32cd582bcc09db89135715717234ea398eaBrian Anderson// ---------------------------------------------------------------------------- 10907c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Andersonconstexpr size_t IGraphicBufferProducer::QueueBufferOutput::minFlattenedSize() { 10917c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return sizeof(width) + 10927c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(height) + 10937c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(transformHint) + 10947c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(numPendingBuffers) + 109522f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang sizeof(nextFrameNumber) + 109622f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang sizeof(bufferReplaced); 10977c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson} 1098baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 1099baaad32cd582bcc09db89135715717234ea398eaBrian Andersonsize_t IGraphicBufferProducer::QueueBufferOutput::getFlattenedSize() const { 11007c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return minFlattenedSize() + frameTimestamps.getFlattenedSize(); 1101baaad32cd582bcc09db89135715717234ea398eaBrian Anderson} 1102baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 1103baaad32cd582bcc09db89135715717234ea398eaBrian Andersonsize_t IGraphicBufferProducer::QueueBufferOutput::getFdCount() const { 11047c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return frameTimestamps.getFdCount(); 1105baaad32cd582bcc09db89135715717234ea398eaBrian Anderson} 1106baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 1107baaad32cd582bcc09db89135715717234ea398eaBrian Andersonstatus_t IGraphicBufferProducer::QueueBufferOutput::flatten( 11087c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson void*& buffer, size_t& size, int*& fds, size_t& count) const 1109baaad32cd582bcc09db89135715717234ea398eaBrian Anderson{ 1110baaad32cd582bcc09db89135715717234ea398eaBrian Anderson if (size < getFlattenedSize()) { 1111baaad32cd582bcc09db89135715717234ea398eaBrian Anderson return NO_MEMORY; 1112baaad32cd582bcc09db89135715717234ea398eaBrian Anderson } 11137c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 1114baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::write(buffer, size, width); 1115baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::write(buffer, size, height); 1116baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::write(buffer, size, transformHint); 1117baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::write(buffer, size, numPendingBuffers); 1118baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::write(buffer, size, nextFrameNumber); 111922f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang FlattenableUtils::write(buffer, size, bufferReplaced); 1120baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 11217c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return frameTimestamps.flatten(buffer, size, fds, count); 1122baaad32cd582bcc09db89135715717234ea398eaBrian Anderson} 1123baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 1124baaad32cd582bcc09db89135715717234ea398eaBrian Andersonstatus_t IGraphicBufferProducer::QueueBufferOutput::unflatten( 11257c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson void const*& buffer, size_t& size, int const*& fds, size_t& count) 1126baaad32cd582bcc09db89135715717234ea398eaBrian Anderson{ 11277c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson if (size < minFlattenedSize()) { 1128baaad32cd582bcc09db89135715717234ea398eaBrian Anderson return NO_MEMORY; 1129baaad32cd582bcc09db89135715717234ea398eaBrian Anderson } 11307c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 1131baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::read(buffer, size, width); 1132baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::read(buffer, size, height); 1133baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::read(buffer, size, transformHint); 1134baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::read(buffer, size, numPendingBuffers); 1135baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::read(buffer, size, nextFrameNumber); 113622f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang FlattenableUtils::read(buffer, size, bufferReplaced); 1137baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 11387c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return frameTimestamps.unflatten(buffer, size, fds, count); 1139baaad32cd582bcc09db89135715717234ea398eaBrian Anderson} 1140baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 11418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; // namespace android 1142