IGraphicBufferProducer.cpp revision 22f842ba04c32cef2faf855dc304eb0ab131b9ec
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> 238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <utils/Timers.h> 24399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/Vector.h> 258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <binder/Parcel.h> 278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <binder/IInterface.h> 288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 292adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden#include <gui/IGraphicBufferProducer.h> 30f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza#include <gui/IProducerListener.h> 318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisnamespace android { 338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------------- 348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisenum { 368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis REQUEST_BUFFER = IBinder::FIRST_CALL_TRANSACTION, 378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis DEQUEUE_BUFFER, 389f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza DETACH_BUFFER, 39d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza DETACH_NEXT_BUFFER, 409f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza ATTACH_BUFFER, 418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis QUEUE_BUFFER, 428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis CANCEL_BUFFER, 43eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian QUERY, 44fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis CONNECT, 45fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis DISCONNECT, 46399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall SET_SIDEBAND_STREAM, 4729a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza ALLOCATE_BUFFERS, 489de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza ALLOW_ALLOCATION, 49812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza SET_GENERATION_NUMBER, 50c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza GET_CONSUMER_NAME, 51fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos SET_MAX_DEQUEUED_BUFFER_COUNT, 527dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza SET_ASYNC_MODE, 533559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos SET_SHARED_BUFFER_MODE, 54ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos SET_AUTO_REFRESH, 55127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza SET_DEQUEUE_TIMEOUT, 5650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza GET_LAST_QUEUED_BUFFER, 57fc35258c9dd71b68dc278fa0c9220d74fd643f31Pablo Ceballos GET_FRAME_TIMESTAMPS, 58fc35258c9dd71b68dc278fa0c9220d74fd643f31Pablo Ceballos GET_UNIQUE_ID 598ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; 608ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 612adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenclass BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer> 628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 638ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennispublic: 64e2347b7953f70232541bdc1b392230d6231aaeb9Chih-Hung Hsieh explicit BpGraphicBufferProducer(const sp<IBinder>& impl) 652adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden : BpInterface<IGraphicBufferProducer>(impl) 668ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis { 678ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 688ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 693be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza virtual ~BpGraphicBufferProducer(); 703be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza 717b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) { 728ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 732adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(bufferIdx); 758a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result =remote()->transact(REQUEST_BUFFER, data, &reply); 768a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 778a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 788a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 798ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis bool nonNull = reply.readInt32(); 808ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis if (nonNull) { 817b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis *buf = new GraphicBuffer(); 822aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu result = reply.read(**buf); 832aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu if(result != NO_ERROR) { 842aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu (*buf).clear(); 852aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu return result; 862aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu } 878ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 888a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 897b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis return result; 908ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 918ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 92fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos virtual status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) { 93fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos Parcel data, reply; 94fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data.writeInterfaceToken( 95fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 96fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data.writeInt32(maxDequeuedBuffers); 97fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos status_t result = remote()->transact(SET_MAX_DEQUEUED_BUFFER_COUNT, 98fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data, &reply); 99fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos if (result != NO_ERROR) { 100fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return result; 101fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 102fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos result = reply.readInt32(); 103fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return result; 104fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 105fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos 106fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos virtual status_t setAsyncMode(bool async) { 107fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos Parcel data, reply; 108fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data.writeInterfaceToken( 109fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 110fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data.writeInt32(async); 111fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos status_t result = remote()->transact(SET_ASYNC_MODE, 112fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data, &reply); 113fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos if (result != NO_ERROR) { 114fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return result; 115fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 116fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos result = reply.readInt32(); 117fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return result; 118fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 119fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos 120567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos virtual status_t dequeueBuffer(int *buf, sp<Fence>* fence, uint32_t width, 1217c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson uint32_t height, PixelFormat format, uint32_t usage, 1227c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson FrameEventHistoryDelta* outTimestamps) { 1238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 1247c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson bool getFrameTimestamps = (outTimestamps != nullptr); 125baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 1262adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1273be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(width); 1283be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(height); 1293be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeInt32(static_cast<int32_t>(format)); 1303be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(usage); 1317c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson data.writeBool(getFrameTimestamps); 132baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 1338a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply); 1348a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 1358a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 1368a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 137baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 1388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis *buf = reply.readInt32(); 139baaad32cd582bcc09db89135715717234ea398eaBrian Anderson *fence = new Fence(); 140baaad32cd582bcc09db89135715717234ea398eaBrian Anderson result = reply.read(**fence); 141baaad32cd582bcc09db89135715717234ea398eaBrian Anderson if (result != NO_ERROR) { 142baaad32cd582bcc09db89135715717234ea398eaBrian Anderson fence->clear(); 143baaad32cd582bcc09db89135715717234ea398eaBrian Anderson return result; 144f78575400977f644cf0b12beb2fa5fc278b6ed4cJesse Hall } 1457c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson if (getFrameTimestamps) { 1467c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson result = reply.read(*outTimestamps); 1477c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson if (result != NO_ERROR) { 1487c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson ALOGE("IGBP::dequeueBuffer failed to read timestamps: %d", 1497c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson result); 1507c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return result; 1517c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson } 1527c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson } 1538a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 1548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return result; 1558ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 1568ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1579f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza virtual status_t detachBuffer(int slot) { 1589f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza Parcel data, reply; 1599f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1609f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInt32(slot); 1619f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza status_t result = remote()->transact(DETACH_BUFFER, data, &reply); 1629f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza if (result != NO_ERROR) { 1639f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1649f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 1659f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza result = reply.readInt32(); 1669f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1679f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 1689f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 169d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer, 170d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<Fence>* outFence) { 171d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (outBuffer == NULL) { 172d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza ALOGE("detachNextBuffer: outBuffer must not be NULL"); 173d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return BAD_VALUE; 174d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } else if (outFence == NULL) { 175d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza ALOGE("detachNextBuffer: outFence must not be NULL"); 176d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return BAD_VALUE; 177d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 178d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza Parcel data, reply; 179d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 180d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply); 181d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result != NO_ERROR) { 182d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return result; 183d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 184d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza result = reply.readInt32(); 185d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result == NO_ERROR) { 186d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza bool nonNull = reply.readInt32(); 187d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (nonNull) { 188d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza *outBuffer = new GraphicBuffer; 18970636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos result = reply.read(**outBuffer); 19070636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos if (result != NO_ERROR) { 19170636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos outBuffer->clear(); 19270636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos return result; 19370636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos } 194d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 195d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza nonNull = reply.readInt32(); 196d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (nonNull) { 197d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza *outFence = new Fence; 19870636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos result = reply.read(**outFence); 19970636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos if (result != NO_ERROR) { 20070636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos outBuffer->clear(); 20170636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos outFence->clear(); 20270636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos return result; 20370636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos } 204d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 205d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 206d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return result; 207d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 208d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza 2099f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) { 2109f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza Parcel data, reply; 2119f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 2129f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.write(*buffer.get()); 2139f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza status_t result = remote()->transact(ATTACH_BUFFER, data, &reply); 2149f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza if (result != NO_ERROR) { 2159f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 2169f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 2179f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza *slot = reply.readInt32(); 2189f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza result = reply.readInt32(); 2199f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 2209f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 2219f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 222f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian virtual status_t queueBuffer(int buf, 223f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian const QueueBufferInput& input, QueueBufferOutput* output) { 2248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 225baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 2262adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 2278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(buf); 228c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall data.write(input); 229baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 2308a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(QUEUE_BUFFER, data, &reply); 2318a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2328a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2338a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 234baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 235baaad32cd582bcc09db89135715717234ea398eaBrian Anderson result = reply.read(*output); 236baaad32cd582bcc09db89135715717234ea398eaBrian Anderson if (result != NO_ERROR) { 237baaad32cd582bcc09db89135715717234ea398eaBrian Anderson return result; 238baaad32cd582bcc09db89135715717234ea398eaBrian Anderson } 239baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 2408a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 2418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return result; 2428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 2438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 244583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos virtual status_t cancelBuffer(int buf, const sp<Fence>& fence) { 2458ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 2462adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 2478ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(buf); 2481df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis data.write(*fence.get()); 249583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos status_t result = remote()->transact(CANCEL_BUFFER, data, &reply); 250583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos if (result != NO_ERROR) { 251583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos return result; 252583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos } 253583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos result = reply.readInt32(); 254583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos return result; 2558ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 2568ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 257eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian virtual int query(int what, int* value) { 258eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian Parcel data, reply; 2592adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 260eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian data.writeInt32(what); 2618a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(QUERY, data, &reply); 2628a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2638a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2648a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 265eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian value[0] = reply.readInt32(); 2668a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 267eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian return result; 268eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian } 269eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian 270f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza virtual status_t connect(const sp<IProducerListener>& listener, 271365857df8b94c959dea984a63013f6e7730ef976Mathias Agopian int api, bool producerControlledByApp, QueueBufferOutput* output) { 272fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis Parcel data, reply; 2732adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 274f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza if (listener != NULL) { 275f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza data.writeInt32(1); 276097ca275f4717a2c47a5d49f302ed2b72c8a1370Marco Nelissen data.writeStrongBinder(IInterface::asBinder(listener)); 277f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } else { 278f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza data.writeInt32(0); 279f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } 280fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis data.writeInt32(api); 281595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian data.writeInt32(producerControlledByApp); 2828a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(CONNECT, data, &reply); 2838a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2848a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2858a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 286baaad32cd582bcc09db89135715717234ea398eaBrian Anderson reply.read(*output); 2878a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 288fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return result; 289fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis } 2908072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian 29197b9c86338e2d364d47ea7522c2d81a8014f0e07Robert Carr virtual status_t disconnect(int api, DisconnectMode mode) { 292fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis Parcel data, reply; 2932adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 294fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis data.writeInt32(api); 29597b9c86338e2d364d47ea7522c2d81a8014f0e07Robert Carr data.writeInt32(static_cast<int32_t>(mode)); 2968a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result =remote()->transact(DISCONNECT, data, &reply); 2978a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2988a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2998a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 3008a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 301fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return result; 302fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis } 303399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 304399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall virtual status_t setSidebandStream(const sp<NativeHandle>& stream) { 305399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall Parcel data, reply; 306399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall status_t result; 307399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 308399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (stream.get()) { 309399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInt32(true); 310399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeNativeHandle(stream->handle()); 311399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } else { 312399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInt32(false); 313399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 314399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) { 315399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall result = reply.readInt32(); 316399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 317399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall return result; 318399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 31929a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza 320567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos virtual void allocateBuffers(uint32_t width, uint32_t height, 3213be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza PixelFormat format, uint32_t usage) { 32229a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza Parcel data, reply; 32329a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 3243be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(width); 3253be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(height); 32629a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza data.writeInt32(static_cast<int32_t>(format)); 3273be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(usage); 32829a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply); 32929a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza if (result != NO_ERROR) { 33029a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza ALOGE("allocateBuffers failed to transact: %d", result); 33129a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza } 33229a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza } 3339de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza 3349de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza virtual status_t allowAllocation(bool allow) { 3359de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza Parcel data, reply; 3369de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 3379de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza data.writeInt32(static_cast<int32_t>(allow)); 3389de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza status_t result = remote()->transact(ALLOW_ALLOCATION, data, &reply); 3399de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza if (result != NO_ERROR) { 3409de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza return result; 3419de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 3429de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza result = reply.readInt32(); 3439de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza return result; 3449de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 345812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza 346812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza virtual status_t setGenerationNumber(uint32_t generationNumber) { 347812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza Parcel data, reply; 348812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 349812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza data.writeUint32(generationNumber); 350812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza status_t result = remote()->transact(SET_GENERATION_NUMBER, data, &reply); 351812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza if (result == NO_ERROR) { 352812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza result = reply.readInt32(); 353812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza } 354812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza return result; 355812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza } 356c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza 357c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza virtual String8 getConsumerName() const { 358c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza Parcel data, reply; 359c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 360c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza status_t result = remote()->transact(GET_CONSUMER_NAME, data, &reply); 361c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza if (result != NO_ERROR) { 362c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza ALOGE("getConsumerName failed to transact: %d", result); 363c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza return String8("TransactFailed"); 364c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza } 365c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza return reply.readString8(); 366c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza } 3677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 3683559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos virtual status_t setSharedBufferMode(bool sharedBufferMode) { 369ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos Parcel data, reply; 370ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos data.writeInterfaceToken( 371ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 3723559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos data.writeInt32(sharedBufferMode); 3733559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos status_t result = remote()->transact(SET_SHARED_BUFFER_MODE, data, 374ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos &reply); 375ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos if (result == NO_ERROR) { 376ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos result = reply.readInt32(); 377ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos } 378ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos return result; 379ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos } 380127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza 381ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos virtual status_t setAutoRefresh(bool autoRefresh) { 382ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos Parcel data, reply; 383ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos data.writeInterfaceToken( 384ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 385ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos data.writeInt32(autoRefresh); 386ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos status_t result = remote()->transact(SET_AUTO_REFRESH, data, &reply); 387ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos if (result == NO_ERROR) { 388ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos result = reply.readInt32(); 389ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos } 390ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos return result; 391ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos } 392ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos 393127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza virtual status_t setDequeueTimeout(nsecs_t timeout) { 394127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza Parcel data, reply; 395127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 396127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza data.writeInt64(timeout); 397127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza status_t result = remote()->transact(SET_DEQUEUE_TIMEOUT, data, &reply); 398127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza if (result != NO_ERROR) { 399127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza ALOGE("setDequeueTimeout failed to transact: %d", result); 400127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza return result; 401127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza } 402127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza return reply.readInt32(); 403127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza } 40450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza 40550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, 4061a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck sp<Fence>* outFence, float outTransformMatrix[16]) override { 40750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza Parcel data, reply; 40850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 40950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER, data, 41050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza &reply); 41150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 41250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to transact: %d", result); 41350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 41450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 41550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza result = reply.readInt32(); 41650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 41750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 41850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 419ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck bool hasBuffer = reply.readBool(); 420ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck sp<GraphicBuffer> buffer; 421ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck if (hasBuffer) { 422ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck buffer = new GraphicBuffer(); 423ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck result = reply.read(*buffer); 4241a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck if (result == NO_ERROR) { 4251a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck result = reply.read(outTransformMatrix, sizeof(float) * 16); 4261a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck } 427ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck } 42850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 42950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to read buffer: %d", result); 43050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 43150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 43250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza sp<Fence> fence(new Fence); 43350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza result = reply.read(*fence); 43450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 43550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to read fence: %d", result); 43650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 43750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 43850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza *outBuffer = buffer; 43950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza *outFence = fence; 44050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 44150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 442ce796e78a57018f186b062199c75d94545318acaPablo Ceballos 4433890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson virtual void getFrameTimestamps(FrameEventHistoryDelta* outDelta) { 444ce796e78a57018f186b062199c75d94545318acaPablo Ceballos Parcel data, reply; 445ce796e78a57018f186b062199c75d94545318acaPablo Ceballos status_t result = data.writeInterfaceToken( 446ce796e78a57018f186b062199c75d94545318acaPablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 447ce796e78a57018f186b062199c75d94545318acaPablo Ceballos if (result != NO_ERROR) { 4483890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson ALOGE("IGBP::getFrameTimestamps failed to write token: %d", result); 4493890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson return; 450ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 451ce796e78a57018f186b062199c75d94545318acaPablo Ceballos result = remote()->transact(GET_FRAME_TIMESTAMPS, data, &reply); 452ce796e78a57018f186b062199c75d94545318acaPablo Ceballos if (result != NO_ERROR) { 4533890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson ALOGE("IGBP::getFrameTimestamps failed to transact: %d", result); 4543890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson return; 455ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 4563890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson result = reply.read(*outDelta); 457ce796e78a57018f186b062199c75d94545318acaPablo Ceballos if (result != NO_ERROR) { 4583890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson ALOGE("IGBP::getFrameTimestamps failed to read timestamps: %d", 4593890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson result); 460ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 461ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 4626155b40830e7945e9d4a76fe89af9a6322d4977fPablo Ceballos 4638e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos virtual status_t getUniqueId(uint64_t* outId) const { 4648e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos Parcel data, reply; 4658e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 4668e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos status_t result = remote()->transact(GET_UNIQUE_ID, data, &reply); 4678e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos if (result != NO_ERROR) { 4688e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos ALOGE("getUniqueId failed to transact: %d", result); 4698e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 4708e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos status_t actualResult = NO_ERROR; 4718e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos result = reply.readInt32(&actualResult); 4728e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos if (result != NO_ERROR) { 4738e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return result; 4748e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 4758e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos result = reply.readUint64(outId); 4768e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos if (result != NO_ERROR) { 4778e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return result; 4788e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 4798e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return actualResult; 4808e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 4818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; 4828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 4833be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza// Out-of-line virtual method definition to trigger vtable emission in this 4843be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza// translation unit (see clang warning -Wweak-vtables) 4853be1c6b60a188dc10025e2ce156c11fac050625dDan StozaBpGraphicBufferProducer::~BpGraphicBufferProducer() {} 4863be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza 487466a192d2088f9238d34597d1aa28da41367c1caAndy McFaddenIMPLEMENT_META_INTERFACE(GraphicBufferProducer, "android.gui.IGraphicBufferProducer"); 4888ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 4898ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------- 4908ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 4912adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenstatus_t BnGraphicBufferProducer::onTransact( 4928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 4938ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 4948ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis switch(code) { 4958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case REQUEST_BUFFER: { 4962adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 4978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int bufferIdx = data.readInt32(); 4987b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis sp<GraphicBuffer> buffer; 4997b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis int result = requestBuffer(bufferIdx, &buffer); 5008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(buffer != 0); 5018ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis if (buffer != 0) { 5028ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->write(*buffer); 5038ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 5047b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis reply->writeInt32(result); 5058ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 5063be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 507fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos case SET_MAX_DEQUEUED_BUFFER_COUNT: { 508fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 509fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos int maxDequeuedBuffers = data.readInt32(); 510fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos int result = setMaxDequeuedBufferCount(maxDequeuedBuffers); 511fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos reply->writeInt32(result); 512fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return NO_ERROR; 513fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 514fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos case SET_ASYNC_MODE: { 515fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 516fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos bool async = data.readInt32(); 517fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos int result = setAsyncMode(async); 518fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos reply->writeInt32(result); 519fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return NO_ERROR; 520fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 5218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case DEQUEUE_BUFFER: { 5222adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 5233be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t width = data.readUint32(); 5243be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t height = data.readUint32(); 5253be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza PixelFormat format = static_cast<PixelFormat>(data.readInt32()); 5263be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t usage = data.readUint32(); 5277c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson bool getTimestamps = data.readBool(); 528baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 52912ba0f57d028a9c8f4eb3afddc326b70677d1e0cNaveen Leekha int buf = 0; 530baaad32cd582bcc09db89135715717234ea398eaBrian Anderson sp<Fence> fence = Fence::NO_FENCE; 5317c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson FrameEventHistoryDelta frameTimestamps; 532567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos int result = dequeueBuffer(&buf, &fence, width, height, format, 5337c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson usage, getTimestamps ? &frameTimestamps : nullptr); 534baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 5358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(buf); 536baaad32cd582bcc09db89135715717234ea398eaBrian Anderson reply->write(*fence); 5377c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson if (getTimestamps) { 5387c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson reply->write(frameTimestamps); 5397c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson } 5408ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(result); 5419f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return NO_ERROR; 5423be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 5439f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza case DETACH_BUFFER: { 5449f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 5459f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int slot = data.readInt32(); 5469f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int result = detachBuffer(slot); 5479f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(result); 5489f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return NO_ERROR; 5493be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 550d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza case DETACH_NEXT_BUFFER: { 551d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 552d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<GraphicBuffer> buffer; 553d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<Fence> fence; 554d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza int32_t result = detachNextBuffer(&buffer, &fence); 555d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(result); 556d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result == NO_ERROR) { 557d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(buffer != NULL); 558d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (buffer != NULL) { 559d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->write(*buffer); 560d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 561d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(fence != NULL); 562d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (fence != NULL) { 563d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->write(*fence); 564d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 565d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 566d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return NO_ERROR; 5673be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 5689f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza case ATTACH_BUFFER: { 5699f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 5709f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza sp<GraphicBuffer> buffer = new GraphicBuffer(); 57170636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos status_t result = data.read(*buffer.get()); 57212ba0f57d028a9c8f4eb3afddc326b70677d1e0cNaveen Leekha int slot = 0; 57370636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos if (result == NO_ERROR) { 57470636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos result = attachBuffer(&slot, buffer); 57570636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos } 5769f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(slot); 5779f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(result); 5788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 5793be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 5808ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case QUEUE_BUFFER: { 5812adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 5827c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 5838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int buf = data.readInt32(); 584c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall QueueBufferInput input(data); 585baaad32cd582bcc09db89135715717234ea398eaBrian Anderson QueueBufferOutput output; 586baaad32cd582bcc09db89135715717234ea398eaBrian Anderson status_t result = queueBuffer(buf, input, &output); 587baaad32cd582bcc09db89135715717234ea398eaBrian Anderson reply->write(output); 5888ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(result); 5897c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 5908ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 5913be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 5928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case CANCEL_BUFFER: { 5932adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 5948ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int buf = data.readInt32(); 5951df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis sp<Fence> fence = new Fence(); 59670636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos status_t result = data.read(*fence.get()); 59770636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos if (result == NO_ERROR) { 59870636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos result = cancelBuffer(buf, fence); 59970636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos } 600583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos reply->writeInt32(result); 6018ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 6023be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 603eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian case QUERY: { 6042adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 60512ba0f57d028a9c8f4eb3afddc326b70677d1e0cNaveen Leekha int value = 0; 606eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian int what = data.readInt32(); 607eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian int res = query(what, &value); 608eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian reply->writeInt32(value); 609eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian reply->writeInt32(res); 610eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian return NO_ERROR; 6113be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 612fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis case CONNECT: { 6132adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 614f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza sp<IProducerListener> listener; 615f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza if (data.readInt32() == 1) { 616f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza listener = IProducerListener::asInterface(data.readStrongBinder()); 617f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } 618fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis int api = data.readInt32(); 619595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian bool producerControlledByApp = data.readInt32(); 620baaad32cd582bcc09db89135715717234ea398eaBrian Anderson QueueBufferOutput output; 621baaad32cd582bcc09db89135715717234ea398eaBrian Anderson status_t res = connect(listener, api, producerControlledByApp, &output); 622baaad32cd582bcc09db89135715717234ea398eaBrian Anderson reply->write(output); 623fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis reply->writeInt32(res); 624fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return NO_ERROR; 6253be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 626fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis case DISCONNECT: { 6272adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 628fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis int api = data.readInt32(); 62997b9c86338e2d364d47ea7522c2d81a8014f0e07Robert Carr DisconnectMode mode = static_cast<DisconnectMode>(data.readInt32()); 63097b9c86338e2d364d47ea7522c2d81a8014f0e07Robert Carr status_t res = disconnect(api, mode); 631fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis reply->writeInt32(res); 632fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return NO_ERROR; 6333be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 634399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall case SET_SIDEBAND_STREAM: { 635399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 636399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall sp<NativeHandle> stream; 637399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (data.readInt32()) { 6380ec54e156bed93d59900b742c8e9adcfaee90612Wonsik Kim stream = NativeHandle::create(data.readNativeHandle(), true); 639399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 640399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall status_t result = setSidebandStream(stream); 641399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall reply->writeInt32(result); 642399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall return NO_ERROR; 6433be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 6449de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza case ALLOCATE_BUFFERS: { 64529a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 6463be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t width = data.readUint32(); 6473be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t height = data.readUint32(); 6483be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza PixelFormat format = static_cast<PixelFormat>(data.readInt32()); 6493be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t usage = data.readUint32(); 650567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos allocateBuffers(width, height, format, usage); 65129a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza return NO_ERROR; 6529de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 6539de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza case ALLOW_ALLOCATION: { 6549de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 6559de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza bool allow = static_cast<bool>(data.readInt32()); 6569de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza status_t result = allowAllocation(allow); 6579de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza reply->writeInt32(result); 6589de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza return NO_ERROR; 6599de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 660812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza case SET_GENERATION_NUMBER: { 661812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 662812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza uint32_t generationNumber = data.readUint32(); 663812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza status_t result = setGenerationNumber(generationNumber); 664812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza reply->writeInt32(result); 665812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza return NO_ERROR; 666812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza } 667c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza case GET_CONSUMER_NAME: { 668c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 669c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza reply->writeString8(getConsumerName()); 670c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza return NO_ERROR; 671c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza } 6723559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos case SET_SHARED_BUFFER_MODE: { 673ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 6743559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos bool sharedBufferMode = data.readInt32(); 6753559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos status_t result = setSharedBufferMode(sharedBufferMode); 676ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos reply->writeInt32(result); 677ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos return NO_ERROR; 678ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos } 679ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos case SET_AUTO_REFRESH: { 680ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos CHECK_INTERFACE(IGraphicBuffer, data, reply); 681ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos bool autoRefresh = data.readInt32(); 682ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos status_t result = setAutoRefresh(autoRefresh); 683ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos reply->writeInt32(result); 684ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos return NO_ERROR; 685ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos } 686127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza case SET_DEQUEUE_TIMEOUT: { 687127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 688127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza nsecs_t timeout = data.readInt64(); 689127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza status_t result = setDequeueTimeout(timeout); 690127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza reply->writeInt32(result); 691127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza return NO_ERROR; 692127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza } 69350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza case GET_LAST_QUEUED_BUFFER: { 69450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 69550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza sp<GraphicBuffer> buffer(nullptr); 69650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza sp<Fence> fence(Fence::NO_FENCE); 6971a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck float transform[16] = {}; 6981a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck status_t result = getLastQueuedBuffer(&buffer, &fence, transform); 69950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza reply->writeInt32(result); 70050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 70150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 70250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 703ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck if (!buffer.get()) { 704ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck reply->writeBool(false); 705ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck } else { 706ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck reply->writeBool(true); 707ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck result = reply->write(*buffer); 7081a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck if (result == NO_ERROR) { 7091a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck reply->write(transform, sizeof(float) * 16); 7101a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck } 711ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck } 71250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 71350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to write buffer: %d", result); 71450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 71550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 71650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza result = reply->write(*fence); 71750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 71850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to write fence: %d", result); 71950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 72050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 72150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return NO_ERROR; 72250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 723ce796e78a57018f186b062199c75d94545318acaPablo Ceballos case GET_FRAME_TIMESTAMPS: { 724ce796e78a57018f186b062199c75d94545318acaPablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 7253890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson FrameEventHistoryDelta frameTimestamps; 7263890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson getFrameTimestamps(&frameTimestamps); 7273890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson status_t result = reply->write(frameTimestamps); 728ce796e78a57018f186b062199c75d94545318acaPablo Ceballos if (result != NO_ERROR) { 7293890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson ALOGE("BnGBP::GET_FRAME_TIMESTAMPS failed to write buffer: %d", 7303890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson result); 731ce796e78a57018f186b062199c75d94545318acaPablo Ceballos return result; 732ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 733ce796e78a57018f186b062199c75d94545318acaPablo Ceballos return NO_ERROR; 734ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 7358e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos case GET_UNIQUE_ID: { 7368e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 7378e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos uint64_t outId = 0; 7388e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos status_t actualResult = getUniqueId(&outId); 7398e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos status_t result = reply->writeInt32(actualResult); 7408e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos if (result != NO_ERROR) { 7418e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return result; 7428e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 7438e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos result = reply->writeUint64(outId); 7448e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos if (result != NO_ERROR) { 7458e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return result; 7468e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 7478e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return NO_ERROR; 7488e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 7498ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 7508ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return BBinder::onTransact(code, data, reply, flags); 7518ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 7528ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 7538ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------------- 7548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 7552adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenIGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) { 756c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall parcel.read(*this); 757c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 758c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 7597c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Andersonconstexpr size_t IGraphicBufferProducer::QueueBufferInput::minFlattenedSize() { 7607c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return sizeof(timestamp) + 7617c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(isAutoTimestamp) + 7627c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(dataSpace) + 7637c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(crop) + 7647c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(scalingMode) + 7657c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(transform) + 7667c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(stickyTransform) + 7677c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(getFrameTimestamps); 7687c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson} 7697c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 770e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const { 7717c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return minFlattenedSize() + 7727c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson fence->getFlattenedSize() + 7737c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson surfaceDamage.getFlattenedSize(); 774c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 775c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 776e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const { 7771df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis return fence->getFdCount(); 778c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 779c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 780e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t IGraphicBufferProducer::QueueBufferInput::flatten( 781e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian void*& buffer, size_t& size, int*& fds, size_t& count) const 782c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall{ 783e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < getFlattenedSize()) { 784e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 785e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 7867c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 787e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, timestamp); 7883c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden FlattenableUtils::write(buffer, size, isAutoTimestamp); 78982c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala FlattenableUtils::write(buffer, size, dataSpace); 790e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, crop); 791e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, scalingMode); 792e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, transform); 7931681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk FlattenableUtils::write(buffer, size, stickyTransform); 7947c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson FlattenableUtils::write(buffer, size, getFrameTimestamps); 7957c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 7965065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza status_t result = fence->flatten(buffer, size, fds, count); 7975065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza if (result != NO_ERROR) { 7985065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return result; 7995065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza } 8005065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return surfaceDamage.flatten(buffer, size); 801c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 802c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 803e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t IGraphicBufferProducer::QueueBufferInput::unflatten( 804e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian void const*& buffer, size_t& size, int const*& fds, size_t& count) 805c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall{ 8067c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson if (size < minFlattenedSize()) { 807e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 808e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 809e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 810e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, timestamp); 8113c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden FlattenableUtils::read(buffer, size, isAutoTimestamp); 81282c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala FlattenableUtils::read(buffer, size, dataSpace); 813e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, crop); 814e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, scalingMode); 815e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, transform); 8161681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk FlattenableUtils::read(buffer, size, stickyTransform); 8177c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson FlattenableUtils::read(buffer, size, getFrameTimestamps); 818e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 8191df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis fence = new Fence(); 8205065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza status_t result = fence->unflatten(buffer, size, fds, count); 8215065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza if (result != NO_ERROR) { 8225065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return result; 8235065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza } 8245065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return surfaceDamage.unflatten(buffer, size); 825c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 826c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 827baaad32cd582bcc09db89135715717234ea398eaBrian Anderson// ---------------------------------------------------------------------------- 8287c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Andersonconstexpr size_t IGraphicBufferProducer::QueueBufferOutput::minFlattenedSize() { 8297c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return sizeof(width) + 8307c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(height) + 8317c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(transformHint) + 8327c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(numPendingBuffers) + 83322f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang sizeof(nextFrameNumber) + 83422f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang sizeof(bufferReplaced); 8357c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson} 836baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 837baaad32cd582bcc09db89135715717234ea398eaBrian Andersonsize_t IGraphicBufferProducer::QueueBufferOutput::getFlattenedSize() const { 8387c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return minFlattenedSize() + frameTimestamps.getFlattenedSize(); 839baaad32cd582bcc09db89135715717234ea398eaBrian Anderson} 840baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 841baaad32cd582bcc09db89135715717234ea398eaBrian Andersonsize_t IGraphicBufferProducer::QueueBufferOutput::getFdCount() const { 8427c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return frameTimestamps.getFdCount(); 843baaad32cd582bcc09db89135715717234ea398eaBrian Anderson} 844baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 845baaad32cd582bcc09db89135715717234ea398eaBrian Andersonstatus_t IGraphicBufferProducer::QueueBufferOutput::flatten( 8467c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson void*& buffer, size_t& size, int*& fds, size_t& count) const 847baaad32cd582bcc09db89135715717234ea398eaBrian Anderson{ 848baaad32cd582bcc09db89135715717234ea398eaBrian Anderson if (size < getFlattenedSize()) { 849baaad32cd582bcc09db89135715717234ea398eaBrian Anderson return NO_MEMORY; 850baaad32cd582bcc09db89135715717234ea398eaBrian Anderson } 8517c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 852baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::write(buffer, size, width); 853baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::write(buffer, size, height); 854baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::write(buffer, size, transformHint); 855baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::write(buffer, size, numPendingBuffers); 856baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::write(buffer, size, nextFrameNumber); 85722f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang FlattenableUtils::write(buffer, size, bufferReplaced); 858baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 8597c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return frameTimestamps.flatten(buffer, size, fds, count); 860baaad32cd582bcc09db89135715717234ea398eaBrian Anderson} 861baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 862baaad32cd582bcc09db89135715717234ea398eaBrian Andersonstatus_t IGraphicBufferProducer::QueueBufferOutput::unflatten( 8637c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson void const*& buffer, size_t& size, int const*& fds, size_t& count) 864baaad32cd582bcc09db89135715717234ea398eaBrian Anderson{ 8657c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson if (size < minFlattenedSize()) { 866baaad32cd582bcc09db89135715717234ea398eaBrian Anderson return NO_MEMORY; 867baaad32cd582bcc09db89135715717234ea398eaBrian Anderson } 8687c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 869baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::read(buffer, size, width); 870baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::read(buffer, size, height); 871baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::read(buffer, size, transformHint); 872baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::read(buffer, size, numPendingBuffers); 873baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::read(buffer, size, nextFrameNumber); 87422f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang FlattenableUtils::read(buffer, size, bufferReplaced); 875baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 8767c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return frameTimestamps.unflatten(buffer, size, fds, count); 877baaad32cd582bcc09db89135715717234ea398eaBrian Anderson} 878baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 8798ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; // namespace android 880