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