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