blob: 004d87574aeaf03881a3c3364f8634a516bb3cb7 [file] [log] [blame]
Chong Zhang20288fd2019-03-21 15:15:27 -07001/*
2 * Copyright 2016, 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#ifndef ANDROID_HARDWARE_GRAPHICS_BUFFERQUEUE_V1_0_WGRAPHICBUFFERPRODUCER_H_
18#define ANDROID_HARDWARE_GRAPHICS_BUFFERQUEUE_V1_0_WGRAPHICBUFFERPRODUCER_H_
19
20#include <hidl/MQDescriptor.h>
21#include <hidl/Status.h>
22
23#include <binder/Binder.h>
24#include <gui/IGraphicBufferProducer.h>
25#include <gui/IProducerListener.h>
26#include <gui/bufferqueue/1.0/Conversion.h>
27#include <gui/bufferqueue/1.0/WProducerListener.h>
28#include <system/window.h>
29
30#include <android/hardware/graphics/bufferqueue/1.0/IGraphicBufferProducer.h>
31
32namespace android {
33
34using ::android::hardware::media::V1_0::AnwBuffer;
35using ::android::hidl::base::V1_0::IBase;
36using ::android::hardware::hidl_array;
37using ::android::hardware::hidl_handle;
38using ::android::hardware::hidl_memory;
39using ::android::hardware::hidl_string;
40using ::android::hardware::hidl_vec;
41using ::android::hardware::Return;
42using ::android::hardware::Void;
43using ::android::sp;
44
45typedef ::android::hardware::graphics::bufferqueue::V1_0::
46 IGraphicBufferProducer HGraphicBufferProducer;
47typedef ::android::hardware::graphics::bufferqueue::V1_0::
48 IProducerListener HProducerListener;
49
50typedef ::android::IGraphicBufferProducer BGraphicBufferProducer;
51typedef ::android::IProducerListener BProducerListener;
Chong Zhang20288fd2019-03-21 15:15:27 -070052
53#ifndef LOG
Peiyong Lind8460c82020-07-28 16:04:22 -070054struct LOG_stub {
Chong Zhang20288fd2019-03-21 15:15:27 -070055 template <typename T>
Peiyong Lind8460c82020-07-28 16:04:22 -070056 LOG_stub& operator<<(const T&) {
57 return *this;
58 }
Chong Zhang20288fd2019-03-21 15:15:27 -070059};
60
Peiyong Lind8460c82020-07-28 16:04:22 -070061#define LOG(x) LOG_stub()
Chong Zhang20288fd2019-03-21 15:15:27 -070062#endif
63
64// Instantiate only if HGraphicBufferProducer is base of BASE.
65template <typename BASE,
66 typename = typename std::enable_if<std::is_base_of<HGraphicBufferProducer, BASE>::value>::type>
67struct TWGraphicBufferProducer : public BASE {
68 TWGraphicBufferProducer(sp<BGraphicBufferProducer> const& base) : mBase(base) {}
69 Return<void> requestBuffer(int32_t slot, HGraphicBufferProducer::requestBuffer_cb _hidl_cb) override {
70 sp<GraphicBuffer> buf;
71 status_t status = mBase->requestBuffer(slot, &buf);
Steven Morelanda43df212019-05-07 07:37:23 -070072 AnwBuffer anwBuffer{};
Chong Zhang20288fd2019-03-21 15:15:27 -070073 if (buf != nullptr) {
74 ::android::conversion::wrapAs(&anwBuffer, *buf);
75 }
76 _hidl_cb(static_cast<int32_t>(status), anwBuffer);
77 return Void();
78 }
79
80 Return<int32_t> setMaxDequeuedBufferCount(int32_t maxDequeuedBuffers) override {
81 return static_cast<int32_t>(mBase->setMaxDequeuedBufferCount(
82 static_cast<int>(maxDequeuedBuffers)));
83 }
84
85 Return<int32_t> setAsyncMode(bool async) override {
86 return static_cast<int32_t>(mBase->setAsyncMode(async));
87 }
88
89 Return<void> dequeueBuffer(
90 uint32_t width, uint32_t height,
91 ::android::hardware::graphics::common::V1_0::PixelFormat format, uint32_t usage,
92 bool getFrameTimestamps, HGraphicBufferProducer::dequeueBuffer_cb _hidl_cb) override {
Steven Morelanda43df212019-05-07 07:37:23 -070093 int slot{};
Chong Zhang20288fd2019-03-21 15:15:27 -070094 sp<Fence> fence;
95 ::android::FrameEventHistoryDelta outTimestamps;
96 status_t status = mBase->dequeueBuffer(
97 &slot, &fence, width, height,
98 static_cast<::android::PixelFormat>(format), usage, nullptr,
99 getFrameTimestamps ? &outTimestamps : nullptr);
Steven Morelanda43df212019-05-07 07:37:23 -0700100 hidl_handle tFence{};
101 HGraphicBufferProducer::FrameEventHistoryDelta tOutTimestamps{};
Chong Zhang20288fd2019-03-21 15:15:27 -0700102
103 native_handle_t* nh = nullptr;
104 if ((fence == nullptr) || !::android::conversion::wrapAs(&tFence, &nh, *fence)) {
105 LOG(ERROR) << "TWGraphicBufferProducer::dequeueBuffer - "
106 "Invalid output fence";
107 _hidl_cb(static_cast<int32_t>(status),
108 static_cast<int32_t>(slot),
109 tFence,
110 tOutTimestamps);
111 return Void();
112 }
113 std::vector<std::vector<native_handle_t*> > nhAA;
114 if (getFrameTimestamps && !::android::conversion::wrapAs(&tOutTimestamps, &nhAA, outTimestamps)) {
115 LOG(ERROR) << "TWGraphicBufferProducer::dequeueBuffer - "
116 "Invalid output timestamps";
117 _hidl_cb(static_cast<int32_t>(status),
118 static_cast<int32_t>(slot),
119 tFence,
120 tOutTimestamps);
121 native_handle_delete(nh);
122 return Void();
123 }
124
125 _hidl_cb(static_cast<int32_t>(status),
126 static_cast<int32_t>(slot),
127 tFence,
128 tOutTimestamps);
129 native_handle_delete(nh);
130 if (getFrameTimestamps) {
131 for (auto& nhA : nhAA) {
132 for (auto& handle : nhA) {
133 native_handle_delete(handle);
134 }
135 }
136 }
137 return Void();
138 }
139
140 Return<int32_t> detachBuffer(int32_t slot) override {
141 return static_cast<int32_t>(mBase->detachBuffer(slot));
142 }
143
144 Return<void> detachNextBuffer(HGraphicBufferProducer::detachNextBuffer_cb _hidl_cb) override {
145 sp<GraphicBuffer> outBuffer;
146 sp<Fence> outFence;
147 status_t status = mBase->detachNextBuffer(&outBuffer, &outFence);
Steven Morelanda43df212019-05-07 07:37:23 -0700148 AnwBuffer tBuffer{};
149 hidl_handle tFence{};
Chong Zhang20288fd2019-03-21 15:15:27 -0700150
151 if (outBuffer == nullptr) {
152 LOG(ERROR) << "TWGraphicBufferProducer::detachNextBuffer - "
153 "Invalid output buffer";
154 _hidl_cb(static_cast<int32_t>(status), tBuffer, tFence);
155 return Void();
156 }
157 ::android::conversion::wrapAs(&tBuffer, *outBuffer);
158 native_handle_t* nh = nullptr;
159 if ((outFence != nullptr) && !::android::conversion::wrapAs(&tFence, &nh, *outFence)) {
160 LOG(ERROR) << "TWGraphicBufferProducer::detachNextBuffer - "
161 "Invalid output fence";
162 _hidl_cb(static_cast<int32_t>(status), tBuffer, tFence);
163 return Void();
164 }
165
166 _hidl_cb(static_cast<int32_t>(status), tBuffer, tFence);
167 native_handle_delete(nh);
168 return Void();
169 }
170
171 Return<void> attachBuffer(const AnwBuffer& buffer, HGraphicBufferProducer::attachBuffer_cb _hidl_cb) override {
172 int outSlot;
173 sp<GraphicBuffer> lBuffer = new GraphicBuffer();
174 if (!::android::conversion::convertTo(lBuffer.get(), buffer)) {
175 LOG(ERROR) << "TWGraphicBufferProducer::attachBuffer - "
176 "Invalid input native window buffer";
177 _hidl_cb(static_cast<int32_t>(BAD_VALUE), -1);
178 return Void();
179 }
180 status_t status = mBase->attachBuffer(&outSlot, lBuffer);
181
182 _hidl_cb(static_cast<int32_t>(status), static_cast<int32_t>(outSlot));
183 return Void();
184 }
185
186 Return<void> queueBuffer(
187 int32_t slot, const HGraphicBufferProducer::QueueBufferInput& input,
188 HGraphicBufferProducer::queueBuffer_cb _hidl_cb) override {
Steven Morelanda43df212019-05-07 07:37:23 -0700189 HGraphicBufferProducer::QueueBufferOutput tOutput{};
Chong Zhang20288fd2019-03-21 15:15:27 -0700190 BGraphicBufferProducer::QueueBufferInput lInput(
191 0, false, HAL_DATASPACE_UNKNOWN,
192 ::android::Rect(0, 0, 1, 1),
193 NATIVE_WINDOW_SCALING_MODE_FREEZE,
194 0, ::android::Fence::NO_FENCE);
195 if (!::android::conversion::convertTo(&lInput, input)) {
196 LOG(ERROR) << "TWGraphicBufferProducer::queueBuffer - "
197 "Invalid input";
198 _hidl_cb(static_cast<int32_t>(BAD_VALUE), tOutput);
199 return Void();
200 }
201 BGraphicBufferProducer::QueueBufferOutput lOutput;
202 status_t status = mBase->queueBuffer(
203 static_cast<int>(slot), lInput, &lOutput);
204
205 std::vector<std::vector<native_handle_t*> > nhAA;
206 if (!::android::conversion::wrapAs(&tOutput, &nhAA, lOutput)) {
207 LOG(ERROR) << "TWGraphicBufferProducer::queueBuffer - "
208 "Invalid output";
209 _hidl_cb(static_cast<int32_t>(BAD_VALUE), tOutput);
210 return Void();
211 }
212
213 _hidl_cb(static_cast<int32_t>(status), tOutput);
214 for (auto& nhA : nhAA) {
215 for (auto& nh : nhA) {
216 native_handle_delete(nh);
217 }
218 }
219 return Void();
220 }
221
222 Return<int32_t> cancelBuffer(int32_t slot, const hidl_handle& fence) override {
223 sp<Fence> lFence = new Fence();
224 if (!::android::conversion::convertTo(lFence.get(), fence)) {
225 LOG(ERROR) << "TWGraphicBufferProducer::cancelBuffer - "
226 "Invalid input fence";
227 return static_cast<int32_t>(BAD_VALUE);
228 }
229 return static_cast<int32_t>(mBase->cancelBuffer(static_cast<int>(slot), lFence));
230 }
231
232 Return<void> query(int32_t what, HGraphicBufferProducer::query_cb _hidl_cb) override {
233 int lValue;
234 int lReturn = mBase->query(static_cast<int>(what), &lValue);
235 _hidl_cb(static_cast<int32_t>(lReturn), static_cast<int32_t>(lValue));
236 return Void();
237 }
238
239 Return<void> connect(const sp<HProducerListener>& listener,
240 int32_t api, bool producerControlledByApp,
241 HGraphicBufferProducer::connect_cb _hidl_cb) override {
242 sp<BProducerListener> lListener = listener == nullptr ?
243 nullptr : new LWProducerListener(listener);
244 BGraphicBufferProducer::QueueBufferOutput lOutput;
245 status_t status = mBase->connect(lListener,
246 static_cast<int>(api),
247 producerControlledByApp,
248 &lOutput);
249
Steven Morelanda43df212019-05-07 07:37:23 -0700250 HGraphicBufferProducer::QueueBufferOutput tOutput{};
Chong Zhang20288fd2019-03-21 15:15:27 -0700251 std::vector<std::vector<native_handle_t*> > nhAA;
252 if (!::android::conversion::wrapAs(&tOutput, &nhAA, lOutput)) {
253 LOG(ERROR) << "TWGraphicBufferProducer::connect - "
254 "Invalid output";
255 _hidl_cb(static_cast<int32_t>(status), tOutput);
256 return Void();
257 }
258
259 _hidl_cb(static_cast<int32_t>(status), tOutput);
260 for (auto& nhA : nhAA) {
261 for (auto& nh : nhA) {
262 native_handle_delete(nh);
263 }
264 }
265 return Void();
266 }
267
268 Return<int32_t> disconnect(
269 int32_t api,
270 HGraphicBufferProducer::DisconnectMode mode) override {
271 return static_cast<int32_t>(mBase->disconnect(
272 static_cast<int>(api),
273 ::android::conversion::toGuiDisconnectMode(mode)));
274 }
275
276 Return<int32_t> setSidebandStream(const hidl_handle& stream) override {
277 return static_cast<int32_t>(mBase->setSidebandStream(NativeHandle::create(
278 stream ? native_handle_clone(stream) : NULL, true)));
279 }
280
281 Return<void> allocateBuffers(
282 uint32_t width, uint32_t height,
283 ::android::hardware::graphics::common::V1_0::PixelFormat format,
284 uint32_t usage) override {
285 mBase->allocateBuffers(
286 width, height,
287 static_cast<::android::PixelFormat>(format),
288 usage);
289 return Void();
290 }
291
292 Return<int32_t> allowAllocation(bool allow) override {
293 return static_cast<int32_t>(mBase->allowAllocation(allow));
294 }
295
296 Return<int32_t> setGenerationNumber(uint32_t generationNumber) override {
297 return static_cast<int32_t>(mBase->setGenerationNumber(generationNumber));
298 }
299
300 Return<void> getConsumerName(HGraphicBufferProducer::getConsumerName_cb _hidl_cb) override {
301 _hidl_cb(mBase->getConsumerName().string());
302 return Void();
303 }
304
305 Return<int32_t> setSharedBufferMode(bool sharedBufferMode) override {
306 return static_cast<int32_t>(mBase->setSharedBufferMode(sharedBufferMode));
307 }
308
309 Return<int32_t> setAutoRefresh(bool autoRefresh) override {
310 return static_cast<int32_t>(mBase->setAutoRefresh(autoRefresh));
311 }
312
313 Return<int32_t> setDequeueTimeout(int64_t timeoutNs) override {
314 return static_cast<int32_t>(mBase->setDequeueTimeout(timeoutNs));
315 }
316
317 Return<void> getLastQueuedBuffer(HGraphicBufferProducer::getLastQueuedBuffer_cb _hidl_cb) override {
318 sp<GraphicBuffer> lOutBuffer = new GraphicBuffer();
319 sp<Fence> lOutFence = new Fence();
320 float lOutTransformMatrix[16];
321 status_t status = mBase->getLastQueuedBuffer(
322 &lOutBuffer, &lOutFence, lOutTransformMatrix);
323
Steven Morelanda43df212019-05-07 07:37:23 -0700324 AnwBuffer tOutBuffer{};
Chong Zhang20288fd2019-03-21 15:15:27 -0700325 if (lOutBuffer != nullptr) {
326 ::android::conversion::wrapAs(&tOutBuffer, *lOutBuffer);
327 }
Steven Morelanda43df212019-05-07 07:37:23 -0700328 hidl_handle tOutFence{};
Chong Zhang20288fd2019-03-21 15:15:27 -0700329 native_handle_t* nh = nullptr;
330 if ((lOutFence == nullptr) || !::android::conversion::wrapAs(&tOutFence, &nh, *lOutFence)) {
331 LOG(ERROR) << "TWGraphicBufferProducer::getLastQueuedBuffer - "
332 "Invalid output fence";
333 _hidl_cb(static_cast<int32_t>(status),
334 tOutBuffer,
335 tOutFence,
336 hidl_array<float, 16>());
337 return Void();
338 }
339 hidl_array<float, 16> tOutTransformMatrix(lOutTransformMatrix);
340
341 _hidl_cb(static_cast<int32_t>(status), tOutBuffer, tOutFence, tOutTransformMatrix);
342 native_handle_delete(nh);
343 return Void();
344 }
345
346 Return<void> getFrameTimestamps(HGraphicBufferProducer::getFrameTimestamps_cb _hidl_cb) override {
347 ::android::FrameEventHistoryDelta lDelta;
348 mBase->getFrameTimestamps(&lDelta);
349
Steven Morelanda43df212019-05-07 07:37:23 -0700350 HGraphicBufferProducer::FrameEventHistoryDelta tDelta{};
Chong Zhang20288fd2019-03-21 15:15:27 -0700351 std::vector<std::vector<native_handle_t*> > nhAA;
352 if (!::android::conversion::wrapAs(&tDelta, &nhAA, lDelta)) {
353 LOG(ERROR) << "TWGraphicBufferProducer::getFrameTimestamps - "
354 "Invalid output frame timestamps";
355 _hidl_cb(tDelta);
356 return Void();
357 }
358
359 _hidl_cb(tDelta);
360 for (auto& nhA : nhAA) {
361 for (auto& nh : nhA) {
362 native_handle_delete(nh);
363 }
364 }
365 return Void();
366 }
367
368 Return<void> getUniqueId(HGraphicBufferProducer::getUniqueId_cb _hidl_cb) override {
Steven Morelanda43df212019-05-07 07:37:23 -0700369 uint64_t outId{};
Chong Zhang20288fd2019-03-21 15:15:27 -0700370 status_t status = mBase->getUniqueId(&outId);
371 _hidl_cb(static_cast<int32_t>(status), outId);
372 return Void();
373 }
374
375private:
376 sp<BGraphicBufferProducer> mBase;
377};
378
379} // namespace android
380
381#endif // ANDROID_HARDWARE_GRAPHICS_BUFFERQUEUE_V1_0_WGRAPHICBUFFERPRODUCER_H_