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