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>
23175a7206c5aea70236b916d7707ab25025eb9cd6Brian Anderson#include <utils/String8.h>
248ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <utils/Timers.h>
25399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall#include <utils/Vector.h>
268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
278ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <binder/Parcel.h>
288ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis#include <binder/IInterface.h>
298ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
30f5f36c75527b1924ef8cb5cb66eb745dd27a0fc6Jiwen 'Steve' Cai#ifndef NO_BUFFERHUB
31c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai#include <gui/BufferHubProducer.h>
32f5f36c75527b1924ef8cb5cb66eb745dd27a0fc6Jiwen 'Steve' Cai#endif
33c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu#include <gui/BufferQueueDefs.h>
342adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden#include <gui/IGraphicBufferProducer.h>
35f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza#include <gui/IProducerListener.h>
368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
376e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa#include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h>
386e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
398ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisnamespace android {
408ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ----------------------------------------------------------------------------
418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
426e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasausing ::android::hardware::graphics::bufferqueue::V1_0::utils::
436e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        H2BGraphicBufferProducer;
446e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
458ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennisenum {
468ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    REQUEST_BUFFER = IBinder::FIRST_CALL_TRANSACTION,
478ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    DEQUEUE_BUFFER,
489f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    DETACH_BUFFER,
49d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza    DETACH_NEXT_BUFFER,
509f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ATTACH_BUFFER,
518ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    QUEUE_BUFFER,
528ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    CANCEL_BUFFER,
53eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian    QUERY,
54fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis    CONNECT,
55fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis    DISCONNECT,
56399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    SET_SIDEBAND_STREAM,
5729a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza    ALLOCATE_BUFFERS,
589de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    ALLOW_ALLOCATION,
59812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    SET_GENERATION_NUMBER,
60c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza    GET_CONSUMER_NAME,
61fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos    SET_MAX_DEQUEUED_BUFFER_COUNT,
627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    SET_ASYNC_MODE,
633559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    SET_SHARED_BUFFER_MODE,
64ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    SET_AUTO_REFRESH,
65127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    SET_DEQUEUE_TIMEOUT,
6650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    GET_LAST_QUEUED_BUFFER,
67fc35258c9dd71b68dc278fa0c9220d74fd643f31Pablo Ceballos    GET_FRAME_TIMESTAMPS,
68e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu    GET_UNIQUE_ID,
69e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu    GET_CONSUMER_USAGE,
708ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis};
718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
722adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenclass BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer>
738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
748ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennispublic:
75e2347b7953f70232541bdc1b392230d6231aaeb9Chih-Hung Hsieh    explicit BpGraphicBufferProducer(const sp<IBinder>& impl)
762adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        : BpInterface<IGraphicBufferProducer>(impl)
778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    {
788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
798ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
80ca0385170e75244f0c4f7cfec4f47ba1c0307176Yi Kong    ~BpGraphicBufferProducer() override;
813be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza
827b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis    virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) {
838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        Parcel data, reply;
842adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        data.writeInt32(bufferIdx);
868a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        status_t result =remote()->transact(REQUEST_BUFFER, data, &reply);
878a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        if (result != NO_ERROR) {
888a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis            return result;
898a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        }
908ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        bool nonNull = reply.readInt32();
918ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        if (nonNull) {
927b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis            *buf = new GraphicBuffer();
932aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu            result = reply.read(**buf);
942aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu            if(result != NO_ERROR) {
952aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu                (*buf).clear();
962aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu                return result;
972aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu            }
988ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        }
998a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        result = reply.readInt32();
1007b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis        return result;
1018ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
1028ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
103fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos    virtual status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) {
104fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos        Parcel data, reply;
105fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos        data.writeInterfaceToken(
106fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos                IGraphicBufferProducer::getInterfaceDescriptor());
107fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos        data.writeInt32(maxDequeuedBuffers);
108fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos        status_t result = remote()->transact(SET_MAX_DEQUEUED_BUFFER_COUNT,
109fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos                data, &reply);
110fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos        if (result != NO_ERROR) {
111fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos            return result;
112fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos        }
113fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos        result = reply.readInt32();
114fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos        return result;
115fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos    }
116fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos
117fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos    virtual status_t setAsyncMode(bool async) {
118fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos        Parcel data, reply;
119fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos        data.writeInterfaceToken(
120fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos                IGraphicBufferProducer::getInterfaceDescriptor());
121fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos        data.writeInt32(async);
122fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos        status_t result = remote()->transact(SET_ASYNC_MODE,
123fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos                data, &reply);
124fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos        if (result != NO_ERROR) {
125fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos            return result;
126fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos        }
127fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos        result = reply.readInt32();
128fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos        return result;
129fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos    }
130fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos
131a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott    virtual status_t dequeueBuffer(int* buf, sp<Fence>* fence, uint32_t width, uint32_t height,
132a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott                                   PixelFormat format, uint64_t usage, uint64_t* outBufferAge,
133a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott                                   FrameEventHistoryDelta* outTimestamps) {
1348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        Parcel data, reply;
1357c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson        bool getFrameTimestamps = (outTimestamps != nullptr);
136baaad32cd582bcc09db89135715717234ea398eaBrian Anderson
1372adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
1383be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza        data.writeUint32(width);
1393be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza        data.writeUint32(height);
1403be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza        data.writeInt32(static_cast<int32_t>(format));
141cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian        data.writeUint64(usage);
1427c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson        data.writeBool(getFrameTimestamps);
143baaad32cd582bcc09db89135715717234ea398eaBrian Anderson
1448a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply);
1458a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        if (result != NO_ERROR) {
1468a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis            return result;
1478a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        }
148baaad32cd582bcc09db89135715717234ea398eaBrian Anderson
1498ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        *buf = reply.readInt32();
150baaad32cd582bcc09db89135715717234ea398eaBrian Anderson        *fence = new Fence();
151baaad32cd582bcc09db89135715717234ea398eaBrian Anderson        result = reply.read(**fence);
152baaad32cd582bcc09db89135715717234ea398eaBrian Anderson        if (result != NO_ERROR) {
153baaad32cd582bcc09db89135715717234ea398eaBrian Anderson            fence->clear();
154baaad32cd582bcc09db89135715717234ea398eaBrian Anderson            return result;
155f78575400977f644cf0b12beb2fa5fc278b6ed4cJesse Hall        }
156a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott        if (outBufferAge) {
157a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott            result = reply.readUint64(outBufferAge);
158a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott        } else {
159a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott            // Read the value even if outBufferAge is nullptr:
160a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott            uint64_t bufferAge;
161a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott            result = reply.readUint64(&bufferAge);
162a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott        }
163a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott        if (result != NO_ERROR) {
164a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott            ALOGE("IGBP::dequeueBuffer failed to read buffer age: %d", result);
165a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott            return result;
166a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott        }
1677c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson        if (getFrameTimestamps) {
1687c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            result = reply.read(*outTimestamps);
1697c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            if (result != NO_ERROR) {
1707c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson                ALOGE("IGBP::dequeueBuffer failed to read timestamps: %d",
1717c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson                        result);
1727c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson                return result;
1737c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            }
1747c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson        }
1758a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        result = reply.readInt32();
1768ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        return result;
1778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
1788ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
1799f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    virtual status_t detachBuffer(int slot) {
1809f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        Parcel data, reply;
1819f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
1829f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        data.writeInt32(slot);
1839f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        status_t result = remote()->transact(DETACH_BUFFER, data, &reply);
1849f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        if (result != NO_ERROR) {
1859f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            return result;
1869f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        }
1879f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        result = reply.readInt32();
1889f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        return result;
1899f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    }
1909f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
191d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza    virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer,
192d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza            sp<Fence>* outFence) {
193d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza        if (outBuffer == NULL) {
194d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza            ALOGE("detachNextBuffer: outBuffer must not be NULL");
195d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza            return BAD_VALUE;
196d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza        } else if (outFence == NULL) {
197d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza            ALOGE("detachNextBuffer: outFence must not be NULL");
198d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza            return BAD_VALUE;
199d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza        }
200d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza        Parcel data, reply;
201d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
202d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza        status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply);
203d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza        if (result != NO_ERROR) {
204d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza            return result;
205d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza        }
206d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza        result = reply.readInt32();
207d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza        if (result == NO_ERROR) {
208d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza            bool nonNull = reply.readInt32();
209d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza            if (nonNull) {
210d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza                *outBuffer = new GraphicBuffer;
21170636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos                result = reply.read(**outBuffer);
21270636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos                if (result != NO_ERROR) {
21370636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos                    outBuffer->clear();
21470636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos                    return result;
21570636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos                }
216d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza            }
217d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza            nonNull = reply.readInt32();
218d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza            if (nonNull) {
219d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza                *outFence = new Fence;
22070636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos                result = reply.read(**outFence);
22170636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos                if (result != NO_ERROR) {
22270636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos                    outBuffer->clear();
22370636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos                    outFence->clear();
22470636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos                    return result;
22570636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos                }
226d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza            }
227d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza        }
228d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza        return result;
229d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza    }
230d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza
2319f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) {
2329f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        Parcel data, reply;
2339f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
2349f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        data.write(*buffer.get());
2359f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        status_t result = remote()->transact(ATTACH_BUFFER, data, &reply);
2369f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        if (result != NO_ERROR) {
2379f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            return result;
2389f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        }
239c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu
2409f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        *slot = reply.readInt32();
2419f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        result = reply.readInt32();
242c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu        if (result == NO_ERROR &&
243c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu                (*slot < 0 || *slot >= BufferQueueDefs::NUM_BUFFER_SLOTS)) {
244c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu            ALOGE("attachBuffer returned invalid slot %d", *slot);
245c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu            android_errorWriteLog(0x534e4554, "37478824");
246c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu            return UNKNOWN_ERROR;
247c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu        }
248c79a29689c1046f1f0301c75df9b9a67cba8bf04Chia-I Wu
2499f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        return result;
2509f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    }
2519f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
252f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian    virtual status_t queueBuffer(int buf,
253f0bc2f1d8d37977bd3aef3d3326a70e9e69d4246Mathias Agopian            const QueueBufferInput& input, QueueBufferOutput* output) {
2548ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        Parcel data, reply;
255baaad32cd582bcc09db89135715717234ea398eaBrian Anderson
2562adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
2578ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        data.writeInt32(buf);
258c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall        data.write(input);
259baaad32cd582bcc09db89135715717234ea398eaBrian Anderson
2608a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        status_t result = remote()->transact(QUEUE_BUFFER, data, &reply);
2618a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        if (result != NO_ERROR) {
2628a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis            return result;
2638a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        }
264baaad32cd582bcc09db89135715717234ea398eaBrian Anderson
265baaad32cd582bcc09db89135715717234ea398eaBrian Anderson        result = reply.read(*output);
266baaad32cd582bcc09db89135715717234ea398eaBrian Anderson        if (result != NO_ERROR) {
267baaad32cd582bcc09db89135715717234ea398eaBrian Anderson            return result;
268baaad32cd582bcc09db89135715717234ea398eaBrian Anderson        }
269baaad32cd582bcc09db89135715717234ea398eaBrian Anderson
2708a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        result = reply.readInt32();
2718ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        return result;
2728ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
2738ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
274583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos    virtual status_t cancelBuffer(int buf, const sp<Fence>& fence) {
2758ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        Parcel data, reply;
2762adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
2778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        data.writeInt32(buf);
2781df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis        data.write(*fence.get());
279583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos        status_t result = remote()->transact(CANCEL_BUFFER, data, &reply);
280583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos        if (result != NO_ERROR) {
281583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos            return result;
282583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos        }
283583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos        result = reply.readInt32();
284583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos        return result;
2858ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
2868ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
287eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian    virtual int query(int what, int* value) {
288eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian        Parcel data, reply;
2892adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
290eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian        data.writeInt32(what);
2918a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        status_t result = remote()->transact(QUERY, data, &reply);
2928a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        if (result != NO_ERROR) {
2938a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis            return result;
2948a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        }
295eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian        value[0] = reply.readInt32();
2968a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        result = reply.readInt32();
297eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian        return result;
298eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian    }
299eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian
300f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza    virtual status_t connect(const sp<IProducerListener>& listener,
301365857df8b94c959dea984a63013f6e7730ef976Mathias Agopian            int api, bool producerControlledByApp, QueueBufferOutput* output) {
302fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis        Parcel data, reply;
3032adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
304f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza        if (listener != NULL) {
305f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza            data.writeInt32(1);
306097ca275f4717a2c47a5d49f302ed2b72c8a1370Marco Nelissen            data.writeStrongBinder(IInterface::asBinder(listener));
307f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza        } else {
308f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza            data.writeInt32(0);
309f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza        }
310fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis        data.writeInt32(api);
311595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian        data.writeInt32(producerControlledByApp);
3128a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        status_t result = remote()->transact(CONNECT, data, &reply);
3138a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        if (result != NO_ERROR) {
3148a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis            return result;
3158a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        }
316baaad32cd582bcc09db89135715717234ea398eaBrian Anderson        reply.read(*output);
3178a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        result = reply.readInt32();
318fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis        return result;
319fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis    }
3208072711307aa98ee5ee6f7369860ae38c3e19656Mathias Agopian
32197b9c86338e2d364d47ea7522c2d81a8014f0e07Robert Carr    virtual status_t disconnect(int api, DisconnectMode mode) {
322fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis        Parcel data, reply;
3232adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
324fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis        data.writeInt32(api);
32597b9c86338e2d364d47ea7522c2d81a8014f0e07Robert Carr        data.writeInt32(static_cast<int32_t>(mode));
3268a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        status_t result =remote()->transact(DISCONNECT, data, &reply);
3278a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        if (result != NO_ERROR) {
3288a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis            return result;
3298a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        }
3308a29ff2a356816694c695db70460f93c7fb4ae6fJamie Gennis        result = reply.readInt32();
331fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis        return result;
332fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis    }
333399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall
334399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    virtual status_t setSidebandStream(const sp<NativeHandle>& stream) {
335399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        Parcel data, reply;
336399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        status_t result;
337399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
338399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        if (stream.get()) {
339399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall            data.writeInt32(true);
340399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall            data.writeNativeHandle(stream->handle());
341399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        } else {
342399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall            data.writeInt32(false);
343399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        }
344399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) {
345399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall            result = reply.readInt32();
346399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        }
347399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        return result;
348399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    }
34929a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza
350567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos    virtual void allocateBuffers(uint32_t width, uint32_t height,
351cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian            PixelFormat format, uint64_t usage) {
35229a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza        Parcel data, reply;
35329a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
3543be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza        data.writeUint32(width);
3553be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza        data.writeUint32(height);
35629a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza        data.writeInt32(static_cast<int32_t>(format));
357cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian        data.writeUint64(usage);
35829a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza        status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply);
35929a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza        if (result != NO_ERROR) {
36029a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza            ALOGE("allocateBuffers failed to transact: %d", result);
36129a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza        }
36229a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza    }
3639de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza
3649de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    virtual status_t allowAllocation(bool allow) {
3659de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza        Parcel data, reply;
3669de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
3679de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza        data.writeInt32(static_cast<int32_t>(allow));
3689de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza        status_t result = remote()->transact(ALLOW_ALLOCATION, data, &reply);
3699de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza        if (result != NO_ERROR) {
3709de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza            return result;
3719de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza        }
3729de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza        result = reply.readInt32();
3739de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza        return result;
3749de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    }
375812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
376812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    virtual status_t setGenerationNumber(uint32_t generationNumber) {
377812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza        Parcel data, reply;
378812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
379812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza        data.writeUint32(generationNumber);
380812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza        status_t result = remote()->transact(SET_GENERATION_NUMBER, data, &reply);
381812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza        if (result == NO_ERROR) {
382812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza            result = reply.readInt32();
383812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza        }
384812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza        return result;
385812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    }
386c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza
387c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza    virtual String8 getConsumerName() const {
388c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza        Parcel data, reply;
389c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
390c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza        status_t result = remote()->transact(GET_CONSUMER_NAME, data, &reply);
391c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza        if (result != NO_ERROR) {
392c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza            ALOGE("getConsumerName failed to transact: %d", result);
393c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza            return String8("TransactFailed");
394c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza        }
395c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza        return reply.readString8();
396c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza    }
3977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
3983559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    virtual status_t setSharedBufferMode(bool sharedBufferMode) {
399ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        Parcel data, reply;
400ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        data.writeInterfaceToken(
401ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos                IGraphicBufferProducer::getInterfaceDescriptor());
4023559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos        data.writeInt32(sharedBufferMode);
4033559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos        status_t result = remote()->transact(SET_SHARED_BUFFER_MODE, data,
404ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos                &reply);
405ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        if (result == NO_ERROR) {
406ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos            result = reply.readInt32();
407ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        }
408ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        return result;
409ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    }
410127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza
411ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    virtual status_t setAutoRefresh(bool autoRefresh) {
412ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        Parcel data, reply;
413ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        data.writeInterfaceToken(
414ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos                IGraphicBufferProducer::getInterfaceDescriptor());
415ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        data.writeInt32(autoRefresh);
416ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        status_t result = remote()->transact(SET_AUTO_REFRESH, data, &reply);
417ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        if (result == NO_ERROR) {
418ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos            result = reply.readInt32();
419ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        }
420ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        return result;
421ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    }
422ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos
423127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    virtual status_t setDequeueTimeout(nsecs_t timeout) {
424127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        Parcel data, reply;
425127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
426127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        data.writeInt64(timeout);
427127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        status_t result = remote()->transact(SET_DEQUEUE_TIMEOUT, data, &reply);
428127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        if (result != NO_ERROR) {
429127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza            ALOGE("setDequeueTimeout failed to transact: %d", result);
430127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza            return result;
431127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        }
432127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        return reply.readInt32();
433127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    }
43450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza
43550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer,
4361a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck            sp<Fence>* outFence, float outTransformMatrix[16]) override {
43750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        Parcel data, reply;
43850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
43950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER, data,
44050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza                &reply);
44150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        if (result != NO_ERROR) {
44250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            ALOGE("getLastQueuedBuffer failed to transact: %d", result);
44350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            return result;
44450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        }
44550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        result = reply.readInt32();
44650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        if (result != NO_ERROR) {
44750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            return result;
44850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        }
449ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck        bool hasBuffer = reply.readBool();
450ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck        sp<GraphicBuffer> buffer;
451ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck        if (hasBuffer) {
452ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck            buffer = new GraphicBuffer();
453ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck            result = reply.read(*buffer);
4541a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck            if (result == NO_ERROR) {
4551a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck                result = reply.read(outTransformMatrix, sizeof(float) * 16);
4561a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck            }
457ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck        }
45850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        if (result != NO_ERROR) {
45950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
46050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            return result;
46150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        }
46250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        sp<Fence> fence(new Fence);
46350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        result = reply.read(*fence);
46450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        if (result != NO_ERROR) {
46550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            ALOGE("getLastQueuedBuffer failed to read fence: %d", result);
46650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            return result;
46750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        }
46850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        *outBuffer = buffer;
46950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        *outFence = fence;
47050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        return result;
47150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    }
472ce796e78a57018f186b062199c75d94545318acaPablo Ceballos
4733890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson    virtual void getFrameTimestamps(FrameEventHistoryDelta* outDelta) {
474ce796e78a57018f186b062199c75d94545318acaPablo Ceballos        Parcel data, reply;
475ce796e78a57018f186b062199c75d94545318acaPablo Ceballos        status_t result = data.writeInterfaceToken(
476ce796e78a57018f186b062199c75d94545318acaPablo Ceballos                IGraphicBufferProducer::getInterfaceDescriptor());
477ce796e78a57018f186b062199c75d94545318acaPablo Ceballos        if (result != NO_ERROR) {
4783890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            ALOGE("IGBP::getFrameTimestamps failed to write token: %d", result);
4793890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            return;
480ce796e78a57018f186b062199c75d94545318acaPablo Ceballos        }
481ce796e78a57018f186b062199c75d94545318acaPablo Ceballos        result = remote()->transact(GET_FRAME_TIMESTAMPS, data, &reply);
482ce796e78a57018f186b062199c75d94545318acaPablo Ceballos        if (result != NO_ERROR) {
4833890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            ALOGE("IGBP::getFrameTimestamps failed to transact: %d", result);
4843890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            return;
485ce796e78a57018f186b062199c75d94545318acaPablo Ceballos        }
4863890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson        result = reply.read(*outDelta);
487ce796e78a57018f186b062199c75d94545318acaPablo Ceballos        if (result != NO_ERROR) {
4883890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            ALOGE("IGBP::getFrameTimestamps failed to read timestamps: %d",
4893890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson                    result);
490ce796e78a57018f186b062199c75d94545318acaPablo Ceballos        }
491ce796e78a57018f186b062199c75d94545318acaPablo Ceballos    }
4926155b40830e7945e9d4a76fe89af9a6322d4977fPablo Ceballos
4938e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos    virtual status_t getUniqueId(uint64_t* outId) const {
4948e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos        Parcel data, reply;
4958e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
4968e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos        status_t result = remote()->transact(GET_UNIQUE_ID, data, &reply);
4978e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos        if (result != NO_ERROR) {
4988e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos            ALOGE("getUniqueId failed to transact: %d", result);
4998e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos        }
5008e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos        status_t actualResult = NO_ERROR;
5018e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos        result = reply.readInt32(&actualResult);
5028e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos        if (result != NO_ERROR) {
5038e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos            return result;
5048e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos        }
5058e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos        result = reply.readUint64(outId);
5068e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos        if (result != NO_ERROR) {
5078e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos            return result;
5088e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos        }
5098e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos        return actualResult;
5108e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos    }
511e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu
512e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu    virtual status_t getConsumerUsage(uint64_t* outUsage) const {
513e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu        Parcel data, reply;
514e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
515e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu        status_t result = remote()->transact(GET_CONSUMER_USAGE, data, &reply);
516e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu        if (result != NO_ERROR) {
517e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu            ALOGE("getConsumerUsage failed to transact: %d", result);
518e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu        }
519e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu        status_t actualResult = NO_ERROR;
520e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu        result = reply.readInt32(&actualResult);
521e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu        if (result != NO_ERROR) {
522e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu            return result;
523e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu        }
524e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu        result = reply.readUint64(outUsage);
525e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu        if (result != NO_ERROR) {
526e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu            return result;
527e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu        }
528e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu        return actualResult;
529e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu    }
5308ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis};
5318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
5323be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza// Out-of-line virtual method definition to trigger vtable emission in this
5333be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza// translation unit (see clang warning -Wweak-vtables)
5343be1c6b60a188dc10025e2ce156c11fac050625dDan StozaBpGraphicBufferProducer::~BpGraphicBufferProducer() {}
5353be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza
5366e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasaclass HpGraphicBufferProducer : public HpInterface<
5376e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        BpGraphicBufferProducer, H2BGraphicBufferProducer> {
5386e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasapublic:
5396e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    HpGraphicBufferProducer(const sp<IBinder>& base) : PBase(base) {}
5406e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
5416e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) override {
5426e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        return mBase->requestBuffer(slot, buf);
5436e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    }
5446e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
5456e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) override {
5466e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        return mBase->setMaxDequeuedBufferCount(maxDequeuedBuffers);
5476e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    }
5486e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
5496e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    status_t setAsyncMode(bool async) override {
5506e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        return mBase->setAsyncMode(async);
5516e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    }
5526e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
553a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott    status_t dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w, uint32_t h, PixelFormat format,
554a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott                           uint64_t usage, uint64_t* outBufferAge,
555a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott                           FrameEventHistoryDelta* outTimestamps) override {
556a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott        return mBase->dequeueBuffer(slot, fence, w, h, format, usage, outBufferAge, outTimestamps);
5576e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    }
5586e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
5596e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    status_t detachBuffer(int slot) override {
5606e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        return mBase->detachBuffer(slot);
5616e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    }
5626e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
5636e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    status_t detachNextBuffer(
5646e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa            sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) override {
5656e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        return mBase->detachNextBuffer(outBuffer, outFence);
5666e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    }
5676e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
5686e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    status_t attachBuffer(
5696e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa            int* outSlot, const sp<GraphicBuffer>& buffer) override {
5706e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        return mBase->attachBuffer(outSlot, buffer);
5716e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    }
5726e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
5736e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    status_t queueBuffer(
5746e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa            int slot,
5756e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa            const QueueBufferInput& input,
5766e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa            QueueBufferOutput* output) override {
5776e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        return mBase->queueBuffer(slot, input, output);
5786e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    }
5796e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
5806e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    status_t cancelBuffer(int slot, const sp<Fence>& fence) override {
5816e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        return mBase->cancelBuffer(slot, fence);
5826e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    }
5836e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
5846e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    int query(int what, int* value) override {
5856e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        return mBase->query(what, value);
5866e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    }
5876e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
5886e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    status_t connect(
5896e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa            const sp<IProducerListener>& listener,
5906e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa            int api, bool producerControlledByApp,
5916e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa            QueueBufferOutput* output) override {
5926e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        return mBase->connect(listener, api, producerControlledByApp, output);
5936e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    }
5946e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
5956e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    status_t disconnect(
5966e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa            int api, DisconnectMode mode = DisconnectMode::Api) override {
5976e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        return mBase->disconnect(api, mode);
5986e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    }
5996e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
6006e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    status_t setSidebandStream(const sp<NativeHandle>& stream) override {
6016e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        return mBase->setSidebandStream(stream);
6026e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    }
6036e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
6046e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    void allocateBuffers(uint32_t width, uint32_t height,
605cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian            PixelFormat format, uint64_t usage) override {
6066e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        return mBase->allocateBuffers(width, height, format, usage);
6076e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    }
6086e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
6096e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    status_t allowAllocation(bool allow) override {
6106e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        return mBase->allowAllocation(allow);
6116e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    }
6126e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
6136e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    status_t setGenerationNumber(uint32_t generationNumber) override {
6146e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        return mBase->setGenerationNumber(generationNumber);
6156e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    }
6166e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
6176e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    String8 getConsumerName() const override {
6186e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        return mBase->getConsumerName();
6196e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    }
6206e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
6216e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    status_t setSharedBufferMode(bool sharedBufferMode) override {
6226e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        return mBase->setSharedBufferMode(sharedBufferMode);
6236e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    }
6246e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
6256e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    status_t setAutoRefresh(bool autoRefresh) override {
6266e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        return mBase->setAutoRefresh(autoRefresh);
6276e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    }
6286e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
6296e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    status_t setDequeueTimeout(nsecs_t timeout) override {
6306e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        return mBase->setDequeueTimeout(timeout);
6316e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    }
6326e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
6336e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    status_t getLastQueuedBuffer(
6346e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa            sp<GraphicBuffer>* outBuffer,
6356e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa            sp<Fence>* outFence,
6366e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa            float outTransformMatrix[16]) override {
6376e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        return mBase->getLastQueuedBuffer(
6386e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa                outBuffer, outFence, outTransformMatrix);
6396e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    }
6406e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
6416e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    void getFrameTimestamps(FrameEventHistoryDelta* outDelta) override {
6426e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        return mBase->getFrameTimestamps(outDelta);
6436e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    }
6446e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
6456e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    status_t getUniqueId(uint64_t* outId) const override {
6466e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        return mBase->getUniqueId(outId);
6476e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa    }
648e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu
649e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu    status_t getConsumerUsage(uint64_t* outUsage) const override {
650e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu        return mBase->getConsumerUsage(outUsage);
651e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu    }
6526e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa};
6536e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa
6546e1193af40c870c50013affec37c8429986b3c7bPawin VongmasaIMPLEMENT_HYBRID_META_INTERFACE(GraphicBufferProducer, HGraphicBufferProducer,
6556e1193af40c870c50013affec37c8429986b3c7bPawin Vongmasa        "android.gui.IGraphicBufferProducer");
6568ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
6578ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ----------------------------------------------------------------------
6588ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
659c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caistatus_t IGraphicBufferProducer::exportToParcel(Parcel* parcel) {
660c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    status_t res = OK;
661c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    res = parcel->writeUint32(USE_BUFFER_QUEUE);
662c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    if (res != NO_ERROR) {
663c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        ALOGE("exportToParcel: Cannot write magic, res=%d.", res);
664c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        return res;
665c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    }
666c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
667c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    return parcel->writeStrongBinder(IInterface::asBinder(this));
668c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai}
669c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
670c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai/* static */
671c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caistatus_t IGraphicBufferProducer::exportToParcel(const sp<IGraphicBufferProducer>& producer,
672c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai                                                Parcel* parcel) {
673c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    if (parcel == nullptr) {
674c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        ALOGE("exportToParcel: Invalid parcel object.");
675c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        return BAD_VALUE;
676c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    }
677c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
678c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    if (producer == nullptr) {
679c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        status_t res = OK;
680c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        res = parcel->writeUint32(IGraphicBufferProducer::USE_BUFFER_QUEUE);
681c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        if (res != NO_ERROR) return res;
682c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        return parcel->writeStrongBinder(nullptr);
683c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    } else {
684c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        return producer->exportToParcel(parcel);
685c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    }
686c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai}
687c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
688c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai/* static */
689c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caisp<IGraphicBufferProducer> IGraphicBufferProducer::createFromParcel(const Parcel* parcel) {
690c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    uint32_t outMagic = 0;
691c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    status_t res = NO_ERROR;
692c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
693c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    res = parcel->readUint32(&outMagic);
694c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    if (res != NO_ERROR) {
695c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        ALOGE("createFromParcel: Failed to read magic, error=%d.", res);
696c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        return nullptr;
697c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    }
698c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
699c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    switch (outMagic) {
700c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        case USE_BUFFER_QUEUE: {
701c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            sp<IBinder> binder;
702c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            res = parcel->readNullableStrongBinder(&binder);
703c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            if (res != NO_ERROR) {
704c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai                ALOGE("createFromParcel: Can't read strong binder.");
705c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai                return nullptr;
706c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            }
707c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            return interface_cast<IGraphicBufferProducer>(binder);
708c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        }
709c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        case USE_BUFFER_HUB: {
710c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            ALOGE("createFromParcel: BufferHub not implemented.");
711f5f36c75527b1924ef8cb5cb66eb745dd27a0fc6Jiwen 'Steve' Cai#ifndef NO_BUFFERHUB
712c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            dvr::ProducerQueueParcelable producerParcelable;
713c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            res = producerParcelable.readFromParcel(parcel);
714c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            if (res != NO_ERROR) {
715c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai                ALOGE("createFromParcel: Failed to read from parcel, error=%d", res);
716c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai                return nullptr;
717c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            }
718c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            return BufferHubProducer::Create(std::move(producerParcelable));
719f5f36c75527b1924ef8cb5cb66eb745dd27a0fc6Jiwen 'Steve' Cai#else
720f5f36c75527b1924ef8cb5cb66eb745dd27a0fc6Jiwen 'Steve' Cai            return nullptr;
721f5f36c75527b1924ef8cb5cb66eb745dd27a0fc6Jiwen 'Steve' Cai#endif
722c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        }
723c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        default: {
724c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            ALOGE("createFromParcel: Unexpected mgaic: 0x%x.", outMagic);
725c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai            return nullptr;
726c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai        }
727c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    }
728c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai}
729c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
730c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai// ----------------------------------------------------------------------------
731c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
7322adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenstatus_t BnGraphicBufferProducer::onTransact(
7338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
7348ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis{
7358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    switch(code) {
7368ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        case REQUEST_BUFFER: {
7372adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
7388ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            int bufferIdx   = data.readInt32();
7397b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis            sp<GraphicBuffer> buffer;
7407b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis            int result = requestBuffer(bufferIdx, &buffer);
7418ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            reply->writeInt32(buffer != 0);
7428ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            if (buffer != 0) {
7438ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis                reply->write(*buffer);
7448ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            }
7457b305fffc39d0fe0926e7fd2d7f6a524fbce62b7Jamie Gennis            reply->writeInt32(result);
7468ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            return NO_ERROR;
7473be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza        }
748fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos        case SET_MAX_DEQUEUED_BUFFER_COUNT: {
749fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
750fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos            int maxDequeuedBuffers = data.readInt32();
751fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos            int result = setMaxDequeuedBufferCount(maxDequeuedBuffers);
752fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos            reply->writeInt32(result);
753fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos            return NO_ERROR;
754fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos        }
755fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos        case SET_ASYNC_MODE: {
756fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
757fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos            bool async = data.readInt32();
758fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos            int result = setAsyncMode(async);
759fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos            reply->writeInt32(result);
760fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos            return NO_ERROR;
761fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos        }
7628ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        case DEQUEUE_BUFFER: {
7632adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
7643be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza            uint32_t width = data.readUint32();
7653be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza            uint32_t height = data.readUint32();
7663be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza            PixelFormat format = static_cast<PixelFormat>(data.readInt32());
767cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian            uint64_t usage = data.readUint64();
768a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott            uint64_t bufferAge = 0;
7697c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            bool getTimestamps = data.readBool();
770baaad32cd582bcc09db89135715717234ea398eaBrian Anderson
77112ba0f57d028a9c8f4eb3afddc326b70677d1e0cNaveen Leekha            int buf = 0;
772baaad32cd582bcc09db89135715717234ea398eaBrian Anderson            sp<Fence> fence = Fence::NO_FENCE;
7737c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            FrameEventHistoryDelta frameTimestamps;
774a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott            int result = dequeueBuffer(&buf, &fence, width, height, format, usage, &bufferAge,
775a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott                                       getTimestamps ? &frameTimestamps : nullptr);
776baaad32cd582bcc09db89135715717234ea398eaBrian Anderson
7778ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            reply->writeInt32(buf);
778baaad32cd582bcc09db89135715717234ea398eaBrian Anderson            reply->write(*fence);
779a2eb34cfbe089deb9a519e9702e17d9dfe26f9e8Ian Elliott            reply->writeUint64(bufferAge);
7807c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            if (getTimestamps) {
7817c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson                reply->write(frameTimestamps);
7827c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            }
7838ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            reply->writeInt32(result);
7849f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            return NO_ERROR;
7853be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza        }
7869f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        case DETACH_BUFFER: {
7879f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
7889f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            int slot = data.readInt32();
7899f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            int result = detachBuffer(slot);
7909f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            reply->writeInt32(result);
7919f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            return NO_ERROR;
7923be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza        }
793d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza        case DETACH_NEXT_BUFFER: {
794d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
795d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza            sp<GraphicBuffer> buffer;
796d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza            sp<Fence> fence;
797d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza            int32_t result = detachNextBuffer(&buffer, &fence);
798d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza            reply->writeInt32(result);
799d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza            if (result == NO_ERROR) {
800d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza                reply->writeInt32(buffer != NULL);
801d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza                if (buffer != NULL) {
802d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza                    reply->write(*buffer);
803d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza                }
804d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza                reply->writeInt32(fence != NULL);
805d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza                if (fence != NULL) {
806d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza                    reply->write(*fence);
807d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza                }
808d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza            }
809d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza            return NO_ERROR;
8103be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza        }
8119f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        case ATTACH_BUFFER: {
8129f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
8139f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            sp<GraphicBuffer> buffer = new GraphicBuffer();
81470636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos            status_t result = data.read(*buffer.get());
81512ba0f57d028a9c8f4eb3afddc326b70677d1e0cNaveen Leekha            int slot = 0;
81670636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos            if (result == NO_ERROR) {
81770636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos                result = attachBuffer(&slot, buffer);
81870636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos            }
8199f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            reply->writeInt32(slot);
8209f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            reply->writeInt32(result);
8218ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            return NO_ERROR;
8223be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza        }
8238ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        case QUEUE_BUFFER: {
8242adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
8257c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson
8268ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            int buf = data.readInt32();
827c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall            QueueBufferInput input(data);
828baaad32cd582bcc09db89135715717234ea398eaBrian Anderson            QueueBufferOutput output;
829baaad32cd582bcc09db89135715717234ea398eaBrian Anderson            status_t result = queueBuffer(buf, input, &output);
830baaad32cd582bcc09db89135715717234ea398eaBrian Anderson            reply->write(output);
8318ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            reply->writeInt32(result);
8327c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson
8338ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            return NO_ERROR;
8343be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza        }
8358ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis        case CANCEL_BUFFER: {
8362adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
8378ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            int buf = data.readInt32();
8381df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis            sp<Fence> fence = new Fence();
83970636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos            status_t result = data.read(*fence.get());
84070636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos            if (result == NO_ERROR) {
84170636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos                result = cancelBuffer(buf, fence);
84270636b334d75ab77ffc925d9624a72456140d87aPablo Ceballos            }
843583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos            reply->writeInt32(result);
8448ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis            return NO_ERROR;
8453be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza        }
846eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian        case QUERY: {
8472adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
84812ba0f57d028a9c8f4eb3afddc326b70677d1e0cNaveen Leekha            int value = 0;
849eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian            int what = data.readInt32();
850eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian            int res = query(what, &value);
851eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian            reply->writeInt32(value);
852eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian            reply->writeInt32(res);
853eafabcdc1639fb96062d9e3c39b0ae27b0238ae1Mathias Agopian            return NO_ERROR;
8543be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza        }
855fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis        case CONNECT: {
8562adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
857f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza            sp<IProducerListener> listener;
858f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza            if (data.readInt32() == 1) {
859f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza                listener = IProducerListener::asInterface(data.readStrongBinder());
860f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza            }
861fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis            int api = data.readInt32();
862595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian            bool producerControlledByApp = data.readInt32();
863baaad32cd582bcc09db89135715717234ea398eaBrian Anderson            QueueBufferOutput output;
864baaad32cd582bcc09db89135715717234ea398eaBrian Anderson            status_t res = connect(listener, api, producerControlledByApp, &output);
865baaad32cd582bcc09db89135715717234ea398eaBrian Anderson            reply->write(output);
866fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis            reply->writeInt32(res);
867fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis            return NO_ERROR;
8683be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza        }
869fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis        case DISCONNECT: {
8702adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
871fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis            int api = data.readInt32();
87297b9c86338e2d364d47ea7522c2d81a8014f0e07Robert Carr            DisconnectMode mode = static_cast<DisconnectMode>(data.readInt32());
87397b9c86338e2d364d47ea7522c2d81a8014f0e07Robert Carr            status_t res = disconnect(api, mode);
874fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis            reply->writeInt32(res);
875fe0a87b54654a1392650e7f1862df473287d8332Jamie Gennis            return NO_ERROR;
8763be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza        }
877399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall        case SET_SIDEBAND_STREAM: {
878399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
879399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall            sp<NativeHandle> stream;
880399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall            if (data.readInt32()) {
8810ec54e156bed93d59900b742c8e9adcfaee90612Wonsik Kim                stream = NativeHandle::create(data.readNativeHandle(), true);
882399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall            }
883399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall            status_t result = setSidebandStream(stream);
884399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall            reply->writeInt32(result);
885399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall            return NO_ERROR;
8863be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza        }
8879de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza        case ALLOCATE_BUFFERS: {
88829a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
8893be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza            uint32_t width = data.readUint32();
8903be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza            uint32_t height = data.readUint32();
8913be1c6b60a188dc10025e2ce156c11fac050625dDan Stoza            PixelFormat format = static_cast<PixelFormat>(data.readInt32());
892cb496acbe593326e8d5d563847067d02b2df40ecMathias Agopian            uint64_t usage = data.readUint64();
893567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            allocateBuffers(width, height, format, usage);
89429a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza            return NO_ERROR;
8959de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza        }
8969de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza        case ALLOW_ALLOCATION: {
8979de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
8989de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza            bool allow = static_cast<bool>(data.readInt32());
8999de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza            status_t result = allowAllocation(allow);
9009de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza            reply->writeInt32(result);
9019de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza            return NO_ERROR;
9029de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza        }
903812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza        case SET_GENERATION_NUMBER: {
904812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
905812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza            uint32_t generationNumber = data.readUint32();
906812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza            status_t result = setGenerationNumber(generationNumber);
907812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza            reply->writeInt32(result);
908812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza            return NO_ERROR;
909812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza        }
910c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza        case GET_CONSUMER_NAME: {
911c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
912c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza            reply->writeString8(getConsumerName());
913c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza            return NO_ERROR;
914c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza        }
9153559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos        case SET_SHARED_BUFFER_MODE: {
916ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
9173559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos            bool sharedBufferMode = data.readInt32();
9183559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos            status_t result = setSharedBufferMode(sharedBufferMode);
919ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos            reply->writeInt32(result);
920ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos            return NO_ERROR;
921ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        }
922ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        case SET_AUTO_REFRESH: {
923ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos            CHECK_INTERFACE(IGraphicBuffer, data, reply);
924ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos            bool autoRefresh = data.readInt32();
925ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos            status_t result = setAutoRefresh(autoRefresh);
926ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos            reply->writeInt32(result);
927ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos            return NO_ERROR;
928ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        }
929127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        case SET_DEQUEUE_TIMEOUT: {
930127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
931127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza            nsecs_t timeout = data.readInt64();
932127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza            status_t result = setDequeueTimeout(timeout);
933127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza            reply->writeInt32(result);
934127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza            return NO_ERROR;
935127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        }
93650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        case GET_LAST_QUEUED_BUFFER: {
93750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
93850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            sp<GraphicBuffer> buffer(nullptr);
93950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            sp<Fence> fence(Fence::NO_FENCE);
9401a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck            float transform[16] = {};
9411a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck            status_t result = getLastQueuedBuffer(&buffer, &fence, transform);
94250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            reply->writeInt32(result);
94350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            if (result != NO_ERROR) {
94450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza                return result;
94550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            }
946ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck            if (!buffer.get()) {
947ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck                reply->writeBool(false);
948ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck            } else {
949ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck                reply->writeBool(true);
950ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck                result = reply->write(*buffer);
9511a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck                if (result == NO_ERROR) {
9521a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck                    reply->write(transform, sizeof(float) * 16);
9531a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck                }
954ce8e5df3c11616f3eb7867ce89558b530651166cJohn Reck            }
95550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            if (result != NO_ERROR) {
95650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza                ALOGE("getLastQueuedBuffer failed to write buffer: %d", result);
95750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza                return result;
95850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            }
95950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            result = reply->write(*fence);
96050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            if (result != NO_ERROR) {
96150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza                ALOGE("getLastQueuedBuffer failed to write fence: %d", result);
96250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza                return result;
96350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            }
96450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            return NO_ERROR;
96550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        }
966ce796e78a57018f186b062199c75d94545318acaPablo Ceballos        case GET_FRAME_TIMESTAMPS: {
967ce796e78a57018f186b062199c75d94545318acaPablo Ceballos            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
9683890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            FrameEventHistoryDelta frameTimestamps;
9693890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            getFrameTimestamps(&frameTimestamps);
9703890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson            status_t result = reply->write(frameTimestamps);
971ce796e78a57018f186b062199c75d94545318acaPablo Ceballos            if (result != NO_ERROR) {
9723890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson                ALOGE("BnGBP::GET_FRAME_TIMESTAMPS failed to write buffer: %d",
9733890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson                        result);
974ce796e78a57018f186b062199c75d94545318acaPablo Ceballos                return result;
975ce796e78a57018f186b062199c75d94545318acaPablo Ceballos            }
976ce796e78a57018f186b062199c75d94545318acaPablo Ceballos            return NO_ERROR;
977ce796e78a57018f186b062199c75d94545318acaPablo Ceballos        }
9788e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos        case GET_UNIQUE_ID: {
9798e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
9808e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos            uint64_t outId = 0;
9818e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos            status_t actualResult = getUniqueId(&outId);
9828e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos            status_t result = reply->writeInt32(actualResult);
9838e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos            if (result != NO_ERROR) {
9848e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos                return result;
9858e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos            }
9868e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos            result = reply->writeUint64(outId);
9878e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos            if (result != NO_ERROR) {
9888e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos                return result;
9898e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos            }
9908e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos            return NO_ERROR;
9918e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos        }
992e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu        case GET_CONSUMER_USAGE: {
993e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
994e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu            uint64_t outUsage = 0;
995e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu            status_t actualResult = getConsumerUsage(&outUsage);
996e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu            status_t result = reply->writeInt32(actualResult);
997e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu            if (result != NO_ERROR) {
998e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu                return result;
999e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu            }
1000e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu            result = reply->writeUint64(outUsage);
1001e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu            if (result != NO_ERROR) {
1002e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu                return result;
1003e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu            }
1004e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu            return NO_ERROR;
1005e2786ea5aec3a12d948feb85ffbb535fc89c0fe6Chia-I Wu        }
10068ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    }
10078ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis    return BBinder::onTransact(code, data, reply, flags);
10088ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}
10098ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
10108ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis// ----------------------------------------------------------------------------
10118ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis
10122adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFaddenIGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) {
1013c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall    parcel.read(*this);
1014c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall}
1015c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall
10167c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Andersonconstexpr size_t IGraphicBufferProducer::QueueBufferInput::minFlattenedSize() {
10177c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    return sizeof(timestamp) +
10187c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            sizeof(isAutoTimestamp) +
10197c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            sizeof(dataSpace) +
10207c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            sizeof(crop) +
10217c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            sizeof(scalingMode) +
10227c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            sizeof(transform) +
10237c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            sizeof(stickyTransform) +
10247c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            sizeof(getFrameTimestamps);
10257c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson}
10267c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson
1027e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const {
10287c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    return minFlattenedSize() +
10297c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            fence->getFlattenedSize() +
10309bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter            surfaceDamage.getFlattenedSize() +
10319bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter            hdrMetadata.getFlattenedSize();
1032c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall}
1033c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall
1034e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopiansize_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const {
10351df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis    return fence->getFdCount();
1036c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall}
1037c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall
1038e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t IGraphicBufferProducer::QueueBufferInput::flatten(
1039e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian        void*& buffer, size_t& size, int*& fds, size_t& count) const
1040c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall{
1041e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    if (size < getFlattenedSize()) {
1042e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian        return NO_MEMORY;
1043e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    }
10447c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson
1045e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    FlattenableUtils::write(buffer, size, timestamp);
10463c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden    FlattenableUtils::write(buffer, size, isAutoTimestamp);
104782c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala    FlattenableUtils::write(buffer, size, dataSpace);
1048e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    FlattenableUtils::write(buffer, size, crop);
1049e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    FlattenableUtils::write(buffer, size, scalingMode);
1050e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    FlattenableUtils::write(buffer, size, transform);
10511681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    FlattenableUtils::write(buffer, size, stickyTransform);
10527c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    FlattenableUtils::write(buffer, size, getFrameTimestamps);
10537c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson
10545065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza    status_t result = fence->flatten(buffer, size, fds, count);
10555065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza    if (result != NO_ERROR) {
10565065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza        return result;
10575065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza    }
10589bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    result = surfaceDamage.flatten(buffer, size);
10599bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    if (result != NO_ERROR) {
10609bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter        return result;
10619bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    }
10629bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize());
10639bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    return hdrMetadata.flatten(buffer, size);
1064c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall}
1065c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall
1066e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t IGraphicBufferProducer::QueueBufferInput::unflatten(
1067e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian        void const*& buffer, size_t& size, int const*& fds, size_t& count)
1068c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall{
10697c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    if (size < minFlattenedSize()) {
1070e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian        return NO_MEMORY;
1071e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    }
1072e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian
1073e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    FlattenableUtils::read(buffer, size, timestamp);
10743c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden    FlattenableUtils::read(buffer, size, isAutoTimestamp);
107582c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala    FlattenableUtils::read(buffer, size, dataSpace);
1076e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    FlattenableUtils::read(buffer, size, crop);
1077e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    FlattenableUtils::read(buffer, size, scalingMode);
1078e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    FlattenableUtils::read(buffer, size, transform);
10791681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk    FlattenableUtils::read(buffer, size, stickyTransform);
10807c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    FlattenableUtils::read(buffer, size, getFrameTimestamps);
1081e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian
10821df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis    fence = new Fence();
10835065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza    status_t result = fence->unflatten(buffer, size, fds, count);
10845065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza    if (result != NO_ERROR) {
10855065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza        return result;
10865065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza    }
10879bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    result = surfaceDamage.unflatten(buffer, size);
10889bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    if (result != NO_ERROR) {
10899bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter        return result;
10909bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    }
10919bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize());
10929bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    return hdrMetadata.unflatten(buffer, size);
1093c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall}
1094c777b0b3b9b0ea5d8e378fccde6935765e28e329Jesse Hall
1095baaad32cd582bcc09db89135715717234ea398eaBrian Anderson// ----------------------------------------------------------------------------
10967c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Andersonconstexpr size_t IGraphicBufferProducer::QueueBufferOutput::minFlattenedSize() {
10977c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    return sizeof(width) +
10987c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            sizeof(height) +
10997c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            sizeof(transformHint) +
11007c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            sizeof(numPendingBuffers) +
110122f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang            sizeof(nextFrameNumber) +
110222f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang            sizeof(bufferReplaced);
11037c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson}
1104baaad32cd582bcc09db89135715717234ea398eaBrian Anderson
1105baaad32cd582bcc09db89135715717234ea398eaBrian Andersonsize_t IGraphicBufferProducer::QueueBufferOutput::getFlattenedSize() const {
11067c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    return minFlattenedSize() + frameTimestamps.getFlattenedSize();
1107baaad32cd582bcc09db89135715717234ea398eaBrian Anderson}
1108baaad32cd582bcc09db89135715717234ea398eaBrian Anderson
1109baaad32cd582bcc09db89135715717234ea398eaBrian Andersonsize_t IGraphicBufferProducer::QueueBufferOutput::getFdCount() const {
11107c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    return frameTimestamps.getFdCount();
1111baaad32cd582bcc09db89135715717234ea398eaBrian Anderson}
1112baaad32cd582bcc09db89135715717234ea398eaBrian Anderson
1113baaad32cd582bcc09db89135715717234ea398eaBrian Andersonstatus_t IGraphicBufferProducer::QueueBufferOutput::flatten(
11147c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson        void*& buffer, size_t& size, int*& fds, size_t& count) const
1115baaad32cd582bcc09db89135715717234ea398eaBrian Anderson{
1116baaad32cd582bcc09db89135715717234ea398eaBrian Anderson    if (size < getFlattenedSize()) {
1117baaad32cd582bcc09db89135715717234ea398eaBrian Anderson        return NO_MEMORY;
1118baaad32cd582bcc09db89135715717234ea398eaBrian Anderson    }
11197c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson
1120baaad32cd582bcc09db89135715717234ea398eaBrian Anderson    FlattenableUtils::write(buffer, size, width);
1121baaad32cd582bcc09db89135715717234ea398eaBrian Anderson    FlattenableUtils::write(buffer, size, height);
1122baaad32cd582bcc09db89135715717234ea398eaBrian Anderson    FlattenableUtils::write(buffer, size, transformHint);
1123baaad32cd582bcc09db89135715717234ea398eaBrian Anderson    FlattenableUtils::write(buffer, size, numPendingBuffers);
1124baaad32cd582bcc09db89135715717234ea398eaBrian Anderson    FlattenableUtils::write(buffer, size, nextFrameNumber);
112522f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    FlattenableUtils::write(buffer, size, bufferReplaced);
1126baaad32cd582bcc09db89135715717234ea398eaBrian Anderson
11277c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    return frameTimestamps.flatten(buffer, size, fds, count);
1128baaad32cd582bcc09db89135715717234ea398eaBrian Anderson}
1129baaad32cd582bcc09db89135715717234ea398eaBrian Anderson
1130baaad32cd582bcc09db89135715717234ea398eaBrian Andersonstatus_t IGraphicBufferProducer::QueueBufferOutput::unflatten(
11317c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson        void const*& buffer, size_t& size, int const*& fds, size_t& count)
1132baaad32cd582bcc09db89135715717234ea398eaBrian Anderson{
11337c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    if (size < minFlattenedSize()) {
1134baaad32cd582bcc09db89135715717234ea398eaBrian Anderson        return NO_MEMORY;
1135baaad32cd582bcc09db89135715717234ea398eaBrian Anderson    }
11367c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson
1137baaad32cd582bcc09db89135715717234ea398eaBrian Anderson    FlattenableUtils::read(buffer, size, width);
1138baaad32cd582bcc09db89135715717234ea398eaBrian Anderson    FlattenableUtils::read(buffer, size, height);
1139baaad32cd582bcc09db89135715717234ea398eaBrian Anderson    FlattenableUtils::read(buffer, size, transformHint);
1140baaad32cd582bcc09db89135715717234ea398eaBrian Anderson    FlattenableUtils::read(buffer, size, numPendingBuffers);
1141baaad32cd582bcc09db89135715717234ea398eaBrian Anderson    FlattenableUtils::read(buffer, size, nextFrameNumber);
114222f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    FlattenableUtils::read(buffer, size, bufferReplaced);
1143baaad32cd582bcc09db89135715717234ea398eaBrian Anderson
11447c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    return frameTimestamps.unflatten(buffer, size, fds, count);
1145baaad32cd582bcc09db89135715717234ea398eaBrian Anderson}
1146baaad32cd582bcc09db89135715717234ea398eaBrian Anderson
11478ba32fade11abb73f3fd47ea0953c9528eb5b91fJamie Gennis}; // namespace android
1148