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 }