IGraphicBufferProducer.cpp revision 12ba0f57d028a9c8f4eb3afddc326b70677d1e0c
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, 52fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos SET_ASYNC_MODE 538ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; 548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 552adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenclass BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer> 568ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 578ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennispublic: 582adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden BpGraphicBufferProducer(const sp<IBinder>& impl) 592adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden : BpInterface<IGraphicBufferProducer>(impl) 608ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis { 618ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 633be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza virtual ~BpGraphicBufferProducer(); 643be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza 657b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) { 668ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 672adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 688ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(bufferIdx); 698a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result =remote()->transact(REQUEST_BUFFER, data, &reply); 708a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 718a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 728a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis bool nonNull = reply.readInt32(); 748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis if (nonNull) { 757b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis *buf = new GraphicBuffer(); 762aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu result = reply.read(**buf); 772aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu if(result != NO_ERROR) { 782aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu (*buf).clear(); 792aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu return result; 802aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu } 818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 828a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 837b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis return result; 848ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 86fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos virtual status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) { 87fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos Parcel data, reply; 88fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data.writeInterfaceToken( 89fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 90fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data.writeInt32(maxDequeuedBuffers); 91fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos status_t result = remote()->transact(SET_MAX_DEQUEUED_BUFFER_COUNT, 92fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data, &reply); 93fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos if (result != NO_ERROR) { 94fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return result; 95fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 96fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos result = reply.readInt32(); 97fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return result; 98fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 99fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos 100fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos virtual status_t setAsyncMode(bool async) { 101fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos Parcel data, reply; 102fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data.writeInterfaceToken( 103fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos IGraphicBufferProducer::getInterfaceDescriptor()); 104fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data.writeInt32(async); 105fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos status_t result = remote()->transact(SET_ASYNC_MODE, 106fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos data, &reply); 107fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos if (result != NO_ERROR) { 108fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return result; 109fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 110fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos result = reply.readInt32(); 111fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return result; 112fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 113fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos 1147cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian virtual status_t dequeueBuffer(int *buf, sp<Fence>* fence, bool async, 1153be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t width, uint32_t height, PixelFormat format, 1163be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t usage) { 1178ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 1182adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1193be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeInt32(static_cast<int32_t>(async)); 1203be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(width); 1213be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(height); 1223be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeInt32(static_cast<int32_t>(format)); 1233be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(usage); 1248a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply); 1258a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 1268a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 1278a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 1288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis *buf = reply.readInt32(); 129ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian bool nonNull = reply.readInt32(); 130ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian if (nonNull) { 1314c00cc11141da7d159eb2323b186ed344115c0f1Jesse Hall *fence = new Fence(); 132ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian reply.read(**fence); 133f78575400977f644cf0b12beb2fa5fc278b6ed4cJesse Hall } 1348a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 1358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return result; 1368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 1378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1389f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza virtual status_t detachBuffer(int slot) { 1399f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza Parcel data, reply; 1409f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1419f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInt32(slot); 1429f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza status_t result = remote()->transact(DETACH_BUFFER, data, &reply); 1439f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza if (result != NO_ERROR) { 1449f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1459f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 1469f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza result = reply.readInt32(); 1479f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1489f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 1499f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 150d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer, 151d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<Fence>* outFence) { 152d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (outBuffer == NULL) { 153d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza ALOGE("detachNextBuffer: outBuffer must not be NULL"); 154d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return BAD_VALUE; 155d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } else if (outFence == NULL) { 156d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza ALOGE("detachNextBuffer: outFence must not be NULL"); 157d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return BAD_VALUE; 158d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 159d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza Parcel data, reply; 160d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 161d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply); 162d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result != NO_ERROR) { 163d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return result; 164d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 165d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza result = reply.readInt32(); 166d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result == NO_ERROR) { 167d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza bool nonNull = reply.readInt32(); 168d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (nonNull) { 169d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza *outBuffer = new GraphicBuffer; 170d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply.read(**outBuffer); 171d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 172d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza nonNull = reply.readInt32(); 173d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (nonNull) { 174d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza *outFence = new Fence; 175d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply.read(**outFence); 176d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 177d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 178d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return result; 179d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 180d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza 1819f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) { 1829f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza Parcel data, reply; 1839f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1849f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.write(*buffer.get()); 1859f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza status_t result = remote()->transact(ATTACH_BUFFER, data, &reply); 1869f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza if (result != NO_ERROR) { 1879f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1889f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 1899f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza *slot = reply.readInt32(); 1909f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza result = reply.readInt32(); 1919f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1929f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 1939f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 194f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian virtual status_t queueBuffer(int buf, 195f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian const QueueBufferInput& input, QueueBufferOutput* output) { 1968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 1972adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(buf); 199c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall data.write(input); 2008a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(QUEUE_BUFFER, data, &reply); 2018a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2028a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2038a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 204f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian memcpy(output, reply.readInplace(sizeof(*output)), sizeof(*output)); 2058a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 2068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return result; 2078ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 2088ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2094c00cc11141da7d159eb2323b186ed344115c0f1Jesse Hall virtual void cancelBuffer(int buf, const sp<Fence>& fence) { 2108ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 2112adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 2128ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(buf); 2131df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis data.write(*fence.get()); 2148ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis remote()->transact(CANCEL_BUFFER, data, &reply); 2158ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 2168ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 217eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian virtual int query(int what, int* value) { 218eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian Parcel data, reply; 2192adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 220eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian data.writeInt32(what); 2218a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(QUERY, data, &reply); 2228a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2238a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2248a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 225eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian value[0] = reply.readInt32(); 2268a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 227eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian return result; 228eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian } 229eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian 230f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza virtual status_t connect(const sp<IProducerListener>& listener, 231365857df8b94c959dea984a63013f6e7730ef976Mathias Agopian int api, bool producerControlledByApp, QueueBufferOutput* output) { 232fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis Parcel data, reply; 2332adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 234f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza if (listener != NULL) { 235f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza data.writeInt32(1); 236097ca275f4717a2c47a5d49f302ed2b72c8a1370Marco Nelissen data.writeStrongBinder(IInterface::asBinder(listener)); 237f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } else { 238f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza data.writeInt32(0); 239f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } 240fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis data.writeInt32(api); 241595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian data.writeInt32(producerControlledByApp); 2428a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(CONNECT, data, &reply); 2438a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2448a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2458a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 24624202f5676c32edeef6544cf36e06b9fc970dbdeMathias Agopian memcpy(output, reply.readInplace(sizeof(*output)), sizeof(*output)); 2478a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 248fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return result; 249fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis } 2508072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian 251fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis virtual status_t disconnect(int api) { 252fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis Parcel data, reply; 2532adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 254fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis data.writeInt32(api); 2558a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result =remote()->transact(DISCONNECT, data, &reply); 2568a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2578a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2588a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 2598a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 260fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return result; 261fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis } 262399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 263399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall virtual status_t setSidebandStream(const sp<NativeHandle>& stream) { 264399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall Parcel data, reply; 265399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall status_t result; 266399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 267399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (stream.get()) { 268399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInt32(true); 269399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeNativeHandle(stream->handle()); 270399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } else { 271399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInt32(false); 272399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 273399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) { 274399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall result = reply.readInt32(); 275399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 276399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall return result; 277399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 27829a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza 27929a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza virtual void allocateBuffers(bool async, uint32_t width, uint32_t height, 2803be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza PixelFormat format, uint32_t usage) { 28129a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza Parcel data, reply; 28229a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 28329a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza data.writeInt32(static_cast<int32_t>(async)); 2843be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(width); 2853be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(height); 28629a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza data.writeInt32(static_cast<int32_t>(format)); 2873be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(usage); 28829a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply); 28929a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza if (result != NO_ERROR) { 29029a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza ALOGE("allocateBuffers failed to transact: %d", result); 29129a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza } 29229a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza } 2939de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza 2949de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza virtual status_t allowAllocation(bool allow) { 2959de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza Parcel data, reply; 2969de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 2979de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza data.writeInt32(static_cast<int32_t>(allow)); 2989de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza status_t result = remote()->transact(ALLOW_ALLOCATION, data, &reply); 2999de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza if (result != NO_ERROR) { 3009de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza return result; 3019de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 3029de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza result = reply.readInt32(); 3039de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza return result; 3049de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 305812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza 306812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza virtual status_t setGenerationNumber(uint32_t generationNumber) { 307812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza Parcel data, reply; 308812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 309812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza data.writeUint32(generationNumber); 310812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza status_t result = remote()->transact(SET_GENERATION_NUMBER, data, &reply); 311812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza if (result == NO_ERROR) { 312812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza result = reply.readInt32(); 313812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza } 314812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza return result; 315812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza } 316c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza 317c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza virtual String8 getConsumerName() const { 318c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza Parcel data, reply; 319c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 320c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza status_t result = remote()->transact(GET_CONSUMER_NAME, data, &reply); 321c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza if (result != NO_ERROR) { 322c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza ALOGE("getConsumerName failed to transact: %d", result); 323c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza return String8("TransactFailed"); 324c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza } 325c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza return reply.readString8(); 326c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza } 3278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; 3288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 3293be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza// Out-of-line virtual method definition to trigger vtable emission in this 3303be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza// translation unit (see clang warning -Wweak-vtables) 3313be1c6b60a188dc10025e2ce156c11fac050625dDan StozaBpGraphicBufferProducer::~BpGraphicBufferProducer() {} 3323be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza 333466a192d2088f9238d34597d1aa28da41367c1caAndy McFaddenIMPLEMENT_META_INTERFACE(GraphicBufferProducer, "android.gui.IGraphicBufferProducer"); 3348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 3358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------- 3368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 3372adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenstatus_t BnGraphicBufferProducer::onTransact( 3388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 3398ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 3408ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis switch(code) { 3418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case REQUEST_BUFFER: { 3422adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 3438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int bufferIdx = data.readInt32(); 3447b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis sp<GraphicBuffer> buffer; 3457b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis int result = requestBuffer(bufferIdx, &buffer); 3468ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(buffer != 0); 3478ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis if (buffer != 0) { 3488ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->write(*buffer); 3498ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 3507b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis reply->writeInt32(result); 3518ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 3523be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 353fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos case SET_MAX_DEQUEUED_BUFFER_COUNT: { 354fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 355fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos int maxDequeuedBuffers = data.readInt32(); 356fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos int result = setMaxDequeuedBufferCount(maxDequeuedBuffers); 357fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos reply->writeInt32(result); 358fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return NO_ERROR; 359fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 360fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos case SET_ASYNC_MODE: { 361fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 362fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos bool async = data.readInt32(); 363fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos int result = setAsyncMode(async); 364fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos reply->writeInt32(result); 365fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return NO_ERROR; 366fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos } 3678ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case DEQUEUE_BUFFER: { 3682adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 3693be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza bool async = static_cast<bool>(data.readInt32()); 3703be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t width = data.readUint32(); 3713be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t height = data.readUint32(); 3723be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza PixelFormat format = static_cast<PixelFormat>(data.readInt32()); 3733be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t usage = data.readUint32(); 37412ba0f57d028a9c8f4eb3afddc326b70677d1e0cNaveen Leekha int buf = 0; 375f78575400977f644cf0b12beb2fa5fc278b6ed4cJesse Hall sp<Fence> fence; 3763be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza int result = dequeueBuffer(&buf, &fence, async, width, height, 3773be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza format, usage); 3788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(buf); 3791df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis reply->writeInt32(fence != NULL); 3801df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis if (fence != NULL) { 381ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian reply->write(*fence); 382f78575400977f644cf0b12beb2fa5fc278b6ed4cJesse Hall } 3838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(result); 3849f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return NO_ERROR; 3853be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 3869f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza case DETACH_BUFFER: { 3879f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 3889f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int slot = data.readInt32(); 3899f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int result = detachBuffer(slot); 3909f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(result); 3919f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return NO_ERROR; 3923be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 393d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza case DETACH_NEXT_BUFFER: { 394d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 395d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<GraphicBuffer> buffer; 396d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<Fence> fence; 397d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza int32_t result = detachNextBuffer(&buffer, &fence); 398d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(result); 399d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result == NO_ERROR) { 400d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(buffer != NULL); 401d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (buffer != NULL) { 402d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->write(*buffer); 403d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 404d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(fence != NULL); 405d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (fence != NULL) { 406d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->write(*fence); 407d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 408d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 409d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return NO_ERROR; 4103be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 4119f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza case ATTACH_BUFFER: { 4129f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 4139f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza sp<GraphicBuffer> buffer = new GraphicBuffer(); 4149f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.read(*buffer.get()); 41512ba0f57d028a9c8f4eb3afddc326b70677d1e0cNaveen Leekha int slot = 0; 4169f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int result = attachBuffer(&slot, buffer); 4179f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(slot); 4189f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(result); 4198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 4203be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 4218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case QUEUE_BUFFER: { 4222adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 4238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int buf = data.readInt32(); 424c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall QueueBufferInput input(data); 425f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian QueueBufferOutput* const output = 426f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian reinterpret_cast<QueueBufferOutput *>( 427f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian reply->writeInplace(sizeof(QueueBufferOutput))); 428c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall status_t result = queueBuffer(buf, input, output); 4298ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(result); 4308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 4313be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 4328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case CANCEL_BUFFER: { 4332adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 4348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int buf = data.readInt32(); 4351df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis sp<Fence> fence = new Fence(); 4361df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis data.read(*fence.get()); 437c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall cancelBuffer(buf, fence); 4388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 4393be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 440eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian case QUERY: { 4412adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 44212ba0f57d028a9c8f4eb3afddc326b70677d1e0cNaveen Leekha int value = 0; 443eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian int what = data.readInt32(); 444eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian int res = query(what, &value); 445eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian reply->writeInt32(value); 446eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian reply->writeInt32(res); 447eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian return NO_ERROR; 4483be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 449fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis case CONNECT: { 4502adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 451f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza sp<IProducerListener> listener; 452f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza if (data.readInt32() == 1) { 453f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza listener = IProducerListener::asInterface(data.readStrongBinder()); 454f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } 455fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis int api = data.readInt32(); 456595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian bool producerControlledByApp = data.readInt32(); 45724202f5676c32edeef6544cf36e06b9fc970dbdeMathias Agopian QueueBufferOutput* const output = 45824202f5676c32edeef6544cf36e06b9fc970dbdeMathias Agopian reinterpret_cast<QueueBufferOutput *>( 45924202f5676c32edeef6544cf36e06b9fc970dbdeMathias Agopian reply->writeInplace(sizeof(QueueBufferOutput))); 460f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza status_t res = connect(listener, api, producerControlledByApp, output); 461fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis reply->writeInt32(res); 462fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return NO_ERROR; 4633be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 464fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis case DISCONNECT: { 4652adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 466fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis int api = data.readInt32(); 4672773004a83624ed41cf3f94f2b11878cd8521812Mathias Agopian status_t res = disconnect(api); 468fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis reply->writeInt32(res); 469fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return NO_ERROR; 4703be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 471399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall case SET_SIDEBAND_STREAM: { 472399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 473399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall sp<NativeHandle> stream; 474399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (data.readInt32()) { 4750ec54e156bed93d59900b742c8e9adcfaee90612Wonsik Kim stream = NativeHandle::create(data.readNativeHandle(), true); 476399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 477399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall status_t result = setSidebandStream(stream); 478399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall reply->writeInt32(result); 479399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall return NO_ERROR; 4803be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 4819de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza case ALLOCATE_BUFFERS: { 48229a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 48329a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza bool async = static_cast<bool>(data.readInt32()); 4843be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t width = data.readUint32(); 4853be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t height = data.readUint32(); 4863be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza PixelFormat format = static_cast<PixelFormat>(data.readInt32()); 4873be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t usage = data.readUint32(); 48829a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza allocateBuffers(async, width, height, format, usage); 48929a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza return NO_ERROR; 4909de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 4919de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza case ALLOW_ALLOCATION: { 4929de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 4939de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza bool allow = static_cast<bool>(data.readInt32()); 4949de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza status_t result = allowAllocation(allow); 4959de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza reply->writeInt32(result); 4969de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza return NO_ERROR; 4979de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 498812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza case SET_GENERATION_NUMBER: { 499812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 500812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza uint32_t generationNumber = data.readUint32(); 501812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza status_t result = setGenerationNumber(generationNumber); 502812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza reply->writeInt32(result); 503812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza return NO_ERROR; 504812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza } 505c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza case GET_CONSUMER_NAME: { 506c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 507c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza reply->writeString8(getConsumerName()); 508c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza return NO_ERROR; 509c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza } 5108ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 5118ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return BBinder::onTransact(code, data, reply, flags); 5128ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 5138ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 5148ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------------- 5158ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 5162adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenIGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) { 517c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall parcel.read(*this); 518c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 519c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 520e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const { 521c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall return sizeof(timestamp) 5223c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden + sizeof(isAutoTimestamp) 52382c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala + sizeof(dataSpace) 524c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall + sizeof(crop) 525c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall + sizeof(scalingMode) 526c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall + sizeof(transform) 5271681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk + sizeof(stickyTransform) 5287cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian + sizeof(async) 5295065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza + fence->getFlattenedSize() 5305065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza + surfaceDamage.getFlattenedSize(); 531c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 532c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 533e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const { 5341df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis return fence->getFdCount(); 535c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 536c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 537e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t IGraphicBufferProducer::QueueBufferInput::flatten( 538e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian void*& buffer, size_t& size, int*& fds, size_t& count) const 539c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall{ 540e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < getFlattenedSize()) { 541e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 542e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 543e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, timestamp); 5443c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden FlattenableUtils::write(buffer, size, isAutoTimestamp); 54582c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala FlattenableUtils::write(buffer, size, dataSpace); 546e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, crop); 547e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, scalingMode); 548e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, transform); 5491681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk FlattenableUtils::write(buffer, size, stickyTransform); 550e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, async); 5515065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza status_t result = fence->flatten(buffer, size, fds, count); 5525065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza if (result != NO_ERROR) { 5535065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return result; 5545065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza } 5555065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return surfaceDamage.flatten(buffer, size); 556c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 557c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 558e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t IGraphicBufferProducer::QueueBufferInput::unflatten( 559e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian void const*& buffer, size_t& size, int const*& fds, size_t& count) 560c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall{ 561e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian size_t minNeeded = 562e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian sizeof(timestamp) 5633c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden + sizeof(isAutoTimestamp) 56482c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala + sizeof(dataSpace) 565e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian + sizeof(crop) 566e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian + sizeof(scalingMode) 567e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian + sizeof(transform) 5681681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk + sizeof(stickyTransform) 569e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian + sizeof(async); 570e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 571e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < minNeeded) { 572e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 573e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 574e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 575e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, timestamp); 5763c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden FlattenableUtils::read(buffer, size, isAutoTimestamp); 57782c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala FlattenableUtils::read(buffer, size, dataSpace); 578e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, crop); 579e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, scalingMode); 580e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, transform); 5811681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk FlattenableUtils::read(buffer, size, stickyTransform); 582e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, async); 583e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 5841df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis fence = new Fence(); 5855065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza status_t result = fence->unflatten(buffer, size, fds, count); 5865065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza if (result != NO_ERROR) { 5875065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return result; 5885065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza } 5895065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return surfaceDamage.unflatten(buffer, size); 590c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 591c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 5928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; // namespace android 593