IGraphicBufferProducer.cpp revision a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8
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 30c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu#include <gui/BufferQueueDefs.h> 312adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden#include <gui/IGraphicBufferProducer.h> 32f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza#include <gui/IProducerListener.h> 338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 346e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa#include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h> 356e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisnamespace android { 378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------------- 388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 396e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasausing ::android::hardware::graphics::bufferqueue::V1_0::utils:: 406e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa H2BGraphicBufferProducer; 416e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisenum { 438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis REQUEST_BUFFER = IBinder::FIRST_CALL_TRANSACTION, 448ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis DEQUEUE_BUFFER, 459f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza DETACH_BUFFER, 46d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza DETACH_NEXT_BUFFER, 479f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza ATTACH_BUFFER, 488ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis QUEUE_BUFFER, 498ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis CANCEL_BUFFER, 50eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian QUERY, 51fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis CONNECT, 52fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis DISCONNECT, 53399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall SET_SIDEBAND_STREAM, 5429a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza ALLOCATE_BUFFERS, 559de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza ALLOW_ALLOCATION, 56812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza SET_GENERATION_NUMBER, 57c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza GET_CONSUMER_NAME, 58fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos SET_MAX_DEQUEUED_BUFFER_COUNT, 597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza SET_ASYNC_MODE, 603559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos SET_SHARED_BUFFER_MODE, 61ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos SET_AUTO_REFRESH, 62127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza SET_DEQUEUE_TIMEOUT, 6350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza GET_LAST_QUEUED_BUFFER, 64fc35258c9dd71b68dc278fa0c9220d74fd643f31Pablo Ceballos GET_FRAME_TIMESTAMPS, 65fc35258c9dd71b68dc278fa0c9220d74fd643f31Pablo Ceballos GET_UNIQUE_ID 668ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; 678ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 682adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenclass BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer> 698ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 708ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennispublic: 71e2347b7953f70232541bdc1b392230d6231aaeb9Chih-Hung Hsieh explicit BpGraphicBufferProducer(const sp<IBinder>& impl) 722adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden : BpInterface<IGraphicBufferProducer>(impl) 738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis { 748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 76ca0385170e75244f0c4f7cfec4f47ba1c0307176Yi Kong ~BpGraphicBufferProducer() override; 773be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza 787b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) { 798ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 802adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(bufferIdx); 828a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result =remote()->transact(REQUEST_BUFFER, data, &reply); 838a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 848a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 858a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 868ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis bool nonNull = reply.readInt32(); 878ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis if (nonNull) { 887b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis *buf = new GraphicBuffer(); 892aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu result = reply.read(**buf); 902aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu if(result != NO_ERROR) { 912aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu (*buf).clear(); 922aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu return result; 932aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu } 948ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 958a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 967b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis return result; 978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 99fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos virtual status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) { 100fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos Parcel data, reply; 101fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data.writeInterfaceToken( 102fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 103fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data.writeInt32(maxDequeuedBuffers); 104fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos status_t result = remote()->transact(SET_MAX_DEQUEUED_BUFFER_COUNT, 105fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data, &reply); 106fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos if (result != NO_ERROR) { 107fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return result; 108fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 109fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos result = reply.readInt32(); 110fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return result; 111fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 112fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos 113fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos virtual status_t setAsyncMode(bool async) { 114fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos Parcel data, reply; 115fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data.writeInterfaceToken( 116fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 117fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data.writeInt32(async); 118fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos status_t result = remote()->transact(SET_ASYNC_MODE, 119fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data, &reply); 120fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos if (result != NO_ERROR) { 121fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return result; 122fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 123fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos result = reply.readInt32(); 124fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return result; 125fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 126fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos 127a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott virtual status_t dequeueBuffer(int* buf, sp<Fence>* fence, uint32_t width, uint32_t height, 128a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott PixelFormat format, uint64_t usage, uint64_t* outBufferAge, 129a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott FrameEventHistoryDelta* outTimestamps) { 1308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 1317c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson bool getFrameTimestamps = (outTimestamps != nullptr); 132baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 1332adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1343be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(width); 1353be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(height); 1363be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeInt32(static_cast<int32_t>(format)); 137cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian data.writeUint64(usage); 1387c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson data.writeBool(getFrameTimestamps); 139baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 1408a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply); 1418a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 1428a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 1438a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 144baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 1458ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis *buf = reply.readInt32(); 146baaad32cd582bcc09db89135715717234ea398eaBrian Anderson *fence = new Fence(); 147baaad32cd582bcc09db89135715717234ea398eaBrian Anderson result = reply.read(**fence); 148baaad32cd582bcc09db89135715717234ea398eaBrian Anderson if (result != NO_ERROR) { 149baaad32cd582bcc09db89135715717234ea398eaBrian Anderson fence->clear(); 150baaad32cd582bcc09db89135715717234ea398eaBrian Anderson return result; 151f78575400977f644cf0b12beb2fa5fc278b6ed4cJesse Hall } 152a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott if (outBufferAge) { 153a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott result = reply.readUint64(outBufferAge); 154a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott } else { 155a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott // Read the value even if outBufferAge is nullptr: 156a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott uint64_t bufferAge; 157a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott result = reply.readUint64(&bufferAge); 158a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott } 159a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott if (result != NO_ERROR) { 160a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott ALOGE("IGBP::dequeueBuffer failed to read buffer age: %d", result); 161a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott return result; 162a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott } 1637c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson if (getFrameTimestamps) { 1647c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson result = reply.read(*outTimestamps); 1657c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson if (result != NO_ERROR) { 1667c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson ALOGE("IGBP::dequeueBuffer failed to read timestamps: %d", 1677c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson result); 1687c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return result; 1697c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson } 1707c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson } 1718a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 1728ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return result; 1738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 1748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1759f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza virtual status_t detachBuffer(int slot) { 1769f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza Parcel data, reply; 1779f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1789f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInt32(slot); 1799f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza status_t result = remote()->transact(DETACH_BUFFER, data, &reply); 1809f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza if (result != NO_ERROR) { 1819f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1829f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 1839f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza result = reply.readInt32(); 1849f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1859f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 1869f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 187d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer, 188d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<Fence>* outFence) { 189d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (outBuffer == NULL) { 190d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza ALOGE("detachNextBuffer: outBuffer must not be NULL"); 191d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return BAD_VALUE; 192d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } else if (outFence == NULL) { 193d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza ALOGE("detachNextBuffer: outFence must not be NULL"); 194d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return BAD_VALUE; 195d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 196d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza Parcel data, reply; 197d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 198d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply); 199d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result != NO_ERROR) { 200d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return result; 201d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 202d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza result = reply.readInt32(); 203d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result == NO_ERROR) { 204d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza bool nonNull = reply.readInt32(); 205d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (nonNull) { 206d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza *outBuffer = new GraphicBuffer; 20770636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos result = reply.read(**outBuffer); 20870636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos if (result != NO_ERROR) { 20970636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos outBuffer->clear(); 21070636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos return result; 21170636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos } 212d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 213d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza nonNull = reply.readInt32(); 214d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (nonNull) { 215d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza *outFence = new Fence; 21670636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos result = reply.read(**outFence); 21770636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos if (result != NO_ERROR) { 21870636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos outBuffer->clear(); 21970636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos outFence->clear(); 22070636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos return result; 22170636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos } 222d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 223d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 224d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return result; 225d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 226d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza 2279f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) { 2289f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza Parcel data, reply; 2299f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 2309f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.write(*buffer.get()); 2319f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza status_t result = remote()->transact(ATTACH_BUFFER, data, &reply); 2329f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza if (result != NO_ERROR) { 2339f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 2349f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 235c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu 2369f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza *slot = reply.readInt32(); 2379f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza result = reply.readInt32(); 238c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu if (result == NO_ERROR && 239c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu (*slot < 0 || *slot >= BufferQueueDefs::NUM_BUFFER_SLOTS)) { 240c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu ALOGE("attachBuffer returned invalid slot %d", *slot); 241c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu android_errorWriteLog(0x534e4554, "37478824"); 242c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu return UNKNOWN_ERROR; 243c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu } 244c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu 2459f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 2469f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 2479f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 248f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian virtual status_t queueBuffer(int buf, 249f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian const QueueBufferInput& input, QueueBufferOutput* output) { 2508ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 251baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 2522adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 2538ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(buf); 254c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall data.write(input); 255baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 2568a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(QUEUE_BUFFER, data, &reply); 2578a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2588a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2598a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 260baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 261baaad32cd582bcc09db89135715717234ea398eaBrian Anderson result = reply.read(*output); 262baaad32cd582bcc09db89135715717234ea398eaBrian Anderson if (result != NO_ERROR) { 263baaad32cd582bcc09db89135715717234ea398eaBrian Anderson return result; 264baaad32cd582bcc09db89135715717234ea398eaBrian Anderson } 265baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 2668a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 2678ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return result; 2688ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 2698ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 270583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos virtual status_t cancelBuffer(int buf, const sp<Fence>& fence) { 2718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 2722adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 2738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(buf); 2741df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis data.write(*fence.get()); 275583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos status_t result = remote()->transact(CANCEL_BUFFER, data, &reply); 276583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos if (result != NO_ERROR) { 277583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos return result; 278583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos } 279583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos result = reply.readInt32(); 280583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos return result; 2818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 2828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 283eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian virtual int query(int what, int* value) { 284eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian Parcel data, reply; 2852adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 286eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian data.writeInt32(what); 2878a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(QUERY, data, &reply); 2888a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2898a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2908a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 291eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian value[0] = reply.readInt32(); 2928a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 293eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian return result; 294eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian } 295eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian 296f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza virtual status_t connect(const sp<IProducerListener>& listener, 297365857df8b94c959dea984a63013f6e7730ef976Mathias Agopian int api, bool producerControlledByApp, QueueBufferOutput* output) { 298fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis Parcel data, reply; 2992adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 300f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza if (listener != NULL) { 301f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza data.writeInt32(1); 302097ca275f4717a2c47a5d49f302ed2b72c8a1370Marco Nelissen data.writeStrongBinder(IInterface::asBinder(listener)); 303f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } else { 304f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza data.writeInt32(0); 305f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } 306fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis data.writeInt32(api); 307595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian data.writeInt32(producerControlledByApp); 3088a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(CONNECT, data, &reply); 3098a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 3108a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 3118a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 312baaad32cd582bcc09db89135715717234ea398eaBrian Anderson reply.read(*output); 3138a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 314fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return result; 315fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis } 3168072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian 31797b9c86338e2d364d47ea7522c2d81a8014f0e07Robert Carr virtual status_t disconnect(int api, DisconnectMode mode) { 318fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis Parcel data, reply; 3192adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 320fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis data.writeInt32(api); 32197b9c86338e2d364d47ea7522c2d81a8014f0e07Robert Carr data.writeInt32(static_cast<int32_t>(mode)); 3228a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result =remote()->transact(DISCONNECT, data, &reply); 3238a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 3248a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 3258a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 3268a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 327fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return result; 328fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis } 329399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 330399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall virtual status_t setSidebandStream(const sp<NativeHandle>& stream) { 331399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall Parcel data, reply; 332399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall status_t result; 333399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 334399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (stream.get()) { 335399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInt32(true); 336399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeNativeHandle(stream->handle()); 337399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } else { 338399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInt32(false); 339399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 340399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) { 341399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall result = reply.readInt32(); 342399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 343399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall return result; 344399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 34529a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza 346567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos virtual void allocateBuffers(uint32_t width, uint32_t height, 347cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian PixelFormat format, uint64_t usage) { 34829a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza Parcel data, reply; 34929a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 3503be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(width); 3513be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(height); 35229a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza data.writeInt32(static_cast<int32_t>(format)); 353cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian data.writeUint64(usage); 35429a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply); 35529a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza if (result != NO_ERROR) { 35629a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza ALOGE("allocateBuffers failed to transact: %d", result); 35729a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza } 35829a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza } 3599de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza 3609de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza virtual status_t allowAllocation(bool allow) { 3619de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza Parcel data, reply; 3629de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 3639de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza data.writeInt32(static_cast<int32_t>(allow)); 3649de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza status_t result = remote()->transact(ALLOW_ALLOCATION, data, &reply); 3659de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza if (result != NO_ERROR) { 3669de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza return result; 3679de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 3689de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza result = reply.readInt32(); 3699de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza return result; 3709de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 371812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza 372812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza virtual status_t setGenerationNumber(uint32_t generationNumber) { 373812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza Parcel data, reply; 374812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 375812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza data.writeUint32(generationNumber); 376812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza status_t result = remote()->transact(SET_GENERATION_NUMBER, data, &reply); 377812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza if (result == NO_ERROR) { 378812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza result = reply.readInt32(); 379812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza } 380812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza return result; 381812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza } 382c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza 383c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza virtual String8 getConsumerName() const { 384c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza Parcel data, reply; 385c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 386c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza status_t result = remote()->transact(GET_CONSUMER_NAME, data, &reply); 387c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza if (result != NO_ERROR) { 388c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza ALOGE("getConsumerName failed to transact: %d", result); 389c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza return String8("TransactFailed"); 390c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza } 391c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza return reply.readString8(); 392c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza } 3937dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 3943559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos virtual status_t setSharedBufferMode(bool sharedBufferMode) { 395ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos Parcel data, reply; 396ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos data.writeInterfaceToken( 397ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 3983559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos data.writeInt32(sharedBufferMode); 3993559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos status_t result = remote()->transact(SET_SHARED_BUFFER_MODE, data, 400ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos &reply); 401ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos if (result == NO_ERROR) { 402ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos result = reply.readInt32(); 403ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos } 404ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos return result; 405ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos } 406127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza 407ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos virtual status_t setAutoRefresh(bool autoRefresh) { 408ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos Parcel data, reply; 409ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos data.writeInterfaceToken( 410ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 411ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos data.writeInt32(autoRefresh); 412ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos status_t result = remote()->transact(SET_AUTO_REFRESH, data, &reply); 413ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos if (result == NO_ERROR) { 414ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos result = reply.readInt32(); 415ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos } 416ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos return result; 417ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos } 418ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos 419127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza virtual status_t setDequeueTimeout(nsecs_t timeout) { 420127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza Parcel data, reply; 421127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 422127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza data.writeInt64(timeout); 423127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza status_t result = remote()->transact(SET_DEQUEUE_TIMEOUT, data, &reply); 424127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza if (result != NO_ERROR) { 425127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza ALOGE("setDequeueTimeout failed to transact: %d", result); 426127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza return result; 427127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza } 428127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza return reply.readInt32(); 429127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza } 43050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza 43150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, 4321a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck sp<Fence>* outFence, float outTransformMatrix[16]) override { 43350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza Parcel data, reply; 43450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 43550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER, data, 43650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza &reply); 43750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 43850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to transact: %d", result); 43950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 44050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 44150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza result = reply.readInt32(); 44250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 44350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 44450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 445ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck bool hasBuffer = reply.readBool(); 446ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck sp<GraphicBuffer> buffer; 447ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck if (hasBuffer) { 448ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck buffer = new GraphicBuffer(); 449ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck result = reply.read(*buffer); 4501a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck if (result == NO_ERROR) { 4511a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck result = reply.read(outTransformMatrix, sizeof(float) * 16); 4521a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck } 453ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck } 45450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 45550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to read buffer: %d", result); 45650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 45750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 45850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza sp<Fence> fence(new Fence); 45950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza result = reply.read(*fence); 46050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 46150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to read fence: %d", result); 46250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 46350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 46450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza *outBuffer = buffer; 46550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza *outFence = fence; 46650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 46750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 468ce796e78a57018f186b062199c75d94545318acaPablo Ceballos 4693890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson virtual void getFrameTimestamps(FrameEventHistoryDelta* outDelta) { 470ce796e78a57018f186b062199c75d94545318acaPablo Ceballos Parcel data, reply; 471ce796e78a57018f186b062199c75d94545318acaPablo Ceballos status_t result = data.writeInterfaceToken( 472ce796e78a57018f186b062199c75d94545318acaPablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 473ce796e78a57018f186b062199c75d94545318acaPablo Ceballos if (result != NO_ERROR) { 4743890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson ALOGE("IGBP::getFrameTimestamps failed to write token: %d", result); 4753890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson return; 476ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 477ce796e78a57018f186b062199c75d94545318acaPablo Ceballos result = remote()->transact(GET_FRAME_TIMESTAMPS, data, &reply); 478ce796e78a57018f186b062199c75d94545318acaPablo Ceballos if (result != NO_ERROR) { 4793890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson ALOGE("IGBP::getFrameTimestamps failed to transact: %d", result); 4803890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson return; 481ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 4823890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson result = reply.read(*outDelta); 483ce796e78a57018f186b062199c75d94545318acaPablo Ceballos if (result != NO_ERROR) { 4843890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson ALOGE("IGBP::getFrameTimestamps failed to read timestamps: %d", 4853890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson result); 486ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 487ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 4886155b40830e7945e9d4a76fe89af9a6322d4977fPablo Ceballos 4898e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos virtual status_t getUniqueId(uint64_t* outId) const { 4908e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos Parcel data, reply; 4918e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 4928e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos status_t result = remote()->transact(GET_UNIQUE_ID, data, &reply); 4938e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos if (result != NO_ERROR) { 4948e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos ALOGE("getUniqueId failed to transact: %d", result); 4958e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 4968e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos status_t actualResult = NO_ERROR; 4978e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos result = reply.readInt32(&actualResult); 4988e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos if (result != NO_ERROR) { 4998e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return result; 5008e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 5018e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos result = reply.readUint64(outId); 5028e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos if (result != NO_ERROR) { 5038e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return result; 5048e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 5058e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return actualResult; 5068e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 5078ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; 5088ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 5093be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza// Out-of-line virtual method definition to trigger vtable emission in this 5103be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza// translation unit (see clang warning -Wweak-vtables) 5113be1c6b60a188dc10025e2ce156c11fac050625dDan StozaBpGraphicBufferProducer::~BpGraphicBufferProducer() {} 5123be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza 5136e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasaclass HpGraphicBufferProducer : public HpInterface< 5146e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa BpGraphicBufferProducer, H2BGraphicBufferProducer> { 5156e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasapublic: 5166e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa HpGraphicBufferProducer(const sp<IBinder>& base) : PBase(base) {} 5176e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5186e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) override { 5196e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->requestBuffer(slot, buf); 5206e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5216e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5226e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) override { 5236e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->setMaxDequeuedBufferCount(maxDequeuedBuffers); 5246e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5256e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5266e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t setAsyncMode(bool async) override { 5276e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->setAsyncMode(async); 5286e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5296e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 530a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott status_t dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w, uint32_t h, PixelFormat format, 531a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott uint64_t usage, uint64_t* outBufferAge, 532a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott FrameEventHistoryDelta* outTimestamps) override { 533a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott return mBase->dequeueBuffer(slot, fence, w, h, format, usage, outBufferAge, outTimestamps); 5346e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5356e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5366e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t detachBuffer(int slot) override { 5376e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->detachBuffer(slot); 5386e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5396e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5406e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t detachNextBuffer( 5416e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) override { 5426e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->detachNextBuffer(outBuffer, outFence); 5436e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5446e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5456e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t attachBuffer( 5466e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa int* outSlot, const sp<GraphicBuffer>& buffer) override { 5476e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->attachBuffer(outSlot, buffer); 5486e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5496e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5506e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t queueBuffer( 5516e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa int slot, 5526e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa const QueueBufferInput& input, 5536e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa QueueBufferOutput* output) override { 5546e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->queueBuffer(slot, input, output); 5556e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5566e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5576e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t cancelBuffer(int slot, const sp<Fence>& fence) override { 5586e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->cancelBuffer(slot, fence); 5596e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5606e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5616e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa int query(int what, int* value) override { 5626e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->query(what, value); 5636e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5646e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5656e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t connect( 5666e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa const sp<IProducerListener>& listener, 5676e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa int api, bool producerControlledByApp, 5686e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa QueueBufferOutput* output) override { 5696e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->connect(listener, api, producerControlledByApp, output); 5706e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5716e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5726e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t disconnect( 5736e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa int api, DisconnectMode mode = DisconnectMode::Api) override { 5746e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->disconnect(api, mode); 5756e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5766e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5776e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t setSidebandStream(const sp<NativeHandle>& stream) override { 5786e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->setSidebandStream(stream); 5796e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5806e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5816e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa void allocateBuffers(uint32_t width, uint32_t height, 582cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian PixelFormat format, uint64_t usage) override { 5836e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->allocateBuffers(width, height, format, usage); 5846e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5856e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5866e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t allowAllocation(bool allow) override { 5876e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->allowAllocation(allow); 5886e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5896e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5906e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t setGenerationNumber(uint32_t generationNumber) override { 5916e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->setGenerationNumber(generationNumber); 5926e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5936e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5946e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa String8 getConsumerName() const override { 5956e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->getConsumerName(); 5966e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 5976e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 5986e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t setSharedBufferMode(bool sharedBufferMode) override { 5996e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->setSharedBufferMode(sharedBufferMode); 6006e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6016e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6026e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t setAutoRefresh(bool autoRefresh) override { 6036e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->setAutoRefresh(autoRefresh); 6046e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6056e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6066e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t setDequeueTimeout(nsecs_t timeout) override { 6076e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->setDequeueTimeout(timeout); 6086e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6096e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6106e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t getLastQueuedBuffer( 6116e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa sp<GraphicBuffer>* outBuffer, 6126e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa sp<Fence>* outFence, 6136e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa float outTransformMatrix[16]) override { 6146e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->getLastQueuedBuffer( 6156e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa outBuffer, outFence, outTransformMatrix); 6166e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6176e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6186e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa void getFrameTimestamps(FrameEventHistoryDelta* outDelta) override { 6196e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->getFrameTimestamps(outDelta); 6206e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6216e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6226e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa status_t getUniqueId(uint64_t* outId) const override { 6236e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa return mBase->getUniqueId(outId); 6246e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa } 6256e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa}; 6266e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa 6276e1193af40c870c50013affec37c8429986b3c7bPawin VongmasaIMPLEMENT_HYBRID_META_INTERFACE(GraphicBufferProducer, HGraphicBufferProducer, 6286e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa "android.gui.IGraphicBufferProducer"); 6298ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 6308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------- 6318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 6322adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenstatus_t BnGraphicBufferProducer::onTransact( 6338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 6348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 6358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis switch(code) { 6368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case REQUEST_BUFFER: { 6372adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 6388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int bufferIdx = data.readInt32(); 6397b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis sp<GraphicBuffer> buffer; 6407b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis int result = requestBuffer(bufferIdx, &buffer); 6418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(buffer != 0); 6428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis if (buffer != 0) { 6438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->write(*buffer); 6448ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 6457b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis reply->writeInt32(result); 6468ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 6473be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 648fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos case SET_MAX_DEQUEUED_BUFFER_COUNT: { 649fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 650fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos int maxDequeuedBuffers = data.readInt32(); 651fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos int result = setMaxDequeuedBufferCount(maxDequeuedBuffers); 652fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos reply->writeInt32(result); 653fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return NO_ERROR; 654fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 655fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos case SET_ASYNC_MODE: { 656fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 657fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos bool async = data.readInt32(); 658fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos int result = setAsyncMode(async); 659fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos reply->writeInt32(result); 660fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return NO_ERROR; 661fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 6628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case DEQUEUE_BUFFER: { 6632adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 6643be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t width = data.readUint32(); 6653be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t height = data.readUint32(); 6663be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza PixelFormat format = static_cast<PixelFormat>(data.readInt32()); 667cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian uint64_t usage = data.readUint64(); 668a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott uint64_t bufferAge = 0; 6697c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson bool getTimestamps = data.readBool(); 670baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 67112ba0f57d028a9c8f4eb3afddc326b70677d1e0cNaveen Leekha int buf = 0; 672baaad32cd582bcc09db89135715717234ea398eaBrian Anderson sp<Fence> fence = Fence::NO_FENCE; 6737c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson FrameEventHistoryDelta frameTimestamps; 674a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott int result = dequeueBuffer(&buf, &fence, width, height, format, usage, &bufferAge, 675a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott getTimestamps ? &frameTimestamps : nullptr); 676baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 6778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(buf); 678baaad32cd582bcc09db89135715717234ea398eaBrian Anderson reply->write(*fence); 679a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott reply->writeUint64(bufferAge); 6807c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson if (getTimestamps) { 6817c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson reply->write(frameTimestamps); 6827c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson } 6838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(result); 6849f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return NO_ERROR; 6853be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 6869f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza case DETACH_BUFFER: { 6879f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 6889f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int slot = data.readInt32(); 6899f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int result = detachBuffer(slot); 6909f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(result); 6919f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return NO_ERROR; 6923be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 693d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza case DETACH_NEXT_BUFFER: { 694d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 695d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<GraphicBuffer> buffer; 696d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<Fence> fence; 697d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza int32_t result = detachNextBuffer(&buffer, &fence); 698d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(result); 699d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result == NO_ERROR) { 700d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(buffer != NULL); 701d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (buffer != NULL) { 702d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->write(*buffer); 703d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 704d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(fence != NULL); 705d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (fence != NULL) { 706d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->write(*fence); 707d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 708d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 709d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return NO_ERROR; 7103be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 7119f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza case ATTACH_BUFFER: { 7129f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 7139f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza sp<GraphicBuffer> buffer = new GraphicBuffer(); 71470636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos status_t result = data.read(*buffer.get()); 71512ba0f57d028a9c8f4eb3afddc326b70677d1e0cNaveen Leekha int slot = 0; 71670636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos if (result == NO_ERROR) { 71770636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos result = attachBuffer(&slot, buffer); 71870636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos } 7199f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(slot); 7209f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(result); 7218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 7223be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 7238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case QUEUE_BUFFER: { 7242adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 7257c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 7268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int buf = data.readInt32(); 727c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall QueueBufferInput input(data); 728baaad32cd582bcc09db89135715717234ea398eaBrian Anderson QueueBufferOutput output; 729baaad32cd582bcc09db89135715717234ea398eaBrian Anderson status_t result = queueBuffer(buf, input, &output); 730baaad32cd582bcc09db89135715717234ea398eaBrian Anderson reply->write(output); 7318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(result); 7327c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 7338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 7343be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 7358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case CANCEL_BUFFER: { 7362adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 7378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int buf = data.readInt32(); 7381df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis sp<Fence> fence = new Fence(); 73970636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos status_t result = data.read(*fence.get()); 74070636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos if (result == NO_ERROR) { 74170636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos result = cancelBuffer(buf, fence); 74270636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos } 743583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos reply->writeInt32(result); 7448ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 7453be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 746eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian case QUERY: { 7472adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 74812ba0f57d028a9c8f4eb3afddc326b70677d1e0cNaveen Leekha int value = 0; 749eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian int what = data.readInt32(); 750eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian int res = query(what, &value); 751eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian reply->writeInt32(value); 752eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian reply->writeInt32(res); 753eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian return NO_ERROR; 7543be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 755fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis case CONNECT: { 7562adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 757f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza sp<IProducerListener> listener; 758f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza if (data.readInt32() == 1) { 759f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza listener = IProducerListener::asInterface(data.readStrongBinder()); 760f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } 761fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis int api = data.readInt32(); 762595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian bool producerControlledByApp = data.readInt32(); 763baaad32cd582bcc09db89135715717234ea398eaBrian Anderson QueueBufferOutput output; 764baaad32cd582bcc09db89135715717234ea398eaBrian Anderson status_t res = connect(listener, api, producerControlledByApp, &output); 765baaad32cd582bcc09db89135715717234ea398eaBrian Anderson reply->write(output); 766fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis reply->writeInt32(res); 767fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return NO_ERROR; 7683be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 769fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis case DISCONNECT: { 7702adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 771fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis int api = data.readInt32(); 77297b9c86338e2d364d47ea7522c2d81a8014f0e07Robert Carr DisconnectMode mode = static_cast<DisconnectMode>(data.readInt32()); 77397b9c86338e2d364d47ea7522c2d81a8014f0e07Robert Carr status_t res = disconnect(api, mode); 774fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis reply->writeInt32(res); 775fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return NO_ERROR; 7763be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 777399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall case SET_SIDEBAND_STREAM: { 778399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 779399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall sp<NativeHandle> stream; 780399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (data.readInt32()) { 7810ec54e156bed93d59900b742c8e9adcfaee90612Wonsik Kim stream = NativeHandle::create(data.readNativeHandle(), true); 782399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 783399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall status_t result = setSidebandStream(stream); 784399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall reply->writeInt32(result); 785399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall return NO_ERROR; 7863be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 7879de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza case ALLOCATE_BUFFERS: { 78829a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 7893be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t width = data.readUint32(); 7903be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t height = data.readUint32(); 7913be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza PixelFormat format = static_cast<PixelFormat>(data.readInt32()); 792cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian uint64_t usage = data.readUint64(); 793567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos allocateBuffers(width, height, format, usage); 79429a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza return NO_ERROR; 7959de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 7969de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza case ALLOW_ALLOCATION: { 7979de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 7989de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza bool allow = static_cast<bool>(data.readInt32()); 7999de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza status_t result = allowAllocation(allow); 8009de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza reply->writeInt32(result); 8019de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza return NO_ERROR; 8029de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 803812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza case SET_GENERATION_NUMBER: { 804812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 805812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza uint32_t generationNumber = data.readUint32(); 806812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza status_t result = setGenerationNumber(generationNumber); 807812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza reply->writeInt32(result); 808812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza return NO_ERROR; 809812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza } 810c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza case GET_CONSUMER_NAME: { 811c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 812c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza reply->writeString8(getConsumerName()); 813c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza return NO_ERROR; 814c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza } 8153559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos case SET_SHARED_BUFFER_MODE: { 816ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 8173559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos bool sharedBufferMode = data.readInt32(); 8183559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos status_t result = setSharedBufferMode(sharedBufferMode); 819ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos reply->writeInt32(result); 820ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos return NO_ERROR; 821ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos } 822ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos case SET_AUTO_REFRESH: { 823ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos CHECK_INTERFACE(IGraphicBuffer, data, reply); 824ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos bool autoRefresh = data.readInt32(); 825ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos status_t result = setAutoRefresh(autoRefresh); 826ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos reply->writeInt32(result); 827ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos return NO_ERROR; 828ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos } 829127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza case SET_DEQUEUE_TIMEOUT: { 830127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 831127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza nsecs_t timeout = data.readInt64(); 832127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza status_t result = setDequeueTimeout(timeout); 833127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza reply->writeInt32(result); 834127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza return NO_ERROR; 835127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza } 83650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza case GET_LAST_QUEUED_BUFFER: { 83750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 83850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza sp<GraphicBuffer> buffer(nullptr); 83950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza sp<Fence> fence(Fence::NO_FENCE); 8401a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck float transform[16] = {}; 8411a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck status_t result = getLastQueuedBuffer(&buffer, &fence, transform); 84250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza reply->writeInt32(result); 84350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 84450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 84550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 846ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck if (!buffer.get()) { 847ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck reply->writeBool(false); 848ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck } else { 849ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck reply->writeBool(true); 850ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck result = reply->write(*buffer); 8511a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck if (result == NO_ERROR) { 8521a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck reply->write(transform, sizeof(float) * 16); 8531a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck } 854ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck } 85550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 85650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to write buffer: %d", result); 85750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 85850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 85950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza result = reply->write(*fence); 86050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 86150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to write fence: %d", result); 86250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 86350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 86450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return NO_ERROR; 86550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 866ce796e78a57018f186b062199c75d94545318acaPablo Ceballos case GET_FRAME_TIMESTAMPS: { 867ce796e78a57018f186b062199c75d94545318acaPablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 8683890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson FrameEventHistoryDelta frameTimestamps; 8693890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson getFrameTimestamps(&frameTimestamps); 8703890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson status_t result = reply->write(frameTimestamps); 871ce796e78a57018f186b062199c75d94545318acaPablo Ceballos if (result != NO_ERROR) { 8723890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson ALOGE("BnGBP::GET_FRAME_TIMESTAMPS failed to write buffer: %d", 8733890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson result); 874ce796e78a57018f186b062199c75d94545318acaPablo Ceballos return result; 875ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 876ce796e78a57018f186b062199c75d94545318acaPablo Ceballos return NO_ERROR; 877ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 8788e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos case GET_UNIQUE_ID: { 8798e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 8808e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos uint64_t outId = 0; 8818e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos status_t actualResult = getUniqueId(&outId); 8828e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos status_t result = reply->writeInt32(actualResult); 8838e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos if (result != NO_ERROR) { 8848e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return result; 8858e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 8868e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos result = reply->writeUint64(outId); 8878e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos if (result != NO_ERROR) { 8888e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return result; 8898e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 8908e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return NO_ERROR; 8918e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos } 8928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 8938ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return BBinder::onTransact(code, data, reply, flags); 8948ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 8958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 8968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------------- 8978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 8982adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenIGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) { 899c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall parcel.read(*this); 900c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 901c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 9027c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Andersonconstexpr size_t IGraphicBufferProducer::QueueBufferInput::minFlattenedSize() { 9037c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return sizeof(timestamp) + 9047c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(isAutoTimestamp) + 9057c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(dataSpace) + 9067c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(crop) + 9077c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(scalingMode) + 9087c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(transform) + 9097c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(stickyTransform) + 9107c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(getFrameTimestamps); 9117c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson} 9127c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 913e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const { 9147c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return minFlattenedSize() + 9157c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson fence->getFlattenedSize() + 9167c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson surfaceDamage.getFlattenedSize(); 917c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 918c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 919e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const { 9201df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis return fence->getFdCount(); 921c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 922c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 923e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t IGraphicBufferProducer::QueueBufferInput::flatten( 924e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian void*& buffer, size_t& size, int*& fds, size_t& count) const 925c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall{ 926e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < getFlattenedSize()) { 927e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 928e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 9297c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 930e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, timestamp); 9313c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden FlattenableUtils::write(buffer, size, isAutoTimestamp); 93282c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala FlattenableUtils::write(buffer, size, dataSpace); 933e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, crop); 934e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, scalingMode); 935e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, transform); 9361681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk FlattenableUtils::write(buffer, size, stickyTransform); 9377c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson FlattenableUtils::write(buffer, size, getFrameTimestamps); 9387c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 9395065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza status_t result = fence->flatten(buffer, size, fds, count); 9405065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza if (result != NO_ERROR) { 9415065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return result; 9425065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza } 9435065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return surfaceDamage.flatten(buffer, size); 944c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 945c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 946e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t IGraphicBufferProducer::QueueBufferInput::unflatten( 947e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian void const*& buffer, size_t& size, int const*& fds, size_t& count) 948c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall{ 9497c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson if (size < minFlattenedSize()) { 950e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 951e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 952e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 953e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, timestamp); 9543c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden FlattenableUtils::read(buffer, size, isAutoTimestamp); 95582c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala FlattenableUtils::read(buffer, size, dataSpace); 956e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, crop); 957e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, scalingMode); 958e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, transform); 9591681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk FlattenableUtils::read(buffer, size, stickyTransform); 9607c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson FlattenableUtils::read(buffer, size, getFrameTimestamps); 961e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 9621df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis fence = new Fence(); 9635065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza status_t result = fence->unflatten(buffer, size, fds, count); 9645065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza if (result != NO_ERROR) { 9655065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return result; 9665065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza } 9675065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return surfaceDamage.unflatten(buffer, size); 968c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 969c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 970baaad32cd582bcc09db89135715717234ea398eaBrian Anderson// ---------------------------------------------------------------------------- 9717c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Andersonconstexpr size_t IGraphicBufferProducer::QueueBufferOutput::minFlattenedSize() { 9727c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return sizeof(width) + 9737c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(height) + 9747c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(transformHint) + 9757c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson sizeof(numPendingBuffers) + 97622f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang sizeof(nextFrameNumber) + 97722f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang sizeof(bufferReplaced); 9787c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson} 979baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 980baaad32cd582bcc09db89135715717234ea398eaBrian Andersonsize_t IGraphicBufferProducer::QueueBufferOutput::getFlattenedSize() const { 9817c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return minFlattenedSize() + frameTimestamps.getFlattenedSize(); 982baaad32cd582bcc09db89135715717234ea398eaBrian Anderson} 983baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 984baaad32cd582bcc09db89135715717234ea398eaBrian Andersonsize_t IGraphicBufferProducer::QueueBufferOutput::getFdCount() const { 9857c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return frameTimestamps.getFdCount(); 986baaad32cd582bcc09db89135715717234ea398eaBrian Anderson} 987baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 988baaad32cd582bcc09db89135715717234ea398eaBrian Andersonstatus_t IGraphicBufferProducer::QueueBufferOutput::flatten( 9897c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson void*& buffer, size_t& size, int*& fds, size_t& count) const 990baaad32cd582bcc09db89135715717234ea398eaBrian Anderson{ 991baaad32cd582bcc09db89135715717234ea398eaBrian Anderson if (size < getFlattenedSize()) { 992baaad32cd582bcc09db89135715717234ea398eaBrian Anderson return NO_MEMORY; 993baaad32cd582bcc09db89135715717234ea398eaBrian Anderson } 9947c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 995baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::write(buffer, size, width); 996baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::write(buffer, size, height); 997baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::write(buffer, size, transformHint); 998baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::write(buffer, size, numPendingBuffers); 999baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::write(buffer, size, nextFrameNumber); 100022f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang FlattenableUtils::write(buffer, size, bufferReplaced); 1001baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 10027c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return frameTimestamps.flatten(buffer, size, fds, count); 1003baaad32cd582bcc09db89135715717234ea398eaBrian Anderson} 1004baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 1005baaad32cd582bcc09db89135715717234ea398eaBrian Andersonstatus_t IGraphicBufferProducer::QueueBufferOutput::unflatten( 10067c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson void const*& buffer, size_t& size, int const*& fds, size_t& count) 1007baaad32cd582bcc09db89135715717234ea398eaBrian Anderson{ 10087c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson if (size < minFlattenedSize()) { 1009baaad32cd582bcc09db89135715717234ea398eaBrian Anderson return NO_MEMORY; 1010baaad32cd582bcc09db89135715717234ea398eaBrian Anderson } 10117c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson 1012baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::read(buffer, size, width); 1013baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::read(buffer, size, height); 1014baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::read(buffer, size, transformHint); 1015baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::read(buffer, size, numPendingBuffers); 1016baaad32cd582bcc09db89135715717234ea398eaBrian Anderson FlattenableUtils::read(buffer, size, nextFrameNumber); 101722f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang FlattenableUtils::read(buffer, size, bufferReplaced); 1018baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 10197c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return frameTimestamps.unflatten(buffer, size, fds, count); 1020baaad32cd582bcc09db89135715717234ea398eaBrian Anderson} 1021baaad32cd582bcc09db89135715717234ea398eaBrian Anderson 10228ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; // namespace android 1023