OSDN Git Service

Merge tag 'android-8.1.0_r74' into oreo-x86
[android-x86/frameworks-native.git] / libs / gui / IGraphicBufferProducer.cpp
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