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