IGraphicBufferProducer.cpp revision 812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2
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 SET_BUFFER_COUNT, 388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis DEQUEUE_BUFFER, 399f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza DETACH_BUFFER, 40d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza DETACH_NEXT_BUFFER, 419f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza ATTACH_BUFFER, 428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis QUEUE_BUFFER, 438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis CANCEL_BUFFER, 44eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian QUERY, 45fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis CONNECT, 46fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis DISCONNECT, 47399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall SET_SIDEBAND_STREAM, 4829a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza ALLOCATE_BUFFERS, 499de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza ALLOW_ALLOCATION, 50812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza SET_GENERATION_NUMBER, 518ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; 528ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 532adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenclass BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer> 548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 558ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennispublic: 562adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden BpGraphicBufferProducer(const sp<IBinder>& impl) 572adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden : BpInterface<IGraphicBufferProducer>(impl) 588ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis { 598ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 608ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 613be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza virtual ~BpGraphicBufferProducer(); 623be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza 637b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) { 648ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 652adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 668ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(bufferIdx); 678a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result =remote()->transact(REQUEST_BUFFER, data, &reply); 688a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 698a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 708a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis bool nonNull = reply.readInt32(); 728ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis if (nonNull) { 737b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis *buf = new GraphicBuffer(); 742aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu result = reply.read(**buf); 752aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu if(result != NO_ERROR) { 762aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu (*buf).clear(); 772aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu return result; 782aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu } 798ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 808a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 817b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis return result; 828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 848ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis virtual status_t setBufferCount(int bufferCount) 858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis { 868ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 872adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 888ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(bufferCount); 898a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result =remote()->transact(SET_BUFFER_COUNT, data, &reply); 908a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 918a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 928a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 938a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 948a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 977cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian virtual status_t dequeueBuffer(int *buf, sp<Fence>* fence, bool async, 983be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t width, uint32_t height, PixelFormat format, 993be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t usage) { 1008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 1012adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1023be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeInt32(static_cast<int32_t>(async)); 1033be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(width); 1043be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(height); 1053be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeInt32(static_cast<int32_t>(format)); 1063be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(usage); 1078a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply); 1088a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 1098a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 1108a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 1118ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis *buf = reply.readInt32(); 112ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian bool nonNull = reply.readInt32(); 113ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian if (nonNull) { 1144c00cc11141da7d159eb2323b186ed344115c0f1Jesse Hall *fence = new Fence(); 115ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian reply.read(**fence); 116f78575400977f644cf0b12beb2fa5fc278b6ed4cJesse Hall } 1178a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 1188ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return result; 1198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 1208ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1219f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza virtual status_t detachBuffer(int slot) { 1229f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza Parcel data, reply; 1239f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1249f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInt32(slot); 1259f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza status_t result = remote()->transact(DETACH_BUFFER, data, &reply); 1269f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza if (result != NO_ERROR) { 1279f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1289f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 1299f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza result = reply.readInt32(); 1309f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1319f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 1329f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 133d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer, 134d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<Fence>* outFence) { 135d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (outBuffer == NULL) { 136d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza ALOGE("detachNextBuffer: outBuffer must not be NULL"); 137d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return BAD_VALUE; 138d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } else if (outFence == NULL) { 139d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza ALOGE("detachNextBuffer: outFence must not be NULL"); 140d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return BAD_VALUE; 141d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 142d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza Parcel data, reply; 143d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 144d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply); 145d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result != NO_ERROR) { 146d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return result; 147d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 148d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza result = reply.readInt32(); 149d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result == NO_ERROR) { 150d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza bool nonNull = reply.readInt32(); 151d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (nonNull) { 152d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza *outBuffer = new GraphicBuffer; 153d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply.read(**outBuffer); 154d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 155d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza nonNull = reply.readInt32(); 156d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (nonNull) { 157d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza *outFence = new Fence; 158d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply.read(**outFence); 159d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 160d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 161d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return result; 162d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 163d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza 1649f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) { 1659f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza Parcel data, reply; 1669f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1679f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.write(*buffer.get()); 1689f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza status_t result = remote()->transact(ATTACH_BUFFER, data, &reply); 1699f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza if (result != NO_ERROR) { 1709f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1719f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 1729f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza *slot = reply.readInt32(); 1739f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza result = reply.readInt32(); 1749f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return result; 1759f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza } 1769f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 177f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian virtual status_t queueBuffer(int buf, 178f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian const QueueBufferInput& input, QueueBufferOutput* output) { 1798ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 1802adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(buf); 182c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall data.write(input); 1838a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(QUEUE_BUFFER, data, &reply); 1848a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 1858a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 1868a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 187f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian memcpy(output, reply.readInplace(sizeof(*output)), sizeof(*output)); 1888a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 1898ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return result; 1908ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 1918ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1924c00cc11141da7d159eb2323b186ed344115c0f1Jesse Hall virtual void cancelBuffer(int buf, const sp<Fence>& fence) { 1938ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 1942adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(buf); 1961df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis data.write(*fence.get()); 1978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis remote()->transact(CANCEL_BUFFER, data, &reply); 1988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 1998ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 200eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian virtual int query(int what, int* value) { 201eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian Parcel data, reply; 2022adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 203eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian data.writeInt32(what); 2048a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(QUERY, data, &reply); 2058a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2068a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2078a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 208eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian value[0] = reply.readInt32(); 2098a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 210eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian return result; 211eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian } 212eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian 213f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza virtual status_t connect(const sp<IProducerListener>& listener, 214365857df8b94c959dea984a63013f6e7730ef976Mathias Agopian int api, bool producerControlledByApp, QueueBufferOutput* output) { 215fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis Parcel data, reply; 2162adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 217f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza if (listener != NULL) { 218f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza data.writeInt32(1); 219097ca275f4717a2c47a5d49f302ed2b72c8a1370Marco Nelissen data.writeStrongBinder(IInterface::asBinder(listener)); 220f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } else { 221f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza data.writeInt32(0); 222f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } 223fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis data.writeInt32(api); 224595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian data.writeInt32(producerControlledByApp); 2258a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(CONNECT, data, &reply); 2268a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2278a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2288a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 22924202f5676c32edeef6544cf36e06b9fc970dbdeMathias Agopian memcpy(output, reply.readInplace(sizeof(*output)), sizeof(*output)); 2308a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 231fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return result; 232fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis } 2338072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian 234fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis virtual status_t disconnect(int api) { 235fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis Parcel data, reply; 2362adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 237fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis data.writeInt32(api); 2388a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result =remote()->transact(DISCONNECT, data, &reply); 2398a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 2408a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 2418a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 2428a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 243fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return result; 244fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis } 245399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 246399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall virtual status_t setSidebandStream(const sp<NativeHandle>& stream) { 247399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall Parcel data, reply; 248399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall status_t result; 249399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 250399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (stream.get()) { 251399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInt32(true); 252399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeNativeHandle(stream->handle()); 253399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } else { 254399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall data.writeInt32(false); 255399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 256399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) { 257399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall result = reply.readInt32(); 258399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 259399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall return result; 260399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 26129a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza 26229a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza virtual void allocateBuffers(bool async, uint32_t width, uint32_t height, 2633be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza PixelFormat format, uint32_t usage) { 26429a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza Parcel data, reply; 26529a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 26629a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza data.writeInt32(static_cast<int32_t>(async)); 2673be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(width); 2683be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(height); 26929a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza data.writeInt32(static_cast<int32_t>(format)); 2703be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza data.writeUint32(usage); 27129a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply); 27229a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza if (result != NO_ERROR) { 27329a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza ALOGE("allocateBuffers failed to transact: %d", result); 27429a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza } 27529a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza } 2769de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza 2779de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza virtual status_t allowAllocation(bool allow) { 2789de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza Parcel data, reply; 2799de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 2809de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza data.writeInt32(static_cast<int32_t>(allow)); 2819de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza status_t result = remote()->transact(ALLOW_ALLOCATION, data, &reply); 2829de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza if (result != NO_ERROR) { 2839de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza return result; 2849de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 2859de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza result = reply.readInt32(); 2869de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza return result; 2879de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 288812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza 289812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza virtual status_t setGenerationNumber(uint32_t generationNumber) { 290812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza Parcel data, reply; 291812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 292812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza data.writeUint32(generationNumber); 293812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza status_t result = remote()->transact(SET_GENERATION_NUMBER, data, &reply); 294812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza if (result == NO_ERROR) { 295812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza result = reply.readInt32(); 296812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza } 297812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza return result; 298812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza } 2998ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; 3008ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 3013be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza// Out-of-line virtual method definition to trigger vtable emission in this 3023be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza// translation unit (see clang warning -Wweak-vtables) 3033be1c6b60a188dc10025e2ce156c11fac050625dDan StozaBpGraphicBufferProducer::~BpGraphicBufferProducer() {} 3043be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza 305466a192d2088f9238d34597d1aa28da41367c1caAndy McFaddenIMPLEMENT_META_INTERFACE(GraphicBufferProducer, "android.gui.IGraphicBufferProducer"); 3068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 3078ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------- 3088ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 3092adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenstatus_t BnGraphicBufferProducer::onTransact( 3108ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 3118ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 3128ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis switch(code) { 3138ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case REQUEST_BUFFER: { 3142adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 3158ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int bufferIdx = data.readInt32(); 3167b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis sp<GraphicBuffer> buffer; 3177b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis int result = requestBuffer(bufferIdx, &buffer); 3188ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(buffer != 0); 3198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis if (buffer != 0) { 3208ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->write(*buffer); 3218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 3227b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis reply->writeInt32(result); 3238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 3243be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 3258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case SET_BUFFER_COUNT: { 3262adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 3278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int bufferCount = data.readInt32(); 3288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int result = setBufferCount(bufferCount); 3298ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(result); 3308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 3313be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 3328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case DEQUEUE_BUFFER: { 3332adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 3343be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza bool async = static_cast<bool>(data.readInt32()); 3353be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t width = data.readUint32(); 3363be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t height = data.readUint32(); 3373be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza PixelFormat format = static_cast<PixelFormat>(data.readInt32()); 3383be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t usage = data.readUint32(); 3398ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int buf; 340f78575400977f644cf0b12beb2fa5fc278b6ed4cJesse Hall sp<Fence> fence; 3413be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza int result = dequeueBuffer(&buf, &fence, async, width, height, 3423be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza format, usage); 3438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(buf); 3441df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis reply->writeInt32(fence != NULL); 3451df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis if (fence != NULL) { 346ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian reply->write(*fence); 347f78575400977f644cf0b12beb2fa5fc278b6ed4cJesse Hall } 3488ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(result); 3499f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return NO_ERROR; 3503be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 3519f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza case DETACH_BUFFER: { 3529f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 3539f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int slot = data.readInt32(); 3549f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int result = detachBuffer(slot); 3559f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(result); 3569f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza return NO_ERROR; 3573be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 358d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza case DETACH_NEXT_BUFFER: { 359d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 360d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<GraphicBuffer> buffer; 361d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<Fence> fence; 362d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza int32_t result = detachNextBuffer(&buffer, &fence); 363d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(result); 364d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (result == NO_ERROR) { 365d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(buffer != NULL); 366d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (buffer != NULL) { 367d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->write(*buffer); 368d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 369d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->writeInt32(fence != NULL); 370d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza if (fence != NULL) { 371d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza reply->write(*fence); 372d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 373d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza } 374d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return NO_ERROR; 3753be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 3769f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza case ATTACH_BUFFER: { 3779f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 3789f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza sp<GraphicBuffer> buffer = new GraphicBuffer(); 3799f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza data.read(*buffer.get()); 3809f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int slot; 3819f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza int result = attachBuffer(&slot, buffer); 3829f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(slot); 3839f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza reply->writeInt32(result); 3848ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 3853be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 3868ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case QUEUE_BUFFER: { 3872adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 3888ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int buf = data.readInt32(); 389c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall QueueBufferInput input(data); 390f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian QueueBufferOutput* const output = 391f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian reinterpret_cast<QueueBufferOutput *>( 392f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian reply->writeInplace(sizeof(QueueBufferOutput))); 393c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall status_t result = queueBuffer(buf, input, output); 3948ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(result); 3958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 3963be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 3978ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case CANCEL_BUFFER: { 3982adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 3998ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int buf = data.readInt32(); 4001df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis sp<Fence> fence = new Fence(); 4011df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis data.read(*fence.get()); 402c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall cancelBuffer(buf, fence); 4038ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 4043be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 405eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian case QUERY: { 4062adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 407eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian int value; 408eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian int what = data.readInt32(); 409eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian int res = query(what, &value); 410eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian reply->writeInt32(value); 411eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian reply->writeInt32(res); 412eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian return NO_ERROR; 4133be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 414fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis case CONNECT: { 4152adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 416f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza sp<IProducerListener> listener; 417f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza if (data.readInt32() == 1) { 418f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza listener = IProducerListener::asInterface(data.readStrongBinder()); 419f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza } 420fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis int api = data.readInt32(); 421595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian bool producerControlledByApp = data.readInt32(); 42224202f5676c32edeef6544cf36e06b9fc970dbdeMathias Agopian QueueBufferOutput* const output = 42324202f5676c32edeef6544cf36e06b9fc970dbdeMathias Agopian reinterpret_cast<QueueBufferOutput *>( 42424202f5676c32edeef6544cf36e06b9fc970dbdeMathias Agopian reply->writeInplace(sizeof(QueueBufferOutput))); 425f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza status_t res = connect(listener, api, producerControlledByApp, output); 426fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis reply->writeInt32(res); 427fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return NO_ERROR; 4283be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 429fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis case DISCONNECT: { 4302adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 431fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis int api = data.readInt32(); 4322773004a83624ed41cf3f94f2b11878cd8521812Mathias Agopian status_t res = disconnect(api); 433fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis reply->writeInt32(res); 434fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return NO_ERROR; 4353be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 436399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall case SET_SIDEBAND_STREAM: { 437399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 438399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall sp<NativeHandle> stream; 439399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (data.readInt32()) { 4400ec54e156bed93d59900b742c8e9adcfaee90612Wonsik Kim stream = NativeHandle::create(data.readNativeHandle(), true); 441399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 442399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall status_t result = setSidebandStream(stream); 443399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall reply->writeInt32(result); 444399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall return NO_ERROR; 4453be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza } 4469de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza case ALLOCATE_BUFFERS: { 44729a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 44829a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza bool async = static_cast<bool>(data.readInt32()); 4493be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t width = data.readUint32(); 4503be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t height = data.readUint32(); 4513be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza PixelFormat format = static_cast<PixelFormat>(data.readInt32()); 4523be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza uint32_t usage = data.readUint32(); 45329a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza allocateBuffers(async, width, height, format, usage); 45429a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza return NO_ERROR; 4559de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 4569de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza case ALLOW_ALLOCATION: { 4579de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 4589de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza bool allow = static_cast<bool>(data.readInt32()); 4599de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza status_t result = allowAllocation(allow); 4609de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza reply->writeInt32(result); 4619de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza return NO_ERROR; 4629de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza } 463812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza case SET_GENERATION_NUMBER: { 464812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 465812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza uint32_t generationNumber = data.readUint32(); 466812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza status_t result = setGenerationNumber(generationNumber); 467812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza reply->writeInt32(result); 468812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza return NO_ERROR; 469812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza } 4708ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 4718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return BBinder::onTransact(code, data, reply, flags); 4728ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 4738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 4748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------------- 4758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 4762adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenIGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) { 477c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall parcel.read(*this); 478c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 479c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 480e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const { 481c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall return sizeof(timestamp) 4823c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden + sizeof(isAutoTimestamp) 48382c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala + sizeof(dataSpace) 484c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall + sizeof(crop) 485c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall + sizeof(scalingMode) 486c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall + sizeof(transform) 4871681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk + sizeof(stickyTransform) 4887cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian + sizeof(async) 4895065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza + fence->getFlattenedSize() 4905065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza + surfaceDamage.getFlattenedSize(); 491c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 492c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 493e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const { 4941df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis return fence->getFdCount(); 495c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 496c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 497e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t IGraphicBufferProducer::QueueBufferInput::flatten( 498e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian void*& buffer, size_t& size, int*& fds, size_t& count) const 499c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall{ 500e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < getFlattenedSize()) { 501e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 502e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 503e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, timestamp); 5043c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden FlattenableUtils::write(buffer, size, isAutoTimestamp); 50582c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala FlattenableUtils::write(buffer, size, dataSpace); 506e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, crop); 507e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, scalingMode); 508e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, transform); 5091681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk FlattenableUtils::write(buffer, size, stickyTransform); 510e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, async); 5115065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza status_t result = fence->flatten(buffer, size, fds, count); 5125065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza if (result != NO_ERROR) { 5135065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return result; 5145065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza } 5155065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return surfaceDamage.flatten(buffer, size); 516c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 517c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 518e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t IGraphicBufferProducer::QueueBufferInput::unflatten( 519e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian void const*& buffer, size_t& size, int const*& fds, size_t& count) 520c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall{ 521e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian size_t minNeeded = 522e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian sizeof(timestamp) 5233c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden + sizeof(isAutoTimestamp) 52482c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala + sizeof(dataSpace) 525e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian + sizeof(crop) 526e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian + sizeof(scalingMode) 527e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian + sizeof(transform) 5281681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk + sizeof(stickyTransform) 529e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian + sizeof(async); 530e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 531e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < minNeeded) { 532e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 533e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 534e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 535e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, timestamp); 5363c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden FlattenableUtils::read(buffer, size, isAutoTimestamp); 53782c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala FlattenableUtils::read(buffer, size, dataSpace); 538e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, crop); 539e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, scalingMode); 540e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, transform); 5411681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk FlattenableUtils::read(buffer, size, stickyTransform); 542e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, async); 543e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 5441df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis fence = new Fence(); 5455065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza status_t result = fence->unflatten(buffer, size, fds, count); 5465065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza if (result != NO_ERROR) { 5475065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return result; 5485065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza } 5495065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza return surfaceDamage.unflatten(buffer, size); 550c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 551c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 5528ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; // namespace android 553