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, 53ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos GET_NEXT_FRAME_NUMBER, 543559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos SET_SHARED_BUFFER_MODE, 55ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos SET_AUTO_REFRESH, 56127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza SET_DEQUEUE_TIMEOUT, 5750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza GET_LAST_QUEUED_BUFFER, 58eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos GET_UNIQUE_ID, 598ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; 608ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 612adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenclass BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer> 628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 638ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennispublic: 642adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden 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, 121567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos uint32_t height, PixelFormat format, uint32_t usage) { 1228ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 1232adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1243be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(width); 1253be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(height); 1263be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeInt32(static_cast<int32_t>(format)); 1273be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(usage); 1288a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply); 1298a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 1308a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 1318a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 1328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis *buf = reply.readInt32(); 133ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian bool nonNull = reply.readInt32(); 134ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian if (nonNull) { 1354c00cc11141da7d159eb2323b186ed344115c0f1Jesse Hall *fence = new Fence(); 136ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian reply.read(**fence); 137f78575400977f644cf0b12beb2fa5fc278b6ed4cJesse Hall } 1388a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 1398ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return result; 1408ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 1418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1429f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza virtual status_t detachBuffer(int slot) { 1439f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza Parcel data, reply; 1449f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1459f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInt32(slot); 1469f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza status_t result = remote()->transact(DETACH_BUFFER, data, &reply); 1479f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza if (result != NO_ERROR) { 1489f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1499f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 1509f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza result = reply.readInt32(); 1519f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1529f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 1539f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 154d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer, 155d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<Fence>* outFence) { 156d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (outBuffer == NULL) { 157d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza ALOGE("detachNextBuffer: outBuffer must not be NULL"); 158d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return BAD_VALUE; 159d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } else if (outFence == NULL) { 160d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza ALOGE("detachNextBuffer: outFence must not be NULL"); 161d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return BAD_VALUE; 162d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 163d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza Parcel data, reply; 164d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 165d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply); 166d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result != NO_ERROR) { 167d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return result; 168d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 169d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza result = reply.readInt32(); 170d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result == NO_ERROR) { 171d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza bool nonNull = reply.readInt32(); 172d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (nonNull) { 173d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza *outBuffer = new GraphicBuffer; 174d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply.read(**outBuffer); 175d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 176d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza nonNull = reply.readInt32(); 177d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (nonNull) { 178d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza *outFence = new Fence; 179d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply.read(**outFence); 180d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 181d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 182d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return result; 183d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 184d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza 1859f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) { 1869f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza Parcel data, reply; 1879f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1889f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.write(*buffer.get()); 1899f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza status_t result = remote()->transact(ATTACH_BUFFER, data, &reply); 1909f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza if (result != NO_ERROR) { 1919f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1929f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 1939f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza *slot = reply.readInt32(); 1949f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza result = reply.readInt32(); 1959f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1969f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 1979f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 198f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian virtual status_t queueBuffer(int buf, 199f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian const QueueBufferInput& input, QueueBufferOutput* output) { 2008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 2012adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 2028ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(buf); 203c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall data.write(input); 2048a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(QUEUE_BUFFER, data, &reply); 2058a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2068a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2078a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 208f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian memcpy(output, reply.readInplace(sizeof(*output)), sizeof(*output)); 2098a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 2108ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return result; 2118ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 2128ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 213583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos virtual status_t cancelBuffer(int buf, const sp<Fence>& fence) { 2148ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 2152adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 2168ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(buf); 2171df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis data.write(*fence.get()); 218583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos status_t result = remote()->transact(CANCEL_BUFFER, data, &reply); 219583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos if (result != NO_ERROR) { 220583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos return result; 221583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos } 222583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos result = reply.readInt32(); 223583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos return result; 2248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 2258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 226eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian virtual int query(int what, int* value) { 227eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian Parcel data, reply; 2282adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 229eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian data.writeInt32(what); 2308a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(QUERY, data, &reply); 2318a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2328a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2338a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 234eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian value[0] = reply.readInt32(); 2358a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 236eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian return result; 237eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian } 238eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian 239f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza virtual status_t connect(const sp<IProducerListener>& listener, 240365857df8b94c959dea984a63013f6e7730ef976Mathias Agopian int api, bool producerControlledByApp, QueueBufferOutput* output) { 241fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis Parcel data, reply; 2422adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 243f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza if (listener != NULL) { 244f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza data.writeInt32(1); 245097ca275f4717a2c47a5d49f302ed2b72c8a1370Marco Nelissen data.writeStrongBinder(IInterface::asBinder(listener)); 246f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } else { 247f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza data.writeInt32(0); 248f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } 249fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis data.writeInt32(api); 250595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian data.writeInt32(producerControlledByApp); 2518a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(CONNECT, data, &reply); 2528a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2538a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2548a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 25524202f5676c32edeef6544cf36e06b9fc970dbdeMathias Agopian memcpy(output, reply.readInplace(sizeof(*output)), sizeof(*output)); 2568a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 257fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return result; 258fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis } 2598072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian 260fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis virtual status_t disconnect(int api) { 261fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis Parcel data, reply; 2622adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 263fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis data.writeInt32(api); 2648a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result =remote()->transact(DISCONNECT, data, &reply); 2658a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2668a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2678a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 2688a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 269fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return result; 270fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis } 271399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 272399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall virtual status_t setSidebandStream(const sp<NativeHandle>& stream) { 273399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall Parcel data, reply; 274399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall status_t result; 275399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 276399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (stream.get()) { 277399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInt32(true); 278399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeNativeHandle(stream->handle()); 279399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } else { 280399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInt32(false); 281399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 282399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) { 283399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall result = reply.readInt32(); 284399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 285399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall return result; 286399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 28729a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza 288567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos virtual void allocateBuffers(uint32_t width, uint32_t height, 2893be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza PixelFormat format, uint32_t usage) { 29029a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza Parcel data, reply; 29129a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 2923be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(width); 2933be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(height); 29429a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza data.writeInt32(static_cast<int32_t>(format)); 2953be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(usage); 29629a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply); 29729a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza if (result != NO_ERROR) { 29829a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza ALOGE("allocateBuffers failed to transact: %d", result); 29929a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza } 30029a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza } 3019de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza 3029de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza virtual status_t allowAllocation(bool allow) { 3039de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza Parcel data, reply; 3049de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 3059de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza data.writeInt32(static_cast<int32_t>(allow)); 3069de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza status_t result = remote()->transact(ALLOW_ALLOCATION, data, &reply); 3079de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza if (result != NO_ERROR) { 3089de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza return result; 3099de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 3109de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza result = reply.readInt32(); 3119de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza return result; 3129de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 313812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza 314812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza virtual status_t setGenerationNumber(uint32_t generationNumber) { 315812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza Parcel data, reply; 316812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 317812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza data.writeUint32(generationNumber); 318812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza status_t result = remote()->transact(SET_GENERATION_NUMBER, data, &reply); 319812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza if (result == NO_ERROR) { 320812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza result = reply.readInt32(); 321812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza } 322812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza return result; 323812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza } 324c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza 325c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza virtual String8 getConsumerName() const { 326c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza Parcel data, reply; 327c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 328c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza status_t result = remote()->transact(GET_CONSUMER_NAME, data, &reply); 329c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza if (result != NO_ERROR) { 330c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza ALOGE("getConsumerName failed to transact: %d", result); 331c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza return String8("TransactFailed"); 332c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza } 333c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza return reply.readString8(); 334c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza } 3357dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 3367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza virtual uint64_t getNextFrameNumber() const { 3377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza Parcel data, reply; 3387dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 3397dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza status_t result = remote()->transact(GET_NEXT_FRAME_NUMBER, data, &reply); 3407dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (result != NO_ERROR) { 3417dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ALOGE("getNextFrameNumber failed to transact: %d", result); 3427dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return 0; 3437dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 3447dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza uint64_t frameNumber = reply.readUint64(); 3457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return frameNumber; 3467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 347ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos 3483559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos virtual status_t setSharedBufferMode(bool sharedBufferMode) { 349ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos Parcel data, reply; 350ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos data.writeInterfaceToken( 351ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 3523559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos data.writeInt32(sharedBufferMode); 3533559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos status_t result = remote()->transact(SET_SHARED_BUFFER_MODE, data, 354ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos &reply); 355ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos if (result == NO_ERROR) { 356ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos result = reply.readInt32(); 357ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos } 358ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos return result; 359ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos } 360127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza 361ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos virtual status_t setAutoRefresh(bool autoRefresh) { 362ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos Parcel data, reply; 363ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos data.writeInterfaceToken( 364ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 365ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos data.writeInt32(autoRefresh); 366ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos status_t result = remote()->transact(SET_AUTO_REFRESH, data, &reply); 367ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos if (result == NO_ERROR) { 368ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos result = reply.readInt32(); 369ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos } 370ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos return result; 371ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos } 372ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos 373127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza virtual status_t setDequeueTimeout(nsecs_t timeout) { 374127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza Parcel data, reply; 375127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 376127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza data.writeInt64(timeout); 377127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza status_t result = remote()->transact(SET_DEQUEUE_TIMEOUT, data, &reply); 378127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza if (result != NO_ERROR) { 379127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza ALOGE("setDequeueTimeout failed to transact: %d", result); 380127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza return result; 381127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza } 382127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza return reply.readInt32(); 383127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza } 38450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza 38550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, 3861a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck sp<Fence>* outFence, float outTransformMatrix[16]) override { 38750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza Parcel data, reply; 38850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 38950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER, data, 39050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza &reply); 39150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 39250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to transact: %d", result); 39350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 39450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 39550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza result = reply.readInt32(); 39650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 39750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 39850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 399ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck bool hasBuffer = reply.readBool(); 400ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck sp<GraphicBuffer> buffer; 401ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck if (hasBuffer) { 402ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck buffer = new GraphicBuffer(); 403ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck result = reply.read(*buffer); 4041a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck if (result == NO_ERROR) { 4051a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck result = reply.read(outTransformMatrix, sizeof(float) * 16); 4061a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck } 407ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck } 40850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 40950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to read buffer: %d", result); 41050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 41150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 41250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza sp<Fence> fence(new Fence); 41350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza result = reply.read(*fence); 41450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 41550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to read fence: %d", result); 41650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 41750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 41850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza *outBuffer = buffer; 41950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza *outFence = fence; 42050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 42150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 422eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos 423eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos virtual status_t getUniqueId(uint64_t* outId) const { 424eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos Parcel data, reply; 425eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 426eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos status_t result = remote()->transact(GET_UNIQUE_ID, data, &reply); 427eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos if (result != NO_ERROR) { 428eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos ALOGE("getUniqueId failed to transact: %d", result); 429eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos } 430eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos status_t actualResult = NO_ERROR; 431eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos result = reply.readInt32(&actualResult); 432eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos if (result != NO_ERROR) { 433eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos return result; 434eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos } 435eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos result = reply.readUint64(outId); 436eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos if (result != NO_ERROR) { 437eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos return result; 438eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos } 439eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos return actualResult; 440eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos } 4418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; 4428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 4433be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza// Out-of-line virtual method definition to trigger vtable emission in this 4443be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza// translation unit (see clang warning -Wweak-vtables) 4453be1c6b60a188dc10025e2ce156c11fac050625dDan StozaBpGraphicBufferProducer::~BpGraphicBufferProducer() {} 4463be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza 447466a192d2088f9238d34597d1aa28da41367c1caAndy McFaddenIMPLEMENT_META_INTERFACE(GraphicBufferProducer, "android.gui.IGraphicBufferProducer"); 4488ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 4498ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------- 4508ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 4512adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenstatus_t BnGraphicBufferProducer::onTransact( 4528ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 4538ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 4548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis switch(code) { 4558ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case REQUEST_BUFFER: { 4562adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 4578ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int bufferIdx = data.readInt32(); 4587b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis sp<GraphicBuffer> buffer; 4597b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis int result = requestBuffer(bufferIdx, &buffer); 4608ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(buffer != 0); 4618ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis if (buffer != 0) { 4628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->write(*buffer); 4638ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 4647b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis reply->writeInt32(result); 4658ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 4663be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 467fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos case SET_MAX_DEQUEUED_BUFFER_COUNT: { 468fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 469fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos int maxDequeuedBuffers = data.readInt32(); 470fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos int result = setMaxDequeuedBufferCount(maxDequeuedBuffers); 471fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos reply->writeInt32(result); 472fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return NO_ERROR; 473fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 474fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos case SET_ASYNC_MODE: { 475fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 476fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos bool async = data.readInt32(); 477fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos int result = setAsyncMode(async); 478fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos reply->writeInt32(result); 479fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return NO_ERROR; 480fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 4818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case DEQUEUE_BUFFER: { 4822adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 4833be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t width = data.readUint32(); 4843be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t height = data.readUint32(); 4853be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza PixelFormat format = static_cast<PixelFormat>(data.readInt32()); 4863be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t usage = data.readUint32(); 48712ba0f57d028a9c8f4eb3afddc326b70677d1e0cNaveen Leekha int buf = 0; 488f78575400977f644cf0b12beb2fa5fc278b6ed4cJesse Hall sp<Fence> fence; 489567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos int result = dequeueBuffer(&buf, &fence, width, height, format, 490567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos usage); 4918ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(buf); 4921df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis reply->writeInt32(fence != NULL); 4931df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis if (fence != NULL) { 494ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian reply->write(*fence); 495f78575400977f644cf0b12beb2fa5fc278b6ed4cJesse Hall } 4968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(result); 4979f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return NO_ERROR; 4983be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 4999f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza case DETACH_BUFFER: { 5009f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 5019f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int slot = data.readInt32(); 5029f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int result = detachBuffer(slot); 5039f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(result); 5049f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return NO_ERROR; 5053be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 506d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza case DETACH_NEXT_BUFFER: { 507d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 508d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<GraphicBuffer> buffer; 509d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<Fence> fence; 510d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza int32_t result = detachNextBuffer(&buffer, &fence); 511d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(result); 512d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result == NO_ERROR) { 513d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(buffer != NULL); 514d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (buffer != NULL) { 515d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->write(*buffer); 516d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 517d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(fence != NULL); 518d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (fence != NULL) { 519d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->write(*fence); 520d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 521d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 522d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return NO_ERROR; 5233be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 5249f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza case ATTACH_BUFFER: { 5259f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 5269f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza sp<GraphicBuffer> buffer = new GraphicBuffer(); 5279f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.read(*buffer.get()); 52812ba0f57d028a9c8f4eb3afddc326b70677d1e0cNaveen Leekha int slot = 0; 5299f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int result = attachBuffer(&slot, buffer); 5309f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(slot); 5319f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(result); 5328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 5333be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 5348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case QUEUE_BUFFER: { 5352adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 5368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int buf = data.readInt32(); 537c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall QueueBufferInput input(data); 538f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian QueueBufferOutput* const output = 539f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian reinterpret_cast<QueueBufferOutput *>( 540f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian reply->writeInplace(sizeof(QueueBufferOutput))); 541d06421fd37fbb7fd07002e6738fac3a223cb1a62Robert Shih memset(output, 0, sizeof(QueueBufferOutput)); 542c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall status_t result = queueBuffer(buf, input, output); 5438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(result); 5448ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 5453be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 5468ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case CANCEL_BUFFER: { 5472adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 5488ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int buf = data.readInt32(); 5491df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis sp<Fence> fence = new Fence(); 5501df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis data.read(*fence.get()); 551583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos status_t result = cancelBuffer(buf, fence); 552583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos reply->writeInt32(result); 5538ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 5543be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 555eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian case QUERY: { 5562adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 55712ba0f57d028a9c8f4eb3afddc326b70677d1e0cNaveen Leekha int value = 0; 558eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian int what = data.readInt32(); 559eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian int res = query(what, &value); 560eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian reply->writeInt32(value); 561eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian reply->writeInt32(res); 562eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian return NO_ERROR; 5633be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 564fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis case CONNECT: { 5652adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 566f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza sp<IProducerListener> listener; 567f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza if (data.readInt32() == 1) { 568f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza listener = IProducerListener::asInterface(data.readStrongBinder()); 569f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } 570fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis int api = data.readInt32(); 571595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian bool producerControlledByApp = data.readInt32(); 57224202f5676c32edeef6544cf36e06b9fc970dbdeMathias Agopian QueueBufferOutput* const output = 57324202f5676c32edeef6544cf36e06b9fc970dbdeMathias Agopian reinterpret_cast<QueueBufferOutput *>( 57424202f5676c32edeef6544cf36e06b9fc970dbdeMathias Agopian reply->writeInplace(sizeof(QueueBufferOutput))); 57593c617fd2a5e7910e0ba5c0ed6da152d30920679Pablo Ceballos memset(output, 0, sizeof(QueueBufferOutput)); 576f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza status_t res = connect(listener, api, producerControlledByApp, output); 577fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis reply->writeInt32(res); 578fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return NO_ERROR; 5793be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 580fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis case DISCONNECT: { 5812adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 582fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis int api = data.readInt32(); 5832773004a83624ed41cf3f94f2b11878cd8521812Mathias Agopian status_t res = disconnect(api); 584fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis reply->writeInt32(res); 585fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return NO_ERROR; 5863be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 587399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall case SET_SIDEBAND_STREAM: { 588399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 589399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall sp<NativeHandle> stream; 590399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (data.readInt32()) { 5910ec54e156bed93d59900b742c8e9adcfaee90612Wonsik Kim stream = NativeHandle::create(data.readNativeHandle(), true); 592399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 593399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall status_t result = setSidebandStream(stream); 594399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall reply->writeInt32(result); 595399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall return NO_ERROR; 5963be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 5979de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza case ALLOCATE_BUFFERS: { 59829a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 5993be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t width = data.readUint32(); 6003be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t height = data.readUint32(); 6013be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza PixelFormat format = static_cast<PixelFormat>(data.readInt32()); 6023be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t usage = data.readUint32(); 603567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos allocateBuffers(width, height, format, usage); 60429a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza return NO_ERROR; 6059de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 6069de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza case ALLOW_ALLOCATION: { 6079de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 6089de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza bool allow = static_cast<bool>(data.readInt32()); 6099de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza status_t result = allowAllocation(allow); 6109de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza reply->writeInt32(result); 6119de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza return NO_ERROR; 6129de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 613812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza case SET_GENERATION_NUMBER: { 614812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 615812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza uint32_t generationNumber = data.readUint32(); 616812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza status_t result = setGenerationNumber(generationNumber); 617812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza reply->writeInt32(result); 618812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza return NO_ERROR; 619812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza } 620c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza case GET_CONSUMER_NAME: { 621c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 622c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza reply->writeString8(getConsumerName()); 623c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza return NO_ERROR; 624c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza } 6257dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza case GET_NEXT_FRAME_NUMBER: { 6267dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 6277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza uint64_t frameNumber = getNextFrameNumber(); 6287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza reply->writeUint64(frameNumber); 6297dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return NO_ERROR; 6307dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 6313559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos case SET_SHARED_BUFFER_MODE: { 632ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 6333559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos bool sharedBufferMode = data.readInt32(); 6343559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos status_t result = setSharedBufferMode(sharedBufferMode); 635ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos reply->writeInt32(result); 636ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos return NO_ERROR; 637ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos } 638ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos case SET_AUTO_REFRESH: { 639ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos CHECK_INTERFACE(IGraphicBuffer, data, reply); 640ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos bool autoRefresh = data.readInt32(); 641ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos status_t result = setAutoRefresh(autoRefresh); 642ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos reply->writeInt32(result); 643ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos return NO_ERROR; 644ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos } 645127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza case SET_DEQUEUE_TIMEOUT: { 646127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 647127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza nsecs_t timeout = data.readInt64(); 648127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza status_t result = setDequeueTimeout(timeout); 649127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza reply->writeInt32(result); 650127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza return NO_ERROR; 651127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza } 65250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza case GET_LAST_QUEUED_BUFFER: { 65350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 65450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza sp<GraphicBuffer> buffer(nullptr); 65550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza sp<Fence> fence(Fence::NO_FENCE); 6561a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck float transform[16] = {}; 6571a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck status_t result = getLastQueuedBuffer(&buffer, &fence, transform); 65850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza reply->writeInt32(result); 65950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 66050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 66150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 662ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck if (!buffer.get()) { 663ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck reply->writeBool(false); 664ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck } else { 665ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck reply->writeBool(true); 666ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck result = reply->write(*buffer); 6671a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck if (result == NO_ERROR) { 6681a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck reply->write(transform, sizeof(float) * 16); 6691a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck } 670ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck } 67150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 67250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to write buffer: %d", result); 67350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 67450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 67550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza result = reply->write(*fence); 67650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (result != NO_ERROR) { 67750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza ALOGE("getLastQueuedBuffer failed to write fence: %d", result); 67850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return result; 67950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 68050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza return NO_ERROR; 68150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 682eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos case GET_UNIQUE_ID: { 683eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 684eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos uint64_t outId = 0; 685eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos status_t actualResult = getUniqueId(&outId); 686eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos status_t result = reply->writeInt32(actualResult); 687eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos if (result != NO_ERROR) { 688eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos return result; 689eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos } 690eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos result = reply->writeUint64(outId); 691eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos if (result != NO_ERROR) { 692eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos return result; 693eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos } 694eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos return NO_ERROR; 695eb7980c224a54f860b7af5ecf30cbc633ae41289Pablo Ceballos } 6968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 6978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return BBinder::onTransact(code, data, reply, flags); 6988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 6998ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 7008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------------- 7018ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 7022adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenIGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) { 703c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall parcel.read(*this); 704c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 705c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 706e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const { 707c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall return sizeof(timestamp) 7083c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden + sizeof(isAutoTimestamp) 70982c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala + sizeof(dataSpace) 710c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall + sizeof(crop) 711c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall + sizeof(scalingMode) 712c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall + sizeof(transform) 7131681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk + sizeof(stickyTransform) 7145065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza + fence->getFlattenedSize() 7155065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza + surfaceDamage.getFlattenedSize(); 716c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 717c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 718e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const { 7191df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis return fence->getFdCount(); 720c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 721c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 722e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t IGraphicBufferProducer::QueueBufferInput::flatten( 723e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian void*& buffer, size_t& size, int*& fds, size_t& count) const 724c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall{ 725e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < getFlattenedSize()) { 726e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 727e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 728e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, timestamp); 7293c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden FlattenableUtils::write(buffer, size, isAutoTimestamp); 73082c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala FlattenableUtils::write(buffer, size, dataSpace); 731e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, crop); 732e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, scalingMode); 733e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, transform); 7341681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk FlattenableUtils::write(buffer, size, stickyTransform); 7355065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza status_t result = fence->flatten(buffer, size, fds, count); 7365065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza if (result != NO_ERROR) { 7375065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return result; 7385065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza } 7395065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return surfaceDamage.flatten(buffer, size); 740c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 741c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 742e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t IGraphicBufferProducer::QueueBufferInput::unflatten( 743e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian void const*& buffer, size_t& size, int const*& fds, size_t& count) 744c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall{ 745e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian size_t minNeeded = 746e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian sizeof(timestamp) 7473c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden + sizeof(isAutoTimestamp) 74882c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala + sizeof(dataSpace) 749e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian + sizeof(crop) 750e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian + sizeof(scalingMode) 751e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian + sizeof(transform) 752567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos + sizeof(stickyTransform); 753e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 754e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < minNeeded) { 755e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 756e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 757e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 758e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, timestamp); 7593c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden FlattenableUtils::read(buffer, size, isAutoTimestamp); 76082c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala FlattenableUtils::read(buffer, size, dataSpace); 761e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, crop); 762e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, scalingMode); 763e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, transform); 7641681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk FlattenableUtils::read(buffer, size, stickyTransform); 765e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 7661df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis fence = new Fence(); 7675065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza status_t result = fence->unflatten(buffer, size, fds, count); 7685065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza if (result != NO_ERROR) { 7695065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return result; 7705065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza } 7715065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return surfaceDamage.unflatten(buffer, size); 772c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 773c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 7748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; // namespace android 775