• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 <iostream>
17 #include "external_window.h"
18 #include "surface.h"
19 
20 using namespace OHOS;
21 
22 namespace {
23 class BufferConsumerListenerTest : public ::OHOS::IBufferConsumerListener {
24 public:
OnBufferAvailable()25     void OnBufferAvailable() override
26     {
27     }
28 };
29 }
30 
main(int32_t argc,const char * argv[])31 int32_t main(int32_t argc, const char *argv[])
32 {
33     std::cout << "sample start" << std::endl;
34 
35     sptr<OHOS::Surface> cSurface = Surface::CreateSurfaceAsConsumer();
36     sptr<IBufferConsumerListener> listener = new BufferConsumerListenerTest();
37     cSurface->RegisterConsumerListener(listener);
38     sptr<OHOS::IBufferProducer> producer = cSurface->GetProducer();
39     sptr<OHOS::Surface> pSurface = Surface::CreateSurfaceAsProducer(producer);
40 
41     OHNativeWindow* nativeWindow = OH_NativeWindow_CreateNativeWindow(&pSurface);
42 
43     int code = SET_USAGE;
44     int32_t usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA;
45     int32_t ret = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, usage);
46     if (ret != OHOS::GSERROR_OK) {
47         std::cout << "OH_NativeWindow_NativeWindowHandleOpt SET_USAGE faile" << std::endl;
48     }
49     code = SET_BUFFER_GEOMETRY;
50     int32_t width = 0x100;
51     int32_t height = 0x100;
52     ret = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, width, height);
53     if (ret != OHOS::GSERROR_OK) {
54         std::cout << "OH_NativeWindow_NativeWindowHandleOpt SET_BUFFER_GEOMETRY failed" << std::endl;
55     }
56     code = SET_STRIDE;
57     int32_t stride = 0x8;
58     ret = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, stride);
59     if (ret != OHOS::GSERROR_OK) {
60         std::cout << "OH_NativeWindow_NativeWindowHandleOpt SET_STRIDE failed" << std::endl;
61     }
62     code = SET_FORMAT;
63     int32_t format = GRAPHIC_PIXEL_FMT_RGBA_8888;
64     ret = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, format);
65     if (ret != OHOS::GSERROR_OK) {
66         std::cout << "OH_NativeWindow_NativeWindowHandleOpt SET_FORMAT failed" << std::endl;
67     }
68 
69     NativeWindowBuffer* nativeWindowBuffer = nullptr;
70     int fenceFd = -1;
71     ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd);
72     if (ret != OHOS::GSERROR_OK) {
73         std::cout << "OH_NativeWindow_NativeWindowRequestBuffer failed" << std::endl;
74     }
75 
76     if (OH_NativeWindow_GetBufferHandleFromNative(nativeWindowBuffer) == nullptr) {
77         std::cout << "OH_NativeWindow_GetBufferHandleFromNative failed" << std::endl;
78     }
79 
80     ret = OH_NativeWindow_NativeObjectReference(nativeWindowBuffer);
81     if (ret != OHOS::GSERROR_OK) {
82         std::cout << "OH_NativeWindow_NativeObjectReference failed" << std::endl;
83     }
84 
85     ret = OH_NativeWindow_NativeObjectUnreference(nativeWindowBuffer);
86     if (ret != OHOS::GSERROR_OK) {
87         std::cout << "OH_NativeWindow_NativeObjectUnreference failed" << std::endl;
88     }
89 
90     struct Region *region = new Region();
91     struct Region::Rect *rect = new Region::Rect();
92     rect->x = 0x100;
93     rect->y = 0x100;
94     rect->w = 0x100;
95     rect->h = 0x100;
96     region->rects = rect;
97     region->rectNumber = 1;
98 
99     ret = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, fenceFd, *region);
100     if (ret != OHOS::GSERROR_OK) {
101         std::cout << "OH_NativeWindow_NativeWindowFlushBuffer failed" << std::endl;
102     }
103     delete region;
104     delete rect;
105 
106     int32_t sequence = 0;
107     OHScalingMode scalingMode = OHScalingMode::OH_SCALING_MODE_SCALE_TO_WINDOW;
108     ret = OH_NativeWindow_NativeWindowSetScalingMode(nativeWindow, sequence, scalingMode);
109     if (ret != OHOS::GSERROR_OK) {
110         std::cout << "OH_NativeWindow_NativeWindowSetScalingMode failed" << std::endl;
111     }
112 
113     int32_t size = 1;
114     const OHHDRMetaData metaData[] = {{OH_METAKEY_RED_PRIMARY_X, 0}};
115     ret = OH_NativeWindow_NativeWindowSetMetaData(nativeWindow, sequence, size, metaData);
116     if (ret != OHOS::GSERROR_OK) {
117         std::cout << "OH_NativeWindow_NativeWindowSetMetaData failed" << std::endl;
118     }
119 
120     OHHDRMetadataKey key = OHHDRMetadataKey::OH_METAKEY_HDR10_PLUS;
121     const uint8_t metaDataSet[] = {0};
122     ret = OH_NativeWindow_NativeWindowSetMetaDataSet(nativeWindow, sequence, key, size, metaDataSet);
123     if (ret != OHOS::GSERROR_OK) {
124         std::cout << "OH_NativeWindow_NativeWindowSetMetaDataSet failed" << std::endl;
125     }
126 
127     OHExtDataHandle *handle = new OHExtDataHandle();
128     handle->fd = -1;
129     handle->reserveInts = 1;
130     handle->reserve[0] = 1;
131     ret = OH_NativeWindow_NativeWindowSetTunnelHandle(nativeWindow, handle);
132     if (ret != OHOS::GSERROR_OK) {
133         std::cout << "OH_NativeWindow_NativeWindowSetTunnelHandle failed" << std::endl;
134     }
135     delete handle;
136     std::cout << "sample end" << std::endl;
137     return 0;
138 }