Home | History | Annotate | Download | only in gui
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include <stdint.h>
     18 #include <sys/types.h>
     19 
     20 #include <utils/Errors.h>
     21 #include <utils/NativeHandle.h>
     22 #include <utils/RefBase.h>
     23 #include <utils/String8.h>
     24 #include <utils/Timers.h>
     25 #include <utils/Vector.h>
     26 
     27 #include <binder/Parcel.h>
     28 #include <binder/IInterface.h>
     29 
     30 #ifndef NO_BUFFERHUB
     31 #include <gui/BufferHubProducer.h>
     32 #endif
     33 #include <gui/BufferQueueDefs.h>
     34 #include <gui/IGraphicBufferProducer.h>
     35 #include <gui/IProducerListener.h>
     36 
     37 #include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h>
     38 
     39 namespace android {
     40 // ----------------------------------------------------------------------------
     41 
     42 using ::android::hardware::graphics::bufferqueue::V1_0::utils::
     43         H2BGraphicBufferProducer;
     44 
     45 enum {
     46     REQUEST_BUFFER = IBinder::FIRST_CALL_TRANSACTION,
     47     DEQUEUE_BUFFER,
     48     DETACH_BUFFER,
     49     DETACH_NEXT_BUFFER,
     50     ATTACH_BUFFER,
     51     QUEUE_BUFFER,
     52     CANCEL_BUFFER,
     53     QUERY,
     54     CONNECT,
     55     DISCONNECT,
     56     SET_SIDEBAND_STREAM,
     57     ALLOCATE_BUFFERS,
     58     ALLOW_ALLOCATION,
     59     SET_GENERATION_NUMBER,
     60     GET_CONSUMER_NAME,
     61     SET_MAX_DEQUEUED_BUFFER_COUNT,
     62     SET_ASYNC_MODE,
     63     SET_SHARED_BUFFER_MODE,
     64     SET_AUTO_REFRESH,
     65     SET_DEQUEUE_TIMEOUT,
     66     GET_LAST_QUEUED_BUFFER,
     67     GET_FRAME_TIMESTAMPS,
     68     GET_UNIQUE_ID,
     69     GET_CONSUMER_USAGE,
     70 };
     71 
     72 class BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer>
     73 {
     74 public:
     75     explicit BpGraphicBufferProducer(const sp<IBinder>& impl)
     76         : BpInterface<IGraphicBufferProducer>(impl)
     77     {
     78     }
     79 
     80     ~BpGraphicBufferProducer() override;
     81 
     82     virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) {
     83         Parcel data, reply;
     84         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
     85         data.writeInt32(bufferIdx);
     86         status_t result =remote()->transact(REQUEST_BUFFER, data, &reply);
     87         if (result != NO_ERROR) {
     88             return result;
     89         }
     90         bool nonNull = reply.readInt32();
     91         if (nonNull) {
     92             *buf = new GraphicBuffer();
     93             result = reply.read(**buf);
     94             if(result != NO_ERROR) {
     95                 (*buf).clear();
     96                 return result;
     97             }
     98         }
     99         result = reply.readInt32();
    100         return result;
    101     }
    102 
    103     virtual status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) {
    104         Parcel data, reply;
    105         data.writeInterfaceToken(
    106                 IGraphicBufferProducer::getInterfaceDescriptor());
    107         data.writeInt32(maxDequeuedBuffers);
    108         status_t result = remote()->transact(SET_MAX_DEQUEUED_BUFFER_COUNT,
    109                 data, &reply);
    110         if (result != NO_ERROR) {
    111             return result;
    112         }
    113         result = reply.readInt32();
    114         return result;
    115     }
    116 
    117     virtual status_t setAsyncMode(bool async) {
    118         Parcel data, reply;
    119         data.writeInterfaceToken(
    120                 IGraphicBufferProducer::getInterfaceDescriptor());
    121         data.writeInt32(async);
    122         status_t result = remote()->transact(SET_ASYNC_MODE,
    123                 data, &reply);
    124         if (result != NO_ERROR) {
    125             return result;
    126         }
    127         result = reply.readInt32();
    128         return result;
    129     }
    130 
    131     virtual status_t dequeueBuffer(int* buf, sp<Fence>* fence, uint32_t width, uint32_t height,
    132                                    PixelFormat format, uint64_t usage, uint64_t* outBufferAge,
    133                                    FrameEventHistoryDelta* outTimestamps) {
    134         Parcel data, reply;
    135         bool getFrameTimestamps = (outTimestamps != nullptr);
    136 
    137         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
    138         data.writeUint32(width);
    139         data.writeUint32(height);
    140         data.writeInt32(static_cast<int32_t>(format));
    141         data.writeUint64(usage);
    142         data.writeBool(getFrameTimestamps);
    143 
    144         status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply);
    145         if (result != NO_ERROR) {
    146             return result;
    147         }
    148 
    149         *buf = reply.readInt32();
    150         *fence = new Fence();
    151         result = reply.read(**fence);
    152         if (result != NO_ERROR) {
    153             fence->clear();
    154             return result;
    155         }
    156         if (outBufferAge) {
    157             result = reply.readUint64(outBufferAge);
    158         } else {
    159             // Read the value even if outBufferAge is nullptr:
    160             uint64_t bufferAge;
    161             result = reply.readUint64(&bufferAge);
    162         }
    163         if (result != NO_ERROR) {
    164             ALOGE("IGBP::dequeueBuffer failed to read buffer age: %d", result);
    165             return result;
    166         }
    167         if (getFrameTimestamps) {
    168             result = reply.read(*outTimestamps);
    169             if (result != NO_ERROR) {
    170                 ALOGE("IGBP::dequeueBuffer failed to read timestamps: %d",
    171                         result);
    172                 return result;
    173             }
    174         }
    175         result = reply.readInt32();
    176         return result;
    177     }
    178 
    179     virtual status_t detachBuffer(int slot) {
    180         Parcel data, reply;
    181         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
    182         data.writeInt32(slot);
    183         status_t result = remote()->transact(DETACH_BUFFER, data, &reply);
    184         if (result != NO_ERROR) {
    185             return result;
    186         }
    187         result = reply.readInt32();
    188         return result;
    189     }
    190 
    191     virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer,
    192             sp<Fence>* outFence) {
    193         if (outBuffer == NULL) {
    194             ALOGE("detachNextBuffer: outBuffer must not be NULL");
    195             return BAD_VALUE;
    196         } else if (outFence == NULL) {
    197             ALOGE("detachNextBuffer: outFence must not be NULL");
    198             return BAD_VALUE;
    199         }
    200         Parcel data, reply;
    201         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
    202         status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply);
    203         if (result != NO_ERROR) {
    204             return result;
    205         }
    206         result = reply.readInt32();
    207         if (result == NO_ERROR) {
    208             bool nonNull = reply.readInt32();
    209             if (nonNull) {
    210                 *outBuffer = new GraphicBuffer;
    211                 result = reply.read(**outBuffer);
    212                 if (result != NO_ERROR) {
    213                     outBuffer->clear();
    214                     return result;
    215                 }
    216             }
    217             nonNull = reply.readInt32();
    218             if (nonNull) {
    219                 *outFence = new Fence;
    220                 result = reply.read(**outFence);
    221                 if (result != NO_ERROR) {
    222                     outBuffer->clear();
    223                     outFence->clear();
    224                     return result;
    225                 }
    226             }
    227         }
    228         return result;
    229     }
    230 
    231     virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) {
    232         Parcel data, reply;
    233         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
    234         data.write(*buffer.get());
    235         status_t result = remote()->transact(ATTACH_BUFFER, data, &reply);
    236         if (result != NO_ERROR) {
    237             return result;
    238         }
    239 
    240         *slot = reply.readInt32();
    241         result = reply.readInt32();
    242         if (result == NO_ERROR &&
    243                 (*slot < 0 || *slot >= BufferQueueDefs::NUM_BUFFER_SLOTS)) {
    244             ALOGE("attachBuffer returned invalid slot %d", *slot);
    245             android_errorWriteLog(0x534e4554, "37478824");
    246             return UNKNOWN_ERROR;
    247         }
    248 
    249         return result;
    250     }
    251 
    252     virtual status_t queueBuffer(int buf,
    253             const QueueBufferInput& input, QueueBufferOutput* output) {
    254         Parcel data, reply;
    255 
    256         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
    257         data.writeInt32(buf);
    258         data.write(input);
    259 
    260         status_t result = remote()->transact(QUEUE_BUFFER, data, &reply);
    261         if (result != NO_ERROR) {
    262             return result;
    263         }
    264 
    265         result = reply.read(*output);
    266         if (result != NO_ERROR) {
    267             return result;
    268         }
    269 
    270         result = reply.readInt32();
    271         return result;
    272     }
    273 
    274     virtual status_t cancelBuffer(int buf, const sp<Fence>& fence) {
    275         Parcel data, reply;
    276         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
    277         data.writeInt32(buf);
    278         data.write(*fence.get());
    279         status_t result = remote()->transact(CANCEL_BUFFER, data, &reply);
    280         if (result != NO_ERROR) {
    281             return result;
    282         }
    283         result = reply.readInt32();
    284         return result;
    285     }
    286 
    287     virtual int query(int what, int* value) {
    288         Parcel data, reply;
    289         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
    290         data.writeInt32(what);
    291         status_t result = remote()->transact(QUERY, data, &reply);
    292         if (result != NO_ERROR) {
    293             return result;
    294         }
    295         value[0] = reply.readInt32();
    296         result = reply.readInt32();
    297         return result;
    298     }
    299 
    300     virtual status_t connect(const sp<IProducerListener>& listener,
    301             int api, bool producerControlledByApp, QueueBufferOutput* output) {
    302         Parcel data, reply;
    303         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
    304         if (listener != NULL) {
    305             data.writeInt32(1);
    306             data.writeStrongBinder(IInterface::asBinder(listener));
    307         } else {
    308             data.writeInt32(0);
    309         }
    310         data.writeInt32(api);
    311         data.writeInt32(producerControlledByApp);
    312         status_t result = remote()->transact(CONNECT, data, &reply);
    313         if (result != NO_ERROR) {
    314             return result;
    315         }
    316         reply.read(*output);
    317         result = reply.readInt32();
    318         return result;
    319     }
    320 
    321     virtual status_t disconnect(int api, DisconnectMode mode) {
    322         Parcel data, reply;
    323         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
    324         data.writeInt32(api);
    325         data.writeInt32(static_cast<int32_t>(mode));
    326         status_t result =remote()->transact(DISCONNECT, data, &reply);
    327         if (result != NO_ERROR) {
    328             return result;
    329         }
    330         result = reply.readInt32();
    331         return result;
    332     }
    333 
    334     virtual status_t setSidebandStream(const sp<NativeHandle>& stream) {
    335         Parcel data, reply;
    336         status_t result;
    337         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
    338         if (stream.get()) {
    339             data.writeInt32(true);
    340             data.writeNativeHandle(stream->handle());
    341         } else {
    342             data.writeInt32(false);
    343         }
    344         if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) {
    345             result = reply.readInt32();
    346         }
    347         return result;
    348     }
    349 
    350     virtual void allocateBuffers(uint32_t width, uint32_t height,
    351             PixelFormat format, uint64_t usage) {
    352         Parcel data, reply;
    353         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
    354         data.writeUint32(width);
    355         data.writeUint32(height);
    356         data.writeInt32(static_cast<int32_t>(format));
    357         data.writeUint64(usage);
    358         status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply);
    359         if (result != NO_ERROR) {
    360             ALOGE("allocateBuffers failed to transact: %d", result);
    361         }
    362     }
    363 
    364     virtual status_t allowAllocation(bool allow) {
    365         Parcel data, reply;
    366         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
    367         data.writeInt32(static_cast<int32_t>(allow));
    368         status_t result = remote()->transact(ALLOW_ALLOCATION, data, &reply);
    369         if (result != NO_ERROR) {
    370             return result;
    371         }
    372         result = reply.readInt32();
    373         return result;
    374     }
    375 
    376     virtual status_t setGenerationNumber(uint32_t generationNumber) {
    377         Parcel data, reply;
    378         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
    379         data.writeUint32(generationNumber);
    380         status_t result = remote()->transact(SET_GENERATION_NUMBER, data, &reply);
    381         if (result == NO_ERROR) {
    382             result = reply.readInt32();
    383         }
    384         return result;
    385     }
    386 
    387     virtual String8 getConsumerName() const {
    388         Parcel data, reply;
    389         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
    390         status_t result = remote()->transact(GET_CONSUMER_NAME, data, &reply);
    391         if (result != NO_ERROR) {
    392             ALOGE("getConsumerName failed to transact: %d", result);
    393             return String8("TransactFailed");
    394         }
    395         return reply.readString8();
    396     }
    397 
    398     virtual status_t setSharedBufferMode(bool sharedBufferMode) {
    399         Parcel data, reply;
    400         data.writeInterfaceToken(
    401                 IGraphicBufferProducer::getInterfaceDescriptor());
    402         data.writeInt32(sharedBufferMode);
    403         status_t result = remote()->transact(SET_SHARED_BUFFER_MODE, data,
    404                 &reply);
    405         if (result == NO_ERROR) {
    406             result = reply.readInt32();
    407         }
    408         return result;
    409     }
    410 
    411     virtual status_t setAutoRefresh(bool autoRefresh) {
    412         Parcel data, reply;
    413         data.writeInterfaceToken(
    414                 IGraphicBufferProducer::getInterfaceDescriptor());
    415         data.writeInt32(autoRefresh);
    416         status_t result = remote()->transact(SET_AUTO_REFRESH, data, &reply);
    417         if (result == NO_ERROR) {
    418             result = reply.readInt32();
    419         }
    420         return result;
    421     }
    422 
    423     virtual status_t setDequeueTimeout(nsecs_t timeout) {
    424         Parcel data, reply;
    425         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
    426         data.writeInt64(timeout);
    427         status_t result = remote()->transact(SET_DEQUEUE_TIMEOUT, data, &reply);
    428         if (result != NO_ERROR) {
    429             ALOGE("setDequeueTimeout failed to transact: %d", result);
    430             return result;
    431         }
    432         return reply.readInt32();
    433     }
    434 
    435     virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer,
    436             sp<Fence>* outFence, float outTransformMatrix[16]) override {
    437         Parcel data, reply;
    438         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
    439         status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER, data,
    440                 &reply);
    441         if (result != NO_ERROR) {
    442             ALOGE("getLastQueuedBuffer failed to transact: %d", result);
    443             return result;
    444         }
    445         result = reply.readInt32();
    446         if (result != NO_ERROR) {
    447             return result;
    448         }
    449         bool hasBuffer = reply.readBool();
    450         sp<GraphicBuffer> buffer;
    451         if (hasBuffer) {
    452             buffer = new GraphicBuffer();
    453             result = reply.read(*buffer);
    454             if (result == NO_ERROR) {
    455                 result = reply.read(outTransformMatrix, sizeof(float) * 16);
    456             }
    457         }
    458         if (result != NO_ERROR) {
    459             ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
    460             return result;
    461         }
    462         sp<Fence> fence(new Fence);
    463         result = reply.read(*fence);
    464         if (result != NO_ERROR) {
    465             ALOGE("getLastQueuedBuffer failed to read fence: %d", result);
    466             return result;
    467         }
    468         *outBuffer = buffer;
    469         *outFence = fence;
    470         return result;
    471     }
    472 
    473     virtual void getFrameTimestamps(FrameEventHistoryDelta* outDelta) {
    474         Parcel data, reply;
    475         status_t result = data.writeInterfaceToken(
    476                 IGraphicBufferProducer::getInterfaceDescriptor());
    477         if (result != NO_ERROR) {
    478             ALOGE("IGBP::getFrameTimestamps failed to write token: %d", result);
    479             return;
    480         }
    481         result = remote()->transact(GET_FRAME_TIMESTAMPS, data, &reply);
    482         if (result != NO_ERROR) {
    483             ALOGE("IGBP::getFrameTimestamps failed to transact: %d", result);
    484             return;
    485         }
    486         result = reply.read(*outDelta);
    487         if (result != NO_ERROR) {
    488             ALOGE("IGBP::getFrameTimestamps failed to read timestamps: %d",
    489                     result);
    490         }
    491     }
    492 
    493     virtual status_t getUniqueId(uint64_t* outId) const {
    494         Parcel data, reply;
    495         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
    496         status_t result = remote()->transact(GET_UNIQUE_ID, data, &reply);
    497         if (result != NO_ERROR) {
    498             ALOGE("getUniqueId failed to transact: %d", result);
    499         }
    500         status_t actualResult = NO_ERROR;
    501         result = reply.readInt32(&actualResult);
    502         if (result != NO_ERROR) {
    503             return result;
    504         }
    505         result = reply.readUint64(outId);
    506         if (result != NO_ERROR) {
    507             return result;
    508         }
    509         return actualResult;
    510     }
    511 
    512     virtual status_t getConsumerUsage(uint64_t* outUsage) const {
    513         Parcel data, reply;
    514         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
    515         status_t result = remote()->transact(GET_CONSUMER_USAGE, data, &reply);
    516         if (result != NO_ERROR) {
    517             ALOGE("getConsumerUsage failed to transact: %d", result);
    518         }
    519         status_t actualResult = NO_ERROR;
    520         result = reply.readInt32(&actualResult);
    521         if (result != NO_ERROR) {
    522             return result;
    523         }
    524         result = reply.readUint64(outUsage);
    525         if (result != NO_ERROR) {
    526             return result;
    527         }
    528         return actualResult;
    529     }
    530 };
    531 
    532 // Out-of-line virtual method definition to trigger vtable emission in this
    533 // translation unit (see clang warning -Wweak-vtables)
    534 BpGraphicBufferProducer::~BpGraphicBufferProducer() {}
    535 
    536 class HpGraphicBufferProducer : public HpInterface<
    537         BpGraphicBufferProducer, H2BGraphicBufferProducer> {
    538 public:
    539     HpGraphicBufferProducer(const sp<IBinder>& base) : PBase(base) {}
    540 
    541     status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) override {
    542         return mBase->requestBuffer(slot, buf);
    543     }
    544 
    545     status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) override {
    546         return mBase->setMaxDequeuedBufferCount(maxDequeuedBuffers);
    547     }
    548 
    549     status_t setAsyncMode(bool async) override {
    550         return mBase->setAsyncMode(async);
    551     }
    552 
    553     status_t dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w, uint32_t h, PixelFormat format,
    554                            uint64_t usage, uint64_t* outBufferAge,
    555                            FrameEventHistoryDelta* outTimestamps) override {
    556         return mBase->dequeueBuffer(slot, fence, w, h, format, usage, outBufferAge, outTimestamps);
    557     }
    558 
    559     status_t detachBuffer(int slot) override {
    560         return mBase->detachBuffer(slot);
    561     }
    562 
    563     status_t detachNextBuffer(
    564             sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) override {
    565         return mBase->detachNextBuffer(outBuffer, outFence);
    566     }
    567 
    568     status_t attachBuffer(
    569             int* outSlot, const sp<GraphicBuffer>& buffer) override {
    570         return mBase->attachBuffer(outSlot, buffer);
    571     }
    572 
    573     status_t queueBuffer(
    574             int slot,
    575             const QueueBufferInput& input,
    576             QueueBufferOutput* output) override {
    577         return mBase->queueBuffer(slot, input, output);
    578     }
    579 
    580     status_t cancelBuffer(int slot, const sp<Fence>& fence) override {
    581         return mBase->cancelBuffer(slot, fence);
    582     }
    583 
    584     int query(int what, int* value) override {
    585         return mBase->query(what, value);
    586     }
    587 
    588     status_t connect(
    589             const sp<IProducerListener>& listener,
    590             int api, bool producerControlledByApp,
    591             QueueBufferOutput* output) override {
    592         return mBase->connect(listener, api, producerControlledByApp, output);
    593     }
    594 
    595     status_t disconnect(
    596             int api, DisconnectMode mode = DisconnectMode::Api) override {
    597         return mBase->disconnect(api, mode);
    598     }
    599 
    600     status_t setSidebandStream(const sp<NativeHandle>& stream) override {
    601         return mBase->setSidebandStream(stream);
    602     }
    603 
    604     void allocateBuffers(uint32_t width, uint32_t height,
    605             PixelFormat format, uint64_t usage) override {
    606         return mBase->allocateBuffers(width, height, format, usage);
    607     }
    608 
    609     status_t allowAllocation(bool allow) override {
    610         return mBase->allowAllocation(allow);
    611     }
    612 
    613     status_t setGenerationNumber(uint32_t generationNumber) override {
    614         return mBase->setGenerationNumber(generationNumber);
    615     }
    616 
    617     String8 getConsumerName() const override {
    618         return mBase->getConsumerName();
    619     }
    620 
    621     status_t setSharedBufferMode(bool sharedBufferMode) override {
    622         return mBase->setSharedBufferMode(sharedBufferMode);
    623     }
    624 
    625     status_t setAutoRefresh(bool autoRefresh) override {
    626         return mBase->setAutoRefresh(autoRefresh);
    627     }
    628 
    629     status_t setDequeueTimeout(nsecs_t timeout) override {
    630         return mBase->setDequeueTimeout(timeout);
    631     }
    632 
    633     status_t getLastQueuedBuffer(
    634             sp<GraphicBuffer>* outBuffer,
    635             sp<Fence>* outFence,
    636             float outTransformMatrix[16]) override {
    637         return mBase->getLastQueuedBuffer(
    638                 outBuffer, outFence, outTransformMatrix);
    639     }
    640 
    641     void getFrameTimestamps(FrameEventHistoryDelta* outDelta) override {
    642         return mBase->getFrameTimestamps(outDelta);
    643     }
    644 
    645     status_t getUniqueId(uint64_t* outId) const override {
    646         return mBase->getUniqueId(outId);
    647     }
    648 
    649     status_t getConsumerUsage(uint64_t* outUsage) const override {
    650         return mBase->getConsumerUsage(outUsage);
    651     }
    652 };
    653 
    654 IMPLEMENT_HYBRID_META_INTERFACE(GraphicBufferProducer, HGraphicBufferProducer,
    655         "android.gui.IGraphicBufferProducer");
    656 
    657 // ----------------------------------------------------------------------
    658 
    659 status_t IGraphicBufferProducer::exportToParcel(Parcel* parcel) {
    660     status_t res = OK;
    661     res = parcel->writeUint32(USE_BUFFER_QUEUE);
    662     if (res != NO_ERROR) {
    663         ALOGE("exportToParcel: Cannot write magic, res=%d.", res);
    664         return res;
    665     }
    666 
    667     return parcel->writeStrongBinder(IInterface::asBinder(this));
    668 }
    669 
    670 /* static */
    671 status_t IGraphicBufferProducer::exportToParcel(const sp<IGraphicBufferProducer>& producer,
    672                                                 Parcel* parcel) {
    673     if (parcel == nullptr) {
    674         ALOGE("exportToParcel: Invalid parcel object.");
    675         return BAD_VALUE;
    676     }
    677 
    678     if (producer == nullptr) {
    679         status_t res = OK;
    680         res = parcel->writeUint32(IGraphicBufferProducer::USE_BUFFER_QUEUE);
    681         if (res != NO_ERROR) return res;
    682         return parcel->writeStrongBinder(nullptr);
    683     } else {
    684         return producer->exportToParcel(parcel);
    685     }
    686 }
    687 
    688 /* static */
    689 sp<IGraphicBufferProducer> IGraphicBufferProducer::createFromParcel(const Parcel* parcel) {
    690     uint32_t outMagic = 0;
    691     status_t res = NO_ERROR;
    692 
    693     res = parcel->readUint32(&outMagic);
    694     if (res != NO_ERROR) {
    695         ALOGE("createFromParcel: Failed to read magic, error=%d.", res);
    696         return nullptr;
    697     }
    698 
    699     switch (outMagic) {
    700         case USE_BUFFER_QUEUE: {
    701             sp<IBinder> binder;
    702             res = parcel->readNullableStrongBinder(&binder);
    703             if (res != NO_ERROR) {
    704                 ALOGE("createFromParcel: Can't read strong binder.");
    705                 return nullptr;
    706             }
    707             return interface_cast<IGraphicBufferProducer>(binder);
    708         }
    709         case USE_BUFFER_HUB: {
    710             ALOGE("createFromParcel: BufferHub not implemented.");
    711 #ifndef NO_BUFFERHUB
    712             dvr::ProducerQueueParcelable producerParcelable;
    713             res = producerParcelable.readFromParcel(parcel);
    714             if (res != NO_ERROR) {
    715                 ALOGE("createFromParcel: Failed to read from parcel, error=%d", res);
    716                 return nullptr;
    717             }
    718             return BufferHubProducer::Create(std::move(producerParcelable));
    719 #else
    720             return nullptr;
    721 #endif
    722         }
    723         default: {
    724             ALOGE("createFromParcel: Unexpected mgaic: 0x%x.", outMagic);
    725             return nullptr;
    726         }
    727     }
    728 }
    729 
    730 // ----------------------------------------------------------------------------
    731 
    732 status_t BnGraphicBufferProducer::onTransact(
    733     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
    734 {
    735     switch(code) {
    736         case REQUEST_BUFFER: {
    737             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
    738             int bufferIdx   = data.readInt32();
    739             sp<GraphicBuffer> buffer;
    740             int result = requestBuffer(bufferIdx, &buffer);
    741             reply->writeInt32(buffer != 0);
    742             if (buffer != 0) {
    743                 reply->write(*buffer);
    744             }
    745             reply->writeInt32(result);
    746             return NO_ERROR;
    747         }
    748         case SET_MAX_DEQUEUED_BUFFER_COUNT: {
    749             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
    750             int maxDequeuedBuffers = data.readInt32();
    751             int result = setMaxDequeuedBufferCount(maxDequeuedBuffers);
    752             reply->writeInt32(result);
    753             return NO_ERROR;
    754         }
    755         case SET_ASYNC_MODE: {
    756             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
    757             bool async = data.readInt32();
    758             int result = setAsyncMode(async);
    759             reply->writeInt32(result);
    760             return NO_ERROR;
    761         }
    762         case DEQUEUE_BUFFER: {
    763             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
    764             uint32_t width = data.readUint32();
    765             uint32_t height = data.readUint32();
    766             PixelFormat format = static_cast<PixelFormat>(data.readInt32());
    767             uint64_t usage = data.readUint64();
    768             uint64_t bufferAge = 0;
    769             bool getTimestamps = data.readBool();
    770 
    771             int buf = 0;
    772             sp<Fence> fence = Fence::NO_FENCE;
    773             FrameEventHistoryDelta frameTimestamps;
    774             int result = dequeueBuffer(&buf, &fence, width, height, format, usage, &bufferAge,
    775                                        getTimestamps ? &frameTimestamps : nullptr);
    776 
    777             reply->writeInt32(buf);
    778             reply->write(*fence);
    779             reply->writeUint64(bufferAge);
    780             if (getTimestamps) {
    781                 reply->write(frameTimestamps);
    782             }
    783             reply->writeInt32(result);
    784             return NO_ERROR;
    785         }
    786         case DETACH_BUFFER: {
    787             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
    788             int slot = data.readInt32();
    789             int result = detachBuffer(slot);
    790             reply->writeInt32(result);
    791             return NO_ERROR;
    792         }
    793         case DETACH_NEXT_BUFFER: {
    794             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
    795             sp<GraphicBuffer> buffer;
    796             sp<Fence> fence;
    797             int32_t result = detachNextBuffer(&buffer, &fence);
    798             reply->writeInt32(result);
    799             if (result == NO_ERROR) {
    800                 reply->writeInt32(buffer != NULL);
    801                 if (buffer != NULL) {
    802                     reply->write(*buffer);
    803                 }
    804                 reply->writeInt32(fence != NULL);
    805                 if (fence != NULL) {
    806                     reply->write(*fence);
    807                 }
    808             }
    809             return NO_ERROR;
    810         }
    811         case ATTACH_BUFFER: {
    812             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
    813             sp<GraphicBuffer> buffer = new GraphicBuffer();
    814             status_t result = data.read(*buffer.get());
    815             int slot = 0;
    816             if (result == NO_ERROR) {
    817                 result = attachBuffer(&slot, buffer);
    818             }
    819             reply->writeInt32(slot);
    820             reply->writeInt32(result);
    821             return NO_ERROR;
    822         }
    823         case QUEUE_BUFFER: {
    824             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
    825 
    826             int buf = data.readInt32();
    827             QueueBufferInput input(data);
    828             QueueBufferOutput output;
    829             status_t result = queueBuffer(buf, input, &output);
    830             reply->write(output);
    831             reply->writeInt32(result);
    832 
    833             return NO_ERROR;
    834         }
    835         case CANCEL_BUFFER: {
    836             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
    837             int buf = data.readInt32();
    838             sp<Fence> fence = new Fence();
    839             status_t result = data.read(*fence.get());
    840             if (result == NO_ERROR) {
    841                 result = cancelBuffer(buf, fence);
    842             }
    843             reply->writeInt32(result);
    844             return NO_ERROR;
    845         }
    846         case QUERY: {
    847             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
    848             int value = 0;
    849             int what = data.readInt32();
    850             int res = query(what, &value);
    851             reply->writeInt32(value);
    852             reply->writeInt32(res);
    853             return NO_ERROR;
    854         }
    855         case CONNECT: {
    856             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
    857             sp<IProducerListener> listener;
    858             if (data.readInt32() == 1) {
    859                 listener = IProducerListener::asInterface(data.readStrongBinder());
    860             }
    861             int api = data.readInt32();
    862             bool producerControlledByApp = data.readInt32();
    863             QueueBufferOutput output;
    864             status_t res = connect(listener, api, producerControlledByApp, &output);
    865             reply->write(output);
    866             reply->writeInt32(res);
    867             return NO_ERROR;
    868         }
    869         case DISCONNECT: {
    870             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
    871             int api = data.readInt32();
    872             DisconnectMode mode = static_cast<DisconnectMode>(data.readInt32());
    873             status_t res = disconnect(api, mode);
    874             reply->writeInt32(res);
    875             return NO_ERROR;
    876         }
    877         case SET_SIDEBAND_STREAM: {
    878             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
    879             sp<NativeHandle> stream;
    880             if (data.readInt32()) {
    881                 stream = NativeHandle::create(data.readNativeHandle(), true);
    882             }
    883             status_t result = setSidebandStream(stream);
    884             reply->writeInt32(result);
    885             return NO_ERROR;
    886         }
    887         case ALLOCATE_BUFFERS: {
    888             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
    889             uint32_t width = data.readUint32();
    890             uint32_t height = data.readUint32();
    891             PixelFormat format = static_cast<PixelFormat>(data.readInt32());
    892             uint64_t usage = data.readUint64();
    893             allocateBuffers(width, height, format, usage);
    894             return NO_ERROR;
    895         }
    896         case ALLOW_ALLOCATION: {
    897             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
    898             bool allow = static_cast<bool>(data.readInt32());
    899             status_t result = allowAllocation(allow);
    900             reply->writeInt32(result);
    901             return NO_ERROR;
    902         }
    903         case SET_GENERATION_NUMBER: {
    904             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
    905             uint32_t generationNumber = data.readUint32();
    906             status_t result = setGenerationNumber(generationNumber);
    907             reply->writeInt32(result);
    908             return NO_ERROR;
    909         }
    910         case GET_CONSUMER_NAME: {
    911             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
    912             reply->writeString8(getConsumerName());
    913             return NO_ERROR;
    914         }
    915         case SET_SHARED_BUFFER_MODE: {
    916             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
    917             bool sharedBufferMode = data.readInt32();
    918             status_t result = setSharedBufferMode(sharedBufferMode);
    919             reply->writeInt32(result);
    920             return NO_ERROR;
    921         }
    922         case SET_AUTO_REFRESH: {
    923             CHECK_INTERFACE(IGraphicBuffer, data, reply);
    924             bool autoRefresh = data.readInt32();
    925             status_t result = setAutoRefresh(autoRefresh);
    926             reply->writeInt32(result);
    927             return NO_ERROR;
    928         }
    929         case SET_DEQUEUE_TIMEOUT: {
    930             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
    931             nsecs_t timeout = data.readInt64();
    932             status_t result = setDequeueTimeout(timeout);
    933             reply->writeInt32(result);
    934             return NO_ERROR;
    935         }
    936         case GET_LAST_QUEUED_BUFFER: {
    937             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
    938             sp<GraphicBuffer> buffer(nullptr);
    939             sp<Fence> fence(Fence::NO_FENCE);
    940             float transform[16] = {};
    941             status_t result = getLastQueuedBuffer(&buffer, &fence, transform);
    942             reply->writeInt32(result);
    943             if (result != NO_ERROR) {
    944                 return result;
    945             }
    946             if (!buffer.get()) {
    947                 reply->writeBool(false);
    948             } else {
    949                 reply->writeBool(true);
    950                 result = reply->write(*buffer);
    951                 if (result == NO_ERROR) {
    952                     reply->write(transform, sizeof(float) * 16);
    953                 }
    954             }
    955             if (result != NO_ERROR) {
    956                 ALOGE("getLastQueuedBuffer failed to write buffer: %d", result);
    957                 return result;
    958             }
    959             result = reply->write(*fence);
    960             if (result != NO_ERROR) {
    961                 ALOGE("getLastQueuedBuffer failed to write fence: %d", result);
    962                 return result;
    963             }
    964             return NO_ERROR;
    965         }
    966         case GET_FRAME_TIMESTAMPS: {
    967             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
    968             FrameEventHistoryDelta frameTimestamps;
    969             getFrameTimestamps(&frameTimestamps);
    970             status_t result = reply->write(frameTimestamps);
    971             if (result != NO_ERROR) {
    972                 ALOGE("BnGBP::GET_FRAME_TIMESTAMPS failed to write buffer: %d",
    973                         result);
    974                 return result;
    975             }
    976             return NO_ERROR;
    977         }
    978         case GET_UNIQUE_ID: {
    979             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
    980             uint64_t outId = 0;
    981             status_t actualResult = getUniqueId(&outId);
    982             status_t result = reply->writeInt32(actualResult);
    983             if (result != NO_ERROR) {
    984                 return result;
    985             }
    986             result = reply->writeUint64(outId);
    987             if (result != NO_ERROR) {
    988                 return result;
    989             }
    990             return NO_ERROR;
    991         }
    992         case GET_CONSUMER_USAGE: {
    993             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
    994             uint64_t outUsage = 0;
    995             status_t actualResult = getConsumerUsage(&outUsage);
    996             status_t result = reply->writeInt32(actualResult);
    997             if (result != NO_ERROR) {
    998                 return result;
    999             }
   1000             result = reply->writeUint64(outUsage);
   1001             if (result != NO_ERROR) {
   1002                 return result;
   1003             }
   1004             return NO_ERROR;
   1005         }
   1006     }
   1007     return BBinder::onTransact(code, data, reply, flags);
   1008 }
   1009 
   1010 // ----------------------------------------------------------------------------
   1011 
   1012 IGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) {
   1013     parcel.read(*this);
   1014 }
   1015 
   1016 constexpr size_t IGraphicBufferProducer::QueueBufferInput::minFlattenedSize() {
   1017     return sizeof(timestamp) +
   1018             sizeof(isAutoTimestamp) +
   1019             sizeof(dataSpace) +
   1020             sizeof(crop) +
   1021             sizeof(scalingMode) +
   1022             sizeof(transform) +
   1023             sizeof(stickyTransform) +
   1024             sizeof(getFrameTimestamps);
   1025 }
   1026 
   1027 size_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const {
   1028     return minFlattenedSize() +
   1029             fence->getFlattenedSize() +
   1030             surfaceDamage.getFlattenedSize() +
   1031             hdrMetadata.getFlattenedSize();
   1032 }
   1033 
   1034 size_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const {
   1035     return fence->getFdCount();
   1036 }
   1037 
   1038 status_t IGraphicBufferProducer::QueueBufferInput::flatten(
   1039         void*& buffer, size_t& size, int*& fds, size_t& count) const
   1040 {
   1041     if (size < getFlattenedSize()) {
   1042         return NO_MEMORY;
   1043     }
   1044 
   1045     FlattenableUtils::write(buffer, size, timestamp);
   1046     FlattenableUtils::write(buffer, size, isAutoTimestamp);
   1047     FlattenableUtils::write(buffer, size, dataSpace);
   1048     FlattenableUtils::write(buffer, size, crop);
   1049     FlattenableUtils::write(buffer, size, scalingMode);
   1050     FlattenableUtils::write(buffer, size, transform);
   1051     FlattenableUtils::write(buffer, size, stickyTransform);
   1052     FlattenableUtils::write(buffer, size, getFrameTimestamps);
   1053 
   1054     status_t result = fence->flatten(buffer, size, fds, count);
   1055     if (result != NO_ERROR) {
   1056         return result;
   1057     }
   1058     result = surfaceDamage.flatten(buffer, size);
   1059     if (result != NO_ERROR) {
   1060         return result;
   1061     }
   1062     FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize());
   1063     return hdrMetadata.flatten(buffer, size);
   1064 }
   1065 
   1066 status_t IGraphicBufferProducer::QueueBufferInput::unflatten(
   1067         void const*& buffer, size_t& size, int const*& fds, size_t& count)
   1068 {
   1069     if (size < minFlattenedSize()) {
   1070         return NO_MEMORY;
   1071     }
   1072 
   1073     FlattenableUtils::read(buffer, size, timestamp);
   1074     FlattenableUtils::read(buffer, size, isAutoTimestamp);
   1075     FlattenableUtils::read(buffer, size, dataSpace);
   1076     FlattenableUtils::read(buffer, size, crop);
   1077     FlattenableUtils::read(buffer, size, scalingMode);
   1078     FlattenableUtils::read(buffer, size, transform);
   1079     FlattenableUtils::read(buffer, size, stickyTransform);
   1080     FlattenableUtils::read(buffer, size, getFrameTimestamps);
   1081 
   1082     fence = new Fence();
   1083     status_t result = fence->unflatten(buffer, size, fds, count);
   1084     if (result != NO_ERROR) {
   1085         return result;
   1086     }
   1087     result = surfaceDamage.unflatten(buffer, size);
   1088     if (result != NO_ERROR) {
   1089         return result;
   1090     }
   1091     FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize());
   1092     return hdrMetadata.unflatten(buffer, size);
   1093 }
   1094 
   1095 // ----------------------------------------------------------------------------
   1096 constexpr size_t IGraphicBufferProducer::QueueBufferOutput::minFlattenedSize() {
   1097     return sizeof(width) +
   1098             sizeof(height) +
   1099             sizeof(transformHint) +
   1100             sizeof(numPendingBuffers) +
   1101             sizeof(nextFrameNumber) +
   1102             sizeof(bufferReplaced);
   1103 }
   1104 
   1105 size_t IGraphicBufferProducer::QueueBufferOutput::getFlattenedSize() const {
   1106     return minFlattenedSize() + frameTimestamps.getFlattenedSize();
   1107 }
   1108 
   1109 size_t IGraphicBufferProducer::QueueBufferOutput::getFdCount() const {
   1110     return frameTimestamps.getFdCount();
   1111 }
   1112 
   1113 status_t IGraphicBufferProducer::QueueBufferOutput::flatten(
   1114         void*& buffer, size_t& size, int*& fds, size_t& count) const
   1115 {
   1116     if (size < getFlattenedSize()) {
   1117         return NO_MEMORY;
   1118     }
   1119 
   1120     FlattenableUtils::write(buffer, size, width);
   1121     FlattenableUtils::write(buffer, size, height);
   1122     FlattenableUtils::write(buffer, size, transformHint);
   1123     FlattenableUtils::write(buffer, size, numPendingBuffers);
   1124     FlattenableUtils::write(buffer, size, nextFrameNumber);
   1125     FlattenableUtils::write(buffer, size, bufferReplaced);
   1126 
   1127     return frameTimestamps.flatten(buffer, size, fds, count);
   1128 }
   1129 
   1130 status_t IGraphicBufferProducer::QueueBufferOutput::unflatten(
   1131         void const*& buffer, size_t& size, int const*& fds, size_t& count)
   1132 {
   1133     if (size < minFlattenedSize()) {
   1134         return NO_MEMORY;
   1135     }
   1136 
   1137     FlattenableUtils::read(buffer, size, width);
   1138     FlattenableUtils::read(buffer, size, height);
   1139     FlattenableUtils::read(buffer, size, transformHint);
   1140     FlattenableUtils::read(buffer, size, numPendingBuffers);
   1141     FlattenableUtils::read(buffer, size, nextFrameNumber);
   1142     FlattenableUtils::read(buffer, size, bufferReplaced);
   1143 
   1144     return frameTimestamps.unflatten(buffer, size, fds, count);
   1145 }
   1146 
   1147 }; // namespace android
   1148