blob: 9dde15dd0e471d0534e58ea04cb28080693d0b66 [file] [log] [blame]
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <stdint.h>
18#include <sys/types.h>
19
20#include <utils/Errors.h>
Jesse Hall399184a2014-03-03 15:42:54 -080021#include <utils/NativeHandle.h>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080022#include <utils/RefBase.h>
Brian Anderson175a7202016-10-10 16:52:56 -070023#include <utils/String8.h>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080024#include <utils/Timers.h>
Jesse Hall399184a2014-03-03 15:42:54 -080025#include <utils/Vector.h>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080026
27#include <binder/Parcel.h>
28#include <binder/IInterface.h>
29
Jiyong Parka75d3d62018-04-09 12:16:30 +090030#ifndef NO_BUFFERHUB
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -080031#include <gui/BufferHubProducer.h>
Jiyong Parka75d3d62018-04-09 12:16:30 +090032#endif
Pawin Vongmasae672cd02019-02-14 16:01:29 -080033
34#include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h>
35#include <gui/bufferqueue/2.0/H2BGraphicBufferProducer.h>
Chia-I Wuc79a2962017-05-15 10:32:27 -070036#include <gui/BufferQueueDefs.h>
Andy McFadden2adaf042012-12-18 09:49:45 -080037#include <gui/IGraphicBufferProducer.h>
Dan Stozaf0eaf252014-03-21 13:05:51 -070038#include <gui/IProducerListener.h>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080039
40namespace android {
41// ----------------------------------------------------------------------------
42
Pawin Vongmasae672cd02019-02-14 16:01:29 -080043using H2BGraphicBufferProducerV1_0 =
44 ::android::hardware::graphics::bufferqueue::V1_0::utils::
45 H2BGraphicBufferProducer;
46using H2BGraphicBufferProducerV2_0 =
47 ::android::hardware::graphics::bufferqueue::V2_0::utils::
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -080048 H2BGraphicBufferProducer;
49
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080050enum {
51 REQUEST_BUFFER = IBinder::FIRST_CALL_TRANSACTION,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080052 DEQUEUE_BUFFER,
Dan Stoza9f3053d2014-03-06 15:14:33 -080053 DETACH_BUFFER,
Dan Stozad9822a32014-03-28 15:25:31 -070054 DETACH_NEXT_BUFFER,
Dan Stoza9f3053d2014-03-06 15:14:33 -080055 ATTACH_BUFFER,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080056 QUEUE_BUFFER,
57 CANCEL_BUFFER,
Mathias Agopianeafabcd2011-04-20 14:20:59 -070058 QUERY,
Jamie Gennisfe0a87b2011-07-13 19:12:20 -070059 CONNECT,
60 DISCONNECT,
Jesse Hall399184a2014-03-03 15:42:54 -080061 SET_SIDEBAND_STREAM,
Dan Stoza29a3e902014-06-20 13:13:57 -070062 ALLOCATE_BUFFERS,
Dan Stoza9de72932015-04-16 17:28:43 -070063 ALLOW_ALLOCATION,
Dan Stoza812ed062015-06-02 15:45:22 -070064 SET_GENERATION_NUMBER,
Dan Stozac6f30bd2015-06-08 09:32:50 -070065 GET_CONSUMER_NAME,
Pablo Ceballosfa455352015-08-12 17:47:47 -070066 SET_MAX_DEQUEUED_BUFFER_COUNT,
Dan Stoza7dde5992015-05-22 09:51:44 -070067 SET_ASYNC_MODE,
Pablo Ceballos3559fbf2016-03-17 15:50:23 -070068 SET_SHARED_BUFFER_MODE,
Pablo Ceballosff95aab2016-01-13 17:09:58 -080069 SET_AUTO_REFRESH,
Dan Stoza127fc632015-06-30 13:43:32 -070070 SET_DEQUEUE_TIMEOUT,
Dan Stoza50101d02016-04-07 16:53:23 -070071 GET_LAST_QUEUED_BUFFER,
Pablo Ceballosfc352582016-06-30 17:22:20 -070072 GET_FRAME_TIMESTAMPS,
Chia-I Wue2786ea2017-08-07 10:36:08 -070073 GET_UNIQUE_ID,
74 GET_CONSUMER_USAGE,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080075};
76
Andy McFadden2adaf042012-12-18 09:49:45 -080077class BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer>
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080078{
79public:
Chih-Hung Hsiehe2347b72016-04-25 15:41:05 -070080 explicit BpGraphicBufferProducer(const sp<IBinder>& impl)
Andy McFadden2adaf042012-12-18 09:49:45 -080081 : BpInterface<IGraphicBufferProducer>(impl)
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080082 {
83 }
84
Yi Kongca038512017-05-02 16:55:24 -070085 ~BpGraphicBufferProducer() override;
Dan Stoza3be1c6b2014-11-18 10:24:03 -080086
Jamie Gennis7b305ff2011-07-19 12:08:33 -070087 virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080088 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -080089 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080090 data.writeInt32(bufferIdx);
Jamie Gennis8a29ff22011-10-14 15:03:17 -070091 status_t result =remote()->transact(REQUEST_BUFFER, data, &reply);
92 if (result != NO_ERROR) {
93 return result;
94 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080095 bool nonNull = reply.readInt32();
96 if (nonNull) {
Jamie Gennis7b305ff2011-07-19 12:08:33 -070097 *buf = new GraphicBuffer();
Lingyun Zhu2aff7022012-11-20 19:24:35 +080098 result = reply.read(**buf);
99 if(result != NO_ERROR) {
100 (*buf).clear();
101 return result;
102 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800103 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700104 result = reply.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700105 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800106 }
107
Pablo Ceballosfa455352015-08-12 17:47:47 -0700108 virtual status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) {
109 Parcel data, reply;
110 data.writeInterfaceToken(
111 IGraphicBufferProducer::getInterfaceDescriptor());
112 data.writeInt32(maxDequeuedBuffers);
113 status_t result = remote()->transact(SET_MAX_DEQUEUED_BUFFER_COUNT,
114 data, &reply);
115 if (result != NO_ERROR) {
116 return result;
117 }
118 result = reply.readInt32();
119 return result;
120 }
121
122 virtual status_t setAsyncMode(bool async) {
123 Parcel data, reply;
124 data.writeInterfaceToken(
125 IGraphicBufferProducer::getInterfaceDescriptor());
126 data.writeInt32(async);
127 status_t result = remote()->transact(SET_ASYNC_MODE,
128 data, &reply);
129 if (result != NO_ERROR) {
130 return result;
131 }
132 result = reply.readInt32();
133 return result;
134 }
135
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600136 virtual status_t dequeueBuffer(int* buf, sp<Fence>* fence, uint32_t width, uint32_t height,
137 PixelFormat format, uint64_t usage, uint64_t* outBufferAge,
138 FrameEventHistoryDelta* outTimestamps) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800139 Parcel data, reply;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700140 bool getFrameTimestamps = (outTimestamps != nullptr);
Brian Andersonbaaad322016-07-22 15:55:13 -0700141
Andy McFadden2adaf042012-12-18 09:49:45 -0800142 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800143 data.writeUint32(width);
144 data.writeUint32(height);
145 data.writeInt32(static_cast<int32_t>(format));
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700146 data.writeUint64(usage);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700147 data.writeBool(getFrameTimestamps);
Brian Andersonbaaad322016-07-22 15:55:13 -0700148
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700149 status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply);
150 if (result != NO_ERROR) {
151 return result;
152 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700153
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800154 *buf = reply.readInt32();
Brian Andersonbaaad322016-07-22 15:55:13 -0700155 *fence = new Fence();
156 result = reply.read(**fence);
157 if (result != NO_ERROR) {
158 fence->clear();
159 return result;
Jesse Hallf7857542012-06-14 15:26:33 -0700160 }
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600161 if (outBufferAge) {
162 result = reply.readUint64(outBufferAge);
163 } else {
164 // Read the value even if outBufferAge is nullptr:
165 uint64_t bufferAge;
166 result = reply.readUint64(&bufferAge);
167 }
168 if (result != NO_ERROR) {
169 ALOGE("IGBP::dequeueBuffer failed to read buffer age: %d", result);
170 return result;
171 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700172 if (getFrameTimestamps) {
173 result = reply.read(*outTimestamps);
174 if (result != NO_ERROR) {
175 ALOGE("IGBP::dequeueBuffer failed to read timestamps: %d",
176 result);
177 return result;
178 }
179 }
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700180 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800181 return result;
182 }
183
Dan Stoza9f3053d2014-03-06 15:14:33 -0800184 virtual status_t detachBuffer(int slot) {
185 Parcel data, reply;
186 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
187 data.writeInt32(slot);
188 status_t result = remote()->transact(DETACH_BUFFER, data, &reply);
189 if (result != NO_ERROR) {
190 return result;
191 }
192 result = reply.readInt32();
193 return result;
194 }
195
Dan Stozad9822a32014-03-28 15:25:31 -0700196 virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer,
197 sp<Fence>* outFence) {
Yi Kong48a619f2018-06-05 16:34:59 -0700198 if (outBuffer == nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -0700199 ALOGE("detachNextBuffer: outBuffer must not be NULL");
200 return BAD_VALUE;
Yi Kong48a619f2018-06-05 16:34:59 -0700201 } else if (outFence == nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -0700202 ALOGE("detachNextBuffer: outFence must not be NULL");
203 return BAD_VALUE;
204 }
205 Parcel data, reply;
206 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
207 status_t result = remote()->transact(DETACH_NEXT_BUFFER, data, &reply);
208 if (result != NO_ERROR) {
209 return result;
210 }
211 result = reply.readInt32();
212 if (result == NO_ERROR) {
213 bool nonNull = reply.readInt32();
214 if (nonNull) {
215 *outBuffer = new GraphicBuffer;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700216 result = reply.read(**outBuffer);
217 if (result != NO_ERROR) {
218 outBuffer->clear();
219 return result;
220 }
Dan Stozad9822a32014-03-28 15:25:31 -0700221 }
222 nonNull = reply.readInt32();
223 if (nonNull) {
224 *outFence = new Fence;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700225 result = reply.read(**outFence);
226 if (result != NO_ERROR) {
227 outBuffer->clear();
228 outFence->clear();
229 return result;
230 }
Dan Stozad9822a32014-03-28 15:25:31 -0700231 }
232 }
233 return result;
234 }
235
Dan Stoza9f3053d2014-03-06 15:14:33 -0800236 virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer) {
237 Parcel data, reply;
238 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
239 data.write(*buffer.get());
240 status_t result = remote()->transact(ATTACH_BUFFER, data, &reply);
241 if (result != NO_ERROR) {
242 return result;
243 }
Chia-I Wuc79a2962017-05-15 10:32:27 -0700244
Dan Stoza9f3053d2014-03-06 15:14:33 -0800245 *slot = reply.readInt32();
246 result = reply.readInt32();
Chia-I Wuc79a2962017-05-15 10:32:27 -0700247 if (result == NO_ERROR &&
248 (*slot < 0 || *slot >= BufferQueueDefs::NUM_BUFFER_SLOTS)) {
249 ALOGE("attachBuffer returned invalid slot %d", *slot);
250 android_errorWriteLog(0x534e4554, "37478824");
251 return UNKNOWN_ERROR;
252 }
253
Dan Stoza9f3053d2014-03-06 15:14:33 -0800254 return result;
255 }
256
Mathias Agopianf0bc2f12012-04-09 16:14:01 -0700257 virtual status_t queueBuffer(int buf,
258 const QueueBufferInput& input, QueueBufferOutput* output) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800259 Parcel data, reply;
Brian Andersonbaaad322016-07-22 15:55:13 -0700260
Andy McFadden2adaf042012-12-18 09:49:45 -0800261 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800262 data.writeInt32(buf);
Jesse Hallc777b0b2012-06-28 12:52:05 -0700263 data.write(input);
Brian Andersonbaaad322016-07-22 15:55:13 -0700264
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700265 status_t result = remote()->transact(QUEUE_BUFFER, data, &reply);
266 if (result != NO_ERROR) {
267 return result;
268 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700269
270 result = reply.read(*output);
271 if (result != NO_ERROR) {
272 return result;
273 }
274
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700275 result = reply.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800276 return result;
277 }
278
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700279 virtual status_t cancelBuffer(int buf, const sp<Fence>& fence) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800280 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800281 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800282 data.writeInt32(buf);
Jamie Gennis1df8c342012-12-20 14:05:45 -0800283 data.write(*fence.get());
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700284 status_t result = remote()->transact(CANCEL_BUFFER, data, &reply);
285 if (result != NO_ERROR) {
286 return result;
287 }
288 result = reply.readInt32();
289 return result;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800290 }
291
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700292 virtual int query(int what, int* value) {
293 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800294 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700295 data.writeInt32(what);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700296 status_t result = remote()->transact(QUERY, data, &reply);
297 if (result != NO_ERROR) {
298 return result;
299 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700300 value[0] = reply.readInt32();
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700301 result = reply.readInt32();
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700302 return result;
303 }
304
Dan Stozaf0eaf252014-03-21 13:05:51 -0700305 virtual status_t connect(const sp<IProducerListener>& listener,
Mathias Agopian365857d2013-09-11 19:35:45 -0700306 int api, bool producerControlledByApp, QueueBufferOutput* output) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700307 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800308 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Yi Kong48a619f2018-06-05 16:34:59 -0700309 if (listener != nullptr) {
Dan Stozaf0eaf252014-03-21 13:05:51 -0700310 data.writeInt32(1);
Marco Nelissen097ca272014-11-14 08:01:01 -0800311 data.writeStrongBinder(IInterface::asBinder(listener));
Dan Stozaf0eaf252014-03-21 13:05:51 -0700312 } else {
313 data.writeInt32(0);
314 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700315 data.writeInt32(api);
Mathias Agopian595264f2013-07-16 22:56:09 -0700316 data.writeInt32(producerControlledByApp);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700317 status_t result = remote()->transact(CONNECT, data, &reply);
318 if (result != NO_ERROR) {
319 return result;
320 }
Brian Andersonbaaad322016-07-22 15:55:13 -0700321 reply.read(*output);
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700322 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700323 return result;
324 }
Mathias Agopian80727112011-05-02 19:51:12 -0700325
Robert Carr97b9c862016-09-08 13:54:35 -0700326 virtual status_t disconnect(int api, DisconnectMode mode) {
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700327 Parcel data, reply;
Andy McFadden2adaf042012-12-18 09:49:45 -0800328 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700329 data.writeInt32(api);
Robert Carr97b9c862016-09-08 13:54:35 -0700330 data.writeInt32(static_cast<int32_t>(mode));
Jamie Gennis8a29ff22011-10-14 15:03:17 -0700331 status_t result =remote()->transact(DISCONNECT, data, &reply);
332 if (result != NO_ERROR) {
333 return result;
334 }
335 result = reply.readInt32();
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700336 return result;
337 }
Jesse Hall399184a2014-03-03 15:42:54 -0800338
339 virtual status_t setSidebandStream(const sp<NativeHandle>& stream) {
340 Parcel data, reply;
341 status_t result;
342 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
343 if (stream.get()) {
344 data.writeInt32(true);
345 data.writeNativeHandle(stream->handle());
346 } else {
347 data.writeInt32(false);
348 }
349 if ((result = remote()->transact(SET_SIDEBAND_STREAM, data, &reply)) == NO_ERROR) {
350 result = reply.readInt32();
351 }
352 return result;
353 }
Dan Stoza29a3e902014-06-20 13:13:57 -0700354
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700355 virtual void allocateBuffers(uint32_t width, uint32_t height,
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700356 PixelFormat format, uint64_t usage) {
Dan Stoza29a3e902014-06-20 13:13:57 -0700357 Parcel data, reply;
358 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800359 data.writeUint32(width);
360 data.writeUint32(height);
Dan Stoza29a3e902014-06-20 13:13:57 -0700361 data.writeInt32(static_cast<int32_t>(format));
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700362 data.writeUint64(usage);
Jorim Jaggi0a3e7842018-07-17 13:48:33 +0200363 status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply, TF_ONE_WAY);
Dan Stoza29a3e902014-06-20 13:13:57 -0700364 if (result != NO_ERROR) {
365 ALOGE("allocateBuffers failed to transact: %d", result);
366 }
367 }
Dan Stoza9de72932015-04-16 17:28:43 -0700368
369 virtual status_t allowAllocation(bool allow) {
370 Parcel data, reply;
371 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
372 data.writeInt32(static_cast<int32_t>(allow));
373 status_t result = remote()->transact(ALLOW_ALLOCATION, data, &reply);
374 if (result != NO_ERROR) {
375 return result;
376 }
377 result = reply.readInt32();
378 return result;
379 }
Dan Stoza812ed062015-06-02 15:45:22 -0700380
381 virtual status_t setGenerationNumber(uint32_t generationNumber) {
382 Parcel data, reply;
383 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
384 data.writeUint32(generationNumber);
385 status_t result = remote()->transact(SET_GENERATION_NUMBER, data, &reply);
386 if (result == NO_ERROR) {
387 result = reply.readInt32();
388 }
389 return result;
390 }
Dan Stozac6f30bd2015-06-08 09:32:50 -0700391
392 virtual String8 getConsumerName() const {
393 Parcel data, reply;
394 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
395 status_t result = remote()->transact(GET_CONSUMER_NAME, data, &reply);
396 if (result != NO_ERROR) {
397 ALOGE("getConsumerName failed to transact: %d", result);
398 return String8("TransactFailed");
399 }
400 return reply.readString8();
401 }
Dan Stoza7dde5992015-05-22 09:51:44 -0700402
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700403 virtual status_t setSharedBufferMode(bool sharedBufferMode) {
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700404 Parcel data, reply;
405 data.writeInterfaceToken(
406 IGraphicBufferProducer::getInterfaceDescriptor());
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700407 data.writeInt32(sharedBufferMode);
408 status_t result = remote()->transact(SET_SHARED_BUFFER_MODE, data,
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700409 &reply);
410 if (result == NO_ERROR) {
411 result = reply.readInt32();
412 }
413 return result;
414 }
Dan Stoza127fc632015-06-30 13:43:32 -0700415
Pablo Ceballosff95aab2016-01-13 17:09:58 -0800416 virtual status_t setAutoRefresh(bool autoRefresh) {
417 Parcel data, reply;
418 data.writeInterfaceToken(
419 IGraphicBufferProducer::getInterfaceDescriptor());
420 data.writeInt32(autoRefresh);
421 status_t result = remote()->transact(SET_AUTO_REFRESH, data, &reply);
422 if (result == NO_ERROR) {
423 result = reply.readInt32();
424 }
425 return result;
426 }
427
Dan Stoza127fc632015-06-30 13:43:32 -0700428 virtual status_t setDequeueTimeout(nsecs_t timeout) {
429 Parcel data, reply;
430 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
431 data.writeInt64(timeout);
432 status_t result = remote()->transact(SET_DEQUEUE_TIMEOUT, data, &reply);
433 if (result != NO_ERROR) {
434 ALOGE("setDequeueTimeout failed to transact: %d", result);
435 return result;
436 }
437 return reply.readInt32();
438 }
Dan Stoza50101d02016-04-07 16:53:23 -0700439
440 virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer,
John Reck1a61da52016-04-28 13:18:15 -0700441 sp<Fence>* outFence, float outTransformMatrix[16]) override {
Dan Stoza50101d02016-04-07 16:53:23 -0700442 Parcel data, reply;
443 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
444 status_t result = remote()->transact(GET_LAST_QUEUED_BUFFER, data,
445 &reply);
446 if (result != NO_ERROR) {
447 ALOGE("getLastQueuedBuffer failed to transact: %d", result);
448 return result;
449 }
450 result = reply.readInt32();
451 if (result != NO_ERROR) {
452 return result;
453 }
John Reckce8e5df2016-04-28 10:12:47 -0700454 bool hasBuffer = reply.readBool();
455 sp<GraphicBuffer> buffer;
456 if (hasBuffer) {
457 buffer = new GraphicBuffer();
458 result = reply.read(*buffer);
John Reck1a61da52016-04-28 13:18:15 -0700459 if (result == NO_ERROR) {
460 result = reply.read(outTransformMatrix, sizeof(float) * 16);
461 }
John Reckce8e5df2016-04-28 10:12:47 -0700462 }
Dan Stoza50101d02016-04-07 16:53:23 -0700463 if (result != NO_ERROR) {
464 ALOGE("getLastQueuedBuffer failed to read buffer: %d", result);
465 return result;
466 }
467 sp<Fence> fence(new Fence);
468 result = reply.read(*fence);
469 if (result != NO_ERROR) {
470 ALOGE("getLastQueuedBuffer failed to read fence: %d", result);
471 return result;
472 }
473 *outBuffer = buffer;
474 *outFence = fence;
475 return result;
476 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800477
Brian Anderson3890c392016-07-25 12:48:08 -0700478 virtual void getFrameTimestamps(FrameEventHistoryDelta* outDelta) {
Pablo Ceballosce796e72016-02-04 19:10:51 -0800479 Parcel data, reply;
480 status_t result = data.writeInterfaceToken(
481 IGraphicBufferProducer::getInterfaceDescriptor());
482 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700483 ALOGE("IGBP::getFrameTimestamps failed to write token: %d", result);
484 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800485 }
486 result = remote()->transact(GET_FRAME_TIMESTAMPS, data, &reply);
487 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700488 ALOGE("IGBP::getFrameTimestamps failed to transact: %d", result);
489 return;
Pablo Ceballosce796e72016-02-04 19:10:51 -0800490 }
Brian Anderson3890c392016-07-25 12:48:08 -0700491 result = reply.read(*outDelta);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800492 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700493 ALOGE("IGBP::getFrameTimestamps failed to read timestamps: %d",
494 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800495 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800496 }
Pablo Ceballos6155b402016-06-30 17:01:49 -0700497
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -0700498 virtual status_t getUniqueId(uint64_t* outId) const {
499 Parcel data, reply;
500 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
501 status_t result = remote()->transact(GET_UNIQUE_ID, data, &reply);
502 if (result != NO_ERROR) {
503 ALOGE("getUniqueId failed to transact: %d", result);
504 }
505 status_t actualResult = NO_ERROR;
506 result = reply.readInt32(&actualResult);
507 if (result != NO_ERROR) {
508 return result;
509 }
510 result = reply.readUint64(outId);
511 if (result != NO_ERROR) {
512 return result;
513 }
514 return actualResult;
515 }
Chia-I Wue2786ea2017-08-07 10:36:08 -0700516
517 virtual status_t getConsumerUsage(uint64_t* outUsage) const {
518 Parcel data, reply;
519 data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
520 status_t result = remote()->transact(GET_CONSUMER_USAGE, data, &reply);
521 if (result != NO_ERROR) {
522 ALOGE("getConsumerUsage failed to transact: %d", result);
523 }
524 status_t actualResult = NO_ERROR;
525 result = reply.readInt32(&actualResult);
526 if (result != NO_ERROR) {
527 return result;
528 }
529 result = reply.readUint64(outUsage);
530 if (result != NO_ERROR) {
531 return result;
532 }
533 return actualResult;
534 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800535};
536
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800537// Out-of-line virtual method definition to trigger vtable emission in this
538// translation unit (see clang warning -Wweak-vtables)
539BpGraphicBufferProducer::~BpGraphicBufferProducer() {}
540
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800541class HpGraphicBufferProducer : public HpInterface<
Pawin Vongmasae672cd02019-02-14 16:01:29 -0800542 BpGraphicBufferProducer,
543 H2BGraphicBufferProducerV1_0,
544 H2BGraphicBufferProducerV2_0> {
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800545public:
Chih-Hung Hsiehaaf62162018-12-20 15:45:04 -0800546 explicit HpGraphicBufferProducer(const sp<IBinder>& base) : PBase(base) {}
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800547
548 status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) override {
549 return mBase->requestBuffer(slot, buf);
550 }
551
552 status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) override {
553 return mBase->setMaxDequeuedBufferCount(maxDequeuedBuffers);
554 }
555
556 status_t setAsyncMode(bool async) override {
557 return mBase->setAsyncMode(async);
558 }
559
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600560 status_t dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w, uint32_t h, PixelFormat format,
561 uint64_t usage, uint64_t* outBufferAge,
562 FrameEventHistoryDelta* outTimestamps) override {
563 return mBase->dequeueBuffer(slot, fence, w, h, format, usage, outBufferAge, outTimestamps);
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800564 }
565
566 status_t detachBuffer(int slot) override {
567 return mBase->detachBuffer(slot);
568 }
569
570 status_t detachNextBuffer(
571 sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) override {
572 return mBase->detachNextBuffer(outBuffer, outFence);
573 }
574
575 status_t attachBuffer(
576 int* outSlot, const sp<GraphicBuffer>& buffer) override {
577 return mBase->attachBuffer(outSlot, buffer);
578 }
579
580 status_t queueBuffer(
581 int slot,
582 const QueueBufferInput& input,
583 QueueBufferOutput* output) override {
584 return mBase->queueBuffer(slot, input, output);
585 }
586
587 status_t cancelBuffer(int slot, const sp<Fence>& fence) override {
588 return mBase->cancelBuffer(slot, fence);
589 }
590
591 int query(int what, int* value) override {
592 return mBase->query(what, value);
593 }
594
595 status_t connect(
596 const sp<IProducerListener>& listener,
597 int api, bool producerControlledByApp,
598 QueueBufferOutput* output) override {
599 return mBase->connect(listener, api, producerControlledByApp, output);
600 }
601
602 status_t disconnect(
603 int api, DisconnectMode mode = DisconnectMode::Api) override {
604 return mBase->disconnect(api, mode);
605 }
606
607 status_t setSidebandStream(const sp<NativeHandle>& stream) override {
608 return mBase->setSidebandStream(stream);
609 }
610
611 void allocateBuffers(uint32_t width, uint32_t height,
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700612 PixelFormat format, uint64_t usage) override {
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800613 return mBase->allocateBuffers(width, height, format, usage);
614 }
615
616 status_t allowAllocation(bool allow) override {
617 return mBase->allowAllocation(allow);
618 }
619
620 status_t setGenerationNumber(uint32_t generationNumber) override {
621 return mBase->setGenerationNumber(generationNumber);
622 }
623
624 String8 getConsumerName() const override {
625 return mBase->getConsumerName();
626 }
627
628 status_t setSharedBufferMode(bool sharedBufferMode) override {
629 return mBase->setSharedBufferMode(sharedBufferMode);
630 }
631
632 status_t setAutoRefresh(bool autoRefresh) override {
633 return mBase->setAutoRefresh(autoRefresh);
634 }
635
636 status_t setDequeueTimeout(nsecs_t timeout) override {
637 return mBase->setDequeueTimeout(timeout);
638 }
639
640 status_t getLastQueuedBuffer(
641 sp<GraphicBuffer>* outBuffer,
642 sp<Fence>* outFence,
643 float outTransformMatrix[16]) override {
644 return mBase->getLastQueuedBuffer(
645 outBuffer, outFence, outTransformMatrix);
646 }
647
648 void getFrameTimestamps(FrameEventHistoryDelta* outDelta) override {
649 return mBase->getFrameTimestamps(outDelta);
650 }
651
652 status_t getUniqueId(uint64_t* outId) const override {
653 return mBase->getUniqueId(outId);
654 }
Chia-I Wue2786ea2017-08-07 10:36:08 -0700655
656 status_t getConsumerUsage(uint64_t* outUsage) const override {
657 return mBase->getConsumerUsage(outUsage);
658 }
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800659};
660
Pawin Vongmasa338b81d2019-01-31 05:20:07 -0800661IMPLEMENT_HYBRID_META_INTERFACE(GraphicBufferProducer,
Pawin Vongmasa6e1193a2017-03-07 13:08:40 -0800662 "android.gui.IGraphicBufferProducer");
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800663
664// ----------------------------------------------------------------------
665
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -0800666status_t IGraphicBufferProducer::exportToParcel(Parcel* parcel) {
667 status_t res = OK;
668 res = parcel->writeUint32(USE_BUFFER_QUEUE);
669 if (res != NO_ERROR) {
670 ALOGE("exportToParcel: Cannot write magic, res=%d.", res);
671 return res;
672 }
673
674 return parcel->writeStrongBinder(IInterface::asBinder(this));
675}
676
677/* static */
678status_t IGraphicBufferProducer::exportToParcel(const sp<IGraphicBufferProducer>& producer,
679 Parcel* parcel) {
680 if (parcel == nullptr) {
681 ALOGE("exportToParcel: Invalid parcel object.");
682 return BAD_VALUE;
683 }
684
685 if (producer == nullptr) {
686 status_t res = OK;
687 res = parcel->writeUint32(IGraphicBufferProducer::USE_BUFFER_QUEUE);
688 if (res != NO_ERROR) return res;
689 return parcel->writeStrongBinder(nullptr);
690 } else {
691 return producer->exportToParcel(parcel);
692 }
693}
694
695/* static */
696sp<IGraphicBufferProducer> IGraphicBufferProducer::createFromParcel(const Parcel* parcel) {
697 uint32_t outMagic = 0;
698 status_t res = NO_ERROR;
699
700 res = parcel->readUint32(&outMagic);
701 if (res != NO_ERROR) {
702 ALOGE("createFromParcel: Failed to read magic, error=%d.", res);
703 return nullptr;
704 }
705
706 switch (outMagic) {
707 case USE_BUFFER_QUEUE: {
708 sp<IBinder> binder;
709 res = parcel->readNullableStrongBinder(&binder);
710 if (res != NO_ERROR) {
711 ALOGE("createFromParcel: Can't read strong binder.");
712 return nullptr;
713 }
714 return interface_cast<IGraphicBufferProducer>(binder);
715 }
716 case USE_BUFFER_HUB: {
717 ALOGE("createFromParcel: BufferHub not implemented.");
Jiyong Parka75d3d62018-04-09 12:16:30 +0900718#ifndef NO_BUFFERHUB
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -0800719 dvr::ProducerQueueParcelable producerParcelable;
720 res = producerParcelable.readFromParcel(parcel);
721 if (res != NO_ERROR) {
722 ALOGE("createFromParcel: Failed to read from parcel, error=%d", res);
723 return nullptr;
724 }
725 return BufferHubProducer::Create(std::move(producerParcelable));
Jiyong Parka75d3d62018-04-09 12:16:30 +0900726#else
727 return nullptr;
728#endif
Jiwen 'Steve' Caic90a77f2018-01-14 15:42:29 -0800729 }
730 default: {
731 ALOGE("createFromParcel: Unexpected mgaic: 0x%x.", outMagic);
732 return nullptr;
733 }
734 }
735}
736
737// ----------------------------------------------------------------------------
738
Andy McFadden2adaf042012-12-18 09:49:45 -0800739status_t BnGraphicBufferProducer::onTransact(
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800740 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
741{
742 switch(code) {
743 case REQUEST_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800744 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800745 int bufferIdx = data.readInt32();
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700746 sp<GraphicBuffer> buffer;
747 int result = requestBuffer(bufferIdx, &buffer);
Yi Kong48a619f2018-06-05 16:34:59 -0700748 reply->writeInt32(buffer != nullptr);
749 if (buffer != nullptr) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800750 reply->write(*buffer);
751 }
Jamie Gennis7b305ff2011-07-19 12:08:33 -0700752 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800753 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800754 }
Pablo Ceballosfa455352015-08-12 17:47:47 -0700755 case SET_MAX_DEQUEUED_BUFFER_COUNT: {
756 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
757 int maxDequeuedBuffers = data.readInt32();
758 int result = setMaxDequeuedBufferCount(maxDequeuedBuffers);
759 reply->writeInt32(result);
760 return NO_ERROR;
761 }
762 case SET_ASYNC_MODE: {
763 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
764 bool async = data.readInt32();
765 int result = setAsyncMode(async);
766 reply->writeInt32(result);
767 return NO_ERROR;
768 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800769 case DEQUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800770 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800771 uint32_t width = data.readUint32();
772 uint32_t height = data.readUint32();
773 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700774 uint64_t usage = data.readUint64();
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600775 uint64_t bufferAge = 0;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700776 bool getTimestamps = data.readBool();
Brian Andersonbaaad322016-07-22 15:55:13 -0700777
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700778 int buf = 0;
Brian Andersonbaaad322016-07-22 15:55:13 -0700779 sp<Fence> fence = Fence::NO_FENCE;
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700780 FrameEventHistoryDelta frameTimestamps;
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600781 int result = dequeueBuffer(&buf, &fence, width, height, format, usage, &bufferAge,
782 getTimestamps ? &frameTimestamps : nullptr);
Brian Andersonbaaad322016-07-22 15:55:13 -0700783
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800784 reply->writeInt32(buf);
Brian Andersonbaaad322016-07-22 15:55:13 -0700785 reply->write(*fence);
Ian Elliotta2eb34c2017-07-18 11:05:49 -0600786 reply->writeUint64(bufferAge);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700787 if (getTimestamps) {
788 reply->write(frameTimestamps);
789 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800790 reply->writeInt32(result);
791 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800792 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800793 case DETACH_BUFFER: {
794 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
795 int slot = data.readInt32();
796 int result = detachBuffer(slot);
797 reply->writeInt32(result);
798 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800799 }
Dan Stozad9822a32014-03-28 15:25:31 -0700800 case DETACH_NEXT_BUFFER: {
801 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
802 sp<GraphicBuffer> buffer;
803 sp<Fence> fence;
804 int32_t result = detachNextBuffer(&buffer, &fence);
805 reply->writeInt32(result);
806 if (result == NO_ERROR) {
Yi Kong48a619f2018-06-05 16:34:59 -0700807 reply->writeInt32(buffer != nullptr);
808 if (buffer != nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -0700809 reply->write(*buffer);
810 }
Yi Kong48a619f2018-06-05 16:34:59 -0700811 reply->writeInt32(fence != nullptr);
812 if (fence != nullptr) {
Dan Stozad9822a32014-03-28 15:25:31 -0700813 reply->write(*fence);
814 }
815 }
816 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800817 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800818 case ATTACH_BUFFER: {
819 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
820 sp<GraphicBuffer> buffer = new GraphicBuffer();
Pablo Ceballos70636b32016-07-06 15:24:54 -0700821 status_t result = data.read(*buffer.get());
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700822 int slot = 0;
Pablo Ceballos70636b32016-07-06 15:24:54 -0700823 if (result == NO_ERROR) {
824 result = attachBuffer(&slot, buffer);
825 }
Dan Stoza9f3053d2014-03-06 15:14:33 -0800826 reply->writeInt32(slot);
827 reply->writeInt32(result);
828 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800829 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800830 case QUEUE_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800831 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700832
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800833 int buf = data.readInt32();
Jesse Hallc777b0b2012-06-28 12:52:05 -0700834 QueueBufferInput input(data);
Brian Andersonbaaad322016-07-22 15:55:13 -0700835 QueueBufferOutput output;
836 status_t result = queueBuffer(buf, input, &output);
Brian Andersonbaaad322016-07-22 15:55:13 -0700837 reply->write(output);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800838 reply->writeInt32(result);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -0700839
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800840 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800841 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800842 case CANCEL_BUFFER: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800843 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800844 int buf = data.readInt32();
Jamie Gennis1df8c342012-12-20 14:05:45 -0800845 sp<Fence> fence = new Fence();
Pablo Ceballos70636b32016-07-06 15:24:54 -0700846 status_t result = data.read(*fence.get());
847 if (result == NO_ERROR) {
848 result = cancelBuffer(buf, fence);
849 }
Pablo Ceballos583b1b32015-09-03 18:23:52 -0700850 reply->writeInt32(result);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800851 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800852 }
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700853 case QUERY: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800854 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Naveen Leekha12ba0f52015-09-21 17:28:04 -0700855 int value = 0;
Mathias Agopianeafabcd2011-04-20 14:20:59 -0700856 int what = data.readInt32();
857 int res = query(what, &value);
858 reply->writeInt32(value);
859 reply->writeInt32(res);
860 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800861 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700862 case CONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800863 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stozaf0eaf252014-03-21 13:05:51 -0700864 sp<IProducerListener> listener;
865 if (data.readInt32() == 1) {
866 listener = IProducerListener::asInterface(data.readStrongBinder());
867 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700868 int api = data.readInt32();
Mathias Agopian595264f2013-07-16 22:56:09 -0700869 bool producerControlledByApp = data.readInt32();
Brian Andersonbaaad322016-07-22 15:55:13 -0700870 QueueBufferOutput output;
871 status_t res = connect(listener, api, producerControlledByApp, &output);
872 reply->write(output);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700873 reply->writeInt32(res);
874 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800875 }
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700876 case DISCONNECT: {
Andy McFadden2adaf042012-12-18 09:49:45 -0800877 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700878 int api = data.readInt32();
Robert Carr97b9c862016-09-08 13:54:35 -0700879 DisconnectMode mode = static_cast<DisconnectMode>(data.readInt32());
880 status_t res = disconnect(api, mode);
Jamie Gennisfe0a87b2011-07-13 19:12:20 -0700881 reply->writeInt32(res);
882 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800883 }
Jesse Hall399184a2014-03-03 15:42:54 -0800884 case SET_SIDEBAND_STREAM: {
885 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
886 sp<NativeHandle> stream;
887 if (data.readInt32()) {
Wonsik Kim0ec54e12014-03-21 10:46:24 +0900888 stream = NativeHandle::create(data.readNativeHandle(), true);
Jesse Hall399184a2014-03-03 15:42:54 -0800889 }
890 status_t result = setSidebandStream(stream);
891 reply->writeInt32(result);
892 return NO_ERROR;
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800893 }
Dan Stoza9de72932015-04-16 17:28:43 -0700894 case ALLOCATE_BUFFERS: {
Dan Stoza29a3e902014-06-20 13:13:57 -0700895 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Dan Stoza3be1c6b2014-11-18 10:24:03 -0800896 uint32_t width = data.readUint32();
897 uint32_t height = data.readUint32();
898 PixelFormat format = static_cast<PixelFormat>(data.readInt32());
Mathias Agopiancb496ac2017-05-22 14:21:00 -0700899 uint64_t usage = data.readUint64();
Pablo Ceballos567dbbb2015-08-26 18:59:08 -0700900 allocateBuffers(width, height, format, usage);
Dan Stoza29a3e902014-06-20 13:13:57 -0700901 return NO_ERROR;
Dan Stoza9de72932015-04-16 17:28:43 -0700902 }
903 case ALLOW_ALLOCATION: {
904 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
905 bool allow = static_cast<bool>(data.readInt32());
906 status_t result = allowAllocation(allow);
907 reply->writeInt32(result);
908 return NO_ERROR;
909 }
Dan Stoza812ed062015-06-02 15:45:22 -0700910 case SET_GENERATION_NUMBER: {
911 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
912 uint32_t generationNumber = data.readUint32();
913 status_t result = setGenerationNumber(generationNumber);
914 reply->writeInt32(result);
915 return NO_ERROR;
916 }
Dan Stozac6f30bd2015-06-08 09:32:50 -0700917 case GET_CONSUMER_NAME: {
918 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
919 reply->writeString8(getConsumerName());
920 return NO_ERROR;
921 }
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700922 case SET_SHARED_BUFFER_MODE: {
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700923 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Pablo Ceballos3559fbf2016-03-17 15:50:23 -0700924 bool sharedBufferMode = data.readInt32();
925 status_t result = setSharedBufferMode(sharedBufferMode);
Pablo Ceballosccdfd602015-10-07 15:05:45 -0700926 reply->writeInt32(result);
927 return NO_ERROR;
928 }
Pablo Ceballosff95aab2016-01-13 17:09:58 -0800929 case SET_AUTO_REFRESH: {
930 CHECK_INTERFACE(IGraphicBuffer, data, reply);
931 bool autoRefresh = data.readInt32();
932 status_t result = setAutoRefresh(autoRefresh);
933 reply->writeInt32(result);
934 return NO_ERROR;
935 }
Dan Stoza127fc632015-06-30 13:43:32 -0700936 case SET_DEQUEUE_TIMEOUT: {
937 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
938 nsecs_t timeout = data.readInt64();
939 status_t result = setDequeueTimeout(timeout);
940 reply->writeInt32(result);
941 return NO_ERROR;
942 }
Dan Stoza50101d02016-04-07 16:53:23 -0700943 case GET_LAST_QUEUED_BUFFER: {
944 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
945 sp<GraphicBuffer> buffer(nullptr);
946 sp<Fence> fence(Fence::NO_FENCE);
John Reck1a61da52016-04-28 13:18:15 -0700947 float transform[16] = {};
948 status_t result = getLastQueuedBuffer(&buffer, &fence, transform);
Dan Stoza50101d02016-04-07 16:53:23 -0700949 reply->writeInt32(result);
950 if (result != NO_ERROR) {
951 return result;
952 }
John Reckce8e5df2016-04-28 10:12:47 -0700953 if (!buffer.get()) {
954 reply->writeBool(false);
955 } else {
956 reply->writeBool(true);
957 result = reply->write(*buffer);
John Reck1a61da52016-04-28 13:18:15 -0700958 if (result == NO_ERROR) {
959 reply->write(transform, sizeof(float) * 16);
960 }
John Reckce8e5df2016-04-28 10:12:47 -0700961 }
Dan Stoza50101d02016-04-07 16:53:23 -0700962 if (result != NO_ERROR) {
963 ALOGE("getLastQueuedBuffer failed to write buffer: %d", result);
964 return result;
965 }
966 result = reply->write(*fence);
967 if (result != NO_ERROR) {
968 ALOGE("getLastQueuedBuffer failed to write fence: %d", result);
969 return result;
970 }
971 return NO_ERROR;
972 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800973 case GET_FRAME_TIMESTAMPS: {
974 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
Brian Anderson3890c392016-07-25 12:48:08 -0700975 FrameEventHistoryDelta frameTimestamps;
976 getFrameTimestamps(&frameTimestamps);
977 status_t result = reply->write(frameTimestamps);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800978 if (result != NO_ERROR) {
Brian Anderson3890c392016-07-25 12:48:08 -0700979 ALOGE("BnGBP::GET_FRAME_TIMESTAMPS failed to write buffer: %d",
980 result);
Pablo Ceballosce796e72016-02-04 19:10:51 -0800981 return result;
982 }
Pablo Ceballosce796e72016-02-04 19:10:51 -0800983 return NO_ERROR;
984 }
Pablo Ceballos8e3e92b2016-06-27 17:56:53 -0700985 case GET_UNIQUE_ID: {
986 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
987 uint64_t outId = 0;
988 status_t actualResult = getUniqueId(&outId);
989 status_t result = reply->writeInt32(actualResult);
990 if (result != NO_ERROR) {
991 return result;
992 }
993 result = reply->writeUint64(outId);
994 if (result != NO_ERROR) {
995 return result;
996 }
997 return NO_ERROR;
998 }
Chia-I Wue2786ea2017-08-07 10:36:08 -0700999 case GET_CONSUMER_USAGE: {
1000 CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
1001 uint64_t outUsage = 0;
1002 status_t actualResult = getConsumerUsage(&outUsage);
1003 status_t result = reply->writeInt32(actualResult);
1004 if (result != NO_ERROR) {
1005 return result;
1006 }
1007 result = reply->writeUint64(outUsage);
1008 if (result != NO_ERROR) {
1009 return result;
1010 }
1011 return NO_ERROR;
1012 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001013 }
1014 return BBinder::onTransact(code, data, reply, flags);
1015}
1016
1017// ----------------------------------------------------------------------------
1018
Andy McFadden2adaf042012-12-18 09:49:45 -08001019IGraphicBufferProducer::QueueBufferInput::QueueBufferInput(const Parcel& parcel) {
Jesse Hallc777b0b2012-06-28 12:52:05 -07001020 parcel.read(*this);
1021}
1022
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001023constexpr size_t IGraphicBufferProducer::QueueBufferInput::minFlattenedSize() {
1024 return sizeof(timestamp) +
1025 sizeof(isAutoTimestamp) +
1026 sizeof(dataSpace) +
1027 sizeof(crop) +
1028 sizeof(scalingMode) +
1029 sizeof(transform) +
1030 sizeof(stickyTransform) +
1031 sizeof(getFrameTimestamps);
1032}
1033
Mathias Agopiane1424282013-07-29 21:24:40 -07001034size_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const {
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001035 return minFlattenedSize() +
1036 fence->getFlattenedSize() +
Courtney Goeltzenleuchter9bad0d72017-12-19 12:34:34 -07001037 surfaceDamage.getFlattenedSize() +
1038 hdrMetadata.getFlattenedSize();
Jesse Hallc777b0b2012-06-28 12:52:05 -07001039}
1040
Mathias Agopiane1424282013-07-29 21:24:40 -07001041size_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const {
Jamie Gennis1df8c342012-12-20 14:05:45 -08001042 return fence->getFdCount();
Jesse Hallc777b0b2012-06-28 12:52:05 -07001043}
1044
Mathias Agopiane1424282013-07-29 21:24:40 -07001045status_t IGraphicBufferProducer::QueueBufferInput::flatten(
1046 void*& buffer, size_t& size, int*& fds, size_t& count) const
Jesse Hallc777b0b2012-06-28 12:52:05 -07001047{
Mathias Agopiane1424282013-07-29 21:24:40 -07001048 if (size < getFlattenedSize()) {
1049 return NO_MEMORY;
1050 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001051
Mathias Agopiane1424282013-07-29 21:24:40 -07001052 FlattenableUtils::write(buffer, size, timestamp);
Andy McFadden3c256212013-08-16 14:55:39 -07001053 FlattenableUtils::write(buffer, size, isAutoTimestamp);
Eino-Ville Talvala82c6bcc2015-02-19 16:10:43 -08001054 FlattenableUtils::write(buffer, size, dataSpace);
Mathias Agopiane1424282013-07-29 21:24:40 -07001055 FlattenableUtils::write(buffer, size, crop);
1056 FlattenableUtils::write(buffer, size, scalingMode);
1057 FlattenableUtils::write(buffer, size, transform);
Ruben Brunk1681d952014-06-27 15:51:55 -07001058 FlattenableUtils::write(buffer, size, stickyTransform);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001059 FlattenableUtils::write(buffer, size, getFrameTimestamps);
1060
Dan Stoza5065a552015-03-17 16:23:42 -07001061 status_t result = fence->flatten(buffer, size, fds, count);
1062 if (result != NO_ERROR) {
1063 return result;
1064 }
Courtney Goeltzenleuchter9bad0d72017-12-19 12:34:34 -07001065 result = surfaceDamage.flatten(buffer, size);
1066 if (result != NO_ERROR) {
1067 return result;
1068 }
1069 FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize());
1070 return hdrMetadata.flatten(buffer, size);
Jesse Hallc777b0b2012-06-28 12:52:05 -07001071}
1072
Mathias Agopiane1424282013-07-29 21:24:40 -07001073status_t IGraphicBufferProducer::QueueBufferInput::unflatten(
1074 void const*& buffer, size_t& size, int const*& fds, size_t& count)
Jesse Hallc777b0b2012-06-28 12:52:05 -07001075{
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001076 if (size < minFlattenedSize()) {
Mathias Agopiane1424282013-07-29 21:24:40 -07001077 return NO_MEMORY;
1078 }
1079
1080 FlattenableUtils::read(buffer, size, timestamp);
Andy McFadden3c256212013-08-16 14:55:39 -07001081 FlattenableUtils::read(buffer, size, isAutoTimestamp);
Eino-Ville Talvala82c6bcc2015-02-19 16:10:43 -08001082 FlattenableUtils::read(buffer, size, dataSpace);
Mathias Agopiane1424282013-07-29 21:24:40 -07001083 FlattenableUtils::read(buffer, size, crop);
1084 FlattenableUtils::read(buffer, size, scalingMode);
1085 FlattenableUtils::read(buffer, size, transform);
Ruben Brunk1681d952014-06-27 15:51:55 -07001086 FlattenableUtils::read(buffer, size, stickyTransform);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001087 FlattenableUtils::read(buffer, size, getFrameTimestamps);
Mathias Agopiane1424282013-07-29 21:24:40 -07001088
Jamie Gennis1df8c342012-12-20 14:05:45 -08001089 fence = new Fence();
Dan Stoza5065a552015-03-17 16:23:42 -07001090 status_t result = fence->unflatten(buffer, size, fds, count);
1091 if (result != NO_ERROR) {
1092 return result;
1093 }
Courtney Goeltzenleuchter9bad0d72017-12-19 12:34:34 -07001094 result = surfaceDamage.unflatten(buffer, size);
1095 if (result != NO_ERROR) {
1096 return result;
1097 }
1098 FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize());
1099 return hdrMetadata.unflatten(buffer, size);
Jesse Hallc777b0b2012-06-28 12:52:05 -07001100}
1101
Brian Andersonbaaad322016-07-22 15:55:13 -07001102// ----------------------------------------------------------------------------
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001103constexpr size_t IGraphicBufferProducer::QueueBufferOutput::minFlattenedSize() {
1104 return sizeof(width) +
1105 sizeof(height) +
1106 sizeof(transformHint) +
1107 sizeof(numPendingBuffers) +
Shuzhen Wang22f842b2017-01-18 23:02:36 -08001108 sizeof(nextFrameNumber) +
1109 sizeof(bufferReplaced);
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001110}
Brian Andersonbaaad322016-07-22 15:55:13 -07001111
1112size_t IGraphicBufferProducer::QueueBufferOutput::getFlattenedSize() const {
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001113 return minFlattenedSize() + frameTimestamps.getFlattenedSize();
Brian Andersonbaaad322016-07-22 15:55:13 -07001114}
1115
1116size_t IGraphicBufferProducer::QueueBufferOutput::getFdCount() const {
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001117 return frameTimestamps.getFdCount();
Brian Andersonbaaad322016-07-22 15:55:13 -07001118}
1119
1120status_t IGraphicBufferProducer::QueueBufferOutput::flatten(
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001121 void*& buffer, size_t& size, int*& fds, size_t& count) const
Brian Andersonbaaad322016-07-22 15:55:13 -07001122{
1123 if (size < getFlattenedSize()) {
1124 return NO_MEMORY;
1125 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001126
Brian Andersonbaaad322016-07-22 15:55:13 -07001127 FlattenableUtils::write(buffer, size, width);
1128 FlattenableUtils::write(buffer, size, height);
1129 FlattenableUtils::write(buffer, size, transformHint);
1130 FlattenableUtils::write(buffer, size, numPendingBuffers);
1131 FlattenableUtils::write(buffer, size, nextFrameNumber);
Shuzhen Wang22f842b2017-01-18 23:02:36 -08001132 FlattenableUtils::write(buffer, size, bufferReplaced);
Brian Andersonbaaad322016-07-22 15:55:13 -07001133
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001134 return frameTimestamps.flatten(buffer, size, fds, count);
Brian Andersonbaaad322016-07-22 15:55:13 -07001135}
1136
1137status_t IGraphicBufferProducer::QueueBufferOutput::unflatten(
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001138 void const*& buffer, size_t& size, int const*& fds, size_t& count)
Brian Andersonbaaad322016-07-22 15:55:13 -07001139{
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001140 if (size < minFlattenedSize()) {
Brian Andersonbaaad322016-07-22 15:55:13 -07001141 return NO_MEMORY;
1142 }
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001143
Brian Andersonbaaad322016-07-22 15:55:13 -07001144 FlattenableUtils::read(buffer, size, width);
1145 FlattenableUtils::read(buffer, size, height);
1146 FlattenableUtils::read(buffer, size, transformHint);
1147 FlattenableUtils::read(buffer, size, numPendingBuffers);
1148 FlattenableUtils::read(buffer, size, nextFrameNumber);
Shuzhen Wang22f842b2017-01-18 23:02:36 -08001149 FlattenableUtils::read(buffer, size, bufferReplaced);
Brian Andersonbaaad322016-07-22 15:55:13 -07001150
Brian Anderson7c3ba8a2016-07-25 12:48:08 -07001151 return frameTimestamps.unflatten(buffer, size, fds, count);
Brian Andersonbaaad322016-07-22 15:55:13 -07001152}
1153
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001154}; // namespace android