IGraphicBufferProducer.cpp revision 3c25621ad7d13f64d3ab95a27fa970fbc9998f73
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> 218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <utils/RefBase.h> 228ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <utils/Vector.h> 238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <utils/Timers.h> 248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <binder/Parcel.h> 268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <binder/IInterface.h> 278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 282adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden#include <gui/IGraphicBufferProducer.h> 298ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisnamespace android { 318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------------- 328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisenum { 348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis REQUEST_BUFFER = IBinder::FIRST_CALL_TRANSACTION, 358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis SET_BUFFER_COUNT, 368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis DEQUEUE_BUFFER, 378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis QUEUE_BUFFER, 388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis CANCEL_BUFFER, 39eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian QUERY, 40fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis CONNECT, 41fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis DISCONNECT, 428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; 438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 448ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 452adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenclass BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer> 468ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 478ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennispublic: 482adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden BpGraphicBufferProducer(const sp<IBinder>& impl) 492adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden : BpInterface<IGraphicBufferProducer>(impl) 508ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis { 518ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 528ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 537b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) { 548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 552adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 568ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(bufferIdx); 578a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result =remote()->transact(REQUEST_BUFFER, data, &reply); 588a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 598a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 608a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 618ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis bool nonNull = reply.readInt32(); 628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis if (nonNull) { 637b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis *buf = new GraphicBuffer(); 647b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis reply.read(**buf); 658ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 668a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 677b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis return result; 688ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 698ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 708ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis virtual status_t setBufferCount(int bufferCount) 718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis { 728ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 732adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(bufferCount); 758a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result =remote()->transact(SET_BUFFER_COUNT, data, &reply); 768a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 778a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 788a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 798a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 808a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 818ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 837cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian virtual status_t dequeueBuffer(int *buf, sp<Fence>* fence, bool async, 84f78575400977f644cf0b12beb2fa5fc278b6ed4cJesse Hall uint32_t w, uint32_t h, uint32_t format, uint32_t usage) { 858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 862adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 877cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian data.writeInt32(async); 88c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian data.writeInt32(w); 89c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian data.writeInt32(h); 90c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian data.writeInt32(format); 91c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian data.writeInt32(usage); 928a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply); 938a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 948a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 958a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis *buf = reply.readInt32(); 97ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian bool nonNull = reply.readInt32(); 98ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian if (nonNull) { 994c00cc11141da7d159eb2323b186ed344115c0f1Jesse Hall *fence = new Fence(); 100ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian reply.read(**fence); 101f78575400977f644cf0b12beb2fa5fc278b6ed4cJesse Hall } 1028a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 1038ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return result; 1048ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 1058ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 106f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian virtual status_t queueBuffer(int buf, 107f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian const QueueBufferInput& input, QueueBufferOutput* output) { 1088ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 1092adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1108ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(buf); 111c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall data.write(input); 1128a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(QUEUE_BUFFER, data, &reply); 1138a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 1148a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 1158a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 116f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian memcpy(output, reply.readInplace(sizeof(*output)), sizeof(*output)); 1178a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 1188ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return result; 1198ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 1208ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1214c00cc11141da7d159eb2323b186ed344115c0f1Jesse Hall virtual void cancelBuffer(int buf, const sp<Fence>& fence) { 1228ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis Parcel data, reply; 1232adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 1248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis data.writeInt32(buf); 1251df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis data.write(*fence.get()); 1268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis remote()->transact(CANCEL_BUFFER, data, &reply); 1278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 1288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 129eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian virtual int query(int what, int* value) { 130eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian Parcel data, reply; 1312adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 132eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian data.writeInt32(what); 1338a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(QUERY, data, &reply); 1348a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 1358a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 1368a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 137eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian value[0] = reply.readInt32(); 1388a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 139eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian return result; 140eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian } 141eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian 142595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian virtual status_t connect(int api, bool producerControlledByApp, QueueBufferOutput* output) { 143fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis Parcel data, reply; 1442adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 145fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis data.writeInt32(api); 146595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian data.writeInt32(producerControlledByApp); 1478a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result = remote()->transact(CONNECT, data, &reply); 1488a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 1498a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 1508a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 15124202f5676c32edeef6544cf36e06b9fc970dbdeMathias Agopian memcpy(output, reply.readInplace(sizeof(*output)), sizeof(*output)); 1528a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 153fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return result; 154fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis } 1558072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian 156fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis virtual status_t disconnect(int api) { 157fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis Parcel data, reply; 1582adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); 159fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis data.writeInt32(api); 1608a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis status_t result =remote()->transact(DISCONNECT, data, &reply); 1618a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis if (result != NO_ERROR) { 1628a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis return result; 1638a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis } 1648a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis result = reply.readInt32(); 165fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return result; 166fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis } 1678ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; 1688ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 169466a192d2088f9238d34597d1aa28da41367c1caAndy McFaddenIMPLEMENT_META_INTERFACE(GraphicBufferProducer, "android.gui.IGraphicBufferProducer"); 1708ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------- 1728ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 1732adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenstatus_t BnGraphicBufferProducer::onTransact( 1748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 1758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{ 1768ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis switch(code) { 1778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case REQUEST_BUFFER: { 1782adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 1798ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int bufferIdx = data.readInt32(); 1807b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis sp<GraphicBuffer> buffer; 1817b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis int result = requestBuffer(bufferIdx, &buffer); 1828ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(buffer != 0); 1838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis if (buffer != 0) { 1848ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->write(*buffer); 1858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 1867b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis reply->writeInt32(result); 1878ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 1888ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } break; 1898ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case SET_BUFFER_COUNT: { 1902adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 1918ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int bufferCount = data.readInt32(); 1928ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int result = setBufferCount(bufferCount); 1938ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(result); 1948ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 1958ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } break; 1968ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case DEQUEUE_BUFFER: { 1972adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 1987cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian bool async = data.readInt32(); 199c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian uint32_t w = data.readInt32(); 200c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian uint32_t h = data.readInt32(); 201c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian uint32_t format = data.readInt32(); 202c04f153353cdb0d291297d10452239f791d3fd2bMathias Agopian uint32_t usage = data.readInt32(); 2038ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int buf; 204f78575400977f644cf0b12beb2fa5fc278b6ed4cJesse Hall sp<Fence> fence; 2057cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian int result = dequeueBuffer(&buf, &fence, async, w, h, format, usage); 2068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(buf); 2071df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis reply->writeInt32(fence != NULL); 2081df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis if (fence != NULL) { 209ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian reply->write(*fence); 210f78575400977f644cf0b12beb2fa5fc278b6ed4cJesse Hall } 2118ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(result); 2128ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 2138ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } break; 2148ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case QUEUE_BUFFER: { 2152adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 2168ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int buf = data.readInt32(); 217c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall QueueBufferInput input(data); 218f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian QueueBufferOutput* const output = 219f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian reinterpret_cast<QueueBufferOutput *>( 220f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian reply->writeInplace(sizeof(QueueBufferOutput))); 221c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall status_t result = queueBuffer(buf, input, output); 2228ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis reply->writeInt32(result); 2238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 2248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } break; 2258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis case CANCEL_BUFFER: { 2262adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 2278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis int buf = data.readInt32(); 2281df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis sp<Fence> fence = new Fence(); 2291df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis data.read(*fence.get()); 230c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall cancelBuffer(buf, fence); 2318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return NO_ERROR; 2328ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } break; 233eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian case QUERY: { 2342adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 235eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian int value; 236eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian int what = data.readInt32(); 237eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian int res = query(what, &value); 238eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian reply->writeInt32(value); 239eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian reply->writeInt32(res); 240eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian return NO_ERROR; 241eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian } break; 242fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis case CONNECT: { 2432adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 244fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis int api = data.readInt32(); 245595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian bool producerControlledByApp = data.readInt32(); 24624202f5676c32edeef6544cf36e06b9fc970dbdeMathias Agopian QueueBufferOutput* const output = 24724202f5676c32edeef6544cf36e06b9fc970dbdeMathias Agopian reinterpret_cast<QueueBufferOutput *>( 24824202f5676c32edeef6544cf36e06b9fc970dbdeMathias Agopian reply->writeInplace(sizeof(QueueBufferOutput))); 249595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian status_t res = connect(api, producerControlledByApp, output); 250fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis reply->writeInt32(res); 251fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return NO_ERROR; 252fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis } break; 253fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis case DISCONNECT: { 2542adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CHECK_INTERFACE(IGraphicBufferProducer, data, reply); 255fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis int api = data.readInt32(); 2562773004a83624ed41cf3f94f2b11878cd8521812Mathias Agopian status_t res = disconnect(api); 257fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis reply->writeInt32(res); 258fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis return NO_ERROR; 259fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis } break; 2608ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis } 2618ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis return BBinder::onTransact(code, data, reply, flags); 2628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis} 2638ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2648ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ---------------------------------------------------------------------------- 2658ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis 2662adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenIGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) { 267c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall parcel.read(*this); 268c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 269c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 270e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const { 271c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall return sizeof(timestamp) 2723c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden + sizeof(isAutoTimestamp) 273c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall + sizeof(crop) 274c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall + sizeof(scalingMode) 275c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall + sizeof(transform) 2767cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian + sizeof(async) 2771df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis + fence->getFlattenedSize(); 278c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 279c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 280e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const { 2811df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis return fence->getFdCount(); 282c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 283c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 284e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t IGraphicBufferProducer::QueueBufferInput::flatten( 285e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian void*& buffer, size_t& size, int*& fds, size_t& count) const 286c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall{ 287e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < getFlattenedSize()) { 288e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 289e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 290e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, timestamp); 2913c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden FlattenableUtils::write(buffer, size, isAutoTimestamp); 292e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, crop); 293e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, scalingMode); 294e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, transform); 295e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::write(buffer, size, async); 296e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return fence->flatten(buffer, size, fds, count); 297c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 298c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 299e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t IGraphicBufferProducer::QueueBufferInput::unflatten( 300e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian void const*& buffer, size_t& size, int const*& fds, size_t& count) 301c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall{ 302e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian size_t minNeeded = 303e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian sizeof(timestamp) 3043c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden + sizeof(isAutoTimestamp) 305e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian + sizeof(crop) 306e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian + sizeof(scalingMode) 307e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian + sizeof(transform) 308e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian + sizeof(async); 309e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 310e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian if (size < minNeeded) { 311e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return NO_MEMORY; 312e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian } 313e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 314e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, timestamp); 3153c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden FlattenableUtils::read(buffer, size, isAutoTimestamp); 316e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, crop); 317e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, scalingMode); 318e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, transform); 319e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian FlattenableUtils::read(buffer, size, async); 320e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian 3211df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis fence = new Fence(); 322e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian return fence->unflatten(buffer, size, fds, count); 323c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall} 324c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall 3258ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; // namespace android 326