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