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