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