IGraphicBufferProducer.cpp revision c79a29689c1046f1f0301c75df9b9a67cba8bf04
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 29c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu#include <gui/BufferQueueDefs.h> 302adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden#include <gui/IGraphicBufferProducer.h> 31f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza#include <gui/IProducerListener.h> 328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisnamespace android { 348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------------- 358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisenum { 378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis REQUEST_BUFFER = IBinder::FIRST_CALL_TRANSACTION, 388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis SET_BUFFER_COUNT, 398ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis DEQUEUE_BUFFER, 409f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza DETACH_BUFFER, 41d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza DETACH_NEXT_BUFFER, 429f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza ATTACH_BUFFER, 438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis QUEUE_BUFFER, 448ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis CANCEL_BUFFER, 45eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian QUERY, 46fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis CONNECT, 47fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis DISCONNECT, 48399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall SET_SIDEBAND_STREAM, 4929a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza ALLOCATE_BUFFERS, 508ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; 518ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 522adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenclass BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer> 538ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennispublic: 552adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden BpGraphicBufferProducer(const sp<IBinder>& impl) 562adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden : BpInterface<IGraphicBufferProducer>(impl) 578ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis { 588ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 598ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 607b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) { 618ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 622adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 638ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(bufferIdx); 648a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result =remote()->transact(REQUEST_BUFFER, data, &reply); 658a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 668a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 678a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 688ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis bool nonNull = reply.readInt32(); 698ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis if (nonNull) { 707b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis *buf = new GraphicBuffer(); 712aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu result = reply.read(**buf); 722aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu if(result != NO_ERROR) { 732aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu (*buf).clear(); 742aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu return result; 752aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu } 768ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 778a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 787b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis return result; 798ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 808ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis virtual status_t setBufferCount(int bufferCount) 828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis { 838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 842adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(bufferCount); 868a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result =remote()->transact(SET_BUFFER_COUNT, data, &reply); 878a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 888a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 898a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 908a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 918a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 938ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 947cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian virtual status_t dequeueBuffer(int *buf, sp<Fence>* fence, bool async, 95f78575400977f644cf0b12beb2fa5fc278b6ed4cJesse Hall uint32_t w, uint32_t h, uint32_t format, uint32_t usage) { 968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 972adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 987cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian data.writeInt32(async); 99c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian data.writeInt32(w); 100c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian data.writeInt32(h); 101c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian data.writeInt32(format); 102c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian data.writeInt32(usage); 1038a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply); 1048a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 1058a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 1068a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 1078ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis *buf = reply.readInt32(); 108ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian bool nonNull = reply.readInt32(); 109ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian if (nonNull) { 1104c00cc11141da7d159eb2323b186ed344115c0f1Jesse Hall *fence = new Fence(); 111ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian reply.read(**fence); 112f78575400977f644cf0b12beb2fa5fc278b6ed4cJesse Hall } 1138a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 1148ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return result; 1158ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 1168ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1179f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza virtual status_t detachBuffer(int slot) { 1189f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza Parcel data, reply; 1199f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1209f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInt32(slot); 1219f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza status_t result = remote()->transact(DETACH_BUFFER, data, &reply); 1229f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza if (result != NO_ERROR) { 1239f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1249f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 1259f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza result = reply.readInt32(); 1269f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1279f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 1289f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 129d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer, 130d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<Fence>* outFence) { 131d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (outBuffer == NULL) { 132d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza ALOGE("detachNextBuffer: outBuffer must not be NULL"); 133d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return BAD_VALUE; 134d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } else if (outFence == NULL) { 135d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza ALOGE("detachNextBuffer: outFence must not be NULL"); 136d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return BAD_VALUE; 137d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 138d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza Parcel data, reply; 139d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 140d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply); 141d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result != NO_ERROR) { 142d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return result; 143d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 144d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza result = reply.readInt32(); 145d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result == NO_ERROR) { 146d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza bool nonNull = reply.readInt32(); 147d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (nonNull) { 148d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza *outBuffer = new GraphicBuffer; 149d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply.read(**outBuffer); 150d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 151d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza nonNull = reply.readInt32(); 152d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (nonNull) { 153d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza *outFence = new Fence; 154d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply.read(**outFence); 155d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 156d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 157d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return result; 158d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 159d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza 1609f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) { 1619f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza Parcel data, reply; 1629f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1639f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.write(*buffer.get()); 1649f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza status_t result = remote()->transact(ATTACH_BUFFER, data, &reply); 1659f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza if (result != NO_ERROR) { 1669f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1679f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 168c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu 1699f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza *slot = reply.readInt32(); 1709f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza result = reply.readInt32(); 171c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu if (result == NO_ERROR && 172c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu (*slot < 0 || *slot >= BufferQueueDefs::NUM_BUFFER_SLOTS)) { 173c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu ALOGE("attachBuffer returned invalid slot %d", *slot); 174c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu android_errorWriteLog(0x534e4554, "37478824"); 175c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu return UNKNOWN_ERROR; 176c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu } 177c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu 1789f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1799f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 1809f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 181f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian virtual status_t queueBuffer(int buf, 182f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian const QueueBufferInput& input, QueueBufferOutput* output) { 1838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 1842adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(buf); 186c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall data.write(input); 1878a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(QUEUE_BUFFER, data, &reply); 1888a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 1898a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 1908a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 191f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian memcpy(output, reply.readInplace(sizeof(*output)), sizeof(*output)); 1928a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 1938ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return result; 1948ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 1958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1964c00cc11141da7d159eb2323b186ed344115c0f1Jesse Hall virtual void cancelBuffer(int buf, const sp<Fence>& fence) { 1978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 1982adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1998ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(buf); 2001df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis data.write(*fence.get()); 2018ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis remote()->transact(CANCEL_BUFFER, data, &reply); 2028ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 2038ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 204eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian virtual int query(int what, int* value) { 205eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian Parcel data, reply; 2062adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 207eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian data.writeInt32(what); 2088a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(QUERY, data, &reply); 2098a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2108a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2118a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 212eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian value[0] = reply.readInt32(); 2138a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 214eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian return result; 215eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian } 216eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian 217f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza virtual status_t connect(const sp<IProducerListener>& listener, 218365857df8b94c959dea984a63013f6e7730ef976Mathias Agopian int api, bool producerControlledByApp, QueueBufferOutput* output) { 219fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis Parcel data, reply; 2202adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 221f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza if (listener != NULL) { 222f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza data.writeInt32(1); 223f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza data.writeStrongBinder(listener->asBinder()); 224f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } else { 225f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza data.writeInt32(0); 226f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } 227fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis data.writeInt32(api); 228595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian data.writeInt32(producerControlledByApp); 2298a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(CONNECT, data, &reply); 2308a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2318a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2328a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 23324202f5676c32edeef6544cf36e06b9fc970dbdeMathias Agopian memcpy(output, reply.readInplace(sizeof(*output)), sizeof(*output)); 2348a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 235fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return result; 236fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis } 2378072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian 238fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis virtual status_t disconnect(int api) { 239fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis Parcel data, reply; 2402adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 241fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis data.writeInt32(api); 2428a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result =remote()->transact(DISCONNECT, data, &reply); 2438a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2448a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2458a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 2468a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 247fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return result; 248fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis } 249399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 250399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall virtual status_t setSidebandStream(const sp<NativeHandle>& stream) { 251399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall Parcel data, reply; 252399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall status_t result; 253399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 254399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (stream.get()) { 255399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInt32(true); 256399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeNativeHandle(stream->handle()); 257399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } else { 258399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInt32(false); 259399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 260399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) { 261399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall result = reply.readInt32(); 262399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 263399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall return result; 264399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 26529a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza 26629a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza virtual void allocateBuffers(bool async, uint32_t width, uint32_t height, 26729a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza uint32_t format, uint32_t usage) { 26829a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza Parcel data, reply; 26929a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 27029a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza data.writeInt32(static_cast<int32_t>(async)); 27129a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza data.writeInt32(static_cast<int32_t>(width)); 27229a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza data.writeInt32(static_cast<int32_t>(height)); 27329a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza data.writeInt32(static_cast<int32_t>(format)); 27429a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza data.writeInt32(static_cast<int32_t>(usage)); 27529a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply); 27629a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza if (result != NO_ERROR) { 27729a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza ALOGE("allocateBuffers failed to transact: %d", result); 27829a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza } 27929a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza } 2808ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; 2818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 282466a192d2088f9238d34597d1aa28da41367c1caAndy McFaddenIMPLEMENT_META_INTERFACE(GraphicBufferProducer, "android.gui.IGraphicBufferProducer"); 2838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2848ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------- 2858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2862adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenstatus_t BnGraphicBufferProducer::onTransact( 2878ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 2888ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 2898ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis switch(code) { 2908ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case REQUEST_BUFFER: { 2912adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 2928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int bufferIdx = data.readInt32(); 2937b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis sp<GraphicBuffer> buffer; 2947b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis int result = requestBuffer(bufferIdx, &buffer); 2958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(buffer != 0); 2968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis if (buffer != 0) { 2978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->write(*buffer); 2988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 2997b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis reply->writeInt32(result); 3008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 3018ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } break; 3028ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case SET_BUFFER_COUNT: { 3032adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 3048ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int bufferCount = data.readInt32(); 3058ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int result = setBufferCount(bufferCount); 3068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(result); 3078ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 3088ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } break; 3098ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case DEQUEUE_BUFFER: { 3102adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 3117cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian bool async = data.readInt32(); 312c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian uint32_t w = data.readInt32(); 313c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian uint32_t h = data.readInt32(); 314c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian uint32_t format = data.readInt32(); 315c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian uint32_t usage = data.readInt32(); 316c1e6fbb52c3f85cc7610d1d07d12be38f70b4ed4Naveen Leekha int buf = 0; 317f78575400977f644cf0b12beb2fa5fc278b6ed4cJesse Hall sp<Fence> fence; 3187cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian int result = dequeueBuffer(&buf, &fence, async, w, h, format, usage); 3198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(buf); 3201df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis reply->writeInt32(fence != NULL); 3211df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis if (fence != NULL) { 322ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian reply->write(*fence); 323f78575400977f644cf0b12beb2fa5fc278b6ed4cJesse Hall } 3248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(result); 3259f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return NO_ERROR; 3269f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } break; 3279f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza case DETACH_BUFFER: { 3289f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 3299f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int slot = data.readInt32(); 3309f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int result = detachBuffer(slot); 3319f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(result); 3329f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return NO_ERROR; 3339f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } break; 334d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza case DETACH_NEXT_BUFFER: { 335d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 336d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<GraphicBuffer> buffer; 337d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<Fence> fence; 338d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza int32_t result = detachNextBuffer(&buffer, &fence); 339d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(result); 340d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result == NO_ERROR) { 341d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(buffer != NULL); 342d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (buffer != NULL) { 343d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->write(*buffer); 344d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 345d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(fence != NULL); 346d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (fence != NULL) { 347d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->write(*fence); 348d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 349d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 350d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return NO_ERROR; 351d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } break; 3529f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza case ATTACH_BUFFER: { 3539f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 3549f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza sp<GraphicBuffer> buffer = new GraphicBuffer(); 3559f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.read(*buffer.get()); 356b414255f53b560a06e642251535b019327ba0d7bNaveen Leekha int slot = 0; 3579f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int result = attachBuffer(&slot, buffer); 3589f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(slot); 3599f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(result); 3608ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 3618ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } break; 3628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case QUEUE_BUFFER: { 3632adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 3648ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int buf = data.readInt32(); 365c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall QueueBufferInput input(data); 366f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian QueueBufferOutput* const output = 367f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian reinterpret_cast<QueueBufferOutput *>( 368f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian reply->writeInplace(sizeof(QueueBufferOutput))); 369d06421fd37fbb7fd07002e6738fac3a223cb1a62Robert Shih memset(output, 0, sizeof(QueueBufferOutput)); 370c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall status_t result = queueBuffer(buf, input, output); 3718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(result); 3728ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 3738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } break; 3748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case CANCEL_BUFFER: { 3752adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 3768ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int buf = data.readInt32(); 3771df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis sp<Fence> fence = new Fence(); 3781df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis data.read(*fence.get()); 379c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall cancelBuffer(buf, fence); 3808ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 3818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } break; 382eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian case QUERY: { 3832adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 384c1e6fbb52c3f85cc7610d1d07d12be38f70b4ed4Naveen Leekha int value = 0; 385eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian int what = data.readInt32(); 386eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian int res = query(what, &value); 387eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian reply->writeInt32(value); 388eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian reply->writeInt32(res); 389eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian return NO_ERROR; 390eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian } break; 391fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis case CONNECT: { 3922adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 393f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza sp<IProducerListener> listener; 394f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza if (data.readInt32() == 1) { 395f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza listener = IProducerListener::asInterface(data.readStrongBinder()); 396f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } 397fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis int api = data.readInt32(); 398595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian bool producerControlledByApp = data.readInt32(); 39924202f5676c32edeef6544cf36e06b9fc970dbdeMathias Agopian QueueBufferOutput* const output = 40024202f5676c32edeef6544cf36e06b9fc970dbdeMathias Agopian reinterpret_cast<QueueBufferOutput *>( 40124202f5676c32edeef6544cf36e06b9fc970dbdeMathias Agopian reply->writeInplace(sizeof(QueueBufferOutput))); 40293c617fd2a5e7910e0ba5c0ed6da152d30920679Pablo Ceballos memset(output, 0, sizeof(QueueBufferOutput)); 403f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza status_t res = connect(listener, api, producerControlledByApp, output); 404fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis reply->writeInt32(res); 405fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return NO_ERROR; 406fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis } break; 407fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis case DISCONNECT: { 4082adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 409fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis int api = data.readInt32(); 4102773004a83624ed41cf3f94f2b11878cd8521812Mathias Agopian status_t res = disconnect(api); 411fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis reply->writeInt32(res); 412fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return NO_ERROR; 413fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis } break; 414399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall case SET_SIDEBAND_STREAM: { 415399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 416399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall sp<NativeHandle> stream; 417399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (data.readInt32()) { 4180ec54e156bed93d59900b742c8e9adcfaee90612Wonsik Kim stream = NativeHandle::create(data.readNativeHandle(), true); 419399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 420399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall status_t result = setSidebandStream(stream); 421399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall reply->writeInt32(result); 422399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall return NO_ERROR; 423399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } break; 42429a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza case ALLOCATE_BUFFERS: 42529a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 42629a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza bool async = static_cast<bool>(data.readInt32()); 42729a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza uint32_t width = static_cast<uint32_t>(data.readInt32()); 42829a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza uint32_t height = static_cast<uint32_t>(data.readInt32()); 42929a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza uint32_t format = static_cast<uint32_t>(data.readInt32()); 43029a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza uint32_t usage = static_cast<uint32_t>(data.readInt32()); 43129a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza allocateBuffers(async, width, height, format, usage); 43229a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza return NO_ERROR; 4338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 4348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return BBinder::onTransact(code, data, reply, flags); 4358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 4368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 4378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------------- 4388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 4392adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenIGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) { 440c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall parcel.read(*this); 441c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 442c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 443e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const { 444c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall return sizeof(timestamp) 4453c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden + sizeof(isAutoTimestamp) 446c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall + sizeof(crop) 447c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall + sizeof(scalingMode) 448c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall + sizeof(transform) 4491681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk + sizeof(stickyTransform) 4507cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian + sizeof(async) 4511df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis + fence->getFlattenedSize(); 452c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 453c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 454e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const { 4551df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis return fence->getFdCount(); 456c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 457c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 458e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t IGraphicBufferProducer::QueueBufferInput::flatten( 459e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian void*& buffer, size_t& size, int*& fds, size_t& count) const 460c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall{ 461e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < getFlattenedSize()) { 462e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 463e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 464e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, timestamp); 4653c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden FlattenableUtils::write(buffer, size, isAutoTimestamp); 466e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, crop); 467e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, scalingMode); 468e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, transform); 4691681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk FlattenableUtils::write(buffer, size, stickyTransform); 470e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, async); 471e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return fence->flatten(buffer, size, fds, count); 472c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 473c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 474e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t IGraphicBufferProducer::QueueBufferInput::unflatten( 475e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian void const*& buffer, size_t& size, int const*& fds, size_t& count) 476c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall{ 477e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian size_t minNeeded = 478e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian sizeof(timestamp) 4793c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden + sizeof(isAutoTimestamp) 480e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian + sizeof(crop) 481e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian + sizeof(scalingMode) 482e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian + sizeof(transform) 4831681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk + sizeof(stickyTransform) 484e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian + sizeof(async); 485e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 486e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < minNeeded) { 487e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 488e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 489e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 490e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, timestamp); 4913c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden FlattenableUtils::read(buffer, size, isAutoTimestamp); 492e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, crop); 493e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, scalingMode); 494e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, transform); 4951681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk FlattenableUtils::read(buffer, size, stickyTransform); 496e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, async); 497e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 4981df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis fence = new Fence(); 499e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return fence->unflatten(buffer, size, fds, count); 500c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 501c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 5028ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; // namespace android 503