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