• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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     SET_AUTO_PREROTATION,
77     REQUEST_BUFFERS,
78     DEQUEUE_BUFFERS,
79     DETACH_BUFFERS,
80     ATTACH_BUFFERS,
81     QUEUE_BUFFERS,
82     CANCEL_BUFFERS,
83     QUERY_MULTIPLE,
84     GET_LAST_QUEUED_BUFFER2,
85 };
86 
87 class BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer>
88 {
89 public:
BpGraphicBufferProducer(const sp<IBinder> & impl)90     explicit BpGraphicBufferProducer(const sp<IBinder>& impl)
91         : BpInterface<IGraphicBufferProducer>(impl)
92     {
93     }
94 
95     ~BpGraphicBufferProducer() override;
96 
requestBuffer(int bufferIdx,sp<GraphicBuffer> * buf)97     virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) {
98         Parcel data, reply;
99         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
100         data.writeInt32(bufferIdx);
101         status_t result = remote()->transact(REQUEST_BUFFER, data, &reply);
102         if (result != NO_ERROR) {
103             return result;
104         }
105         bool nonNull = reply.readInt32();
106         if (nonNull) {
107             *buf = new GraphicBuffer();
108             result = reply.read(**buf);
109             if(result != NO_ERROR) {
110                 (*buf).clear();
111                 return result;
112             }
113         }
114         result = reply.readInt32();
115         return result;
116     }
117 
requestBuffers(const std::vector<int32_t> & slots,std::vector<RequestBufferOutput> * outputs)118     virtual status_t requestBuffers(
119             const std::vector<int32_t>& slots,
120             std::vector<RequestBufferOutput>* outputs) override {
121         Parcel data, reply;
122         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
123         data.writeInt32Vector(slots);
124         status_t result = remote()->transact(REQUEST_BUFFERS, data, &reply);
125         if (result != NO_ERROR) {
126             return result;
127         }
128         result = reply.resizeOutVector(outputs);
129         for (RequestBufferOutput& output : *outputs) {
130             if (result != NO_ERROR) {
131                 return result;
132             }
133             result = reply.read(output);
134         }
135 
136         return result;
137     }
138 
setMaxDequeuedBufferCount(int maxDequeuedBuffers)139     virtual status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) {
140         Parcel data, reply;
141         data.writeInterfaceToken(
142                 IGraphicBufferProducer::getInterfaceDescriptor());
143         data.writeInt32(maxDequeuedBuffers);
144         status_t result = remote()->transact(SET_MAX_DEQUEUED_BUFFER_COUNT,
145                 data, &reply);
146         if (result != NO_ERROR) {
147             return result;
148         }
149         result = reply.readInt32();
150         return result;
151     }
152 
setAsyncMode(bool async)153     virtual status_t setAsyncMode(bool async) {
154         Parcel data, reply;
155         data.writeInterfaceToken(
156                 IGraphicBufferProducer::getInterfaceDescriptor());
157         data.writeInt32(async);
158         status_t result = remote()->transact(SET_ASYNC_MODE,
159                 data, &reply);
160         if (result != NO_ERROR) {
161             return result;
162         }
163         result = reply.readInt32();
164         return result;
165     }
166 
dequeueBuffer(int * buf,sp<Fence> * fence,uint32_t width,uint32_t height,PixelFormat format,uint64_t usage,uint64_t * outBufferAge,FrameEventHistoryDelta * outTimestamps)167     virtual status_t dequeueBuffer(int* buf, sp<Fence>* fence, uint32_t width, uint32_t height,
168                                    PixelFormat format, uint64_t usage, uint64_t* outBufferAge,
169                                    FrameEventHistoryDelta* outTimestamps) {
170         Parcel data, reply;
171         bool getFrameTimestamps = (outTimestamps != nullptr);
172 
173         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
174         data.writeUint32(width);
175         data.writeUint32(height);
176         data.writeInt32(static_cast<int32_t>(format));
177         data.writeUint64(usage);
178         data.writeBool(getFrameTimestamps);
179 
180         status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply);
181         if (result != NO_ERROR) {
182             return result;
183         }
184 
185         *buf = reply.readInt32();
186         *fence = new Fence();
187         result = reply.read(**fence);
188         if (result != NO_ERROR) {
189             fence->clear();
190             return result;
191         }
192         if (outBufferAge) {
193             result = reply.readUint64(outBufferAge);
194         } else {
195             // Read the value even if outBufferAge is nullptr:
196             uint64_t bufferAge;
197             result = reply.readUint64(&bufferAge);
198         }
199         if (result != NO_ERROR) {
200             ALOGE("IGBP::dequeueBuffer failed to read buffer age: %d", result);
201             return result;
202         }
203         if (getFrameTimestamps) {
204             result = reply.read(*outTimestamps);
205             if (result != NO_ERROR) {
206                 ALOGE("IGBP::dequeueBuffer failed to read timestamps: %d",
207                         result);
208                 return result;
209             }
210         }
211         result = reply.readInt32();
212         return result;
213     }
214 
dequeueBuffers(const std::vector<DequeueBufferInput> & inputs,std::vector<DequeueBufferOutput> * outputs)215     virtual status_t dequeueBuffers(
216             const std::vector<DequeueBufferInput>& inputs,
217             std::vector<DequeueBufferOutput>* outputs) {
218         Parcel data, reply;
219         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
220         data.writeVectorSize(inputs);
221         for (const auto& input : inputs) {
222             data.write(input);
223         }
224         status_t result = remote()->transact(DEQUEUE_BUFFERS, data, &reply);
225         if (result != NO_ERROR) {
226             return result;
227         }
228         result = reply.resizeOutVector(outputs);
229         for (auto& output : *outputs) {
230             if (result != NO_ERROR) {
231                 return result;
232             }
233             result = reply.read(output);
234         }
235         return result;
236     }
237 
detachBuffer(int slot)238     virtual status_t detachBuffer(int slot) {
239         Parcel data, reply;
240         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
241         data.writeInt32(slot);
242         status_t result = remote()->transact(DETACH_BUFFER, data, &reply);
243         if (result != NO_ERROR) {
244             return result;
245         }
246         result = reply.readInt32();
247         return result;
248     }
249 
detachBuffers(const std::vector<int32_t> & slots,std::vector<status_t> * results)250     virtual status_t detachBuffers(const std::vector<int32_t>& slots,
251                                    std::vector<status_t>* results) {
252         Parcel data, reply;
253         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
254         data.writeInt32Vector(slots);
255         status_t result = remote()->transact(DETACH_BUFFERS, data, &reply);
256         if (result != NO_ERROR) {
257             return result;
258         }
259         result = reply.readInt32Vector(results);
260         return result;
261     }
262 
detachNextBuffer(sp<GraphicBuffer> * outBuffer,sp<Fence> * outFence)263     virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer,
264             sp<Fence>* outFence) {
265         if (outBuffer == nullptr) {
266             ALOGE("detachNextBuffer: outBuffer must not be NULL");
267             return BAD_VALUE;
268         } else if (outFence == nullptr) {
269             ALOGE("detachNextBuffer: outFence must not be NULL");
270             return BAD_VALUE;
271         }
272         Parcel data, reply;
273         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
274         status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply);
275         if (result != NO_ERROR) {
276             return result;
277         }
278         result = reply.readInt32();
279         if (result == NO_ERROR) {
280             bool nonNull = reply.readInt32();
281             if (nonNull) {
282                 *outBuffer = new GraphicBuffer;
283                 result = reply.read(**outBuffer);
284                 if (result != NO_ERROR) {
285                     outBuffer->clear();
286                     return result;
287                 }
288             }
289             nonNull = reply.readInt32();
290             if (nonNull) {
291                 *outFence = new Fence;
292                 result = reply.read(**outFence);
293                 if (result != NO_ERROR) {
294                     outBuffer->clear();
295                     outFence->clear();
296                     return result;
297                 }
298             }
299         }
300         return result;
301     }
302 
attachBuffer(int * slot,const sp<GraphicBuffer> & buffer)303     virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) {
304         Parcel data, reply;
305         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
306         data.write(*buffer.get());
307         status_t result = remote()->transact(ATTACH_BUFFER, data, &reply);
308         if (result != NO_ERROR) {
309             return result;
310         }
311 
312         *slot = reply.readInt32();
313         result = reply.readInt32();
314         if (result == NO_ERROR &&
315                 (*slot < 0 || *slot >= BufferQueueDefs::NUM_BUFFER_SLOTS)) {
316             ALOGE("attachBuffer returned invalid slot %d", *slot);
317             android_errorWriteLog(0x534e4554, "37478824");
318             return UNKNOWN_ERROR;
319         }
320 
321         return result;
322     }
323 
attachBuffers(const std::vector<sp<GraphicBuffer>> & buffers,std::vector<AttachBufferOutput> * outputs)324     virtual status_t attachBuffers(
325             const std::vector<sp<GraphicBuffer>>& buffers,
326             std::vector<AttachBufferOutput>* outputs) {
327         Parcel data, reply;
328         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
329         data.writeVectorSize(buffers);
330         for (const sp<GraphicBuffer>& buffer : buffers) {
331             data.write(*buffer.get());
332         }
333         status_t result = remote()->transact(ATTACH_BUFFERS, data, &reply);
334         if (result != NO_ERROR) {
335             return result;
336         }
337         result = reply.resizeOutVector(outputs);
338         for (AttachBufferOutput& output : *outputs) {
339             if (result != NO_ERROR) {
340                 return result;
341             }
342             result = reply.read(output);
343         }
344         if (result == NO_ERROR) {
345             for (AttachBufferOutput& output : *outputs) {
346                 if (output.result == NO_ERROR && output.slot < 0) {
347                     ALOGE("attachBuffers returned invalid slot %d",
348                           output.slot);
349                     android_errorWriteLog(0x534e4554, "37478824");
350                     output.result = UNKNOWN_ERROR;
351                 }
352             }
353         }
354         return result;
355     }
356 
queueBuffer(int buf,const QueueBufferInput & input,QueueBufferOutput * output)357     virtual status_t queueBuffer(int buf,
358             const QueueBufferInput& input, QueueBufferOutput* output) {
359         Parcel data, reply;
360 
361         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
362         data.writeInt32(buf);
363         data.write(input);
364 
365         status_t result = remote()->transact(QUEUE_BUFFER, data, &reply);
366         if (result != NO_ERROR) {
367             return result;
368         }
369 
370         result = reply.read(*output);
371         if (result != NO_ERROR) {
372             return result;
373         }
374 
375         result = reply.readInt32();
376         return result;
377     }
378 
queueBuffers(const std::vector<QueueBufferInput> & inputs,std::vector<QueueBufferOutput> * outputs)379     virtual status_t queueBuffers(const std::vector<QueueBufferInput>& inputs,
380                                   std::vector<QueueBufferOutput>* outputs) {
381         Parcel data, reply;
382         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
383         data.writeVectorSize(inputs);
384         for (const QueueBufferInput& input : inputs) {
385             data.write(input);
386         }
387         status_t result = remote()->transact(QUEUE_BUFFERS, data, &reply);
388         if (result != NO_ERROR) {
389             return result;
390         }
391         result = reply.resizeOutVector(outputs);
392         for (QueueBufferOutput& output : *outputs) {
393             if (result != NO_ERROR) {
394                 return result;
395             }
396             result = reply.read(output);
397         }
398         return result;
399     }
400 
cancelBuffer(int buf,const sp<Fence> & fence)401     virtual status_t cancelBuffer(int buf, const sp<Fence>& fence) {
402         Parcel data, reply;
403         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
404         data.writeInt32(buf);
405         data.write(*fence.get());
406         status_t result = remote()->transact(CANCEL_BUFFER, data, &reply);
407         if (result != NO_ERROR) {
408             return result;
409         }
410         result = reply.readInt32();
411         return result;
412     }
413 
cancelBuffers(const std::vector<CancelBufferInput> & inputs,std::vector<status_t> * results)414     virtual status_t cancelBuffers(
415             const std::vector<CancelBufferInput>& inputs,
416             std::vector<status_t>* results) {
417         Parcel data, reply;
418         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
419         data.writeVectorSize(inputs);
420         for (const CancelBufferInput& input : inputs) {
421             data.write(input);
422         }
423         status_t result = remote()->transact(CANCEL_BUFFERS, data, &reply);
424         if (result != NO_ERROR) {
425             return result;
426         }
427         result = reply.readInt32Vector(results);
428         return result;
429     }
430 
query(int what,int * value)431     virtual int query(int what, int* value) {
432         Parcel data, reply;
433         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
434         data.writeInt32(what);
435         status_t result = remote()->transact(QUERY, data, &reply);
436         if (result != NO_ERROR) {
437             return result;
438         }
439         value[0] = reply.readInt32();
440         result = reply.readInt32();
441         return result;
442     }
443 
query(const std::vector<int32_t> inputs,std::vector<QueryOutput> * outputs)444     virtual status_t query(const std::vector<int32_t> inputs,
445                            std::vector<QueryOutput>* outputs) {
446         Parcel data, reply;
447         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
448         data.writeInt32Vector(inputs);
449         status_t result = remote()->transact(QUERY_MULTIPLE, data, &reply);
450         if (result != NO_ERROR) {
451             return result;
452         }
453         result = reply.resizeOutVector(outputs);
454         for (QueryOutput& output : *outputs) {
455             if (result != NO_ERROR) {
456                 return result;
457             }
458             result = reply.read(output);
459         }
460         return result;
461     }
462 
connect(const sp<IProducerListener> & listener,int api,bool producerControlledByApp,QueueBufferOutput * output)463     virtual status_t connect(const sp<IProducerListener>& listener,
464             int api, bool producerControlledByApp, QueueBufferOutput* output) {
465         Parcel data, reply;
466         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
467         if (listener != nullptr) {
468             data.writeInt32(1);
469             data.writeStrongBinder(IInterface::asBinder(listener));
470         } else {
471             data.writeInt32(0);
472         }
473         data.writeInt32(api);
474         data.writeInt32(producerControlledByApp);
475         status_t result = remote()->transact(CONNECT, data, &reply);
476         if (result != NO_ERROR) {
477             return result;
478         }
479         reply.read(*output);
480         result = reply.readInt32();
481         return result;
482     }
483 
disconnect(int api,DisconnectMode mode)484     virtual status_t disconnect(int api, DisconnectMode mode) {
485         Parcel data, reply;
486         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
487         data.writeInt32(api);
488         data.writeInt32(static_cast<int32_t>(mode));
489         status_t result =remote()->transact(DISCONNECT, data, &reply);
490         if (result != NO_ERROR) {
491             return result;
492         }
493         result = reply.readInt32();
494         return result;
495     }
496 
setSidebandStream(const sp<NativeHandle> & stream)497     virtual status_t setSidebandStream(const sp<NativeHandle>& stream) {
498         Parcel data, reply;
499         status_t result;
500         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
501         if (stream.get()) {
502             data.writeInt32(true);
503             data.writeNativeHandle(stream->handle());
504         } else {
505             data.writeInt32(false);
506         }
507         if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) {
508             result = reply.readInt32();
509         }
510         return result;
511     }
512 
allocateBuffers(uint32_t width,uint32_t height,PixelFormat format,uint64_t usage)513     virtual void allocateBuffers(uint32_t width, uint32_t height,
514             PixelFormat format, uint64_t usage) {
515         Parcel data, reply;
516         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
517         data.writeUint32(width);
518         data.writeUint32(height);
519         data.writeInt32(static_cast<int32_t>(format));
520         data.writeUint64(usage);
521         status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply, IBinder::FLAG_ONEWAY);
522         if (result != NO_ERROR) {
523             ALOGE("allocateBuffers failed to transact: %d", result);
524         }
525     }
526 
allowAllocation(bool allow)527     virtual status_t allowAllocation(bool allow) {
528         Parcel data, reply;
529         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
530         data.writeInt32(static_cast<int32_t>(allow));
531         status_t result = remote()->transact(ALLOW_ALLOCATION, data, &reply);
532         if (result != NO_ERROR) {
533             return result;
534         }
535         result = reply.readInt32();
536         return result;
537     }
538 
setGenerationNumber(uint32_t generationNumber)539     virtual status_t setGenerationNumber(uint32_t generationNumber) {
540         Parcel data, reply;
541         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
542         data.writeUint32(generationNumber);
543         status_t result = remote()->transact(SET_GENERATION_NUMBER, data, &reply);
544         if (result == NO_ERROR) {
545             result = reply.readInt32();
546         }
547         return result;
548     }
549 
getConsumerName() const550     virtual String8 getConsumerName() const {
551         Parcel data, reply;
552         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
553         status_t result = remote()->transact(GET_CONSUMER_NAME, data, &reply);
554         if (result != NO_ERROR) {
555             ALOGE("getConsumerName failed to transact: %d", result);
556             return String8("TransactFailed");
557         }
558         return reply.readString8();
559     }
560 
setSharedBufferMode(bool sharedBufferMode)561     virtual status_t setSharedBufferMode(bool sharedBufferMode) {
562         Parcel data, reply;
563         data.writeInterfaceToken(
564                 IGraphicBufferProducer::getInterfaceDescriptor());
565         data.writeInt32(sharedBufferMode);
566         status_t result = remote()->transact(SET_SHARED_BUFFER_MODE, data,
567                 &reply);
568         if (result == NO_ERROR) {
569             result = reply.readInt32();
570         }
571         return result;
572     }
573 
setAutoRefresh(bool autoRefresh)574     virtual status_t setAutoRefresh(bool autoRefresh) {
575         Parcel data, reply;
576         data.writeInterfaceToken(
577                 IGraphicBufferProducer::getInterfaceDescriptor());
578         data.writeInt32(autoRefresh);
579         status_t result = remote()->transact(SET_AUTO_REFRESH, data, &reply);
580         if (result == NO_ERROR) {
581             result = reply.readInt32();
582         }
583         return result;
584     }
585 
setDequeueTimeout(nsecs_t timeout)586     virtual status_t setDequeueTimeout(nsecs_t timeout) {
587         Parcel data, reply;
588         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
589         data.writeInt64(timeout);
590         status_t result = remote()->transact(SET_DEQUEUE_TIMEOUT, data, &reply);
591         if (result != NO_ERROR) {
592             ALOGE("setDequeueTimeout failed to transact: %d", result);
593             return result;
594         }
595         return reply.readInt32();
596     }
597 
setLegacyBufferDrop(bool drop)598     virtual status_t setLegacyBufferDrop(bool drop) {
599         Parcel data, reply;
600         data.writeInterfaceToken(
601                 IGraphicBufferProducer::getInterfaceDescriptor());
602         data.writeInt32(drop);
603         status_t result = remote()->transact(SET_LEGACY_BUFFER_DROP,
604                 data, &reply);
605         if (result != NO_ERROR) {
606             return result;
607         }
608         result = reply.readInt32();
609         return result;
610     }
611 
getLastQueuedBuffer(sp<GraphicBuffer> * outBuffer,sp<Fence> * outFence,float outTransformMatrix[16])612     virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer,
613             sp<Fence>* outFence, float outTransformMatrix[16]) override {
614         Parcel data, reply;
615         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
616         status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER, data,
617                 &reply);
618         if (result != NO_ERROR) {
619             ALOGE("getLastQueuedBuffer failed to transact: %d", result);
620             return result;
621         }
622         result = reply.readInt32();
623         if (result != NO_ERROR) {
624             return result;
625         }
626         bool hasBuffer = reply.readBool();
627         sp<GraphicBuffer> buffer;
628         if (hasBuffer) {
629             buffer = new GraphicBuffer();
630             result = reply.read(*buffer);
631             if (result == NO_ERROR) {
632                 result = reply.read(outTransformMatrix, sizeof(float) * 16);
633             }
634         }
635         if (result != NO_ERROR) {
636             ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
637             return result;
638         }
639         sp<Fence> fence(new Fence);
640         result = reply.read(*fence);
641         if (result != NO_ERROR) {
642             ALOGE("getLastQueuedBuffer failed to read fence: %d", result);
643             return result;
644         }
645         *outBuffer = buffer;
646         *outFence = fence;
647         return result;
648     }
649 
getLastQueuedBuffer(sp<GraphicBuffer> * outBuffer,sp<Fence> * outFence,Rect * outRect,uint32_t * outTransform)650     virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence,
651                                          Rect* outRect, uint32_t* outTransform) override {
652         Parcel data, reply;
653         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
654         status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER2, data, &reply);
655         if (result != NO_ERROR) {
656             ALOGE("getLastQueuedBuffer failed to transact: %d", result);
657             return result;
658         }
659         status_t remoteError = NO_ERROR;
660         result = reply.readInt32(&remoteError);
661         if (result != NO_ERROR) {
662             ALOGE("getLastQueuedBuffer failed to read status: %d", result);
663             return result;
664         }
665         if (remoteError != NO_ERROR) {
666             return remoteError;
667         }
668         bool hasBuffer = false;
669         result = reply.readBool(&hasBuffer);
670         if (result != NO_ERROR) {
671             ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
672             return result;
673         }
674         sp<GraphicBuffer> buffer;
675         if (hasBuffer) {
676             buffer = new GraphicBuffer();
677             result = reply.read(*buffer);
678             if (result == NO_ERROR) {
679                 result = reply.read(*outRect);
680             }
681             if (result == NO_ERROR) {
682                 result = reply.readUint32(outTransform);
683             }
684         }
685         if (result != NO_ERROR) {
686             ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
687             return result;
688         }
689         sp<Fence> fence(new Fence);
690         result = reply.read(*fence);
691         if (result != NO_ERROR) {
692             ALOGE("getLastQueuedBuffer failed to read fence: %d", result);
693             return result;
694         }
695         *outBuffer = buffer;
696         *outFence = fence;
697         return result;
698     }
699 
getFrameTimestamps(FrameEventHistoryDelta * outDelta)700     virtual void getFrameTimestamps(FrameEventHistoryDelta* outDelta) {
701         Parcel data, reply;
702         status_t result = data.writeInterfaceToken(
703                 IGraphicBufferProducer::getInterfaceDescriptor());
704         if (result != NO_ERROR) {
705             ALOGE("IGBP::getFrameTimestamps failed to write token: %d", result);
706             return;
707         }
708         result = remote()->transact(GET_FRAME_TIMESTAMPS, data, &reply);
709         if (result != NO_ERROR) {
710             ALOGE("IGBP::getFrameTimestamps failed to transact: %d", result);
711             return;
712         }
713         result = reply.read(*outDelta);
714         if (result != NO_ERROR) {
715             ALOGE("IGBP::getFrameTimestamps failed to read timestamps: %d",
716                     result);
717         }
718     }
719 
getUniqueId(uint64_t * outId) const720     virtual status_t getUniqueId(uint64_t* outId) const {
721         Parcel data, reply;
722         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
723         status_t result = remote()->transact(GET_UNIQUE_ID, data, &reply);
724         if (result != NO_ERROR) {
725             ALOGE("getUniqueId failed to transact: %d", result);
726         }
727         status_t actualResult = NO_ERROR;
728         result = reply.readInt32(&actualResult);
729         if (result != NO_ERROR) {
730             return result;
731         }
732         result = reply.readUint64(outId);
733         if (result != NO_ERROR) {
734             return result;
735         }
736         return actualResult;
737     }
738 
getConsumerUsage(uint64_t * outUsage) const739     virtual status_t getConsumerUsage(uint64_t* outUsage) const {
740         Parcel data, reply;
741         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
742         status_t result = remote()->transact(GET_CONSUMER_USAGE, data, &reply);
743         if (result != NO_ERROR) {
744             ALOGE("getConsumerUsage failed to transact: %d", result);
745         }
746         status_t actualResult = NO_ERROR;
747         result = reply.readInt32(&actualResult);
748         if (result != NO_ERROR) {
749             return result;
750         }
751         result = reply.readUint64(outUsage);
752         if (result != NO_ERROR) {
753             return result;
754         }
755         return actualResult;
756     }
757 
setAutoPrerotation(bool autoPrerotation)758     virtual status_t setAutoPrerotation(bool autoPrerotation) {
759         Parcel data, reply;
760         data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
761         data.writeBool(autoPrerotation);
762         status_t result = remote()->transact(SET_AUTO_PREROTATION, data, &reply);
763         if (result == NO_ERROR) {
764             result = reply.readInt32();
765         }
766         return result;
767     }
768 };
769 
770 // Out-of-line virtual method definition to trigger vtable emission in this
771 // translation unit (see clang warning -Wweak-vtables)
~BpGraphicBufferProducer()772 BpGraphicBufferProducer::~BpGraphicBufferProducer() {}
773 
774 class HpGraphicBufferProducer : public HpInterface<
775         BpGraphicBufferProducer,
776         H2BGraphicBufferProducerV1_0,
777         H2BGraphicBufferProducerV2_0> {
778 public:
HpGraphicBufferProducer(const sp<IBinder> & base)779     explicit HpGraphicBufferProducer(const sp<IBinder>& base) : PBase(base) {}
780 
requestBuffer(int slot,sp<GraphicBuffer> * buf)781     status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) override {
782         return mBase->requestBuffer(slot, buf);
783     }
784 
requestBuffers(const std::vector<int32_t> & slots,std::vector<RequestBufferOutput> * outputs)785     status_t requestBuffers(
786             const std::vector<int32_t>& slots,
787             std::vector<RequestBufferOutput>* outputs) override {
788         return mBase->requestBuffers(slots, outputs);
789     }
790 
setMaxDequeuedBufferCount(int maxDequeuedBuffers)791     status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) override {
792         return mBase->setMaxDequeuedBufferCount(maxDequeuedBuffers);
793     }
794 
setAsyncMode(bool async)795     status_t setAsyncMode(bool async) override {
796         return mBase->setAsyncMode(async);
797     }
798 
dequeueBuffer(int * slot,sp<Fence> * fence,uint32_t w,uint32_t h,PixelFormat format,uint64_t usage,uint64_t * outBufferAge,FrameEventHistoryDelta * outTimestamps)799     status_t dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w, uint32_t h, PixelFormat format,
800                            uint64_t usage, uint64_t* outBufferAge,
801                            FrameEventHistoryDelta* outTimestamps) override {
802         return mBase->dequeueBuffer(slot, fence, w, h, format, usage, outBufferAge, outTimestamps);
803     }
804 
dequeueBuffers(const std::vector<DequeueBufferInput> & inputs,std::vector<DequeueBufferOutput> * outputs)805     status_t dequeueBuffers(
806             const std::vector<DequeueBufferInput>& inputs,
807             std::vector<DequeueBufferOutput>* outputs) override {
808         return mBase->dequeueBuffers(inputs, outputs);
809     }
810 
detachBuffer(int slot)811     status_t detachBuffer(int slot) override {
812         return mBase->detachBuffer(slot);
813     }
814 
detachBuffers(const std::vector<int32_t> & slots,std::vector<status_t> * results)815     status_t detachBuffers(const std::vector<int32_t>& slots,
816                            std::vector<status_t>* results) override {
817         return mBase->detachBuffers(slots, results);
818     }
819 
detachNextBuffer(sp<GraphicBuffer> * outBuffer,sp<Fence> * outFence)820     status_t detachNextBuffer(
821             sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) override {
822         return mBase->detachNextBuffer(outBuffer, outFence);
823     }
824 
attachBuffer(int * outSlot,const sp<GraphicBuffer> & buffer)825     status_t attachBuffer(
826             int* outSlot, const sp<GraphicBuffer>& buffer) override {
827         return mBase->attachBuffer(outSlot, buffer);
828     }
829 
attachBuffers(const std::vector<sp<GraphicBuffer>> & buffers,std::vector<AttachBufferOutput> * outputs)830     status_t attachBuffers(
831             const std::vector<sp<GraphicBuffer>>& buffers,
832             std::vector<AttachBufferOutput>* outputs) override {
833         return mBase->attachBuffers(buffers, outputs);
834     }
835 
queueBuffer(int slot,const QueueBufferInput & input,QueueBufferOutput * output)836     status_t queueBuffer(
837             int slot,
838             const QueueBufferInput& input,
839             QueueBufferOutput* output) override {
840         return mBase->queueBuffer(slot, input, output);
841     }
842 
queueBuffers(const std::vector<QueueBufferInput> & inputs,std::vector<QueueBufferOutput> * outputs)843     status_t queueBuffers(const std::vector<QueueBufferInput>& inputs,
844                           std::vector<QueueBufferOutput>* outputs) override {
845         return mBase->queueBuffers(inputs, outputs);
846     }
847 
cancelBuffer(int slot,const sp<Fence> & fence)848     status_t cancelBuffer(int slot, const sp<Fence>& fence) override {
849         return mBase->cancelBuffer(slot, fence);
850     }
851 
cancelBuffers(const std::vector<CancelBufferInput> & inputs,std::vector<status_t> * results)852     status_t cancelBuffers(
853             const std::vector<CancelBufferInput>& inputs,
854             std::vector<status_t>* results) override {
855         return mBase->cancelBuffers(inputs, results);
856     }
857 
query(int what,int * value)858     int query(int what, int* value) override {
859         return mBase->query(what, value);
860     }
861 
query(const std::vector<int32_t> inputs,std::vector<QueryOutput> * outputs)862     status_t query(const std::vector<int32_t> inputs,
863                    std::vector<QueryOutput>* outputs) override {
864         return mBase->query(inputs, outputs);
865     }
866 
connect(const sp<IProducerListener> & listener,int api,bool producerControlledByApp,QueueBufferOutput * output)867     status_t connect(
868             const sp<IProducerListener>& listener,
869             int api, bool producerControlledByApp,
870             QueueBufferOutput* output) override {
871         return mBase->connect(listener, api, producerControlledByApp, output);
872     }
873 
disconnect(int api,DisconnectMode mode=DisconnectMode::Api)874     status_t disconnect(
875             int api, DisconnectMode mode = DisconnectMode::Api) override {
876         return mBase->disconnect(api, mode);
877     }
878 
setSidebandStream(const sp<NativeHandle> & stream)879     status_t setSidebandStream(const sp<NativeHandle>& stream) override {
880         return mBase->setSidebandStream(stream);
881     }
882 
allocateBuffers(uint32_t width,uint32_t height,PixelFormat format,uint64_t usage)883     void allocateBuffers(uint32_t width, uint32_t height,
884             PixelFormat format, uint64_t usage) override {
885         return mBase->allocateBuffers(width, height, format, usage);
886     }
887 
allowAllocation(bool allow)888     status_t allowAllocation(bool allow) override {
889         return mBase->allowAllocation(allow);
890     }
891 
setGenerationNumber(uint32_t generationNumber)892     status_t setGenerationNumber(uint32_t generationNumber) override {
893         return mBase->setGenerationNumber(generationNumber);
894     }
895 
getConsumerName() const896     String8 getConsumerName() const override {
897         return mBase->getConsumerName();
898     }
899 
setSharedBufferMode(bool sharedBufferMode)900     status_t setSharedBufferMode(bool sharedBufferMode) override {
901         return mBase->setSharedBufferMode(sharedBufferMode);
902     }
903 
setAutoRefresh(bool autoRefresh)904     status_t setAutoRefresh(bool autoRefresh) override {
905         return mBase->setAutoRefresh(autoRefresh);
906     }
907 
setDequeueTimeout(nsecs_t timeout)908     status_t setDequeueTimeout(nsecs_t timeout) override {
909         return mBase->setDequeueTimeout(timeout);
910     }
911 
setLegacyBufferDrop(bool drop)912     status_t setLegacyBufferDrop(bool drop) override {
913         return mBase->setLegacyBufferDrop(drop);
914     }
915 
getLastQueuedBuffer(sp<GraphicBuffer> * outBuffer,sp<Fence> * outFence,float outTransformMatrix[16])916     status_t getLastQueuedBuffer(
917             sp<GraphicBuffer>* outBuffer,
918             sp<Fence>* outFence,
919             float outTransformMatrix[16]) override {
920         return mBase->getLastQueuedBuffer(
921                 outBuffer, outFence, outTransformMatrix);
922     }
923 
getLastQueuedBuffer(sp<GraphicBuffer> * outBuffer,sp<Fence> * outFence,Rect * outRect,uint32_t * outTransform)924     status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence, Rect* outRect,
925                                  uint32_t* outTransform) override {
926         return mBase->getLastQueuedBuffer(outBuffer, outFence, outRect, outTransform);
927     }
928 
getFrameTimestamps(FrameEventHistoryDelta * outDelta)929     void getFrameTimestamps(FrameEventHistoryDelta* outDelta) override {
930         return mBase->getFrameTimestamps(outDelta);
931     }
932 
getUniqueId(uint64_t * outId) const933     status_t getUniqueId(uint64_t* outId) const override {
934         return mBase->getUniqueId(outId);
935     }
936 
getConsumerUsage(uint64_t * outUsage) const937     status_t getConsumerUsage(uint64_t* outUsage) const override {
938         return mBase->getConsumerUsage(outUsage);
939     }
940 
setAutoPrerotation(bool autoPrerotation)941     status_t setAutoPrerotation(bool autoPrerotation) override {
942         return mBase->setAutoPrerotation(autoPrerotation);
943     }
944 };
945 
946 IMPLEMENT_HYBRID_META_INTERFACE(GraphicBufferProducer,
947         "android.gui.IGraphicBufferProducer");
948 
949 // ----------------------------------------------------------------------
950 
setLegacyBufferDrop(bool drop)951 status_t IGraphicBufferProducer::setLegacyBufferDrop(bool drop) {
952     // No-op for IGBP other than BufferQueue.
953     (void) drop;
954     return INVALID_OPERATION;
955 }
956 
setAutoPrerotation(bool autoPrerotation)957 status_t IGraphicBufferProducer::setAutoPrerotation(bool autoPrerotation) {
958     // No-op for IGBP other than BufferQueue.
959     (void)autoPrerotation;
960     return INVALID_OPERATION;
961 }
962 
exportToParcel(Parcel * parcel)963 status_t IGraphicBufferProducer::exportToParcel(Parcel* parcel) {
964     status_t res = OK;
965     res = parcel->writeUint32(USE_BUFFER_QUEUE);
966     if (res != NO_ERROR) {
967         ALOGE("exportToParcel: Cannot write magic, res=%d.", res);
968         return res;
969     }
970 
971     return parcel->writeStrongBinder(IInterface::asBinder(this));
972 }
973 
974 /* static */
exportToParcel(const sp<IGraphicBufferProducer> & producer,Parcel * parcel)975 status_t IGraphicBufferProducer::exportToParcel(const sp<IGraphicBufferProducer>& producer,
976                                                 Parcel* parcel) {
977     if (parcel == nullptr) {
978         ALOGE("exportToParcel: Invalid parcel object.");
979         return BAD_VALUE;
980     }
981 
982     if (producer == nullptr) {
983         status_t res = OK;
984         res = parcel->writeUint32(IGraphicBufferProducer::USE_BUFFER_QUEUE);
985         if (res != NO_ERROR) return res;
986         return parcel->writeStrongBinder(nullptr);
987     } else {
988         return producer->exportToParcel(parcel);
989     }
990 }
991 
992 /* static */
createFromParcel(const Parcel * parcel)993 sp<IGraphicBufferProducer> IGraphicBufferProducer::createFromParcel(const Parcel* parcel) {
994     uint32_t outMagic = 0;
995     status_t res = NO_ERROR;
996 
997     res = parcel->readUint32(&outMagic);
998     if (res != NO_ERROR) {
999         ALOGE("createFromParcel: Failed to read magic, error=%d.", res);
1000         return nullptr;
1001     }
1002 
1003     switch (outMagic) {
1004         case USE_BUFFER_QUEUE: {
1005             sp<IBinder> binder;
1006             res = parcel->readNullableStrongBinder(&binder);
1007             if (res != NO_ERROR) {
1008                 ALOGE("createFromParcel: Can't read strong binder.");
1009                 return nullptr;
1010             }
1011             return interface_cast<IGraphicBufferProducer>(binder);
1012         }
1013         case USE_BUFFER_HUB: {
1014             ALOGE("createFromParcel: BufferHub not implemented.");
1015 #ifndef NO_BUFFERHUB
1016             dvr::ProducerQueueParcelable producerParcelable;
1017             res = producerParcelable.readFromParcel(parcel);
1018             if (res != NO_ERROR) {
1019                 ALOGE("createFromParcel: Failed to read from parcel, error=%d", res);
1020                 return nullptr;
1021             }
1022             return BufferHubProducer::Create(std::move(producerParcelable));
1023 #else
1024             return nullptr;
1025 #endif
1026         }
1027         default: {
1028             ALOGE("createFromParcel: Unexpected mgaic: 0x%x.", outMagic);
1029             return nullptr;
1030         }
1031     }
1032 }
1033 
1034 // ----------------------------------------------------------------------------
1035 
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)1036 status_t BnGraphicBufferProducer::onTransact(
1037     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
1038 {
1039     switch(code) {
1040         case REQUEST_BUFFER: {
1041             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1042             int bufferIdx = data.readInt32();
1043             sp<GraphicBuffer> buffer;
1044             int result = requestBuffer(bufferIdx, &buffer);
1045             reply->writeInt32(buffer != nullptr);
1046             if (buffer != nullptr) {
1047                 reply->write(*buffer);
1048             }
1049             reply->writeInt32(result);
1050             return NO_ERROR;
1051         }
1052         case REQUEST_BUFFERS: {
1053             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1054             std::vector<int32_t> slots;
1055             std::vector<RequestBufferOutput> outputs;
1056             status_t result = data.readInt32Vector(&slots);
1057             if (result != NO_ERROR) {
1058                 return result;
1059             }
1060             (void)requestBuffers(slots, &outputs);
1061             result = reply->writeVectorSize(outputs);
1062             for (const RequestBufferOutput& output : outputs) {
1063                 if (result != NO_ERROR) {
1064                     return result;
1065                 }
1066                 result = reply->write(output);
1067             }
1068             return result;
1069         }
1070         case SET_MAX_DEQUEUED_BUFFER_COUNT: {
1071             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1072             int maxDequeuedBuffers = data.readInt32();
1073             int result = setMaxDequeuedBufferCount(maxDequeuedBuffers);
1074             reply->writeInt32(result);
1075             return NO_ERROR;
1076         }
1077         case SET_ASYNC_MODE: {
1078             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1079             bool async = data.readInt32();
1080             int result = setAsyncMode(async);
1081             reply->writeInt32(result);
1082             return NO_ERROR;
1083         }
1084         case DEQUEUE_BUFFER: {
1085             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1086             uint32_t width = data.readUint32();
1087             uint32_t height = data.readUint32();
1088             PixelFormat format = static_cast<PixelFormat>(data.readInt32());
1089             uint64_t usage = data.readUint64();
1090             uint64_t bufferAge = 0;
1091             bool getTimestamps = data.readBool();
1092 
1093             int buf = 0;
1094             sp<Fence> fence = Fence::NO_FENCE;
1095             FrameEventHistoryDelta frameTimestamps;
1096             int result = dequeueBuffer(&buf, &fence, width, height, format, usage, &bufferAge,
1097                                        getTimestamps ? &frameTimestamps : nullptr);
1098 
1099             if (fence == nullptr) {
1100                 ALOGE("dequeueBuffer returned a NULL fence, setting to Fence::NO_FENCE");
1101                 fence = Fence::NO_FENCE;
1102             }
1103             reply->writeInt32(buf);
1104             reply->write(*fence);
1105             reply->writeUint64(bufferAge);
1106             if (getTimestamps) {
1107                 reply->write(frameTimestamps);
1108             }
1109             reply->writeInt32(result);
1110             return NO_ERROR;
1111         }
1112         case DEQUEUE_BUFFERS: {
1113             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1114             std::vector<DequeueBufferInput> inputs;
1115             std::vector<DequeueBufferOutput> outputs;
1116             status_t result = data.resizeOutVector(&inputs);
1117             if (result != NO_ERROR) {
1118                 return result;
1119             }
1120             for (DequeueBufferInput& input : inputs) {
1121                 result = data.read(input);
1122                 if (result != NO_ERROR) {
1123                     return result;
1124                 }
1125             }
1126             (void)dequeueBuffers(inputs, &outputs);
1127             result = reply->writeVectorSize(outputs);
1128             for (const DequeueBufferOutput& output : outputs) {
1129                 if (result != NO_ERROR) {
1130                     return result;
1131                 }
1132                 result = reply->write(output);
1133             }
1134             return result;
1135         }
1136         case DETACH_BUFFER: {
1137             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1138             int slot = data.readInt32();
1139             int result = detachBuffer(slot);
1140             reply->writeInt32(result);
1141             return NO_ERROR;
1142         }
1143         case DETACH_BUFFERS: {
1144             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1145             std::vector<int32_t> slots;
1146             std::vector<status_t> results;
1147             status_t result = data.readInt32Vector(&slots);
1148             if (result != NO_ERROR) {
1149                 return result;
1150             }
1151             (void)detachBuffers(slots, &results);
1152             return reply->writeInt32Vector(results);
1153         }
1154         case DETACH_NEXT_BUFFER: {
1155             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1156             sp<GraphicBuffer> buffer;
1157             sp<Fence> fence;
1158             int32_t result = detachNextBuffer(&buffer, &fence);
1159             reply->writeInt32(result);
1160             if (result == NO_ERROR) {
1161                 reply->writeInt32(buffer != nullptr);
1162                 if (buffer != nullptr) {
1163                     reply->write(*buffer);
1164                 }
1165                 reply->writeInt32(fence != nullptr);
1166                 if (fence != nullptr) {
1167                     reply->write(*fence);
1168                 }
1169             }
1170             return NO_ERROR;
1171         }
1172         case ATTACH_BUFFER: {
1173             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1174             sp<GraphicBuffer> buffer = new GraphicBuffer();
1175             status_t result = data.read(*buffer.get());
1176             int slot = 0;
1177             if (result == NO_ERROR) {
1178                 result = attachBuffer(&slot, buffer);
1179             }
1180             reply->writeInt32(slot);
1181             reply->writeInt32(result);
1182             return NO_ERROR;
1183         }
1184         case ATTACH_BUFFERS: {
1185             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1186             std::vector<sp<GraphicBuffer>> buffers;
1187             status_t result = data.resizeOutVector(&buffers);
1188             if (result != NO_ERROR) {
1189                 return result;
1190             }
1191             for (sp<GraphicBuffer>& buffer : buffers) {
1192                 buffer = new GraphicBuffer();
1193                 result = data.read(*buffer.get());
1194                 if (result != NO_ERROR) {
1195                     return result;
1196                 }
1197             }
1198             std::vector<AttachBufferOutput> outputs;
1199             (void)attachBuffers(buffers, &outputs);
1200             result = reply->writeVectorSize(outputs);
1201             for (const AttachBufferOutput& output : outputs) {
1202                 if (result != NO_ERROR) {
1203                     return result;
1204                 }
1205                 result = reply->write(output);
1206             }
1207             return result;
1208         }
1209         case QUEUE_BUFFER: {
1210             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1211 
1212             int buf = data.readInt32();
1213             QueueBufferInput input(data);
1214             QueueBufferOutput output;
1215             status_t result = queueBuffer(buf, input, &output);
1216             reply->write(output);
1217             reply->writeInt32(result);
1218 
1219             return NO_ERROR;
1220         }
1221         case QUEUE_BUFFERS: {
1222             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1223             std::vector<QueueBufferInput> inputs;
1224             status_t result = data.resizeOutVector(&inputs);
1225             if (result != NO_ERROR) {
1226                 return result;
1227             }
1228             for (QueueBufferInput& input : inputs) {
1229                 result = data.read(input);
1230                 if (result != NO_ERROR) {
1231                     return result;
1232                 }
1233             }
1234             std::vector<QueueBufferOutput> outputs;
1235             (void)queueBuffers(inputs, &outputs);
1236             result = reply->writeVectorSize(outputs);
1237             for (const QueueBufferOutput& output : outputs) {
1238                 if (result != NO_ERROR) {
1239                     return result;
1240                 }
1241                 result = reply->write(output);
1242             }
1243             return result;
1244         }
1245         case CANCEL_BUFFER: {
1246             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1247             int buf = data.readInt32();
1248             sp<Fence> fence = new Fence();
1249             status_t result = data.read(*fence.get());
1250             if (result == NO_ERROR) {
1251                 result = cancelBuffer(buf, fence);
1252             }
1253             reply->writeInt32(result);
1254             return NO_ERROR;
1255         }
1256         case CANCEL_BUFFERS: {
1257             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1258             std::vector<CancelBufferInput> inputs;
1259             status_t result = data.resizeOutVector(&inputs);
1260             for (CancelBufferInput& input : inputs) {
1261                 if (result != NO_ERROR) {
1262                     return result;
1263                 }
1264                 result = data.read(input);
1265             }
1266             if (result != NO_ERROR) {
1267                 return result;
1268             }
1269             std::vector<status_t> results;
1270             result = cancelBuffers(inputs, &results);
1271             if (result != NO_ERROR) {
1272                 return result;
1273             }
1274             return reply->writeInt32Vector(results);
1275         }
1276         case QUERY: {
1277             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1278             int value = 0;
1279             int what = data.readInt32();
1280             int res = query(what, &value);
1281             reply->writeInt32(value);
1282             reply->writeInt32(res);
1283             return NO_ERROR;
1284         }
1285         case QUERY_MULTIPLE: {
1286             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1287             std::vector<int32_t> inputs;
1288             status_t result = data.readInt32Vector(&inputs);
1289             if (result != NO_ERROR) {
1290                 return result;
1291             }
1292             std::vector<QueryOutput> outputs;
1293             result = query(inputs, &outputs);
1294             if (result != NO_ERROR) {
1295                 return result;
1296             }
1297             result = reply->writeVectorSize(outputs);
1298             for (const QueryOutput& output : outputs) {
1299                 if (result != NO_ERROR) {
1300                     return result;
1301                 }
1302                 result = reply->write(output);
1303             }
1304             return result;
1305         }
1306         case CONNECT: {
1307             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1308             sp<IProducerListener> listener;
1309             if (data.readInt32() == 1) {
1310                 listener = IProducerListener::asInterface(data.readStrongBinder());
1311             }
1312             int api = data.readInt32();
1313             bool producerControlledByApp = data.readInt32();
1314             QueueBufferOutput output;
1315             status_t res = connect(listener, api, producerControlledByApp, &output);
1316             reply->write(output);
1317             reply->writeInt32(res);
1318             return NO_ERROR;
1319         }
1320         case DISCONNECT: {
1321             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1322             int api = data.readInt32();
1323             DisconnectMode mode = static_cast<DisconnectMode>(data.readInt32());
1324             status_t res = disconnect(api, mode);
1325             reply->writeInt32(res);
1326             return NO_ERROR;
1327         }
1328         case SET_SIDEBAND_STREAM: {
1329             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1330             sp<NativeHandle> stream;
1331             if (data.readInt32()) {
1332                 stream = NativeHandle::create(data.readNativeHandle(), true);
1333             }
1334             status_t result = setSidebandStream(stream);
1335             reply->writeInt32(result);
1336             return NO_ERROR;
1337         }
1338         case ALLOCATE_BUFFERS: {
1339             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1340             uint32_t width = data.readUint32();
1341             uint32_t height = data.readUint32();
1342             PixelFormat format = static_cast<PixelFormat>(data.readInt32());
1343             uint64_t usage = data.readUint64();
1344             allocateBuffers(width, height, format, usage);
1345             return NO_ERROR;
1346         }
1347         case ALLOW_ALLOCATION: {
1348             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1349             bool allow = static_cast<bool>(data.readInt32());
1350             status_t result = allowAllocation(allow);
1351             reply->writeInt32(result);
1352             return NO_ERROR;
1353         }
1354         case SET_GENERATION_NUMBER: {
1355             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1356             uint32_t generationNumber = data.readUint32();
1357             status_t result = setGenerationNumber(generationNumber);
1358             reply->writeInt32(result);
1359             return NO_ERROR;
1360         }
1361         case GET_CONSUMER_NAME: {
1362             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1363             reply->writeString8(getConsumerName());
1364             return NO_ERROR;
1365         }
1366         case SET_SHARED_BUFFER_MODE: {
1367             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1368             bool sharedBufferMode = data.readInt32();
1369             status_t result = setSharedBufferMode(sharedBufferMode);
1370             reply->writeInt32(result);
1371             return NO_ERROR;
1372         }
1373         case SET_AUTO_REFRESH: {
1374             CHECK_INTERFACE(IGraphicBuffer, data, reply);
1375             bool autoRefresh = data.readInt32();
1376             status_t result = setAutoRefresh(autoRefresh);
1377             reply->writeInt32(result);
1378             return NO_ERROR;
1379         }
1380         case SET_DEQUEUE_TIMEOUT: {
1381             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1382             nsecs_t timeout = data.readInt64();
1383             status_t result = setDequeueTimeout(timeout);
1384             reply->writeInt32(result);
1385             return NO_ERROR;
1386         }
1387         case GET_LAST_QUEUED_BUFFER: {
1388             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1389             sp<GraphicBuffer> buffer(nullptr);
1390             sp<Fence> fence(Fence::NO_FENCE);
1391             float transform[16] = {};
1392             status_t result = getLastQueuedBuffer(&buffer, &fence, transform);
1393             reply->writeInt32(result);
1394             if (result != NO_ERROR) {
1395                 return result;
1396             }
1397             if (!buffer.get()) {
1398                 reply->writeBool(false);
1399             } else {
1400                 reply->writeBool(true);
1401                 result = reply->write(*buffer);
1402                 if (result == NO_ERROR) {
1403                     reply->write(transform, sizeof(float) * 16);
1404                 }
1405             }
1406             if (result != NO_ERROR) {
1407                 ALOGE("getLastQueuedBuffer failed to write buffer: %d", result);
1408                 return result;
1409             }
1410             if (fence == nullptr) {
1411                 ALOGE("getLastQueuedBuffer returned a NULL fence, setting to Fence::NO_FENCE");
1412                 fence = Fence::NO_FENCE;
1413             }
1414             result = reply->write(*fence);
1415             if (result != NO_ERROR) {
1416                 ALOGE("getLastQueuedBuffer failed to write fence: %d", result);
1417                 return result;
1418             }
1419             return NO_ERROR;
1420         }
1421         case GET_LAST_QUEUED_BUFFER2: {
1422             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1423             sp<GraphicBuffer> buffer(nullptr);
1424             sp<Fence> fence(Fence::NO_FENCE);
1425             Rect crop;
1426             uint32_t transform;
1427             status_t result = getLastQueuedBuffer(&buffer, &fence, &crop, &transform);
1428             reply->writeInt32(result);
1429             if (result != NO_ERROR) {
1430                 return result;
1431             }
1432             if (!buffer.get()) {
1433                 reply->writeBool(false);
1434             } else {
1435                 reply->writeBool(true);
1436                 result = reply->write(*buffer);
1437                 if (result == NO_ERROR) {
1438                     result = reply->write(crop);
1439                 }
1440                 if (result == NO_ERROR) {
1441                     result = reply->writeUint32(transform);
1442                 }
1443             }
1444             if (result != NO_ERROR) {
1445                 ALOGE("getLastQueuedBuffer failed to write buffer: %d", result);
1446                 return result;
1447             }
1448             if (fence == nullptr) {
1449                 ALOGE("getLastQueuedBuffer returned a NULL fence, setting to Fence::NO_FENCE");
1450                 fence = Fence::NO_FENCE;
1451             }
1452             result = reply->write(*fence);
1453             if (result != NO_ERROR) {
1454                 ALOGE("getLastQueuedBuffer failed to write fence: %d", result);
1455                 return result;
1456             }
1457             return NO_ERROR;
1458         }
1459 
1460         case GET_FRAME_TIMESTAMPS: {
1461             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1462             FrameEventHistoryDelta frameTimestamps;
1463             getFrameTimestamps(&frameTimestamps);
1464             status_t result = reply->write(frameTimestamps);
1465             if (result != NO_ERROR) {
1466                 ALOGE("BnGBP::GET_FRAME_TIMESTAMPS failed to write buffer: %d",
1467                         result);
1468                 return result;
1469             }
1470             return NO_ERROR;
1471         }
1472         case GET_UNIQUE_ID: {
1473             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1474             uint64_t outId = 0;
1475             status_t actualResult = getUniqueId(&outId);
1476             status_t result = reply->writeInt32(actualResult);
1477             if (result != NO_ERROR) {
1478                 return result;
1479             }
1480             result = reply->writeUint64(outId);
1481             if (result != NO_ERROR) {
1482                 return result;
1483             }
1484             return NO_ERROR;
1485         }
1486         case GET_CONSUMER_USAGE: {
1487             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1488             uint64_t outUsage = 0;
1489             status_t actualResult = getConsumerUsage(&outUsage);
1490             status_t result = reply->writeInt32(actualResult);
1491             if (result != NO_ERROR) {
1492                 return result;
1493             }
1494             result = reply->writeUint64(outUsage);
1495             if (result != NO_ERROR) {
1496                 return result;
1497             }
1498             return NO_ERROR;
1499         }
1500         case SET_LEGACY_BUFFER_DROP: {
1501             CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1502             bool drop = data.readInt32();
1503             int result = setLegacyBufferDrop(drop);
1504             reply->writeInt32(result);
1505             return NO_ERROR;
1506         }
1507         case SET_AUTO_PREROTATION: {
1508             CHECK_INTERFACE(IGraphicBuffer, data, reply);
1509             bool autoPrerotation = data.readBool();
1510             status_t result = setAutoPrerotation(autoPrerotation);
1511             reply->writeInt32(result);
1512             return NO_ERROR;
1513         }
1514     }
1515     return BBinder::onTransact(code, data, reply, flags);
1516 }
1517 
1518 }; // namespace android
1519