1 /*
2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "native_window.h"
17
18 #include <cstdint>
19 #include <map>
20 #include <cinttypes>
21 #include <securec.h>
22 #include "buffer_log.h"
23 #include "window.h"
24 #include "surface_type.h"
25 #include "surface_utils.h"
26 #include "sync_fence.h"
27 #include "ipc_inner_object.h"
28 #include "external_window.h"
29 #include "hebc_white_list.h"
30 #include "metadata_helper.h"
31
32 #ifndef WEAK_ALIAS
33 #define WEAK_ALIAS(old, new) \
34 extern __typeof(old) new __attribute__((__weak__, __alias__(#old)))
35 #endif
36
37 using namespace OHOS;
38 using namespace HDI::Display::Graphic::Common::V1_0;
39 static std::unordered_map<OH_NativeBuffer_ColorSpace, CM_ColorSpaceType> NATIVE_COLORSPACE_TO_HDI_MAP = {
40 {OH_COLORSPACE_NONE, CM_COLORSPACE_NONE},
41 {OH_COLORSPACE_BT601_EBU_FULL, CM_BT601_EBU_FULL},
42 {OH_COLORSPACE_BT601_SMPTE_C_FULL, CM_BT601_SMPTE_C_FULL},
43 {OH_COLORSPACE_BT709_FULL, CM_BT709_FULL},
44 {OH_COLORSPACE_BT2020_HLG_FULL, CM_BT2020_HLG_FULL},
45 {OH_COLORSPACE_BT2020_PQ_FULL, CM_BT2020_PQ_FULL},
46 {OH_COLORSPACE_BT601_EBU_LIMIT, CM_BT601_EBU_LIMIT},
47 {OH_COLORSPACE_BT601_SMPTE_C_LIMIT, CM_BT601_SMPTE_C_LIMIT},
48 {OH_COLORSPACE_BT709_LIMIT, CM_BT709_LIMIT},
49 {OH_COLORSPACE_BT2020_HLG_LIMIT, CM_BT2020_HLG_LIMIT},
50 {OH_COLORSPACE_BT2020_PQ_LIMIT, CM_BT2020_PQ_LIMIT},
51 {OH_COLORSPACE_SRGB_FULL, CM_SRGB_FULL},
52 {OH_COLORSPACE_P3_FULL, CM_P3_FULL},
53 {OH_COLORSPACE_P3_HLG_FULL, CM_P3_HLG_FULL},
54 {OH_COLORSPACE_P3_PQ_FULL, CM_P3_PQ_FULL},
55 {OH_COLORSPACE_ADOBERGB_FULL, CM_ADOBERGB_FULL},
56 {OH_COLORSPACE_SRGB_LIMIT, CM_SRGB_LIMIT},
57 {OH_COLORSPACE_P3_LIMIT, CM_P3_LIMIT},
58 {OH_COLORSPACE_P3_HLG_LIMIT, CM_P3_HLG_LIMIT},
59 {OH_COLORSPACE_P3_PQ_LIMIT, CM_P3_PQ_LIMIT},
60 {OH_COLORSPACE_ADOBERGB_LIMIT, CM_ADOBERGB_LIMIT},
61 {OH_COLORSPACE_LINEAR_SRGB, CM_LINEAR_SRGB},
62 {OH_COLORSPACE_LINEAR_BT709, CM_LINEAR_BT709},
63 {OH_COLORSPACE_LINEAR_P3, CM_LINEAR_P3},
64 {OH_COLORSPACE_LINEAR_BT2020, CM_LINEAR_BT2020},
65 {OH_COLORSPACE_DISPLAY_SRGB, CM_DISPLAY_SRGB},
66 {OH_COLORSPACE_DISPLAY_P3_SRGB, CM_DISPLAY_P3_SRGB},
67 {OH_COLORSPACE_DISPLAY_P3_HLG, CM_DISPLAY_P3_HLG},
68 {OH_COLORSPACE_DISPLAY_P3_PQ, CM_DISPLAY_P3_PQ},
69 {OH_COLORSPACE_DISPLAY_BT2020_SRGB, CM_DISPLAY_BT2020_SRGB},
70 {OH_COLORSPACE_DISPLAY_BT2020_HLG, CM_DISPLAY_BT2020_HLG},
71 {OH_COLORSPACE_DISPLAY_BT2020_PQ, CM_DISPLAY_BT2020_PQ}
72 };
73
74 static std::unordered_map<OH_NativeBuffer_MetadataType, CM_HDR_Metadata_Type> NATIVE_METADATATYPE_TO_HDI_MAP = {
75 {OH_VIDEO_HDR_HLG, CM_VIDEO_HLG},
76 {OH_VIDEO_HDR_HDR10, CM_VIDEO_HDR10},
77 {OH_VIDEO_HDR_VIVID, CM_VIDEO_HDR_VIVID},
78 };
79
80 namespace {
81 constexpr int32_t INVALID_PARAM = -1;
82 constexpr int32_t META_DATA_MAX_SIZE = 3000;
83 constexpr int32_t DAMAGES_MAX_SIZE = 1000;
84 constexpr int32_t MAXIMUM_LENGTH_OF_APP_FRAMEWORK = 64;
85 }
86
CreateNativeWindowFromSurface(void * pSurface)87 OHNativeWindow* CreateNativeWindowFromSurface(void* pSurface)
88 {
89 if (pSurface == nullptr) {
90 return nullptr;
91 }
92
93 OHNativeWindow* nativeWindow = new OHNativeWindow();
94 nativeWindow->surface =
95 *reinterpret_cast<OHOS::sptr<OHOS::Surface> *>(pSurface);
96 if (nativeWindow->surface == nullptr) {
97 BLOGE("window surface is null");
98 delete nativeWindow;
99 return nullptr;
100 }
101 OHOS::BufferRequestConfig windowConfig;
102 windowConfig.width = nativeWindow->surface->GetDefaultWidth();
103 windowConfig.height = nativeWindow->surface->GetDefaultHeight();
104 windowConfig.usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_MEM_DMA;
105 windowConfig.format = GRAPHIC_PIXEL_FMT_RGBA_8888;
106 windowConfig.strideAlignment = 8; // default stride is 8
107 windowConfig.timeout = 3000; // default timeout is 3000 ms
108 windowConfig.colorGamut = GraphicColorGamut::GRAPHIC_COLOR_GAMUT_SRGB;
109 windowConfig.transform = GraphicTransformType::GRAPHIC_ROTATE_NONE;
110
111 // if the application is in the hebc list, remove BUFFER_USAGE_CPU_READ flag
112 if (nativeWindow->surface->IsInHebcList()) {
113 windowConfig.usage &= ~BUFFER_USAGE_CPU_READ;
114 }
115 nativeWindow->surface->SetWindowConfig(windowConfig);
116
117 NativeObjectReference(nativeWindow);
118 auto utils = SurfaceUtils::GetInstance();
119 utils->AddNativeWindow(nativeWindow->surface->GetUniqueId(), nativeWindow);
120 nativeWindow->surface->SetWptrNativeWindowToPSurface(nativeWindow);
121 return nativeWindow;
122 }
123
DestoryNativeWindow(OHNativeWindow * window)124 void DestoryNativeWindow(OHNativeWindow *window)
125 {
126 if (window == nullptr) {
127 return;
128 }
129 // unreference nativewindow object
130 NativeObjectUnreference(window);
131 }
132
CreateNativeWindowBufferFromSurfaceBuffer(void * pSurfaceBuffer)133 OHNativeWindowBuffer* CreateNativeWindowBufferFromSurfaceBuffer(void* pSurfaceBuffer)
134 {
135 if (pSurfaceBuffer == nullptr) {
136 return nullptr;
137 }
138 OHNativeWindowBuffer *nwBuffer = new OHNativeWindowBuffer();
139 nwBuffer->sfbuffer = *reinterpret_cast<OHOS::sptr<OHOS::SurfaceBuffer> *>(pSurfaceBuffer);
140 NativeObjectReference(nwBuffer);
141 return nwBuffer;
142 }
143
CreateNativeWindowBufferFromNativeBuffer(OH_NativeBuffer * nativeBuffer)144 OHNativeWindowBuffer* CreateNativeWindowBufferFromNativeBuffer(OH_NativeBuffer* nativeBuffer)
145 {
146 if (nativeBuffer == nullptr) {
147 return nullptr;
148 }
149 OHNativeWindowBuffer *nwBuffer = new OHNativeWindowBuffer();
150 OHOS::sptr<OHOS::SurfaceBuffer> surfaceBuffer(reinterpret_cast<OHOS::SurfaceBuffer *>(nativeBuffer));
151 nwBuffer->sfbuffer = surfaceBuffer;
152
153 NativeObjectReference(nwBuffer);
154 return nwBuffer;
155 }
156
DestroyNativeWindowBuffer(OHNativeWindowBuffer * buffer)157 void DestroyNativeWindowBuffer(OHNativeWindowBuffer* buffer)
158 {
159 if (buffer == nullptr) {
160 return;
161 }
162 NativeObjectUnreference(buffer);
163 }
164
NativeWindowRequestBuffer(OHNativeWindow * window,OHNativeWindowBuffer ** buffer,int * fenceFd)165 int32_t NativeWindowRequestBuffer(OHNativeWindow *window,
166 OHNativeWindowBuffer **buffer, int *fenceFd)
167 {
168 if (window == nullptr || buffer == nullptr || fenceFd == nullptr) {
169 return OHOS::SURFACE_ERROR_INVALID_PARAM;
170 }
171 OHOS::sptr<OHOS::SurfaceBuffer> sfbuffer;
172 OHOS::sptr<OHOS::SyncFence> releaseFence = OHOS::SyncFence::InvalidFence();
173 BLOGE_CHECK_AND_RETURN_RET(window->surface != nullptr, SURFACE_ERROR_ERROR, "window surface is null");
174 int32_t ret;
175 int32_t requestWidth = window->surface->GetRequestWidth();
176 int32_t requestHeight = window->surface->GetRequestHeight();
177 OHOS::BufferRequestConfig windowConfig = window->surface->GetWindowConfig();
178 if (requestWidth != 0 && requestHeight != 0) {
179 OHOS::BufferRequestConfig config = windowConfig;
180 config.width = requestWidth;
181 config.height = requestHeight;
182 ret = window->surface->RequestBuffer(sfbuffer, releaseFence, config);
183 } else {
184 ret = window->surface->RequestBuffer(sfbuffer, releaseFence, windowConfig);
185 }
186 if (ret != OHOS::GSError::SURFACE_ERROR_OK || sfbuffer == nullptr) {
187 BLOGE("RequestBuffer ret:%{public}d, uniqueId: %{public}" PRIu64 ".",
188 ret, window->surface->GetUniqueId());
189 return ret;
190 }
191 uint32_t seqNum = sfbuffer->GetSeqNum();
192 {
193 std::lock_guard<std::mutex> lockGuard(window->mutex_);
194 auto iter = window->bufferCache_.find(seqNum);
195 if (iter == window->bufferCache_.end()) {
196 OHNativeWindowBuffer *nwBuffer = new OHNativeWindowBuffer();
197 nwBuffer->sfbuffer = sfbuffer;
198 nwBuffer->uiTimestamp = window->uiTimestamp;
199 *buffer = nwBuffer;
200 // Add to cache
201 NativeObjectReference(nwBuffer);
202 window->bufferCache_[seqNum] = nwBuffer;
203 } else {
204 *buffer = iter->second;
205 (*buffer)->uiTimestamp = window->uiTimestamp;
206 }
207 }
208 *fenceFd = releaseFence->Dup();
209 return OHOS::SURFACE_ERROR_OK;
210 }
211
NativeWindowFlushBuffer(OHNativeWindow * window,OHNativeWindowBuffer * buffer,int fenceFd,struct Region region)212 int32_t NativeWindowFlushBuffer(OHNativeWindow *window, OHNativeWindowBuffer *buffer,
213 int fenceFd, struct Region region)
214 {
215 if (window == nullptr || buffer == nullptr || window->surface == nullptr) {
216 if (fenceFd >= 0) {
217 close(fenceFd);
218 }
219 return OHOS::SURFACE_ERROR_INVALID_PARAM;
220 }
221
222 OHOS::BufferFlushConfigWithDamages config;
223 if ((region.rectNumber <= DAMAGES_MAX_SIZE) && (region.rectNumber > 0) && (region.rects != nullptr)) {
224 config.damages.reserve(region.rectNumber);
225 for (int32_t i = 0; i < region.rectNumber; i++) {
226 OHOS::Rect damage = {
227 .x = region.rects[i].x,
228 .y = region.rects[i].y,
229 .w = static_cast<int32_t>(region.rects[i].w),
230 .h = static_cast<int32_t>(region.rects[i].h),
231 };
232 config.damages.emplace_back(damage);
233 }
234 config.timestamp = buffer->uiTimestamp;
235 } else {
236 OHOS::BufferRequestConfig windowConfig = window->surface->GetWindowConfig();
237 config.damages.reserve(1);
238 OHOS::Rect damage = {.x = 0, .y = 0, .w = windowConfig.width, .h = windowConfig.height};
239 config.damages.emplace_back(damage);
240 config.timestamp = buffer->uiTimestamp;
241 }
242 config.desiredPresentTimestamp = window->desiredPresentTimestamp;
243 OHOS::sptr<OHOS::SyncFence> acquireFence = new OHOS::SyncFence(fenceFd);
244 int32_t ret = window->surface->FlushBuffer(buffer->sfbuffer, acquireFence, config);
245 if (ret != OHOS::GSError::SURFACE_ERROR_OK) {
246 BLOGE("FlushBuffer failed, ret:%{public}d, uniqueId: %{public}" PRIu64 ".",
247 ret, window->surface->GetUniqueId());
248 return ret;
249 }
250
251 {
252 std::lock_guard<std::mutex> lockGuard(window->mutex_);
253 auto it = std::find_if(window->bufferCache_.begin(), window->bufferCache_.end(),
254 [buffer](const std::pair<uint32_t, NativeWindowBuffer*>& element) {
255 return element.second == buffer;
256 });
257 if (it != window->bufferCache_.end()) {
258 window->lastBufferSeqNum = it->first;
259 }
260 }
261
262 return OHOS::SURFACE_ERROR_OK;
263 }
264
GetLastFlushedBuffer(OHNativeWindow * window,OHNativeWindowBuffer ** buffer,int * fenceFd,float matrix[16])265 int32_t GetLastFlushedBuffer(OHNativeWindow *window, OHNativeWindowBuffer **buffer, int *fenceFd, float matrix[16])
266 {
267 if (window == nullptr || buffer == nullptr || window->surface == nullptr || fenceFd == nullptr) {
268 return OHOS::SURFACE_ERROR_INVALID_PARAM;
269 }
270 OHNativeWindowBuffer *nwBuffer = new OHNativeWindowBuffer();
271 OHOS::sptr<OHOS::SyncFence> acquireFence = OHOS::SyncFence::InvalidFence();
272 int32_t ret = window->surface->GetLastFlushedBuffer(nwBuffer->sfbuffer, acquireFence, matrix, false);
273 if (ret != OHOS::GSError::SURFACE_ERROR_OK || nwBuffer->sfbuffer == nullptr) {
274 BLOGE("GetLastFlushedBuffer fail, uniqueId: %{public}" PRIu64 ".", window->surface->GetUniqueId());
275 delete nwBuffer;
276 nwBuffer = nullptr;
277 return ret;
278 }
279 *buffer = nwBuffer;
280 NativeObjectReference(nwBuffer);
281 *fenceFd = acquireFence->Dup();
282 return OHOS::SURFACE_ERROR_OK;
283 }
284
NativeWindowAttachBuffer(OHNativeWindow * window,OHNativeWindowBuffer * buffer)285 int32_t NativeWindowAttachBuffer(OHNativeWindow *window, OHNativeWindowBuffer *buffer)
286 {
287 if (window == nullptr || buffer == nullptr) {
288 return OHOS::SURFACE_ERROR_INVALID_PARAM;
289 }
290 BLOGE_CHECK_AND_RETURN_RET(window->surface != nullptr, SURFACE_ERROR_INVALID_PARAM, "window surface is null");
291 return window->surface->AttachBufferToQueue(buffer->sfbuffer);
292 }
293
NativeWindowDetachBuffer(OHNativeWindow * window,OHNativeWindowBuffer * buffer)294 int32_t NativeWindowDetachBuffer(OHNativeWindow *window, OHNativeWindowBuffer *buffer)
295 {
296 if (window == nullptr || buffer == nullptr) {
297 return OHOS::SURFACE_ERROR_INVALID_PARAM;
298 }
299 BLOGE_CHECK_AND_RETURN_RET(window->surface != nullptr, SURFACE_ERROR_INVALID_PARAM, "window surface is null");
300 return window->surface->DetachBufferFromQueue(buffer->sfbuffer);
301 }
302
NativeWindowCancelBuffer(OHNativeWindow * window,OHNativeWindowBuffer * buffer)303 int32_t NativeWindowCancelBuffer(OHNativeWindow *window, OHNativeWindowBuffer *buffer)
304 {
305 if (window == nullptr || buffer == nullptr) {
306 return OHOS::SURFACE_ERROR_INVALID_PARAM;
307 }
308 BLOGE_CHECK_AND_RETURN_RET(window->surface != nullptr, SURFACE_ERROR_INVALID_PARAM, "window surface is null");
309 window->surface->CancelBuffer(buffer->sfbuffer);
310 return OHOS::SURFACE_ERROR_OK;
311 }
312
HandleNativeWindowSetUsage(OHNativeWindow * window,va_list args)313 static void HandleNativeWindowSetUsage(OHNativeWindow *window, va_list args)
314 {
315 uint64_t usage = va_arg(args, uint64_t);
316 window->surface->SetWindowConfigUsage(usage);
317 }
318
HandleNativeWindowSetBufferGeometry(OHNativeWindow * window,va_list args)319 static void HandleNativeWindowSetBufferGeometry(OHNativeWindow *window, va_list args)
320 {
321 int32_t width = va_arg(args, int32_t);
322 int32_t height = va_arg(args, int32_t);
323 window->surface->SetWindowConfigWidthAndHeight(width, height);
324 }
325
HandleNativeWindowSetFormat(OHNativeWindow * window,va_list args)326 static void HandleNativeWindowSetFormat(OHNativeWindow *window, va_list args)
327 {
328 int32_t format = va_arg(args, int32_t);
329 window->surface->SetWindowConfigFormat(format);
330 }
331
HandleNativeWindowSetStride(OHNativeWindow * window,va_list args)332 static void HandleNativeWindowSetStride(OHNativeWindow *window, va_list args)
333 {
334 int32_t stride = va_arg(args, int32_t);
335 window->surface->SetWindowConfigStride(stride);
336 }
337
HandleNativeWindowSetTimeout(OHNativeWindow * window,va_list args)338 static void HandleNativeWindowSetTimeout(OHNativeWindow *window, va_list args)
339 {
340 int32_t timeout = va_arg(args, int32_t);
341 window->surface->SetWindowConfigTimeout(timeout);
342 }
343
HandleNativeWindowSetColorGamut(OHNativeWindow * window,va_list args)344 static void HandleNativeWindowSetColorGamut(OHNativeWindow *window, va_list args)
345 {
346 int32_t colorGamut = va_arg(args, int32_t);
347 window->surface->SetWindowConfigColorGamut(static_cast<GraphicColorGamut>(colorGamut));
348 }
349
HandleNativeWindowSetTransform(OHNativeWindow * window,va_list args)350 static void HandleNativeWindowSetTransform(OHNativeWindow *window, va_list args)
351 {
352 int32_t transform = va_arg(args, int32_t);
353 window->surface->SetTransform(static_cast<GraphicTransformType>(transform));
354 window->surface->SetWindowConfigTransform(static_cast<GraphicTransformType>(transform));
355 }
356
HandleNativeWindowSetUiTimestamp(OHNativeWindow * window,va_list args)357 static void HandleNativeWindowSetUiTimestamp(OHNativeWindow *window, va_list args)
358 {
359 uint64_t uiTimestamp = va_arg(args, uint64_t);
360 window->uiTimestamp = static_cast<int64_t>(uiTimestamp);
361 }
362
HandleNativeWindowSetDesiredPresentTimestamp(OHNativeWindow * window,va_list args)363 static void HandleNativeWindowSetDesiredPresentTimestamp(OHNativeWindow *window, va_list args)
364 {
365 int64_t desiredPresentTimestamp = va_arg(args, int64_t);
366 window->desiredPresentTimestamp = desiredPresentTimestamp;
367 }
368
HandleNativeWindowSetSurfaceSourceType(OHNativeWindow * window,va_list args)369 static void HandleNativeWindowSetSurfaceSourceType(OHNativeWindow *window, va_list args)
370 {
371 OHSurfaceSource sourceType = va_arg(args, OHSurfaceSource);
372 window->surface->SetSurfaceSourceType(sourceType);
373 }
374
HandleNativeWindowSetSurfaceAppFrameworkType(OHNativeWindow * window,va_list args)375 static void HandleNativeWindowSetSurfaceAppFrameworkType(OHNativeWindow *window, va_list args)
376 {
377 char* appFrameworkType = va_arg(args, char*);
378 if (appFrameworkType != nullptr) {
379 std::string typeStr(appFrameworkType);
380 window->surface->SetSurfaceAppFrameworkType(typeStr);
381 }
382 }
383
HandleNativeWindowGetUsage(OHNativeWindow * window,va_list args)384 static void HandleNativeWindowGetUsage(OHNativeWindow *window, va_list args)
385 {
386 uint64_t *value = va_arg(args, uint64_t*);
387 if (value != nullptr) {
388 OHOS::BufferRequestConfig windowConfig = window->surface->GetWindowConfig();
389 *value = static_cast<uint64_t>(windowConfig.usage);
390 }
391 }
392
HandleNativeWindowGetBufferGeometry(OHNativeWindow * window,va_list args)393 static void HandleNativeWindowGetBufferGeometry(OHNativeWindow *window, va_list args)
394 {
395 int32_t *height = va_arg(args, int32_t*);
396 int32_t *width = va_arg(args, int32_t*);
397 if (height != nullptr && width != nullptr) {
398 OHOS::BufferRequestConfig windowConfig = window->surface->GetWindowConfig();
399 *height = windowConfig.height;
400 *width = windowConfig.width;
401 }
402 }
403
HandleNativeWindowGetFormat(OHNativeWindow * window,va_list args)404 static void HandleNativeWindowGetFormat(OHNativeWindow *window, va_list args)
405 {
406 int32_t *format = va_arg(args, int32_t*);
407 if (format != nullptr) {
408 OHOS::BufferRequestConfig windowConfig = window->surface->GetWindowConfig();
409 *format = windowConfig.format;
410 }
411 }
412
HandleNativeWindowGetStride(OHNativeWindow * window,va_list args)413 static void HandleNativeWindowGetStride(OHNativeWindow *window, va_list args)
414 {
415 int32_t *stride = va_arg(args, int32_t*);
416 if (stride != nullptr) {
417 OHOS::BufferRequestConfig windowConfig = window->surface->GetWindowConfig();
418 *stride = windowConfig.strideAlignment;
419 }
420 }
421
HandleNativeWindowGetTimeout(OHNativeWindow * window,va_list args)422 static void HandleNativeWindowGetTimeout(OHNativeWindow *window, va_list args)
423 {
424 int32_t *timeout = va_arg(args, int32_t*);
425 if (timeout != nullptr) {
426 OHOS::BufferRequestConfig windowConfig = window->surface->GetWindowConfig();
427 *timeout = windowConfig.timeout;
428 }
429 }
430
HandleNativeWindowGetColorGamut(OHNativeWindow * window,va_list args)431 static void HandleNativeWindowGetColorGamut(OHNativeWindow *window, va_list args)
432 {
433 int32_t *colorGamut = va_arg(args, int32_t*);
434 if (colorGamut != nullptr) {
435 OHOS::BufferRequestConfig windowConfig = window->surface->GetWindowConfig();
436 *colorGamut = static_cast<int32_t>(windowConfig.colorGamut);
437 }
438 }
439
HandleNativeWindowGetTransform(OHNativeWindow * window,va_list args)440 static void HandleNativeWindowGetTransform(OHNativeWindow *window, va_list args)
441 {
442 int32_t *transform = va_arg(args, int32_t*);
443 if (transform != nullptr) {
444 *transform = static_cast<int32_t>(window->surface->GetTransform());
445 }
446 }
447
HandleNativeWindowGetBufferQueueSize(OHNativeWindow * window,va_list args)448 static void HandleNativeWindowGetBufferQueueSize(OHNativeWindow *window, va_list args)
449 {
450 int32_t *bufferQueueSize = va_arg(args, int32_t*);
451 if (bufferQueueSize != nullptr) {
452 *bufferQueueSize = static_cast<int32_t>(window->surface->GetQueueSize());
453 }
454 }
455
HandleNativeWindowGetSurfaceSourceType(OHNativeWindow * window,va_list args)456 static void HandleNativeWindowGetSurfaceSourceType(OHNativeWindow *window, va_list args)
457 {
458 OHSurfaceSource *sourceType = va_arg(args, OHSurfaceSource*);
459 if (sourceType != nullptr) {
460 *sourceType = window->surface->GetSurfaceSourceType();
461 }
462 }
463
HandleNativeWindowGetSurfaceAppFrameworkType(OHNativeWindow * window,va_list args)464 static void HandleNativeWindowGetSurfaceAppFrameworkType(OHNativeWindow *window, va_list args)
465 {
466 const char **appFrameworkType = va_arg(args, const char**);
467 if (appFrameworkType != nullptr) {
468 std::string typeStr = window->surface->GetSurfaceAppFrameworkType();
469 std::call_once(window->appFrameworkTypeOnceFlag_, [&]() {
470 window->appFrameworkType_ = new char[MAXIMUM_LENGTH_OF_APP_FRAMEWORK + 1]();
471 });
472 if (strcpy_s(window->appFrameworkType_, typeStr.size() + 1, typeStr.c_str()) != 0) {
473 BLOGE("strcpy app framework type name failed.");
474 return;
475 }
476 *appFrameworkType = window->appFrameworkType_;
477 }
478 }
479
HandleNativeWindowSetHdrWhitePointBrightness(OHNativeWindow * window,va_list args)480 static void HandleNativeWindowSetHdrWhitePointBrightness(OHNativeWindow *window, va_list args)
481 {
482 float hdrWhitePointBrightness = static_cast<float>(va_arg(args, double));
483 window->surface->SetHdrWhitePointBrightness(hdrWhitePointBrightness);
484 }
485
HandleNativeWindowSetSdrWhitePointBrightness(OHNativeWindow * window,va_list args)486 static void HandleNativeWindowSetSdrWhitePointBrightness(OHNativeWindow *window, va_list args)
487 {
488 float sdrWhitePointBrightness = static_cast<float>(va_arg(args, double));
489 window->surface->SetSdrWhitePointBrightness(sdrWhitePointBrightness);
490 }
491
492 static std::map<int, std::function<void(OHNativeWindow*, va_list)>> operationMap = {
493 {SET_USAGE, HandleNativeWindowSetUsage},
494 {SET_BUFFER_GEOMETRY, HandleNativeWindowSetBufferGeometry},
495 {SET_FORMAT, HandleNativeWindowSetFormat},
496 {SET_STRIDE, HandleNativeWindowSetStride},
497 {SET_TIMEOUT, HandleNativeWindowSetTimeout},
498 {SET_COLOR_GAMUT, HandleNativeWindowSetColorGamut},
499 {SET_TRANSFORM, HandleNativeWindowSetTransform},
500 {SET_UI_TIMESTAMP, HandleNativeWindowSetUiTimestamp},
501 {SET_SOURCE_TYPE, HandleNativeWindowSetSurfaceSourceType},
502 {SET_APP_FRAMEWORK_TYPE, HandleNativeWindowSetSurfaceAppFrameworkType},
503 {GET_USAGE, HandleNativeWindowGetUsage},
504 {GET_BUFFER_GEOMETRY, HandleNativeWindowGetBufferGeometry},
505 {GET_FORMAT, HandleNativeWindowGetFormat},
506 {GET_STRIDE, HandleNativeWindowGetStride},
507 {GET_TIMEOUT, HandleNativeWindowGetTimeout},
508 {GET_COLOR_GAMUT, HandleNativeWindowGetColorGamut},
509 {GET_TRANSFORM, HandleNativeWindowGetTransform},
510 {GET_BUFFERQUEUE_SIZE, HandleNativeWindowGetBufferQueueSize},
511 {GET_SOURCE_TYPE, HandleNativeWindowGetSurfaceSourceType},
512 {GET_APP_FRAMEWORK_TYPE, HandleNativeWindowGetSurfaceAppFrameworkType},
513 {SET_HDR_WHITE_POINT_BRIGHTNESS, HandleNativeWindowSetHdrWhitePointBrightness},
514 {SET_SDR_WHITE_POINT_BRIGHTNESS, HandleNativeWindowSetSdrWhitePointBrightness},
515 {SET_DESIRED_PRESENT_TIMESTAMP, HandleNativeWindowSetDesiredPresentTimestamp},
516 };
517
InternalHandleNativeWindowOpt(OHNativeWindow * window,int code,va_list args)518 static int32_t InternalHandleNativeWindowOpt(OHNativeWindow *window, int code, va_list args)
519 {
520 auto it = operationMap.find(code);
521 if (it != operationMap.end()) {
522 it->second(window, args);
523 }
524 return OHOS::GSERROR_OK;
525 }
526
NativeWindowHandleOpt(OHNativeWindow * window,int code,...)527 int32_t NativeWindowHandleOpt(OHNativeWindow *window, int code, ...)
528 {
529 if (window == nullptr || window->surface == nullptr) {
530 return OHOS::SURFACE_ERROR_INVALID_PARAM;
531 }
532 va_list args;
533 va_start(args, code);
534 InternalHandleNativeWindowOpt(window, code, args);
535 va_end(args);
536 return OHOS::GSERROR_OK;
537 }
538
GetBufferHandleFromNative(OHNativeWindowBuffer * buffer)539 BufferHandle *GetBufferHandleFromNative(OHNativeWindowBuffer *buffer)
540 {
541 if (buffer == nullptr || buffer->sfbuffer == nullptr) {
542 return nullptr;
543 }
544
545 return buffer->sfbuffer->GetBufferHandle();
546 }
547
GetNativeObjectMagic(void * obj)548 int32_t GetNativeObjectMagic(void *obj)
549 {
550 if (obj == nullptr) {
551 return INVALID_PARAM;
552 }
553 NativeWindowMagic* nativeWindowMagic = reinterpret_cast<NativeWindowMagic *>(obj);
554 return nativeWindowMagic->magic;
555 }
556
NativeObjectReference(void * obj)557 int32_t NativeObjectReference(void *obj)
558 {
559 if (obj == nullptr) {
560 return OHOS::SURFACE_ERROR_INVALID_PARAM;
561 }
562 switch (GetNativeObjectMagic(obj)) {
563 case NATIVE_OBJECT_MAGIC_WINDOW:
564 case NATIVE_OBJECT_MAGIC_WINDOW_BUFFER:
565 break;
566 default:
567 BLOGE("magic illegal: %{public}d", GetNativeObjectMagic(obj));
568 return OHOS::SURFACE_ERROR_INVALID_PARAM;
569 }
570 OHOS::RefBase *ref = reinterpret_cast<OHOS::RefBase *>(obj);
571 ref->IncStrongRef(ref);
572 return OHOS::GSERROR_OK;
573 }
574
NativeObjectUnreference(void * obj)575 int32_t NativeObjectUnreference(void *obj)
576 {
577 if (obj == nullptr) {
578 return OHOS::SURFACE_ERROR_INVALID_PARAM;
579 }
580 switch (GetNativeObjectMagic(obj)) {
581 case NATIVE_OBJECT_MAGIC_WINDOW:
582 case NATIVE_OBJECT_MAGIC_WINDOW_BUFFER:
583 break;
584 default:
585 BLOGE("magic illegal: %{public}d", GetNativeObjectMagic(obj));
586 return OHOS::SURFACE_ERROR_INVALID_PARAM;
587 }
588 OHOS::RefBase *ref = reinterpret_cast<OHOS::RefBase *>(obj);
589 ref->DecStrongRef(ref);
590 return OHOS::GSERROR_OK;
591 }
592
NativeWindowSetScalingMode(OHNativeWindow * window,uint32_t sequence,OHScalingMode scalingMode)593 int32_t NativeWindowSetScalingMode(OHNativeWindow *window, uint32_t sequence, OHScalingMode scalingMode)
594 {
595 if (window == nullptr || window->surface == nullptr ||
596 scalingMode < OHScalingMode::OH_SCALING_MODE_FREEZE ||
597 scalingMode > OHScalingMode::OH_SCALING_MODE_NO_SCALE_CROP) {
598 return OHOS::SURFACE_ERROR_INVALID_PARAM;
599 }
600 return window->surface->SetScalingMode(sequence, static_cast<ScalingMode>(scalingMode));
601 }
602
NativeWindowSetScalingModeV2(OHNativeWindow * window,OHScalingModeV2 scalingMode)603 int32_t NativeWindowSetScalingModeV2(OHNativeWindow *window, OHScalingModeV2 scalingMode)
604 {
605 if (window == nullptr || window->surface == nullptr ||
606 scalingMode < OHScalingModeV2::OH_SCALING_MODE_FREEZE_V2 ||
607 scalingMode > OHScalingModeV2::OH_SCALING_MODE_SCALE_FIT_V2) {
608 return OHOS::GSERROR_INVALID_ARGUMENTS;
609 }
610 return window->surface->SetScalingMode(static_cast<ScalingMode>(scalingMode));
611 }
612
NativeWindowSetMetaData(OHNativeWindow * window,uint32_t sequence,int32_t size,const OHHDRMetaData * metaData)613 int32_t NativeWindowSetMetaData(OHNativeWindow *window, uint32_t sequence, int32_t size,
614 const OHHDRMetaData *metaData)
615 {
616 if (window == nullptr || window->surface == nullptr ||
617 size <= 0 || size > META_DATA_MAX_SIZE || metaData == nullptr) {
618 return OHOS::SURFACE_ERROR_INVALID_PARAM;
619 }
620
621 std::vector<GraphicHDRMetaData> data(reinterpret_cast<const GraphicHDRMetaData *>(metaData),
622 reinterpret_cast<const GraphicHDRMetaData *>(metaData) + size);
623 return window->surface->SetMetaData(sequence, data);
624 }
625
NativeWindowSetMetaDataSet(OHNativeWindow * window,uint32_t sequence,OHHDRMetadataKey key,int32_t size,const uint8_t * metaData)626 int32_t NativeWindowSetMetaDataSet(OHNativeWindow *window, uint32_t sequence, OHHDRMetadataKey key,
627 int32_t size, const uint8_t *metaData)
628 {
629 if (window == nullptr || window->surface == nullptr ||
630 key < OHHDRMetadataKey::OH_METAKEY_RED_PRIMARY_X || key > OHHDRMetadataKey::OH_METAKEY_HDR_VIVID ||
631 size <= 0 || size > META_DATA_MAX_SIZE || metaData == nullptr) {
632 return OHOS::SURFACE_ERROR_INVALID_PARAM;
633 }
634 std::vector<uint8_t> data(metaData, metaData + size);
635 return window->surface->SetMetaDataSet(sequence, static_cast<GraphicHDRMetadataKey>(key), data);
636 }
637
NativeWindowSetTunnelHandle(OHNativeWindow * window,const OHExtDataHandle * handle)638 int32_t NativeWindowSetTunnelHandle(OHNativeWindow *window, const OHExtDataHandle *handle)
639 {
640 if (window == nullptr || window->surface == nullptr || handle == nullptr) {
641 return OHOS::SURFACE_ERROR_INVALID_PARAM;
642 }
643 return window->surface->SetTunnelHandle(reinterpret_cast<const OHOS::GraphicExtDataHandle*>(handle));
644 }
645
GetSurfaceId(OHNativeWindow * window,uint64_t * surfaceId)646 int32_t GetSurfaceId(OHNativeWindow *window, uint64_t *surfaceId)
647 {
648 if (window == nullptr || window->surface == nullptr || surfaceId == nullptr) {
649 return OHOS::SURFACE_ERROR_INVALID_PARAM;
650 }
651
652 *surfaceId = window->surface->GetUniqueId();
653 return OHOS::GSERROR_OK;
654 }
655
CreateNativeWindowFromSurfaceId(uint64_t surfaceId,OHNativeWindow ** window)656 int32_t CreateNativeWindowFromSurfaceId(uint64_t surfaceId, OHNativeWindow **window)
657 {
658 if (window == nullptr) {
659 return OHOS::SURFACE_ERROR_INVALID_PARAM;
660 }
661
662 auto utils = SurfaceUtils::GetInstance();
663 *window = reinterpret_cast<OHNativeWindow*>(utils->GetNativeWindow(surfaceId));
664 if (*window != nullptr) {
665 NativeObjectReference(*window);
666 return OHOS::GSERROR_OK;
667 }
668
669 OHNativeWindow *nativeWindow = new OHNativeWindow();
670 nativeWindow->surface = utils->GetSurface(surfaceId);
671 if (nativeWindow->surface == nullptr) {
672 BLOGE("window surface is null, surfaceId: %{public}" PRIu64 ".", surfaceId);
673 delete nativeWindow;
674 return OHOS::SURFACE_ERROR_INVALID_PARAM;
675 }
676
677 NativeObjectReference(nativeWindow);
678 utils->AddNativeWindow(nativeWindow->surface->GetUniqueId(), nativeWindow);
679 nativeWindow->surface->SetWptrNativeWindowToPSurface(nativeWindow);
680 *window = nativeWindow;
681 return OHOS::GSERROR_OK;
682 }
683
NativeWindowGetTransformHint(OHNativeWindow * window,OH_NativeBuffer_TransformType * transform)684 int32_t NativeWindowGetTransformHint(OHNativeWindow *window, OH_NativeBuffer_TransformType *transform)
685 {
686 if (window == nullptr || window->surface == nullptr || transform == nullptr) {
687 return OHOS::SURFACE_ERROR_INVALID_PARAM;
688 }
689 *transform = static_cast<OH_NativeBuffer_TransformType>(window->surface->GetTransformHint());
690 return OHOS::GSERROR_OK;
691 }
692
NativeWindowSetTransformHint(OHNativeWindow * window,OH_NativeBuffer_TransformType transform)693 int32_t NativeWindowSetTransformHint(OHNativeWindow *window, OH_NativeBuffer_TransformType transform)
694 {
695 if (window == nullptr || window->surface == nullptr) {
696 return OHOS::SURFACE_ERROR_INVALID_PARAM;
697 }
698 return window->surface->SetTransformHint(static_cast<OHOS::GraphicTransformType>(transform));
699 }
700
NativeWindowGetDefaultWidthAndHeight(OHNativeWindow * window,int32_t * width,int32_t * height)701 int32_t NativeWindowGetDefaultWidthAndHeight(OHNativeWindow *window, int32_t *width, int32_t *height)
702 {
703 if (window == nullptr || window->surface == nullptr || width == nullptr || height == nullptr) {
704 return OHOS::SURFACE_ERROR_INVALID_PARAM;
705 }
706 OHOS::BufferRequestConfig windowConfig = window->surface->GetWindowConfig();
707 if (windowConfig.width != 0 && windowConfig.height != 0) {
708 *width = windowConfig.width;
709 *height = windowConfig.height;
710 } else {
711 *width = window->surface->GetDefaultWidth();
712 *height = window->surface->GetDefaultHeight();
713 }
714 return OHOS::GSERROR_OK;
715 }
716
NativeWindowSetRequestWidthAndHeight(OHNativeWindow * window,int32_t width,int32_t height)717 int32_t NativeWindowSetRequestWidthAndHeight(OHNativeWindow *window, int32_t width, int32_t height)
718 {
719 if (window == nullptr || window->surface == nullptr) {
720 return OHOS::SURFACE_ERROR_INVALID_PARAM;
721 }
722 window->surface->SetRequestWidthAndHeight(width, height);
723 return OHOS::GSERROR_OK;
724 }
725
NativeWindowSetBufferHold(OHNativeWindow * window)726 void NativeWindowSetBufferHold(OHNativeWindow *window)
727 {
728 if (window == nullptr || window->surface == nullptr) {
729 return;
730 }
731 window->surface->SetBufferHold(true);
732 }
733
NativeWindowWriteToParcel(OHNativeWindow * window,OHIPCParcel * parcel)734 int32_t NativeWindowWriteToParcel(OHNativeWindow *window, OHIPCParcel *parcel)
735 {
736 if (window == nullptr) {
737 return OHOS::SURFACE_ERROR_INVALID_PARAM;
738 }
739 if (parcel == nullptr || parcel->msgParcel == nullptr) {
740 return OHOS::SURFACE_ERROR_INVALID_PARAM;
741 }
742 sptr<OHOS::Surface> windowSurface = window->surface;
743 if (windowSurface == nullptr) {
744 BLOGE("windowSurface is nullptr");
745 return OHOS::SURFACE_ERROR_INVALID_PARAM;
746 }
747 auto producer = windowSurface->GetProducer();
748 if (producer == nullptr) {
749 return OHOS::SURFACE_ERROR_INVALID_PARAM;
750 }
751 if (!(parcel->msgParcel)->WriteRemoteObject(producer->AsObject())) {
752 return OHOS::SURFACE_ERROR_INVALID_PARAM;
753 }
754 return OHOS::GSERROR_OK;
755 }
756
NativeWindowReadFromParcel(OHIPCParcel * parcel,OHNativeWindow ** window)757 int32_t NativeWindowReadFromParcel(OHIPCParcel *parcel, OHNativeWindow **window)
758 {
759 if (parcel == nullptr || parcel->msgParcel == nullptr || window == nullptr) {
760 return OHOS::SURFACE_ERROR_INVALID_PARAM;
761 }
762 sptr<OHOS::IRemoteObject> surfaceObject = (parcel->msgParcel)->ReadRemoteObject();
763 if (surfaceObject == nullptr) {
764 BLOGE("surfaceObject is nullptr");
765 return OHOS::SURFACE_ERROR_INVALID_PARAM;
766 }
767 sptr<OHOS::IBufferProducer> bp = iface_cast<IBufferProducer>(surfaceObject);
768 sptr <OHOS::Surface> windowSurface = OHOS::Surface::CreateSurfaceAsProducer(bp);
769 if (windowSurface == nullptr) {
770 BLOGE("windowSurface is nullptr");
771 return OHOS::SURFACE_ERROR_INVALID_PARAM;
772 }
773 auto utils = SurfaceUtils::GetInstance();
774 *window = reinterpret_cast<OHNativeWindow*>(utils->GetNativeWindow(windowSurface->GetUniqueId()));
775 if (*window == nullptr) {
776 *window = CreateNativeWindowFromSurface(&windowSurface);
777 }
778 return OHOS::GSERROR_OK;
779 }
780
GetLastFlushedBufferV2(OHNativeWindow * window,OHNativeWindowBuffer ** buffer,int * fenceFd,float matrix[16])781 int32_t GetLastFlushedBufferV2(OHNativeWindow *window, OHNativeWindowBuffer **buffer, int *fenceFd, float matrix[16])
782 {
783 if (window == nullptr || buffer == nullptr || fenceFd == nullptr || window->surface == nullptr) {
784 return OHOS::SURFACE_ERROR_INVALID_PARAM;
785 }
786 OHNativeWindowBuffer *nwBuffer = new OHNativeWindowBuffer();
787 OHOS::sptr<OHOS::SyncFence> acquireFence = OHOS::SyncFence::InvalidFence();
788 int32_t ret = window->surface->GetLastFlushedBuffer(nwBuffer->sfbuffer, acquireFence, matrix, true);
789 if (ret != OHOS::GSError::SURFACE_ERROR_OK || nwBuffer->sfbuffer == nullptr) {
790 BLOGE("GetLastFlushedBuffer fail, ret: %{public}d, uniqueId: %{public}" PRIu64 ".",
791 ret, window->surface->GetUniqueId());
792 delete nwBuffer;
793 nwBuffer = nullptr;
794 return ret;
795 }
796 *buffer = nwBuffer;
797 NativeObjectReference(nwBuffer);
798 *fenceFd = acquireFence->Dup();
799 return OHOS::SURFACE_ERROR_OK;
800 }
801
NativeWindowDisconnect(OHNativeWindow * window)802 int32_t NativeWindowDisconnect(OHNativeWindow *window)
803 {
804 if (window == nullptr || window->surface == nullptr) {
805 return OHOS::SURFACE_ERROR_INVALID_PARAM;
806 }
807 return window->surface->Disconnect();
808 }
809
OH_NativeWindow_SetColorSpace(OHNativeWindow * window,OH_NativeBuffer_ColorSpace colorSpace)810 int32_t OH_NativeWindow_SetColorSpace(OHNativeWindow *window, OH_NativeBuffer_ColorSpace colorSpace)
811 {
812 auto iter = NATIVE_COLORSPACE_TO_HDI_MAP.find(colorSpace);
813 if (window == nullptr || iter == NATIVE_COLORSPACE_TO_HDI_MAP.end()) {
814 return OHOS::SURFACE_ERROR_INVALID_PARAM;
815 }
816 std::string param = std::to_string(iter->second);
817 GSError ret = GSERROR_OK;
818 if (window->surface != nullptr && param != window->surface->GetUserData("ATTRKEY_COLORSPACE_INFO")) {
819 ret = window->surface->SetUserData("ATTRKEY_COLORSPACE_INFO", param);
820 }
821 if (ret != OHOS::SURFACE_ERROR_OK) {
822 BLOGE("SetColorSpaceType failed!, ret: %{public}d", ret);
823 return OHOS::SURFACE_ERROR_UNKOWN;
824 }
825 return OHOS::SURFACE_ERROR_OK;
826 }
827
OH_NativeWindow_GetColorSpace(OHNativeWindow * window,OH_NativeBuffer_ColorSpace * colorSpace)828 int32_t OH_NativeWindow_GetColorSpace(OHNativeWindow *window, OH_NativeBuffer_ColorSpace *colorSpace)
829 {
830 if (window == nullptr || colorSpace == nullptr) {
831 return OHOS::SURFACE_ERROR_INVALID_PARAM;
832 }
833 CM_ColorSpaceType colorSpaceType = CM_COLORSPACE_NONE;
834 if (window->surface != nullptr) {
835 std::string value = window->surface->GetUserData("ATTRKEY_COLORSPACE_INFO");
836 if (value.empty()) {
837 BLOGE("no colorspace!");
838 return OHOS::SURFACE_ERROR_UNKOWN;
839 }
840 colorSpaceType = static_cast<CM_ColorSpaceType>(atoi(value.c_str()));
841 auto it = std::find_if(NATIVE_COLORSPACE_TO_HDI_MAP.begin(), NATIVE_COLORSPACE_TO_HDI_MAP.end(),
842 [colorSpaceType](const std::pair<OH_NativeBuffer_ColorSpace, CM_ColorSpaceType>& element) {
843 return element.second == colorSpaceType;
844 });
845 if (it != NATIVE_COLORSPACE_TO_HDI_MAP.end()) {
846 *colorSpace = it->first;
847 return OHOS::SURFACE_ERROR_OK;
848 }
849 }
850 BLOGE("the colorSpace does not support it.");
851 return OHOS::SURFACE_ERROR_UNKOWN;
852 }
853
OH_NativeWindow_SetMetadataValue(OHNativeWindow * window,OH_NativeBuffer_MetadataKey metadataKey,int32_t size,uint8_t * metadata)854 int32_t OH_NativeWindow_SetMetadataValue(OHNativeWindow *window, OH_NativeBuffer_MetadataKey metadataKey,
855 int32_t size, uint8_t *metadata)
856 {
857 if (window == nullptr || metadata == nullptr || size <= 0 || size > META_DATA_MAX_SIZE ||
858 window->surface == nullptr) {
859 return OHOS::SURFACE_ERROR_INVALID_PARAM;
860 }
861 GSError ret = GSERROR_OK;
862 std::vector<uint8_t> mD(metadata, metadata + size);
863 std::string param;
864 if (metadataKey == OH_HDR_DYNAMIC_METADATA) {
865 param.assign(mD.begin(), mD.end());
866 if (param != window->surface->GetUserData("OH_HDR_DYNAMIC_METADATA")) {
867 ret = window->surface->SetUserData("OH_HDR_DYNAMIC_METADATA", param);
868 }
869 } else if (metadataKey == OH_HDR_STATIC_METADATA) {
870 param.assign(mD.begin(), mD.end());
871 if (param != window->surface->GetUserData("OH_HDR_STATIC_METADATA")) {
872 ret = window->surface->SetUserData("OH_HDR_STATIC_METADATA", param);
873 }
874 } else if (metadataKey == OH_HDR_METADATA_TYPE) {
875 OH_NativeBuffer_MetadataType hdrMetadataType = static_cast<OH_NativeBuffer_MetadataType>(*metadata);
876 param = std::to_string(NATIVE_METADATATYPE_TO_HDI_MAP[hdrMetadataType]);
877 if (param != window->surface->GetUserData("OH_HDR_METADATA_TYPE")) {
878 ret = window->surface->SetUserData("OH_HDR_METADATA_TYPE", param);
879 }
880 } else {
881 BLOGE("the metadataKey does not support it.");
882 return OHOS::SURFACE_ERROR_NOT_SUPPORT;
883 }
884 if (GSErrorStr(ret) == "<500 api call failed>with low error <Not supported>") {
885 return OHOS::SURFACE_ERROR_NOT_SUPPORT;
886 } else if (ret != OHOS::SURFACE_ERROR_OK) {
887 BLOGE("SetHDRMetadata failed!, ret: %{public}d", ret);
888 return OHOS::SURFACE_ERROR_UNKOWN;
889 }
890 return OHOS::SURFACE_ERROR_OK;
891 }
892
OH_NativeWindow_GetMatedataValueType(OHNativeWindow * window,int32_t * size,uint8_t ** metadata)893 static GSError OH_NativeWindow_GetMatedataValueType(OHNativeWindow *window, int32_t *size, uint8_t **metadata)
894 {
895 std::string value = window->surface->GetUserData("OH_HDR_METADATA_TYPE");
896 CM_HDR_Metadata_Type hdrMetadataType = CM_METADATA_NONE;
897 hdrMetadataType = static_cast<CM_HDR_Metadata_Type>(atoi(value.c_str()));
898 auto it = std::find_if(NATIVE_METADATATYPE_TO_HDI_MAP.begin(), NATIVE_METADATATYPE_TO_HDI_MAP.end(),
899 [hdrMetadataType](const std::pair<OH_NativeBuffer_MetadataType, CM_HDR_Metadata_Type>& element) {
900 return element.second == hdrMetadataType;
901 });
902 if (it != NATIVE_METADATATYPE_TO_HDI_MAP.end()) {
903 *size = sizeof(OH_NativeBuffer_MetadataType);
904 *metadata = new uint8_t[*size];
905 errno_t err = memcpy_s(*metadata, *size, &(it->first), *size);
906 if (err != 0) {
907 delete[] *metadata;
908 *metadata = nullptr;
909 BLOGE("memcpy_s failed! , ret: %{public}d", err);
910 return OHOS::SURFACE_ERROR_UNKOWN;
911 }
912 return OHOS::SURFACE_ERROR_OK;
913 }
914 BLOGE("the hdrMetadataType does not support it.");
915 return OHOS::SURFACE_ERROR_NOT_SUPPORT;
916 }
917
OH_NativeWindow_GetMetadataValue(OHNativeWindow * window,OH_NativeBuffer_MetadataKey metadataKey,int32_t * size,uint8_t ** metadata)918 int32_t OH_NativeWindow_GetMetadataValue(OHNativeWindow *window, OH_NativeBuffer_MetadataKey metadataKey,
919 int32_t *size, uint8_t **metadata)
920 {
921 if (window == nullptr || metadata == nullptr || size == nullptr || window->surface == nullptr) {
922 return OHOS::SURFACE_ERROR_INVALID_PARAM;
923 }
924 GSError ret = GSERROR_OK;
925 std::vector<uint8_t> mD;
926 if (metadataKey == OH_HDR_DYNAMIC_METADATA) {
927 std::string value = window->surface->GetUserData("OH_HDR_DYNAMIC_METADATA");
928 mD.resize(value.size());
929 mD.assign(value.begin(), value.end());
930 } else if (metadataKey == OH_HDR_STATIC_METADATA) {
931 std::string value = window->surface->GetUserData("OH_HDR_STATIC_METADATA");
932 mD.resize(value.size());
933 mD.assign(value.begin(), value.end());
934 } else if (metadataKey == OH_HDR_METADATA_TYPE) {
935 ret = OH_NativeWindow_GetMatedataValueType(window, size, metadata);
936 return ret;
937 } else {
938 BLOGE("the metadataKey does not support it.");
939 return OHOS::SURFACE_ERROR_UNKOWN;
940 }
941 if (GSErrorStr(ret) == "<500 api call failed>with low error <Not supported>") {
942 return OHOS::SURFACE_ERROR_NOT_SUPPORT;
943 } else if (ret != OHOS::SURFACE_ERROR_OK) {
944 BLOGE("SetHDRSMetadata failed! , ret: %{public}d", ret);
945 return OHOS::SURFACE_ERROR_UNKOWN;
946 }
947 *size = mD.size();
948 *metadata = new uint8_t[mD.size()];
949 if (!mD.empty()) {
950 errno_t err = memcpy_s(*metadata, mD.size(), &mD[0], mD.size());
951 if (err != 0) {
952 delete[] *metadata;
953 *metadata = nullptr;
954 BLOGE("memcpy_s failed! , ret: %{public}d", err);
955 return OHOS::SURFACE_ERROR_UNKOWN;
956 }
957 } else {
958 delete[] *metadata;
959 *metadata = nullptr;
960 BLOGE("new metadata failed!");
961 return OHOS::SURFACE_ERROR_UNKOWN;
962 }
963 return OHOS::SURFACE_ERROR_OK;
964 }
965
NativeWindowCleanCache(OHNativeWindow * window)966 int32_t NativeWindowCleanCache(OHNativeWindow *window)
967 {
968 if (window == nullptr) {
969 return OHOS::SURFACE_ERROR_INVALID_PARAM;
970 }
971 sptr<OHOS::Surface> windowSurface = window->surface;
972 if (windowSurface == nullptr) {
973 BLOGE("windowSurface is nullptr");
974 return OHOS::SURFACE_ERROR_INVALID_PARAM;
975 }
976 return windowSurface->CleanCache();
977 }
978
NativeWindow()979 NativeWindow::NativeWindow() : NativeWindowMagic(NATIVE_OBJECT_MAGIC_WINDOW), surface(nullptr)
980 {
981 }
982
~NativeWindow()983 NativeWindow::~NativeWindow()
984 {
985 if (surface != nullptr) {
986 auto utils = SurfaceUtils::GetInstance();
987 utils->RemoveNativeWindow(surface->GetUniqueId());
988 }
989
990 {
991 std::lock_guard<std::mutex> lockGuard(mutex_);
992 for (auto &[seqNum, buffer] : bufferCache_) {
993 NativeObjectUnreference(buffer);
994 }
995 surface = nullptr;
996 bufferCache_.clear();
997 }
998 std::call_once(appFrameworkTypeOnceFlag_, [] {});
999 if (appFrameworkType_ != nullptr) {
1000 delete[] appFrameworkType_;
1001 appFrameworkType_ = nullptr;
1002 }
1003 }
1004
~NativeWindowBuffer()1005 NativeWindowBuffer::~NativeWindowBuffer()
1006 {
1007 sfbuffer = nullptr;
1008 }
1009
NativeWindowBuffer()1010 NativeWindowBuffer::NativeWindowBuffer() : NativeWindowMagic(NATIVE_OBJECT_MAGIC_WINDOW_BUFFER), sfbuffer(nullptr)
1011 {
1012 }
1013
1014 WEAK_ALIAS(CreateNativeWindowFromSurface, OH_NativeWindow_CreateNativeWindow);
1015 WEAK_ALIAS(DestoryNativeWindow, OH_NativeWindow_DestroyNativeWindow);
1016 WEAK_ALIAS(CreateNativeWindowBufferFromSurfaceBuffer, OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer);
1017 WEAK_ALIAS(CreateNativeWindowBufferFromNativeBuffer, OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer);
1018 WEAK_ALIAS(DestroyNativeWindowBuffer, OH_NativeWindow_DestroyNativeWindowBuffer);
1019 WEAK_ALIAS(NativeWindowRequestBuffer, OH_NativeWindow_NativeWindowRequestBuffer);
1020 WEAK_ALIAS(NativeWindowFlushBuffer, OH_NativeWindow_NativeWindowFlushBuffer);
1021 WEAK_ALIAS(GetLastFlushedBuffer, OH_NativeWindow_GetLastFlushedBuffer);
1022 WEAK_ALIAS(NativeWindowAttachBuffer, OH_NativeWindow_NativeWindowAttachBuffer);
1023 WEAK_ALIAS(NativeWindowDetachBuffer, OH_NativeWindow_NativeWindowDetachBuffer);
1024 WEAK_ALIAS(NativeWindowCancelBuffer, OH_NativeWindow_NativeWindowAbortBuffer);
1025 WEAK_ALIAS(NativeWindowHandleOpt, OH_NativeWindow_NativeWindowHandleOpt);
1026 WEAK_ALIAS(GetBufferHandleFromNative, OH_NativeWindow_GetBufferHandleFromNative);
1027 WEAK_ALIAS(NativeObjectReference, OH_NativeWindow_NativeObjectReference);
1028 WEAK_ALIAS(NativeObjectUnreference, OH_NativeWindow_NativeObjectUnreference);
1029 WEAK_ALIAS(GetNativeObjectMagic, OH_NativeWindow_GetNativeObjectMagic);
1030 WEAK_ALIAS(NativeWindowSetScalingMode, OH_NativeWindow_NativeWindowSetScalingMode);
1031 WEAK_ALIAS(NativeWindowSetScalingModeV2, OH_NativeWindow_NativeWindowSetScalingModeV2);
1032 WEAK_ALIAS(NativeWindowSetMetaData, OH_NativeWindow_NativeWindowSetMetaData);
1033 WEAK_ALIAS(NativeWindowSetMetaDataSet, OH_NativeWindow_NativeWindowSetMetaDataSet);
1034 WEAK_ALIAS(NativeWindowSetTunnelHandle, OH_NativeWindow_NativeWindowSetTunnelHandle);
1035 WEAK_ALIAS(GetSurfaceId, OH_NativeWindow_GetSurfaceId);
1036 WEAK_ALIAS(CreateNativeWindowFromSurfaceId, OH_NativeWindow_CreateNativeWindowFromSurfaceId);
1037 WEAK_ALIAS(NativeWindowSetBufferHold, OH_NativeWindow_SetBufferHold);
1038 WEAK_ALIAS(NativeWindowWriteToParcel, OH_NativeWindow_WriteToParcel);
1039 WEAK_ALIAS(NativeWindowReadFromParcel, OH_NativeWindow_ReadFromParcel);
1040 WEAK_ALIAS(GetLastFlushedBufferV2, OH_NativeWindow_GetLastFlushedBufferV2);
1041 WEAK_ALIAS(NativeWindowCleanCache, OH_NativeWindow_CleanCache);