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